From d13d17b82ecaf0e2e735c99ca34834317a9d1d4a Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Thu, 31 Jan 2019 14:04:51 +0100 Subject: [PATCH 001/152] Working on TV accessory --- accessories/index.js | 4 +- accessories/tv.js | 366 +++++++++++++++++++++++++++++++++++++++++++ platform.js | 1 + 3 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 accessories/tv.js diff --git a/accessories/index.js b/accessories/index.js index 3007e668..71238846 100644 --- a/accessories/index.js +++ b/accessories/index.js @@ -10,6 +10,7 @@ const GarageDoorOpener = require('./garageDoorOpener'); const Lock = require('./lock'); const Light = require('./light'); const WindowCovering = require('./windowCovering'); +const TV = require('./tv'); module.exports = { AirCon, @@ -23,5 +24,6 @@ module.exports = { GarageDoorOpener, Lock, Light, - WindowCovering + WindowCovering, + TV } diff --git a/accessories/tv.js b/accessories/tv.js new file mode 100644 index 00000000..89d9c432 --- /dev/null +++ b/accessories/tv.js @@ -0,0 +1,366 @@ +const ServiceManagerTypes = require("../helpers/serviceManagerTypes"); +const delayForDuration = require("../helpers/delayForDuration"); +const catchDelayCancelError = require("../helpers/catchDelayCancelError"); +const ping = require("../helpers/ping"); +const BroadlinkRMAccessory = require("./accessory"); + +class TVAccessory extends BroadlinkRMAccessory { + constructor(log, config = {}, serviceManagerType) { + super(log, config, serviceManagerType); + + if (!config.isUnitTest) this.checkPing(ping); + } + + setDefaults() { + const { config } = this; + config.pingFrequency = config.pingFrequency || 1; + + config.offDuration = config.offDuration || 60; + config.onDuration = config.onDuration || 60; + + if ( + config.enableAutoOn === undefined && + config.disableAutomaticOn === undefined + ) { + config.enableAutoOn = false; + } else if (config.disableAutomaticOn !== undefined) { + config.enableAutoOn = !config.disableAutomaticOn; + } + + if ( + config.enableAutoOff === undefined && + config.disableAutomaticOff === undefined + ) { + config.enableAutoOff = false; + } else if (config.disableAutomaticOff !== undefined) { + config.enableAutoOff = !config.disableAutomaticOff; + } + } + + reset() { + super.reset(); + + // Clear Timeouts + if (this.delayTimeoutPromise) { + this.delayTimeoutPromise.cancel(); + this.delayTimeoutPromise = null; + } + + if (this.autoOffTimeoutPromise) { + this.autoOffTimeoutPromise.cancel(); + this.autoOffTimeoutPromise = null; + } + + if (this.autoOnTimeoutPromise) { + this.autoOnTimeoutPromise.cancel(); + this.autoOnTimeoutPromise = null; + } + } + + checkAutoOnOff() { + this.reset(); + this.checkAutoOn(); + this.checkAutoOff(); + } + + checkPing(ping) { + const { config } = this; + let { pingIPAddress, pingFrequency } = config; + + if (!pingIPAddress) return; + + // Setup Ping-based State + ping(pingIPAddress, pingFrequency, this.pingCallback.bind(this)); + } + + pingCallback(active) { + const { config, state, serviceManager } = this; + + if (config.pingIPAddressStateOnly) { + state.switchState = active ? true : false; + serviceManager.refreshCharacteristicUI(Characteristic.On); + + return; + } + + const value = active ? true : false; + serviceManager.setCharacteristic(Characteristic.On, value); + } + + async setSwitchState(hexData) { + const { data, host, log, name, debug } = this; + + this.reset(); + + if (hexData) await this.performSend(hexData); + + this.checkAutoOnOff(); + } + + async checkAutoOff() { + await catchDelayCancelError(async () => { + const { config, log, name, state, serviceManager } = this; + let { disableAutomaticOff, enableAutoOff, onDuration } = config; + + if (state.switchState && enableAutoOff) { + log( + `${name} setSwitchState: (automatically turn off in ${onDuration} seconds)` + ); + + this.autoOffTimeoutPromise = delayForDuration(onDuration); + await this.autoOffTimeoutPromise; + + serviceManager.setCharacteristic(Characteristic.On, false); + } + }); + } + + async checkAutoOn() { + await catchDelayCancelError(async () => { + const { config, log, name, state, serviceManager } = this; + let { disableAutomaticOn, enableAutoOn, offDuration } = config; + + if (!state.switchState && enableAutoOn) { + log( + `${name} setSwitchState: (automatically turn on in ${offDuration} seconds)` + ); + + this.autoOnTimeoutPromise = delayForDuration(offDuration); + await this.autoOnTimeoutPromise; + + serviceManager.setCharacteristic(Characteristic.On, true); + } + }); + } + + getServices() { + const services = this.getInformationServices(); + + services.push(this.serviceManager.service); + services.push(...this.serviceManagers); + + return services; + } + + setupServiceManager() { + const { data, name, config, serviceManagerType } = this; + const { on, off } = data || {}; + + this.serviceManagers = []; + this.serviceManager = new ServiceManagerTypes[serviceManagerType]( + name, + Service.Television, + this.log + ); + + this.serviceManager.setCharacteristic(Characteristic.ConfiguredName, name); + + this.serviceManager.setCharacteristic( + Characteristic.SleepDiscoveryMode, + Characteristic.SleepDiscoveryMode.ALWAYS_DISCOVERABLE + ); + + this.serviceManager.addToggleCharacteristic({ + name: "switchTV", + type: Characteristic.Active, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: on || data, + offData: off || undefined, + setValuePromise: this.setSwitchState.bind(this) + } + }); + + this.serviceManager.setCharacteristic(Characteristic.ActiveIdentifier, 1); + + this.serviceManager + .getCharacteristic(Characteristic.ActiveIdentifier) + .on("set", function(newValue, callback) { + console.log("set Active Identifier => setNewValue: " + newValue); + // 1 - input one + // 2 - input two + callback(null); + }); + + this.serviceManager + .getCharacteristic(Characteristic.RemoteKey) + .on("set", (newValue, callback) => { + if (!data || !data.remote) { + log(`${name} RemoteKey: No remote keys found. Ignoring request.`); + callback(null); + return; + } + + let hexData = null; + switch (newValue) { + case Characteristic.RemoteKey.REWIND: + hexData = data.remote.rewind; // not found yet + break; + case Characteristic.RemoteKey.FAST_FORWARD: + hexData = data.remote.fastForward; // not found yet + break; + case Characteristic.RemoteKey.NEXT_TRACK: + hexData = data.remote.nextTrack; // not found yet + break; + case Characteristic.RemoteKey.PREVIOUS_TRACK: + hexData = data.remote.previousTrack; // not found yet + break; + case Characteristic.RemoteKey.ARROW_UP: + hexData = data.remote.arrowUp; + break; + case Characteristic.RemoteKey.ARROW_DOWN: + hexData = data.remote.arrowDown; + break; + case Characteristic.RemoteKey.ARROW_LEFT: + hexData = data.remote.arrowLeft; + break; + case Characteristic.RemoteKey.ARROW_RIGHT: + hexData = data.remote.arrowRight; + break; + case Characteristic.RemoteKey.SELECT: + hexData = data.remote.select; + break; + case Characteristic.RemoteKey.BACK: + hexData = data.remote.back; + break; + case Characteristic.RemoteKey.EXIT: + hexData = data.remote.exit; + break; + case Characteristic.RemoteKey.PLAY_PAUSE: + hexData = data.remote.playPause; + break; + case Characteristic.RemoteKey.INFORMATION: + hexData = data.remote.info; + break; + } + + if (!hexData) { + log(`${name} RemoteKey: No IR code found for received remote input!`); + callback(null); + return; + } + + this.performSend(hexData); + callback(null); + }); + + this.serviceManager + .getCharacteristic(Characteristic.PictureMode) + .on("set", function(newValue, callback) { + // Not found yet + console.log("set PictureMode => setNewValue: " + newValue); + callback(null); + }); + + this.serviceManager + .getCharacteristic(Characteristic.PowerModeSelection) + .on("set", (newValue, callback) => { + if (!data || !data.powerMode) { + log(`${name} PowerModeSelection: No settings data found. Ignoring request.`); + callback(null); + return; + } + + let hexData = null; + switch (newValue) { + case Characteristic.PowerModeSelection.SHOW: // TV settings + hexData = data.powerMode.show; + break; + case Characteristic.PowerModeSelection.HIDE: // not found yet + hexData = data.powerMode.hide; + break; + } + + if (!hexData) { + log( + `${name} PowerModeSelection: No IR code found for received remote input!` + ); + callback(null); + return; + } + + this.performSend(hexData); + callback(null); + }); + + const speakerService = new Service.TelevisionSpeaker("Speaker", "Speaker"); + + speakerService.setCharacteristic( + Characteristic.Active, + Characteristic.Active.ACTIVE + ); + speakerService.setCharacteristic( + Characteristic.VolumeControlType, + Characteristic.VolumeControlType.ABSOLUTE + ); + + speakerService + .getCharacteristic(Characteristic.VolumeSelector) + .on("set", (newValue, callback) => { + if (!data || !data.volume) { + log(`${name} VolumeSelector: No settings data found. Ignoring request.`); + callback(null); + return; + } + + let hexData = null; + switch (newValue) { + case Characteristic.VolumeSelector.INCREMENT: + hexData = data.volume.up; + break; + case Characteristic.VolumeSelector.DECREMENT: + hexData = data.volume.down; + break; + } + + if (!hexData) { + log( + `${name} VolumeSelector: No IR code found for received remote input!` + ); + callback(null); + return; + } + + this.performSend(hexData); + callback(null); + }); + + this.serviceManagers.push(speakerService); + + const inputHDMI1 = new Service.InputSource("hdmi1", "HDMI1"); + + inputHDMI1.setCharacteristic(Characteristic.Identifier, 1); + inputHDMI1.setCharacteristic(Characteristic.ConfiguredName, "HDMI 1"); + inputHDMI1.setCharacteristic( + Characteristic.IsConfigured, + Characteristic.IsConfigured.CONFIGURED + ); + inputHDMI1.setCharacteristic( + Characteristic.InputSourceType, + Characteristic.InputSourceType.HDMI + ); + + this.serviceManagers.push(inputHDMI1); + this.serviceManager.service.addLinkedService(inputHDMI1); + + const inputHDMI2 = new Service.InputSource("hdmi2", "HDMI2"); + + inputHDMI2.setCharacteristic(Characteristic.Identifier, 2); + inputHDMI2.setCharacteristic(Characteristic.ConfiguredName, "HDMI 2"); + inputHDMI2.setCharacteristic( + Characteristic.IsConfigured, + Characteristic.IsConfigured.CONFIGURED + ); + inputHDMI2.setCharacteristic( + Characteristic.InputSourceType, + Characteristic.InputSourceType.OTHER + ); + + this.serviceManagers.push(inputHDMI2); + this.serviceManager.service.addLinkedService(inputHDMI2); + } +} + +module.exports = TVAccessory; diff --git a/platform.js b/platform.js index f0fe656d..f9461c3b 100644 --- a/platform.js +++ b/platform.js @@ -21,6 +21,7 @@ const classTypes = { 'outlet': Accessory.Outlet, 'light': Accessory.Light, 'window-covering': Accessory.WindowCovering, + 'tv': Accessory.TV } let homebridgeRef From 71c27a9533ec048c0b5e58d382216f6fb28386f1 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Thu, 31 Jan 2019 14:06:52 +0100 Subject: [PATCH 002/152] Updated sample config --- config-sample.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/config-sample.json b/config-sample.json index b5289c8f..ac902fc6 100644 --- a/config-sample.json +++ b/config-sample.json @@ -266,6 +266,32 @@ ], "stop":"STOP_HEX..." } + }, + { + "name":"TV", + "type":"tv", + "data": { + "off": "HEX...", + "on": "HEX...", + "remote": { + "select": "HEX...", + "arrowUp": "HEX...", + "arrowDown": "HEX...", + "arrowLeft": "HEX...", + "arrowRight": "HEX...", + "back": "HEX...", + "exit": "HEX...", + "playPause": "HEX...", + "info": "HEX..." + }, + "powerMode": { + "show": "HEX..." + }, + "volume": { + "up": "HEX...", + "down": "HEX..." + } + } } ] } From df910eb02d4b4c78837418f64b84ca0ff1887c38 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Thu, 31 Jan 2019 20:35:19 +0100 Subject: [PATCH 003/152] Changed some characteristics --- accessories/tv.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/accessories/tv.js b/accessories/tv.js index 89d9c432..26804179 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -78,13 +78,13 @@ class TVAccessory extends BroadlinkRMAccessory { if (config.pingIPAddressStateOnly) { state.switchState = active ? true : false; - serviceManager.refreshCharacteristicUI(Characteristic.On); + serviceManager.refreshCharacteristicUI(Characteristic.Active); return; } const value = active ? true : false; - serviceManager.setCharacteristic(Characteristic.On, value); + serviceManager.setCharacteristic(Characteristic.Active, value); } async setSwitchState(hexData) { @@ -110,7 +110,7 @@ class TVAccessory extends BroadlinkRMAccessory { this.autoOffTimeoutPromise = delayForDuration(onDuration); await this.autoOffTimeoutPromise; - serviceManager.setCharacteristic(Characteristic.On, false); + serviceManager.setCharacteristic(Characteristic.Active, false); } }); } @@ -128,7 +128,7 @@ class TVAccessory extends BroadlinkRMAccessory { this.autoOnTimeoutPromise = delayForDuration(offDuration); await this.autoOnTimeoutPromise; - serviceManager.setCharacteristic(Characteristic.On, true); + serviceManager.setCharacteristic(Characteristic.Active, true); } }); } From 037e02aef809141a410a5083cae05c3292dcbd92 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Fri, 1 Feb 2019 22:04:11 +0100 Subject: [PATCH 004/152] Added input support for tv accessory --- accessories/tv.js | 107 ++++++++++++++++++++++++++++++---------------- 1 file changed, 71 insertions(+), 36 deletions(-) diff --git a/accessories/tv.js b/accessories/tv.js index 26804179..d2c80523 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -143,14 +143,14 @@ class TVAccessory extends BroadlinkRMAccessory { } setupServiceManager() { - const { data, name, config, serviceManagerType } = this; + const { data, name, config, serviceManagerType, log } = this; const { on, off } = data || {}; this.serviceManagers = []; this.serviceManager = new ServiceManagerTypes[serviceManagerType]( name, Service.Television, - this.log + log ); this.serviceManager.setCharacteristic(Characteristic.ConfiguredName, name); @@ -177,10 +177,20 @@ class TVAccessory extends BroadlinkRMAccessory { this.serviceManager .getCharacteristic(Characteristic.ActiveIdentifier) - .on("set", function(newValue, callback) { - console.log("set Active Identifier => setNewValue: " + newValue); - // 1 - input one - // 2 - input two + .on("set", (newValue, callback) => { + if ( + !data || + !data.inputs || + !data.inputs[newValue] || + !data.inputs[newValue].data + ) { + log(`${name} Input: No input data found. Ignoring request.`); + callback(null); + return; + } + + this.performSend(data.inputs[newValue].data); + callback(null); }); @@ -258,7 +268,9 @@ class TVAccessory extends BroadlinkRMAccessory { .getCharacteristic(Characteristic.PowerModeSelection) .on("set", (newValue, callback) => { if (!data || !data.powerMode) { - log(`${name} PowerModeSelection: No settings data found. Ignoring request.`); + log( + `${name} PowerModeSelection: No settings data found. Ignoring request.` + ); callback(null); return; } @@ -300,7 +312,9 @@ class TVAccessory extends BroadlinkRMAccessory { .getCharacteristic(Characteristic.VolumeSelector) .on("set", (newValue, callback) => { if (!data || !data.volume) { - log(`${name} VolumeSelector: No settings data found. Ignoring request.`); + log( + `${name} VolumeSelector: No settings data found. Ignoring request.` + ); callback(null); return; } @@ -329,37 +343,58 @@ class TVAccessory extends BroadlinkRMAccessory { this.serviceManagers.push(speakerService); - const inputHDMI1 = new Service.InputSource("hdmi1", "HDMI1"); - - inputHDMI1.setCharacteristic(Characteristic.Identifier, 1); - inputHDMI1.setCharacteristic(Characteristic.ConfiguredName, "HDMI 1"); - inputHDMI1.setCharacteristic( - Characteristic.IsConfigured, - Characteristic.IsConfigured.CONFIGURED - ); - inputHDMI1.setCharacteristic( - Characteristic.InputSourceType, - Characteristic.InputSourceType.HDMI - ); - - this.serviceManagers.push(inputHDMI1); - this.serviceManager.service.addLinkedService(inputHDMI1); + if (data.inputs && data.inputs instanceof Array) { + for (let i = 0; i < data.inputs.length; i++) { + const input = data.inputs[i]; + const inputService = new Service.InputSource(`input${i}`, `input${i}`); + + inputService + .setCharacteristic(Characteristic.Identifier, i) + .setCharacteristic(Characteristic.ConfiguredName, input.name) + .setCharacteristic( + Characteristic.IsConfigured, + Characteristic.IsConfigured.CONFIGURED + ) + .setCharacteristic( + Characteristic.InputSourceType, + getInputType(input.type) + ); - const inputHDMI2 = new Service.InputSource("hdmi2", "HDMI2"); + this.serviceManagers.push(inputService); + this.serviceManager.service.addLinkedService(inputService); + } + } + } +} - inputHDMI2.setCharacteristic(Characteristic.Identifier, 2); - inputHDMI2.setCharacteristic(Characteristic.ConfiguredName, "HDMI 2"); - inputHDMI2.setCharacteristic( - Characteristic.IsConfigured, - Characteristic.IsConfigured.CONFIGURED - ); - inputHDMI2.setCharacteristic( - Characteristic.InputSourceType, - Characteristic.InputSourceType.OTHER - ); +function getInputType(type) { + if (!type) { + return 0; + } - this.serviceManagers.push(inputHDMI2); - this.serviceManager.service.addLinkedService(inputHDMI2); + switch (type.toLowerCase()) { + case "other": + return 0; + case "home_screen": + return 1; + case "tuner": + return 2; + case "hdmi": + return 3; + case "composite_video": + return 4; + case "s_video": + return 5; + case "component_video": + return 6; + case "dvi": + return 7; + case "airplay": + return 8; + case "usb": + return 9; + case "application": + return 10; } } From dc817d238065eac27863eba16a6ca6b3503cafb2 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Fri, 1 Feb 2019 22:09:39 +0100 Subject: [PATCH 005/152] Updated sample config --- config-sample.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/config-sample.json b/config-sample.json index ac902fc6..c0345a6e 100644 --- a/config-sample.json +++ b/config-sample.json @@ -290,7 +290,14 @@ "volume": { "up": "HEX...", "down": "HEX..." - } + }, + "inputs": [ + { + "name": "INPUT 1", + "type": "hdmi", + "data": "HEX..." + } + ] } } ] From a38c6b97de9819bc305da96e15f1e3d1e212ac6a Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sat, 16 Mar 2019 11:15:11 +0100 Subject: [PATCH 006/152] Bug fix --- accessories/tv.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/tv.js b/accessories/tv.js index d2c80523..402f5a0d 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -161,7 +161,7 @@ class TVAccessory extends BroadlinkRMAccessory { ); this.serviceManager.addToggleCharacteristic({ - name: "switchTV", + name: "switchState", type: Characteristic.Active, getMethod: this.getCharacteristicValue, setMethod: this.setCharacteristicValue, From 33ed3010eb20c1edda72f8439a26147371b619b4 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sun, 21 Apr 2019 18:11:54 +0200 Subject: [PATCH 007/152] Added persistence for inputs Updated readme --- README.md | 13 +++++++++++- accessories/tv.js | 50 ++++++++++++++++++++++++----------------------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 8b44e06b..75edbc98 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,15 @@ -# Homebridge Broadlink RM +# Homebridge Broadlink RM [TV Fork] + +# About this fork +This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! If you want to use this fork, use this command: + +`npm i -g git+https://github.com/AlexanderBabel/homebridge-broadlink-rm.git` + +# Known issues + +If you want to use more than one TV accessory you currently need to setup multiple homebridge instances. This will be fixed in the future. Currently it's the simplest workaround. + +# Homebridge Broadlink RM [Original] ## Introduction Welcome to the Broadlink RM Mini and Broadlink RM Pro plugin for [Homebridge](https://github.com/nfarina/homebridge). diff --git a/accessories/tv.js b/accessories/tv.js index 402f5a0d..4818dca2 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -1,8 +1,8 @@ -const ServiceManagerTypes = require("../helpers/serviceManagerTypes"); -const delayForDuration = require("../helpers/delayForDuration"); -const catchDelayCancelError = require("../helpers/catchDelayCancelError"); -const ping = require("../helpers/ping"); -const BroadlinkRMAccessory = require("./accessory"); +const ServiceManagerTypes = require('../helpers/serviceManagerTypes'); +const delayForDuration = require('../helpers/delayForDuration'); +const catchDelayCancelError = require('../helpers/catchDelayCancelError'); +const ping = require('../helpers/ping'); +const BroadlinkRMAccessory = require('./accessory'); class TVAccessory extends BroadlinkRMAccessory { constructor(log, config = {}, serviceManagerType) { @@ -161,7 +161,7 @@ class TVAccessory extends BroadlinkRMAccessory { ); this.serviceManager.addToggleCharacteristic({ - name: "switchState", + name: 'switchState', type: Characteristic.Active, getMethod: this.getCharacteristicValue, setMethod: this.setCharacteristicValue, @@ -177,7 +177,8 @@ class TVAccessory extends BroadlinkRMAccessory { this.serviceManager .getCharacteristic(Characteristic.ActiveIdentifier) - .on("set", (newValue, callback) => { + .on('get', (callback) => callback(null, this.state.input || 0)) + .on('set', (newValue, callback) => { if ( !data || !data.inputs || @@ -189,6 +190,7 @@ class TVAccessory extends BroadlinkRMAccessory { return; } + this.state.input = newValue; this.performSend(data.inputs[newValue].data); callback(null); @@ -196,7 +198,7 @@ class TVAccessory extends BroadlinkRMAccessory { this.serviceManager .getCharacteristic(Characteristic.RemoteKey) - .on("set", (newValue, callback) => { + .on('set', (newValue, callback) => { if (!data || !data.remote) { log(`${name} RemoteKey: No remote keys found. Ignoring request.`); callback(null); @@ -258,15 +260,15 @@ class TVAccessory extends BroadlinkRMAccessory { this.serviceManager .getCharacteristic(Characteristic.PictureMode) - .on("set", function(newValue, callback) { + .on('set', function(newValue, callback) { // Not found yet - console.log("set PictureMode => setNewValue: " + newValue); + console.log('set PictureMode => setNewValue: ' + newValue); callback(null); }); this.serviceManager .getCharacteristic(Characteristic.PowerModeSelection) - .on("set", (newValue, callback) => { + .on('set', (newValue, callback) => { if (!data || !data.powerMode) { log( `${name} PowerModeSelection: No settings data found. Ignoring request.` @@ -297,7 +299,7 @@ class TVAccessory extends BroadlinkRMAccessory { callback(null); }); - const speakerService = new Service.TelevisionSpeaker("Speaker", "Speaker"); + const speakerService = new Service.TelevisionSpeaker('Speaker', 'Speaker'); speakerService.setCharacteristic( Characteristic.Active, @@ -310,7 +312,7 @@ class TVAccessory extends BroadlinkRMAccessory { speakerService .getCharacteristic(Characteristic.VolumeSelector) - .on("set", (newValue, callback) => { + .on('set', (newValue, callback) => { if (!data || !data.volume) { log( `${name} VolumeSelector: No settings data found. Ignoring request.` @@ -373,27 +375,27 @@ function getInputType(type) { } switch (type.toLowerCase()) { - case "other": + case 'other': return 0; - case "home_screen": + case 'home_screen': return 1; - case "tuner": + case 'tuner': return 2; - case "hdmi": + case 'hdmi': return 3; - case "composite_video": + case 'composite_video': return 4; - case "s_video": + case 's_video': return 5; - case "component_video": + case 'component_video': return 6; - case "dvi": + case 'dvi': return 7; - case "airplay": + case 'airplay': return 8; - case "usb": + case 'usb': return 9; - case "application": + case 'application': return 10; } } From f763522f6f25f087274852ea52cb3af4ad7695c2 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sun, 21 Apr 2019 19:05:27 +0200 Subject: [PATCH 008/152] Added support for multiple TVs --- helpers/accessoryCreator.js | 75 +++++++++++++++++++++++++++++++++++++ platform.js | 27 ++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 helpers/accessoryCreator.js diff --git a/helpers/accessoryCreator.js b/helpers/accessoryCreator.js new file mode 100644 index 00000000..4dcaf69f --- /dev/null +++ b/helpers/accessoryCreator.js @@ -0,0 +1,75 @@ +//Credit: https://github.com/nfarina/homebridge/blob/master/lib/server.js#L425 +function createAccessory( + accessoryInstance, + displayName, + accessoryType, + { hap: { Service, Accessory, Characteristic, uuid }, platformAccessory } +) { + const services = accessoryInstance.getServices(); + // The returned "services" for this accessory are simply an array of new-API-style + // Service instances which we can add to a created HAP-NodeJS Accessory directly. + + const accessoryUUID = uuid.generate(accessoryType + ':' + displayName); + + const accessory = new platformAccessory(displayName, accessoryUUID); + + // listen for the identify event if the accessory instance has defined an identify() method + if (accessoryInstance.identify) + accessory.on('identify', function(paired, callback) { + accessoryInstance.identify(callback); + }); + + services.forEach(function(service) { + // if you returned an AccessoryInformation service, merge its values with ours + if (service instanceof Service.AccessoryInformation) { + const existingService = accessory.getService( + Service.AccessoryInformation + ); + + // pull out any values you may have defined + const manufacturer = service.getCharacteristic( + Characteristic.Manufacturer + ).value; + const model = service.getCharacteristic(Characteristic.Model).value; + const serialNumber = service.getCharacteristic( + Characteristic.SerialNumber + ).value; + const firmwareRevision = service.getCharacteristic( + Characteristic.FirmwareRevision + ).value; + const hardwareRevision = service.getCharacteristic( + Characteristic.HardwareRevision + ).value; + + if (manufacturer) + existingService.setCharacteristic( + Characteristic.Manufacturer, + manufacturer + ); + if (model) existingService.setCharacteristic(Characteristic.Model, model); + if (serialNumber) + existingService.setCharacteristic( + Characteristic.SerialNumber, + serialNumber + ); + if (firmwareRevision) + existingService.setCharacteristic( + Characteristic.FirmwareRevision, + firmwareRevision + ); + if (hardwareRevision) + existingService.setCharacteristic( + Characteristic.HardwareRevision, + hardwareRevision + ); + } else { + accessory.addService(service); + } + }); + + return accessory; +} + +module.exports = { + createAccessory +}; diff --git a/platform.js b/platform.js index f9461c3b..8f7e2a70 100644 --- a/platform.js +++ b/platform.js @@ -6,6 +6,7 @@ const Accessory = require('./accessories'); const checkForUpdates = require('./helpers/checkForUpdates'); const broadlink = require('./helpers/broadlink'); const { discoverDevices } = require('./helpers/getDevice'); +const { createAccessory } = require('./helpers/accessoryCreator'); const classTypes = { 'air-conditioner': Accessory.AirCon, @@ -57,7 +58,8 @@ const BroadlinkRMPlatform = class extends HomebridgePlatform { } } - // Itterate through the config accessories + // Iterate through the config accessories + let tvs = []; config.accessories.forEach((accessory) => { if (!accessory.type) throw new Error(`Each accessory must be configured with a "type". e.g. "switch"`); @@ -65,8 +67,29 @@ const BroadlinkRMPlatform = class extends HomebridgePlatform { const homeKitAccessory = new classTypes[accessory.type](log, accessory); + if (classTypes[accessory.type] === classTypes.tv) { + tvs.push(homeKitAccessory); + return; + } + accessories.push(homeKitAccessory); - }) + }); + + if (tvs.length > 0) { + accessories.push(tvs.shift(0, 1)); + if (tvs.length > 0) { + const TV = homebridgeRef.hap.Accessory.Categories.TELEVISION; + homebridgeRef.publishExternalAccessories(this, tvs.map(tv => createAccessory(tv, tv.name, TV, homebridgeRef))); + + log(''); + log(`**************************************************************************************************************`); + log(`You added more than TVs in your configuration!`); + log(`Due to a HomeKit limitation you need to add any additional TV to the Home app by using the Add Accessory function.`); + log(`There you'll find your additional TVs and you can use the same PIN as you using for this HomeBridge instance.`); + log(`**************************************************************************************************************`); + log(''); + } + } } discoverBroadlinkDevices () { From db65c665b547b5f9de75f2646fe4bcbfb73124e8 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sun, 21 Apr 2019 19:30:05 +0200 Subject: [PATCH 009/152] Added version check --- index.js | 7 ++++++- package.json | 3 ++- yarn.lock | 12 +++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index e3de57bc..53d4b380 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,11 @@ -const BroadlinkRMPlatform = require('./platform') +const BroadlinkRMPlatform = require('./platform'); +const compareVersions = require('compare-versions'); module.exports = (homebridge) => { + if (compareVersions("0.4.49", homebridge.serverVersion) > 0) { + console.log(`[Broadlink RM] The plugin homebridge-broadlink-rm requires HomeBridge v0.4.47 or higher! You have: ${homebridge.serverVersion}.`); + process.exit(1); + } global.Service = homebridge.hap.Service; global.Characteristic = homebridge.hap.Characteristic; diff --git a/package.json b/package.json index 2aa84a0e..2ea27fdf 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "github-version-checker": "^1.2.0", "homebridge-platform-helper": "1.1.1", "ping": "^0.2.2", - "uuid": "^3.2.1" + "uuid": "^3.2.1", + "compare-versions": "^3.4.0" }, "devDependencies": { "hap-nodejs": "^0.4.41", diff --git a/yarn.lock b/yarn.lock index 55f541b6..00273d95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -920,6 +920,11 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" +compare-versions@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1743,9 +1748,10 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homebridge-platform-helper@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/homebridge-platform-helper/-/homebridge-platform-helper-1.1.0.tgz#ad2d4a93468adf9b0cdb5e4328c055219f5b686f" +homebridge-platform-helper@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/homebridge-platform-helper/-/homebridge-platform-helper-1.1.1.tgz#a7304e52ad1f95c32a4b27b0d7ec9a253a15fb91" + integrity sha512-Zepvj+lFMjd6rKyhLZ4njf3UbENhbRZ1gdFaPUcfbtEbwskCJ4p4+LW16BSkoPEMsijhLbQXOC43r5ice9+MwA== dependencies: mqtt "^2.17.0" node-persist "^2.0.10" From 8ee67efd7d0b04c5f1b43394bba653310d929892 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sun, 21 Apr 2019 19:35:44 +0200 Subject: [PATCH 010/152] Bug fix --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 53d4b380..4370e5c3 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ const BroadlinkRMPlatform = require('./platform'); const compareVersions = require('compare-versions'); module.exports = (homebridge) => { - if (compareVersions("0.4.49", homebridge.serverVersion) > 0) { + if (compareVersions("0.4.47", homebridge.serverVersion) > 0) { console.log(`[Broadlink RM] The plugin homebridge-broadlink-rm requires HomeBridge v0.4.47 or higher! You have: ${homebridge.serverVersion}.`); process.exit(1); } From 7b605eb30e7f4ca2e751b9aee1fe202a898e4e13 Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sun, 21 Apr 2019 20:24:49 +0200 Subject: [PATCH 011/152] Renamed project --- README.md | 8 ++------ package.json | 8 ++++---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 75edbc98..28790b2a 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,9 @@ # About this fork This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! If you want to use this fork, use this command: -`npm i -g git+https://github.com/AlexanderBabel/homebridge-broadlink-rm.git` +`npm i -g homebridge-broadlink-rm-tv` -# Known issues - -If you want to use more than one TV accessory you currently need to setup multiple homebridge instances. This will be fixed in the future. Currently it's the simplest workaround. - -# Homebridge Broadlink RM [Original] +# Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] ## Introduction Welcome to the Broadlink RM Mini and Broadlink RM Pro plugin for [Homebridge](https://github.com/nfarina/homebridge). diff --git a/package.json b/package.json index 2ea27fdf..eb3fc9c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm", - "version": "3.5.5", + "name": "homebridge-broadlink-rm-tv", + "version": "3.5.7", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { @@ -17,11 +17,11 @@ "homebridge": ">=0.2.0" }, "author": { - "name": "lprhodes" + "name": "AlexanderBabel" }, "repository": { "type": "git", - "url": "git@github.com:lprhodes/homebridge-broadlink-rm.git" + "url": "git@github.com:AlexanderBabel/homebridge-broadlink-rm.git" }, "dependencies": { "broadlinkjs-rm": "^0.6.0", From 3c5ce0f50eab0bc9ed2bc6ac60c0a273435720af Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 26 Aug 2019 12:53:44 +1200 Subject: [PATCH 012/152] Update aircon.js Updated temperature from file to return zero on error instead of returning. --- accessories/aircon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index dd007f1f..6dad93ec 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -454,7 +454,8 @@ class AirConAccessory extends BroadlinkRMAccessory { if (temperature === undefined || temperature.trim().length === 0) { log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile (no temperature found)`); - return; + // Occasional errors cause Home to hang "updating" set zero instead of returning + temperature = parseFloat("0.0"); } if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); From 4f4405ebba021312d1df503e5912007780086d3a Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 28 Aug 2019 08:27:23 +1200 Subject: [PATCH 013/152] Update aircon.js Instead of returning zero immediately on an error reading temperature from file, retry once in case of conflict on initial read --- accessories/aircon.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 6dad93ec..f75e6dcb 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -452,10 +452,15 @@ class AirConAccessory extends BroadlinkRMAccessory { } if (temperature === undefined || temperature.trim().length === 0) { - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile (no temperature found)`); + log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found) - Retrying`); - // Occasional errors cause Home to hang "updating" set zero instead of returning - temperature = parseFloat("0.0"); + // Occasional errors cause Home to hang "updating" retry + fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { + if (err || temperature === undefined || temperature.trim().length === 0) { + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile (no temperature found)\n\n${err.message}`); + temperature = parseFloat("0.0"); + } + } } if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); From 7af72399a3fee18d94a60b1ce609daf73d4525d8 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 28 Aug 2019 09:48:29 +1200 Subject: [PATCH 014/152] Update aircon.js Error fix --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index f75e6dcb..b03aaeec 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -460,7 +460,7 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile (no temperature found)\n\n${err.message}`); temperature = parseFloat("0.0"); } - } + }); } if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); From fee4afcae612435d3f37ee1b996a1925d804dcb1 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 28 Aug 2019 13:39:45 +1200 Subject: [PATCH 015/152] Update package.json Updated project name --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index eb3fc9c7..a9079659 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "homebridge-broadlink-rm-tv", + "name": "homebridge-broadlink-rm-tv-ac", "version": "3.5.7", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", @@ -17,11 +17,11 @@ "homebridge": ">=0.2.0" }, "author": { - "name": "AlexanderBabel" + "name": "kiwi-cam" }, "repository": { "type": "git", - "url": "git@github.com:AlexanderBabel/homebridge-broadlink-rm.git" + "url": "git@github.com:kiwi-cam/homebridge-broadlink-rm.git" }, "dependencies": { "broadlinkjs-rm": "^0.6.0", From 84d64fac95a47bcc94c2bf2419620f215aabc3dd Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 28 Aug 2019 20:14:41 +1200 Subject: [PATCH 016/152] Update aircon.js Fixed NaN error --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index b03aaeec..645993de 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -456,7 +456,7 @@ class AirConAccessory extends BroadlinkRMAccessory { // Occasional errors cause Home to hang "updating" retry fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { - if (err || temperature === undefined || temperature.trim().length === 0) { + if (err || temperature === undefined || temperature.trim().length === 0 || temperature.isNAN() ) { log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile (no temperature found)\n\n${err.message}`); temperature = parseFloat("0.0"); } From bcdad07d49bc4c83a46870e6e45df9436d3e2149 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 29 Aug 2019 09:11:29 +1200 Subject: [PATCH 017/152] Update aircon.js Retry failing - reverting to set to 0 --- accessories/aircon.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 645993de..e3ecf617 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -452,15 +452,11 @@ class AirConAccessory extends BroadlinkRMAccessory { } if (temperature === undefined || temperature.trim().length === 0) { - log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found) - Retrying`); + log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); - // Occasional errors cause Home to hang "updating" retry - fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { - if (err || temperature === undefined || temperature.trim().length === 0 || temperature.isNAN() ) { - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile (no temperature found)\n\n${err.message}`); - temperature = parseFloat("0.0"); - } - }); + // Occasional errors cause Home to hang "updating" retry + temperature = parseFloat("0.0"); + } if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); From 9dfa31ac004c296d3d706e67b8f05cd78f4729bb Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 08:27:49 +1200 Subject: [PATCH 018/152] Update package.json --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a9079659..73abe890 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm-tv-ac", - "version": "3.5.7", + "name": "homebridge-broadlink-rm-tv-acfil", + "version": "1.0.2", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { @@ -21,7 +21,7 @@ }, "repository": { "type": "git", - "url": "git@github.com:kiwi-cam/homebridge-broadlink-rm.git" + "url": "git@github.com:kiwi-cam/homebridge-broadlink-rm-acfile.git" }, "dependencies": { "broadlinkjs-rm": "^0.6.0", From 481467f97929c5d336e4519dca53cfb874d6ee78 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 08:39:14 +1200 Subject: [PATCH 019/152] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 28790b2a..552cdfa9 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # Homebridge Broadlink RM [TV Fork] # About this fork -This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! If you want to use this fork, use this command: +This fork addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. If you want to use this fork, use this command: -`npm i -g homebridge-broadlink-rm-tv` +`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlink-rm-acfile.git` + +This fork comes from another fork which adds support for the TV type indroduced in iOS 12.2. # Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] @@ -30,4 +32,4 @@ You can keep informed about HomeKit, homebridge and homebridge plugins by subscr Full documentation can be found [here](https://lprhodes.github.io/slate/). ## Thanks -Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. \ No newline at end of file +Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. From e3b1428c7ad6741fa255e504c25a8ff4c565ecc3 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 08:40:37 +1200 Subject: [PATCH 020/152] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 552cdfa9..b8970661 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Homebridge Broadlink RM [TV Fork] +# Homebridge Broadlink RM [TV+AC File Fork] # About this fork This fork addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. If you want to use this fork, use this command: From 5b234c2e6d7842a8075dfd3f06aad43c505a846d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 12:34:39 +1200 Subject: [PATCH 021/152] Update package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 73abe890..af58d21b 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "homebridge-broadlink-rm-tv-acfil", + "name": "homebridge-broadlinkrm-acfile", "version": "1.0.2", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", @@ -21,7 +21,7 @@ }, "repository": { "type": "git", - "url": "git@github.com:kiwi-cam/homebridge-broadlink-rm-acfile.git" + "url": "git@github.com:kiwi-cam/homebridge-broadlinkrm-acfile.git" }, "dependencies": { "broadlinkjs-rm": "^0.6.0", From 88400438bee33265fb62fb3ee58e3bd3cab5f82a Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 12:35:05 +1200 Subject: [PATCH 022/152] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8970661..8360f761 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # About this fork This fork addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. If you want to use this fork, use this command: -`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlink-rm-acfile.git` +`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlinkrm-acfile.git` This fork comes from another fork which adds support for the TV type indroduced in iOS 12.2. From 6fd6c7767f3d4d021ab9ba8dbc25fc19edf7338e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 14:06:23 +1200 Subject: [PATCH 023/152] Update checkForUpdates.js --- helpers/checkForUpdates.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpers/checkForUpdates.js b/helpers/checkForUpdates.js index 1439794a..8557ef93 100644 --- a/helpers/checkForUpdates.js +++ b/helpers/checkForUpdates.js @@ -2,7 +2,7 @@ const versionCheck = require('github-version-checker'); const pkg = require('../package.json'); const options = { - repo: 'lprhodes/homebridge-broadlink-rm', + repo: 'kiwi-cam/homebridge-broadlinkrm-acfile', currentVersion: pkg.version, includePreReleases: false }; @@ -17,4 +17,4 @@ const checkForUpdates = () => { }); } -module.exports = checkForUpdates; \ No newline at end of file +module.exports = checkForUpdates; From 2580c8140f65583e0ac9d4fb8509ebe5a8dbd2d8 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 14:06:47 +1200 Subject: [PATCH 024/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index af58d21b..0cd2b485 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlinkrm-acfile", - "version": "1.0.2", + "version": "1.0.3", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 899d1cb2d879571dfb370ecddf98711126f419af Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 14:08:16 +1200 Subject: [PATCH 025/152] Update checkForUpdates.js --- helpers/checkForUpdates.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/checkForUpdates.js b/helpers/checkForUpdates.js index 8557ef93..dcfce4e6 100644 --- a/helpers/checkForUpdates.js +++ b/helpers/checkForUpdates.js @@ -12,7 +12,7 @@ const checkForUpdates = () => { versionCheck (options, (update, error) => { // if (error) throw error; if (update) { - console.log(`\x1b[32m[UPDATE AVAILABLE] \x1b[0mVersion ${update.tag_name} of homebridge-broadlink-rm is available. The release notes can be found here: \x1b[4mhttps://github.com/lprhodes/homebridge-broadlink-rm/releases/\x1b[0m`); + console.log(`\x1b[32m[UPDATE AVAILABLE] \x1b[0mVersion ${update.tag_name} of homebridge-broadlink-rm is available. The release notes can be found here: \x1b[4mhttps://github.com/kiwi-cam/homebridge-broadlinkrm-acfile/releases/\x1b[0m`); } }); } From 2aacb590ff35229e9b1e0d6c08926a42db7b82bd Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 14:09:14 +1200 Subject: [PATCH 026/152] Update package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0cd2b485..5177ea82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlinkrm-acfile", - "version": "1.0.3", + "name": "homebridge-broadlink-rm-acfile", + "version": "1.0.4", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From cc1e99bf52666910c002f9305dd0bc3a7fe838a0 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 14:09:34 +1200 Subject: [PATCH 027/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5177ea82..0bfcd635 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "repository": { "type": "git", - "url": "git@github.com:kiwi-cam/homebridge-broadlinkrm-acfile.git" + "url": "git@github.com:kiwi-cam/homebridge-broadlink-rm-acfile.git" }, "dependencies": { "broadlinkjs-rm": "^0.6.0", From 3d175c07a5105339344d108d2bc1fcb8bb41a57e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 2 Sep 2019 14:10:05 +1200 Subject: [PATCH 028/152] Update checkForUpdates.js --- helpers/checkForUpdates.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpers/checkForUpdates.js b/helpers/checkForUpdates.js index dcfce4e6..a12a3190 100644 --- a/helpers/checkForUpdates.js +++ b/helpers/checkForUpdates.js @@ -2,7 +2,7 @@ const versionCheck = require('github-version-checker'); const pkg = require('../package.json'); const options = { - repo: 'kiwi-cam/homebridge-broadlinkrm-acfile', + repo: 'kiwi-cam/homebridge-broadlink-rm-acfile', currentVersion: pkg.version, includePreReleases: false }; @@ -12,7 +12,7 @@ const checkForUpdates = () => { versionCheck (options, (update, error) => { // if (error) throw error; if (update) { - console.log(`\x1b[32m[UPDATE AVAILABLE] \x1b[0mVersion ${update.tag_name} of homebridge-broadlink-rm is available. The release notes can be found here: \x1b[4mhttps://github.com/kiwi-cam/homebridge-broadlinkrm-acfile/releases/\x1b[0m`); + console.log(`\x1b[32m[UPDATE AVAILABLE] \x1b[0mVersion ${update.tag_name} of homebridge-broadlink-rm-acfile is available. The release notes can be found here: \x1b[4mhttps://github.com/kiwi-cam/homebridge-broadlink-rm-acfile/releases/\x1b[0m`); } }); } From 7f8571972634c7f5aa13cc61bbe46df976e1172e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 07:58:26 +1200 Subject: [PATCH 029/152] Create airconPro.js Imported airconPro from https://github.com/Cloudore/homebridge-broadlink-rm --- accessories/airconPro.js | 455 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 455 insertions(+) create mode 100644 accessories/airconPro.js diff --git a/accessories/airconPro.js b/accessories/airconPro.js new file mode 100644 index 00000000..a45f8df9 --- /dev/null +++ b/accessories/airconPro.js @@ -0,0 +1,455 @@ +const BroadlinkRMAccessory = require('./accessory'); +const getDevice = require('../helpers/getDevice'); +const sendData = require('../helpers/sendData'); + +class AirConProAccessory extends BroadlinkRMAccessory { + + correctReloadedState (state) { + state.lastUsedHeatingCoolingState = undefined; + state.lastUsedTemperature = undefined; + + if (state.currentHeatingCoolingState === 0) { + state.targetTemperature = undefined + } + + state.targetHeatingCoolingState = state.currentHeatingCoolingState; + } + + constructor (log, config) { + super(log, config) + + const { state } = this; + const { defaultCoolTemperature, defaultHeatTemperature, heatTemperature, minTemperature, maxTemperature, pseudoDeviceTemperature, replaceAutoMode, units } = config + + // if (config.resendHexAfterReload === undefined) config.resendHexAfterReload = true; + + if (state.currentHeatingCoolingState === undefined) state.currentHeatingCoolingState = Characteristic.CurrentHeatingCoolingState.OFF; + if (state.targetHeatingCoolingState === undefined) state.targetHeatingCoolingState = Characteristic.CurrentHeatingCoolingState.OFF; + + // if (state.targetTemperature === undefined) state.targetTemperature = minTemperature || 0; + if (state.firstTemperatureUpdate === undefined) state.firstTemperatureUpdate = true; + + config.minTemperature = minTemperature || 0; + config.maxTemperature = maxTemperature || 30; + + if (config.temperatureDisplayUnits === undefined) config.temperatureDisplayUnits = (units && units.toLowerCase() === 'f') ? Characteristic.TemperatureDisplayUnits.FAHRENHEIT : Characteristic.TemperatureDisplayUnits.CELSIUS; + + // When a temperature hex doesn't exist we try to use the hex set for these + // default temperatures + config.defaultCoolTemperature = defaultCoolTemperature || 16; + config.defaultHeatTemperature = defaultHeatTemperature || 30; + + // Used to determine when we should use the defaultHeatTemperature or the + // defaultHeatTemperature + config.heatTemperature = heatTemperature || 22; + + // When we turn on the thermostat with Siri it comes thrugh as "auto" which + // isn't particularly supported at this time so we convert the mode to cool + // or heat + // Note that this is only used when you use Siri or press Auto immediately + // after launching Homebridge. The rest of the time we'll use your last known + // temperature + config.replaceAutoMode = replaceAutoMode || 'cool'; + + if (config.pseudoDeviceTemperature < config.minTemperature) throw new Error(`The pseudoDeviceTemperature (${pseudoDeviceTemperature}) must be more than the minTemperature (${config.minTemperature})`); + if (config.pseudoDeviceTemperature > config.maxTemperature) throw new Error(`The pseudoDeviceTemperature (${pseudoDeviceTemperature}) must be less than the maxTemperature (${config.maxTemperature})`); + + this.callbackQueue = {}; + } + + getServices () { + const services = super.getServices(); + const { data, config, name } = this; + const { minTemperature, maxTemperature } = config; + + const service = new Service.Thermostat(name); + this.addNameService(service); + + this.createToggleCharacteristic({ + service, + characteristicType: Characteristic.CurrentHeatingCoolingState, + propertyName: 'currentHeatingCoolingState', + getValuePromise: this.getCurrentHeatingCoolingState.bind(this) + }); + + this.createToggleCharacteristic({ + service, + characteristicType: Characteristic.TargetTemperature, + propertyName: 'targetTemperature', + setValuePromise: this.setTargetTemperature.bind(this), + defaultValue: minTemperature + }); + + this.createToggleCharacteristic({ + service, + characteristicType: Characteristic.TargetHeatingCoolingState, + propertyName: 'targetHeatingCoolingState', + setValuePromise: this.setTargetHeatingCoolingState.bind(this) + }); + + service + .getCharacteristic(Characteristic.CurrentTemperature) + .on('get', this.getCurrentTemperature.bind(this)); + + service + .getCharacteristic(Characteristic.TemperatureDisplayUnits) + .on('get', (callback) => callback(config.temperatureDisplayUnits)); + + service + .getCharacteristic(Characteristic.TargetTemperature) + .setProps({ + minValue: minTemperature, + maxValue: maxTemperature, + minStep: 1 + }); + + service + .getCharacteristic(Characteristic.CurrentTemperature) + .setProps({ + minValue: minTemperature, + maxValue: maxTemperature, + minStep: 1 + }); + + this.thermostatService = service; + services.push(service); + + setTimeout(() => { + this.updateTemperatureUI(); + }, 2000); + + return services; + } + + updateServiceHeatingCoolingState (value) { + const { state } = this; + + if (state.currentHeatingCoolingState === value) return; + + setTimeout(() => { + this.thermostatService.setCharacteristic(Characteristic.CurrentHeatingCoolingState, value); + this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, value); + }, 200) + } + + updateTemperatureUI () { + const { config, host, log, name, state } = this; + const { pseudoDeviceTemperature, autoHeatTemperature, autoCoolTemperature } = config; + + // Some devices don't include a thermometer + //if (pseudoDeviceTemperature !== undefined) return; + + //if (!autoHeatTemperature && !autoCoolTemperature) return; + + this.getCurrentTemperature((err, temperature) => { + this.thermostatService.setCharacteristic(Characteristic.CurrentTemperature, temperature); + + this.checkTemperatureForAutoOn(temperature); + + setTimeout(() => { + this.updateTemperatureUI(); + }, 10 * 1000); + }) + } + + checkTemperatureForAutoOn (temperature) { + const { config, host, log, name, state } = this; + let { autoHeatTemperature, autoCoolTemperature, autoMinimumDuration } = config; + + // Defaults + if (!autoMinimumDuration) autoMinimumDuration = 120; + + if (this.autoOnTimeout) { + this.log(`${name} getCurrentTemperature (ignore auto-check within ${autoMinimumDuration}s of starting)`); + + return; + } + + if ((!autoHeatTemperature && !autoCoolTemperature) || !this.isAutoSwitchOn()) return; + + if (autoHeatTemperature && temperature < autoHeatTemperature) { + this.state.runningAutomatically = true; + + this.log(`${name} getCurrentTemperature (${temperature} < ${autoHeatTemperature}: auto heat)`); + this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.HEAT); + } else if (autoCoolTemperature && temperature > autoCoolTemperature) { + this.state.runningAutomatically = true; + + this.log(`${name} getCurrentTemperature (${temperature} > ${autoCoolTemperature}: auto cool)`); + this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.COOL); + } else { + this.log(`${name} getCurrentTemperature (temperature is ok)`); + + if (this.state.runningAutomatically) { + this.state.runningAutomatically = false; + + this.log(`${name} getCurrentTemperature (auto off)`); + this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.OFF); + } else { + return; + } + } + + this.autoOnTimeout = setTimeout(() => { + this.resetAutoOnTimeout(); + }, autoMinimumDuration * 1000); + } + + resetAutoOnTimeout () { + if (this.autoOnTimeout) clearTimeout(this.autoOnTimeout); + this.autoOnTimeout = undefined + } + + isAutoSwitchOn () { + return this.autoSwitchAccessory && this.autoSwitchAccessory.state && this.autoSwitchAccessory.state.switchState; + } + + updateAccessories (accessories) { + const { config, name, log } = this; + const { autoSwitch } = config; + + if (!autoSwitch) return; + + log(`${name} Linking autoSwitch "${autoSwitch}"`) + + const autoSwitchAccessories = accessories.filter(accessory => accessory.name === autoSwitch); + + if (autoSwitchAccessories.length === 0) return log(`${name} No accessory could be found with the name "${autoSwitch}". Please update the "autoSwitch" value or add a matching switch accessory.`); + + this.autoSwitchAccessory = autoSwitchAccessories[0]; + } + + // Thermostat + sendTemperature (temperature, previousTemperature,targetHeatingCoolingState) { + const { config, data, host, log, name, state } = this; + const { defaultHeatTemperature, defaultCoolTemperature, heatTemperature } = config; + var targethcs = ""; + switch (targetHeatingCoolingState) { + case 1: + targethcs = 'heat'; + break; + case 2: + targethcs = 'cool'; + break; + case 3: + targethcs = 'auto'; + break; + default : + state.targetTemperature = temperature; + this.updateTemperatureUI(); + return; + } + log(`${name} Potential sendTemperature (${temperature})`); + let hasTemperatureChanged = (previousTemperature !== temperature); + let hexData = data[`${targethcs}${temperature}`]; + + // You may not want to set the hex data for every single mode... + if (!hexData) { + const defaultTemperature = (temperature >= heatTemperature) ? defaultHeatTemperature : defaultCoolTemperature; + hexData = data[`${targethcs}${defaultTemperature}`]; + + if (!hexData) { + const error = Error(`You need to set the defaultHeatTemperature and defaultCoolTemperature or provide a hex code for the given mode/temperature: + ({ "temperature${temperature}": { "data": "HEXCODE", "pseudo-mode" : "auto/heat/cool" } }) + or at the very least, the default mode/temperature + ({ "temperature${defaultTemperature}": { "data": "HEXCODE", "pseudo-mode" : "auto/heat/cool" } })`); + + throw new Error(`${name} ${error.message}`); + } + + hasTemperatureChanged = (state.targetTemperature !== defaultTemperature); + this.log(`${name} Update to default temperature (${defaultTemperature})`); + + state.targetTemperature = defaultTemperature; + } else { + state.targetTemperature = temperature; + } + + //if (!state.firstTemperatureUpdate && state.currentHeatingCoolingState !== Characteristic.TargetHeatingCoolingState.OFF) return; + state.firstTemperatureUpdate = false; + + const mode = hexData['pseudo-mode']; + this.log(`${name} sendTemperature (${state.targetTemperature}, ${mode})`); + this.updateServiceHeatingCoolingState(this.heatingCoolingStateForConfigKey(hexData['pseudo-mode'])); + + this.thermostatService.setCharacteristic(Characteristic.TargetTemperature, state.targetTemperature); + + state.lastUsedTemperature = state.targetTemperature; + state.lastUsedHeatingCoolingState = state.currentHeatingCoolingState; + this.updateTemperatureUI(); + sendData({ host, hexData: hexData.data, log, name }); + } + + getCurrentHeatingCoolingState () { + const { state } = this; + + this.updateServiceHeatingCoolingState(state.currentHeatingCoolingState); + } + + setTargetHeatingCoolingState () { + const { config, data, host, log, name, state } = this; + const { defaultCoolTemperature, defaultHeatTemperature, replaceAutoMode } = config; + // Perform the auto -> cool/heat conversion described in constructor() + if (replaceAutoMode && this.configKeyForHeatingCoolingState(this.targetHeatingCoolingState) === 'auto') { + if (state.firstTemperatureUpdate || state.lastUsedHeatingCoolingState === this.heatingCoolingStateForConfigKey('auto')) { + log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); + + setTimeout(() => { + this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, this.heatingCoolingStateForConfigKey(replaceAutoMode)); + }, 300) + } else { + state.targetTemperature = state.lastUsedTemperature + + log(`${name} setTargetHeatingCoolingState (converting from auto to last used - ${this.configKeyForHeatingCoolingState(state.lastUsedHeatingCoolingState)})`); + setTimeout(() => { + this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, state.lastUsedHeatingCoolingState); + }, 300) + } + + return; + } + + if (state.targetHeatingCoolingState === undefined) return; // Some calls are made to this without a value + if (state.targetHeatingCoolingState === state.currentHeatingCoolingState) return; + + const currentModeConfigKey = this.configKeyForHeatingCoolingState(state.targetHeatingCoolingState); + + const currentModeData = data[currentModeConfigKey] + if (currentModeData) { + this.state.runningAutomatically = false; + this.resetAutoOnTimeout(); + + this.updateServiceHeatingCoolingState(state.targetHeatingCoolingState); + sendData({ host, hexData: currentModeData, log, name }); + } else { + + let temperature = state.targetTemperature; + + if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { + temperature = defaultHeatTemperature + } else if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.COOL) { + temperature = defaultCoolTemperature; + } else { + temperature = 26; + } + + this.sendTemperature(temperature, state.targetTemperature,state.targetHeatingCoolingState); + } + } + + getCurrentTemperature (callback) { + const { config, host, log, name, state } = this; + const { pseudoDeviceTemperature, temperatureAdjustment } = config; + //log(state.targetTemperature); + // Some devices don't include a thermometer + if (pseudoDeviceTemperature !== undefined) { + //log(`${name} getCurrentTemperature (using ${state.targetTemperature} from target)`); + if(state.targetTemperature !== undefined){ + return callback(null, state.targetTemperature); + }else{ + this.updateServiceHeatingCoolingState(0); + return callback(null, 26); + } + } + + const device = getDevice({ host, log }) + if (!device) return callback(null, pseudoDeviceTemperature || 0); + + const callbackIdentifier = Date.now(); + this.callbackQueue[callbackIdentifier] = callback; + + // Make sure we're only calling one at a time + if (Object.keys(this.callbackQueue).length > 1) return; + + let onTemperature; + + onTemperature = (temperature) => { + if (temperatureAdjustment) temperature += temperatureAdjustment + + if (temperature > 40) return log(`${name} getCurrentTemperature (reported temperature too high, ignoring: ${temperature})`) + if (temperature < -15) return log(`${name} getCurrentTemperature (reported temperature too low, ignoring: ${temperature})`) + state.currentTemperature = temperature; + + if (this.removeTemperatureListenerTimer) clearTimeout(this.removeTemperatureListenerTimer) + device.removeListener('temperature', onTemperature); + this.processQueuedCallbacks(); + + log(`${name} getCurrentTemperature (${temperature})`); + } + + // Add a 3 second timeout + this.removeTemperatureListenerTimer = setTimeout(() => { + device.removeListener('temperature', onTemperature); + this.processQueuedCallbacks(); + + log(`${name} getCurrentTemperature (3s timeout)`); + }, 3000) + + device.on('temperature', onTemperature); + + device.checkTemperature(); + } + + processQueuedCallbacks () { + const { config, state } = this; + const { minTemperature, maxTemperature } = config; + + if (state.currentTemperature < minTemperature) throw new Error(`The current temperature (${state.currentTemperature}) must be more than the minTemperature (${minTemperature})`); + if (state.currentTemperature > maxTemperature) throw new Error(`The current temperature (${state.currentTemperature}) must be less than the maxTemperature (${maxTemperature})`); + + + Object.keys(this.callbackQueue).forEach((callbackIdentifier) => { + const callback = this.callbackQueue[callbackIdentifier]; + callback(null, state.currentTemperature); + + delete this.callbackQueue[callbackIdentifier]; + }) + } + + setTargetTemperature (hexData, previousValue) { + const { config, log, name, state } = this; + const { minTemperature, maxTemperature } = config; + + if (state.targetTemperature < minTemperature) return log(`The target temperature (${this.targetTemperature}) must be more than the minTemperature (${minTemperature})`); + if (state.targetTemperature > maxTemperature) return log(`The target temperature (${this.targetTemperature}) must be less than the maxTemperature (${maxTemperature})`); + + if (state.targetTemperature === previousValue) return + this.sendTemperature(state.targetTemperature, previousValue, state.currentHeatingCoolingState); + } + + configKeyForCurrentHeatingCoolingState () { + const { state } = this; + + return this.configKeyForHeatingCoolingState(state.currentHeatingCoolingState); + } + + configKeyForHeatingCoolingState (state) { + switch (state) { + case Characteristic.TargetHeatingCoolingState.AUTO: + return 'auto'; + case Characteristic.TargetHeatingCoolingState.COOL: + return 'cool'; + case Characteristic.TargetHeatingCoolingState.HEAT: + return 'heat'; + default: + return 'off'; + } + } + + heatingCoolingStateForConfigKey (configKey) { + switch (configKey) { + case 'off': + return Characteristic.TargetHeatingCoolingState.OFF; + case 'cool': + return Characteristic.TargetHeatingCoolingState.COOL; + case 'heat': + return Characteristic.TargetHeatingCoolingState.HEAT; + case 'auto': + return Characteristic.TargetHeatingCoolingState.AUTO; + default: + return Characteristic.TargetHeatingCoolingState.AUTO; + } + } +} + +module.exports = AirConProAccessory From 12c05af3468efd17840151d72a6179a19d5c6a86 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 07:58:57 +1200 Subject: [PATCH 030/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bfcd635..4c9a4aa2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.0.4", + "version": "1.1.0", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 7bd8fb584ea4faaaa8153851943021d46f67b6ee Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 09:53:09 +1200 Subject: [PATCH 031/152] Update airconPro.js Added temperatureFilePath support --- accessories/airconPro.js | 74 +++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/accessories/airconPro.js b/accessories/airconPro.js index a45f8df9..254c0d4d 100644 --- a/accessories/airconPro.js +++ b/accessories/airconPro.js @@ -1,6 +1,7 @@ const BroadlinkRMAccessory = require('./accessory'); const getDevice = require('../helpers/getDevice'); const sendData = require('../helpers/sendData'); +const fs = require('fs'); class AirConProAccessory extends BroadlinkRMAccessory { @@ -339,7 +340,7 @@ class AirConProAccessory extends BroadlinkRMAccessory { getCurrentTemperature (callback) { const { config, host, log, name, state } = this; - const { pseudoDeviceTemperature, temperatureAdjustment } = config; + const { pseudoDeviceTemperature, temperatureAdjustment, temperatureFilePath, mqttURL } = config; //log(state.targetTemperature); // Some devices don't include a thermometer if (pseudoDeviceTemperature !== undefined) { @@ -352,28 +353,35 @@ class AirConProAccessory extends BroadlinkRMAccessory { } } - const device = getDevice({ host, log }) - if (!device) return callback(null, pseudoDeviceTemperature || 0); + // Read temperature from file + if (temperatureFilePath) { + const temperature = this.updateTemperatureFromFile(); - const callbackIdentifier = Date.now(); - this.callbackQueue[callbackIdentifier] = callback; + state.currentTemperature = temperature; + }else{ + // Read temperature from Device + const device = getDevice({ host, log }) + if (!device) return callback(null, pseudoDeviceTemperature || 0); - // Make sure we're only calling one at a time - if (Object.keys(this.callbackQueue).length > 1) return; + const callbackIdentifier = Date.now(); + this.callbackQueue[callbackIdentifier] = callback; - let onTemperature; + // Make sure we're only calling one at a time + if (Object.keys(this.callbackQueue).length > 1) return; - onTemperature = (temperature) => { - if (temperatureAdjustment) temperature += temperatureAdjustment + let onTemperature; - if (temperature > 40) return log(`${name} getCurrentTemperature (reported temperature too high, ignoring: ${temperature})`) - if (temperature < -15) return log(`${name} getCurrentTemperature (reported temperature too low, ignoring: ${temperature})`) - state.currentTemperature = temperature; + onTemperature = (temperature) => { + if (temperatureAdjustment) temperature += temperatureAdjustment - if (this.removeTemperatureListenerTimer) clearTimeout(this.removeTemperatureListenerTimer) - device.removeListener('temperature', onTemperature); - this.processQueuedCallbacks(); + if (temperature > 40) return log(`${name} getCurrentTemperature (reported temperature too high, ignoring: ${temperature})`) + if (temperature < -15) return log(`${name} getCurrentTemperature (reported temperature too low, ignoring: ${temperature})`) + state.currentTemperature = temperature; + if (this.removeTemperatureListenerTimer) clearTimeout(this.removeTemperatureListenerTimer) + device.removeListener('temperature', onTemperature); + this.processQueuedCallbacks(); + } log(`${name} getCurrentTemperature (${temperature})`); } @@ -415,7 +423,39 @@ class AirConProAccessory extends BroadlinkRMAccessory { if (state.targetTemperature === previousValue) return this.sendTemperature(state.targetTemperature, previousValue, state.currentHeatingCoolingState); - } + } + + updateTemperatureFromFile () { + const { config, debug, host, log, name } = this; + const { temperatureFilePath } = config; + + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile reading file: ${temperatureFilePath}`); + + fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { + + if (err) { + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile\n\n${err.message}`); + + return; + } + + if (temperature === undefined || temperature.trim().length === 0) { + log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); + + // Occasional errors cause Home to hang "updating" retry + temperature = parseFloat("0.0"); + + } + + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); + + temperature = parseFloat(temperature); + + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); + + return temperature; + }); + } configKeyForCurrentHeatingCoolingState () { const { state } = this; From c6844d8a96feb931f065982069c8932f9b7ddb2b Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 09:53:29 +1200 Subject: [PATCH 032/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c9a4aa2..23100412 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.0", + "version": "1.1.1", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 9d36f4ee180b93e0137dc0843733f0ad80eaa210 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 10:38:03 +1200 Subject: [PATCH 033/152] Delete airconPro.js --- accessories/airconPro.js | 495 --------------------------------------- 1 file changed, 495 deletions(-) delete mode 100644 accessories/airconPro.js diff --git a/accessories/airconPro.js b/accessories/airconPro.js deleted file mode 100644 index 254c0d4d..00000000 --- a/accessories/airconPro.js +++ /dev/null @@ -1,495 +0,0 @@ -const BroadlinkRMAccessory = require('./accessory'); -const getDevice = require('../helpers/getDevice'); -const sendData = require('../helpers/sendData'); -const fs = require('fs'); - -class AirConProAccessory extends BroadlinkRMAccessory { - - correctReloadedState (state) { - state.lastUsedHeatingCoolingState = undefined; - state.lastUsedTemperature = undefined; - - if (state.currentHeatingCoolingState === 0) { - state.targetTemperature = undefined - } - - state.targetHeatingCoolingState = state.currentHeatingCoolingState; - } - - constructor (log, config) { - super(log, config) - - const { state } = this; - const { defaultCoolTemperature, defaultHeatTemperature, heatTemperature, minTemperature, maxTemperature, pseudoDeviceTemperature, replaceAutoMode, units } = config - - // if (config.resendHexAfterReload === undefined) config.resendHexAfterReload = true; - - if (state.currentHeatingCoolingState === undefined) state.currentHeatingCoolingState = Characteristic.CurrentHeatingCoolingState.OFF; - if (state.targetHeatingCoolingState === undefined) state.targetHeatingCoolingState = Characteristic.CurrentHeatingCoolingState.OFF; - - // if (state.targetTemperature === undefined) state.targetTemperature = minTemperature || 0; - if (state.firstTemperatureUpdate === undefined) state.firstTemperatureUpdate = true; - - config.minTemperature = minTemperature || 0; - config.maxTemperature = maxTemperature || 30; - - if (config.temperatureDisplayUnits === undefined) config.temperatureDisplayUnits = (units && units.toLowerCase() === 'f') ? Characteristic.TemperatureDisplayUnits.FAHRENHEIT : Characteristic.TemperatureDisplayUnits.CELSIUS; - - // When a temperature hex doesn't exist we try to use the hex set for these - // default temperatures - config.defaultCoolTemperature = defaultCoolTemperature || 16; - config.defaultHeatTemperature = defaultHeatTemperature || 30; - - // Used to determine when we should use the defaultHeatTemperature or the - // defaultHeatTemperature - config.heatTemperature = heatTemperature || 22; - - // When we turn on the thermostat with Siri it comes thrugh as "auto" which - // isn't particularly supported at this time so we convert the mode to cool - // or heat - // Note that this is only used when you use Siri or press Auto immediately - // after launching Homebridge. The rest of the time we'll use your last known - // temperature - config.replaceAutoMode = replaceAutoMode || 'cool'; - - if (config.pseudoDeviceTemperature < config.minTemperature) throw new Error(`The pseudoDeviceTemperature (${pseudoDeviceTemperature}) must be more than the minTemperature (${config.minTemperature})`); - if (config.pseudoDeviceTemperature > config.maxTemperature) throw new Error(`The pseudoDeviceTemperature (${pseudoDeviceTemperature}) must be less than the maxTemperature (${config.maxTemperature})`); - - this.callbackQueue = {}; - } - - getServices () { - const services = super.getServices(); - const { data, config, name } = this; - const { minTemperature, maxTemperature } = config; - - const service = new Service.Thermostat(name); - this.addNameService(service); - - this.createToggleCharacteristic({ - service, - characteristicType: Characteristic.CurrentHeatingCoolingState, - propertyName: 'currentHeatingCoolingState', - getValuePromise: this.getCurrentHeatingCoolingState.bind(this) - }); - - this.createToggleCharacteristic({ - service, - characteristicType: Characteristic.TargetTemperature, - propertyName: 'targetTemperature', - setValuePromise: this.setTargetTemperature.bind(this), - defaultValue: minTemperature - }); - - this.createToggleCharacteristic({ - service, - characteristicType: Characteristic.TargetHeatingCoolingState, - propertyName: 'targetHeatingCoolingState', - setValuePromise: this.setTargetHeatingCoolingState.bind(this) - }); - - service - .getCharacteristic(Characteristic.CurrentTemperature) - .on('get', this.getCurrentTemperature.bind(this)); - - service - .getCharacteristic(Characteristic.TemperatureDisplayUnits) - .on('get', (callback) => callback(config.temperatureDisplayUnits)); - - service - .getCharacteristic(Characteristic.TargetTemperature) - .setProps({ - minValue: minTemperature, - maxValue: maxTemperature, - minStep: 1 - }); - - service - .getCharacteristic(Characteristic.CurrentTemperature) - .setProps({ - minValue: minTemperature, - maxValue: maxTemperature, - minStep: 1 - }); - - this.thermostatService = service; - services.push(service); - - setTimeout(() => { - this.updateTemperatureUI(); - }, 2000); - - return services; - } - - updateServiceHeatingCoolingState (value) { - const { state } = this; - - if (state.currentHeatingCoolingState === value) return; - - setTimeout(() => { - this.thermostatService.setCharacteristic(Characteristic.CurrentHeatingCoolingState, value); - this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, value); - }, 200) - } - - updateTemperatureUI () { - const { config, host, log, name, state } = this; - const { pseudoDeviceTemperature, autoHeatTemperature, autoCoolTemperature } = config; - - // Some devices don't include a thermometer - //if (pseudoDeviceTemperature !== undefined) return; - - //if (!autoHeatTemperature && !autoCoolTemperature) return; - - this.getCurrentTemperature((err, temperature) => { - this.thermostatService.setCharacteristic(Characteristic.CurrentTemperature, temperature); - - this.checkTemperatureForAutoOn(temperature); - - setTimeout(() => { - this.updateTemperatureUI(); - }, 10 * 1000); - }) - } - - checkTemperatureForAutoOn (temperature) { - const { config, host, log, name, state } = this; - let { autoHeatTemperature, autoCoolTemperature, autoMinimumDuration } = config; - - // Defaults - if (!autoMinimumDuration) autoMinimumDuration = 120; - - if (this.autoOnTimeout) { - this.log(`${name} getCurrentTemperature (ignore auto-check within ${autoMinimumDuration}s of starting)`); - - return; - } - - if ((!autoHeatTemperature && !autoCoolTemperature) || !this.isAutoSwitchOn()) return; - - if (autoHeatTemperature && temperature < autoHeatTemperature) { - this.state.runningAutomatically = true; - - this.log(`${name} getCurrentTemperature (${temperature} < ${autoHeatTemperature}: auto heat)`); - this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.HEAT); - } else if (autoCoolTemperature && temperature > autoCoolTemperature) { - this.state.runningAutomatically = true; - - this.log(`${name} getCurrentTemperature (${temperature} > ${autoCoolTemperature}: auto cool)`); - this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.COOL); - } else { - this.log(`${name} getCurrentTemperature (temperature is ok)`); - - if (this.state.runningAutomatically) { - this.state.runningAutomatically = false; - - this.log(`${name} getCurrentTemperature (auto off)`); - this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.OFF); - } else { - return; - } - } - - this.autoOnTimeout = setTimeout(() => { - this.resetAutoOnTimeout(); - }, autoMinimumDuration * 1000); - } - - resetAutoOnTimeout () { - if (this.autoOnTimeout) clearTimeout(this.autoOnTimeout); - this.autoOnTimeout = undefined - } - - isAutoSwitchOn () { - return this.autoSwitchAccessory && this.autoSwitchAccessory.state && this.autoSwitchAccessory.state.switchState; - } - - updateAccessories (accessories) { - const { config, name, log } = this; - const { autoSwitch } = config; - - if (!autoSwitch) return; - - log(`${name} Linking autoSwitch "${autoSwitch}"`) - - const autoSwitchAccessories = accessories.filter(accessory => accessory.name === autoSwitch); - - if (autoSwitchAccessories.length === 0) return log(`${name} No accessory could be found with the name "${autoSwitch}". Please update the "autoSwitch" value or add a matching switch accessory.`); - - this.autoSwitchAccessory = autoSwitchAccessories[0]; - } - - // Thermostat - sendTemperature (temperature, previousTemperature,targetHeatingCoolingState) { - const { config, data, host, log, name, state } = this; - const { defaultHeatTemperature, defaultCoolTemperature, heatTemperature } = config; - var targethcs = ""; - switch (targetHeatingCoolingState) { - case 1: - targethcs = 'heat'; - break; - case 2: - targethcs = 'cool'; - break; - case 3: - targethcs = 'auto'; - break; - default : - state.targetTemperature = temperature; - this.updateTemperatureUI(); - return; - } - log(`${name} Potential sendTemperature (${temperature})`); - let hasTemperatureChanged = (previousTemperature !== temperature); - let hexData = data[`${targethcs}${temperature}`]; - - // You may not want to set the hex data for every single mode... - if (!hexData) { - const defaultTemperature = (temperature >= heatTemperature) ? defaultHeatTemperature : defaultCoolTemperature; - hexData = data[`${targethcs}${defaultTemperature}`]; - - if (!hexData) { - const error = Error(`You need to set the defaultHeatTemperature and defaultCoolTemperature or provide a hex code for the given mode/temperature: - ({ "temperature${temperature}": { "data": "HEXCODE", "pseudo-mode" : "auto/heat/cool" } }) - or at the very least, the default mode/temperature - ({ "temperature${defaultTemperature}": { "data": "HEXCODE", "pseudo-mode" : "auto/heat/cool" } })`); - - throw new Error(`${name} ${error.message}`); - } - - hasTemperatureChanged = (state.targetTemperature !== defaultTemperature); - this.log(`${name} Update to default temperature (${defaultTemperature})`); - - state.targetTemperature = defaultTemperature; - } else { - state.targetTemperature = temperature; - } - - //if (!state.firstTemperatureUpdate && state.currentHeatingCoolingState !== Characteristic.TargetHeatingCoolingState.OFF) return; - state.firstTemperatureUpdate = false; - - const mode = hexData['pseudo-mode']; - this.log(`${name} sendTemperature (${state.targetTemperature}, ${mode})`); - this.updateServiceHeatingCoolingState(this.heatingCoolingStateForConfigKey(hexData['pseudo-mode'])); - - this.thermostatService.setCharacteristic(Characteristic.TargetTemperature, state.targetTemperature); - - state.lastUsedTemperature = state.targetTemperature; - state.lastUsedHeatingCoolingState = state.currentHeatingCoolingState; - this.updateTemperatureUI(); - sendData({ host, hexData: hexData.data, log, name }); - } - - getCurrentHeatingCoolingState () { - const { state } = this; - - this.updateServiceHeatingCoolingState(state.currentHeatingCoolingState); - } - - setTargetHeatingCoolingState () { - const { config, data, host, log, name, state } = this; - const { defaultCoolTemperature, defaultHeatTemperature, replaceAutoMode } = config; - // Perform the auto -> cool/heat conversion described in constructor() - if (replaceAutoMode && this.configKeyForHeatingCoolingState(this.targetHeatingCoolingState) === 'auto') { - if (state.firstTemperatureUpdate || state.lastUsedHeatingCoolingState === this.heatingCoolingStateForConfigKey('auto')) { - log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - - setTimeout(() => { - this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, this.heatingCoolingStateForConfigKey(replaceAutoMode)); - }, 300) - } else { - state.targetTemperature = state.lastUsedTemperature - - log(`${name} setTargetHeatingCoolingState (converting from auto to last used - ${this.configKeyForHeatingCoolingState(state.lastUsedHeatingCoolingState)})`); - setTimeout(() => { - this.thermostatService.setCharacteristic(Characteristic.TargetHeatingCoolingState, state.lastUsedHeatingCoolingState); - }, 300) - } - - return; - } - - if (state.targetHeatingCoolingState === undefined) return; // Some calls are made to this without a value - if (state.targetHeatingCoolingState === state.currentHeatingCoolingState) return; - - const currentModeConfigKey = this.configKeyForHeatingCoolingState(state.targetHeatingCoolingState); - - const currentModeData = data[currentModeConfigKey] - if (currentModeData) { - this.state.runningAutomatically = false; - this.resetAutoOnTimeout(); - - this.updateServiceHeatingCoolingState(state.targetHeatingCoolingState); - sendData({ host, hexData: currentModeData, log, name }); - } else { - - let temperature = state.targetTemperature; - - if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { - temperature = defaultHeatTemperature - } else if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.COOL) { - temperature = defaultCoolTemperature; - } else { - temperature = 26; - } - - this.sendTemperature(temperature, state.targetTemperature,state.targetHeatingCoolingState); - } - } - - getCurrentTemperature (callback) { - const { config, host, log, name, state } = this; - const { pseudoDeviceTemperature, temperatureAdjustment, temperatureFilePath, mqttURL } = config; - //log(state.targetTemperature); - // Some devices don't include a thermometer - if (pseudoDeviceTemperature !== undefined) { - //log(`${name} getCurrentTemperature (using ${state.targetTemperature} from target)`); - if(state.targetTemperature !== undefined){ - return callback(null, state.targetTemperature); - }else{ - this.updateServiceHeatingCoolingState(0); - return callback(null, 26); - } - } - - // Read temperature from file - if (temperatureFilePath) { - const temperature = this.updateTemperatureFromFile(); - - state.currentTemperature = temperature; - }else{ - // Read temperature from Device - const device = getDevice({ host, log }) - if (!device) return callback(null, pseudoDeviceTemperature || 0); - - const callbackIdentifier = Date.now(); - this.callbackQueue[callbackIdentifier] = callback; - - // Make sure we're only calling one at a time - if (Object.keys(this.callbackQueue).length > 1) return; - - let onTemperature; - - onTemperature = (temperature) => { - if (temperatureAdjustment) temperature += temperatureAdjustment - - if (temperature > 40) return log(`${name} getCurrentTemperature (reported temperature too high, ignoring: ${temperature})`) - if (temperature < -15) return log(`${name} getCurrentTemperature (reported temperature too low, ignoring: ${temperature})`) - state.currentTemperature = temperature; - - if (this.removeTemperatureListenerTimer) clearTimeout(this.removeTemperatureListenerTimer) - device.removeListener('temperature', onTemperature); - this.processQueuedCallbacks(); - } - log(`${name} getCurrentTemperature (${temperature})`); - } - - // Add a 3 second timeout - this.removeTemperatureListenerTimer = setTimeout(() => { - device.removeListener('temperature', onTemperature); - this.processQueuedCallbacks(); - - log(`${name} getCurrentTemperature (3s timeout)`); - }, 3000) - - device.on('temperature', onTemperature); - - device.checkTemperature(); - } - - processQueuedCallbacks () { - const { config, state } = this; - const { minTemperature, maxTemperature } = config; - - if (state.currentTemperature < minTemperature) throw new Error(`The current temperature (${state.currentTemperature}) must be more than the minTemperature (${minTemperature})`); - if (state.currentTemperature > maxTemperature) throw new Error(`The current temperature (${state.currentTemperature}) must be less than the maxTemperature (${maxTemperature})`); - - - Object.keys(this.callbackQueue).forEach((callbackIdentifier) => { - const callback = this.callbackQueue[callbackIdentifier]; - callback(null, state.currentTemperature); - - delete this.callbackQueue[callbackIdentifier]; - }) - } - - setTargetTemperature (hexData, previousValue) { - const { config, log, name, state } = this; - const { minTemperature, maxTemperature } = config; - - if (state.targetTemperature < minTemperature) return log(`The target temperature (${this.targetTemperature}) must be more than the minTemperature (${minTemperature})`); - if (state.targetTemperature > maxTemperature) return log(`The target temperature (${this.targetTemperature}) must be less than the maxTemperature (${maxTemperature})`); - - if (state.targetTemperature === previousValue) return - this.sendTemperature(state.targetTemperature, previousValue, state.currentHeatingCoolingState); - } - - updateTemperatureFromFile () { - const { config, debug, host, log, name } = this; - const { temperatureFilePath } = config; - - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile reading file: ${temperatureFilePath}`); - - fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { - - if (err) { - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile\n\n${err.message}`); - - return; - } - - if (temperature === undefined || temperature.trim().length === 0) { - log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); - - // Occasional errors cause Home to hang "updating" retry - temperature = parseFloat("0.0"); - - } - - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); - - temperature = parseFloat(temperature); - - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); - - return temperature; - }); - } - - configKeyForCurrentHeatingCoolingState () { - const { state } = this; - - return this.configKeyForHeatingCoolingState(state.currentHeatingCoolingState); - } - - configKeyForHeatingCoolingState (state) { - switch (state) { - case Characteristic.TargetHeatingCoolingState.AUTO: - return 'auto'; - case Characteristic.TargetHeatingCoolingState.COOL: - return 'cool'; - case Characteristic.TargetHeatingCoolingState.HEAT: - return 'heat'; - default: - return 'off'; - } - } - - heatingCoolingStateForConfigKey (configKey) { - switch (configKey) { - case 'off': - return Characteristic.TargetHeatingCoolingState.OFF; - case 'cool': - return Characteristic.TargetHeatingCoolingState.COOL; - case 'heat': - return Characteristic.TargetHeatingCoolingState.HEAT; - case 'auto': - return Characteristic.TargetHeatingCoolingState.AUTO; - default: - return Characteristic.TargetHeatingCoolingState.AUTO; - } - } -} - -module.exports = AirConProAccessory From 1ed18a0b27b7849c06fabb24f47e47cb05d79e9d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 10:39:09 +1200 Subject: [PATCH 034/152] Update package.json Removed AC Pro - not compatible with newer AC implementation --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23100412..d3b6be01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.1", + "version": "1.1.2", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From b2c942f0ac8ffcdd738c28a79cacf35744c199d4 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 12:05:54 +1200 Subject: [PATCH 035/152] Update aircon.js Added mode support to the AC accessory --- accessories/aircon.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index e3ecf617..5b11344f 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -235,7 +235,7 @@ class AirConAccessory extends BroadlinkRMAccessory { await this.turnOnWhenOffDelayPromise } - const { hexData, finalTemperature } = this.getTemperatureHexData(temperature); + const { hexData, finalTemperature } = this.getTemperatureHexData(state.currentHeatingCoolingState, temperature); state.targetTemperature = finalTemperature; @@ -286,12 +286,18 @@ class AirConAccessory extends BroadlinkRMAccessory { this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } - getTemperatureHexData (temperature) { + getTemperatureHexData (mode, temperature) { const { config, data, name, state, debug } = this; const { defaultHeatTemperature, defaultCoolTemperature, heatTemperature } = config; let finalTemperature = temperature; - let hexData = data[`temperature${temperature}`]; + let hexData = data[`${mode}${temperature}`]; + + if (!hexData) { + // Mode based code not found, try mode-less + this.log(`${name} No ${mode} HEX code found for ${temperature}`); + let hexData = data[`temperature${temperature}`]; + } // You may not want to set the hex data for every single mode... if (!hexData) { @@ -303,7 +309,6 @@ class AirConAccessory extends BroadlinkRMAccessory { or provide the default temperature: \x1b[33m { "temperature${defaultTemperature}": { "data": "HEXCODE", "pseudo-mode" : "heat/cool" } }\x1b[0m`); - this.log(`${name} Update to default temperature (${defaultTemperature})`); finalTemperature = defaultTemperature; } From fbbaff39521d472a854989cdd95ec6ca37314589 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 12:06:28 +1200 Subject: [PATCH 036/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3b6be01..969436cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.2", + "version": "1.1.3", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 008c41cee8bc00ebaeab6c3789e1f4c6cc6ccc4c Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:10:20 +1200 Subject: [PATCH 037/152] Update aircon.js --- accessories/aircon.js | 50 +++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 5b11344f..5e6fc3c4 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -234,8 +234,16 @@ class AirConAccessory extends BroadlinkRMAccessory { this.turnOnWhenOffDelayPromise = delayForDuration(.3); await this.turnOnWhenOffDelayPromise } - - const { hexData, finalTemperature } = this.getTemperatureHexData(state.currentHeatingCoolingState, temperature); + + if(state.currentHeatingCoolingState === 1) { + mode = 'heat'; + } else if(state.currentHeatingCoolingState === 2) { + mode = 'cool'; + } else { + mode = 'auto'; + } + + const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); state.targetTemperature = finalTemperature; @@ -256,7 +264,7 @@ class AirConAccessory extends BroadlinkRMAccessory { state.firstTemperatureUpdate = false; // Send the temperature hex - this.log(`${name} sendTemperature (${state.targetTemperature}`); + this.log(`${name} sendTemperature (${state.targetTemperature}) ${mode}`); await this.performSend(hexData.data); if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { @@ -264,26 +272,26 @@ class AirConAccessory extends BroadlinkRMAccessory { } // Update the heating/cooling mode based on the temperature. - let mode = hexData['pseudo-mode']; + //let mode = hexData['pseudo-mode']; - if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); + //if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); - if (!mode) { - if (state.targetTemperature < state.currentTemperature) { - mode = 'cool'; - } else if (state.targetTemperature > state.currentTemperature) { - mode = 'heat'; - } else { - mode = 'auto'; - } - } - - this.log(`${name} sendTemperature (set mode to ${mode}`); - - state.targetHeatingCoolingState = HeatingCoolingStates[mode]; - this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); - this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); - this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); + //if (!mode) { + // if (state.targetTemperature < state.currentTemperature) { + // mode = 'cool'; + // } else if (state.targetTemperature > state.currentTemperature) { + // mode = 'heat'; + // } else { + // mode = 'auto'; + // } + //} + + //this.log(`${name} sendTemperature (set mode to ${mode}`); + + //state.targetHeatingCoolingState = HeatingCoolingStates[mode]; + //this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); + //this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); + //this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } getTemperatureHexData (mode, temperature) { From 7ce7e4780ac6d475714d616bc052c5e527269fe2 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:10:43 +1200 Subject: [PATCH 038/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 969436cf..aea1354d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.3", + "version": "1.1.31", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 2e8723bdd84aa1a8e0e387be9c1845a91ac28ead Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:17:24 +1200 Subject: [PATCH 039/152] Update aircon.js --- accessories/aircon.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 5e6fc3c4..a02ad81e 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -236,11 +236,11 @@ class AirConAccessory extends BroadlinkRMAccessory { } if(state.currentHeatingCoolingState === 1) { - mode = 'heat'; + let mode = 'heat'; } else if(state.currentHeatingCoolingState === 2) { - mode = 'cool'; + let mode = 'cool'; } else { - mode = 'auto'; + let mode = 'auto'; } const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); From 391327e852da35cbfb0bc435447acb2920f75ed5 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:17:42 +1200 Subject: [PATCH 040/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aea1354d..3af46c07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.31", + "version": "1.1.32", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 1acb7e9958952b990d69976412fe94a1742855ff Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:28:07 +1200 Subject: [PATCH 041/152] Update aircon.js --- accessories/aircon.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index a02ad81e..46b4b0e1 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -234,13 +234,14 @@ class AirConAccessory extends BroadlinkRMAccessory { this.turnOnWhenOffDelayPromise = delayForDuration(.3); await this.turnOnWhenOffDelayPromise } - + + let mode; if(state.currentHeatingCoolingState === 1) { - let mode = 'heat'; + mode = 'heat'; } else if(state.currentHeatingCoolingState === 2) { - let mode = 'cool'; + mode = 'cool'; } else { - let mode = 'auto'; + mode = 'auto'; } const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); From e3a60bd3f52e04c36a79cd80f182fd4b85d1866a Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:28:29 +1200 Subject: [PATCH 042/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3af46c07..86dd112f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.32", + "version": "1.1.33", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 371852a8717378710c568d00a5fb8b6e86a6cfbc Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:36:10 +1200 Subject: [PATCH 043/152] Update aircon.js --- accessories/aircon.js | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 46b4b0e1..ab13894a 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -236,9 +236,9 @@ class AirConAccessory extends BroadlinkRMAccessory { } let mode; - if(state.currentHeatingCoolingState === 1) { + if(state.currentHeatingCoolingState == 1) { mode = 'heat'; - } else if(state.currentHeatingCoolingState === 2) { + } else if(state.currentHeatingCoolingState == 2) { mode = 'cool'; } else { mode = 'auto'; @@ -272,27 +272,26 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - // Update the heating/cooling mode based on the temperature. + // IGNORE - Update the heating/cooling mode based on the temperature. //let mode = hexData['pseudo-mode']; - //if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); - //if (!mode) { - // if (state.targetTemperature < state.currentTemperature) { - // mode = 'cool'; - // } else if (state.targetTemperature > state.currentTemperature) { - // mode = 'heat'; - // } else { - // mode = 'auto'; - // } - //} - - //this.log(`${name} sendTemperature (set mode to ${mode}`); - - //state.targetHeatingCoolingState = HeatingCoolingStates[mode]; - //this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); - //this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); - //this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); + if (!mode) { + if (state.targetTemperature < state.currentTemperature) { + mode = 'cool'; + } else if (state.targetTemperature > state.currentTemperature) { + mode = 'heat'; + } else { + mode = 'auto'; + } + } + + this.log(`${name} sendTemperature (set mode to ${mode}`); + + state.targetHeatingCoolingState = HeatingCoolingStates[mode]; + this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); + this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); + this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } getTemperatureHexData (mode, temperature) { From 7205498b0edd0cc750430471da6b6c0fafae296d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:38:49 +1200 Subject: [PATCH 044/152] Update aircon.js Using state.targetHeatingCoolingState instead of current --- accessories/aircon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index ab13894a..e1a0a013 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -236,9 +236,9 @@ class AirConAccessory extends BroadlinkRMAccessory { } let mode; - if(state.currentHeatingCoolingState == 1) { + if(state.targetHeatingCoolingState == 1) { mode = 'heat'; - } else if(state.currentHeatingCoolingState == 2) { + } else if(state.targetHeatingCoolingState == 2) { mode = 'cool'; } else { mode = 'auto'; From a2bfb86a26510e4a9787d554d2385904b61d7a49 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:39:11 +1200 Subject: [PATCH 045/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 86dd112f..c76e76c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.33", + "version": "1.1.34", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 21943a3d7ea942f903dbc48c627d42d14cce3578 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:50:32 +1200 Subject: [PATCH 046/152] Update aircon.js allowAutoMode configuration to disable the replacement of this mode --- accessories/aircon.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index e1a0a013..9d5e3986 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -78,8 +78,10 @@ class AirConAccessory extends BroadlinkRMAccessory { // Note that this is only used when you use Siri or press Auto immediately // after launching Homebridge. The rest of the time we'll use your last known // temperature - config.replaceAutoMode = config.replaceAutoMode || 'cool'; - + if (!config.allowAutoMode) { + config.replaceAutoMode = config.replaceAutoMode || 'cool'; + } + // Set state default values // state.targetTemperature = state.targetTemperature || config.minTemperature; state.currentHeatingCoolingState = state.currentHeatingCoolingState || Characteristic.CurrentHeatingCoolingState.OFF; From ffbe1c9764d65d2715aa7f2269fdca325b048bde Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:50:58 +1200 Subject: [PATCH 047/152] Update package.json added allowAutoMode configuration to disable the replacement of this mode --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c76e76c9..e40726c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.34", + "version": "1.1.35", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From d2f3db26989e83daeea2c7143d209d4ab41ebe2a Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:58:38 +1200 Subject: [PATCH 048/152] Update README.md --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 8360f761..79e4e199 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,20 @@ This fork addresses an issue updating the temperature from file. Devices appear This fork comes from another fork which adds support for the TV type indroduced in iOS 12.2. +Now updated to replciate the airconditioner-pro accessory: + 1. Added configuration item allowAutoMode which, if true, will allow AC to run in Auto mode. + 2. Added configuration to read hex codes for {mode}{temp} e.g. + + "data":{ + "off":"2600500000012...", + "heat30":{ + "data":"2600500000012..." + }, + "cool16":{ + "data":"2600500000012..." + } + } + # Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] ## Introduction From d4c723d27b097ca652b90c51038790fa34d279da Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:59:08 +1200 Subject: [PATCH 049/152] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 79e4e199..5d3e1d0d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Now updated to replciate the airconditioner-pro accessory: "data":"2600500000012..." } } + # Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] From c69a63d8f54427a2037fe77883509062d322966e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 15:01:34 +1200 Subject: [PATCH 050/152] Update aircon.js --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 9d5e3986..42e3dbb0 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -288,7 +288,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } } - this.log(`${name} sendTemperature (set mode to ${mode}`); + this.log(`${name} sendTemperature (set mode to ${mode})`); state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); From 7c353d15aa3e647111e680b7ded8c58ca01e4241 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 15:06:42 +1200 Subject: [PATCH 051/152] Update package.json Updated version number with AC Pro support --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e40726c4..23b83f8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.1.35", + "version": "1.2.0", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 7f30ecc0ea6839da331055567aa2f732a634b609 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 15:13:13 +1200 Subject: [PATCH 052/152] Update README.md --- README.md | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 5d3e1d0d..638a582c 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,11 @@ # Homebridge Broadlink RM [TV+AC File Fork] # About this fork -This fork addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. If you want to use this fork, use this command: -`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlinkrm-acfile.git` - -This fork comes from another fork which adds support for the TV type indroduced in iOS 12.2. - -Now updated to replciate the airconditioner-pro accessory: +This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm) which adds TV support to [lprhodes Broadlink RM Plugin](https://github.com/lprhodes/homebridge-broadlink-rm)). This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: 1. Added configuration item allowAutoMode which, if true, will allow AC to run in Auto mode. 2. Added configuration to read hex codes for {mode}{temp} e.g. - +``` "data":{ "off":"2600500000012...", "heat30":{ @@ -20,7 +15,12 @@ Now updated to replciate the airconditioner-pro accessory: "data":"2600500000012..." } } - +``` + +If you want to use this fork, use this command: + +`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlinkrm-acfile.git` + # Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] @@ -29,19 +29,6 @@ Welcome to the Broadlink RM Mini and Broadlink RM Pro plugin for [Homebridge](ht This plugin allows you to control your RM Mini and RM Pro with HomeKit using the Home app and Siri. - -## Like this plugin? - -If you like this plugin and want to show your support then please star the Github repo, or better yet; buy me a drink using [Paypal](https://paypal.me/lprhodes) or [crypto currency](https://goo.gl/bEn1RW). - -Working on open source projects like this is full-time for me so every bit helps. - -Thank you, sincerely! - -## Newsletter - -You can keep informed about HomeKit, homebridge and homebridge plugins by subscribing to my [Works with](http://workswith.io) newsletter. - ## Documentation Full documentation can be found [here](https://lprhodes.github.io/slate/). From 988e2260f120256c189c75f4a324bd46445a7ba0 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 10 Sep 2019 15:13:32 +1200 Subject: [PATCH 053/152] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 638a582c..9bd48edf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # About this fork -This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm) which adds TV support to [lprhodes Broadlink RM Plugin](https://github.com/lprhodes/homebridge-broadlink-rm)). This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: +This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm) which adds TV support to [lprhodes Broadlink RM Plugin](https://github.com/lprhodes/homebridge-broadlink-rm). This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: 1. Added configuration item allowAutoMode which, if true, will allow AC to run in Auto mode. 2. Added configuration to read hex codes for {mode}{temp} e.g. ``` From 43f31ea8a26f09acc9ce178a116f5584f157578b Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:19:30 +1200 Subject: [PATCH 054/152] Update aircon.js Improved HeatingCoolingMode code/string handling, re-added pseudo-mode support --- accessories/aircon.js | 48 +++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 42e3dbb0..7785b4ee 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -72,15 +72,12 @@ class AirConAccessory extends BroadlinkRMAccessory { // defaultHeatTemperature config.heatTemperature = config.heatTemperature || 22; - // When we turn on the thermostat with Siri it comes thrugh as "auto" which - // isn't particularly supported at this time so we convert the mode to cool - // or heat - // Note that this is only used when you use Siri or press Auto immediately - // after launching Homebridge. The rest of the time we'll use your last known - // temperature - if (!config.allowAutoMode) { - config.replaceAutoMode = config.replaceAutoMode || 'cool'; - } + + // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified + if (replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { + log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); + config.replaceAutoMode = config.replaceAutoMode || 'cool'; + } // Set state default values // state.targetTemperature = state.targetTemperature || config.minTemperature; @@ -237,15 +234,8 @@ class AirConAccessory extends BroadlinkRMAccessory { await this.turnOnWhenOffDelayPromise } - let mode; - if(state.targetHeatingCoolingState == 1) { - mode = 'heat'; - } else if(state.targetHeatingCoolingState == 2) { - mode = 'cool'; - } else { - mode = 'auto'; - } - + const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); state.targetTemperature = finalTemperature; @@ -274,20 +264,12 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - // IGNORE - Update the heating/cooling mode based on the temperature. - //let mode = hexData['pseudo-mode']; - //if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); + // Update the heating/cooling mode based on the pseudo-mode - if pressent. + if (hexData['pseudo-mode']){ + let mode = hexData['pseudo-mode']; + if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); + } - if (!mode) { - if (state.targetTemperature < state.currentTemperature) { - mode = 'cool'; - } else if (state.targetTemperature > state.currentTemperature) { - mode = 'heat'; - } else { - mode = 'auto'; - } - } - this.log(`${name} sendTemperature (set mode to ${mode})`); state.targetHeatingCoolingState = HeatingCoolingStates[mode]; @@ -307,6 +289,10 @@ class AirConAccessory extends BroadlinkRMAccessory { // Mode based code not found, try mode-less this.log(`${name} No ${mode} HEX code found for ${temperature}`); let hexData = data[`temperature${temperature}`]; + } else { + if (hexData['pseudo-mode']) { + this.log(`${name} WARNING: Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); + } } // You may not want to set the hex data for every single mode... From a9882e551110d772d5e11fea59555175c527cace Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:19:56 +1200 Subject: [PATCH 055/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23b83f8f..1235cdee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.0", + "version": "1.2.1", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 0aea09b9d8a7f56ce831daf9b94e462dbe3718f6 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:22:00 +1200 Subject: [PATCH 056/152] Update config-sample.json Added AC mode example --- config-sample.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/config-sample.json b/config-sample.json index c0345a6e..c1e3b93d 100644 --- a/config-sample.json +++ b/config-sample.json @@ -191,12 +191,13 @@ "autoSwitch": "A/C Auto Switch", "data":{ "off":"2600500000012...", - "temperature30":{ - "pseudo-mode":"heat", + "heat30":{ "data":"2600500000012..." }, - "temperature16":{ - "pseudo-mode":"cool", + "auto22":{ + "data":"2600500000012..." + }, + "cool16":{ "data":"2600500000012..." } } From 9c9ade41c77af147b6c4900ef2b69803e866bf14 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:24:57 +1200 Subject: [PATCH 057/152] Update README.md Remove allowAutoMode. Instead omitting replaceAutoMode will allow Auto Mode --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9bd48edf..51046bb9 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ # About this fork This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm) which adds TV support to [lprhodes Broadlink RM Plugin](https://github.com/lprhodes/homebridge-broadlink-rm). This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: - 1. Added configuration item allowAutoMode which, if true, will allow AC to run in Auto mode. - 2. Added configuration to read hex codes for {mode}{temp} e.g. + + 1. Added configuration to read hex codes for {mode}{temp} e.g. ``` "data":{ "off":"2600500000012...", From 91322fb424eeb1d38d8e9622e789d763ffa8edf8 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:29:28 +1200 Subject: [PATCH 058/152] Update aircon.js Fixed bug in replaceAutoMode --- accessories/aircon.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 7785b4ee..8ffc8905 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -73,11 +73,11 @@ class AirConAccessory extends BroadlinkRMAccessory { config.heatTemperature = config.heatTemperature || 22; - // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified - if (replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { - log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - config.replaceAutoMode = config.replaceAutoMode || 'cool'; - } + // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified + if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { + log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); + config.replaceAutoMode = config.replaceAutoMode || 'cool'; + } // Set state default values // state.targetTemperature = state.targetTemperature || config.minTemperature; From 31f19e3808be8afed003b55348e24176ed2f159a Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:29:56 +1200 Subject: [PATCH 059/152] Update package.json Fixed bug in replaceAutoMode --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1235cdee..da940e8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.1", + "version": "1.2.2", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 792c956edc185c73df752d1cbb078c787540172f Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:42:32 +1200 Subject: [PATCH 060/152] Update aircon.js Fixed bug in HeatingCoolingConfigKeys --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 8ffc8905..d069c97f 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -234,7 +234,7 @@ class AirConAccessory extends BroadlinkRMAccessory { await this.turnOnWhenOffDelayPromise } - const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + const mode = this.HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); From 2f8bf3862050d50d298c98206dfb4b70d137f9b8 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:42:47 +1200 Subject: [PATCH 061/152] Update package.json HeatingCoolingConfigKeys --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da940e8c..5243ba5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.2", + "version": "1.2.3", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From bcb742d6a84017fdeb152109edeaaefdb0a36699 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:45:12 +1200 Subject: [PATCH 062/152] Update aircon.js --- accessories/aircon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index d069c97f..577476e1 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -223,7 +223,7 @@ class AirConAccessory extends BroadlinkRMAccessory { // Thermostat async sendTemperature (temperature, previousTemperature) { - const { HeatingCoolingStates, config, data, host, log, name, state, debug } = this; + const { HeatingCoolingConfigKeys, HeatingCoolingStates, config, data, host, log, name, state, debug } = this; const { preventResendHex, defaultCoolTemperature, heatTemperature, ignoreTemperatureWhenOff, sendTemperatureOnlyWhenOff } = config; log(`${name} Potential sendTemperature (${temperature})`); @@ -234,7 +234,7 @@ class AirConAccessory extends BroadlinkRMAccessory { await this.turnOnWhenOffDelayPromise } - const mode = this.HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); From 3e5fd3765f6cdcbde4a8af2e9ccc4d68654b22cd Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 11 Sep 2019 08:53:58 +1200 Subject: [PATCH 063/152] Update aircon.js Improved logging output --- accessories/aircon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 577476e1..c70ae768 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -257,7 +257,7 @@ class AirConAccessory extends BroadlinkRMAccessory { state.firstTemperatureUpdate = false; // Send the temperature hex - this.log(`${name} sendTemperature (${state.targetTemperature}) ${mode}`); + this.log(`${name} sendingTemperature (${mode} - ${state.targetTemperature})`); await this.performSend(hexData.data); if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { @@ -270,7 +270,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); } - this.log(`${name} sendTemperature (set mode to ${mode})`); + this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); From 6a2e55d4f3547b963eead34bb8ec9245be852280 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 19 Sep 2019 15:31:15 +1200 Subject: [PATCH 064/152] updateTemperatureFromFile rounding workaround Currently integer rounding occurs, so 22.9 is reported as 22. Explicitly rounded the result to force correct rounding. --- accessories/aircon.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index c70ae768..5f8a1fd6 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -453,20 +453,17 @@ class AirConAccessory extends BroadlinkRMAccessory { } if (temperature === undefined || temperature.trim().length === 0) { - log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); + log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); - // Occasional errors cause Home to hang "updating" retry - temperature = parseFloat("0.0"); - + // Occasional errors cause Home to hang "updating" retry + temperature = parseFloat("0.0"); } - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (file content: ${temperature.trim()})`); - temperature = parseFloat(temperature); - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); - this.onTemperature(temperature); + //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate + this.onTemperature(Math.round(temperature)); }); } From 085dd549ce77956a09ac66f4a101087a5449aa16 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 19 Sep 2019 16:09:04 +1200 Subject: [PATCH 065/152] processQueuedTemperatureCallbacks rounding workaround updateTemperatureFromFile workaround lost detail in logging, moved rounding workaround later in process in processQueuedTemperatureCallbacks --- accessories/aircon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 5f8a1fd6..17036cea 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -463,7 +463,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate - this.onTemperature(Math.round(temperature)); + this.onTemperaturetemperature); }); } @@ -473,7 +473,7 @@ class AirConAccessory extends BroadlinkRMAccessory { Object.keys(this.temperatureCallbackQueue).forEach((callbackIdentifier) => { const callback = this.temperatureCallbackQueue[callbackIdentifier]; - callback(null, temperature); + callback(null, Math.round(temperature)); delete this.temperatureCallbackQueue[callbackIdentifier]; }) From 7de6ddc619574a6169f74fd16aa050d818b433df Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 19 Sep 2019 16:17:24 +1200 Subject: [PATCH 066/152] processQueuedTemperatureCallbacks rounding workaround Fixed missing ( - whoops --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 17036cea..29543f08 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -463,7 +463,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate - this.onTemperaturetemperature); + this.onTemperature(temperature); }); } From 8825d9ae62e923e042f0636b2fad3bc6b7c55c2d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 19 Sep 2019 19:55:48 +1200 Subject: [PATCH 067/152] Proper rounding/decimal fix Corrected configuration to allow 0.1 increments of temperature --- accessories/aircon.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 29543f08..3fdbd516 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -265,7 +265,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } // Update the heating/cooling mode based on the pseudo-mode - if pressent. - if (hexData['pseudo-mode']){ + if (hexData['pseudo-mode']){ let mode = hexData['pseudo-mode']; if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); } @@ -456,7 +456,7 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); // Occasional errors cause Home to hang "updating" retry - temperature = parseFloat("0.0"); + temperature = "0.0"; } temperature = parseFloat(temperature); @@ -473,7 +473,7 @@ class AirConAccessory extends BroadlinkRMAccessory { Object.keys(this.temperatureCallbackQueue).forEach((callbackIdentifier) => { const callback = this.temperatureCallbackQueue[callbackIdentifier]; - callback(null, Math.round(temperature)); + callback(null, temperature); delete this.temperatureCallbackQueue[callbackIdentifier]; }) @@ -681,7 +681,7 @@ class AirConAccessory extends BroadlinkRMAccessory { .setProps({ minValue: minTemperature, maxValue: maxTemperature, - minStep: 1 + minStep: 0.1 }); } } From a343173d92677792c66a9415f71d8c264507e885 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 11:17:08 +1200 Subject: [PATCH 068/152] Updated sendTemperature to process less when not required ignoreTemperatureWhenOff was being checked late in process requiring processing that was then ignored. Moved up. This also appears to be related to Scene status display errors. --- accessories/aircon.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 3fdbd516..7d83f41b 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -233,6 +233,13 @@ class AirConAccessory extends BroadlinkRMAccessory { this.turnOnWhenOffDelayPromise = delayForDuration(.3); await this.turnOnWhenOffDelayPromise } + + // Ignore Temperature if off - and set to ignore + if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { + log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); + + return; + } const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; @@ -248,12 +255,6 @@ class AirConAccessory extends BroadlinkRMAccessory { } } - if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { - log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); - - return; - } - state.firstTemperatureUpdate = false; // Send the temperature hex From c18dd8f14fe3794b8fed5d7e78bf045659695651 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 14:09:20 +1200 Subject: [PATCH 069/152] Added W1 Device Support Config item w1DeviceID added to hold the device ID --- accessories/aircon.js | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 7d83f41b..5e7b1671 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -391,7 +391,7 @@ class AirConAccessory extends BroadlinkRMAccessory { addTemperatureCallbackToQueue (callback) { const { config, host, log, name, state } = this; - const { mqttURL, temperatureFilePath } = config; + const { mqttURL, temperatureFilePath, w1DeviceID } = config; // Clear the previous callback if (Object.keys(this.temperatureCallbackQueue).length > 1) { @@ -412,6 +412,13 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } + + // Read temperature from W1 Device + if (w1DeviceID) { + this.updateTemperatureFromW1(); + + return; + } // Read temperature from mqtt if (mqttURL) { @@ -468,6 +475,34 @@ class AirConAccessory extends BroadlinkRMAccessory { }); } + updateTemperatureFromW1 () { + const { config, debug, host, log, name } = this; + const { w1DeviceID } = config; + var W1PATH = "/sys/bus/w1/devices"; + var fsOptions = { "encoding":"utf8", "flag":"r" }; + var fName = W1PATH + "/" + w1DeviceID + "/w1_slave"; + + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 reading file: ${fName}`); + + if (fs.existsSync(fName)) { + var fData = fs.readFileSync(fName, fsOptions).trim(); + // Extract the numeric part + var tBeg = fData.indexOf("t=")+2; + if (tBeg >= 0) { + var tEnd = tBeg+1; + while (tEnd='0' && fData[tEnd]<='9') { + tEnd++; + } + var temperature = fData.substring(tBeg, tEnd); + } + + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 (parsed temperature: ${temperature})`); + + //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate + this.onTemperature(temperature); + }); + } + processQueuedTemperatureCallbacks (temperature) { if (Object.keys(this.temperatureCallbackQueue).length === 0) return; From 0c13adaf5ee3aaac6a2f5994174929aa9814c608 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 14:15:09 +1200 Subject: [PATCH 070/152] "w1DeviceID" config sample --- config-sample.json-W1 | 316 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 config-sample.json-W1 diff --git a/config-sample.json-W1 b/config-sample.json-W1 new file mode 100644 index 00000000..67ee3498 --- /dev/null +++ b/config-sample.json-W1 @@ -0,0 +1,316 @@ +{ + "bridge":{ + "name":"Homebridge", + "username":"CD:22:3D:E3:CE:30", + "port":51826, + "pin":"031-45-154" + }, + "description":"Homebridge", + "accessories":[ + + ], + "platforms":[ + { + "platform":"BroadlinkRM", + "name":"Broadlink RM", + "hideScanFrequencyButton": false, + "hideLearnButton": false, + "hideWelcomeMessage": false, + "accessories":[ + { + "name":"Auto-off Switch", + "type":"switch", + "enableAutoOff": true, + "onDuration": 5, + "data":{ + "on":"2600500000012...", + "off":"2600500000012..." + } + }, + { + "name":"TV On/Off", + "type":"switch", + "data":{ + "on":"2600500000012...", + "off":"2600500000012..." + } + }, + { + "name":"Channel Up", + "type":"switch", + "data":"CHANNEL_UP_HEX...", + "enableAutoOff": true, + "onDuration": 1 + }, + { + "name":"Channel Down", + "type":"switch", + "enableAutoOff": true, + "onDuration": 1, + "data":"CHANNEL_DOWN_HEX..." + }, + { + "name":"Volume Up", + "type":"switch", + "enableAutoOff": true, + "onDuration": 2.5, + "data": [ + { + "data": "VOLUME_UP_HEX...", + "sendCount": 5, + "interval": 0.3 + } + ] + }, + { + "name":"Volume Down", + "type":"switch", + "enableAutoOff": true, + "onDuration": 2.5, + "data": [ + { + "data": "VOLUME_DOWN_HEX...", + "sendCount": 5, + "interval": 0.3 + } + ] + }, + { + "name":"Entertainment", + "type":"switch", + "enableAutoOff": true, + "onDuration": 1.5, + "data":[ + { + "data": "HEX_1...", + "pause": 0.3 + }, + { + "data": "HEX_2...", + "pause": 0.3 + }, + { + "data": "HEX_3...", + "pause": 0.3 + } + ] + }, + { + "name":"Entertainment 2", + "type":"switch", + "data": [ + { + "data": "2600500000012...", + "sendCount": 2, + "interval": 0.3, + "pause": 2 + }, + { + "data": "2600500000012...", + "sendCount": 2, + "interval": 5 + } + ] + }, + { + "name":"Entertainment 3", + "type":"switch", + "data": { + "on": [ + { + "data": "ON_HEX_1...", + "pause": 0.3 + }, + { + "data": "ON_HEX_2...", + "sendCount": 2, + "interval": 0.1, + "pause": 0.3 + } + ], + "off": [ + { + "data": "OFF_HEX_1...", + "pause": 0.3 + }, + { + "data": "OF_HEX_2...", + "sendCount": 2, + "interval": 0.1, + "pause": 0.3 + } + ] + } + }, + { + "name":"Light", + "type":"light", + "defaultBrightness": 70, + "useLastKnownBrightness": true, + "enableAutoOff": true, + "onDuration": 10, + "data":{ + "off":"2600500000012...", + "brightness10": "2600500000012...", + "brightness20": "2600500000012...", + "brightness30": "2600500000012...", + "brightness40": "2600500000012...", + "brightness50": "2600500000012...", + "brightness60": "2600500000012...", + "brightness70": "2600500000012...", + "brightness80": "2600500000012...", + "brightness90": "2600500000012...", + "brightness100": "2600500000012...", + "hue0": "2600500000012...", + "hue99": "2600500000012...", + "hue199": "2600500000012...", + "hue299": "2600500000012...", + "hue359": "2600500000012..." + } + }, + { + "name":"Air Conditioner", + "type":"air-conditioner", + "ignoreTemperatureWhenOff": true, + "temperatureUpdateFrequency": 10, + "w1DeviceID":"26-0321544e531ff", + "turnOnWhenOff": false, + "allowResend": true, + "preventResendHex": true, + "defaultCoolTemperature": 21, + "defaultHeatTemperature": 23, + "data":{ + "off":"2600500000012...", + "temperature30":{ + "pseudo-mode":"heat", + "data":"2600500000012..." + }, + "temperature16":{ + "pseudo-mode":"cool", + "data":"2600500000012..." + } + } + }, + { + "name":"Air Conditioner Advanced", + "type":"air-conditioner", + "temperatureFilePath": "/var/tmp/inside.txt", + "autoCoolTemperature": 23, + "autoHeatTemperature": 14, + "autoSwitch": "A/C Auto Switch", + "data":{ + "off":"2600500000012...", + "heat30":{ + "data":"2600500000012..." + }, + "auto22":{ + "data":"2600500000012..." + }, + "cool16":{ + "data":"2600500000012..." + } + } + }, + { + "name":"A/C Auto Switch", + "type":"switch" + }, + { + "name": "Fan", + "type": "fan", + "data": { + "on":"2600500000012...", + "off":"2600500000012...", + "swingToggle": "2600500000012...", + "fanSpeed10": "2600500000012...", + "fanSpeed20": "2600500000012...", + "fanSpeed30": "2600500000012...", + "fanSpeed40": "2600500000012...", + "fanSpeed50": "2600500000012...", + "fanSpeed60": "2600500000012...", + "fanSpeed70": "2600500000012...", + "fanSpeed80": "2600500000012...", + "fanSpeed90": "2600500000012...", + "fanSpeed100": "2600500000012..." + } + }, + { + "name":"Garage Door", + "type":"garage-door-opener", + "openCloseDuration":8, + "data":{ + "open":"2600500000012...", + "close":"2600500000012...", + "lock":"2600500000012...", + "unlock":"2600500000012..." + } + }, + { + "name":"Blind", + "type":"window-covering", + "totalDurationOpen": 45, + "totalDurationClose": 40, + "data":{ + "open":"2600500000012...", + "close":"2600500000012...", + "stop":"2600500000012..." + } + }, + { + "name":"Blind Multi", + "type":"window-covering", + "totalDurationOpen": 5, + "totalDurationClose": 2, + "data":{ + "open":"OPEN_HEX...", + "close":[ + { + "data": "CLOSE_HEX_1...", + "sendCount": 2, + "interval": 0.3, + "pause": 0.3 + }, + { + "data": "CLOSE_HEX_2..." + } + ], + "stop":"STOP_HEX..." + } + }, + { + "name":"TV", + "type":"tv", + "data": { + "off": "HEX...", + "on": "HEX...", + "remote": { + "select": "HEX...", + "arrowUp": "HEX...", + "arrowDown": "HEX...", + "arrowLeft": "HEX...", + "arrowRight": "HEX...", + "back": "HEX...", + "exit": "HEX...", + "playPause": "HEX...", + "info": "HEX..." + }, + "powerMode": { + "show": "HEX..." + }, + "volume": { + "up": "HEX...", + "down": "HEX..." + }, + "inputs": [ + { + "name": "INPUT 1", + "type": "hdmi", + "data": "HEX..." + } + ] + } + } + ] + } + ] +} From 09d8c7ceda7fa5243d5d73330a76c13c32084fea Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 14:23:13 +1200 Subject: [PATCH 071/152] W1 temperature fix Corrected temperature conversion, add error log for missing w! device --- accessories/aircon.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 5e7b1671..7ad8cd76 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -493,7 +493,10 @@ class AirConAccessory extends BroadlinkRMAccessory { while (tEnd='0' && fData[tEnd]<='9') { tEnd++; } - var temperature = fData.substring(tBeg, tEnd); + var temperature = parseFloat(fData.substring(tBeg, tEnd))/1000.0; + } else{ + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nDevice at ${fName} not found`); + return } if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 (parsed temperature: ${temperature})`); From 28ae5183940f66a438a928ae5ff36171ce357b70 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 14:28:34 +1200 Subject: [PATCH 072/152] w1 Device Support Fixed syntax error from duplicated code --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 7ad8cd76..6f7f21c6 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -503,7 +503,7 @@ class AirConAccessory extends BroadlinkRMAccessory { //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate this.onTemperature(temperature); - }); + } } processQueuedTemperatureCallbacks (temperature) { From 8de635d1db26d19a7209efbc57d4a2009ffd4964 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 14:33:35 +1200 Subject: [PATCH 073/152] Added W1 information --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 51046bb9..021e9846 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderB } } ``` +2. Added support for Raspberry Pi Wire-1 thermometers (i.e. ds18b20). You can find your devices ID using the command `ls /sys/bus/w1/devices`. Then update your air-conditioner config to include (using the device ID): +``` +"w1DeviceID":"28-0321544e531ff", +``` If you want to use this fork, use this command: From 70aef39057ae470ff80d97c151b005a1ca03426f Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 14:40:18 +1200 Subject: [PATCH 074/152] W1 Error Handling --- accessories/aircon.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 6f7f21c6..9e7759da 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -485,7 +485,12 @@ class AirConAccessory extends BroadlinkRMAccessory { if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 reading file: ${fName}`); if (fs.existsSync(fName)) { - var fData = fs.readFileSync(fName, fsOptions).trim(); + try{ + var fData = fs.readFileSync(fName, fsOptions).trim(); + } catch (err) { + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); + return + } // Extract the numeric part var tBeg = fData.indexOf("t=")+2; if (tBeg >= 0) { From 0a99441ebb0020c4805db65dd2153efafb2735c2 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 15:01:19 +1200 Subject: [PATCH 075/152] Improved Error handling in W1 --- accessories/aircon.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 9e7759da..bbf2d086 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -488,8 +488,10 @@ class AirConAccessory extends BroadlinkRMAccessory { try{ var fData = fs.readFileSync(fName, fsOptions).trim(); } catch (err) { - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); - return + if (err != EINTR){ + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); + return + } } // Extract the numeric part var tBeg = fData.indexOf("t=")+2; From 68a8f1cff27b2547021a7f2177a61639d6630726 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 20:07:18 +1200 Subject: [PATCH 076/152] Reduce error logging from w1 --- accessories/aircon.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index bbf2d086..0bc019be 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -488,11 +488,10 @@ class AirConAccessory extends BroadlinkRMAccessory { try{ var fData = fs.readFileSync(fName, fsOptions).trim(); } catch (err) { - if (err != EINTR){ - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); - return - } + if (debug) log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); + return } + // Extract the numeric part var tBeg = fData.indexOf("t=")+2; if (tBeg >= 0) { @@ -500,14 +499,13 @@ class AirConAccessory extends BroadlinkRMAccessory { while (tEnd='0' && fData[tEnd]<='9') { tEnd++; } - var temperature = parseFloat(fData.substring(tBeg, tEnd))/1000.0; + var temperature = Math.round(parseFloat(fData.substring(tBeg, tEnd))/1000.0); } else{ log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nDevice at ${fName} not found`); return } - + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 (parsed temperature: ${temperature})`); - //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate this.onTemperature(temperature); } From 3df25fc0277955aa67cad3d19eaf517957ca359b Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 20:14:03 +1200 Subject: [PATCH 077/152] Fixed rounding error --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 0bc019be..3647f955 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -499,7 +499,7 @@ class AirConAccessory extends BroadlinkRMAccessory { while (tEnd='0' && fData[tEnd]<='9') { tEnd++; } - var temperature = Math.round(parseFloat(fData.substring(tBeg, tEnd))/1000.0); + var temperature = Math.round(parseFloat(fData.substring(tBeg, tEnd))/1000.0,1); } else{ log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nDevice at ${fName} not found`); return From 150ac3bf6462fb14edcfc01f09549297879ebee3 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 20:20:05 +1200 Subject: [PATCH 078/152] Removed rounding - failed --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 3647f955..d0424dc0 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -499,7 +499,7 @@ class AirConAccessory extends BroadlinkRMAccessory { while (tEnd='0' && fData[tEnd]<='9') { tEnd++; } - var temperature = Math.round(parseFloat(fData.substring(tBeg, tEnd))/1000.0,1); + var temperature = fData.substring(tBeg, tEnd)/1000.0; } else{ log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nDevice at ${fName} not found`); return From 830fb681c2dfa796920f21c4053fa60087c84a05 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 20:30:47 +1200 Subject: [PATCH 079/152] w1Device fixed frequent updates Temperature refresh designed for Broadlink devices, disabled for w1 too --- accessories/aircon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index d0424dc0..c389258e 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -332,9 +332,10 @@ class AirConAccessory extends BroadlinkRMAccessory { async monitorTemperature () { const { config, host, log, name, state } = this; - const { temperatureFilePath, pseudoDeviceTemperature } = config; + const { temperatureFilePath, pseudoDeviceTemperature, w1DeviceID } = config; if (temperatureFilePath) return; + if (w1DeviceID) return; if (pseudoDeviceTemperature !== undefined) return; const device = getDevice({ host, log }); From 5571d0144685b6b43303aaea922586b20e85ee13 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 21:38:58 +1200 Subject: [PATCH 080/152] Added return 0 on w1 readerror --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index c389258e..49b9b09b 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -490,7 +490,7 @@ class AirConAccessory extends BroadlinkRMAccessory { var fData = fs.readFileSync(fName, fsOptions).trim(); } catch (err) { if (debug) log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); - return + fData = "t=0000"; } // Extract the numeric part From 584ce0d43bf0f52feff47c20f6f2ca8add2e13b5 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 20 Sep 2019 21:41:32 +1200 Subject: [PATCH 081/152] Added logging on w1 read error --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 49b9b09b..db1495c2 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -489,7 +489,7 @@ class AirConAccessory extends BroadlinkRMAccessory { try{ var fData = fs.readFileSync(fName, fsOptions).trim(); } catch (err) { - if (debug) log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nError reading from ${fName} ${err}`); + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1 - Error reading from ${fName} ${err}`); fData = "t=0000"; } From 4a7980241b06df5f5081978d225185896eaec560 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Sat, 21 Sep 2019 20:17:27 +1200 Subject: [PATCH 082/152] Improved w1 Error Handling --- accessories/aircon.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index db1495c2..54a8226c 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -489,10 +489,17 @@ class AirConAccessory extends BroadlinkRMAccessory { try{ var fData = fs.readFileSync(fName, fsOptions).trim(); } catch (err) { - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1 - Error reading from ${fName} ${err}`); - fData = "t=0000"; + log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromW1 - Error reading from ${fName} ${err}\nRetrying`); + delayForDuration(1).then(() => { + try{ + fData = fs.readFileSync(fName, 'utf8'); + } catch (err) { + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1 - Error reading from ${fName} ${err}`); + fData = "t=0000"; + } + }); } - + if (!fData) fData = "t=0000"; // Extract the numeric part var tBeg = fData.indexOf("t=")+2; if (tBeg >= 0) { From 56b0432f133e96c7edaa695b31aedb2095ffc453 Mon Sep 17 00:00:00 2001 From: Riley Evans Date: Sat, 21 Sep 2019 15:44:58 +0100 Subject: [PATCH 083/152] Add support for pingGrace parameter --- accessories/switch.js | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/accessories/switch.js b/accessories/switch.js index d65bfbbd..a729850d 100644 --- a/accessories/switch.js +++ b/accessories/switch.js @@ -10,11 +10,13 @@ class SwitchAccessory extends BroadlinkRMAccessory { super(log, config, serviceManagerType); if (!config.isUnitTest) this.checkPing(ping) + } setDefaults () { const { config } = this; config.pingFrequency = config.pingFrequency || 1; + config.pingGrace = config.pingGrace || 10; config.offDuration = config.offDuration || 60; config.onDuration = config.onDuration || 60; @@ -35,6 +37,8 @@ class SwitchAccessory extends BroadlinkRMAccessory { reset () { super.reset(); + this.stateChangeInProgress = true; + // Clear Timeouts if (this.delayTimeoutPromise) { this.delayTimeoutPromise.cancel(); @@ -50,12 +54,19 @@ class SwitchAccessory extends BroadlinkRMAccessory { this.autoOnTimeoutPromise.cancel(); this.autoOnTimeoutPromise = null } + + if (this.pingGraceTimeout) { + this.pingGraceTimeout.cancel(); + this.pingGraceTimeout = null; + } } checkAutoOnOff () { this.reset(); + this.checkPingGrace(); this.checkAutoOn(); this.checkAutoOff(); + } checkPing (ping) { @@ -71,6 +82,10 @@ class SwitchAccessory extends BroadlinkRMAccessory { pingCallback (active) { const { config, state, serviceManager } = this; + if (this.stateChangeInProgress){ + return; + } + if (config.pingIPAddressStateOnly) { state.switchState = active ? true : false; serviceManager.refreshCharacteristicUI(Characteristic.On); @@ -84,14 +99,30 @@ class SwitchAccessory extends BroadlinkRMAccessory { async setSwitchState (hexData) { const { data, host, log, name, debug } = this; - + this.stateChangeInProgress = true; this.reset(); if (hexData) await this.performSend(hexData); - + this.checkAutoOnOff(); } + async checkPingGrace () { + await catchDelayCancelError(async () => { + const { config, log, name, state, serviceManager } = this; + + let { pingGrace } = config; + + if (pingGrace) { + + this.pingGraceTimeoutPromise = delayForDuration(pingGrace); + await this.pingGraceTimeoutPromise; + + this.stateChangeInProgress = false; + } + }); + } + async checkAutoOff () { await catchDelayCancelError(async () => { const { config, log, name, state, serviceManager } = this; @@ -145,4 +176,4 @@ class SwitchAccessory extends BroadlinkRMAccessory { } } -module.exports = SwitchAccessory; \ No newline at end of file +module.exports = SwitchAccessory; From 2e3b52d70c99c6a08ec6a02dd1640a587b8b6817 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 09:14:34 +1200 Subject: [PATCH 084/152] Improved W1 and File reliability Forced 5 minute updates and will reuse previous value on error --- accessories/aircon.js | 190 +++++++++++++++++++----------------------- 1 file changed, 85 insertions(+), 105 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 54a8226c..d52eef17 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -11,7 +11,7 @@ const BroadlinkRMAccessory = require('./accessory'); class AirConAccessory extends BroadlinkRMAccessory { - constructor (log, config = {}, serviceManagerType) { + constructor (log, config = {}, serviceManagerType) { super(log, config, serviceManagerType); // Characteristic isn't defined until runtime so we set these the instance scope @@ -22,7 +22,7 @@ class AirConAccessory extends BroadlinkRMAccessory { auto: Characteristic.TargetHeatingCoolingState.AUTO }; this.HeatingCoolingStates = HeatingCoolingStates; - + const HeatingCoolingConfigKeys = {}; HeatingCoolingConfigKeys[Characteristic.TargetHeatingCoolingState.OFF] = 'off'; HeatingCoolingConfigKeys[Characteristic.TargetHeatingCoolingState.COOL] = 'cool'; @@ -73,12 +73,12 @@ class AirConAccessory extends BroadlinkRMAccessory { config.heatTemperature = config.heatTemperature || 22; - // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified - if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { - log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - config.replaceAutoMode = config.replaceAutoMode || 'cool'; - } - + // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified + if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { + log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); + config.replaceAutoMode = config.replaceAutoMode || 'cool'; + } + // Set state default values // state.targetTemperature = state.targetTemperature || config.minTemperature; state.currentHeatingCoolingState = state.currentHeatingCoolingState || Characteristic.CurrentHeatingCoolingState.OFF; @@ -93,14 +93,14 @@ class AirConAccessory extends BroadlinkRMAccessory { // minTemperature can't be more than 10 or HomeKit throws a fit assert.isBelow(config.minTemperature, 11, `\x1b[31m[CONFIG ERROR] \x1b[33mminTemperature\x1b[0m (${config.minTemperature}) must be <= 10`) - + // maxTemperature > minTemperature assert.isBelow(config.minTemperature, config.maxTemperature, `\x1b[31m[CONFIG ERROR] \x1b[33mmaxTemperature\x1b[0m (${config.minTemperature}) must be more than minTemperature (${config.minTemperature})`) } reset () { super.reset(); - + this.state.isRunningAutomatically = false; if (this.shouldIgnoreAutoOnOffPromise) { @@ -132,8 +132,8 @@ class AirConAccessory extends BroadlinkRMAccessory { }); } - - // Allows this accessory to know about switch accessories that can determine whether + + // Allows this accessory to know about switch accessories that can determine whether // auto-on/off should be permitted. updateAccessories (accessories) { const { config, name, log } = this; @@ -154,7 +154,7 @@ class AirConAccessory extends BroadlinkRMAccessory { return (!this.autoSwitchAccessory || (this.autoSwitchAccessory && this.autoSwitchAccessory.state && this.autoSwitchAccessory.state.switchState)); } - setTargetTemperature (hexData, previousValue) { + setTargetTemperature (hexData, previousValue) { const { config, log, name, state } = this; const { preventResendHex, minTemperature, maxTemperature } = config; @@ -166,14 +166,14 @@ class AirConAccessory extends BroadlinkRMAccessory { if (state.targetTemperature > maxTemperature) return log(`The target temperature (${this.targetTemperature}) must be less than the maxTemperature (${maxTemperature})`); // Used within correctReloadedState() so that when re-launching the accessory it uses - // this temperature rather than one automatically set. + // this temperature rather than one automatically set. state.userSpecifiedTargetTemperature = state.targetTemperature; // Do the actual sending of the temperature this.sendTemperature(state.targetTemperature, previousValue); } - async setTargetHeatingCoolingState (hexData, previousValue) { + async setTargetHeatingCoolingState (hexData, previousValue) { const { HeatingCoolingConfigKeys, HeatingCoolingStates, config, data, host, log, name, serviceManager, state, debug } = this; const { preventResendHex, defaultCoolTemperature, defaultHeatTemperature, replaceAutoMode } = config; @@ -198,7 +198,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (replaceAutoMode && targetHeatingCoolingState === 'auto') { log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; + if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; this.updateServiceTargetHeatingCoolingState(HeatingCoolingStates[replaceAutoMode]); @@ -216,8 +216,8 @@ class AirConAccessory extends BroadlinkRMAccessory { temperature = state.targetTemperature; } - if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; - + if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; + serviceManager.setCharacteristic(Characteristic.TargetTemperature, temperature); } @@ -233,16 +233,16 @@ class AirConAccessory extends BroadlinkRMAccessory { this.turnOnWhenOffDelayPromise = delayForDuration(.3); await this.turnOnWhenOffDelayPromise } - + // Ignore Temperature if off - and set to ignore if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); - + return; } - - const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; - + + const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); state.targetTemperature = finalTemperature; @@ -266,11 +266,11 @@ class AirConAccessory extends BroadlinkRMAccessory { } // Update the heating/cooling mode based on the pseudo-mode - if pressent. - if (hexData['pseudo-mode']){ - let mode = hexData['pseudo-mode']; - if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); - } - + if (hexData['pseudo-mode']){ + let mode = hexData['pseudo-mode']; + if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); + } + this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); state.targetHeatingCoolingState = HeatingCoolingStates[mode]; @@ -285,16 +285,16 @@ class AirConAccessory extends BroadlinkRMAccessory { let finalTemperature = temperature; let hexData = data[`${mode}${temperature}`]; - - if (!hexData) { - // Mode based code not found, try mode-less - this.log(`${name} No ${mode} HEX code found for ${temperature}`); - let hexData = data[`temperature${temperature}`]; - } else { - if (hexData['pseudo-mode']) { - this.log(`${name} WARNING: Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); - } - } + + if (!hexData) { + // Mode based code not found, try mode-less + this.log(`${name} No ${mode} HEX code found for ${temperature}`); + let hexData = data[`temperature${temperature}`]; + } else { + if (hexData['pseudo-mode']) { + this.log(`${name} WARNING: Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); + } + } // You may not want to set the hex data for every single mode... if (!hexData) { @@ -302,10 +302,10 @@ class AirConAccessory extends BroadlinkRMAccessory { hexData = data[`temperature${defaultTemperature}`]; assert(hexData, `\x1b[31m[CONFIG ERROR] \x1b[0m You need to provide a hex code for the following temperature: - \x1b[33m{ "temperature${temperature}": { "data": "HEXCODE", "pseudo-mode" : "heat/cool" } }\x1b[0m + \x1b[33m{ "temperature${temperature}": { "data": "HEXCODE", "pseudo-mode" : "heat/cool" } }\x1b[0m or provide the default temperature: \x1b[33m { "temperature${defaultTemperature}": { "data": "HEXCODE", "pseudo-mode" : "heat/cool" } }\x1b[0m`); - + this.log(`${name} Update to default temperature (${defaultTemperature})`); finalTemperature = defaultTemperature; } @@ -316,12 +316,12 @@ class AirConAccessory extends BroadlinkRMAccessory { async checkTurnOnWhenOff () { const { config, data, debug, host, log, name, state } = this; const { on } = data; - + if (state.currentHeatingCoolingState === Characteristic.TargetHeatingCoolingState.OFF && config.turnOnWhenOff) { log(`${name} sendTemperature (sending "on" hex before sending temperature)`); if (on) await this.performSend(on); - + return true; } @@ -329,15 +329,16 @@ class AirConAccessory extends BroadlinkRMAccessory { } // Device Temperature Methods - + async monitorTemperature () { const { config, host, log, name, state } = this; const { temperatureFilePath, pseudoDeviceTemperature, w1DeviceID } = config; - if (temperatureFilePath) return; - if (w1DeviceID) return; if (pseudoDeviceTemperature !== undefined) return; + //Force w1 and file devices to a 5 minute refresh + if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 300; + const device = getDevice({ host, log }); // Try again in a second if we don't have a device yet @@ -363,11 +364,11 @@ class AirConAccessory extends BroadlinkRMAccessory { const { minTemperature, maxTemperature, temperatureAdjustment } = config; // onTemperature is getting called twice. No known cause currently. - // This helps prevent the same temperature from being processed twice + // This helps prevent the same temperature from being processed twice if (Object.keys(this.temperatureCallbackQueue).length === 0) return; temperature += temperatureAdjustment - + state.currentTemperature = temperature; log(`${name} onTemperature (${temperature})`); @@ -381,9 +382,9 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`\x1b[35m[INFO]\x1b[0m Reported temperature (${temperature}) is too low, setting to \x1b[33mminTemperature\x1b[0m (${minTemperature}).`) temperature = config.minTemperature - + } - + assert.isBelow(temperature, config.maxTemperature + 1, `\x1b[31m[CONFIG ERROR] \x1b[33mmaxTemperature\x1b[0m (${config.maxTemperature}) must be more than the reported temperature (${temperature})`) assert.isAbove(temperature, config.minTemperature - 1, `\x1b[31m[CONFIG ERROR] \x1b[33mminTemperature\x1b[0m (${config.maxTemperature}) must be less than the reported temperature (${temperature})`) @@ -393,12 +394,12 @@ class AirConAccessory extends BroadlinkRMAccessory { addTemperatureCallbackToQueue (callback) { const { config, host, log, name, state } = this; const { mqttURL, temperatureFilePath, w1DeviceID } = config; - + // Clear the previous callback if (Object.keys(this.temperatureCallbackQueue).length > 1) { if (state.currentTemperature) { log(`${name} addTemperatureCallbackToQueue (clearing previous callback, using existing temperature)`); - + this.processQueuedTemperatureCallbacks(state.currentTemperature); } } @@ -413,7 +414,7 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - + // Read temperature from W1 Device if (w1DeviceID) { this.updateTemperatureFromW1(); @@ -430,7 +431,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } // Read temperature from Broadlink RM device - // If the device is no longer available, use previous tempeature + // If the device is no longer available, use previous tempeature const device = getDevice({ host, log }); if (!device || device.state === 'inactive') { @@ -448,83 +449,62 @@ class AirConAccessory extends BroadlinkRMAccessory { } updateTemperatureFromFile () { - const { config, debug, host, log, name } = this; + const { config, debug, host, log, name, state } = this; const { temperatureFilePath } = config; if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile reading file: ${temperatureFilePath}`); fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { - if (err) { log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromFile\n\n${err.message}`); - - return; } if (temperature === undefined || temperature.trim().length === 0) { - log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromFile (no temperature found in: ${temperature.trim()})`); - - // Occasional errors cause Home to hang "updating" retry - temperature = "0.0"; + log(`\x1b[33m[WARNING]\x1b[0m ${name} updateTemperatureFromFile error reading file: ${temperatureFilePath}, using previous Temperature`); + temperature = (state.currentTemperature || 0); } temperature = parseFloat(temperature); if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); - - //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate + this.onTemperature(temperature); }); } updateTemperatureFromW1 () { - const { config, debug, host, log, name } = this; + const { config, debug, host, log, name, state } = this; const { w1DeviceID } = config; + var W1PATH = "/sys/bus/w1/devices"; - var fsOptions = { "encoding":"utf8", "flag":"r" }; var fName = W1PATH + "/" + w1DeviceID + "/w1_slave"; - + var temperature; + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 reading file: ${fName}`); - if (fs.existsSync(fName)) { - try{ - var fData = fs.readFileSync(fName, fsOptions).trim(); - } catch (err) { - log(`\x1b[31m[WARNING] \x1b[0m${name} updateTemperatureFromW1 - Error reading from ${fName} ${err}\nRetrying`); - delayForDuration(1).then(() => { - try{ - fData = fs.readFileSync(fName, 'utf8'); - } catch (err) { - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1 - Error reading from ${fName} ${err}`); - fData = "t=0000"; - } - }); + fs.readFile(fName, 'utf8', (err, data) => { + if (err) { + log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\n${err.message}`); } - if (!fData) fData = "t=0000"; - // Extract the numeric part - var tBeg = fData.indexOf("t=")+2; - if (tBeg >= 0) { - var tEnd = tBeg+1; - while (tEnd='0' && fData[tEnd]<='9') { - tEnd++; - } - var temperature = fData.substring(tBeg, tEnd)/1000.0; - } else{ - log(`\x1b[31m[ERROR] \x1b[0m${name} updateTemperatureFromW1\n\nDevice at ${fName} not found`); - return + + if(data.includes("t=")){ + var matches = data.match(/t=([0-9]+)/); + temperature = parseInt(matches[1]) / 1000; + }else{ + log(`\x1b[33m[WARNING]\x1b[0m ${name} updateTemperatureFromW1 error reading file: ${fName}, using previous Temperature`); + temperature = (state.currentTemperature || 0); } - + if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 (parsed temperature: ${temperature})`); - //Currently integer rounding occurs, so 22.9 is reported as 22. Round here to make the rounding accurate this.onTemperature(temperature); - } + }); } - + processQueuedTemperatureCallbacks (temperature) { if (Object.keys(this.temperatureCallbackQueue).length === 0) return; Object.keys(this.temperatureCallbackQueue).forEach((callbackIdentifier) => { const callback = this.temperatureCallbackQueue[callbackIdentifier]; - + callback(null, temperature); delete this.temperatureCallbackQueue[callbackIdentifier]; }) @@ -540,7 +520,7 @@ class AirConAccessory extends BroadlinkRMAccessory { serviceManager.refreshCharacteristicUI(Characteristic.CurrentTemperature) } - getCurrentTemperature (callback) { + getCurrentTemperature (callback) { const { config, host, log, name, state } = this; const { pseudoDeviceTemperature } = config; @@ -552,7 +532,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } this.addTemperatureCallbackToQueue(callback); - } + } async checkTemperatureForAutoOnOff (temperature) { const { config, host, log, name, serviceManager, state } = this; @@ -608,21 +588,21 @@ class AirConAccessory extends BroadlinkRMAccessory { const { config } = this; const temperatureDisplayUnits = (config.units.toLowerCase() === 'f') ? Characteristic.TemperatureDisplayUnits.FAHRENHEIT : Characteristic.TemperatureDisplayUnits.CELSIUS; - + callback(temperatureDisplayUnits); } - + // MQTT onMQTTMessage (identifier, message) { const { debug, log, name } = this; if (identifier !== 'unknown' && identifier !== 'temperature') { log(`\x1b[31m[ERROR] \x1b[0m${name} onMQTTMessage (mqtt message received with unexpected identifier: ${identifier}, ${message.toString()})`); - + return; } - super.onMQTTMessage(identifier, message); + super.onMQTTMessage(identifier, message); let temperature = this.mqttValuesTemp[identifier]; @@ -647,7 +627,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (temperature === undefined || (typeof temperature === 'string' && temperature.trim().length === 0)) { log(`\x1b[31m[ERROR] \x1b[0m${name} onMQTTMessage (mqtt temperature temperature not found)`); - + return; } @@ -656,13 +636,13 @@ class AirConAccessory extends BroadlinkRMAccessory { temperature = parseFloat(temperature); if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} onMQTTMessage (parsed temperature: ${temperature})`); - + this.mqttValues[identifier] = temperature; this.updateTemperatureUI(); } - + // Service Manager Setup setupServiceManager () { From aa9375ca9b63c689bed43377a122a65913f3ce91 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 09:41:58 +1200 Subject: [PATCH 085/152] Update tv.js Added pingGrace support for TVs --- accessories/tv.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/accessories/tv.js b/accessories/tv.js index 4818dca2..9cc56e94 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -14,6 +14,7 @@ class TVAccessory extends BroadlinkRMAccessory { setDefaults() { const { config } = this; config.pingFrequency = config.pingFrequency || 1; + config.pingGrace = config.pingGrace || 10; config.offDuration = config.offDuration || 60; config.onDuration = config.onDuration || 60; @@ -40,6 +41,8 @@ class TVAccessory extends BroadlinkRMAccessory { reset() { super.reset(); + this.stateChangeInProgress = true; + // Clear Timeouts if (this.delayTimeoutPromise) { this.delayTimeoutPromise.cancel(); @@ -56,9 +59,15 @@ class TVAccessory extends BroadlinkRMAccessory { this.autoOnTimeoutPromise = null; } } - + + if (this.pingGraceTimeout) { + this.pingGraceTimeout.cancel(); + this.pingGraceTimeout = null; + } + checkAutoOnOff() { this.reset(); + this.checkPingGrace(); this.checkAutoOn(); this.checkAutoOff(); } @@ -75,6 +84,10 @@ class TVAccessory extends BroadlinkRMAccessory { pingCallback(active) { const { config, state, serviceManager } = this; + + if (this.stateChangeInProgress){ + return; + } if (config.pingIPAddressStateOnly) { state.switchState = active ? true : false; @@ -90,13 +103,30 @@ class TVAccessory extends BroadlinkRMAccessory { async setSwitchState(hexData) { const { data, host, log, name, debug } = this; + this.stateChangeInProgress = true; this.reset(); if (hexData) await this.performSend(hexData); this.checkAutoOnOff(); } + + async checkPingGrace () { + await catchDelayCancelError(async () => { + const { config, log, name, state, serviceManager } = this; + + let { pingGrace } = config; + if (pingGrace) { + + this.pingGraceTimeoutPromise = delayForDuration(pingGrace); + await this.pingGraceTimeoutPromise; + + this.stateChangeInProgress = false; + } + }); + } + async checkAutoOff() { await catchDelayCancelError(async () => { const { config, log, name, state, serviceManager } = this; From 55b0b331d95ceac0f39e0395155679d55d38880e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 09:49:48 +1200 Subject: [PATCH 086/152] Update tv.js --- accessories/tv.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/tv.js b/accessories/tv.js index 9cc56e94..51e98db9 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -58,11 +58,11 @@ class TVAccessory extends BroadlinkRMAccessory { this.autoOnTimeoutPromise.cancel(); this.autoOnTimeoutPromise = null; } - } - if (this.pingGraceTimeout) { + if (this.pingGraceTimeout) { this.pingGraceTimeout.cancel(); this.pingGraceTimeout = null; + } } checkAutoOnOff() { From 8e9a84698b1c66a123a041974f07b54eb00227c9 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 11:49:16 +1200 Subject: [PATCH 087/152] Update package.json Cleaned up name/version for easier merge --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5243ba5d..e3706daa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.3", + "name": "homebridge-broadlink-rm", + "version": "3.5.8", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 286dc1583217ac5072648dde37479c78f2cc47e2 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 11:56:03 +1200 Subject: [PATCH 088/152] Update package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5243ba5d..19d65c15 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.3", + "name": "homebridge-broadlink-rm-tv", + "version": "3.5.8", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 52eaff0bae44ca321e4be58d7ef2457dc0e717aa Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 12:08:54 +1200 Subject: [PATCH 089/152] Update package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e3706daa..5243ba5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm", - "version": "3.5.8", + "name": "homebridge-broadlink-rm-acfile", + "version": "1.2.3", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From c5f2a79d7cf7b381038e9b63f97e9e36092dc7bf Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 12:09:14 +1200 Subject: [PATCH 090/152] Update package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 19d65c15..5243ba5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm-tv", - "version": "3.5.8", + "name": "homebridge-broadlink-rm-acfile", + "version": "1.2.3", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From c313740a26abc70f1bed32dc15ee73f76cd91184 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 12:14:54 +1200 Subject: [PATCH 091/152] Version increase for pingGrace support changes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5243ba5d..ae8a8d74 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.3", + "version": "1.2.4", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From c5ccf4b88878f9966f202c74c1c4f96f90899bfb Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 23 Sep 2019 15:20:29 +1200 Subject: [PATCH 092/152] Update aircon.js Added consistent log colouring based on level --- accessories/aircon.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index d52eef17..5efeae06 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -73,11 +73,11 @@ class AirConAccessory extends BroadlinkRMAccessory { config.heatTemperature = config.heatTemperature || 22; - // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified - if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { - log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - config.replaceAutoMode = config.replaceAutoMode || 'cool'; - } + // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified + if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { + log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); + config.replaceAutoMode = config.replaceAutoMode || 'cool'; + } // Set state default values // state.targetTemperature = state.targetTemperature || config.minTemperature; @@ -241,7 +241,7 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); @@ -292,7 +292,7 @@ class AirConAccessory extends BroadlinkRMAccessory { let hexData = data[`temperature${temperature}`]; } else { if (hexData['pseudo-mode']) { - this.log(`${name} WARNING: Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); + this.log(`\x1b[36m[INFO] \x1b[0m${name} Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); } } @@ -374,13 +374,13 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`${name} onTemperature (${temperature})`); if (temperature > config.maxTemperature) { - log(`\x1b[35m[INFO]\x1b[0m Reported temperature (${temperature}) is too high, setting to \x1b[33mmaxTemperature\x1b[0m (${maxTemperature}).`) + log(`\x1b[36m[INFO]\x1b[0m Reported temperature (${temperature}) is too high, setting to \x1b[33mmaxTemperature\x1b[0m (${maxTemperature}).`) temperature = config.maxTemperature } if (temperature < config.minTemperature) { - log(`\x1b[35m[INFO]\x1b[0m Reported temperature (${temperature}) is too low, setting to \x1b[33mminTemperature\x1b[0m (${minTemperature}).`) + log(`\x1b[36m[INFO]\x1b[0m Reported temperature (${temperature}) is too low, setting to \x1b[33mminTemperature\x1b[0m (${minTemperature}).`) temperature = config.minTemperature } @@ -452,7 +452,7 @@ class AirConAccessory extends BroadlinkRMAccessory { const { config, debug, host, log, name, state } = this; const { temperatureFilePath } = config; - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile reading file: ${temperatureFilePath}`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile reading file: ${temperatureFilePath}`); fs.readFile(temperatureFilePath, 'utf8', (err, temperature) => { if (err) { @@ -465,7 +465,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } temperature = parseFloat(temperature); - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} updateTemperatureFromFile (parsed temperature: ${temperature})`); this.onTemperature(temperature); }); @@ -479,7 +479,7 @@ class AirConAccessory extends BroadlinkRMAccessory { var fName = W1PATH + "/" + w1DeviceID + "/w1_slave"; var temperature; - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 reading file: ${fName}`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 reading file: ${fName}`); fs.readFile(fName, 'utf8', (err, data) => { if (err) { @@ -494,7 +494,7 @@ class AirConAccessory extends BroadlinkRMAccessory { temperature = (state.currentTemperature || 0); } - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 (parsed temperature: ${temperature})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} updateTemperatureFromW1 (parsed temperature: ${temperature})`); this.onTemperature(temperature); }); } @@ -606,7 +606,7 @@ class AirConAccessory extends BroadlinkRMAccessory { let temperature = this.mqttValuesTemp[identifier]; - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} onMQTTMessage (raw value: ${temperature})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} onMQTTMessage (raw value: ${temperature})`); try { const temperatureJSON = JSON.parse(temperature); @@ -631,11 +631,11 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} onMQTTMessage (raw value 2: ${temperature.trim()})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} onMQTTMessage (raw value 2: ${temperature.trim()})`); temperature = parseFloat(temperature); - if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} onMQTTMessage (parsed temperature: ${temperature})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} onMQTTMessage (parsed temperature: ${temperature})`); this.mqttValues[identifier] = temperature; this.updateTemperatureUI(); From 6b7c812746968861d9bc73bed10b2ae974d0feb7 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 24 Sep 2019 20:37:24 +1200 Subject: [PATCH 093/152] Mode overwrite Temperature Fix Changed the send order to send mode before the temperature so the default temp doesn't overwrite the set temperature --- accessories/aircon.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 5efeae06..21a71d02 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -254,29 +254,27 @@ class AirConAccessory extends BroadlinkRMAccessory { if (preventResendHex) return; } } - state.firstTemperatureUpdate = false; - // Send the temperature hex - this.log(`${name} sendingTemperature (${mode} - ${state.targetTemperature})`); - await this.performSend(hexData.data); - if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { return; } // Update the heating/cooling mode based on the pseudo-mode - if pressent. - if (hexData['pseudo-mode']){ - let mode = hexData['pseudo-mode']; - if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`); - } - - this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); + if (hexData['pseudo-mode']){ + let mode = hexData['pseudo-mode']; + if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) + } + //Set the mode state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); + + //Set the temperature + await this.performSend(hexData.data); + this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); } getTemperatureHexData (mode, temperature) { From 5b47622c37e959df6946d708a7b840e16f49ad7f Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 08:30:35 +1200 Subject: [PATCH 094/152] Code cleanup --- accessories/aircon.js | 74 ++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 21a71d02..3a97742c 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -154,7 +154,7 @@ class AirConAccessory extends BroadlinkRMAccessory { return (!this.autoSwitchAccessory || (this.autoSwitchAccessory && this.autoSwitchAccessory.state && this.autoSwitchAccessory.state.switchState)); } - setTargetTemperature (hexData, previousValue) { + setTargetTemperature (hexData, previousValue) { const { config, log, name, state } = this; const { preventResendHex, minTemperature, maxTemperature } = config; @@ -173,7 +173,7 @@ class AirConAccessory extends BroadlinkRMAccessory { this.sendTemperature(state.targetTemperature, previousValue); } - async setTargetHeatingCoolingState (hexData, previousValue) { + async setTargetHeatingCoolingState (hexData, previousValue) { const { HeatingCoolingConfigKeys, HeatingCoolingStates, config, data, host, log, name, serviceManager, state, debug } = this; const { preventResendHex, defaultCoolTemperature, defaultHeatTemperature, replaceAutoMode } = config; @@ -199,14 +199,12 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; - this.updateServiceTargetHeatingCoolingState(HeatingCoolingStates[replaceAutoMode]); return; } let temperature; - // Selecting a heating/cooling state allows a default temperature to be used for the given state. if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { temperature = defaultHeatTemperature; @@ -226,7 +224,7 @@ class AirConAccessory extends BroadlinkRMAccessory { const { HeatingCoolingConfigKeys, HeatingCoolingStates, config, data, host, log, name, state, debug } = this; const { preventResendHex, defaultCoolTemperature, heatTemperature, ignoreTemperatureWhenOff, sendTemperatureOnlyWhenOff } = config; - log(`${name} Potential sendTemperature (${temperature})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} Potential sendTemperature (${temperature})`); // If the air-conditioner is turned off then turn it on first and try this again if (this.checkTurnOnWhenOff()) { @@ -234,47 +232,45 @@ class AirConAccessory extends BroadlinkRMAccessory { await this.turnOnWhenOffDelayPromise } - // Ignore Temperature if off - and set to ignore + // Ignore Temperature if off, staying off - and set to ignore if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); - return; } const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; - const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); - state.targetTemperature = finalTemperature; + + // Update the heating/cooling mode based on the pseudo-mode - if pressent. + if (hexData['pseudo-mode']){ + let mode = hexData['pseudo-mode']; + if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) + } const hasTemperatureChanged = (previousTemperature !== finalTemperature); + const hasModeChanged = (state.currentHeatingCoolingState !== state.targetHeatingCoolingState || HeatingCoolingStates[mode] !== state.currentHeatingCoolingState) - if (!hasTemperatureChanged) { - if (!state.firstTemperatureUpdate && state.currentHeatingCoolingState !== Characteristic.TargetHeatingCoolingState.OFF) { - if (preventResendHex) return; - } - } - state.firstTemperatureUpdate = false; - + //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { - return; + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} sendTemperatureOnlyWhenOff - sending only Temperature`); + hasModeChanged = false; } - // Update the heating/cooling mode based on the pseudo-mode - if pressent. - if (hexData['pseudo-mode']){ - let mode = hexData['pseudo-mode']; - if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) + if (hasModeChanged){ + //Set the mode + state.targetHeatingCoolingState = HeatingCoolingStates[mode]; + this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); + this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); + this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } - - //Set the mode - state.targetHeatingCoolingState = HeatingCoolingStates[mode]; - this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); - this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); - this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); - //Set the temperature - await this.performSend(hexData.data); - this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); + if(hasTemperatureChanged || (state.firstTemperatureUpdate && !preventResendHex)){ + //Set the temperature + await this.performSend(hexData.data); + this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); + state.firstTemperatureUpdate = false; + } } getTemperatureHexData (mode, temperature) { @@ -284,15 +280,15 @@ class AirConAccessory extends BroadlinkRMAccessory { let finalTemperature = temperature; let hexData = data[`${mode}${temperature}`]; - if (!hexData) { - // Mode based code not found, try mode-less - this.log(`${name} No ${mode} HEX code found for ${temperature}`); - let hexData = data[`temperature${temperature}`]; - } else { - if (hexData['pseudo-mode']) { - this.log(`\x1b[36m[INFO] \x1b[0m${name} Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); - } - } + if (!hexData) { + // Mode based code not found, try mode-less + this.log(`${name} No ${mode} HEX code found for ${temperature}`); + let hexData = data[`temperature${temperature}`]; + } else { + if (hexData['pseudo-mode']) { + this.log(`\x1b[36m[INFO] \x1b[0m${name} Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); + } + } // You may not want to set the hex data for every single mode... if (!hexData) { From 5fbc3027e6ba89a25d2ef953c81e92a9e87a7b06 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 08:40:49 +1200 Subject: [PATCH 095/152] Added debugging --- accessories/aircon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 3a97742c..5a8aafc1 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -248,8 +248,9 @@ class AirConAccessory extends BroadlinkRMAccessory { if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) } + log('CurrentMode: ${state.currentHeatingCoolingState} TargetMode: ${state.targetHeatingCoolingState} FoundTargetMode: ${HeatingCoolingStates[mode]}'); const hasTemperatureChanged = (previousTemperature !== finalTemperature); - const hasModeChanged = (state.currentHeatingCoolingState !== state.targetHeatingCoolingState || HeatingCoolingStates[mode] !== state.currentHeatingCoolingState) + const hasModeChanged = (state.currentHeatingCoolingState !== state.targetHeatingCoolingState || HeatingCoolingStates[mode] !== state.currentHeatingCoolingState) //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { From b637949e8f429dbe17150d73ab5d107b1c25802f Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 09:06:57 +1200 Subject: [PATCH 096/152] Fixed replaceAutoMode bug --- accessories/aircon.js | 48 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 5a8aafc1..820e6537 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -72,11 +72,10 @@ class AirConAccessory extends BroadlinkRMAccessory { // defaultHeatTemperature config.heatTemperature = config.heatTemperature || 22; - // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - config.replaceAutoMode = config.replaceAutoMode || 'cool'; + state.targetHeatingCoolingState = config.replaceAutoMode || Characteristic.TargetHeatingCoolingState.COOL; } // Set state default values @@ -241,37 +240,36 @@ class AirConAccessory extends BroadlinkRMAccessory { const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); state.targetTemperature = finalTemperature; - - // Update the heating/cooling mode based on the pseudo-mode - if pressent. + + // Update the heating/cooling mode based on the pseudo-mode - if pressent. if (hexData['pseudo-mode']){ let mode = hexData['pseudo-mode']; - if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) + if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) } - log('CurrentMode: ${state.currentHeatingCoolingState} TargetMode: ${state.targetHeatingCoolingState} FoundTargetMode: ${HeatingCoolingStates[mode]}'); const hasTemperatureChanged = (previousTemperature !== finalTemperature); const hasModeChanged = (state.currentHeatingCoolingState !== state.targetHeatingCoolingState || HeatingCoolingStates[mode] !== state.currentHeatingCoolingState) - //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature + //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { - if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} sendTemperatureOnlyWhenOff - sending only Temperature`); - hasModeChanged = false; - } - - if (hasModeChanged){ - //Set the mode - state.targetHeatingCoolingState = HeatingCoolingStates[mode]; - this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); - this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); - this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); - } - - if(hasTemperatureChanged || (state.firstTemperatureUpdate && !preventResendHex)){ - //Set the temperature - await this.performSend(hexData.data); - this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); - state.firstTemperatureUpdate = false; - } + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} sendTemperatureOnlyWhenOff - sending only Temperature`); + hasModeChanged = false; + } + + if (hasModeChanged){ + //Set the mode + state.targetHeatingCoolingState = HeatingCoolingStates[mode]; + this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); + this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); + this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); + } + + if(hasTemperatureChanged || (state.firstTemperatureUpdate && !preventResendHex)){ + //Set the temperature + await this.performSend(hexData.data); + this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); + state.firstTemperatureUpdate = false; + } } getTemperatureHexData (mode, temperature) { From b1ff4d77b3ee57c60bbf005e9cc968254e6791a8 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 09:12:40 +1200 Subject: [PATCH 097/152] Update aircon.js --- accessories/aircon.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 820e6537..ddb72770 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -72,12 +72,6 @@ class AirConAccessory extends BroadlinkRMAccessory { // defaultHeatTemperature config.heatTemperature = config.heatTemperature || 22; - // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified - if (config.replaceAutoMode && HeatingCoolingConfigKeys[state.targetHeatingCoolingState] === 'auto') { - log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - state.targetHeatingCoolingState = config.replaceAutoMode || Characteristic.TargetHeatingCoolingState.COOL; - } - // Set state default values // state.targetTemperature = state.targetTemperature || config.minTemperature; state.currentHeatingCoolingState = state.currentHeatingCoolingState || Characteristic.CurrentHeatingCoolingState.OFF; From 15577788c119bba256c063b78b805166ea1516ee Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 09:20:02 +1200 Subject: [PATCH 098/152] Added UI Refresh on mode change --- accessories/aircon.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/accessories/aircon.js b/accessories/aircon.js index ddb72770..bf05e47b 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -210,6 +210,8 @@ class AirConAccessory extends BroadlinkRMAccessory { if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; serviceManager.setCharacteristic(Characteristic.TargetTemperature, temperature); + serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); + serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } // Thermostat From 01535cf5bb65c1fde1d013cea959153aa1610346 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 11:01:26 +1200 Subject: [PATCH 099/152] setup pingTimeout to prevent device rediscovery Set value to 10 to increase the time spent waiting --- helpers/getDevice.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index ac04f558..185a60f2 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -3,6 +3,7 @@ const broadlink = require('./broadlink') const delayForDuration = require('./delayForDuration') const pingFrequency = 5000; +const pingTimeout = 10; const startPing = (device, log) => { device.state = 'unknown'; @@ -19,7 +20,7 @@ const startPing = (device, log) => { device.state = 'active'; } - }) + }, {timeout: pingTimeout}) } catch (err) {} }, pingFrequency); } From f1e1905a540d8f297dca0f3e8691fb845c75ef7d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 11:02:50 +1200 Subject: [PATCH 100/152] pingTimeout to prevent device re-discovery Changed setting to 5 seconds --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 185a60f2..33fd7cf8 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -3,7 +3,7 @@ const broadlink = require('./broadlink') const delayForDuration = require('./delayForDuration') const pingFrequency = 5000; -const pingTimeout = 10; +const pingTimeout = 5; const startPing = (device, log) => { device.state = 'unknown'; From 70ef84e38a1c855f0fc0e2821cc6134969203ecb Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 11:12:34 +1200 Subject: [PATCH 101/152] rediscovery - pingTimeout Increased pingTimeout to 10 --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 33fd7cf8..185a60f2 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -3,7 +3,7 @@ const broadlink = require('./broadlink') const delayForDuration = require('./delayForDuration') const pingFrequency = 5000; -const pingTimeout = 5; +const pingTimeout = 10; const startPing = (device, log) => { device.state = 'unknown'; From e21c60bc1af4ac19690059b6339c7d10cd552729 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 11:29:56 +1200 Subject: [PATCH 102/152] Increased redicovery time --- helpers/getDevice.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 185a60f2..916e3335 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -7,6 +7,7 @@ const pingTimeout = 10; const startPing = (device, log) => { device.state = 'unknown'; + var pingWait = pingFrequency; setInterval(() => { try { @@ -15,14 +16,17 @@ const startPing = (device, log) => { log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable.`); device.state = 'inactive'; + // Speed up rediscovery + pingWait = 500; } else if (active && device.state !== 'active') { if (device.state === 'inactive') console.log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); device.state = 'active'; + pingWait = pingFrequency; } }, {timeout: pingTimeout}) } catch (err) {} - }, pingFrequency); + }, pingWait); } const discoveredDevices = {}; From ac4dd5d2fadd3c9d5231c613f7a7d174c2d6f316 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 11:35:47 +1200 Subject: [PATCH 103/152] Update getDevice.js --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 916e3335..06f966a4 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -19,7 +19,7 @@ const startPing = (device, log) => { // Speed up rediscovery pingWait = 500; } else if (active && device.state !== 'active') { - if (device.state === 'inactive') console.log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); + if (device.state === 'inactive') log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); device.state = 'active'; pingWait = pingFrequency; From b3acf727c115554f286c9ab7e8bba75b68d5650e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 12:06:16 +1200 Subject: [PATCH 104/152] Added Error check --- helpers/getDevice.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 06f966a4..7dc49de5 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -11,7 +11,11 @@ const startPing = (device, log) => { setInterval(() => { try { - ping.sys.probe(device.host.address, (active) => { + ping.sys.probe(device.host.address, (active, err) => { + if(err){ + log(`Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); + } + if (!active && device.state === 'active') { log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable.`); From f6a05b8f45b0849e558d77c10b1d901738b919e2 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 12:34:36 +1200 Subject: [PATCH 105/152] Update getDevice.js --- helpers/getDevice.js | 1 + 1 file changed, 1 insertion(+) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 7dc49de5..4f0a5ad2 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -14,6 +14,7 @@ const startPing = (device, log) => { ping.sys.probe(device.host.address, (active, err) => { if(err){ log(`Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); + throw err; } if (!active && device.state === 'active') { From 13f0420bb692a2a5aaee317118e55c709f4dce77 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 13:48:24 +1200 Subject: [PATCH 106/152] v1.2.5 with improved device comm reliability --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae8a8d74..21c7047a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.4", + "version": "1.2.5", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 23e8778b67feb88711e7023281d6c7382f0b4714 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:24:21 +1200 Subject: [PATCH 107/152] Fixed hasModeChanged logic --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index bf05e47b..04db5c49 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -244,7 +244,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } const hasTemperatureChanged = (previousTemperature !== finalTemperature); - const hasModeChanged = (state.currentHeatingCoolingState !== state.targetHeatingCoolingState || HeatingCoolingStates[mode] !== state.currentHeatingCoolingState) + const hasModeChanged = ((state.currentHeatingCoolingState !== state.targetHeatingCoolingState) || (HeatingCoolingStates[mode] !== state.currentHeatingCoolingState)) //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { From 7cf2a72a271fe4e9fdee4797dd25132d1f989d94 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:37:29 +1200 Subject: [PATCH 108/152] Added multiple ping attempts before device inactive --- helpers/getDevice.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 4f0a5ad2..d3649acb 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -8,6 +8,7 @@ const pingTimeout = 10; const startPing = (device, log) => { device.state = 'unknown'; var pingWait = pingFrequency; + var retryCount = 0; setInterval(() => { try { @@ -17,16 +18,23 @@ const startPing = (device, log) => { throw err; } - if (!active && device.state === 'active') { - log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable.`); + if (!active && device.state === 'active' && retryCount === 3) { + log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); device.state = 'inactive'; // Speed up rediscovery + retryCount = 0; pingWait = 500; + } else if (!active && device.state === 'active') { + log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); + + retryCount += 1; + pingWait = pingFrequency; } else if (active && device.state !== 'active') { if (device.state === 'inactive') log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); device.state = 'active'; + retryCount = 0; pingWait = pingFrequency; } }, {timeout: pingTimeout}) From 68951e8936a784cbe2f564ea5d67a360b0334d56 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:52:51 +1200 Subject: [PATCH 109/152] Added logging of Mode changes --- accessories/aircon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 04db5c49..cbf7b1fa 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -256,6 +256,7 @@ class AirConAccessory extends BroadlinkRMAccessory { //Set the mode state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); + this.log(`${name} sentMode (${mode})`); this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } @@ -263,7 +264,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if(hasTemperatureChanged || (state.firstTemperatureUpdate && !preventResendHex)){ //Set the temperature await this.performSend(hexData.data); - this.log(`${name} sentTemperature (${mode} - ${state.targetTemperature})`); + this.log(`${name} sentTemperature (${state.targetTemperature})`); state.firstTemperatureUpdate = false; } } From f1b8f3c57edb55fcaea1f610ef2b831258ae12a1 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 15:04:47 +1200 Subject: [PATCH 110/152] Added sendHex on Mode only change --- accessories/aircon.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/accessories/aircon.js b/accessories/aircon.js index cbf7b1fa..a8da6730 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -256,6 +256,10 @@ class AirConAccessory extends BroadlinkRMAccessory { //Set the mode state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); + // If Temperature hasn't changed, send hex now + if(!hasTemperatureChanged) { + await this.performSend(hexData.data); + } this.log(`${name} sentMode (${mode})`); this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); From f15bb3e9e8557438f24c05c66f654b0b8a8e1142 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 19:07:27 +1200 Subject: [PATCH 111/152] Fixed retry counter reset --- helpers/getDevice.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index d3649acb..bd8d648c 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -36,6 +36,9 @@ const startPing = (device, log) => { device.state = 'active'; retryCount = 0; pingWait = pingFrequency; + } else if (active && retryCount !== 0 ) { + //Acive -reset retry counter + retryCount = 0; } }, {timeout: pingTimeout}) } catch (err) {} From 58a808bfd8154abe2592799bd76f4c9cd1843fee Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 19:08:52 +1200 Subject: [PATCH 112/152] Update getDevice.js --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index bd8d648c..11d8830a 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -26,7 +26,7 @@ const startPing = (device, log) => { retryCount = 0; pingWait = 500; } else if (!active && device.state === 'active') { - log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); + if (debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); retryCount += 1; pingWait = pingFrequency; From e0b11f2ec5021bf2d9ae430c1a10823494335a82 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 19:19:03 +1200 Subject: [PATCH 113/152] Update getDevice.js --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 11d8830a..bd8d648c 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -26,7 +26,7 @@ const startPing = (device, log) => { retryCount = 0; pingWait = 500; } else if (!active && device.state === 'active') { - if (debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); + log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); retryCount += 1; pingWait = pingFrequency; From fe1f45ad08fe8c5869e10e954312724ef948022c Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 19:20:16 +1200 Subject: [PATCH 114/152] Update getDevice.js --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index bd8d648c..821c32f0 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -26,7 +26,7 @@ const startPing = (device, log) => { retryCount = 0; pingWait = 500; } else if (!active && device.state === 'active') { - log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); + if(broadlink.debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); retryCount += 1; pingWait = pingFrequency; From 605aea9c288ed95ffc85f28e8dd0828d3448a0a2 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 25 Sep 2019 19:41:02 +1200 Subject: [PATCH 115/152] Tidied up logging and retry times --- helpers/getDevice.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 821c32f0..1476c7f7 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -29,7 +29,7 @@ const startPing = (device, log) => { if(broadlink.debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); retryCount += 1; - pingWait = pingFrequency; + pingWait = 500; } else if (active && device.state !== 'active') { if (device.state === 'inactive') log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); @@ -39,6 +39,7 @@ const startPing = (device, log) => { } else if (active && retryCount !== 0 ) { //Acive -reset retry counter retryCount = 0; + pingWait = pingFrequency; } }, {timeout: pingTimeout}) } catch (err) {} From 5b43ab4b412d08c3cdfcef642306e87a8f6dc47e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 26 Sep 2019 05:32:45 +1200 Subject: [PATCH 116/152] Fixed errors in ping retry logic --- helpers/getDevice.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 1476c7f7..71e82b51 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -3,11 +3,10 @@ const broadlink = require('./broadlink') const delayForDuration = require('./delayForDuration') const pingFrequency = 5000; -const pingTimeout = 10; +const pingTimeout = 5; const startPing = (device, log) => { device.state = 'unknown'; - var pingWait = pingFrequency; var retryCount = 0; setInterval(() => { @@ -18,32 +17,29 @@ const startPing = (device, log) => { throw err; } - if (!active && device.state === 'active' && retryCount === 3) { + if (!active && device.state === 'active' && retryCount === 2) { log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); device.state = 'inactive'; - // Speed up rediscovery retryCount = 0; - pingWait = 500; } else if (!active && device.state === 'active') { if(broadlink.debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); retryCount += 1; - pingWait = 500; } else if (active && device.state !== 'active') { if (device.state === 'inactive') log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); device.state = 'active'; retryCount = 0; - pingWait = pingFrequency; } else if (active && retryCount !== 0 ) { - //Acive -reset retry counter + //Acive - reset retry counter retryCount = 0; - pingWait = pingFrequency; } }, {timeout: pingTimeout}) - } catch (err) {} - }, pingWait); + } catch (err) { + log(`Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); + } + }, pingFrequency); } const discoveredDevices = {}; From 0a2215c92f4f525667a58917dc0ec3b123c8f6d1 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 26 Sep 2019 06:27:31 +1200 Subject: [PATCH 117/152] Reduced ping retries to improve status reliability --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 71e82b51..0c034384 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -7,7 +7,7 @@ const pingTimeout = 5; const startPing = (device, log) => { device.state = 'unknown'; - var retryCount = 0; + var retryCount = 1; setInterval(() => { try { From 9f6e674d67db29af858785e24527d7aed252fa97 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 26 Sep 2019 06:39:25 +1200 Subject: [PATCH 118/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 21c7047a..9aa0fb06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.5", + "version": "1.2.6", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From a7b5176d787862d22d94313e791ed44413ba962a Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 27 Sep 2019 12:30:24 +1200 Subject: [PATCH 119/152] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9aa0fb06..e917fe85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-acfile", - "version": "1.2.6", + "version": "1.3.0", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From b8a1728acce6b4b4b8fbcc2a4a82f561f19e878a Mon Sep 17 00:00:00 2001 From: Alexander Babel Date: Sun, 29 Sep 2019 15:48:39 +0200 Subject: [PATCH 120/152] Adjusted readme, package.json and update checker --- README.md | 10 +++++++--- helpers/checkForUpdates.js | 8 ++++---- package.json | 8 ++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 021e9846..1197d8fd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ # About this fork -This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm) which adds TV support to [lprhodes Broadlink RM Plugin](https://github.com/lprhodes/homebridge-broadlink-rm). This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: +This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! + +This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: 1. Added configuration to read hex codes for {mode}{temp} e.g. ``` @@ -23,7 +25,7 @@ This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderB If you want to use this fork, use this command: -`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlinkrm-acfile.git` +`npm i -g homebridge-broadlink-rm-tv` # Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] @@ -38,4 +40,6 @@ This plugin allows you to control your RM Mini and RM Pro with HomeKit using the Full documentation can be found [here](https://lprhodes.github.io/slate/). ## Thanks -Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. +Original: Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. + +In this fork: Thanks to @kiwi-cam (https://github.com/kiwi-cam) and @Cloudore (https://github.com/Cloudore) for your work! diff --git a/helpers/checkForUpdates.js b/helpers/checkForUpdates.js index a12a3190..f2fa866d 100644 --- a/helpers/checkForUpdates.js +++ b/helpers/checkForUpdates.js @@ -1,8 +1,8 @@ const versionCheck = require('github-version-checker'); const pkg = require('../package.json'); - + const options = { - repo: 'kiwi-cam/homebridge-broadlink-rm-acfile', + repo: 'AlexanderBabel/homebridge-broadlink-rm', currentVersion: pkg.version, includePreReleases: false }; @@ -12,9 +12,9 @@ const checkForUpdates = () => { versionCheck (options, (update, error) => { // if (error) throw error; if (update) { - console.log(`\x1b[32m[UPDATE AVAILABLE] \x1b[0mVersion ${update.tag_name} of homebridge-broadlink-rm-acfile is available. The release notes can be found here: \x1b[4mhttps://github.com/kiwi-cam/homebridge-broadlink-rm-acfile/releases/\x1b[0m`); + console.log(`\x1b[32m[UPDATE AVAILABLE] \x1b[0mVersion ${update.tag_name} of homebridge-broadlink-rm-tv is available. The release notes can be found here: \x1b[4mhttps://github.com/lprhodes/homebridge-broadlink-rm/releases/\x1b[0m`); } }); } -module.exports = checkForUpdates; +module.exports = checkForUpdates; \ No newline at end of file diff --git a/package.json b/package.json index e917fe85..751e48ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "homebridge-broadlink-rm-acfile", - "version": "1.3.0", + "name": "homebridge-broadlink-rm-tv", + "version": "4.0.0", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { @@ -17,11 +17,11 @@ "homebridge": ">=0.2.0" }, "author": { - "name": "kiwi-cam" + "name": "AlexanderBabel" }, "repository": { "type": "git", - "url": "git@github.com:kiwi-cam/homebridge-broadlink-rm-acfile.git" + "url": "git@github.com:AlexanderBabel/homebridge-broadlink-rm.git" }, "dependencies": { "broadlinkjs-rm": "^0.6.0", From 6d74195ab756b18e1698b7d13ab9c53a50922724 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 30 Sep 2019 14:08:51 +1300 Subject: [PATCH 121/152] Update README.md --- README.md | 42 +----------------------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/README.md b/README.md index 021e9846..4c85e928 100644 --- a/README.md +++ b/README.md @@ -1,41 +1 @@ -# Homebridge Broadlink RM [TV+AC File Fork] - -# About this fork - -This fork is built upon [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm) which adds TV support to [lprhodes Broadlink RM Plugin](https://github.com/lprhodes/homebridge-broadlink-rm). This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: - - 1. Added configuration to read hex codes for {mode}{temp} e.g. -``` - "data":{ - "off":"2600500000012...", - "heat30":{ - "data":"2600500000012..." - }, - "cool16":{ - "data":"2600500000012..." - } - } -``` -2. Added support for Raspberry Pi Wire-1 thermometers (i.e. ds18b20). You can find your devices ID using the command `ls /sys/bus/w1/devices`. Then update your air-conditioner config to include (using the device ID): -``` -"w1DeviceID":"28-0321544e531ff", -``` - -If you want to use this fork, use this command: - -`npm i -g git+https://github.com/kiwi-cam/homebridge-broadlinkrm-acfile.git` - - -# Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] - -## Introduction -Welcome to the Broadlink RM Mini and Broadlink RM Pro plugin for [Homebridge](https://github.com/nfarina/homebridge). - -This plugin allows you to control your RM Mini and RM Pro with HomeKit using the Home app and Siri. - -## Documentation - -Full documentation can be found [here](https://lprhodes.github.io/slate/). - -## Thanks -Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. +Please refer to: [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm). Changes from here are merged From f9315462c766b72a37db14c53a67e73d9352bd08 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 1 Oct 2019 08:56:56 +1300 Subject: [PATCH 122/152] Update README.md --- README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c85e928..1197d8fd 100644 --- a/README.md +++ b/README.md @@ -1 +1,45 @@ -Please refer to: [AlexanderBabel's version](https://github.com/AlexanderBabel/homebridge-broadlink-rm). Changes from here are merged +# Homebridge Broadlink RM [TV+AC File Fork] + +# About this fork + +This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! + +This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: + + 1. Added configuration to read hex codes for {mode}{temp} e.g. +``` + "data":{ + "off":"2600500000012...", + "heat30":{ + "data":"2600500000012..." + }, + "cool16":{ + "data":"2600500000012..." + } + } +``` +2. Added support for Raspberry Pi Wire-1 thermometers (i.e. ds18b20). You can find your devices ID using the command `ls /sys/bus/w1/devices`. Then update your air-conditioner config to include (using the device ID): +``` +"w1DeviceID":"28-0321544e531ff", +``` + +If you want to use this fork, use this command: + +`npm i -g homebridge-broadlink-rm-tv` + + +# Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] + +## Introduction +Welcome to the Broadlink RM Mini and Broadlink RM Pro plugin for [Homebridge](https://github.com/nfarina/homebridge). + +This plugin allows you to control your RM Mini and RM Pro with HomeKit using the Home app and Siri. + +## Documentation + +Full documentation can be found [here](https://lprhodes.github.io/slate/). + +## Thanks +Original: Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. + +In this fork: Thanks to @kiwi-cam (https://github.com/kiwi-cam) and @Cloudore (https://github.com/Cloudore) for your work! From d6b63e7f3f5db1645af747158fc73f419db1e15b Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 1 Oct 2019 09:02:21 +1300 Subject: [PATCH 123/152] Fixed config formatting --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1197d8fd..4ec1b92c 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ This fork also addresses an issue updating the temperature from file. Devices ap 1. Added configuration to read hex codes for {mode}{temp} e.g. ``` - "data":{ - "off":"2600500000012...", + "data":{ + "off":"2600500000012...", "heat30":{ "data":"2600500000012..." }, From f7f5aefa97c0b141662be680efb09722ed647079 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 1 Oct 2019 13:36:04 +1300 Subject: [PATCH 124/152] Fixed unused mode hexcodes (#8) * Fixed unused mode hexcodes The heat/cool/auto hex codes in the configuration were unused ?!?!? This is to use these to set the mode, and the temp hex to set temperature for units that have seperate codes. mode hex codes are optional in the config. Temperature codes will be sent instead assuming these contain the mode information for the AC unit. * Mode change clean-up Separated mode change code from sendTemperature to setTargetHeatingCoolingState to allow it to run when only the mode changes. --- accessories/aircon.js | 67 +++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index a8da6730..7200d497 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -197,18 +197,38 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - let temperature; - // Selecting a heating/cooling state allows a default temperature to be used for the given state. - if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { - temperature = defaultHeatTemperature; - } else if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.COOL) { - temperature = defaultCoolTemperature; - } else { - temperature = state.targetTemperature; - } - + let temperature = state.targetTemperature; + let mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; + if (state.currentHeatingCoolingState !== state.targetHeatingCoolingState){ + // Selecting a heating/cooling state allows a default temperature to be used for the given state. + if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { + temperature = defaultHeatTemperature; + } else if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.COOL) { + temperature = defaultCoolTemperature; + } + + //Set the mode, and send the mode hex + this.updateServiceCurrentHeatingCoolingState(state.targetHeatingCoolingState); + if (data.heat && mode === 'heat'){ + await this.performSend(data.heat); + } else if (data.cool && mode === 'cool'){ + await this.performSend(data.cool); + } else if (data.auto && mode === 'auto'){ + await this.performSend(data.auto); + } else { + //Just send the provided temperature hex if node mode codes are set + await this.performSend(hexData); + } + + this.log(`${name} sentMode (${mode})`); + + //Force sending Temperature if temperature hasn't changed in the mode change + if (state.targetTemperature === temperature) this.sendTemperature(temperature); + } + serviceManager.setCharacteristic(Characteristic.TargetTemperature, temperature); serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); @@ -233,7 +253,7 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } - const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + let mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); state.targetTemperature = finalTemperature; @@ -241,31 +261,10 @@ class AirConAccessory extends BroadlinkRMAccessory { if (hexData['pseudo-mode']){ let mode = hexData['pseudo-mode']; if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) - } - - const hasTemperatureChanged = (previousTemperature !== finalTemperature); - const hasModeChanged = ((state.currentHeatingCoolingState !== state.targetHeatingCoolingState) || (HeatingCoolingStates[mode] !== state.currentHeatingCoolingState)) - - //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature - if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { - if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} sendTemperatureOnlyWhenOff - sending only Temperature`); - hasModeChanged = false; - } - - if (hasModeChanged){ - //Set the mode - state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); - // If Temperature hasn't changed, send hex now - if(!hasTemperatureChanged) { - await this.performSend(hexData.data); - } - this.log(`${name} sentMode (${mode})`); - this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); - this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } - - if(hasTemperatureChanged || (state.firstTemperatureUpdate && !preventResendHex)){ + + if((previousTemperature !== finalTemperature) || (state.firstTemperatureUpdate && !preventResendHex)){ //Set the temperature await this.performSend(hexData.data); this.log(`${name} sentTemperature (${state.targetTemperature})`); diff --git a/package.json b/package.json index 751e48ec..16779b05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.0", + "version": "4.0.1", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 8540c0b04e44a116a1fdc77ae61eba2416b3fa2e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 1 Oct 2019 14:41:04 +1300 Subject: [PATCH 125/152] Fixed bug when no mode hexcodes set --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 7200d497..ee768792 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -218,7 +218,7 @@ class AirConAccessory extends BroadlinkRMAccessory { await this.performSend(data.cool); } else if (data.auto && mode === 'auto'){ await this.performSend(data.auto); - } else { + } else if (hexData) { //Just send the provided temperature hex if node mode codes are set await this.performSend(hexData); } From f937c8eaff506aafdfccf9a5309f1b5a700f0a90 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 1 Oct 2019 14:49:37 +1300 Subject: [PATCH 126/152] Typo --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index ee768792..aea9fe84 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -219,7 +219,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } else if (data.auto && mode === 'auto'){ await this.performSend(data.auto); } else if (hexData) { - //Just send the provided temperature hex if node mode codes are set + //Just send the provided temperature hex if no mode codes are set await this.performSend(hexData); } From edf2aa9faece382a00ac3fcd86295f4aecdc0977 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 1 Oct 2019 15:26:35 +1300 Subject: [PATCH 127/152] Mode hex fix (#9) * Turn the unit on first if required, and defined --- accessories/aircon.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index aea9fe84..a6313055 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -186,12 +186,18 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } + + if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; + + // If the air-conditioner is turned off then turn it on first and try this again + if (this.checkTurnOnWhenOff()) { + this.turnOnWhenOffDelayPromise = delayForDuration(.3); + await this.turnOnWhenOffDelayPromise + } // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified if (replaceAutoMode && targetHeatingCoolingState === 'auto') { log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - - if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; this.updateServiceTargetHeatingCoolingState(HeatingCoolingStates[replaceAutoMode]); return; @@ -200,8 +206,6 @@ class AirConAccessory extends BroadlinkRMAccessory { let temperature = state.targetTemperature; let mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; - if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; - if (state.currentHeatingCoolingState !== state.targetHeatingCoolingState){ // Selecting a heating/cooling state allows a default temperature to be used for the given state. if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { @@ -241,12 +245,6 @@ class AirConAccessory extends BroadlinkRMAccessory { if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} Potential sendTemperature (${temperature})`); - // If the air-conditioner is turned off then turn it on first and try this again - if (this.checkTurnOnWhenOff()) { - this.turnOnWhenOffDelayPromise = delayForDuration(.3); - await this.turnOnWhenOffDelayPromise - } - // Ignore Temperature if off, staying off - and set to ignore if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); @@ -311,9 +309,13 @@ class AirConAccessory extends BroadlinkRMAccessory { const { on } = data; if (state.currentHeatingCoolingState === Characteristic.TargetHeatingCoolingState.OFF && config.turnOnWhenOff) { - log(`${name} sendTemperature (sending "on" hex before sending temperature)`); + log(`${name} sending "on" hex before sending temperature`); - if (on) await this.performSend(on); + if (on) { + await this.performSend(on); + } else { + log(`\x1b[31m[CONFIG ERROR] \x1b[0m ${name} No On Hex configured, but turnOnWhenOff enabled`); + } return true; } From 9fc7f349d552cefc1850ea9fd64ee58ab74e427e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 2 Oct 2019 11:08:53 +1300 Subject: [PATCH 128/152] Updated README.md to include notes on new features (#10) --- README.md | 108 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 4ec1b92c..df6507b3 100644 --- a/README.md +++ b/README.md @@ -4,24 +4,7 @@ This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! -This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: - - 1. Added configuration to read hex codes for {mode}{temp} e.g. -``` - "data":{ - "off":"2600500000012...", - "heat30":{ - "data":"2600500000012..." - }, - "cool16":{ - "data":"2600500000012..." - } - } -``` -2. Added support for Raspberry Pi Wire-1 thermometers (i.e. ds18b20). You can find your devices ID using the command `ls /sys/bus/w1/devices`. Then update your air-conditioner config to include (using the device ID): -``` -"w1DeviceID":"28-0321544e531ff", -``` +This fork also contains updates the to Air Conditioner accessory, as detailed in the documenation below. If you want to use this fork, use this command: @@ -37,7 +20,94 @@ This plugin allows you to control your RM Mini and RM Pro with HomeKit using the ## Documentation -Full documentation can be found [here](https://lprhodes.github.io/slate/). +Full documentation can be found [here](https://lprhodes.github.io/slate/). With the following additional configuration options available: + +### Switch Accessory + +key | description | example | default +--- | ----------- | ------- | ------- +pingGrace (optional) | Pauses ping status changes for the specified period (seconds) to allow device to start-up/shutdown after the change | 15 | 10 + +### Aircon Accessory + +key | description | example | default +--- | ----------- | ------- | ------- +w1DeviceID (optional) | Updates device current temperature from a Raspberry Pi Wire-1 thermometers (i.e. ds18b20). Value is the Device ID | 28-0321544e531ff | + +#### "data" key-value object + +key | description +--- | ----------- +off | A hex code string to be sent when the air conditioner is asked to be turned off. +temperatureX | A hex code string where X is any temperature you wish to support e.g. "temperature30". +modeX | A hex code string where X is any temperture, and mode is one of "heat","cool", or "auto". Hex code used to set unit to the specified mode and temperature + +#### "temperatureX" and "modeX" key-value object + +key | description +--- | ----------- +data | Hex data stored as string. +pseudo-mode (optional) | The mode we set when this hex is sent. i.e. "heat" or "cool". For graphical purposes only (hence use of the term "pseudo"). Not recommended for ModeX key-values. + +### TV Accessory + +key | description | example | default +--- | ----------- | ------- | ------- +enableAutoOff | Turn the TV off automatically when onDuration has been reached. | true | false +onDuration | The amount of time before the TV automatically turns itself off (used in conjunction with enableAutoOff). | 5 | 60 +enableAutoOn | Turn the TV on automatically when offDuration has been reached | false | true +offDuration | The amount of time before the TV automatically turns itself on (used in conjunction with enableAutoOn). | 5 | 60 +pingIPAddress | When an IP address is provided, it is pinged every second. If a response is received then the TV turns on, otherwise it turns off. | "192.167.1.77" | +pingIPAddressStateOnly | Using this option will prevent the hex code from being sent when the state changes | true | false +pingFrequency | The frequency in seconds that the IP address should be pinged | 5 | 1 +pingGrace (optional) | Pauses ping status changes for the specified period (seconds) to allow device to start-up/shutdown after the change | 15 | 10 +data | see below + +#### "data" key-value object + +key | description +--- | ----------- +on | A hex code string to be sent when the tv is powered on. +off | A hex code string to be sent when the tv is powered off. +volume | see below +inputs | see below +remote | see below + +#### "volume" key-value object +Configuration for volume changes via the Control Centre remote + +key | description +--- | ----------- +up | A hex code string to be sent to turn the TV volume up. +down | A hex code string to be sent to turn the TV volume down. + +#### "inputs" key-value object +Inputs contain an array of the below settings, one for each input + +key | description +--- | ----------- +name | The name used for the mode, shown in the GUI. +type | One of the follow to represent the mode: 'other','home_screen','tuner','hdmi','composite_video','s_video','component_video','dvi','airplay','usb','application' +data | A hex code string to be sent to switch the TV to the selected input. + +#### "remote" key-value object +Configuration of button options in the Control Centre remote + +key | description +--- | ----------- +rewind | The hex code for this button function +fastForward | The hex code for this button function +nextTrack | The hex code for this button function +previousTrack | The hex code for this button function +arrowUp | The hex code for this button function +arrowDown | The hex code for this button function +arrowLeft | The hex code for this button function +arrowRight | The hex code for this button function +select | The hex code for this button function +back | The hex code for this button function +exit | The hex code for this button function +playPause | The hex code for this button function +info | The hex code for this button function ## Thanks Original: Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. From 1010dd5725c563cc440c64415e0d5be7c83ddaac Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 3 Oct 2019 08:55:45 +1300 Subject: [PATCH 129/152] Removed duplicate onTemperature Calls --- accessories/aircon.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index a6313055..bb56175a 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -347,8 +347,9 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`${name} monitorTemperature`); - device.on('temperature', this.onTemperature.bind(this)); - device.checkTemperature(); + // this call appears to be creating duplicate calls and delaying status refreshes + // device.on('temperature', this.onTemperature.bind(this)); + // device.checkTemperature(); this.updateTemperatureUI(); if (!config.isUnitTest) setInterval(this.updateTemperatureUI.bind(this), config.temperatureUpdateFrequency * 1000) From bd135d6d051baa5e882a5e22d4bdf59d9b71d088 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 3 Oct 2019 09:03:47 +1300 Subject: [PATCH 130/152] Reduced file and w1 temperature refresh frequency iOS13/tvOS13 appears to poll the device status more frequently. Adjusted default temperature update times to reduce duplication --- accessories/aircon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index bb56175a..0302d3e1 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -331,8 +331,8 @@ class AirConAccessory extends BroadlinkRMAccessory { if (pseudoDeviceTemperature !== undefined) return; - //Force w1 and file devices to a 5 minute refresh - if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 300; + //Force w1 and file devices to a 10 minute refresh + if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 600; const device = getDevice({ host, log }); From f3f1950a65ac569f02f2981fb3b049821d3c5e9d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 3 Oct 2019 09:05:44 +1300 Subject: [PATCH 131/152] Documentation (#11) * Updated README.md to include notes on new features From b05bd61d3296058c5f78c3ef4a6ebc71298a4f3d Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 3 Oct 2019 15:48:33 +1300 Subject: [PATCH 132/152] Mode Functionality Tidy-up (#36) * Fixed unused mode hexcodes The heat/cool/auto hex codes in the configuration were unused ?!?!? This is to use these to set the mode, and the temp hex to set temperature for units that have seperate codes. mode hex codes are optional in the config. Temperature codes will be sent instead assuming these contain the mode information for the AC unit. * Mode change clean-up Separated mode change code from sendTemperature to setTargetHeatingCoolingState to allow it to run when only the mode changes. * Temperature Refresh optimisations iOS13/tvOS13 appears to poll the device status more frequently. Adjusted default temperature update times to reduce duplication. Removed duplicate onTemperature Calls to speed up refresh --- README.md | 4 +- accessories/aircon.js | 100 +++++++++++++++++++++--------------------- package.json | 2 +- 3 files changed, 54 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 1197d8fd..4ec1b92c 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ This fork also addresses an issue updating the temperature from file. Devices ap 1. Added configuration to read hex codes for {mode}{temp} e.g. ``` - "data":{ - "off":"2600500000012...", + "data":{ + "off":"2600500000012...", "heat30":{ "data":"2600500000012..." }, diff --git a/accessories/aircon.js b/accessories/aircon.js index a8da6730..bd1fc9cc 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -186,29 +186,53 @@ class AirConAccessory extends BroadlinkRMAccessory { return; } + + if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; + + // If the air-conditioner is turned off then turn it on first and try this again + if (this.checkTurnOnWhenOff()) { + this.turnOnWhenOffDelayPromise = delayForDuration(.3); + await this.turnOnWhenOffDelayPromise + } // Perform the auto -> cool/heat conversion if `replaceAutoMode` is specified if (replaceAutoMode && targetHeatingCoolingState === 'auto') { log(`${name} setTargetHeatingCoolingState (converting from auto to ${replaceAutoMode})`); - - if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; this.updateServiceTargetHeatingCoolingState(HeatingCoolingStates[replaceAutoMode]); return; } - let temperature; - // Selecting a heating/cooling state allows a default temperature to be used for the given state. - if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { - temperature = defaultHeatTemperature; - } else if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.COOL) { - temperature = defaultCoolTemperature; - } else { - temperature = state.targetTemperature; + let temperature = state.targetTemperature; + let mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + + if (state.currentHeatingCoolingState !== state.targetHeatingCoolingState){ + // Selecting a heating/cooling state allows a default temperature to be used for the given state. + if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.HEAT) { + temperature = defaultHeatTemperature; + } else if (state.targetHeatingCoolingState === Characteristic.TargetHeatingCoolingState.COOL) { + temperature = defaultCoolTemperature; + } + + //Set the mode, and send the mode hex + this.updateServiceCurrentHeatingCoolingState(state.targetHeatingCoolingState); + if (data.heat && mode === 'heat'){ + await this.performSend(data.heat); + } else if (data.cool && mode === 'cool'){ + await this.performSend(data.cool); + } else if (data.auto && mode === 'auto'){ + await this.performSend(data.auto); + } else if (hexData) { + //Just send the provided temperature hex if node mode codes are set + await this.performSend(hexData); + } + + this.log(`${name} sentMode (${mode})`); + + //Force sending Temperature if temperature hasn't changed in the mode change + if (state.targetTemperature === temperature) this.sendTemperature(temperature); } - - if (previousValue === Characteristic.TargetHeatingCoolingState.OFF) this.previouslyOff = true; - + serviceManager.setCharacteristic(Characteristic.TargetTemperature, temperature); serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); @@ -221,19 +245,13 @@ class AirConAccessory extends BroadlinkRMAccessory { if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} Potential sendTemperature (${temperature})`); - // If the air-conditioner is turned off then turn it on first and try this again - if (this.checkTurnOnWhenOff()) { - this.turnOnWhenOffDelayPromise = delayForDuration(.3); - await this.turnOnWhenOffDelayPromise - } - // Ignore Temperature if off, staying off - and set to ignore if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); return; } - const mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; + let mode = HeatingCoolingConfigKeys[state.targetHeatingCoolingState]; const { hexData, finalTemperature } = this.getTemperatureHexData(mode, temperature); state.targetTemperature = finalTemperature; @@ -241,31 +259,10 @@ class AirConAccessory extends BroadlinkRMAccessory { if (hexData['pseudo-mode']){ let mode = hexData['pseudo-mode']; if (mode) assert.oneOf(mode, [ 'heat', 'cool', 'auto' ], `\x1b[31m[CONFIG ERROR] \x1b[33mpseudo-mode\x1b[0m should be one of "heat", "cool" or "auto"`) - } - - const hasTemperatureChanged = (previousTemperature !== finalTemperature); - const hasModeChanged = ((state.currentHeatingCoolingState !== state.targetHeatingCoolingState) || (HeatingCoolingStates[mode] !== state.currentHeatingCoolingState)) - - //If sendTemperatureOnlyWhenOff and Off, set hasModeChanged to false so we only send Temperature - if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && sendTemperatureOnlyWhenOff) { - if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} sendTemperatureOnlyWhenOff - sending only Temperature`); - hasModeChanged = false; - } - - if (hasModeChanged){ - //Set the mode - state.targetHeatingCoolingState = HeatingCoolingStates[mode]; this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates[mode]); - // If Temperature hasn't changed, send hex now - if(!hasTemperatureChanged) { - await this.performSend(hexData.data); - } - this.log(`${name} sentMode (${mode})`); - this.serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); - this.serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } - - if(hasTemperatureChanged || (state.firstTemperatureUpdate && !preventResendHex)){ + + if((previousTemperature !== finalTemperature) || (state.firstTemperatureUpdate && !preventResendHex)){ //Set the temperature await this.performSend(hexData.data); this.log(`${name} sentTemperature (${state.targetTemperature})`); @@ -312,9 +309,13 @@ class AirConAccessory extends BroadlinkRMAccessory { const { on } = data; if (state.currentHeatingCoolingState === Characteristic.TargetHeatingCoolingState.OFF && config.turnOnWhenOff) { - log(`${name} sendTemperature (sending "on" hex before sending temperature)`); + log(`${name} sending "on" hex before sending temperature`); - if (on) await this.performSend(on); + if (on) { + await this.performSend(on); + } else { + log(`\x1b[31m[CONFIG ERROR] \x1b[0m ${name} No On Hex configured, but turnOnWhenOff enabled`); + } return true; } @@ -330,8 +331,8 @@ class AirConAccessory extends BroadlinkRMAccessory { if (pseudoDeviceTemperature !== undefined) return; - //Force w1 and file devices to a 5 minute refresh - if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 300; + //Force w1 and file devices to a 10 minute refresh + if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 600; const device = getDevice({ host, log }); @@ -346,8 +347,9 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`${name} monitorTemperature`); - device.on('temperature', this.onTemperature.bind(this)); - device.checkTemperature(); + // this call appears to be creating duplicate calls and delaying status refreshes + // device.on('temperature', this.onTemperature.bind(this)); + // device.checkTemperature(); this.updateTemperatureUI(); if (!config.isUnitTest) setInterval(this.updateTemperatureUI.bind(this), config.temperatureUpdateFrequency * 1000) diff --git a/package.json b/package.json index 751e48ec..16779b05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.0", + "version": "4.0.1", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 66a216ad439bdb81a816d6347d6af12408599569 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 3 Oct 2019 15:53:32 +1300 Subject: [PATCH 133/152] Updated README.md to include notes on new features --- README.md | 108 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 4ec1b92c..df6507b3 100644 --- a/README.md +++ b/README.md @@ -4,24 +4,7 @@ This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! -This fork also addresses an issue updating the temperature from file. Devices appear as "Not Repsonding" on read errors. This fork will use a temperature of 0 instead of hanging. Now updated to replciate the airconditioner-pro accessory: - - 1. Added configuration to read hex codes for {mode}{temp} e.g. -``` - "data":{ - "off":"2600500000012...", - "heat30":{ - "data":"2600500000012..." - }, - "cool16":{ - "data":"2600500000012..." - } - } -``` -2. Added support for Raspberry Pi Wire-1 thermometers (i.e. ds18b20). You can find your devices ID using the command `ls /sys/bus/w1/devices`. Then update your air-conditioner config to include (using the device ID): -``` -"w1DeviceID":"28-0321544e531ff", -``` +This fork also contains updates the to Air Conditioner accessory, as detailed in the documenation below. If you want to use this fork, use this command: @@ -37,7 +20,94 @@ This plugin allows you to control your RM Mini and RM Pro with HomeKit using the ## Documentation -Full documentation can be found [here](https://lprhodes.github.io/slate/). +Full documentation can be found [here](https://lprhodes.github.io/slate/). With the following additional configuration options available: + +### Switch Accessory + +key | description | example | default +--- | ----------- | ------- | ------- +pingGrace (optional) | Pauses ping status changes for the specified period (seconds) to allow device to start-up/shutdown after the change | 15 | 10 + +### Aircon Accessory + +key | description | example | default +--- | ----------- | ------- | ------- +w1DeviceID (optional) | Updates device current temperature from a Raspberry Pi Wire-1 thermometers (i.e. ds18b20). Value is the Device ID | 28-0321544e531ff | + +#### "data" key-value object + +key | description +--- | ----------- +off | A hex code string to be sent when the air conditioner is asked to be turned off. +temperatureX | A hex code string where X is any temperature you wish to support e.g. "temperature30". +modeX | A hex code string where X is any temperture, and mode is one of "heat","cool", or "auto". Hex code used to set unit to the specified mode and temperature + +#### "temperatureX" and "modeX" key-value object + +key | description +--- | ----------- +data | Hex data stored as string. +pseudo-mode (optional) | The mode we set when this hex is sent. i.e. "heat" or "cool". For graphical purposes only (hence use of the term "pseudo"). Not recommended for ModeX key-values. + +### TV Accessory + +key | description | example | default +--- | ----------- | ------- | ------- +enableAutoOff | Turn the TV off automatically when onDuration has been reached. | true | false +onDuration | The amount of time before the TV automatically turns itself off (used in conjunction with enableAutoOff). | 5 | 60 +enableAutoOn | Turn the TV on automatically when offDuration has been reached | false | true +offDuration | The amount of time before the TV automatically turns itself on (used in conjunction with enableAutoOn). | 5 | 60 +pingIPAddress | When an IP address is provided, it is pinged every second. If a response is received then the TV turns on, otherwise it turns off. | "192.167.1.77" | +pingIPAddressStateOnly | Using this option will prevent the hex code from being sent when the state changes | true | false +pingFrequency | The frequency in seconds that the IP address should be pinged | 5 | 1 +pingGrace (optional) | Pauses ping status changes for the specified period (seconds) to allow device to start-up/shutdown after the change | 15 | 10 +data | see below + +#### "data" key-value object + +key | description +--- | ----------- +on | A hex code string to be sent when the tv is powered on. +off | A hex code string to be sent when the tv is powered off. +volume | see below +inputs | see below +remote | see below + +#### "volume" key-value object +Configuration for volume changes via the Control Centre remote + +key | description +--- | ----------- +up | A hex code string to be sent to turn the TV volume up. +down | A hex code string to be sent to turn the TV volume down. + +#### "inputs" key-value object +Inputs contain an array of the below settings, one for each input + +key | description +--- | ----------- +name | The name used for the mode, shown in the GUI. +type | One of the follow to represent the mode: 'other','home_screen','tuner','hdmi','composite_video','s_video','component_video','dvi','airplay','usb','application' +data | A hex code string to be sent to switch the TV to the selected input. + +#### "remote" key-value object +Configuration of button options in the Control Centre remote + +key | description +--- | ----------- +rewind | The hex code for this button function +fastForward | The hex code for this button function +nextTrack | The hex code for this button function +previousTrack | The hex code for this button function +arrowUp | The hex code for this button function +arrowDown | The hex code for this button function +arrowLeft | The hex code for this button function +arrowRight | The hex code for this button function +select | The hex code for this button function +back | The hex code for this button function +exit | The hex code for this button function +playPause | The hex code for this button function +info | The hex code for this button function ## Thanks Original: Thanks to @tattn (https://github.com/tattn/homebridge-rm-mini3), @PJCzx (https://github.com/PJCzx/homebridge-thermostat) @momodalo (https://github.com/momodalo/broadlinkjs) whose time and effort got me started. From 2645cd92f33661912d22fb0a21948fad3033c355 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Sat, 5 Oct 2019 10:46:13 +1300 Subject: [PATCH 134/152] Added mode and temp hexcode use details --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index df6507b3..1c90d7f6 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ key | description | example | default w1DeviceID (optional) | Updates device current temperature from a Raspberry Pi Wire-1 thermometers (i.e. ds18b20). Value is the Device ID | 28-0321544e531ff | #### "data" key-value object +The device can be setup to manage modes in one of two ways. If your AC unit accepts a hexcade to change mode only (without temperature details) you can set the mode keys (heat/cool) and then the temperatureX values to change the teperature. If your AC unit sends hexcodes that contain the mode AND temperature you can use the modeX codes alone. + +When the mode is changed the mode hexcodes are sent first - if set. Then the modeX code is sent to set the temperature, if it is set. If a matching modeX code can't be found, the temperatureX code is sent. If neither of these temperature codes are found either defaultHeatTemperature or defaultCoolTemperature codes will be used depending on if the target Temperature is higher or lower than the current temperature. key | description --- | ----------- From 4c748d46253ceb6bb67c9dffb0f8153a274ce281 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 7 Oct 2019 09:57:47 +1300 Subject: [PATCH 135/152] Fixed ignoreTemperatureWhenOff logic ignoreTemperatureWhenOff only applied when off and staying off. This means that when transitioning to off mode, a temperature hexcode was attempted. Now ignores if the target is off, regardless of the current mode. --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index bd1fc9cc..2c52f4e3 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -246,7 +246,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} Potential sendTemperature (${temperature})`); // Ignore Temperature if off, staying off - and set to ignore - if (!state.currentHeatingCoolingState && !state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { + if (!state.targetHeatingCoolingState && ignoreTemperatureWhenOff) { log(`${name} Ignoring sendTemperature due to "ignoreTemperatureWhenOff": true`); return; } From eb50ed07f259cda3a0d60da2f1b9160363e01709 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 7 Oct 2019 11:48:58 +1300 Subject: [PATCH 136/152] Temperature Refresh optimisation Removed set temperature from all state updates. Cleaned up targetTemperature refresh to only be on temperature changes. --- accessories/aircon.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 2c52f4e3..4598c4af 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -147,8 +147,8 @@ class AirConAccessory extends BroadlinkRMAccessory { return (!this.autoSwitchAccessory || (this.autoSwitchAccessory && this.autoSwitchAccessory.state && this.autoSwitchAccessory.state.switchState)); } - setTargetTemperature (hexData, previousValue) { - const { config, log, name, state } = this; + setTargetTemperature (previousValue) { + const { config, log, name, serviceManager, state } = this; const { preventResendHex, minTemperature, maxTemperature } = config; if (state.targetTemperature === previousValue && preventResendHex && !this.previouslyOff) return; @@ -164,6 +164,7 @@ class AirConAccessory extends BroadlinkRMAccessory { // Do the actual sending of the temperature this.sendTemperature(state.targetTemperature, previousValue); + serviceManager.refreshCharacteristicUI(Characteristic.TargetTemperature); } async setTargetHeatingCoolingState (hexData, previousValue) { @@ -229,11 +230,13 @@ class AirConAccessory extends BroadlinkRMAccessory { this.log(`${name} sentMode (${mode})`); - //Force sending Temperature if temperature hasn't changed in the mode change - if (state.targetTemperature === temperature) this.sendTemperature(temperature); + //Force Temperature send + delayForDuration(0.25).then(() => { + this.sendTemperature(temperature, state.currentTemperature); + serviceManager.refreshCharacteristicUI(Characteristic.TargetTemperature); + }); } - serviceManager.setCharacteristic(Characteristic.TargetTemperature, temperature); serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); } From 15185e8232515b7c772434c11ae49cebb7ce27cb Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 14 Oct 2019 08:11:29 +1300 Subject: [PATCH 137/152] Increased temperature update frequency UI slow on "Updating", changed temperature update frequency of W1 and file updates to 5 minutes instead of 10. --- accessories/aircon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 86dfba83..e564327e 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -335,7 +335,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (pseudoDeviceTemperature !== undefined) return; //Force w1 and file devices to a 10 minute refresh - if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 600; + if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 300; const device = getDevice({ host, log }); From d63fb7f24b18c700bab0fbf575dfdb9449057e36 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 14 Oct 2019 14:11:21 +1300 Subject: [PATCH 138/152] Added w1 and file temperatureUpdateFrequency support Coded with a minimum of 60 seconds to avoid high unnecessary disk IO - with default value of 10 for this parameter. --- accessories/aircon.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index e564327e..c61dd991 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -334,8 +334,11 @@ class AirConAccessory extends BroadlinkRMAccessory { if (pseudoDeviceTemperature !== undefined) return; - //Force w1 and file devices to a 10 minute refresh - if (w1DeviceID || temperatureFilePath) config.temperatureUpdateFrequency = 300; + //To avoid high disk IO set w1 and file temperature updates to a minimum of every 1 minute. + if ((w1DeviceID || temperatureFilePath) && config.temperatureUpdateFrequency < 60){ + log(`\x1b[36m[INFO]\x1b[0m ${name} temperatureUpdateFrequency below Disk IO minimum of 60, forced to 60 seconds.`); + config.temperatureUpdateFrequency = 60; + } const device = getDevice({ host, log }); From a5c1412291cadd8f296b86912fbc7c4814e03f75 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 15 Oct 2019 14:15:29 +1300 Subject: [PATCH 139/152] Removed IO based limits from w1 devices w1 devices read straight from the bus, no IO impact so no need to limit refresh interval --- accessories/aircon.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index c61dd991..768914a6 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -335,7 +335,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (pseudoDeviceTemperature !== undefined) return; //To avoid high disk IO set w1 and file temperature updates to a minimum of every 1 minute. - if ((w1DeviceID || temperatureFilePath) && config.temperatureUpdateFrequency < 60){ + if (temperatureFilePath && config.temperatureUpdateFrequency < 60){ log(`\x1b[36m[INFO]\x1b[0m ${name} temperatureUpdateFrequency below Disk IO minimum of 60, forced to 60 seconds.`); config.temperatureUpdateFrequency = 60; } @@ -362,7 +362,7 @@ class AirConAccessory extends BroadlinkRMAccessory { } onTemperature (temperature) { - const { config, host, log, name, state } = this; + const { config, host, log, debug, name, state } = this; const { minTemperature, maxTemperature, temperatureAdjustment } = config; // onTemperature is getting called twice. No known cause currently. @@ -373,7 +373,7 @@ class AirConAccessory extends BroadlinkRMAccessory { state.currentTemperature = temperature; - log(`${name} onTemperature (${temperature})`); + if (debug) log(`\x1b[34m[DEBUG]\x1b[0m ${name} onTemperature (${temperature})`); if (temperature > config.maxTemperature) { log(`\x1b[36m[INFO]\x1b[0m Reported temperature (${temperature}) is too high, setting to \x1b[33mmaxTemperature\x1b[0m (${maxTemperature}).`) From 9502b34d8025dc8f340d952b0cb368986c9ae09e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 11 Nov 2019 08:18:27 +1300 Subject: [PATCH 140/152] Improved ping error handling (#46) * Improved ping error handling Removed exception throw and treated as a non response to allow retries Fixes #45 --- helpers/getDevice.js | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 0c034384..305a3d49 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -13,8 +13,8 @@ const startPing = (device, log) => { try { ping.sys.probe(device.host.address, (active, err) => { if(err){ - log(`Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); - throw err; + log(`\x1b[31m[ERROR] \x1b[0m Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); + active = false; } if (!active && device.state === 'active' && retryCount === 2) { @@ -37,7 +37,7 @@ const startPing = (device, log) => { } }, {timeout: pingTimeout}) } catch (err) { - log(`Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); + log(`\x1b[31m[ERROR] \x1b[0m Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); } }, pingFrequency); } diff --git a/package.json b/package.json index 16779b05..9f046fe8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.1", + "version": "4.0.2", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 35b5812bab8abb728442c3285894afeccf2d15ea Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Wed, 20 Nov 2019 13:58:40 +1300 Subject: [PATCH 141/152] Fix for bug checking temperature from device (#52) * Re-enabled additional device temp check --- accessories/aircon.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 768914a6..8d4632f4 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -354,8 +354,8 @@ class AirConAccessory extends BroadlinkRMAccessory { log(`${name} monitorTemperature`); // this call appears to be creating duplicate calls and delaying status refreshes - // device.on('temperature', this.onTemperature.bind(this)); - // device.checkTemperature(); + device.on('temperature', this.onTemperature.bind(this)); + device.checkTemperature(); this.updateTemperatureUI(); if (!config.isUnitTest) setInterval(this.updateTemperatureUI.bind(this), config.temperatureUpdateFrequency * 1000) diff --git a/package.json b/package.json index 9f046fe8..d9890f5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.2", + "version": "4.0.3", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From ed29edc385d9e72e9b5b7a3739330462f1410bd4 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 21 Nov 2019 08:16:09 +1300 Subject: [PATCH 142/152] Added Error tag to discovery errors --- helpers/getDevice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 305a3d49..8338081a 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -18,7 +18,7 @@ const startPing = (device, log) => { } if (!active && device.state === 'active' && retryCount === 2) { - log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); + log(`\x1b[31m[ERROR] \x1b[0m Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); device.state = 'inactive'; retryCount = 0; From ab612ffd86e2cd794ca630d283d3cde4fc6580e2 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 13 Dec 2019 08:49:07 +1300 Subject: [PATCH 143/152] Retry when the device is offline (#59) * Fixed device state logic post changes * Improved status handling --- accessories/accessory.js | 3 +- accessories/aircon.js | 4 +-- accessories/switch.js | 2 +- helpers/getDevice.js | 43 +++++++++++----------- helpers/sendData.js | 77 ++++++++++++++++++++++++++++++++++------ package.json | 2 +- 6 files changed, 94 insertions(+), 37 deletions(-) diff --git a/accessories/accessory.js b/accessories/accessory.js index 79aceba6..6d053f02 100644 --- a/accessories/accessory.js +++ b/accessories/accessory.js @@ -51,7 +51,6 @@ class BroadlinkRMAccessory extends HomebridgeAccessory { // Itterate through each hex config in the array for (let index = 0; index < data.length; index++) { const { pause } = data[index]; - await this.performRepeatSend(data[index], actionCallback); if (pause) { @@ -65,7 +64,7 @@ class BroadlinkRMAccessory extends HomebridgeAccessory { async performRepeatSend (parentData, actionCallback) { const { host, log, name, debug } = this; let { data, interval, sendCount } = parentData; - + sendCount = sendCount || 1 if (sendCount > 1) interval = interval || 0.1; diff --git a/accessories/aircon.js b/accessories/aircon.js index 8d4632f4..0617f74a 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -436,8 +436,8 @@ class AirConAccessory extends BroadlinkRMAccessory { // If the device is no longer available, use previous tempeature const device = getDevice({ host, log }); - if (!device || device.state === 'inactive') { - if (device && device.state === 'inactive') { + if (!device || device.state !== 'active') { + if (device && device.state !== 'active') { log(`${name} addTemperatureCallbackToQueue (device no longer active, using existing temperature)`); } diff --git a/accessories/switch.js b/accessories/switch.js index a729850d..86f7e444 100644 --- a/accessories/switch.js +++ b/accessories/switch.js @@ -101,7 +101,7 @@ class SwitchAccessory extends BroadlinkRMAccessory { const { data, host, log, name, debug } = this; this.stateChangeInProgress = true; this.reset(); - + if (hexData) await this.performSend(hexData); this.checkAutoOnOff(); diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 8338081a..7302425b 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -3,11 +3,12 @@ const broadlink = require('./broadlink') const delayForDuration = require('./delayForDuration') const pingFrequency = 5000; -const pingTimeout = 5; +const pingTimeout = 3; +const pingRetries = 3; const startPing = (device, log) => { device.state = 'unknown'; - var retryCount = 1; + var retryCount = 0; setInterval(() => { try { @@ -17,24 +18,26 @@ const startPing = (device, log) => { active = false; } - if (!active && device.state === 'active' && retryCount === 2) { - log(`\x1b[31m[ERROR] \x1b[0m Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); - - device.state = 'inactive'; - retryCount = 0; - } else if (!active && device.state === 'active') { - if(broadlink.debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); - - retryCount += 1; - } else if (active && device.state !== 'active') { - if (device.state === 'inactive') log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); - - device.state = 'active'; - retryCount = 0; - } else if (active && retryCount !== 0 ) { - //Acive - reset retry counter - retryCount = 0; - } + if(active){ + if(device.state !== 'active') { + if (device.state === 'offline') log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) has been re-discovered.`); + device.state = 'active'; + retryCount = 0; + } + }else{ + if(retryCount > pingRetries && device.state !== 'offline'){ + //Last attempt, mark offline + log(`\x1b[31m[ERROR] \x1b[0m Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); + + device.state = 'offline'; + }else if(retryCount <= pingRetries){ + //Inital Attempts + if(broadlink.debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); + + device.state = 'inactive'; + retryCount += 1; + } + } }, {timeout: pingTimeout}) } catch (err) { log(`\x1b[31m[ERROR] \x1b[0m Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); diff --git a/helpers/sendData.js b/helpers/sendData.js index 5f87470b..2d233d3c 100644 --- a/helpers/sendData.js +++ b/helpers/sendData.js @@ -3,16 +3,23 @@ const assert = require('assert') const { getDevice } = require('./getDevice'); const convertProntoCode = require('./convertProntoCode') -module.exports = ({ host, hexData, log, name, debug }) => { +const retryInterval = 3000; +const retryCount = 6; + +const sendData = async ({host, hexData, log, name, debug}) => { + // Will return true on sucess and flase on failure assert(hexData && typeof hexData === 'string', `\x1b[31m[ERROR]: \x1b[0m${name} sendData (HEX value is missing)`); // Check for pronto code if (hexData.substring(0, 4) === '0000') { if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} sendHex (Converting Pronto code "${hexData}" to Broadlink code)`); - hexData = convertProntoCode(hexData) + hexData = convertProntoCode(hexData); if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} sendHex (Pronto code successfuly converted: "${hexData}")`); - - if (!hexData) return log(`\x1b[31m[ERROR] \x1b[0m${name} sendData (A Pronto code was detected however its conversion to a Broadlink code failed.)`); + + if (!hexData) { + log(`\x1b[31m[ERROR] \x1b[0m${name} sendData (A Pronto code was detected however its conversion to a Broadlink code failed.)`); + return false; + } } @@ -20,16 +27,64 @@ module.exports = ({ host, hexData, log, name, debug }) => { const device = getDevice({ host, log }); if (!device) { - if (!host) return log(`\x1b[31m[ERROR] \x1b[0m${name} sendData (no device found)`); + if (!host) { + log(`\x1b[31m[ERROR] \x1b[0m${name} sendData (no device found)`); + return false; + } + + log(`\x1b[31m[ERROR] \x1b[0m${name} sendData (no device found at ${host})`); + return false; + } - return log(`\x1b[31m[ERROR] \x1b[0m${name} sendData (no device found at ${host})`); + if (!device.sendData) { + log(`\x1b[31m[ERROR] \x1b[0mThe device at ${device.host.address} (${device.host.macAddress}) doesn't support the sending of IR or RF codes.`); + return false; + } + if (hexData.includes('5aa5aa555')) { + log(`\x1b[31m[ERROR] \x1b[0mThis type of hex code (5aa5aa555...) is no longer valid. Use the included "Learn Code" accessory to find new (decrypted) codes.`); + return false; } - if (!device.sendData) return log(`\x1b[31m[ERROR] \x1b[0mThe device at ${device.host.address} (${device.host.macAddress}) doesn't support the sending of IR or RF codes.`); - if (hexData.includes('5aa5aa555')) return log(`\x1b[31m[ERROR] \x1b[0mThis type of hex code (5aa5aa555...) is no longer valid. Use the included "Learn Code" accessory to find new (decrypted) codes.`); + waitForDevice(device, name, log, debug) + .then(() => { + const hexDataBuffer = new Buffer(hexData, 'hex'); + device.sendData(hexDataBuffer, debug, hexData); + log(`${name} sendHex (${device.host.address}; ${device.host.macAddress}) ${hexData}`); + return true; + }) + .catch(() => { + log(`\x1b[31m[ERROR] \x1b[0mThe device at ${device.host.address} (${device.host.macAddress}) is not available.`); + return false; + }); + + return false; +} + +const waitForDevice = (device, name, log, debug) => { + return new Promise(async (res, rej) => { + let count = 0; + + while (device.state !== 'active' && count < retryCount ) { + if(debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} Device ${device.state}, pausing (attempt ${count+1})...`); + count++; + + await wait(retryInterval); + } - const hexDataBuffer = new Buffer(hexData, 'hex'); - device.sendData(hexDataBuffer, debug, hexData); + if (count >= retryCount) { + rej(); + } - log(`${name} sendHex (${device.host.address}; ${device.host.macAddress}) ${hexData}`); + res(); + }); } + +const wait = delay => { + return new Promise(res => { + setTimeout(() => { + res(); + }, delay); + }); +} + +module.exports = sendData diff --git a/package.json b/package.json index d9890f5b..0c775cd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.3", + "version": "4.0.4", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 8609344c126e57ebab0889ab6e7b3b1a09a9c0ea Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Tue, 17 Dec 2019 09:04:46 +1300 Subject: [PATCH 144/152] Bug fix when falling back to 'classic mode' (#61) * Bug fix when falling back to 'classic mode' Was failing to load temperatureX hexcodes from config. Fixes #60 --- accessories/aircon.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 0617f74a..96688a46 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -283,7 +283,7 @@ class AirConAccessory extends BroadlinkRMAccessory { if (!hexData) { // Mode based code not found, try mode-less this.log(`${name} No ${mode} HEX code found for ${temperature}`); - let hexData = data[`temperature${temperature}`]; + hexData = data[`temperature${temperature}`]; } else { if (hexData['pseudo-mode']) { this.log(`\x1b[36m[INFO] \x1b[0m${name} Configuration found for ${mode}${temperature} with pseudo-mode. Pseudo-mode will replace the configured mode.`); diff --git a/package.json b/package.json index 0c775cd4..fae3a6f5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.4", + "version": "4.0.5", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { From 7a77ca32a9efc50f919879c96bacf416c0819d06 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Fri, 10 Jan 2020 10:54:05 +1300 Subject: [PATCH 145/152] Fixed Typo in TV message --- platform.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.js b/platform.js index 8f7e2a70..51d26555 100644 --- a/platform.js +++ b/platform.js @@ -83,7 +83,7 @@ const BroadlinkRMPlatform = class extends HomebridgePlatform { log(''); log(`**************************************************************************************************************`); - log(`You added more than TVs in your configuration!`); + log(`You added more than one TV in your configuration!`); log(`Due to a HomeKit limitation you need to add any additional TV to the Home app by using the Add Accessory function.`); log(`There you'll find your additional TVs and you can use the same PIN as you using for this HomeBridge instance.`); log(`**************************************************************************************************************`); From f1647f0e1a7d5d188781698e2748cc68308cc6ef Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 30 Jan 2020 11:44:29 +1300 Subject: [PATCH 146/152] Kiwi cam mergetest (#69) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Support various new RM Mini devices by updating to the latest broadlinkjs-rm library * Support for resetting to a default fan speed each time a fan is turned on "alwaysResetToDefaults": true, "defaultFanSpeed": 30, * Support for a “window” accessory that mimic the functionality of a window-covering * Added support for Air Purifier accessories * Added default state for lock controls * Added support for Humidifier/Dehumidifiers * Garage Door Opener - If the `autoCloseDelay` is set to `0`, set the Homekit state to closed immediately * Allow for separate commands for turning swing mode/oscillation on/off * Fixed a potential crash when learning RF data * Updated packages to resolve potential security issues. * Improvements to how ping’s work to improve performance and device re-discovery --- accessories/air-purifier.js | 144 + accessories/aircon.js | 9 +- accessories/fan.js | 27 +- accessories/garageDoorOpener.js | 6 + accessories/humidifier-dehumidifier.js | 178 + accessories/index.js | 8 +- accessories/outlet.js | 10 +- accessories/switch.js | 26 +- accessories/tv.js | 31 +- accessories/window.js | 50 + config-sample.json | 48 + helpers/getDevice.js | 41 +- helpers/learnData.js | 6 +- helpers/learnRFData.js | 12 +- helpers/ping.js | 19 +- helpers/sendData.js | 2 +- package-lock.json | 7067 +++++++++--------------- package.json | 19 +- platform.js | 6 + test/helpers/fakePing.js | 2 - yarn.lock | 3640 ------------ 21 files changed, 3190 insertions(+), 8161 deletions(-) create mode 100644 accessories/air-purifier.js create mode 100644 accessories/humidifier-dehumidifier.js create mode 100644 accessories/window.js delete mode 100644 yarn.lock diff --git a/accessories/air-purifier.js b/accessories/air-purifier.js new file mode 100644 index 00000000..eba4c82d --- /dev/null +++ b/accessories/air-purifier.js @@ -0,0 +1,144 @@ +const ServiceManagerTypes = require('../helpers/serviceManagerTypes'); + +const FanAccessory = require('./fan'); + +class AirPurifierAccessory extends FanAccessory { + + async setSwitchState (hexData, previousValue) { + super.setSwitchState(hexData, previousValue); + + this.updateCurrentState() + } + + // User requested a the target state be set + async setTargetState (hexData, previousValue) { + const { log, name, state, serviceManager } = this; + + // Ignore if no change to the targetPosition + if (state.targetState === previousValue) return; + + // Set the CurrentAirPurifierState to match the switch state + log(`${name} setTargetState: currently ${previousValue === 0 ? 'manual' : 'auto'}, changing to ${state.targetState === 0 ? 'manual' : 'auto'}`); + + await this.performSend(hexData); + } + + updateCurrentState() { + const { log, name, state, serviceManager } = this; + + if (state.switchState === true) { + log(`${name} updateCurrentState: changing to purifying`); + state.currentState = Characteristic.CurrentAirPurifierState.PURIFYING_AIR + + } else { + log(`${name} updateCurrentState: changing to idle`); + state.currentState = Characteristic.CurrentAirPurifierState.INACTIVE + } + + serviceManager.refreshCharacteristicUI(Characteristic.CurrentAirPurifierState); + } + + setupServiceManager () { + const { config, data, name, serviceManagerType } = this; + let { + showLockPhysicalControls, + showSwingMode, + showRotationDirection, + hideSwingMode, + hideRotationDirection + } = config; + + const { + on, + off, + targetStateManual, + targetStateAuto, + lockControls, + unlockControls, + swingToggle + } = data || {}; + + // Defaults + if (showLockPhysicalControls !== false) showLockPhysicalControls = true + if (showSwingMode !== false && hideSwingMode !== true) showSwingMode = true + if (showRotationDirection !== false && hideRotationDirection !== true) showRotationDirection = true + + this.serviceManager = new ServiceManagerTypes[serviceManagerType](name, Service.AirPurifier, this.log); + + this.serviceManager.addToggleCharacteristic({ + name: 'switchState', + type: Characteristic.On, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: on, + offData: off, + setValuePromise: this.setSwitchState.bind(this) + } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'currentState', + type: Characteristic.CurrentAirPurifierState, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'targetState', + type: Characteristic.TargetAirPurifierState, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: targetStateManual, + offData: targetStateAuto, + setValuePromise: this.setTargetState.bind(this) + } + }); + + if (showLockPhysicalControls) { + this.serviceManager.addToggleCharacteristic({ + name: 'lockPhysicalControls', + type: Characteristic.LockPhysicalControls, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: lockControls, + offData: unlockControls + } + }); + } + + if (showSwingMode) { + this.serviceManager.addToggleCharacteristic({ + name: 'swingMode', + type: Characteristic.SwingMode, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: swingToggle, + offData: swingToggle, + } + }); + } + + this.serviceManager.addToggleCharacteristic({ + name: 'fanSpeed', + type: Characteristic.RotationSpeed, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + setValuePromise: this.setFanSpeed.bind(this) + } + }); + } +} + +module.exports = AirPurifierAccessory; diff --git a/accessories/aircon.js b/accessories/aircon.js index 96688a46..415aac06 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -334,11 +334,8 @@ class AirConAccessory extends BroadlinkRMAccessory { if (pseudoDeviceTemperature !== undefined) return; - //To avoid high disk IO set w1 and file temperature updates to a minimum of every 1 minute. - if (temperatureFilePath && config.temperatureUpdateFrequency < 60){ - log(`\x1b[36m[INFO]\x1b[0m ${name} temperatureUpdateFrequency below Disk IO minimum of 60, forced to 60 seconds.`); - config.temperatureUpdateFrequency = 60; - } + // Ensure a minimum of a 60 seconds update frequency + const temperatureUpdateFrequency = Math.max(60, config.temperatureUpdateFrequency); const device = getDevice({ host, log }); @@ -358,7 +355,7 @@ class AirConAccessory extends BroadlinkRMAccessory { device.checkTemperature(); this.updateTemperatureUI(); - if (!config.isUnitTest) setInterval(this.updateTemperatureUI.bind(this), config.temperatureUpdateFrequency * 1000) + if (!config.isUnitTest) setInterval(this.updateTemperatureUI.bind(this), temperatureUpdateFrequency * 1000) } onTemperature (temperature) { diff --git a/accessories/fan.js b/accessories/fan.js index 054692c0..7ee63237 100644 --- a/accessories/fan.js +++ b/accessories/fan.js @@ -5,13 +5,33 @@ const SwitchAccessory = require('./switch'); class FanAccessory extends SwitchAccessory { async setSwitchState (hexData, previousValue) { + const { config, state, serviceManager } = this; + if (!this.state.switchState) { this.lastFanSpeed = undefined; } + // Reset the fan speed back to the default speed when turned off + if (this.state.switchState === false && config && config.alwaysResetToDefaults) { + this.setDefaults(); + serviceManager.setCharacteristic(Characteristic.RotationSpeed, state.fanSpeed); + } + super.setSwitchState(hexData, previousValue); } + setDefaults () { + super.setDefaults(); + + let { config, state } = this; + + // Reset the fan speed back to the default speed when turned off + // This will also be called whenever homebridge is restarted + if (config && config.alwaysResetToDefaults) { + state.fanSpeed = (config.defaultFanSpeed !== undefined) ? config.defaultFanSpeed : 100; + } + } + async setFanSpeed (hexData) { const { data, host, log, state, name, debug} = this; @@ -30,7 +50,6 @@ class FanAccessory extends SwitchAccessory { }) if (foundSpeeds.length === 0) { - return log(`${name} setFanSpeed: No fan speed hex codes provided.`) } @@ -55,7 +74,7 @@ class FanAccessory extends SwitchAccessory { setupServiceManager () { const { config, data, name, serviceManagerType } = this; let { showSwingMode, showRotationDirection, hideSwingMode, hideRotationDirection } = config; - const { on, off, clockwise, counterClockwise, swingToggle } = data || {}; + const { on, off, clockwise, counterClockwise, swingToggle, swingOn, swingOff } = data || {}; // Defaults if (showSwingMode !== false && hideSwingMode !== true) showSwingMode = true @@ -84,8 +103,8 @@ class FanAccessory extends SwitchAccessory { setMethod: this.setCharacteristicValue, bind: this, props: { - onData: swingToggle, - offData: swingToggle, + onData: swingOn || swingToggle, + offData: swingOff || swingToggle, } }); } diff --git a/accessories/garageDoorOpener.js b/accessories/garageDoorOpener.js index 5c4baaf2..8c39ba0e 100644 --- a/accessories/garageDoorOpener.js +++ b/accessories/garageDoorOpener.js @@ -69,6 +69,11 @@ class GarageDoorOpenerAccessory extends BroadlinkRMAccessory { log(`${name} setDoorCurrentState: opened`); serviceManager.setCharacteristic(Characteristic.CurrentDoorState, Characteristic.CurrentDoorState.OPEN); + // If the autoCloseDelay is set to 0, set the state to closed immediately. + if (autoCloseDelay === 0) { + serviceManager.setCharacteristic(Characteristic.TargetDoorState, Characteristic.TargetDoorState.CLOSED); + } + if (!autoCloseDelay) return; log(`${name} automatically closing in ${autoCloseDelay}s`); @@ -76,6 +81,7 @@ class GarageDoorOpenerAccessory extends BroadlinkRMAccessory { await this.autoCloseTimeoutPromise; serviceManager.setCharacteristic(Characteristic.TargetDoorState, Characteristic.TargetDoorState.CLOSED); + this.close() } diff --git a/accessories/humidifier-dehumidifier.js b/accessories/humidifier-dehumidifier.js new file mode 100644 index 00000000..ad3c58ac --- /dev/null +++ b/accessories/humidifier-dehumidifier.js @@ -0,0 +1,178 @@ +const ServiceManagerTypes = require('../helpers/serviceManagerTypes'); + +const FanAccessory = require('./fan'); + +class HumidifierDehumidifierAccessory extends FanAccessory { + + setDefaults () { + super.setDefaults(); + + this.updateRelativeHumidity() + } + + // User requested a the target state be set + async setTargetState (hexData, previousValue) { + const { log, name, state, serviceManager } = this; + + // Ignore if no change to the targetPosition + if (state.targetState === previousValue) return; + + // Set the CurrentHumidifierDehumidifierState to match the switch state + let currentState = Characteristic.CurrentHumidifierDehumidifierState.INACTIVE; + + if (state.targetState === Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER) { + currentState = Characteristic.CurrentHumidifierDehumidifierState.DEHUMIDIFYING + } else if (state.targetState === Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER) { + currentState = Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING + } else if (state.targetState === Characteristic.TargetHumidifierDehumidifierState.DEHUMIDIFIER) { + currentState = Characteristic.CurrentHumidifierDehumidifierState.DEHUMIDIFYING + } + + log(`${name} setTargetState: currently ${previousValue}, changing to ${state.targetState}`); + + state.currentState = currentState + serviceManager.refreshCharacteristicUI(Characteristic.CurrentHumidifierDehumidifierState); + + this.updateRelativeHumidity() + + await this.performSend(hexData); + } + + updateRelativeHumidity() { + let { serviceManager, state } = this; + + state.currentRelativeHumidity = 35 + state.targetRelativeHumidity = 5 + + if (state.targetState === Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER) { + state.currentRelativeHumidity = 5 + state.targetRelativeHumidity = 15 + } + + serviceManager.refreshCharacteristicUI(Characteristic.CurrentRelativeHumidity); + serviceManager.refreshCharacteristicUI(Characteristic.TargetRelativeHumidity); + } + + setupServiceManager () { + const { config, data, name, serviceManagerType } = this; + let { + showLockPhysicalControls, + showSwingMode, + showRotationDirection, + hideSwingMode, + hideRotationDirection + } = config; + + const { + on, + off, + targetStateHumidifier, + targetStateDehumidifier, + lockControls, + unlockControls, + swingToggle + } = data || {}; + + // Defaults + if (showLockPhysicalControls !== false) showLockPhysicalControls = true + if (showSwingMode !== false && hideSwingMode !== true) showSwingMode = true + if (showRotationDirection !== false && hideRotationDirection !== true) showRotationDirection = true + + this.serviceManager = new ServiceManagerTypes[serviceManagerType](name, Service.HumidifierDehumidifier, this.log); + + this.serviceManager.addToggleCharacteristic({ + name: 'switchState', + type: Characteristic.On, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: on, + offData: off, + setValuePromise: this.setSwitchState.bind(this) + } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'currentRelativeHumidity', + type: Characteristic.CurrentRelativeHumidity, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'targetRelativeHumidity', + type: Characteristic.TargetRelativeHumidity, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { } + }); + + + this.serviceManager.addToggleCharacteristic({ + name: 'currentState', + type: Characteristic.CurrentHumidifierDehumidifierState, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'targetState', + type: Characteristic.TargetHumidifierDehumidifierState, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: targetStateHumidifier, + offData: targetStateDehumidifier, + setValuePromise: this.setTargetState.bind(this) + } + }); + + if (showLockPhysicalControls) { + this.serviceManager.addToggleCharacteristic({ + name: 'lockPhysicalControls', + type: Characteristic.LockPhysicalControls, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: lockControls, + offData: unlockControls + } + }); + } + + if (showSwingMode) { + this.serviceManager.addToggleCharacteristic({ + name: 'swingMode', + type: Characteristic.SwingMode, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + onData: swingToggle, + offData: swingToggle, + } + }); + } + + this.serviceManager.addToggleCharacteristic({ + name: 'fanSpeed', + type: Characteristic.RotationSpeed, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + bind: this, + props: { + setValuePromise: this.setFanSpeed.bind(this) + } + }); + } +} + +module.exports = HumidifierDehumidifierAccessory; diff --git a/accessories/index.js b/accessories/index.js index 71238846..7bec21cf 100644 --- a/accessories/index.js +++ b/accessories/index.js @@ -1,4 +1,6 @@ const AirCon = require('./aircon'); +const AirPurifier = require('./air-purifier'); +const HumidifierDehumidifier = require('./humidifier-dehumidifier'); const LearnCode = require('./learnCode'); const Outlet = require('./outlet'); const Switch = require('./switch'); @@ -9,11 +11,14 @@ const Fan = require('./fan'); const GarageDoorOpener = require('./garageDoorOpener'); const Lock = require('./lock'); const Light = require('./light'); +const Window = require('./window'); const WindowCovering = require('./windowCovering'); const TV = require('./tv'); module.exports = { AirCon, + AirPurifier, + HumidifierDehumidifier, LearnCode, Switch, SwitchMulti, @@ -25,5 +30,6 @@ module.exports = { Lock, Light, WindowCovering, - TV + TV, + Window } diff --git a/accessories/outlet.js b/accessories/outlet.js index 94132099..4b2ab0b1 100644 --- a/accessories/outlet.js +++ b/accessories/outlet.js @@ -1,4 +1,3 @@ -const ping = require('ping'); const ServiceManagerTypes = require('../helpers/serviceManagerTypes'); const delayForDuration = require('../helpers/delayForDuration') @@ -8,16 +7,19 @@ class OutletAccessory extends SwitchAccessory { pingCallback (active) { const { config, state, serviceManager } = this; + const newState = active ? true : false; + + // Only update Homkit if the switch state haven changed. + if (previousState === newState) return if (config.pingIPAddressStateOnly) { - state.outletInUse = active ? true : false; + state.outletInUse = newState; serviceManager.refreshCharacteristicUI(Characteristic.OutletInUse) return } - const value = active ? true : false; - serviceManager.setCharacteristic(Characteristic.OutletInUse, value); + serviceManager.setCharacteristic(Characteristic.OutletInUse, newState); } setOutletInUse (value, callback) { diff --git a/accessories/switch.js b/accessories/switch.js index 86f7e444..fc045cd8 100644 --- a/accessories/switch.js +++ b/accessories/switch.js @@ -15,8 +15,9 @@ class SwitchAccessory extends BroadlinkRMAccessory { setDefaults () { const { config } = this; - config.pingFrequency = config.pingFrequency || 1; config.pingGrace = config.pingGrace || 10; + config.pingFrequency = config.pingFrequency || 2; + config.pingFrequency = Math.max(config.pingFrequency, 2); config.offDuration = config.offDuration || 60; config.onDuration = config.onDuration || 60; @@ -80,21 +81,36 @@ class SwitchAccessory extends BroadlinkRMAccessory { } pingCallback (active) { - const { config, state, serviceManager } = this; + let { debug, config, log, name, state, serviceManager } = this; + //debug = true + const previousState = state.switchState + const newState = active ? true : false; + + //Ping Grace period check if (this.stateChangeInProgress){ return; } + // Only update Homekit if the switch state haven changed. + const hasStateChanged = (previousState === newState) + if (debug || !hasStateChanged) log(`${name} pingCallback: state ${hasStateChanged ? 'not changed, ignoring' : 'changed'} (device ${newState ? 'active' : 'inactive'})`); + + if (hasStateChanged) return + if (config.pingIPAddressStateOnly) { - state.switchState = active ? true : false; + if (debug) log(`${name} pingCallback: UI updated only`); + + state.switchState = newState + serviceManager.refreshCharacteristicUI(Characteristic.On); return; } - const value = active ? true : false; - serviceManager.setCharacteristic(Characteristic.On, value); + if (debug) log(`${name} pingCallback: UI updated and command sent`); + + serviceManager.setCharacteristic(Characteristic.On, newState); } async setSwitchState (hexData) { diff --git a/accessories/tv.js b/accessories/tv.js index 51e98db9..b12fc42a 100644 --- a/accessories/tv.js +++ b/accessories/tv.js @@ -13,9 +13,9 @@ class TVAccessory extends BroadlinkRMAccessory { setDefaults() { const { config } = this; - config.pingFrequency = config.pingFrequency || 1; config.pingGrace = config.pingGrace || 10; - + config.pingFrequency = Math.max(config.pingFrequency, 2); + config.offDuration = config.offDuration || 60; config.onDuration = config.onDuration || 60; @@ -82,22 +82,37 @@ class TVAccessory extends BroadlinkRMAccessory { ping(pingIPAddress, pingFrequency, this.pingCallback.bind(this)); } - pingCallback(active) { - const { config, state, serviceManager } = this; - + pingCallback (active) { + let { debug, config, log, name, state, serviceManager } = this; + //debug = true + + const previousState = state.switchState + const newState = active ? true : false; + + //Ping Grace period check if (this.stateChangeInProgress){ return; } + + // Only update Homkit if the switch state haven changed. + const hasStateChanged = (previousState === newState) + if (debug || !hasStateChanged) log(`${name} pingCallback: state ${hasStateChanged ? 'not changed, ignoring' : 'changed'} (device ${newState ? 'active' : 'inactive'})`); + if (hasStateChanged) return + if (config.pingIPAddressStateOnly) { - state.switchState = active ? true : false; + if (debug) log(`${name} pingCallback: UI updated only`); + + state.switchState = newState + serviceManager.refreshCharacteristicUI(Characteristic.Active); return; } + + if (debug) log(`${name} pingCallback: UI updated and command sent`); - const value = active ? true : false; - serviceManager.setCharacteristic(Characteristic.Active, value); + serviceManager.setCharacteristic(Characteristic.Active, newState); } async setSwitchState(hexData) { diff --git a/accessories/window.js b/accessories/window.js new file mode 100644 index 00000000..36ad533a --- /dev/null +++ b/accessories/window.js @@ -0,0 +1,50 @@ +const { assert } = require('chai'); + +const delayForDuration = require('../helpers/delayForDuration'); +const ServiceManagerTypes = require('../helpers/serviceManagerTypes'); +const catchDelayCancelError = require('../helpers/catchDelayCancelError'); +const WindowCoveringAccessory = require('./windowCovering'); + +class WindowAccessory extends WindowCoveringAccessory { + + setupServiceManager () { + const { data, log, name, serviceManagerType } = this; + + this.serviceManager = new ServiceManagerTypes[serviceManagerType](name, Service.Window, log); + + this.serviceManager.addToggleCharacteristic({ + name: 'currentPosition', + type: Characteristic.CurrentPosition, + bind: this, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + props: { + + } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'positionState', + type: Characteristic.PositionState, + bind: this, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + props: { + + } + }); + + this.serviceManager.addToggleCharacteristic({ + name: 'targetPosition', + type: Characteristic.TargetPosition, + bind: this, + getMethod: this.getCharacteristicValue, + setMethod: this.setCharacteristicValue, + props: { + setValuePromise: this.setTargetPosition.bind(this) + } + }); + } +} + +module.exports = WindowCoveringAccessory; diff --git a/config-sample.json b/config-sample.json index c1e3b93d..9556360c 100644 --- a/config-sample.json +++ b/config-sample.json @@ -206,6 +206,54 @@ "name":"A/C Auto Switch", "type":"switch" }, + { + "name":"Air Purifier", + "type":"air-purifier", + "showLockPhysicalControls": true, + "data":{ + "on":"2600500000012...", + "off":"2600500000012...", + "targetStateManual": "2600500000012...", + "targetStateAuto": "2600500000012...", + "lockControls": "2600500000012...", + "unlockControls": "2600500000012...", + "swingToggle": "2600500000012...", + "fanSpeed10": "2600500000012...", + "fanSpeed20": "2600500000012...", + "fanSpeed30": "2600500000012...", + "fanSpeed40": "2600500000012...", + "fanSpeed50": "2600500000012...", + "fanSpeed60": "2600500000012...", + "fanSpeed70": "2600500000012...", + "fanSpeed80": "2600500000012...", + "fanSpeed90": "2600500000012...", + "fanSpeed100": "2600500000012..." + } + }, + { + "name":"Humidifier Dehumidifier", + "type":"humidifier-dehumidifier", + "showLockPhysicalControls": true, + "data":{ + "on":"2600500000012...", + "off":"2600500000012...", + "targetStateHumidifier": "2600500000012...", + "targetStateDehumidifier": "2600500000012...", + "lockControls": "2600500000012...", + "unlockControls": "2600500000012...", + "swingToggle": "2600500000012...", + "fanSpeed10": "2600500000012...", + "fanSpeed20": "2600500000012...", + "fanSpeed30": "2600500000012...", + "fanSpeed40": "2600500000012...", + "fanSpeed50": "2600500000012...", + "fanSpeed60": "2600500000012...", + "fanSpeed70": "2600500000012...", + "fanSpeed80": "2600500000012...", + "fanSpeed90": "2600500000012...", + "fanSpeed100": "2600500000012..." + } + }, { "name": "Fan", "type": "fan", diff --git a/helpers/getDevice.js b/helpers/getDevice.js index 7302425b..9f6665f4 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -1,21 +1,46 @@ -const ping = require('ping'); const broadlink = require('./broadlink') const delayForDuration = require('./delayForDuration') -const pingFrequency = 5000; const pingTimeout = 3; const pingRetries = 3; +const pingFrequency = 5000; // 5s + +let ping + +const setupPing = (log) => { + if (ping) return + + try { + ping = require('net-ping').createSession({ + retries: 3, + timeout: 2000 + }); + } catch (err) { + if (err.message.includes('was compiled against a different Node.js version')) { + log(`Broadlink RM won't detect device failures due to a version conflict with "net-ping". Please run "npm r homebridge-broadlink-rm -g && npm i homebridge-broadlink-rm -g" to resolve.`); + } else if (err.message.includes('Operation not permitted')) { + log(`Broadlink RM won't detect device failures due to a permissions issues with "net-ping".\n\nTo fix:\n\n 1. Run "which node" to determine your node path.\n2. Run "sudo setcap cap_net_raw+ep /path/to/node".\n\nNote: Replacing /path/to/node with the path you found in the first step.`); + } else { + log(err.message); + } + } +} const startPing = (device, log) => { + setupPing(log) + + if (!ping) return + device.state = 'unknown'; var retryCount = 0; setInterval(() => { try { - ping.sys.probe(device.host.address, (active, err) => { + ping.pingHost(device.host.address, (err, target) => { if(err){ - log(`\x1b[31m[ERROR] \x1b[0m Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); - active = false; + active = false; + }else{ + active = true; } if(active){ @@ -27,12 +52,12 @@ const startPing = (device, log) => { }else{ if(retryCount > pingRetries && device.state !== 'offline'){ //Last attempt, mark offline - log(`\x1b[31m[ERROR] \x1b[0m Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable after three attempts.`); + log(`\x1b[31m[ERROR] \x1b[0m Broadlink RM device is no longer reachable after three attempts (${target}, ${err.message}).`); device.state = 'offline'; }else if(retryCount <= pingRetries){ //Inital Attempts - if(broadlink.debug) log(`Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}) is no longer reachable. (attempt ${retryCount})`); + if(broadlink.debug) log(`Broadlink RM device is no longer reachable. (${target}, ${err.message}, attempt: ${retryCount})`); device.state = 'inactive'; retryCount += 1; @@ -40,7 +65,7 @@ const startPing = (device, log) => { } }, {timeout: pingTimeout}) } catch (err) { - log(`\x1b[31m[ERROR] \x1b[0m Error pinging Broadlink RM device at ${device.host.address} (${device.host.macAddress || ''}): ${err}`); + log(`\x1b[31m[ERROR] \x1b[0m Error pinging Broadlink RM device (${target}, ${err.message})`); } }, pingFrequency); } diff --git a/helpers/learnData.js b/helpers/learnData.js index a7d7a600..89266920 100644 --- a/helpers/learnData.js +++ b/helpers/learnData.js @@ -15,7 +15,9 @@ const stop = (log) => { } const start = (host, callback, turnOffCallback, log, disableTimeout) => { - stop() + stop(log); + + log(`\x1b[35m[INFO]\x1b[0m Learn Code initializing (${host})`); // Get the Broadlink device const device = getDevice({ host, log, learnOnly: true }); @@ -23,7 +25,7 @@ const start = (host, callback, turnOffCallback, log, disableTimeout) => { return log(`\x1b[31m[ERROR]\x1b[0m Learn Code (Couldn't learn code, device not found)`); } - if (!device.enterLearning) return log(`\x1b[31m[ERROR]\x1b[0m Learn Code (IR learning not supported for device at ${host})`); + if (!device.enterLearning) return log(`\x1b[31m[ERROR]\x1b[0m Learn Code (IR learning not supported for device at ${host}))`); let onRawData; diff --git a/helpers/learnRFData.js b/helpers/learnRFData.js index e22a2e59..e673d1a1 100644 --- a/helpers/learnRFData.js +++ b/helpers/learnRFData.js @@ -18,6 +18,8 @@ const stop = (log, device) => { if (currentDevice) currentDevice.cancelLearn(); setTimeout(() => { + if (!closeClient) return; + closeClient(); closeClient = null; isClosingClient = false; @@ -70,19 +72,17 @@ const start = (host, callback, turnOffCallback, log, disableTimeout) => { getDataTimeout = null; log(`\x1b[35m[INFO]\x1b[0m Scan RF (found frequency - 1 of 2)`); - - if (device.type === 0x279d || device.type === 0x27a9) { - return device.enterLearning(); - } - log(`\x1b[35m[ACTION]\x1b[0m Keep holding that button!`) getDataTimeout2 = setTimeout(() => { getData2(device); }, 1000); + + + return device.enterLearning(); }; - onRawData2 = (message) => { + onRawData2 = () => { if (!closeClient) return; if (getDataTimeout2) clearTimeout(getDataTimeout2); diff --git a/helpers/ping.js b/helpers/ping.js index 705dbf23..2028beaf 100644 --- a/helpers/ping.js +++ b/helpers/ping.js @@ -1,14 +1,17 @@ -const ping = require('ping'); +let ping const pingIPAddress = (ipAddress, interval, callback) => { + if (!ping) { + ping = require('net-ping').createSession({ + retries: 0, + timeout: 1000 + }); + } + setInterval(() => { - try { - ping.sys.probe(ipAddress, (isActive) => { - callback(isActive) - }) - } catch (err) { - callback(false) - } + ping.pingHost(ipAddress, (error) => { + callback(!error) + }) }, interval * 1000); } diff --git a/helpers/sendData.js b/helpers/sendData.js index 2d233d3c..38a5d1f4 100644 --- a/helpers/sendData.js +++ b/helpers/sendData.js @@ -13,7 +13,7 @@ const sendData = async ({host, hexData, log, name, debug}) => { // Check for pronto code if (hexData.substring(0, 4) === '0000') { if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} sendHex (Converting Pronto code "${hexData}" to Broadlink code)`); - hexData = convertProntoCode(hexData); + hexData = convertProntoCode(hexData, log) if (debug) log(`\x1b[33m[DEBUG]\x1b[0m ${name} sendHex (Pronto code successfuly converted: "${hexData}")`); if (!hexData) { diff --git a/package-lock.json b/package-lock.json index 23f28f4e..df0a7a11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,86 +1,204 @@ { "name": "homebridge-broadlink-rm", - "version": "3.3.6", + "version": "3.6.11", "lockfileVersion": 1, "requires": true, "dependencies": { - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@iarna/toml": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.3.tgz", + "integrity": "sha512-FmuxfCuolpLl0AnQ2NHSzoUKWEJDFl63qXjzdoWBVyFCXzMGm1spBzk7LeHNoVCiWCF7mRVms9e6jEV9+MoPbg==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@octokit/endpoint": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz", + "integrity": "sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/request": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.1.tgz", + "integrity": "sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==", + "dev": true, + "requires": { + "@octokit/endpoint": "^5.5.0", + "@octokit/request-error": "^1.0.1", + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "is-plain-object": "^3.0.0", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/request-error": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.0.tgz", + "integrity": "sha512-DNBhROBYjjV/I9n7A8kVkmQNkqFAMem90dSxqvPq57e2hBr7mNTX98y3R2zDpqMQHVRpBDjsvsfIGgBzy+4PAg==", "dev": true, "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" } }, "@octokit/rest": { - "version": "14.0.9", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-14.0.9.tgz", - "integrity": "sha512-irP9phKfTXEZIcW2R+VNCtGHZJrXMWmSYp6RRfFn4BtAqtDRXF5z9JxCEQlAhNBf6X1koNi5k49tIAAAEJNlVQ==", + "version": "16.33.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.33.0.tgz", + "integrity": "sha512-t4jMR+odsfooQwmHiREoTQixVTX2DfdbSaO+lKrW9R5XBuk0DW+5T/JdfwtxAGUAHgvDDpWY/NVVDfEPTzxD6g==", + "dev": true, + "requires": { + "@octokit/request": "^5.0.0", + "@octokit/request-error": "^1.0.2", + "atob-lite": "^2.0.0", + "before-after-hook": "^2.0.0", + "btoa-lite": "^1.0.0", + "deprecation": "^2.0.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "once": "^1.4.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.0.2.tgz", + "integrity": "sha512-StASIL2lgT3TRjxv17z9pAqbnI7HGu9DrJlg3sEBFfCLaMEqp+O3IQPUF6EZtQ4xkAu2ml6kMBBCtGxjvmtmuQ==", "dev": true, "requires": { - "before-after-hook": "1.1.0", - "debug": "3.1.0", - "is-array-buffer": "1.0.0", - "is-stream": "1.1.0", - "lodash": "4.17.5", - "url-template": "2.0.8" + "@types/node": ">= 8" } }, "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, - "@types/node": { - "version": "7.0.57", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.57.tgz", - "integrity": "sha512-Iikf0IAus1OX++3Jrc1R2bsZggO+m22G5ee56JccYKejx5GNT3nHhY8v6J4OXId1hXXlb0n45hcaVwZwQcZZ6w==" - }, - "JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "defer-to-connect": "^1.0.1" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.2.tgz", + "integrity": "sha512-B8emQA1qeKerqd1dmIsQYnXi+mmAzTB7flExjmy5X1aVAKFNNNDubkavwR13kR6JnpeLp3aLoJhwn9trWPAyFQ==", "dev": true }, "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -91,4841 +209,2844 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "async-retry": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", + "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", "dev": true, "requires": { - "array-uniq": "1.0.3" + "retry": "0.12.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", "dev": true }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" - }, - "assign-symbols": { + "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "before-after-hook": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, - "async-retry": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.1.tgz", - "integrity": "sha512-FadV8UDcyZDjzb6eV7MCJj0bfrNjwKw7/X0QHPFCbYP6T20FXgZCYXpJKlQC8RxEQP1E6Xs8pNHdh3bcrZAuAw==", - "dev": true, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { - "retry": "0.10.1" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "boxen": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-regex": "^4.1.0" } - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true } } }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "fill-range": "^7.0.1" } }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } + "broadlinkjs-rm": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/broadlinkjs-rm/-/broadlinkjs-rm-0.7.5.tgz", + "integrity": "sha512-2QunPph7o79aLLvBQjM3+bi6BsccavpnzZ1d7a9xD5ijxYRYiLnJ0NOszbG+5ReFsyQtZ70n1y3CvvRIbAUr/A==" }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + } } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, + "callback-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", + "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "inherits": "^2.0.1", + "readable-stream": "> 1.0.0 < 3.0.0" } }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "callsites": "^2.0.0" } }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "caller-callsite": "^2.0.0" } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "requires": { - "babel-runtime": "6.26.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "changelog-filename-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/changelog-filename-regex/-/changelog-filename-regex-1.1.2.tgz", + "integrity": "sha512-kpOfKlZ9x2UpeC4at6FAXHLKfi/JEUqUqkPCb1JUCa5FnNbJIzOHRM9RfeQ1QDcpj+Gxuc/UoHqASgmEeFDejQ==", "dev": true }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "restore-cursor": "^3.1.0" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "dev": true }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "mimic-response": "^1.0.0" } }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "color-name": "1.1.3" } }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "delayed-stream": "~1.0.0" } }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, + "commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", "requires": { - "babel-runtime": "6.26.0" + "leven": "^2.1.0", + "minimist": "^1.1.0" } }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "ms": "^2.1.1" } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "mimic-response": "^1.0.0" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "requires": { - "babel-runtime": "6.26.0" + "type-detect": "^4.0.0" } }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "clone": "^1.0.2" } }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "defer-to-connect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", + "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "object-keys": "^1.0.12" } }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "is-descriptor": "^1.0.0" } }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deprecated-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deprecated-obj/-/deprecated-obj-1.0.1.tgz", + "integrity": "sha512-igs766xNtF7Fv/R//gT644e6dr+bT6kJrg+qyJA9affCyvf70UUNKIUIMUSROBg1sPUrBnENPsDdDHcBLI5wFQ==", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "flat": "^4.1.0", + "lodash": "^4.17.11" } }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "detect-repo-changelog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-repo-changelog/-/detect-repo-changelog-1.0.1.tgz", + "integrity": "sha1-whCMu/CWTae8B0ZFtq0dO4CmvW0=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "changelog-filename-regex": "^1.1.0", + "is-regular-file": "^1.0.1", + "lodash.find": "^4.6.0", + "pify": "^2.3.0" } }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "path-type": "^4.0.0" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "is-obj": "^1.0.0" } }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "dev": true, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.3", - "invariant": "2.2.4", - "semver": "5.5.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "once": "^1.4.0" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "is-arrayish": "^0.2.1" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "ms": "2.0.0" + "d": "1", + "es5-ext": "~0.10.14" } } } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "pump": "^3.0.0" } } } }, - "before-after-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.1.0.tgz", - "integrity": "sha512-VOMDtYPwLbIncTxNoSzRyvaMxtXmLWLUqr8k5AfC1BzLk34HvBXaQX8snOwQZ4c0aX8aSERqtJSiI9/m2u5kuA==", - "dev": true - }, - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "type": "^2.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" } } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } }, - "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "fast-glob": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", + "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-glob": "^4.0.1" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, - "broadlinkjs-rm": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/broadlinkjs-rm/-/broadlinkjs-rm-0.5.3.tgz", - "integrity": "sha512-XXpKGcgAP+E2qmaEkTCj/TaWMyvsNCfHv+qqNxxmlWHdZuF4FnQ2t6l368YvnVu8q41Qov6VP27OEKpmti+36A==", + "fastq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", + "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "dev": true, "requires": { - "@types/node": "7.0.57" + "reusify": "^1.0.0" } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000814", - "electron-to-chromium": "1.3.37" + "escape-string-regexp": "^1.0.5" } }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bump-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bump-file/-/bump-file-1.0.0.tgz", - "integrity": "sha512-mUN6TDIkvDmE6gNlgMDiLl95qcgfqQ5Hu8HZDFk4AW3t9xBcKoasHlMcjV+1C6jmRRX4G2WySML0JGauRzFKaw==", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "detect-indent": "5.0.0", - "semver": "5.4.1" - }, - "dependencies": { - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - } + "to-regex-range": "^5.0.1" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "find-key": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-key/-/find-key-2.1.3.tgz", + "integrity": "sha512-pKOJBDgB3NJKdSDcYfDxgiXR/ojk5OB3gRepCoWfas3nU6e8LcFIlJQbQ+y7VIoc55KaDKDakpTzR6iISKwFfg==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "locate-path": "^3.0.0" } }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "dev": true, "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" + "is-buffer": "~2.0.3" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dev": true, "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "caniuse-lite": { - "version": "1.0.30000814", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000814.tgz", - "integrity": "sha512-Kt4dBhVlnTZ+jj+C8Bd4WT6RT4EJoX5/tlktHQfpqIMgLVrG1KBQlLf010ipMvuNrpQiAJ2A54e6MMbA0BaKxg==", + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "git-up": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", "dev": true, - "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" } }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "git-url-parse": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "git-up": "^4.0.0" } }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, + "github-version-checker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/github-version-checker/-/github-version-checker-1.2.0.tgz", + "integrity": "sha1-JdkXCukHlBhvDaZ5ws+mfb1EDnI=", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "chalk": "^1.1.3", + "coffeescript": "^1.12.7", + "got": "^7.1.0", + "semver": "^5.4.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "color-convert": "1.9.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "has-flag": "3.0.0" + "prepend-http": "^1.0.1" } } } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" - }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", - "dev": true + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-extglob": "^2.1.0" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "ini": "^1.3.4" } }, - "cli-spinners": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", - "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=", - "dev": true - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", "dev": true, - "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, - "optional": true + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } } } }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { - "mimic-response": "1.0.0" + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + } } }, - "coffeescript": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "function-bind": "^1.1.1" } }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "color-name": "1.1.3" + "ansi-regex": "^2.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "requires": { - "array-ify": "1.0.0", - "dot-prop": "3.0.0" + "has-symbol-support-x": "^1.4.1" } }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", - "dev": true, + "help-me": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", + "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" + "callback-stream": "^1.0.2", + "glob-stream": "^6.1.0", + "through2": "^2.0.1", + "xtend": "^4.0.0" } }, - "configstore": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", - "dev": true, + "homebridge-platform-helper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/homebridge-platform-helper/-/homebridge-platform-helper-1.2.1.tgz", + "integrity": "sha512-K+WVbR+ydohV+98Op+lQI2U05udfkcQRpoLCkms1AunWH5jPwWqnfi9PwqiiPEWHjqu7US0ro4N3JhVQruxuqA==", "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "mqtt": "^3.0.0", + "node-persist": "^2.0.10", + "semver": "^7.1.1", + "uuid": "^3.3.3" }, "dependencies": { - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } + "semver": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", + "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" } } }, - "conventional-changelog": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.18.tgz", - "integrity": "sha512-swf5bqhm7PsY2cw6zxuPy6+rZiiGwEpQnrWki+L+z2oZI53QSYwU4brpljmmWss821AsiwmVL+7V6hP+ER+TBA==", - "dev": true, - "requires": { - "conventional-changelog-angular": "1.6.6", - "conventional-changelog-atom": "0.2.4", - "conventional-changelog-codemirror": "0.3.4", - "conventional-changelog-core": "2.0.5", - "conventional-changelog-ember": "0.3.6", - "conventional-changelog-eslint": "1.0.5", - "conventional-changelog-express": "0.3.4", - "conventional-changelog-jquery": "0.1.0", - "conventional-changelog-jscs": "0.1.0", - "conventional-changelog-jshint": "0.3.4", - "conventional-changelog-preset-loader": "1.1.6" - } - }, - "conventional-changelog-angular": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", - "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", + "dev": true }, - "conventional-changelog-atom": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.4.tgz", - "integrity": "sha512-4+hmbBwcAwx1XzDZ4aEOxk/ONU0iay10G0u/sld16ksgnRUHN7CxmZollm3FFaptr6VADMq1qxomA+JlpblBlg==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } + "safer-buffer": ">= 2.1.2 < 3" } }, - "conventional-changelog-codemirror": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.4.tgz", - "integrity": "sha512-8M7pGgQVzRU//vG3rFlLYqqBywOLxu9XM0/lc1/1Ll7RuKA79PgK9TDpuPmQDHFnqGS7D1YiZpC3Z0D9AIYExg==", - "dev": true, - "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true }, - "conventional-changelog-core": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.5.tgz", - "integrity": "sha512-lP1s7Z3NyEFcG78bWy7GG7nXsq9OpAJgo2xbyAlVBDweLSL5ghvyEZlkEamnAQpIUVK0CAVhs8nPvCiQuXT/VA==", + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", "dev": true, "requires": { - "conventional-changelog-writer": "3.0.4", - "conventional-commits-parser": "2.1.5", - "dateformat": "3.0.3", - "get-pkg-repo": "1.4.0", - "git-raw-commits": "1.3.4", - "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.3.4", - "lodash": "4.17.5", - "normalize-package-data": "2.4.0", - "q": "1.5.1", - "read-pkg": "1.1.0", - "read-pkg-up": "1.0.1", - "through2": "2.0.3" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } + "import-from": "^3.0.0" } }, - "conventional-changelog-ember": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.6.tgz", - "integrity": "sha512-hBM1xb5IrjNtsjXaGryPF/Wn36cwyjkNeqX/CIDbJv/1kRFBHsWoSPYBiNVEpg8xE5fcK4DbPhGTDN2sVoPeiA==", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, - "conventional-changelog-eslint": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.5.tgz", - "integrity": "sha512-7NUv+gMOS8Y49uPFRgF7kuLZqpnrKa2bQMZZsc62NzvaJmjUktnV03PYHuXhTDEHt5guvV9gyEFtUpgHCDkojg==", + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, "requires": { - "q": "1.5.1" + "resolve-from": "^5.0.0" }, "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "conventional-changelog-express": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.4.tgz", - "integrity": "sha512-M+UUb715TXT6l9vyMf4HYvAepnQn0AYTcPi6KHrFsd80E0HErjQnqStBg8i3+Qm7EV9+RyATQEnIhSzHbdQ7+A==", - "dev": true, - "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, - "conventional-changelog-jquery": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", - "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", - "dev": true, - "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, - "conventional-changelog-jscs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", - "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", - "dev": true, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } + "once": "^1.3.0", + "wrappy": "1" } }, - "conventional-changelog-jshint": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.4.tgz", - "integrity": "sha512-CdrqwDgL56b176FVxHmhuOvnO1dRDQvrMaHyuIVjcFlOXukATz2wVT17g8jQU3LvybVbyXvJRbdD5pboo7/1KQ==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" }, "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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 + }, + "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 + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } } } }, - "conventional-changelog-preset-loader": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.6.tgz", - "integrity": "sha512-yWPIP9wwsCKeUSPYApnApWhKIDjWRIX/uHejGS1tYfEsQR/bwpDFET7LYiHT+ujNbrlf6h1s3NlPGheOd4yJRQ==", + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "conventional-changelog-writer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.4.tgz", - "integrity": "sha512-EUf/hWiEj3IOa5Jk8XDzM6oS0WgijlYGkUfLc+mDnLH9RwpZqhYIBwgJHWHzEB4My013wx2FhmUu45P6tQrucw==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.5", - "dateformat": "3.0.3", - "handlebars": "4.0.11", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.5", - "meow": "4.0.0", - "semver": "5.5.0", - "split": "1.0.1", - "through2": "2.0.3" - } - }, - "conventional-commits-filter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.5.tgz", - "integrity": "sha512-mj3+WLj8UZE72zO9jocZjx8+W4Bwnx/KHoIz1vb4F8XUXj0XSjp8Y3MFkpRyIpsRiCBX+DkDjxGKF/nfeu7BGw==", - "dev": true, - "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.0" - } - }, - "conventional-commits-parser": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.5.tgz", - "integrity": "sha512-jaAP61py+ISMF3/n3yIiIuY5h6mJlucOqawu5mLB1HaQADLvg/y5UB3pT7HSucZJan34lp7+7ylQPfbKEGmxrA==", - "dev": true, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "requires": { - "JSONStream": "1.3.2", - "is-text-path": "1.0.1", - "lodash": "4.17.5", - "meow": "4.0.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "conventional-recommended-bump": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-2.0.6.tgz", - "integrity": "sha512-deb55+yFNqNjWvIU8Xe6EJZnp09/Q014rmJmGX3VtnIczyb8rD+RhGXpV5Mene6BFrlGuyHRlsn5e6kYXoIyOw==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "concat-stream": "1.6.1", - "conventional-changelog-preset-loader": "1.1.6", - "conventional-commits-filter": "1.1.5", - "conventional-commits-parser": "2.1.5", - "git-raw-commits": "1.3.4", - "git-semver-tags": "1.3.4", - "meow": "4.0.0", - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } + "kind-of": "^6.0.0" } }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, - "cp-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-5.0.0.tgz", - "integrity": "sha1-vHAP0wyjLSTUbH+wK5kuQ1/FqXg=", + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "nested-error-stacks": "2.0.0", - "pify": "3.0.0", - "safe-buffer": "5.1.1" + "ci-info": "^2.0.0" } }, - "cpy": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-6.0.0.tgz", - "integrity": "sha512-7uBKHhKOFgjCVx6Vv2gx/LqdrM9F7l0vunzmyS3CdStn3U02H1ehhS1SCpZ1qJFZqPi40IMUWAPkN/nQ4RXAiA==", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "arrify": "1.0.1", - "cp-file": "5.0.0", - "globby": "6.1.0", - "nested-error-stacks": "2.0.0" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "kind-of": "^6.0.0" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.0" - } + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "curve25519-n2": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/curve25519-n2/-/curve25519-n2-1.1.3.tgz", - "integrity": "sha1-TLBYjs+327wL+zLQoARjKW7m7+I=", - "dev": true, - "requires": { - "bindings": "1.2.1", - "nan": "2.9.2" - } + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "is-extglob": "^2.1.1" } }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "ms": "2.0.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "1.2.0", - "map-obj": "1.0.1" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" }, - "decimal.js": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.5.1.tgz", - "integrity": "sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ==", + "is-npm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "1.0.0" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "requires": { - "type-detect": "4.0.8" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "1.0.3" - } + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "path-is-inside": "^1.0.1" } }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", "dev": true, "requires": { - "repeating": "2.0.1" + "isobject": "^4.0.0" } }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" - } - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "has": "^1.0.3" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "is-regular-file": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regular-file/-/is-regular-file-1.1.1.tgz", + "integrity": "sha512-+1U3MZrVwC4HM6VUKk3L5fiHtNd2d9kayzEJhmQ+B+uIBPE/p8Fy8QVdkx0HIr3o9J5TOKJY40eI5GfTfBqbdA==", + "dev": true }, - "ed25519": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/ed25519/-/ed25519-0.0.4.tgz", - "integrity": "sha1-5WIYrOL8kD0llZOu8LKpY59HW+s=", - "dev": true, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "requires": { - "bindings": "1.2.1", - "nan": "2.9.2" + "is-unc-path": "^1.0.0" } }, - "electron-to-chromium": { - "version": "1.3.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.37.tgz", - "integrity": "sha1-SpJzTgBEyM8LFVO+V+riGkxuX6s=", - "dev": true + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, - "error-ex": { + "is-ssh": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "protocols": "^1.1.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fast-glob": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", - "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.1", - "micromatch": "3.1.9" - } - }, - "fast-srp-hap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", - "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "2.6.0", - "meow": "3.7.0", - "normalize-package-data": "2.4.0", - "parse-github-repo-url": "1.4.1", - "through2": "2.0.3" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "git-raw-commits": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.4.tgz", - "integrity": "sha512-G3O+41xHbscpgL5nA0DUkbFVgaAz5rd57AMSIMew8p7C8SyFwZDyn08MoXHkTl9zcD0LmxsLFPxbqFY4YPbpPA==", - "dev": true, - "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "4.0.0", - "split2": "2.2.0", - "through2": "2.0.3" - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "1.0.0", - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "git-semver-tags": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.4.tgz", - "integrity": "sha512-Xe2Z74MwXZfAezuaO6e6cA4nsgeCiARPzaBp23gma325c/OXdt//PhrknptIaynNeUp2yWtmikV7k5RIicgGIQ==", - "dev": true, - "requires": { - "meow": "4.0.0", - "semver": "5.5.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "github-version-checker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/github-version-checker/-/github-version-checker-1.2.0.tgz", - "integrity": "sha1-JdkXCukHlBhvDaZ5ws+mfb1EDnI=", - "requires": { - "chalk": "1.1.3", - "coffeescript": "1.12.7", - "got": "7.1.0", - "semver": "5.5.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "got": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/got/-/got-8.2.0.tgz", - "integrity": "sha512-giadqJpXIwjY+ZsuWys8p2yjZGhOHiU4hiJHjS/oeCxw1u8vANQz3zPlrxW2Zw/siCXsSMI3hvzWGcnFyujyAg==", - "dev": true, - "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "mimic-response": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "hap-nodejs": { - "version": "0.4.41", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.4.41.tgz", - "integrity": "sha512-Yw7tkLEQYxXjM+g3MW4TVZRuGlqUiKRHod82Zqa+pYCVD2NNzzOFk37lk8op/qohj52iEoss8seS6rksa8pdcg==", - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "curve25519-n2": "1.1.3", - "debug": "2.6.9", - "decimal.js": "7.5.1", - "ed25519": "0.0.4", - "fast-srp-hap": "1.0.1", - "ip": "1.1.5", - "mdns": "2.3.4", - "node-persist": "0.0.11" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "node-persist": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", - "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", - "dev": true, - "requires": { - "mkdirp": "0.5.1", - "q": "1.1.2" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "1.4.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "homebridge-platform-helper": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/homebridge-platform-helper/-/homebridge-platform-helper-1.0.7.tgz", - "integrity": "sha512-WJ0bq7lU6xLu0ORMKVuHPKZsIsUt7o40gYPbbb2pZkV17re/yHf5NYVfW7LpvaHxKLmvUfhfLkYmNDhuZzDUvw==", - "requires": { - "node-persist": "2.1.0", - "semver": "5.5.0", - "uuid": "3.2.1" - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.1.0.tgz", - "integrity": "sha512-kn7N70US1MSZHZHSGJLiZ7iCwwncc7b0gc68YtlX29OjI3Mp0tSVV+snVXpZ1G+ONS3Ac9zd1m6hve2ibLDYfA==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.7", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "is-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-1.0.0.tgz", - "integrity": "sha512-KtzJzWuC1kZQ377GJbEsoBh0LuQh1uaZnQg8oL2LcDkY/Ny8rpAzu21Ls3oph3SEKXbnrLHt3rAUVm28iuEPfw==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", - "dev": true, - "requires": { - "ci-info": "1.1.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "requires": { - "is-unc-path": "0.1.2" - } - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "1.7.0" - } - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "requires": { - "unc-path-regex": "0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "4.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "2.3.2" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "macos-release": { + "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", - "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", - "dev": true - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "mdns": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/mdns/-/mdns-2.3.4.tgz", - "integrity": "sha512-Z4WTKeTukCtJG53SS3BGNnsGkHdIXNZa9nwGMYeoohU1AjEBPS3c/1vIx95SEfeQKYduuOMTo1E4RfXDUt2ZYg==", - "dev": true, - "requires": { - "bindings": "1.2.1", - "nan": "2.3.5" - }, - "dependencies": { - "nan": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz", - "integrity": "sha1-gioNwmYpDOTNOhIoLKPn42Rmigg=", - "dev": true - } - } - }, - "meow": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", - "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.4.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - } - } - }, - "merge2": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", - "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", - "dev": true - }, - "micromatch": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", - "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "is-plain-obj": "1.1.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "mocha": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.1.tgz", - "integrity": "sha512-SpwyojlnE/WRBNGtvJSNfllfm5PqEDFxcWluSIgLeSBJtXG4DmoX2NNAeEA7rP5kK+79VgtVq8nG6HskaL1ykg==", + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "has-symbols": "^1.0.1" } }, - "modify-values": { + "is-unc-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.0.tgz", - "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI=", - "dev": true + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "nan": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", - "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "dev": true }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, - "nested-error-stacks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.0.tgz", - "integrity": "sha1-mLL/rvtGEPo5NvHnFDXTBwDeKEA=", + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "inherits": "2.0.3" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "node-persist": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-2.1.0.tgz", - "integrity": "sha1-5lK784haBNrWo1PXQXYXfIORRwc=", - "requires": { - "is-absolute": "0.2.6", - "mkdirp": "0.5.1", - "q": "1.1.2" - } + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "json-buffer": "3.0.0" } }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dev": true, "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" + "package-json": "^6.3.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "path-key": "2.0.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "wrappy": "1.0.2" + "chalk": "^2.0.1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "ora": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-2.0.0.tgz", - "integrity": "sha512-g+IR0nMUXq1k4nE3gkENbN4wkF0XsVZFyxznTF6CdmwQ9qeTGONGpSR9LM5//1l0TVvJoJF3MkMtJp6slUsWFg==", + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-spinners": "1.1.0", - "log-symbols": "2.2.0", - "strip-ansi": "4.0.0", - "wcwidth": "1.0.1" + "pify": "^3.0.0" }, "dependencies": { - "ansi-regex": { + "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } } } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", "dev": true }, - "os-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", - "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "macos-release": "1.1.0", - "win-release": "1.1.1" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "p-try": "1.0.0" + "mime-db": "1.40.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "p-limit": "1.2.0" + "brace-expansion": "^1.1.7" } }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "p-finally": "1.0.0" + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "mocha": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", + "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.0", + "yargs-parser": "13.1.1", + "yargs-unparser": "1.6.0" }, "dependencies": { - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, + "mqtt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-3.0.0.tgz", + "integrity": "sha512-0nKV6MAc1ibKZwaZQUTb3iIdT4NVpj541BsYrqrGBcQdQ7Jd0MnZD1/6/nj1UFdGTboK9ZEUXvkCu2nPCugHFA==", "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.1" + "base64-js": "^1.3.0", + "commist": "^1.0.0", + "concat-stream": "^1.6.2", + "end-of-stream": "^1.4.1", + "es6-map": "^0.1.5", + "help-me": "^1.0.1", + "inherits": "^2.0.3", + "minimist": "^1.2.0", + "mqtt-packet": "^6.0.0", + "pump": "^3.0.0", + "readable-stream": "^2.3.6", + "reinterval": "^1.1.0", + "split2": "^3.1.0", + "websocket-stream": "^5.1.2", + "xtend": "^4.0.1" } }, - "parse-repo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/parse-repo/-/parse-repo-1.0.4.tgz", - "integrity": "sha1-dLkdLLhnXRG5mXagBl9s4X+hvMg=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "mqtt-packet": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.3.0.tgz", + "integrity": "sha512-TjusSKu8uFZCmGZU8K6r4C3Ic+er/4r8rva+Mp5GQgWg/KjSdAfLK/GTucBwkdATE2Z0Da8AssI2WHzs0M9W0w==", + "requires": { + "bl": "^1.2.2", + "inherits": "^2.0.3", + "process-nextick-args": "^2.0.0", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "net-ping": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/net-ping/-/net-ping-1.2.3.tgz", + "integrity": "sha512-ZKxj/kVPKL2RIsV9nR6I8nMT8Pi3k6ciTBKxD/6gd5lga9qcNmlyqNv+dbXqYGBvHsmG9yIpsfajr8X054x2fQ==", + "requires": { + "raw-socket": "*" + } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, - "path-parse": { + "nice-try": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { - "pify": "3.0.0" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, - "ping": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ping/-/ping-0.2.2.tgz", - "integrity": "sha1-GA+3UIwdx0eThJvONcgHP5llvOI=", + "node-persist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-2.1.0.tgz", + "integrity": "sha1-5lK784haBNrWo1PXQXYXfIORRwc=", "requires": { - "q": "1.1.2", - "underscore": "1.8.3" + "is-absolute": "^0.2.6", + "mkdirp": "~0.5.1", + "q": "~1.1.1" + }, + "dependencies": { + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "requires": { + "is-unc-path": "^0.1.1" + } + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "requires": { + "unc-path-regex": "^0.1.0" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + } } }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "pinkie": "2.0.4" + "path-key": "^2.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "q": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", - "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=" + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "quick-lru": { + "octokit-pagination-methods": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", "dev": true }, - "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "mimic-fn": "^2.1.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "ora": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", + "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" }, "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "chalk": "^2.4.2" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "is-utf8": "0.2.1" + "ansi-regex": "^4.1.0" } } } }, - "read-pkg-up": { + "ordered-read-streams": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - } + "readable-stream": "^2.0.1" } }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "resolve": "1.5.0" + "p-try": "^2.0.0" } }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" + "p-limit": "^2.0.0" } }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "parse-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" } }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "parse-url": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", "dev": true, "requires": { - "rc": "1.2.6", - "safe-buffer": "5.1.1" + "is-ssh": "^1.3.0", + "normalize-url": "^3.3.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" } }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "1.2.6" - } + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "release-it": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-7.2.1.tgz", - "integrity": "sha512-qbMzEhjrqst4aDiE+ninF9Pe7m4jkJ2uA2yZwqDU4idU3kXKGLDSXjHJ+UEV4hGcSP7dF8xjgXdcygRd07N7SQ==", - "dev": true, - "requires": { - "@octokit/rest": "14.0.9", - "async-retry": "1.2.1", - "babel-preset-env": "1.6.1", - "babel-register": "6.26.0", - "bump-file": "1.0.0", - "chalk": "2.3.2", - "conventional-changelog": "1.1.18", - "conventional-recommended-bump": "2.0.6", - "cpy": "6.0.0", - "debug": "3.1.0", - "globby": "8.0.1", - "got": "8.2.0", - "inquirer": "5.1.0", - "is-ci": "1.1.0", - "lodash": "4.17.5", - "mime-types": "2.1.18", - "ora": "2.0.0", - "os-name": "2.0.1", - "parse-repo": "1.0.4", - "semver": "5.5.0", - "shelljs": "0.8.1", - "supports-color": "5.3.0", - "tmp-promise": "1.0.4", - "update-notifier": "2.3.0", - "uuid": "3.2.1", - "window-size": "1.1.0", - "yargs-parser": "9.0.2" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, + "ping": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ping/-/ping-0.2.2.tgz", + "integrity": "sha1-GA+3UIwdx0eThJvONcgHP5llvOI=", "requires": { - "lowercase-keys": "1.0.0" + "q": "1.x", + "underscore": "^1.8.3" } }, - "restore-cursor": { + "prepend-http": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "protocols": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", "dev": true }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "align-text": "0.1.4" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "requires": { - "is-promise": "2.1.0" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, - "rxjs": { - "version": "5.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.7.tgz", - "integrity": "sha512-Hxo2ac8gRQjwjtKgukMIwBRbq5+KAeEV5hXM4obYBOAghev41bDQWgFH4svYiU9UnQ5kNww2LgfyBdevCd2HXA==", - "dev": true, + "q": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", + "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=" + }, + "raw-socket": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/raw-socket/-/raw-socket-1.7.0.tgz", + "integrity": "sha512-mXqWihgwaFNmV5le0dWk5o+03M3A2zBIkC9BNaE6R0CJN9eYot++j2FIqgNSDq6/Vmu32PPI155SiiWNV2yyFQ==", "requires": { - "symbol-observable": "1.0.1" + "nan": "2.14.*" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "ret": "0.1.15" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "semver": "5.5.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } + "resolve": "^1.1.6" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "registry-auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", + "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "rc": "^1.2.8", + "safe-buffer": "^5.0.1" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", - "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "rc": "^1.2.8" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "release-it": { + "version": "12.4.3", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-12.4.3.tgz", + "integrity": "sha512-nQMzrAhlNg7LM7c9+4QkDtwzU/cOZeWmqsevzkp/FILSGIu3wjmQ63iSeBuZi1gpscjvJJy8/cCxhnHKczy1RQ==", + "dev": true, + "requires": { + "@iarna/toml": "2.2.3", + "@octokit/rest": "16.33.0", + "async-retry": "1.2.3", + "chalk": "2.4.2", + "cosmiconfig": "5.2.1", + "debug": "4.1.1", + "deprecated-obj": "1.0.1", + "detect-repo-changelog": "1.0.1", + "find-up": "4.1.0", + "form-data": "2.5.1", + "git-url-parse": "11.1.2", + "globby": "10.0.1", + "got": "9.6.0", + "import-cwd": "3.0.0", + "inquirer": "7.0.0", + "is-ci": "2.0.0", + "lodash": "4.17.15", + "mime-types": "2.1.24", + "ora": "4.0.2", + "os-name": "3.1.0", + "semver": "6.3.0", + "shelljs": "0.8.3", + "supports-color": "7.1.0", + "update-notifier": "3.0.1", + "url-join": "4.0.1", + "uuid": "3.3.3", + "window-size": "1.1.1", + "yargs-parser": "15.0.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "p-locate": "^4.1.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } + "p-limit": "^2.2.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "has-flag": "^4.0.0" } }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, - "sort-keys": { + "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", + "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "path-parse": "^1.0.6" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "lowercase-keys": "^1.0.0" } }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "source-map": "0.5.7" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "is-promise": "^2.1.0" } }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "tslib": "^1.9.0" } }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2.3.8" - } + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "semver": "^5.0.3" } }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "through2": "2.0.3" + "shebang-regex": "^1.0.0" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "split2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", + "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true } } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -4940,18 +3061,37 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -4959,27 +3099,15 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -4987,35 +3115,51 @@ "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^3.0.0" } }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } } }, - "text-extensions": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", - "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5023,13 +3167,21 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" + "through2": "~2.0.0", + "xtend": "~4.0.0" } }, "timed-out": { @@ -5043,103 +3195,64 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, - "tmp-promise": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.0.4.tgz", - "integrity": "sha512-76r7LZhAvRJ3kLD/xrPSEGb3aq0tirzMLJKhcchKSkQIiEgXB+RouC0ygReuZX+oiA64taGo+j+1gHTKSG8/Mg==", - "dev": true, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "requires": { - "bluebird": "3.5.1", - "tmp": "0.0.33" + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^7.0.0" } }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "unc-path-regex": { "version": "0.1.2", @@ -5151,39 +3264,13 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" } }, "unique-string": { @@ -5192,76 +3279,42 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "universal-user-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.0.tgz", + "integrity": "sha512-eM8knLpev67iBDizr/YtqkJsF3GK8gzDc6st/WKzrTuPtcsOKW/0IdL4cnMBsU69pOx0otavLWBDGTwg+dB0aA==", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "os-name": "^3.1.0" } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, "update-notifier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", - "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.3.2", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "url-parse-lax": { @@ -5270,57 +3323,23 @@ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dev": true, "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^2.0.0" } }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true - }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "wcwidth": { "version": "1.0.1", @@ -5328,78 +3347,179 @@ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "dev": true, "requires": { - "defaults": "1.0.3" + "defaults": "^1.0.3" + } + }, + "websocket-stream": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.0.tgz", + "integrity": "sha512-EXy/zXb9kNHI07TIMz1oIUIrPZxQRA8aeJ5XYg5ihV8K4kD1DuA+FY6R96HfdIHzlSzS8HiISAfrm+vVQkZBug==", + "requires": { + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "^3.2.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } } }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, - "widest-line": { + "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^1.0.2 || 2" } }, - "win-release": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", - "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "semver": "5.5.0" + "string-width": "^2.1.1" } }, "window-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.0.tgz", - "integrity": "sha1-O0AtMkTzVWHbLJdhrZ0eUoawei0=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz", + "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==", "dev": true, "requires": { - "define-property": "1.0.0", - "is-number": "3.0.0" + "define-property": "^1.0.0", + "is-number": "^3.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-buffer": "^1.1.5" } } } }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "windows-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "dev": true, + "requires": { + "execa": "^1.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, "xdg-basedir": { @@ -5409,9 +3529,14 @@ "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { @@ -5421,42 +3546,70 @@ "dev": true }, "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, - "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" }, "dependencies": { - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "optional": true + "requires": { + "ansi-regex": "^4.1.0" + } } } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" } } } diff --git a/package.json b/package.json index fae3a6f5..39b76747 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.0.5", + "version": "4.1.0", + "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", "scripts": { @@ -24,18 +25,18 @@ "url": "git@github.com:AlexanderBabel/homebridge-broadlink-rm.git" }, "dependencies": { - "broadlinkjs-rm": "^0.6.0", - "chai": "^4.1.2", + "broadlinkjs-rm": "^0.7.5", + "chai": "^4.2.0", "find-key": "^2.0.1", "github-version-checker": "^1.2.0", - "homebridge-platform-helper": "1.1.1", + "homebridge-platform-helper": "1.2.1", + "net-ping": "^1.2.3", "ping": "^0.2.2", - "uuid": "^3.2.1", - "compare-versions": "^3.4.0" + "compare-versions": "^3.4.0", + "uuid": "^3.3.3" }, "devDependencies": { - "hap-nodejs": "^0.4.41", - "mocha": "^5.0.1", - "release-it": "^7.2.1" + "mocha": "^6.2.2", + "release-it": "^12.4.3" } } diff --git a/platform.js b/platform.js index 51d26555..3f72dba6 100644 --- a/platform.js +++ b/platform.js @@ -10,6 +10,8 @@ const { createAccessory } = require('./helpers/accessoryCreator'); const classTypes = { 'air-conditioner': Accessory.AirCon, + 'air-purifier': Accessory.AirPurifier, + 'humidifier-dehumidifier': Accessory.HumidifierDehumidifier, 'learn-ir': Accessory.LearnCode, 'learn-code': Accessory.LearnCode, 'switch': Accessory.Switch, @@ -21,6 +23,7 @@ const classTypes = { 'fan': Accessory.Fan, 'outlet': Accessory.Outlet, 'light': Accessory.Light, + 'window': Accessory.Window, 'window-covering': Accessory.WindowCovering, 'tv': Accessory.TV } @@ -61,6 +64,9 @@ const BroadlinkRMPlatform = class extends HomebridgePlatform { // Iterate through the config accessories let tvs = []; config.accessories.forEach((accessory) => { + // Optionally hide the accessory from Homekit + if (accessory.ignore === true) return + if (!accessory.type) throw new Error(`Each accessory must be configured with a "type". e.g. "switch"`); if (!classTypes[accessory.type]) throw new Error(`homebridge-broadlink-rm doesn't support accessories of type "${accessory.type}".`); diff --git a/test/helpers/fakePing.js b/test/helpers/fakePing.js index d1a7bbc2..2ee40f6b 100644 --- a/test/helpers/fakePing.js +++ b/test/helpers/fakePing.js @@ -1,5 +1,3 @@ -const ping = require('ping'); - const pingIPAddress = function (ipAddress, interval, callback) { performPing(this.isActive, callback) diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 00273d95..00000000 --- a/yarn.lock +++ /dev/null @@ -1,3640 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@octokit/rest@14.0.9": - version "14.0.9" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-14.0.9.tgz#d5e0a00dcb78901dd7b2ef852acfc0aea7c479ef" - dependencies: - before-after-hook "^1.1.0" - debug "^3.1.0" - is-array-buffer "^1.0.0" - is-stream "^1.1.0" - lodash "^4.17.4" - url-template "^2.0.8" - -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - -"@types/node@^7.0.5": - version "7.0.57" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.57.tgz#eed149b2c75cdbd7b9823c3fd64ecddbdc68ed9c" - -JSONStream@^1.0.4: - version "1.3.2" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - dependencies: - string-width "^2.0.0" - -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async-retry@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.1.tgz#308c6c4e1d91e63397a4676290334ae9bda7bcb1" - dependencies: - retry "0.10.1" - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@6.26.0, babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -basic-utils@^1.6.0: - version "1.7.4" - resolved "https://registry.yarnpkg.com/basic-utils/-/basic-utils-1.7.4.tgz#b710a47db43daff50724c0e1ea4247e1e6d49946" - dependencies: - deep-freeze "0.0.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - -before-after-hook@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a" - -bindings@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" - -bindings@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" - -bl@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bluebird@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - kind-of "^6.0.2" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -broadlinkjs-rm@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/broadlinkjs-rm/-/broadlinkjs-rm-0.6.0.tgz#f173b87b8641657fcd830af368419da90f16bf7c" - dependencies: - "@types/node" "^7.0.5" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - -browserslist@^2.1.2: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" - -buffer-from@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -bump-file@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bump-file/-/bump-file-1.0.0.tgz#892880ef8af84c8df8d94cc2829ef18811503247" - dependencies: - detect-indent "5.0.0" - semver "5.4.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - -callback-stream@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/callback-stream/-/callback-stream-1.1.0.tgz#4701a51266f06e06eaa71fc17233822d875f4908" - dependencies: - inherits "^2.0.1" - readable-stream "> 1.0.0 < 3.0.0" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -caniuse-lite@^1.0.30000792: - version "1.0.30000819" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000819.tgz#aabee5fd15a080febab6ae5d30c9ea15f4c6d4e2" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - -chalk@2.3.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-spinners@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -clone-response@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - -coffeescript@^1.12.7: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -commander@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - -commist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/commist/-/commist-1.0.0.tgz#c0c352501cf6f52e9124e3ef89c9806e2022ebef" - dependencies: - leven "^1.0.0" - minimist "^1.1.0" - -compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - dependencies: - array-ify "^1.0.0" - dot-prop "^3.0.0" - -compare-versions@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" - integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.6.0, concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -conventional-changelog-angular@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-atom@^0.2.4: - version "0.2.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.2.5.tgz#456fb0245965cb41b38dbc558829aaeadf678ed2" - dependencies: - q "^1.5.1" - -conventional-changelog-codemirror@^0.3.4: - version "0.3.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.5.tgz#3e82f128912c86c1e1e0f1dab5ce745d0c2a78a8" - dependencies: - q "^1.5.1" - -conventional-changelog-core@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.6.tgz#a750621cfb943c9c990c95d5ae8f18fc35be38fa" - dependencies: - conventional-changelog-writer "^3.0.5" - conventional-commits-parser "^2.1.6" - dateformat "^3.0.0" - get-pkg-repo "^1.0.0" - git-raw-commits "^1.3.5" - git-remote-origin-url "^2.0.0" - git-semver-tags "^1.3.5" - lodash "^4.2.1" - normalize-package-data "^2.3.5" - q "^1.5.1" - read-pkg "^1.1.0" - read-pkg-up "^1.0.1" - through2 "^2.0.0" - -conventional-changelog-ember@^0.3.6: - version "0.3.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.3.7.tgz#096a14794e054fc08dde055364e98aaee8b1a8c4" - dependencies: - q "^1.5.1" - -conventional-changelog-eslint@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.6.tgz#e9060f450ec8d63c671e54bd471e0502ee19183f" - dependencies: - q "^1.5.1" - -conventional-changelog-express@^0.3.4: - version "0.3.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.3.5.tgz#b01b9f9a8f2d4e37bbafec7cc7d9c0b0570f6b26" - dependencies: - q "^1.5.1" - -conventional-changelog-jquery@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" - dependencies: - q "^1.4.1" - -conventional-changelog-jscs@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" - dependencies: - q "^1.4.1" - -conventional-changelog-jshint@^0.3.4: - version "0.3.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.5.tgz#ae9fadbeb9b05cd305e665efd0df54dfb19a00f9" - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-preset-loader@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.7.tgz#58a7ef85f980ca17f1373dc222ff449606222fb6" - -conventional-changelog-writer@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.5.tgz#d7ce157209c55057a2487e645193a2e6b9027943" - dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^1.1.6" - dateformat "^3.0.0" - handlebars "^4.0.2" - json-stringify-safe "^5.0.1" - lodash "^4.2.1" - meow "^4.0.0" - semver "^5.5.0" - split "^1.0.0" - through2 "^2.0.0" - -conventional-changelog@1.1.18: - version "1.1.18" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.18.tgz#ffe28798e4ddef5f6e2f74398e8248bcb233360b" - dependencies: - conventional-changelog-angular "^1.6.6" - conventional-changelog-atom "^0.2.4" - conventional-changelog-codemirror "^0.3.4" - conventional-changelog-core "^2.0.5" - conventional-changelog-ember "^0.3.6" - conventional-changelog-eslint "^1.0.5" - conventional-changelog-express "^0.3.4" - conventional-changelog-jquery "^0.1.0" - conventional-changelog-jscs "^0.1.0" - conventional-changelog-jshint "^0.3.4" - conventional-changelog-preset-loader "^1.1.6" - -conventional-commits-filter@^1.1.5, conventional-commits-filter@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831" - dependencies: - is-subset "^0.1.1" - modify-values "^1.0.0" - -conventional-commits-parser@^2.1.5, conventional-commits-parser@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.6.tgz#e594bbd8342d3e6758aa0344ca074719d69a7dc0" - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.0" - lodash "^4.2.1" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - trim-off-newlines "^1.0.0" - -conventional-recommended-bump@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-2.0.6.tgz#ba21d51b191fa1eb1fdff34ef9bc831443fb66d4" - dependencies: - concat-stream "^1.6.0" - conventional-changelog-preset-loader "^1.1.6" - conventional-commits-filter "^1.1.5" - conventional-commits-parser "^2.1.5" - git-raw-commits "^1.3.4" - git-semver-tags "^1.3.4" - meow "^4.0.0" - q "^1.5.1" - -convert-source-map@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cp-file@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-5.0.0.tgz#bc700fd30ca32d24d46c7fb02b992e435fc5a978" - dependencies: - graceful-fs "^4.1.2" - make-dir "^1.0.0" - nested-error-stacks "^2.0.0" - pify "^3.0.0" - safe-buffer "^5.0.1" - -cpy@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-6.0.0.tgz#0b6888e037bb5a7b02a62249551316208a523253" - dependencies: - arrify "^1.0.1" - cp-file "^5.0.0" - globby "^6.0.0" - nested-error-stacks "^2.0.0" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -curve25519-n2@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/curve25519-n2/-/curve25519-n2-1.1.3.tgz#4cb0588ecfb7dbbc0bfb32d0a00463296ee6efe2" - dependencies: - bindings "~1.2.1" - nan "^2.0.9" - -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - dependencies: - number-is-nan "^1.0.0" - -dateformat@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - -debug@3.1.0, debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decimal.js@^7.2.3: - version "7.5.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-7.5.1.tgz#cf4cf5eeb9faa24fc4ee6af361faebb7bfcca2ce" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - dependencies: - mimic-response "^1.0.0" - -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - dependencies: - type-detect "^4.0.0" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -deep-freeze@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -detect-indent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - dependencies: - is-obj "^1.0.0" - -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - dependencies: - is-obj "^1.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -duplexify@^3.5.1, duplexify@^3.5.3: - version "3.5.4" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ed25519@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/ed25519/-/ed25519-0.0.4.tgz#e56218ace2fc903d259593aef0b2a9639f475beb" - dependencies: - bindings "^1.2.1" - nan "^2.0.9" - -electron-to-chromium@^1.3.30: - version "1.3.40" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz#1fbd6d97befd72b8a6f921dc38d22413d2f6fddf" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-glob@^2.0.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.0.tgz#e9d032a69b86bef46fc03d935408f02fb211d9fc" - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.1" - micromatch "^3.1.8" - -fast-srp-hap@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz#377124d196bc6a5157aae5b37bf5fa35bb4ad2d9" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/find-key/-/find-key-2.0.1.tgz#e985c95e0089787290d9a0512e139888c13f102b" - dependencies: - basic-utils "^1.6.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" - through2 "^2.0.0" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -git-raw-commits@^1.3.4, git-raw-commits@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.5.tgz#0951ae8dc80e5cee8ef54934db4ef65a6d161c60" - dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - -git-remote-origin-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - dependencies: - gitconfiglocal "^1.0.0" - pify "^2.3.0" - -git-semver-tags@^1.3.4, git-semver-tags@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.5.tgz#b803e8ee36c09e8cec3e9441f5bac292fd163c18" - dependencies: - meow "^4.0.0" - semver "^5.5.0" - -gitconfiglocal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - dependencies: - ini "^1.3.2" - -github-version-checker@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/github-version-checker/-/github-version-checker-1.2.0.tgz#25d9170ae90794186f0da679c2cfa67dbd440e72" - dependencies: - chalk "^1.1.3" - coffeescript "^1.12.7" - got "^7.1.0" - semver "^5.4.1" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" - is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - -glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - dependencies: - ini "^1.3.4" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -got@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/got/-/got-8.2.0.tgz#0d11a071d05046348a2f5c0a5fa047fb687fdfc6" - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -growl@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" - -handlebars@^4.0.2: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - -hap-nodejs@^0.4.41: - version "0.4.41" - resolved "https://registry.yarnpkg.com/hap-nodejs/-/hap-nodejs-0.4.41.tgz#af0dc07fbc5e0d48998cbcf38717adea077336b2" - dependencies: - buffer-shims "^1.0.0" - curve25519-n2 "^1.1.2" - debug "^2.2.0" - decimal.js "^7.2.3" - ed25519 "^0.0.4" - fast-srp-hap "^1.0.1" - ip "^1.1.3" - mdns "^2.3.3" - node-persist "^0.0.11" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - dependencies: - has-symbol-support-x "^1.4.1" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -help-me@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/help-me/-/help-me-1.1.0.tgz#8f2d508d0600b4a456da2f086556e7e5c056a3c6" - dependencies: - callback-stream "^1.0.2" - glob-stream "^6.1.0" - through2 "^2.0.1" - xtend "^4.0.0" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homebridge-platform-helper@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/homebridge-platform-helper/-/homebridge-platform-helper-1.1.1.tgz#a7304e52ad1f95c32a4b27b0d7ec9a253a15fb91" - integrity sha512-Zepvj+lFMjd6rKyhLZ4njf3UbENhbRZ1gdFaPUcfbtEbwskCJ4p4+LW16BSkoPEMsijhLbQXOC43r5ice9+MwA== - dependencies: - mqtt "^2.17.0" - node-persist "^2.0.10" - semver "^5.3.0" - uuid "^3.2.1" - -hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" - -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - -iconv-lite@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -ignore@^3.3.5: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.1.0.tgz#19da508931892328abbbdd4c477f1efc65abfd67" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.1.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^5.5.2" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -ip@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - -is-absolute@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-1.0.0.tgz#f32497a0509d109423f472003f98bab6a8ea34cb" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-ci@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - dependencies: - ci-info "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-negated-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - dependencies: - is-unc-path "^1.0.0" - -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-subset@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - -is-text-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - dependencies: - text-extensions "^1.0.0" - -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" - dependencies: - unc-path-regex "^0.1.0" - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - dependencies: - unc-path-regex "^0.1.2" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - -json-parse-better-errors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" - -json-stable-stringify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - dependencies: - json-buffer "3.0.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - dependencies: - package-json "^4.0.0" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -leven@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash.template@^4.0.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash@4.17.5, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" - -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - dependencies: - chalk "^2.0.1" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - -lru-cache@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -macos-release@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" - -make-dir@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" - dependencies: - pify "^3.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -mdns@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/mdns/-/mdns-2.3.4.tgz#650380ac76089430cf6c8981a945dbd27d02f5b7" - dependencies: - bindings "~1.2.1" - nan "~2.3.0" - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -meow@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d" - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - -merge2@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.1.tgz#271d2516ff52d4af7f7b710b8bf3e16e183fef66" - -micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^5.0.1: - version "5.0.5" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.5.tgz#e228e3386b9387a4710007a641f127b00be44b52" - dependencies: - browser-stdout "1.3.1" - commander "2.11.0" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.3" - he "1.1.1" - mkdirp "0.5.1" - supports-color "4.4.0" - -modify-values@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" - -mqtt-packet@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/mqtt-packet/-/mqtt-packet-5.5.0.tgz#7f53244ba49fdecf795e950c14a9432dbf33bc63" - dependencies: - bl "^1.2.1" - inherits "^2.0.3" - process-nextick-args "^2.0.0" - safe-buffer "^5.1.0" - -mqtt@^2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-2.17.0.tgz#5630718a6bfe297e768ea1966df5b55fb0eb414b" - dependencies: - commist "^1.0.0" - concat-stream "^1.6.2" - end-of-stream "^1.4.1" - help-me "^1.0.1" - inherits "^2.0.3" - minimist "^1.2.0" - mqtt-packet "^5.5.0" - pump "^3.0.0" - readable-stream "^2.3.5" - reinterval "^1.1.0" - split2 "^2.1.1" - websocket-stream "^5.1.2" - xtend "^4.0.1" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -nan@^2.0.9: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nan@~2.3.0: - version "2.3.5" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.3.5.tgz#822a0dc266290ce4cd3a12282ca3e7e364668a08" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -nested-error-stacks@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.0.tgz#98b2ffaefb4610fa3936f1e71435d30700de2840" - dependencies: - inherits "~2.0.1" - -node-persist@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/node-persist/-/node-persist-0.0.11.tgz#d66eba3ebef620f079530fa7b13076a906665874" - dependencies: - mkdirp "~0.5.1" - q "~1.1.1" - -node-persist@^2.0.10: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-persist/-/node-persist-2.1.0.tgz#e652bbf3885a04dad6a353d74176177c83914707" - dependencies: - is-absolute "^0.2.6" - mkdirp "~0.5.1" - q "~1.1.1" - -normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -ora@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-2.0.0.tgz#8ec3a37fa7bffb54a3a0c188a1f6798e7e1827cd" - dependencies: - chalk "^2.3.1" - cli-cursor "^2.1.0" - cli-spinners "^1.1.0" - log-symbols "^2.2.0" - strip-ansi "^4.0.0" - wcwidth "^1.0.1" - -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - dependencies: - readable-stream "^2.0.1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-name@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e" - dependencies: - macos-release "^1.0.0" - win-release "^1.0.0" - -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - -p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - dependencies: - p-finally "^1.0.0" - -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-repo@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/parse-repo/-/parse-repo-1.0.4.tgz#74b91d2cb8675d11b99976a0065f6ce17fa1bcc8" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - dependencies: - pify "^3.0.0" - -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -ping@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ping/-/ping-0.2.2.tgz#180fb7508c1dc74793849bce35c8073f9965bce2" - dependencies: - q "1.x" - underscore "^1.8.3" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - -private@^0.1.6, private@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.5: - version "1.4.0" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" - dependencies: - duplexify "^3.5.3" - inherits "^2.0.3" - pump "^2.0.0" - -q@1.x, q@^1.4.1, q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - -q@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/q/-/q-1.1.2.tgz#6357e291206701d99f197ab84e57e8ad196f2a89" - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - -rc@^1.0.1, rc@^1.1.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.0.0, read-pkg@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -registry-auth-token@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -reinterval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" - -release-it@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-7.2.1.tgz#31f050cd40920a3af4cb3c9c0de62c7866d0282a" - dependencies: - "@octokit/rest" "14.0.9" - async-retry "1.2.1" - babel-preset-env "1.6.1" - babel-register "6.26.0" - bump-file "1.0.0" - chalk "2.3.2" - conventional-changelog "1.1.18" - conventional-recommended-bump "2.0.6" - cpy "6.0.0" - debug "3.1.0" - globby "8.0.1" - got "8.2.0" - inquirer "5.1.0" - is-ci "1.1.0" - lodash "4.17.5" - mime-types "2.1.18" - ora "2.0.0" - os-name "2.0.1" - parse-repo "1.0.4" - semver "5.5.0" - shelljs "0.8.1" - supports-color "5.3.0" - tmp-promise "1.0.4" - update-notifier "2.3.0" - uuid "3.2.1" - window-size "1.1.0" - yargs-parser "9.0.2" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.1.6: - version "1.6.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" - dependencies: - path-parse "^1.0.5" - -responselike@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -retry@0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -rxjs@^5.5.2: - version "5.5.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.7.tgz#afb3d1642b069b2fbf203903d6501d1acb4cda27" - dependencies: - symbol-observable "1.0.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -semver@5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shelljs@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.1.tgz#729e038c413a2254c4078b95ed46e0397154a9f1" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - dependencies: - is-plain-obj "^1.0.0" - -source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - dependencies: - atob "^2.0.0" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -split2@^2.0.0, split2@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - dependencies: - through2 "^2.0.2" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - dependencies: - through "2" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -supports-color@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - dependencies: - has-flag "^2.0.0" - -supports-color@5.3.0, supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" - dependencies: - has-flag "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - dependencies: - execa "^0.7.0" - -text-extensions@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@2, "through@>=2.2.7 <3", through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -tmp-promise@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.0.4.tgz#cfe2131b78392992e756d8692a059dc4b48be7ac" - dependencies: - bluebird "^3.5.0" - tmp "0.0.33" - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -to-absolute-glob@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - -trim-off-newlines@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -type-detect@^4.0.0: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - -unc-path-regex@^0.1.0, unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -update-notifier@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - dependencies: - prepend-http "^2.0.0" - -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - -use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -uuid@3.2.1, uuid@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - dependencies: - defaults "^1.0.3" - -websocket-stream@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/websocket-stream/-/websocket-stream-5.1.2.tgz#1c31c627bcdf34f1a9bdacc9daa15bfa4816d9ad" - dependencies: - duplexify "^3.5.1" - inherits "^2.0.1" - readable-stream "^2.3.3" - safe-buffer "^5.1.1" - ws "^3.2.0" - xtend "^4.0.0" - -which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -widest-line@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" - dependencies: - string-width "^2.1.1" - -win-release@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" - dependencies: - semver "^5.0.1" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -window-size@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-1.1.0.tgz#3b402d3244f35561db2c9761ad9d1e5286b07a2d" - dependencies: - define-property "^1.0.0" - is-number "^3.0.0" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -ws@^3.2.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs-parser@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - dependencies: - camelcase "^4.1.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" From 51e3f378b3ccbf945aea0c1d8bd6b998d8fb367e Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 27 Feb 2020 09:59:50 +1300 Subject: [PATCH 147/152] Fixed bug in siri/automation temperature setting Temperature would be set to default mode temperature, regardless of request Also fixed UI refresh when turning off --- accessories/aircon.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/accessories/aircon.js b/accessories/aircon.js index 415aac06..9e3c1bf8 100644 --- a/accessories/aircon.js +++ b/accessories/aircon.js @@ -185,6 +185,8 @@ class AirConAccessory extends BroadlinkRMAccessory { this.updateServiceCurrentHeatingCoolingState(HeatingCoolingStates.off); await this.performSend(data.off); + serviceManager.refreshCharacteristicUI(Characteristic.CurrentHeatingCoolingState); + serviceManager.refreshCharacteristicUI(Characteristic.TargetHeatingCoolingState); return; } @@ -232,7 +234,7 @@ class AirConAccessory extends BroadlinkRMAccessory { //Force Temperature send delayForDuration(0.25).then(() => { - this.sendTemperature(temperature, state.currentTemperature); + this.sendTemperature(state.targetTemperature, state.currentTemperature); serviceManager.refreshCharacteristicUI(Characteristic.TargetTemperature); }); } From f7f93fcb7367180a333b8df827ffaa63a6891ef9 Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Thu, 27 Feb 2020 10:00:51 +1300 Subject: [PATCH 148/152] Version increase for AC bug fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 39b76747..4c5b0373 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-broadlink-rm-tv", - "version": "4.1.0", + "version": "4.1.1", "description": "Broadlink RM plugin (including the mini and pro) for homebridge: https://github.com/nfarina/homebridge", "license": "ISC", From a77cd45d1200103637eaaf60a336584a8f6e4537 Mon Sep 17 00:00:00 2001 From: David Mohl Date: Tue, 14 Apr 2020 03:44:34 +0900 Subject: [PATCH 149/152] Adds RM Pro3 Support --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c5b0373..e2c5e457 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "url": "git@github.com:AlexanderBabel/homebridge-broadlink-rm.git" }, "dependencies": { - "broadlinkjs-rm": "^0.7.5", + "broadlinkjs-rm": "^0.7.6", "chai": "^4.2.0", "find-key": "^2.0.1", "github-version-checker": "^1.2.0", From 39372cd126eccfcbdc6fd509f4cc5bac033c5b1c Mon Sep 17 00:00:00 2001 From: Cameron <32912464+kiwi-cam@users.noreply.github.com> Date: Mon, 25 May 2020 13:25:01 +1200 Subject: [PATCH 150/152] Added note about fork with new device support --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1c90d7f6..bd8ece87 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ If you want to use this fork, use this command: `npm i -g homebridge-broadlink-rm-tv` +There's been a lot of work done on the main fork to support some newer Broadlink devices. I (kiwi-cam) have had trouble getting this fork updated to include this support. As a temporary resolution I've created a new fork homebridge-broadlink-rm-pro which adds new Broadlink device support (Thanks to @Defensor7). The new fork can be installed using: + +`npm i -g homebridge-broadlink-rm-pro` # Homebridge Broadlink RM [[Original](https://github.com/lprhodes/homebridge-broadlink-rm)] From 38f34bd6222ee83aa311aadb9e097c65e6e8b35f Mon Sep 17 00:00:00 2001 From: Alexander Babel <13570439+AlexanderBabel@users.noreply.github.com> Date: Fri, 13 Nov 2020 21:39:36 +0100 Subject: [PATCH 151/152] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bd8ece87..e7ecab8c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Homebridge Broadlink RM [TV+AC File Fork] +# Please use the fork of [kiwi-cam](https://github.com/kiwi-cam/homebridge-broadlink-rm). This fork is inactive due to not using this plugin anymore. + # About this fork This fork adds support for the TV type indroduced in iOS 12.2. I'm only give support for this specific accessory type! From ae59cbc81dea89b225a0de51366d546dd1635281 Mon Sep 17 00:00:00 2001 From: Alexander Babel <13570439+AlexanderBabel@users.noreply.github.com> Date: Fri, 13 Nov 2020 21:40:05 +0100 Subject: [PATCH 152/152] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7ecab8c..1052d1b9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Homebridge Broadlink RM [TV+AC File Fork] -# Please use the fork of [kiwi-cam](https://github.com/kiwi-cam/homebridge-broadlink-rm). This fork is inactive due to not using this plugin anymore. +### Please use the fork of [kiwi-cam](https://github.com/kiwi-cam/homebridge-broadlink-rm). This fork is inactive due to not using this plugin anymore. # About this fork