From 883187a59120d8806aa22292a715fd2b7654593d Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 10:43:05 -0500 Subject: [PATCH 01/12] Change "build" script to "compile" which is semantic. Adding a new "build" process of packaging app into a binary with pkg.js (maybe). Would make deployments faster and easier. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e1e5f9..67cb9b5 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "test": "./node_modules/.bin/qunit", "docs": "sh docs.sh", - "build": "./node_modules/.bin/tsc -p tsconfig.json" + "compile": "./node_modules/.bin/tsc -p tsconfig.json" }, "repository": { "type": "git", From 9d1163926f969c05a7b0fdc11f8e9035d1355e9b Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 10:43:54 -0500 Subject: [PATCH 02/12] Copy ble and wifi modules as .ts source. Begin refactor into typescript as is before addressing bug issues. --- src/ble/index.ts | 254 ++++++++++++++++++++++++++++++++++++++++++++++ src/wifi/index.ts | 209 ++++++++++++++++++++++++++++++++++++++ tsconfig.json | 7 +- 3 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 src/ble/index.ts create mode 100644 src/wifi/index.ts diff --git a/src/ble/index.ts b/src/ble/index.ts new file mode 100644 index 0000000..5b6b5fc --- /dev/null +++ b/src/ble/index.ts @@ -0,0 +1,254 @@ +'use strict' + +/** @module ble */ +/** Bluetooth Low Energy module */ + +const util = require('util') +const os = require('os') + +const log = require('../log')('ble') +const wifi = require('../wifi') + +const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3' +const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble' +const CHAR_ID = process.env.CHAR_ID || 'intval3char' +const WIFI_ID = process.env.WIFI_ID || 'wifichar' +const NETWORK = os.networkInterfaces() +const MAC = getMac() || spoofMac() + +//Give the device a unique device name, needs to be in env +process.env.BLENO_DEVICE_NAME += '_' + MAC +const bleno = require('bleno') + + +let currentWifi = 'disconnected' +let currentAddr = null +let getState + +const chars = [] + +function createChar(name, uuid, prop, write, read) { + function characteristic () { + bleno.Characteristic.call(this, { + uuid : uuid, + properties: prop + }) + } + util.inherits(characteristic, bleno.Characteristic) + if (prop.indexOf('read') !== -1) { + //data, offset, withoutResponse, callback + characteristic.prototype.onReadRequest = read + } + if (prop.indexOf('write') !== -1) { + characteristic.prototype.onWriteRequest = write + } + chars.push(new characteristic()) +} + +function createChars (onWrite, onRead) { + createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead) + createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead) +} + +function onWifiWrite (data, offset, withoutResponse, callback) { + let result + let utf8 + let obj + let ssid + let pwd + if (offset) { + log.warn(`Offset scenario`) + result = bleno.Characteristic.RESULT_ATTR_NOT_LONG + return callback(result) + } + utf8 = data.toString('utf8') + obj = JSON.parse(utf8) + ssid = obj.ssid + pwd = obj.pwd + log.info(`connecting to AP`, { ssid : ssid }) + return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { + if (err) { + log.error('Error hashing wifi password', err) + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return callback(result) + } + return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { + if (err) { + log.error('Error configuring wifi', err) + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return callback(result) + } + currentWifi = ssid + currentAddr = getIp() + log.info(`Connected to AP`, { ssid : ssid, ip : currentAddr }) + result = bleno.Characteristic.RESULT_SUCCESS + return callback(result) + }) + }) +} + +function onWifiRead (offset, callback) { + let result = bleno.Characteristic.RESULT_SUCCESS + let wifiRes = {} + let data + wifi.list((err, list) => { + if (err) { + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return callback(result) + } + wifiRes.available = list + wifiRes.current = currentWifi + wifiRes.ip = currentAddr + log.info('Discovered available APs', { found : list.length }) + data = new Buffer(JSON.stringify(wifiRes)) + callback(result, data.slice(offset, data.length)) + }) +} + +function getMac () { + const colonRe = new RegExp(':', 'g') + if (NETWORK && NETWORK.wlan0 && NETWORK.wlan0[0] && NETWORK.wlan0[0].mac) { + return NETWORK.wlan0[0].mac.replace(colonRe, '') + } + return undefined +} + +function spoofMac () { + const fs = require('fs') + const FSPATH = require.resolve('uuid') + const IDFILE = os.homedir() + '/.intval3id' + let uuid + let UUIDPATH + let TMP + let MACTMP + let dashRe + delete require.cache[FSPATH] + if (fs.existsSync(IDFILE)) { + return fs.readFileSync(IDFILE, 'utf8') + } + uuid = require('uuid').v4 + UUIDPATH = require.resolve('uuid') + delete require.cache[UUIDPATH] + TMP = uuid() + MACTMP = TMP.replace(dashRe, '').substring(0, 12) + dashRe = new RegExp('-', 'g') + fs.writeFileSync(IDFILE, MACTMP, 'utf8') + return MACTMP +} + +function getIp () { + let addr = null + let ipv4 + const ifaces = os.networkInterfaces() + if (ifaces && ifaces.wlan0) { + ipv4 = ifaces.wlan0.filter(iface => { + if (iface.family === 'IPv4') { + return iface + } + }) + if (ipv4.length === 1) { + addr = ipv4[0].address + } + } + return addr +} + + +function capitalize (s) { + return s[0].toUpperCase() + s.slice(1) +} + +/** Class representing the bluetooth interface */ +class BLE { + /** + * Establishes Bluetooth Low Energy services, accessible to process through this class + * + * @constructor + */ + constructor (bleGetState) { + log.info('Starting bluetooth service') + + getState = bleGetState + + bleno.on('stateChange', state => { + log.info('stateChange', { state : state }) + if (state === 'poweredOn') { + log.info('Starting advertising', { DEVICE_NAME, DEVICE_ID : process.env.BLENO_DEVICE_NAME }) + bleno.startAdvertising(DEVICE_NAME, [CHAR_ID]) + } else { + bleno.stopAdvertising() + } + }) + + bleno.on('advertisingStart', err => { + log.info('advertisingStart', { res : (err ? 'error ' + err : 'success') }) + createChars(this._onWrite.bind(this), this._onRead.bind(this)) + if (!err) { + bleno.setServices([ + new bleno.PrimaryService({ + uuid : SERVICE_ID, //hardcoded across panels + characteristics : chars + }) + ]) + } + }) + + bleno.on('accept', clientAddress => { + log.info('accept', { clientAddress : clientAddress }) + }) + + bleno.on('disconnect', clientAddress => { + log.info('disconnect', { clientAddress : clientAddress }) + }) + + wifi.getNetwork((err, ssid) => { + if (err) { + return log.error('wifi.getNetwork', err) + } + currentWifi = ssid + currentAddr = getIp() + log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) + }) + } + _onWrite (data, offset, withoutResponse, callback) { + let result = {} + let utf8 + let obj + let fn + if (offset) { + log.warn(`Offset scenario`) + result = bleno.Characteristic.RESULT_ATTR_NOT_LONG + return callback(result) + } + utf8 = data.toString('utf8') + obj = JSON.parse(utf8) + result = bleno.Characteristic.RESULT_SUCCESS + fn = `_on${capitalize(obj.type)}` + if (obj.type && this[fn]) { + return this[fn](obj, () => { + callback(result) + }) + } else { + return callback(result) + } + + } + _onRead (offset, callback) { + const result = bleno.Characteristic.RESULT_SUCCESS + const state = getState() + const data = new Buffer(JSON.stringify( state )) + callback(result, data.slice(offset, data.length)) + } + /** + * Binds functions to events that are triggered by BLE messages + * + * @param {string} eventName Name of the event to to bind + * @param {function} callback Invoked when the event is triggered + */ + on (eventName, callback) { + this[`_on${capitalize(eventName)}`] = callback + } + +} + +module.exports = BLE \ No newline at end of file diff --git a/src/wifi/index.ts b/src/wifi/index.ts new file mode 100644 index 0000000..59a2766 --- /dev/null +++ b/src/wifi/index.ts @@ -0,0 +1,209 @@ +'use strict' + +const networkPattern = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi +const quoteRe = new RegExp('"', 'g') + +const filePath = '/etc/wpa_supplicant/wpa_supplicant.conf' +const reconfigure = '/sbin/wpa_cli reconfigure' +const refresh = 'ip link set wlan0 down && ip link set wlan0 up' +const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"' +const iwgetid = '/sbin/iwgetid' + +const log = require('../log')('wifi') +const exec = require('child_process').exec +const fs = require('fs') + +let _entry = null +let _ssid = null +let _cb = null + +/** Class representing the wifi features */ +class Wifi { + constructor () { + + } + /** + * List available wifi access points + * + * @param {function} callback Function which gets invoked after list is returned + */ + list (callback) { + exec(iwlist, (err, stdout, stderr) => { + if (err) { + console.error(err) + return callback(err) + } + const limit = 20; + const lines = stdout.split('\n') + let output = [] + let line + let i = 0 + for (let l of lines) { + line = l.replace('ESSID:', '').trim() + if (line !== '""' && i < limit) { + line = line.replace(quoteRe, '') + output.push(line) + } + i++ + } + output = output.filter(ap => { + if (ap !== '') return ap + }) + return callback(null, output) + }) + } + /** + * (internal function) Invoked after config file is read, + * then invokes file write on the config file + * + * @param {object} err (optional) Error object only present if problem reading config file + * @param {string} data Contents of the config file + */ + _readConfigCb (err, data) { + let parsed + let current + if (err) { + console.error(err) + return _cb(err) + } + parsed = this._parseConfig(data) + current = parsed.find(network => { + return network.ssid === _ssid + }) + if (typeof current !== 'undefined') { + data = data.replace(current.raw, _entry) + } else { + data += '\n\n' + _entry + } + _entry = null + fs.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)) + } + /** + * (internal function) Invoked after config file is written, + * then executes reconfiguration command + * + * @param {object} err (optional) Error object only present if problem writing config file + */ + _writeConfigCb (err) { + if (err) { + console.error(err) + return _cb(err) + } + exec(reconfigure, this._reconfigureCb.bind(this)) + } + /** + * (internal function) Invoked after reconfiguration command is complete + * + * @param {object} err (optional) Error object only present if configuration command fails + * @param {string} stdout Standard output from reconfiguration command + * @param {string} stderr Error output from command if fails + */ + _reconfigureCb (err, stdout, stderr) { + if (err) { + console.error(err) + return _cb(err) + } + console.log('Wifi reconfigured') + exec(refresh, this._refreshCb.bind(this)) + } + /** + * (internal function) Invoked after wifi refresh command is complete + * + * @param {object} err (optional) Error object only present if refresh command fails + * @param {string} stdout Standard output from refresh command + * @param {string} stderr Error output from command if fails + */ + _refreshCb (err, stdout, stderr) { + if (err) { + console.error(err) + return _cb(err) + } + console.log('Wifi refreshed') + _cb(null, { ssid : _ssid }) + _cb = () => {} + } + _parseConfig (str) { + const networks = [] + const lines = str.split('\n') + let network = {} + for (let line of lines) { + if (line.substring(0, 9) === 'network={') { + network = {} + network.raw = line + } else if (network.raw && line.indexOf('ssid=') !== -1) { + network.ssid = line.replace('ssid=', '').trim().replace(quoteRe, '') + if (network.raw) { + network.raw += '\n' + line + } + } else if (network.raw && line.substring(0, 1) === '}') { + network.raw += '\n' + line + networks.push(network) + network = {} + } else if (network.raw) { + network.raw += '\n' + line + } + } + return networks + } + /** + * Create sanitized wpa_supplicant.conf stanza for + * configuring wifi without storing plaintext passwords + * @example + * network={ + * ssid="YOUR_SSID" + * #psk="YOUR_PASSWORD" + * psk=6a24edf1592aec4465271b7dcd204601b6e78df3186ce1a62a31f40ae9630702 + * } + * + * @param {string} ssid SSID of wifi network + * @param {string} pwd Plaintext passphrase of wifi network + * @param {function} callback Function called after psk hash is generated + */ + createPSK (ssid, pwd, callback) { + const cmd = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="` + let lines + let hash + let plaintext + exec(cmd, (err, stdout, stderr) => { + if (err) { + return callback(err) + } + lines = stdout.replace('#psk=', '').split('psk=') + hash = lines[1] + plaintext = lines[0] + callback(null, hash.trim(), plaintext.trim()) + }) + } + /** + * Function which initializes the processes for adding a wifi access point authentication + * + * @param {string} ssid SSID of network to configure + * @param {string} pwd Password of access point, plaintext to be masked + * @param {string} hash Password/SSID of access point, securely hashed + * @param {function} callback Function invoked after process is complete, or fails + */ + setNetwork (ssid, pwd, hash, callback) { + let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"' }).join('') + _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` + _cb = callback + _ssid = ssid + fs.readFile(filePath, 'utf8', this._readConfigCb.bind(this)) + } + /** + * Executes command which gets the currently connected network + * + * @param {function} callback Function which is invoked after command is completed + */ + getNetwork (callback) { + let output + exec(iwgetid, (err, stdout, stderr) => { + if (err) { + return callback(err) + } + output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim() + callback(null, output) + }) + } +} + +module.exports = new Wifi() \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9b5a94d..85ea9ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,8 +12,11 @@ "outDir": "./lib/", "rootDir" : "./src/", "paths" : { - "log" : ["./lib/log"], - "delay" : [ "./lib/delay"] + "log" : [ "./lib/log" ], + "delay" : [ "./lib/delay" ], + "intval" : [ "./lib/intval" ], + "ble" : [ "./lib/ble" ], + "wifi" : [ "./lib/wifi" ] } }, "exclude" : [ From 84ee49a71cf54429d0a0f7d3b323fa93fc089fdf Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 10:44:08 -0500 Subject: [PATCH 03/12] Compile ble and wifi as is. --- lib/ble/index.js | 454 ++++++++++++++++++++---------------------- lib/ble/index.js.map | 1 + lib/wifi/index.js | 411 +++++++++++++++++++------------------- lib/wifi/index.js.map | 1 + 4 files changed, 422 insertions(+), 445 deletions(-) create mode 100644 lib/ble/index.js.map create mode 100644 lib/wifi/index.js.map diff --git a/lib/ble/index.js b/lib/ble/index.js index 5b6b5fc..3e27678 100644 --- a/lib/ble/index.js +++ b/lib/ble/index.js @@ -1,254 +1,230 @@ -'use strict' - +'use strict'; /** @module ble */ /** Bluetooth Low Energy module */ - -const util = require('util') -const os = require('os') - -const log = require('../log')('ble') -const wifi = require('../wifi') - -const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3' -const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble' -const CHAR_ID = process.env.CHAR_ID || 'intval3char' -const WIFI_ID = process.env.WIFI_ID || 'wifichar' -const NETWORK = os.networkInterfaces() -const MAC = getMac() || spoofMac() - +const util = require('util'); +const os = require('os'); +const log = require('../log')('ble'); +const wifi = require('../wifi'); +const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3'; +const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble'; +const CHAR_ID = process.env.CHAR_ID || 'intval3char'; +const WIFI_ID = process.env.WIFI_ID || 'wifichar'; +const NETWORK = os.networkInterfaces(); +const MAC = getMac() || spoofMac(); //Give the device a unique device name, needs to be in env -process.env.BLENO_DEVICE_NAME += '_' + MAC -const bleno = require('bleno') - - -let currentWifi = 'disconnected' -let currentAddr = null -let getState - -const chars = [] - +process.env.BLENO_DEVICE_NAME += '_' + MAC; +const bleno = require('bleno'); +let currentWifi = 'disconnected'; +let currentAddr = null; +let getState; +const chars = []; function createChar(name, uuid, prop, write, read) { - function characteristic () { - bleno.Characteristic.call(this, { - uuid : uuid, - properties: prop - }) - } - util.inherits(characteristic, bleno.Characteristic) - if (prop.indexOf('read') !== -1) { - //data, offset, withoutResponse, callback - characteristic.prototype.onReadRequest = read - } - if (prop.indexOf('write') !== -1) { - characteristic.prototype.onWriteRequest = write - } - chars.push(new characteristic()) + function characteristic() { + bleno.Characteristic.call(this, { + uuid: uuid, + properties: prop + }); + } + util.inherits(characteristic, bleno.Characteristic); + if (prop.indexOf('read') !== -1) { + //data, offset, withoutResponse, callback + characteristic.prototype.onReadRequest = read; + } + if (prop.indexOf('write') !== -1) { + characteristic.prototype.onWriteRequest = write; + } + chars.push(new characteristic()); } - -function createChars (onWrite, onRead) { - createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead) - createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead) +function createChars(onWrite, onRead) { + createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead); + createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead); } - -function onWifiWrite (data, offset, withoutResponse, callback) { - let result - let utf8 - let obj - let ssid - let pwd - if (offset) { - log.warn(`Offset scenario`) - result = bleno.Characteristic.RESULT_ATTR_NOT_LONG - return callback(result) - } - utf8 = data.toString('utf8') - obj = JSON.parse(utf8) - ssid = obj.ssid - pwd = obj.pwd - log.info(`connecting to AP`, { ssid : ssid }) - return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { - if (err) { - log.error('Error hashing wifi password', err) - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { - if (err) { - log.error('Error configuring wifi', err) - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - currentWifi = ssid - currentAddr = getIp() - log.info(`Connected to AP`, { ssid : ssid, ip : currentAddr }) - result = bleno.Characteristic.RESULT_SUCCESS - return callback(result) - }) - }) +function onWifiWrite(data, offset, withoutResponse, callback) { + let result; + let utf8; + let obj; + let ssid; + let pwd; + if (offset) { + log.warn(`Offset scenario`); + result = bleno.Characteristic.RESULT_ATTR_NOT_LONG; + return callback(result); + } + utf8 = data.toString('utf8'); + obj = JSON.parse(utf8); + ssid = obj.ssid; + pwd = obj.pwd; + log.info(`connecting to AP`, { ssid: ssid }); + return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { + if (err) { + log.error('Error hashing wifi password', err); + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; + return callback(result); + } + return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { + if (err) { + log.error('Error configuring wifi', err); + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; + return callback(result); + } + currentWifi = ssid; + currentAddr = getIp(); + log.info(`Connected to AP`, { ssid: ssid, ip: currentAddr }); + result = bleno.Characteristic.RESULT_SUCCESS; + return callback(result); + }); + }); } - -function onWifiRead (offset, callback) { - let result = bleno.Characteristic.RESULT_SUCCESS - let wifiRes = {} - let data - wifi.list((err, list) => { - if (err) { - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - wifiRes.available = list - wifiRes.current = currentWifi - wifiRes.ip = currentAddr - log.info('Discovered available APs', { found : list.length }) - data = new Buffer(JSON.stringify(wifiRes)) - callback(result, data.slice(offset, data.length)) - }) +function onWifiRead(offset, callback) { + let result = bleno.Characteristic.RESULT_SUCCESS; + let wifiRes = {}; + let data; + wifi.list((err, list) => { + if (err) { + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; + return callback(result); + } + wifiRes.available = list; + wifiRes.current = currentWifi; + wifiRes.ip = currentAddr; + log.info('Discovered available APs', { found: list.length }); + data = new Buffer(JSON.stringify(wifiRes)); + callback(result, data.slice(offset, data.length)); + }); } - -function getMac () { - const colonRe = new RegExp(':', 'g') - if (NETWORK && NETWORK.wlan0 && NETWORK.wlan0[0] && NETWORK.wlan0[0].mac) { - return NETWORK.wlan0[0].mac.replace(colonRe, '') - } - return undefined +function getMac() { + const colonRe = new RegExp(':', 'g'); + if (NETWORK && NETWORK.wlan0 && NETWORK.wlan0[0] && NETWORK.wlan0[0].mac) { + return NETWORK.wlan0[0].mac.replace(colonRe, ''); + } + return undefined; } - -function spoofMac () { - const fs = require('fs') - const FSPATH = require.resolve('uuid') - const IDFILE = os.homedir() + '/.intval3id' - let uuid - let UUIDPATH - let TMP - let MACTMP - let dashRe - delete require.cache[FSPATH] - if (fs.existsSync(IDFILE)) { - return fs.readFileSync(IDFILE, 'utf8') - } - uuid = require('uuid').v4 - UUIDPATH = require.resolve('uuid') - delete require.cache[UUIDPATH] - TMP = uuid() - MACTMP = TMP.replace(dashRe, '').substring(0, 12) - dashRe = new RegExp('-', 'g') - fs.writeFileSync(IDFILE, MACTMP, 'utf8') - return MACTMP +function spoofMac() { + const fs = require('fs'); + const FSPATH = require.resolve('uuid'); + const IDFILE = os.homedir() + '/.intval3id'; + let uuid; + let UUIDPATH; + let TMP; + let MACTMP; + let dashRe; + delete require.cache[FSPATH]; + if (fs.existsSync(IDFILE)) { + return fs.readFileSync(IDFILE, 'utf8'); + } + uuid = require('uuid').v4; + UUIDPATH = require.resolve('uuid'); + delete require.cache[UUIDPATH]; + TMP = uuid(); + MACTMP = TMP.replace(dashRe, '').substring(0, 12); + dashRe = new RegExp('-', 'g'); + fs.writeFileSync(IDFILE, MACTMP, 'utf8'); + return MACTMP; } - -function getIp () { - let addr = null - let ipv4 - const ifaces = os.networkInterfaces() - if (ifaces && ifaces.wlan0) { - ipv4 = ifaces.wlan0.filter(iface => { - if (iface.family === 'IPv4') { - return iface - } - }) - if (ipv4.length === 1) { - addr = ipv4[0].address - } - } - return addr +function getIp() { + let addr = null; + let ipv4; + const ifaces = os.networkInterfaces(); + if (ifaces && ifaces.wlan0) { + ipv4 = ifaces.wlan0.filter(iface => { + if (iface.family === 'IPv4') { + return iface; + } + }); + if (ipv4.length === 1) { + addr = ipv4[0].address; + } + } + return addr; } - - -function capitalize (s) { - return s[0].toUpperCase() + s.slice(1) +function capitalize(s) { + return s[0].toUpperCase() + s.slice(1); } - /** Class representing the bluetooth interface */ class BLE { - /** - * Establishes Bluetooth Low Energy services, accessible to process through this class - * - * @constructor - */ - constructor (bleGetState) { - log.info('Starting bluetooth service') - - getState = bleGetState - - bleno.on('stateChange', state => { - log.info('stateChange', { state : state }) - if (state === 'poweredOn') { - log.info('Starting advertising', { DEVICE_NAME, DEVICE_ID : process.env.BLENO_DEVICE_NAME }) - bleno.startAdvertising(DEVICE_NAME, [CHAR_ID]) - } else { - bleno.stopAdvertising() - } - }) - - bleno.on('advertisingStart', err => { - log.info('advertisingStart', { res : (err ? 'error ' + err : 'success') }) - createChars(this._onWrite.bind(this), this._onRead.bind(this)) - if (!err) { - bleno.setServices([ - new bleno.PrimaryService({ - uuid : SERVICE_ID, //hardcoded across panels - characteristics : chars - }) - ]) - } - }) - - bleno.on('accept', clientAddress => { - log.info('accept', { clientAddress : clientAddress }) - }) - - bleno.on('disconnect', clientAddress => { - log.info('disconnect', { clientAddress : clientAddress }) - }) - - wifi.getNetwork((err, ssid) => { - if (err) { - return log.error('wifi.getNetwork', err) - } - currentWifi = ssid - currentAddr = getIp() - log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) - }) - } - _onWrite (data, offset, withoutResponse, callback) { - let result = {} - let utf8 - let obj - let fn - if (offset) { - log.warn(`Offset scenario`) - result = bleno.Characteristic.RESULT_ATTR_NOT_LONG - return callback(result) - } - utf8 = data.toString('utf8') - obj = JSON.parse(utf8) - result = bleno.Characteristic.RESULT_SUCCESS - fn = `_on${capitalize(obj.type)}` - if (obj.type && this[fn]) { - return this[fn](obj, () => { - callback(result) - }) - } else { - return callback(result) - } - - } - _onRead (offset, callback) { - const result = bleno.Characteristic.RESULT_SUCCESS - const state = getState() - const data = new Buffer(JSON.stringify( state )) - callback(result, data.slice(offset, data.length)) - } - /** - * Binds functions to events that are triggered by BLE messages - * - * @param {string} eventName Name of the event to to bind - * @param {function} callback Invoked when the event is triggered - */ - on (eventName, callback) { - this[`_on${capitalize(eventName)}`] = callback - } - + /** + * Establishes Bluetooth Low Energy services, accessible to process through this class + * + * @constructor + */ + constructor(bleGetState) { + log.info('Starting bluetooth service'); + getState = bleGetState; + bleno.on('stateChange', state => { + log.info('stateChange', { state: state }); + if (state === 'poweredOn') { + log.info('Starting advertising', { DEVICE_NAME, DEVICE_ID: process.env.BLENO_DEVICE_NAME }); + bleno.startAdvertising(DEVICE_NAME, [CHAR_ID]); + } + else { + bleno.stopAdvertising(); + } + }); + bleno.on('advertisingStart', err => { + log.info('advertisingStart', { res: (err ? 'error ' + err : 'success') }); + createChars(this._onWrite.bind(this), this._onRead.bind(this)); + if (!err) { + bleno.setServices([ + new bleno.PrimaryService({ + uuid: SERVICE_ID, + characteristics: chars + }) + ]); + } + }); + bleno.on('accept', clientAddress => { + log.info('accept', { clientAddress: clientAddress }); + }); + bleno.on('disconnect', clientAddress => { + log.info('disconnect', { clientAddress: clientAddress }); + }); + wifi.getNetwork((err, ssid) => { + if (err) { + return log.error('wifi.getNetwork', err); + } + currentWifi = ssid; + currentAddr = getIp(); + log.info('wifi.getNetwork', { ssid: ssid, ip: currentAddr }); + }); + } + _onWrite(data, offset, withoutResponse, callback) { + let result = {}; + let utf8; + let obj; + let fn; + if (offset) { + log.warn(`Offset scenario`); + result = bleno.Characteristic.RESULT_ATTR_NOT_LONG; + return callback(result); + } + utf8 = data.toString('utf8'); + obj = JSON.parse(utf8); + result = bleno.Characteristic.RESULT_SUCCESS; + fn = `_on${capitalize(obj.type)}`; + if (obj.type && this[fn]) { + return this[fn](obj, () => { + callback(result); + }); + } + else { + return callback(result); + } + } + _onRead(offset, callback) { + const result = bleno.Characteristic.RESULT_SUCCESS; + const state = getState(); + const data = new Buffer(JSON.stringify(state)); + callback(result, data.slice(offset, data.length)); + } + /** + * Binds functions to events that are triggered by BLE messages + * + * @param {string} eventName Name of the event to to bind + * @param {function} callback Invoked when the event is triggered + */ + on(eventName, callback) { + this[`_on${capitalize(eventName)}`] = callback; + } } - -module.exports = BLE \ No newline at end of file +module.exports = BLE; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/ble/index.js.map b/lib/ble/index.js.map new file mode 100644 index 0000000..a8dc81c --- /dev/null +++ b/lib/ble/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/wifi/index.js b/lib/wifi/index.js index 59a2766..dba95f0 100644 --- a/lib/wifi/index.js +++ b/lib/wifi/index.js @@ -1,209 +1,208 @@ -'use strict' - -const networkPattern = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi -const quoteRe = new RegExp('"', 'g') - -const filePath = '/etc/wpa_supplicant/wpa_supplicant.conf' -const reconfigure = '/sbin/wpa_cli reconfigure' -const refresh = 'ip link set wlan0 down && ip link set wlan0 up' -const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"' -const iwgetid = '/sbin/iwgetid' - -const log = require('../log')('wifi') -const exec = require('child_process').exec -const fs = require('fs') - -let _entry = null -let _ssid = null -let _cb = null - +'use strict'; +const networkPattern = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi; +const quoteRe = new RegExp('"', 'g'); +const filePath = '/etc/wpa_supplicant/wpa_supplicant.conf'; +const reconfigure = '/sbin/wpa_cli reconfigure'; +const refresh = 'ip link set wlan0 down && ip link set wlan0 up'; +const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"'; +const iwgetid = '/sbin/iwgetid'; +const log = require('../log')('wifi'); +const exec = require('child_process').exec; +const fs = require('fs'); +let _entry = null; +let _ssid = null; +let _cb = null; /** Class representing the wifi features */ class Wifi { - constructor () { - - } - /** - * List available wifi access points - * - * @param {function} callback Function which gets invoked after list is returned - */ - list (callback) { - exec(iwlist, (err, stdout, stderr) => { - if (err) { - console.error(err) - return callback(err) - } - const limit = 20; - const lines = stdout.split('\n') - let output = [] - let line - let i = 0 - for (let l of lines) { - line = l.replace('ESSID:', '').trim() - if (line !== '""' && i < limit) { - line = line.replace(quoteRe, '') - output.push(line) - } - i++ - } - output = output.filter(ap => { - if (ap !== '') return ap - }) - return callback(null, output) - }) - } - /** - * (internal function) Invoked after config file is read, - * then invokes file write on the config file - * - * @param {object} err (optional) Error object only present if problem reading config file - * @param {string} data Contents of the config file - */ - _readConfigCb (err, data) { - let parsed - let current - if (err) { - console.error(err) - return _cb(err) - } - parsed = this._parseConfig(data) - current = parsed.find(network => { - return network.ssid === _ssid - }) - if (typeof current !== 'undefined') { - data = data.replace(current.raw, _entry) - } else { - data += '\n\n' + _entry - } - _entry = null - fs.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)) - } - /** - * (internal function) Invoked after config file is written, - * then executes reconfiguration command - * - * @param {object} err (optional) Error object only present if problem writing config file - */ - _writeConfigCb (err) { - if (err) { - console.error(err) - return _cb(err) - } - exec(reconfigure, this._reconfigureCb.bind(this)) - } - /** - * (internal function) Invoked after reconfiguration command is complete - * - * @param {object} err (optional) Error object only present if configuration command fails - * @param {string} stdout Standard output from reconfiguration command - * @param {string} stderr Error output from command if fails - */ - _reconfigureCb (err, stdout, stderr) { - if (err) { - console.error(err) - return _cb(err) - } - console.log('Wifi reconfigured') - exec(refresh, this._refreshCb.bind(this)) - } - /** - * (internal function) Invoked after wifi refresh command is complete - * - * @param {object} err (optional) Error object only present if refresh command fails - * @param {string} stdout Standard output from refresh command - * @param {string} stderr Error output from command if fails - */ - _refreshCb (err, stdout, stderr) { - if (err) { - console.error(err) - return _cb(err) - } - console.log('Wifi refreshed') - _cb(null, { ssid : _ssid }) - _cb = () => {} - } - _parseConfig (str) { - const networks = [] - const lines = str.split('\n') - let network = {} - for (let line of lines) { - if (line.substring(0, 9) === 'network={') { - network = {} - network.raw = line - } else if (network.raw && line.indexOf('ssid=') !== -1) { - network.ssid = line.replace('ssid=', '').trim().replace(quoteRe, '') - if (network.raw) { - network.raw += '\n' + line - } - } else if (network.raw && line.substring(0, 1) === '}') { - network.raw += '\n' + line - networks.push(network) - network = {} - } else if (network.raw) { - network.raw += '\n' + line - } - } - return networks - } - /** - * Create sanitized wpa_supplicant.conf stanza for - * configuring wifi without storing plaintext passwords - * @example - * network={ - * ssid="YOUR_SSID" - * #psk="YOUR_PASSWORD" - * psk=6a24edf1592aec4465271b7dcd204601b6e78df3186ce1a62a31f40ae9630702 - * } - * - * @param {string} ssid SSID of wifi network - * @param {string} pwd Plaintext passphrase of wifi network - * @param {function} callback Function called after psk hash is generated - */ - createPSK (ssid, pwd, callback) { - const cmd = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="` - let lines - let hash - let plaintext - exec(cmd, (err, stdout, stderr) => { - if (err) { - return callback(err) - } - lines = stdout.replace('#psk=', '').split('psk=') - hash = lines[1] - plaintext = lines[0] - callback(null, hash.trim(), plaintext.trim()) - }) - } - /** - * Function which initializes the processes for adding a wifi access point authentication - * - * @param {string} ssid SSID of network to configure - * @param {string} pwd Password of access point, plaintext to be masked - * @param {string} hash Password/SSID of access point, securely hashed - * @param {function} callback Function invoked after process is complete, or fails - */ - setNetwork (ssid, pwd, hash, callback) { - let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"' }).join('') - _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` - _cb = callback - _ssid = ssid - fs.readFile(filePath, 'utf8', this._readConfigCb.bind(this)) - } - /** - * Executes command which gets the currently connected network - * - * @param {function} callback Function which is invoked after command is completed - */ - getNetwork (callback) { - let output - exec(iwgetid, (err, stdout, stderr) => { - if (err) { - return callback(err) - } - output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim() - callback(null, output) - }) - } + constructor() { + } + /** + * List available wifi access points + * + * @param {function} callback Function which gets invoked after list is returned + */ + list(callback) { + exec(iwlist, (err, stdout, stderr) => { + if (err) { + console.error(err); + return callback(err); + } + const limit = 20; + const lines = stdout.split('\n'); + let output = []; + let line; + let i = 0; + for (let l of lines) { + line = l.replace('ESSID:', '').trim(); + if (line !== '""' && i < limit) { + line = line.replace(quoteRe, ''); + output.push(line); + } + i++; + } + output = output.filter(ap => { + if (ap !== '') + return ap; + }); + return callback(null, output); + }); + } + /** + * (internal function) Invoked after config file is read, + * then invokes file write on the config file + * + * @param {object} err (optional) Error object only present if problem reading config file + * @param {string} data Contents of the config file + */ + _readConfigCb(err, data) { + let parsed; + let current; + if (err) { + console.error(err); + return _cb(err); + } + parsed = this._parseConfig(data); + current = parsed.find(network => { + return network.ssid === _ssid; + }); + if (typeof current !== 'undefined') { + data = data.replace(current.raw, _entry); + } + else { + data += '\n\n' + _entry; + } + _entry = null; + fs.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)); + } + /** + * (internal function) Invoked after config file is written, + * then executes reconfiguration command + * + * @param {object} err (optional) Error object only present if problem writing config file + */ + _writeConfigCb(err) { + if (err) { + console.error(err); + return _cb(err); + } + exec(reconfigure, this._reconfigureCb.bind(this)); + } + /** + * (internal function) Invoked after reconfiguration command is complete + * + * @param {object} err (optional) Error object only present if configuration command fails + * @param {string} stdout Standard output from reconfiguration command + * @param {string} stderr Error output from command if fails + */ + _reconfigureCb(err, stdout, stderr) { + if (err) { + console.error(err); + return _cb(err); + } + console.log('Wifi reconfigured'); + exec(refresh, this._refreshCb.bind(this)); + } + /** + * (internal function) Invoked after wifi refresh command is complete + * + * @param {object} err (optional) Error object only present if refresh command fails + * @param {string} stdout Standard output from refresh command + * @param {string} stderr Error output from command if fails + */ + _refreshCb(err, stdout, stderr) { + if (err) { + console.error(err); + return _cb(err); + } + console.log('Wifi refreshed'); + _cb(null, { ssid: _ssid }); + _cb = () => { }; + } + _parseConfig(str) { + const networks = []; + const lines = str.split('\n'); + let network = {}; + for (let line of lines) { + if (line.substring(0, 9) === 'network={') { + network = {}; + network.raw = line; + } + else if (network.raw && line.indexOf('ssid=') !== -1) { + network.ssid = line.replace('ssid=', '').trim().replace(quoteRe, ''); + if (network.raw) { + network.raw += '\n' + line; + } + } + else if (network.raw && line.substring(0, 1) === '}') { + network.raw += '\n' + line; + networks.push(network); + network = {}; + } + else if (network.raw) { + network.raw += '\n' + line; + } + } + return networks; + } + /** + * Create sanitized wpa_supplicant.conf stanza for + * configuring wifi without storing plaintext passwords + * @example + * network={ + * ssid="YOUR_SSID" + * #psk="YOUR_PASSWORD" + * psk=6a24edf1592aec4465271b7dcd204601b6e78df3186ce1a62a31f40ae9630702 + * } + * + * @param {string} ssid SSID of wifi network + * @param {string} pwd Plaintext passphrase of wifi network + * @param {function} callback Function called after psk hash is generated + */ + createPSK(ssid, pwd, callback) { + const cmd = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="`; + let lines; + let hash; + let plaintext; + exec(cmd, (err, stdout, stderr) => { + if (err) { + return callback(err); + } + lines = stdout.replace('#psk=', '').split('psk='); + hash = lines[1]; + plaintext = lines[0]; + callback(null, hash.trim(), plaintext.trim()); + }); + } + /** + * Function which initializes the processes for adding a wifi access point authentication + * + * @param {string} ssid SSID of network to configure + * @param {string} pwd Password of access point, plaintext to be masked + * @param {string} hash Password/SSID of access point, securely hashed + * @param {function} callback Function invoked after process is complete, or fails + */ + setNetwork(ssid, pwd, hash, callback) { + let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"'; }).join(''); + _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n`; + _cb = callback; + _ssid = ssid; + fs.readFile(filePath, 'utf8', this._readConfigCb.bind(this)); + } + /** + * Executes command which gets the currently connected network + * + * @param {function} callback Function which is invoked after command is completed + */ + getNetwork(callback) { + let output; + exec(iwgetid, (err, stdout, stderr) => { + if (err) { + return callback(err); + } + output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim(); + callback(null, output); + }); + } } - -module.exports = new Wifi() \ No newline at end of file +module.exports = new Wifi(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/wifi/index.js.map b/lib/wifi/index.js.map new file mode 100644 index 0000000..612d75a --- /dev/null +++ b/lib/wifi/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file From 8986014a82031c2dabf0d6cc9c54b81713aafcb1 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 11:41:15 -0500 Subject: [PATCH 04/12] Refactor wifi lib into Typescript. Only used one "any" on a custom module require that I need to revisit. (log). Yeeha! --- lib/wifi/index.js | 41 ++++++++++--------- lib/wifi/index.js.map | 2 +- src/wifi/index.ts | 95 +++++++++++++++++++++++-------------------- 3 files changed, 72 insertions(+), 66 deletions(-) diff --git a/lib/wifi/index.js b/lib/wifi/index.js index dba95f0..4e12e7e 100644 --- a/lib/wifi/index.js +++ b/lib/wifi/index.js @@ -1,4 +1,5 @@ 'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); const networkPattern = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi; const quoteRe = new RegExp('"', 'g'); const filePath = '/etc/wpa_supplicant/wpa_supplicant.conf'; @@ -7,14 +8,14 @@ const refresh = 'ip link set wlan0 down && ip link set wlan0 up'; const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"'; const iwgetid = '/sbin/iwgetid'; const log = require('../log')('wifi'); -const exec = require('child_process').exec; -const fs = require('fs'); +const child_process_1 = require("child_process"); +const fs_1 = require("fs"); let _entry = null; let _ssid = null; -let _cb = null; /** Class representing the wifi features */ class Wifi { constructor() { + this._cb = null; } /** * List available wifi access points @@ -22,7 +23,7 @@ class Wifi { * @param {function} callback Function which gets invoked after list is returned */ list(callback) { - exec(iwlist, (err, stdout, stderr) => { + child_process_1.exec(iwlist, (err, stdout, stderr) => { if (err) { console.error(err); return callback(err); @@ -59,10 +60,10 @@ class Wifi { let current; if (err) { console.error(err); - return _cb(err); + return this._cb(err); } parsed = this._parseConfig(data); - current = parsed.find(network => { + current = parsed.find((network) => { return network.ssid === _ssid; }); if (typeof current !== 'undefined') { @@ -72,7 +73,7 @@ class Wifi { data += '\n\n' + _entry; } _entry = null; - fs.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)); + fs_1.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)); } /** * (internal function) Invoked after config file is written, @@ -83,9 +84,9 @@ class Wifi { _writeConfigCb(err) { if (err) { console.error(err); - return _cb(err); + return this._cb(err); } - exec(reconfigure, this._reconfigureCb.bind(this)); + child_process_1.exec(reconfigure, this._reconfigureCb.bind(this)); } /** * (internal function) Invoked after reconfiguration command is complete @@ -97,10 +98,10 @@ class Wifi { _reconfigureCb(err, stdout, stderr) { if (err) { console.error(err); - return _cb(err); + return this._cb(err); } - console.log('Wifi reconfigured'); - exec(refresh, this._refreshCb.bind(this)); + log.info('Wifi reconfigured'); + child_process_1.exec(refresh, this._refreshCb.bind(this)); } /** * (internal function) Invoked after wifi refresh command is complete @@ -112,11 +113,11 @@ class Wifi { _refreshCb(err, stdout, stderr) { if (err) { console.error(err); - return _cb(err); + return this._cb(err); } - console.log('Wifi refreshed'); - _cb(null, { ssid: _ssid }); - _cb = () => { }; + log.info('Wifi refreshed'); + this._cb(null, { ssid: _ssid }); + this._cb = () => { }; } _parseConfig(str) { const networks = []; @@ -163,7 +164,7 @@ class Wifi { let lines; let hash; let plaintext; - exec(cmd, (err, stdout, stderr) => { + child_process_1.exec(cmd, (err, stdout, stderr) => { if (err) { return callback(err); } @@ -184,9 +185,9 @@ class Wifi { setNetwork(ssid, pwd, hash, callback) { let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"'; }).join(''); _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n`; - _cb = callback; + this._cb = callback; _ssid = ssid; - fs.readFile(filePath, 'utf8', this._readConfigCb.bind(this)); + fs_1.readFile(filePath, 'utf8', this._readConfigCb.bind(this)); } /** * Executes command which gets the currently connected network @@ -195,7 +196,7 @@ class Wifi { */ getNetwork(callback) { let output; - exec(iwgetid, (err, stdout, stderr) => { + child_process_1.exec(iwgetid, (err, stdout, stderr) => { if (err) { return callback(err); } diff --git a/lib/wifi/index.js.map b/lib/wifi/index.js.map index 612d75a..8adff32 100644 --- a/lib/wifi/index.js.map +++ b/lib/wifi/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/wifi/index.ts b/src/wifi/index.ts index 59a2766..9e5a956 100644 --- a/src/wifi/index.ts +++ b/src/wifi/index.ts @@ -1,24 +1,29 @@ 'use strict' -const networkPattern = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi -const quoteRe = new RegExp('"', 'g') +const networkPattern : RegExp = /network[\s\S]*?=[\s\S]*?{([\s\S]*?)}/gi +const quoteRe : RegExp = new RegExp('"', 'g') -const filePath = '/etc/wpa_supplicant/wpa_supplicant.conf' -const reconfigure = '/sbin/wpa_cli reconfigure' -const refresh = 'ip link set wlan0 down && ip link set wlan0 up' -const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"' -const iwgetid = '/sbin/iwgetid' +const filePath : string = '/etc/wpa_supplicant/wpa_supplicant.conf' +const reconfigure : string = '/sbin/wpa_cli reconfigure' +const refresh : string = 'ip link set wlan0 down && ip link set wlan0 up' +const iwlist : string = '/sbin/iwlist wlan0 scanning | grep "ESSID:"' +const iwgetid : string = '/sbin/iwgetid' -const log = require('../log')('wifi') -const exec = require('child_process').exec -const fs = require('fs') +const log : any = require('../log')('wifi') +import { exec } from 'child_process' +import { readFile, writeFile } from 'fs' -let _entry = null -let _ssid = null -let _cb = null +let _entry : string = null +let _ssid : string = null + +interface Network { + raw : string + ssid : string +} /** Class representing the wifi features */ class Wifi { + private _cb : Function = null constructor () { } @@ -27,7 +32,7 @@ class Wifi { * * @param {function} callback Function which gets invoked after list is returned */ - list (callback) { + list (callback : Function) { exec(iwlist, (err, stdout, stderr) => { if (err) { console.error(err) @@ -59,15 +64,15 @@ class Wifi { * @param {object} err (optional) Error object only present if problem reading config file * @param {string} data Contents of the config file */ - _readConfigCb (err, data) { - let parsed - let current + _readConfigCb (err : Error, data : string) { + let parsed : Network[] + let current : Network if (err) { console.error(err) - return _cb(err) + return this._cb(err) } parsed = this._parseConfig(data) - current = parsed.find(network => { + current = parsed.find((network : Network) => { return network.ssid === _ssid }) if (typeof current !== 'undefined') { @@ -76,7 +81,7 @@ class Wifi { data += '\n\n' + _entry } _entry = null - fs.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)) + writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)) } /** * (internal function) Invoked after config file is written, @@ -84,10 +89,10 @@ class Wifi { * * @param {object} err (optional) Error object only present if problem writing config file */ - _writeConfigCb (err) { + _writeConfigCb (err : Error) { if (err) { console.error(err) - return _cb(err) + return this._cb(err) } exec(reconfigure, this._reconfigureCb.bind(this)) } @@ -98,12 +103,12 @@ class Wifi { * @param {string} stdout Standard output from reconfiguration command * @param {string} stderr Error output from command if fails */ - _reconfigureCb (err, stdout, stderr) { + _reconfigureCb (err : Error, stdout : string, stderr : string) { if (err) { console.error(err) - return _cb(err) + return this._cb(err) } - console.log('Wifi reconfigured') + log.info('Wifi reconfigured') exec(refresh, this._refreshCb.bind(this)) } /** @@ -113,22 +118,22 @@ class Wifi { * @param {string} stdout Standard output from refresh command * @param {string} stderr Error output from command if fails */ - _refreshCb (err, stdout, stderr) { + _refreshCb (err : Error, stdout : string, stderr : string) { if (err) { console.error(err) - return _cb(err) + return this._cb(err) } - console.log('Wifi refreshed') - _cb(null, { ssid : _ssid }) - _cb = () => {} + log.info('Wifi refreshed') + this._cb(null, { ssid : _ssid }) + this._cb = () => {} } - _parseConfig (str) { - const networks = [] + _parseConfig (str : string) : Network[] { + const networks : Network[] = [] const lines = str.split('\n') - let network = {} + let network : Network = {} as Network for (let line of lines) { if (line.substring(0, 9) === 'network={') { - network = {} + network = {} as Network network.raw = line } else if (network.raw && line.indexOf('ssid=') !== -1) { network.ssid = line.replace('ssid=', '').trim().replace(quoteRe, '') @@ -138,7 +143,7 @@ class Wifi { } else if (network.raw && line.substring(0, 1) === '}') { network.raw += '\n' + line networks.push(network) - network = {} + network = {} as Network } else if (network.raw) { network.raw += '\n' + line } @@ -159,11 +164,11 @@ class Wifi { * @param {string} pwd Plaintext passphrase of wifi network * @param {function} callback Function called after psk hash is generated */ - createPSK (ssid, pwd, callback) { - const cmd = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="` - let lines - let hash - let plaintext + createPSK (ssid : string, pwd : string, callback : Function) { + const cmd : string = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="` + let lines : string[] + let hash : string + let plaintext : string exec(cmd, (err, stdout, stderr) => { if (err) { return callback(err) @@ -182,19 +187,19 @@ class Wifi { * @param {string} hash Password/SSID of access point, securely hashed * @param {function} callback Function invoked after process is complete, or fails */ - setNetwork (ssid, pwd, hash, callback) { - let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"' }).join('') + setNetwork (ssid : string, pwd : string, hash : string, callback : Function) { + let masked : string = pwd.split('').map(char => { return char !== '"' ? '*' : '"' }).join('') _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` - _cb = callback + this._cb = callback _ssid = ssid - fs.readFile(filePath, 'utf8', this._readConfigCb.bind(this)) + readFile(filePath, 'utf8', this._readConfigCb.bind(this)) } /** * Executes command which gets the currently connected network * * @param {function} callback Function which is invoked after command is completed */ - getNetwork (callback) { + getNetwork (callback : Function) { let output exec(iwgetid, (err, stdout, stderr) => { if (err) { From d04b0a1d096a8477adb05b5073b3dfefa441b2f4 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 11:41:59 -0500 Subject: [PATCH 05/12] Installed pkg as dev module for building a binary on the pi (maybe). Added build scripts for automatically handling versioning on new commits. --- package-lock.json | 1545 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 8 +- 2 files changed, 1552 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 46f6958..9c46d35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,25 @@ "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", "dev": true }, + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@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==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, "@netflix/nerror": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.2.tgz", @@ -32,6 +51,18 @@ } } }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@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/fs-extra": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", @@ -41,6 +72,23 @@ "@types/node": "*" } }, + "@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": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@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": "12.7.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz", @@ -110,6 +158,15 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "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" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -133,12 +190,51 @@ "sprintf-js": "~1.0.2" } }, + "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 + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-back": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.0.tgz", "integrity": "sha512-ylVYjv5BzoWXWO7e6fWrzjqzgxmUPWdQrHxgzo/v1EaYXfw6+6ipRdIr7KryAGnVHG08O1Yfpchuv0+YhjPL+Q==", "dev": true }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "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=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -152,6 +248,12 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", @@ -165,6 +267,12 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -180,6 +288,61 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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" + }, + "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.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.0" + } + }, + "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.0" + } + }, + "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" + } + } + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -239,6 +402,35 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.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.0" + } + } + } + }, "bunyan": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", @@ -250,6 +442,29 @@ "safe-json-stringify": "~1" } }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "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" + } + }, "cache-point": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-0.4.1.tgz", @@ -272,6 +487,12 @@ } } }, + "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 + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -294,11 +515,53 @@ } } }, + "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": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "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=", + "dev": true + } + } + }, "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, + "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, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "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.0" + } + } + } + }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -319,6 +582,16 @@ "stream-via": "^1.0.4" } }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", @@ -463,6 +736,12 @@ "integrity": "sha1-MOB/P49vf5s97oVPILLTnu4Ibeg=", "dev": true }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -490,6 +769,12 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -548,11 +833,23 @@ "ms": "2.0.0" } }, + "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=", + "dev": true + }, "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==" }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -561,6 +858,47 @@ "clone": "^1.0.2" } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "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.0" + } + }, + "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.0" + } + }, + "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" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -601,6 +939,15 @@ "kuler": "1.0.x" } }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, "dmd": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/dmd/-/dmd-4.0.4.tgz", @@ -721,6 +1068,37 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -739,11 +1117,138 @@ "assert-plus": "^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.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" + }, + "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.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.0" + } + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "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" + } + } + } + }, + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^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=", + "dev": true, + "requires": { + "is-descriptor": "^1.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.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.0" + } + }, + "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.0" + } + }, + "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" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -759,11 +1264,31 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fast-safe-stringify": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", @@ -800,6 +1325,29 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "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.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.0" + } + } + } + }, "find-my-way": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-2.2.1.tgz", @@ -827,6 +1375,12 @@ } } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -847,11 +1401,30 @@ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" }, + "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" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "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.1", + "readable-stream": "^2.0.0" + } + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -896,6 +1469,12 @@ "wide-align": "^1.1.0" } }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -917,6 +1496,49 @@ "path-is-absolute": "^1.0.0" } }, + "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.0" + }, + "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.0" + } + } + } + }, + "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 + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", @@ -953,11 +1575,49 @@ "har-schema": "^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 + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "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.0" + } + }, + "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.5" + } + } + } + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -1003,6 +1663,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", @@ -1030,11 +1696,98 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "into-stream": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", + "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + } + }, + "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.0.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.5" + } + } + } + }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "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-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.0.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.5" + } + } + } + }, + "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.0.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 + } + } + }, + "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-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -1043,6 +1796,44 @@ "number-is-nan": "^1.0.0" } }, + "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": { + "is-extglob": "^2.1.1" + } + }, + "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" + }, + "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.5" + } + } + } + }, + "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-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -1053,11 +1844,23 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "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 + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -1206,6 +2009,12 @@ "verror": "1.10.0" } }, + "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 + }, "klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -1223,6 +2032,16 @@ "colornames": "^1.1.1" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", @@ -1293,6 +2112,21 @@ "yallist": "^3.0.2" } }, + "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-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.0" + } + }, "markdown-it": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", @@ -1324,6 +2158,33 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", @@ -1377,6 +2238,27 @@ "minipass": "^2.2.1" } }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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" + } + } + } + }, "mixme": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.3.2.tgz", @@ -1414,6 +2296,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multistream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", + "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + } + }, "mv": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", @@ -1454,6 +2346,25 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "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-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" + } + }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -1571,6 +2482,37 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "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.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "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.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.5" + } + } + } + }, "object-get": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.0.tgz", @@ -1583,6 +2525,24 @@ "integrity": "sha1-d9qIJ/Bz0BHJ4bFz+JV4FHAkZ4U=", "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.0" + } + }, + "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" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -1628,6 +2588,20 @@ "wordwrap": "~0.0.2" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -1647,6 +2621,12 @@ "os-tmpdir": "^1.0.0" } }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + }, "pad": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", @@ -1655,6 +2635,18 @@ "wcwidth": "^1.0.1" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1666,6 +2658,23 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "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==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1679,11 +2688,134 @@ "safe-buffer": "^5.1.2" } }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.4.0.tgz", + "integrity": "sha512-bFNJ3v56QwqB6JtAl/YrczlmEKBPBVJ3n5nW905kgvG1ex9DajODpTs0kLAFxyLwoubDQux/RPJFL6WrnD/vpg==", + "dev": true, + "requires": { + "@babel/parser": "~7.4.4", + "@babel/runtime": "~7.4.4", + "chalk": "~2.4.2", + "escodegen": "~1.11.1", + "fs-extra": "~7.0.1", + "globby": "~9.2.0", + "into-stream": "~5.1.0", + "minimist": "~1.2.0", + "multistream": "~2.1.1", + "pkg-fetch": "~2.6.2", + "progress": "~2.0.3", + "resolve": "1.6.0", + "stream-meter": "~1.0.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "resolve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", + "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + } + } + }, + "pkg-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.6.2.tgz", + "integrity": "sha512-7DN6YYP1Kct02mSkhfblK0HkunJ7BJjGBkSkFdIW/QKIovtAMaICidS7feX+mHfnZ98OP7xFJvBluVURlrHJxA==", + "dev": true, + "requires": { + "@babel/runtime": "~7.4.4", + "byline": "~5.0.0", + "chalk": "~2.4.1", + "expand-template": "~2.0.3", + "fs-extra": "~7.0.1", + "minimist": "~1.2.0", + "progress": "~2.0.0", + "request": "~2.88.0", + "request-progress": "~3.0.0", + "semver": "~6.0.0", + "unique-temp-dir": "~1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "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 + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "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==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", @@ -1829,6 +2961,34 @@ } } }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "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==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "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=", + "dev": true + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -1863,6 +3023,15 @@ } } }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, "requizzle": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", @@ -1889,6 +3058,12 @@ "path-parse": "^1.0.6" } }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restify": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/restify/-/restify-8.4.0.tgz", @@ -1967,6 +3142,23 @@ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + }, + "dependencies": { + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + } + } + }, "safe-regex2": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", @@ -2032,6 +3224,29 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.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.0" + } + } + } + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -2050,6 +3265,125 @@ "is-arrayish": "^0.3.1" } }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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.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" + }, + "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.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.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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.0", + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.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.0" + } + }, + "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.0" + } + }, + "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" + } + } + } + }, + "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.0" + }, + "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.5" + } + } + } + }, "sort-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-2.0.0.tgz", @@ -2078,6 +3412,25 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "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=", + "dev": true + }, "spdy": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", @@ -2143,6 +3496,15 @@ } } }, + "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==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2185,6 +3547,27 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, + "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.0" + } + } + } + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -2210,6 +3593,15 @@ } } }, + "stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=", + "dev": true, + "requires": { + "readable-stream": "^2.1.4" + } + }, "stream-transform": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.0.1.tgz", @@ -2255,6 +3647,15 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, + "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" + } + }, "table-layout": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", @@ -2331,6 +3732,54 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "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.0.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.5" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -2365,6 +3814,15 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "typescript": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", @@ -2394,17 +3852,86 @@ "source-map": "~0.6.1" } }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", + "dev": true + }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", + "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "os-tmpdir": "^1.0.1", + "uid2": "0.0.3" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "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.3", + "has-values": "^0.1.4", + "isobject": "^2.0.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 + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -2413,6 +3940,12 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "usb": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/usb/-/usb-1.5.0.tgz", @@ -2423,6 +3956,12 @@ "node-pre-gyp": "^0.11.0" } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2518,6 +4057,12 @@ "triple-beam": "^1.2.0" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", diff --git a/package.json b/package.json index 67cb9b5..61bb4b9 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,12 @@ "scripts": { "test": "./node_modules/.bin/qunit", "docs": "sh docs.sh", - "compile": "./node_modules/.bin/tsc -p tsconfig.json" + "compile": "./node_modules/.bin/tsc -p tsconfig.json", + "pretest": "", + "version": "", + "postversion": "git push && git push --tags", + "u": "npm run git -- -m \"update\"", + "git": "npm version patch --force" }, "repository": { "type": "git", @@ -43,6 +48,7 @@ "@types/node-persist": "0.0.33", "@types/uuid": "^3.4.5", "jsdoc-to-markdown": "^5.0.2", + "pkg": "^4.4.0", "qunit": "^2.9.3", "typescript": "^3.6.4" } From a627143c22d9c0ccc04ecec6ccaa610edc82386b Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 11:42:04 -0500 Subject: [PATCH 06/12] update --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c46d35..cf080b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "intval3", - "version": "3.1.0", + "version": "3.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 61bb4b9..a0a7f7f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "intval3", - "version": "3.1.0", + "version": "3.1.1", "description": "Intervalometer for the Bolex", "main": "index.js", "scripts": { From de481ee1852a21e181c91205832676358fabf5ce Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 21:16:13 -0500 Subject: [PATCH 07/12] Add bleno types. --- lib/ble/index.js | 168 ++++++++++++++++++--------------- lib/ble/index.js.map | 2 +- lib/wifi/index.js | 204 ++++++++++++++++++++++----------------- lib/wifi/index.js.map | 2 +- package-lock.json | 9 ++ package.json | 1 + src/ble/index.ts | 208 +++++++++++++++++++++++----------------- src/wifi/index.ts | 215 ++++++++++++++++++++++++------------------ 8 files changed, 467 insertions(+), 342 deletions(-) diff --git a/lib/ble/index.js b/lib/ble/index.js index 3e27678..bf23506 100644 --- a/lib/ble/index.js +++ b/lib/ble/index.js @@ -1,31 +1,38 @@ 'use strict'; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); /** @module ble */ /** Bluetooth Low Energy module */ -const util = require('util'); -const os = require('os'); +const util_1 = require("util"); +const os_1 = require("os"); +const fs_extra_1 = require("fs-extra"); const log = require('../log')('ble'); -const wifi = require('../wifi'); +const wifi_1 = require("../wifi"); +const wifi = new wifi_1.Wifi(); const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3'; const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble'; const CHAR_ID = process.env.CHAR_ID || 'intval3char'; const WIFI_ID = process.env.WIFI_ID || 'wifichar'; -const NETWORK = os.networkInterfaces(); +const NETWORK = os_1.networkInterfaces(); //?type? const MAC = getMac() || spoofMac(); //Give the device a unique device name, needs to be in env process.env.BLENO_DEVICE_NAME += '_' + MAC; -const bleno = require('bleno'); +const bleno_1 = __importDefault(require("bleno")); +const { Characteristic } = bleno_1.default; let currentWifi = 'disconnected'; let currentAddr = null; let getState; const chars = []; function createChar(name, uuid, prop, write, read) { - function characteristic() { - bleno.Characteristic.call(this, { - uuid: uuid, + const characteristic = function () { + Characteristic.call(this, { + uuid, properties: prop }); - } - util.inherits(characteristic, bleno.Characteristic); + }; + util_1.inherits(characteristic, Characteristic); if (prop.indexOf('read') !== -1) { //data, offset, withoutResponse, callback characteristic.prototype.onReadRequest = read; @@ -36,61 +43,67 @@ function createChar(name, uuid, prop, write, read) { chars.push(new characteristic()); } function createChars(onWrite, onRead) { - createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead); - createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead); + const permissions = ['read', 'write']; + createChar('intval3', CHAR_ID, permissions, onWrite, onRead); + createChar('wifi', WIFI_ID, permissions, onWifiWrite, onWifiRead); } -function onWifiWrite(data, offset, withoutResponse, callback) { +async function onWifiWrite(data, offset) { let result; let utf8; - let obj; + let obj = {}; let ssid; let pwd; + let psk; if (offset) { log.warn(`Offset scenario`); - result = bleno.Characteristic.RESULT_ATTR_NOT_LONG; - return callback(result); + result = bleno_1.default.Characteristic.RESULT_ATTR_NOT_LONG; + return result; } utf8 = data.toString('utf8'); obj = JSON.parse(utf8); ssid = obj.ssid; pwd = obj.pwd; log.info(`connecting to AP`, { ssid: ssid }); - return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { - if (err) { - log.error('Error hashing wifi password', err); - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; - return callback(result); - } - return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { - if (err) { - log.error('Error configuring wifi', err); - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; - return callback(result); - } - currentWifi = ssid; - currentAddr = getIp(); - log.info(`Connected to AP`, { ssid: ssid, ip: currentAddr }); - result = bleno.Characteristic.RESULT_SUCCESS; - return callback(result); - }); - }); + try { + psk = await wifi.createPSK(ssid, pwd); + } + catch (err) { + log.error('Error hashing wifi password', err); + result = bleno_1.default.Characteristic.RESULT_UNLIKELY_ERROR; + return result; + } + try { + await wifi.setNetwork(ssid, psk.plaintext, psk.hash); + } + catch (err) { + log.error('Error configuring wifi', err); + result = bleno_1.default.Characteristic.RESULT_UNLIKELY_ERROR; + return result; + } + currentWifi = ssid; + currentAddr = getIp(); + log.info(`Connected to AP`, { ssid, ip: currentAddr }); + result = bleno_1.default.Characteristic.RESULT_SUCCESS; + return result; } -function onWifiRead(offset, callback) { - let result = bleno.Characteristic.RESULT_SUCCESS; +async function onWifiRead(offset, callback) { + let result = bleno_1.default.Characteristic.RESULT_SUCCESS; let wifiRes = {}; let data; - wifi.list((err, list) => { - if (err) { - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR; - return callback(result); - } - wifiRes.available = list; - wifiRes.current = currentWifi; - wifiRes.ip = currentAddr; - log.info('Discovered available APs', { found: list.length }); - data = new Buffer(JSON.stringify(wifiRes)); - callback(result, data.slice(offset, data.length)); - }); + let list; + try { + list = await wifi.list(); + } + catch (err) { + result = bleno_1.default.Characteristic.RESULT_UNLIKELY_ERROR; + return callback(result); + } + wifiRes.available = list; + wifiRes.current = currentWifi; + wifiRes.ip = currentAddr; + log.info('Discovered available APs', { found: list.length }); + data = new Buffer(JSON.stringify(wifiRes)); + return callback(result, data.slice(offset, data.length)); } function getMac() { const colonRe = new RegExp(':', 'g'); @@ -102,15 +115,15 @@ function getMac() { function spoofMac() { const fs = require('fs'); const FSPATH = require.resolve('uuid'); - const IDFILE = os.homedir() + '/.intval3id'; + const IDFILE = os_1.homedir() + '/.intval3id'; let uuid; let UUIDPATH; let TMP; let MACTMP; let dashRe; delete require.cache[FSPATH]; - if (fs.existsSync(IDFILE)) { - return fs.readFileSync(IDFILE, 'utf8'); + if (fs_extra_1.existsSync(IDFILE)) { + return fs_extra_1.readFileSync(IDFILE, 'utf8'); } uuid = require('uuid').v4; UUIDPATH = require.resolve('uuid'); @@ -118,13 +131,13 @@ function spoofMac() { TMP = uuid(); MACTMP = TMP.replace(dashRe, '').substring(0, 12); dashRe = new RegExp('-', 'g'); - fs.writeFileSync(IDFILE, MACTMP, 'utf8'); + fs_extra_1.writeFileSync(IDFILE, MACTMP, 'utf8'); return MACTMP; } function getIp() { let addr = null; let ipv4; - const ifaces = os.networkInterfaces(); + const ifaces = os_1.networkInterfaces(); if (ifaces && ifaces.wlan0) { ipv4 = ifaces.wlan0.filter(iface => { if (iface.family === 'IPv4') { @@ -137,8 +150,8 @@ function getIp() { } return addr; } -function capitalize(s) { - return s[0].toUpperCase() + s.slice(1); +function capitalize(str) { + return str[0].toUpperCase() + str.slice(1); } /** Class representing the bluetooth interface */ class BLE { @@ -150,42 +163,47 @@ class BLE { constructor(bleGetState) { log.info('Starting bluetooth service'); getState = bleGetState; - bleno.on('stateChange', state => { + bleno_1.default.on('stateChange', state => { log.info('stateChange', { state: state }); if (state === 'poweredOn') { log.info('Starting advertising', { DEVICE_NAME, DEVICE_ID: process.env.BLENO_DEVICE_NAME }); - bleno.startAdvertising(DEVICE_NAME, [CHAR_ID]); + bleno_1.default.startAdvertising(DEVICE_NAME, [CHAR_ID]); } else { - bleno.stopAdvertising(); + bleno_1.default.stopAdvertising(); } }); - bleno.on('advertisingStart', err => { + bleno_1.default.on('advertisingStart', err => { log.info('advertisingStart', { res: (err ? 'error ' + err : 'success') }); createChars(this._onWrite.bind(this), this._onRead.bind(this)); if (!err) { - bleno.setServices([ - new bleno.PrimaryService({ + bleno_1.default.setServices([ + new bleno_1.default.PrimaryService({ uuid: SERVICE_ID, characteristics: chars }) ]); } }); - bleno.on('accept', clientAddress => { + bleno_1.default.on('accept', clientAddress => { log.info('accept', { clientAddress: clientAddress }); }); - bleno.on('disconnect', clientAddress => { + bleno_1.default.on('disconnect', clientAddress => { log.info('disconnect', { clientAddress: clientAddress }); }); - wifi.getNetwork((err, ssid) => { - if (err) { - return log.error('wifi.getNetwork', err); - } - currentWifi = ssid; - currentAddr = getIp(); - log.info('wifi.getNetwork', { ssid: ssid, ip: currentAddr }); - }); + this._refreshWifi(); + } + async _refreshWifi() { + let ssid; + try { + ssid = await wifi.getNetwork(); + } + catch (err) { + return log.error('wifi.getNetwork', err); + } + currentWifi = ssid; + currentAddr = getIp(); + log.info('wifi.getNetwork', { ssid: ssid, ip: currentAddr }); } _onWrite(data, offset, withoutResponse, callback) { let result = {}; @@ -194,12 +212,12 @@ class BLE { let fn; if (offset) { log.warn(`Offset scenario`); - result = bleno.Characteristic.RESULT_ATTR_NOT_LONG; + result = bleno_1.default.Characteristic.RESULT_ATTR_NOT_LONG; return callback(result); } utf8 = data.toString('utf8'); obj = JSON.parse(utf8); - result = bleno.Characteristic.RESULT_SUCCESS; + result = bleno_1.default.Characteristic.RESULT_SUCCESS; fn = `_on${capitalize(obj.type)}`; if (obj.type && this[fn]) { return this[fn](obj, () => { @@ -211,7 +229,7 @@ class BLE { } } _onRead(offset, callback) { - const result = bleno.Characteristic.RESULT_SUCCESS; + const result = bleno_1.default.Characteristic.RESULT_SUCCESS; const state = getState(); const data = new Buffer(JSON.stringify(state)); callback(result, data.slice(offset, data.length)); diff --git a/lib/ble/index.js.map b/lib/ble/index.js.map index a8dc81c..a9bd41f 100644 --- a/lib/ble/index.js.map +++ b/lib/ble/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/wifi/index.js b/lib/wifi/index.js index 4e12e7e..fb029c7 100644 --- a/lib/wifi/index.js +++ b/lib/wifi/index.js @@ -10,114 +10,117 @@ const iwgetid = '/sbin/iwgetid'; const log = require('../log')('wifi'); const child_process_1 = require("child_process"); const fs_1 = require("fs"); -let _entry = null; -let _ssid = null; /** Class representing the wifi features */ class Wifi { constructor() { - this._cb = null; + this._ssid = null; + this._entry = null; } /** * List available wifi access points * * @param {function} callback Function which gets invoked after list is returned */ - list(callback) { - child_process_1.exec(iwlist, (err, stdout, stderr) => { - if (err) { - console.error(err); - return callback(err); - } - const limit = 20; - const lines = stdout.split('\n'); - let output = []; - let line; - let i = 0; - for (let l of lines) { - line = l.replace('ESSID:', '').trim(); - if (line !== '""' && i < limit) { - line = line.replace(quoteRe, ''); - output.push(line); + async list() { + return new Promise((resolve, reject) => { + return child_process_1.exec(iwlist, (err, stdout, stderr) => { + if (err) { + log.error('list', err); + return reject(err); } - i++; - } - output = output.filter(ap => { - if (ap !== '') - return ap; + const limit = 20; + const lines = stdout.split('\n'); + let output = []; + let line; + let i = 0; + for (let l of lines) { + line = l.replace('ESSID:', '').trim(); + if (line !== '""' && i < limit) { + line = line.replace(quoteRe, ''); + output.push(line); + } + i++; + } + output = output.filter(ap => { + if (ap !== '') + return ap; + }); + return resolve(output); }); - return callback(null, output); }); } /** * (internal function) Invoked after config file is read, * then invokes file write on the config file * - * @param {object} err (optional) Error object only present if problem reading config file - * @param {string} data Contents of the config file */ - _readConfigCb(err, data) { + async _readConfig() { + let data; let parsed; let current; - if (err) { - console.error(err); - return this._cb(err); + try { + data = await fs_1.readFile(filePath, 'utf8'); + } + catch (err) { + log.error('_readConfig', err); + throw err; } parsed = this._parseConfig(data); current = parsed.find((network) => { - return network.ssid === _ssid; + return network.ssid === this._ssid; }); if (typeof current !== 'undefined') { - data = data.replace(current.raw, _entry); + data = data.replace(current.raw, this._entry); } else { - data += '\n\n' + _entry; + data += '\n\n' + this._entry; } - _entry = null; - fs_1.writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)); + this._entry = null; + return data; } /** * (internal function) Invoked after config file is written, * then executes reconfiguration command * - * @param {object} err (optional) Error object only present if problem writing config file */ - _writeConfigCb(err) { - if (err) { - console.error(err); - return this._cb(err); + async _writeConfig(data) { + try { + await fs_1.writeFile(filePath, data, { encoding: 'utf-8' }); + } + catch (err) { + log.error('_readConfigCb', err); + throw err; } - child_process_1.exec(reconfigure, this._reconfigureCb.bind(this)); } /** * (internal function) Invoked after reconfiguration command is complete * - * @param {object} err (optional) Error object only present if configuration command fails - * @param {string} stdout Standard output from reconfiguration command - * @param {string} stderr Error output from command if fails */ - _reconfigureCb(err, stdout, stderr) { - if (err) { - console.error(err); - return this._cb(err); - } - log.info('Wifi reconfigured'); - child_process_1.exec(refresh, this._refreshCb.bind(this)); + async _reconfigure() { + return new Promise((resolve, reject) => { + return child_process_1.exec(reconfigure, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + log.info('Wifi reconfigured'); + return resolve(true); + }); + }); } /** * (internal function) Invoked after wifi refresh command is complete * - * @param {object} err (optional) Error object only present if refresh command fails - * @param {string} stdout Standard output from refresh command - * @param {string} stderr Error output from command if fails */ - _refreshCb(err, stdout, stderr) { - if (err) { - console.error(err); - return this._cb(err); - } - log.info('Wifi refreshed'); - this._cb(null, { ssid: _ssid }); - this._cb = () => { }; + async _refresh() { + return new Promise((resolve, reject) => { + return child_process_1.exec(refresh, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + log.info('Wifi refreshed'); + return resolve({ ssid: this._ssid }); + }); + }); } _parseConfig(str) { const networks = []; @@ -157,21 +160,22 @@ class Wifi { * * @param {string} ssid SSID of wifi network * @param {string} pwd Plaintext passphrase of wifi network - * @param {function} callback Function called after psk hash is generated */ - createPSK(ssid, pwd, callback) { + createPSK(ssid, pwd) { const cmd = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="`; let lines; let hash; let plaintext; - child_process_1.exec(cmd, (err, stdout, stderr) => { - if (err) { - return callback(err); - } - lines = stdout.replace('#psk=', '').split('psk='); - hash = lines[1]; - plaintext = lines[0]; - callback(null, hash.trim(), plaintext.trim()); + return new Promise((resolve, reject) => { + return child_process_1.exec(cmd, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + lines = stdout.replace('#psk=', '').split('psk='); + hash = lines[1]; + plaintext = lines[0]; + return resolve({ hash: hash.trim(), plaintext: plaintext.trim() }); + }); }); } /** @@ -180,30 +184,56 @@ class Wifi { * @param {string} ssid SSID of network to configure * @param {string} pwd Password of access point, plaintext to be masked * @param {string} hash Password/SSID of access point, securely hashed - * @param {function} callback Function invoked after process is complete, or fails */ - setNetwork(ssid, pwd, hash, callback) { + async setNetwork(ssid, pwd, hash) { let masked = pwd.split('').map(char => { return char !== '"' ? '*' : '"'; }).join(''); - _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n`; - this._cb = callback; - _ssid = ssid; - fs_1.readFile(filePath, 'utf8', this._readConfigCb.bind(this)); + let data; + this._entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n`; + this._ssid = ssid; + try { + data = await this._readConfig(); + } + catch (err) { + log.error(err); + } + try { + await this._writeConfig(data); + } + catch (err) { + log.error(err); + } + try { + await this._reconfigure(); + } + catch (err) { + log.error(err); + } + try { + await this._refresh(); + } + catch (err) { + log.error(err); + } + return { ssid: this._ssid }; } /** * Executes command which gets the currently connected network * * @param {function} callback Function which is invoked after command is completed */ - getNetwork(callback) { + async getNetwork() { let output; - child_process_1.exec(iwgetid, (err, stdout, stderr) => { - if (err) { - return callback(err); - } - output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim(); - callback(null, output); + return new Promise((resolve, reject) => { + return child_process_1.exec(iwgetid, (err, stdout, stderr) => { + if (err) { + return reject(err); + } + output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim(); + return resolve(output); + }); }); } } -module.exports = new Wifi(); +exports.Wifi = Wifi; +module.exports.Wifi = Wifi; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/wifi/index.js.map b/lib/wifi/index.js.map index 8adff32..60c1c64 100644 --- a/lib/wifi/index.js.map +++ b/lib/wifi/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cf080b8..eb84b99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,6 +57,15 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@types/bleno": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/bleno/-/bleno-0.4.1.tgz", + "integrity": "sha512-CY4CG5jFURnigEi1qQVnKgtyxg7jQEAmTjBpawejmt91XRThKowP90IvZksv/Qrjfh5IgZIGLe0SXGMUpwS6ZA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", diff --git a/package.json b/package.json index a0a7f7f..490a19e 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "winston": "^3.2.1" }, "devDependencies": { + "@types/bleno": "^0.4.1", "@types/fs-extra": "^8.0.0", "@types/node": "^12.7.12", "@types/node-persist": "0.0.33", diff --git a/src/ble/index.ts b/src/ble/index.ts index 5b6b5fc..257fcca 100644 --- a/src/ble/index.ts +++ b/src/ble/index.ts @@ -3,38 +3,51 @@ /** @module ble */ /** Bluetooth Low Energy module */ -const util = require('util') -const os = require('os') +import { inherits } from 'util' +import { networkInterfaces, homedir } from 'os' +import { readFileSync, existsSync, writeFileSync } from 'fs-extra' const log = require('../log')('ble') -const wifi = require('../wifi') +import { Wifi } from '../wifi' +const wifi = new Wifi() -const DEVICE_NAME = process.env.DEVICE_NAME || 'intval3' -const SERVICE_ID = process.env.SERVICE_ID || 'intval3_ble' -const CHAR_ID = process.env.CHAR_ID || 'intval3char' -const WIFI_ID = process.env.WIFI_ID || 'wifichar' -const NETWORK = os.networkInterfaces() -const MAC = getMac() || spoofMac() +const DEVICE_NAME : string = process.env.DEVICE_NAME || 'intval3' +const SERVICE_ID : string = process.env.SERVICE_ID || 'intval3_ble' +const CHAR_ID : string = process.env.CHAR_ID || 'intval3char' +const WIFI_ID : string = process.env.WIFI_ID || 'wifichar' +const NETWORK : any = networkInterfaces() //?type? +const MAC : string = getMac() || spoofMac() //Give the device a unique device name, needs to be in env process.env.BLENO_DEVICE_NAME += '_' + MAC -const bleno = require('bleno') +import bleno from 'bleno' +const { Characteristic } = bleno +let currentWifi : string = 'disconnected' +let currentAddr : string = null +let getState : Function -let currentWifi = 'disconnected' -let currentAddr = null -let getState +const chars : any[] = [] -const chars = [] +interface WifiInfo { + ssid : string + pwd : string +} -function createChar(name, uuid, prop, write, read) { - function characteristic () { - bleno.Characteristic.call(this, { - uuid : uuid, +interface WifiResponse { + available : string[] + current : string + ip : string +} + +function createChar(name : string, uuid : string, prop : string[], write : Function, read : Function) { + const characteristic : any = function () { + Characteristic.call(this, { + uuid, properties: prop }) } - util.inherits(characteristic, bleno.Characteristic) + inherits(characteristic, Characteristic) if (prop.indexOf('read') !== -1) { //data, offset, withoutResponse, callback characteristic.prototype.onReadRequest = read @@ -45,64 +58,76 @@ function createChar(name, uuid, prop, write, read) { chars.push(new characteristic()) } -function createChars (onWrite, onRead) { - createChar('intval3', CHAR_ID, ['read', 'write'], onWrite, onRead) - createChar('wifi', WIFI_ID, ['read', 'write'], onWifiWrite, onWifiRead) +function createChars (onWrite : Function, onRead : Function) { + const permissions : string[] = ['read', 'write']; + createChar('intval3', CHAR_ID, permissions, onWrite, onRead) + createChar('wifi', WIFI_ID, permissions, onWifiWrite, onWifiRead) } -function onWifiWrite (data, offset, withoutResponse, callback) { - let result - let utf8 - let obj - let ssid - let pwd +async function onWifiWrite (data : any, offset : number) { + let result : any + let utf8 : string + let obj : WifiInfo = {} as WifiInfo + let ssid : string + let pwd : string + let psk : any + if (offset) { log.warn(`Offset scenario`) result = bleno.Characteristic.RESULT_ATTR_NOT_LONG - return callback(result) - } + return result + } + utf8 = data.toString('utf8') obj = JSON.parse(utf8) ssid = obj.ssid pwd = obj.pwd - log.info(`connecting to AP`, { ssid : ssid }) - return wifi.createPSK(ssid, pwd, (err, hash, plaintext) => { - if (err) { - log.error('Error hashing wifi password', err) - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - return wifi.setNetwork(ssid, plaintext, hash, (err, data) => { - if (err) { - log.error('Error configuring wifi', err) - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - currentWifi = ssid - currentAddr = getIp() - log.info(`Connected to AP`, { ssid : ssid, ip : currentAddr }) - result = bleno.Characteristic.RESULT_SUCCESS - return callback(result) - }) - }) + + log.info(`connecting to AP`, { ssid : ssid }) + + try { + psk = await wifi.createPSK(ssid, pwd) + } catch (err) { + log.error('Error hashing wifi password', err) + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return result + } + + try { + await wifi.setNetwork(ssid, psk.plaintext, psk.hash) + } catch (err) { + log.error('Error configuring wifi', err) + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return result + } + + currentWifi = ssid + currentAddr = getIp() + log.info(`Connected to AP`, { ssid, ip : currentAddr }) + result = bleno.Characteristic.RESULT_SUCCESS + return result } -function onWifiRead (offset, callback) { - let result = bleno.Characteristic.RESULT_SUCCESS - let wifiRes = {} - let data - wifi.list((err, list) => { - if (err) { - result = bleno.Characteristic.RESULT_UNLIKELY_ERROR - return callback(result) - } - wifiRes.available = list - wifiRes.current = currentWifi - wifiRes.ip = currentAddr - log.info('Discovered available APs', { found : list.length }) - data = new Buffer(JSON.stringify(wifiRes)) - callback(result, data.slice(offset, data.length)) - }) +async function onWifiRead (offset : number, callback : Function) { + let result : any = bleno.Characteristic.RESULT_SUCCESS + let wifiRes : WifiResponse = {} as WifiResponse + let data : any + let list : any + + try { + list = await wifi.list() + } catch (err) { + result = bleno.Characteristic.RESULT_UNLIKELY_ERROR + return callback(result) + } + + wifiRes.available = list + wifiRes.current = currentWifi + wifiRes.ip = currentAddr + log.info('Discovered available APs', { found : list.length }) + data = new Buffer(JSON.stringify(wifiRes)) + + return callback(result, data.slice(offset, data.length)) } function getMac () { @@ -116,15 +141,15 @@ function getMac () { function spoofMac () { const fs = require('fs') const FSPATH = require.resolve('uuid') - const IDFILE = os.homedir() + '/.intval3id' + const IDFILE = homedir() + '/.intval3id' let uuid let UUIDPATH let TMP let MACTMP let dashRe delete require.cache[FSPATH] - if (fs.existsSync(IDFILE)) { - return fs.readFileSync(IDFILE, 'utf8') + if (existsSync(IDFILE)) { + return readFileSync(IDFILE, 'utf8') } uuid = require('uuid').v4 UUIDPATH = require.resolve('uuid') @@ -132,14 +157,14 @@ function spoofMac () { TMP = uuid() MACTMP = TMP.replace(dashRe, '').substring(0, 12) dashRe = new RegExp('-', 'g') - fs.writeFileSync(IDFILE, MACTMP, 'utf8') + writeFileSync(IDFILE, MACTMP, 'utf8') return MACTMP } function getIp () { let addr = null let ipv4 - const ifaces = os.networkInterfaces() + const ifaces = networkInterfaces() if (ifaces && ifaces.wlan0) { ipv4 = ifaces.wlan0.filter(iface => { if (iface.family === 'IPv4') { @@ -154,8 +179,8 @@ function getIp () { } -function capitalize (s) { - return s[0].toUpperCase() + s.slice(1) +function capitalize (str : string) { + return str[0].toUpperCase() + str.slice(1) } /** Class representing the bluetooth interface */ @@ -165,7 +190,7 @@ class BLE { * * @constructor */ - constructor (bleGetState) { + constructor (bleGetState : Function) { log.info('Starting bluetooth service') getState = bleGetState @@ -201,29 +226,38 @@ class BLE { log.info('disconnect', { clientAddress : clientAddress }) }) - wifi.getNetwork((err, ssid) => { - if (err) { - return log.error('wifi.getNetwork', err) - } - currentWifi = ssid - currentAddr = getIp() - log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) - }) + this._refreshWifi() } - _onWrite (data, offset, withoutResponse, callback) { + private async _refreshWifi () { + let ssid : string + + try { + ssid = await wifi.getNetwork() as string + } catch (err) { + return log.error('wifi.getNetwork', err) + } + + currentWifi = ssid + currentAddr = getIp() + log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) + } + private _onWrite (data : any, offset : number, withoutResponse : Function, callback : Function) { let result = {} let utf8 let obj let fn + if (offset) { log.warn(`Offset scenario`) result = bleno.Characteristic.RESULT_ATTR_NOT_LONG return callback(result) - } + } + utf8 = data.toString('utf8') obj = JSON.parse(utf8) result = bleno.Characteristic.RESULT_SUCCESS - fn = `_on${capitalize(obj.type)}` + fn = `_on${capitalize(obj.type)}` + if (obj.type && this[fn]) { return this[fn](obj, () => { callback(result) @@ -233,7 +267,7 @@ class BLE { } } - _onRead (offset, callback) { + private _onRead (offset : number, callback : Function) { const result = bleno.Characteristic.RESULT_SUCCESS const state = getState() const data = new Buffer(JSON.stringify( state )) @@ -245,7 +279,7 @@ class BLE { * @param {string} eventName Name of the event to to bind * @param {function} callback Invoked when the event is triggered */ - on (eventName, callback) { + on (eventName : string, callback : Function) { this[`_on${capitalize(eventName)}`] = callback } diff --git a/src/wifi/index.ts b/src/wifi/index.ts index 9e5a956..e5d2d38 100644 --- a/src/wifi/index.ts +++ b/src/wifi/index.ts @@ -12,9 +12,7 @@ const iwgetid : string = '/sbin/iwgetid' const log : any = require('../log')('wifi') import { exec } from 'child_process' import { readFile, writeFile } from 'fs' - -let _entry : string = null -let _ssid : string = null +import { reject } from 'q' interface Network { raw : string @@ -22,8 +20,10 @@ interface Network { } /** Class representing the wifi features */ -class Wifi { - private _cb : Function = null +export class Wifi { + private _ssid : string = null + private _entry : string = null + constructor () { } @@ -32,102 +32,110 @@ class Wifi { * * @param {function} callback Function which gets invoked after list is returned */ - list (callback : Function) { - exec(iwlist, (err, stdout, stderr) => { - if (err) { - console.error(err) - return callback(err) - } - const limit = 20; - const lines = stdout.split('\n') - let output = [] - let line - let i = 0 - for (let l of lines) { - line = l.replace('ESSID:', '').trim() - if (line !== '""' && i < limit) { - line = line.replace(quoteRe, '') - output.push(line) + public async list () { + return new Promise ((resolve : Function, reject : Function) => { + return exec(iwlist, (err, stdout, stderr) => { + if (err) { + log.error('list', err) + return reject(err) } - i++ - } - output = output.filter(ap => { - if (ap !== '') return ap + const limit : number = 20; + const lines : string[] = stdout.split('\n') + let output : string[] = [] + let line : string + let i = 0 + for (let l of lines) { + line = l.replace('ESSID:', '').trim() + if (line !== '""' && i < limit) { + line = line.replace(quoteRe, '') + output.push(line) + } + i++ + } + output = output.filter(ap => { + if (ap !== '') return ap + }) + return resolve(output) }) - return callback(null, output) }) } /** * (internal function) Invoked after config file is read, * then invokes file write on the config file * - * @param {object} err (optional) Error object only present if problem reading config file - * @param {string} data Contents of the config file */ - _readConfigCb (err : Error, data : string) { + async _readConfig () { + let data : string let parsed : Network[] let current : Network - if (err) { - console.error(err) - return this._cb(err) + + try { + data = await readFile(filePath, 'utf8') + } catch (err) { + log.error('_readConfig', err) + throw err } + parsed = this._parseConfig(data) current = parsed.find((network : Network) => { - return network.ssid === _ssid + return network.ssid === this._ssid }) if (typeof current !== 'undefined') { - data = data.replace(current.raw, _entry) + data = data.replace(current.raw, this._entry) } else { - data += '\n\n' + _entry + data += '\n\n' + this._entry } - _entry = null - writeFile(filePath, data, 'utf8', this._writeConfigCb.bind(this)) + this._entry = null + + return data + } /** * (internal function) Invoked after config file is written, * then executes reconfiguration command * - * @param {object} err (optional) Error object only present if problem writing config file */ - _writeConfigCb (err : Error) { - if (err) { - console.error(err) - return this._cb(err) + private async _writeConfig (data : string) { + try { + await writeFile(filePath, data, { encoding : 'utf-8' }) + } catch (err) { + log.error('_readConfigCb', err) + throw err } - exec(reconfigure, this._reconfigureCb.bind(this)) + } /** * (internal function) Invoked after reconfiguration command is complete * - * @param {object} err (optional) Error object only present if configuration command fails - * @param {string} stdout Standard output from reconfiguration command - * @param {string} stderr Error output from command if fails */ - _reconfigureCb (err : Error, stdout : string, stderr : string) { - if (err) { - console.error(err) - return this._cb(err) - } - log.info('Wifi reconfigured') - exec(refresh, this._refreshCb.bind(this)) + private async _reconfigure () { + return new Promise((resolve : Function, reject : Function) => { + return exec(reconfigure, (err : Error, stdout : string, stderr : string) => { + if (err) { + return reject(err) + } + log.info('Wifi reconfigured') + return resolve(true) + }) + }) } /** * (internal function) Invoked after wifi refresh command is complete * - * @param {object} err (optional) Error object only present if refresh command fails - * @param {string} stdout Standard output from refresh command - * @param {string} stderr Error output from command if fails */ - _refreshCb (err : Error, stdout : string, stderr : string) { - if (err) { - console.error(err) - return this._cb(err) - } - log.info('Wifi refreshed') - this._cb(null, { ssid : _ssid }) - this._cb = () => {} + private async _refresh () { + return new Promise((resolve : Function, reject : Function) => { + return exec(refresh, (err : Error, stdout : string, stderr : string) => { + if (err) { + return reject(err) + } + log.info('Wifi refreshed') + return resolve({ ssid : this._ssid }); + }) + }) } - _parseConfig (str : string) : Network[] { + + private _parseConfig (str : string) : Network[] { const networks : Network[] = [] const lines = str.split('\n') let network : Network = {} as Network @@ -162,21 +170,22 @@ class Wifi { * * @param {string} ssid SSID of wifi network * @param {string} pwd Plaintext passphrase of wifi network - * @param {function} callback Function called after psk hash is generated */ - createPSK (ssid : string, pwd : string, callback : Function) { + createPSK (ssid : string, pwd : string) { const cmd : string = `wpa_passphrase '${ssid.replace(/'/g, `'\\''`)}' '${pwd.replace(/'/g, `'\\''`)}' | grep "psk="` let lines : string[] let hash : string let plaintext : string - exec(cmd, (err, stdout, stderr) => { - if (err) { - return callback(err) - } - lines = stdout.replace('#psk=', '').split('psk=') - hash = lines[1] - plaintext = lines[0] - callback(null, hash.trim(), plaintext.trim()) + return new Promise ((resolve : Function, reject : Function) => { + return exec(cmd, (err, stdout, stderr) => { + if (err) { + return reject(err) + } + lines = stdout.replace('#psk=', '').split('psk=') + hash = lines[1] + plaintext = lines[0] + return resolve({ hash : hash.trim(), plaintext : plaintext.trim()}) + }) }) } /** @@ -185,30 +194,54 @@ class Wifi { * @param {string} ssid SSID of network to configure * @param {string} pwd Password of access point, plaintext to be masked * @param {string} hash Password/SSID of access point, securely hashed - * @param {function} callback Function invoked after process is complete, or fails */ - setNetwork (ssid : string, pwd : string, hash : string, callback : Function) { + async setNetwork (ssid : string, pwd : string, hash : string) { let masked : string = pwd.split('').map(char => { return char !== '"' ? '*' : '"' }).join('') - _entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` - this._cb = callback - _ssid = ssid - readFile(filePath, 'utf8', this._readConfigCb.bind(this)) + let data : string + this._entry = `network={\n\tssid="${ssid}"\n\t#psk=${masked}\n\tpsk=${hash}\n}\n` + this._ssid = ssid + + try { + data = await this._readConfig() + } catch (err) { + log.error(err) + } + try { + await this._writeConfig(data) + } catch (err) { + log.error(err) + } + try { + await this._reconfigure() + } catch (err) { + log.error(err) + } + try { + await this._refresh() + } catch (err) { + log.error(err) + } + + return { ssid : this._ssid } } /** * Executes command which gets the currently connected network * * @param {function} callback Function which is invoked after command is completed */ - getNetwork (callback : Function) { - let output - exec(iwgetid, (err, stdout, stderr) => { - if (err) { - return callback(err) - } - output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim() - callback(null, output) - }) + public async getNetwork () { + let output : string + return new Promise((resolve : Function, reject : Function) => { + return exec(iwgetid, (err : Error, stdout : string, stderr : string) => { + if (err) { + return reject(err) + } + output = stdout.split('ESSID:')[1].replace(quoteRe, '').trim() + return resolve(output) + }) + }) + } } -module.exports = new Wifi() \ No newline at end of file +module.exports.Wifi = Wifi \ No newline at end of file From 07229c7925bdcc13c373ed0b76a8be59bc749d8c Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 26 Nov 2019 22:10:59 -0500 Subject: [PATCH 08/12] Refactored wifi and ble into typescript and converted logic to async/await for most methods. Compiles without errors ATM. --- lib/ble/index.js | 9 ++++----- lib/ble/index.js.map | 2 +- lib/wifi/index.js | 6 +++--- lib/wifi/index.js.map | 2 +- src/ble/index.ts | 21 ++++++++++++--------- src/wifi/index.ts | 4 ++-- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/lib/ble/index.js b/lib/ble/index.js index bf23506..fc5b665 100644 --- a/lib/ble/index.js +++ b/lib/ble/index.js @@ -161,6 +161,7 @@ class BLE { * @constructor */ constructor(bleGetState) { + this.listeners = {}; log.info('Starting bluetooth service'); getState = bleGetState; bleno_1.default.on('stateChange', state => { @@ -209,7 +210,6 @@ class BLE { let result = {}; let utf8; let obj; - let fn; if (offset) { log.warn(`Offset scenario`); result = bleno_1.default.Characteristic.RESULT_ATTR_NOT_LONG; @@ -218,9 +218,8 @@ class BLE { utf8 = data.toString('utf8'); obj = JSON.parse(utf8); result = bleno_1.default.Characteristic.RESULT_SUCCESS; - fn = `_on${capitalize(obj.type)}`; - if (obj.type && this[fn]) { - return this[fn](obj, () => { + if (obj.type && this.listeners[obj.type]) { + return this.listeners[obj.type](obj, () => { callback(result); }); } @@ -241,7 +240,7 @@ class BLE { * @param {function} callback Invoked when the event is triggered */ on(eventName, callback) { - this[`_on${capitalize(eventName)}`] = callback; + this.listeners[eventName] = callback; } } module.exports = BLE; diff --git a/lib/ble/index.js.map b/lib/ble/index.js.map index a9bd41f..21ca73c 100644 --- a/lib/ble/index.js.map +++ b/lib/ble/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ble/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/wifi/index.js b/lib/wifi/index.js index fb029c7..d4a3e68 100644 --- a/lib/wifi/index.js +++ b/lib/wifi/index.js @@ -9,7 +9,7 @@ const iwlist = '/sbin/iwlist wlan0 scanning | grep "ESSID:"'; const iwgetid = '/sbin/iwgetid'; const log = require('../log')('wifi'); const child_process_1 = require("child_process"); -const fs_1 = require("fs"); +const fs_extra_1 = require("fs-extra"); /** Class representing the wifi features */ class Wifi { constructor() { @@ -59,7 +59,7 @@ class Wifi { let parsed; let current; try { - data = await fs_1.readFile(filePath, 'utf8'); + data = await fs_extra_1.readFile(filePath, 'utf8'); } catch (err) { log.error('_readConfig', err); @@ -85,7 +85,7 @@ class Wifi { */ async _writeConfig(data) { try { - await fs_1.writeFile(filePath, data, { encoding: 'utf-8' }); + await fs_extra_1.writeFile(filePath, data, 'utf8'); } catch (err) { log.error('_readConfigCb', err); diff --git a/lib/wifi/index.js.map b/lib/wifi/index.js.map index 60c1c64..0d18d4f 100644 --- a/lib/wifi/index.js.map +++ b/lib/wifi/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wifi/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/ble/index.ts b/src/ble/index.ts index 257fcca..d5685ca 100644 --- a/src/ble/index.ts +++ b/src/ble/index.ts @@ -183,8 +183,11 @@ function capitalize (str : string) { return str[0].toUpperCase() + str.slice(1) } +type functionKeys = "_onRead" | "_onWrite"; + /** Class representing the bluetooth interface */ class BLE { + listeners : any = {} /** * Establishes Bluetooth Low Energy services, accessible to process through this class * @@ -228,6 +231,7 @@ class BLE { this._refreshWifi() } + private async _refreshWifi () { let ssid : string @@ -241,11 +245,11 @@ class BLE { currentAddr = getIp() log.info('wifi.getNetwork', {ssid : ssid, ip : currentAddr }) } + private _onWrite (data : any, offset : number, withoutResponse : Function, callback : Function) { - let result = {} - let utf8 - let obj - let fn + let result : any = {} + let utf8 : string + let obj : any if (offset) { log.warn(`Offset scenario`) @@ -256,17 +260,16 @@ class BLE { utf8 = data.toString('utf8') obj = JSON.parse(utf8) result = bleno.Characteristic.RESULT_SUCCESS - fn = `_on${capitalize(obj.type)}` - if (obj.type && this[fn]) { - return this[fn](obj, () => { + if (obj.type && this.listeners[obj.type]) { + return this.listeners[obj.type](obj, () => { callback(result) }) } else { return callback(result) } - } + private _onRead (offset : number, callback : Function) { const result = bleno.Characteristic.RESULT_SUCCESS const state = getState() @@ -280,7 +283,7 @@ class BLE { * @param {function} callback Invoked when the event is triggered */ on (eventName : string, callback : Function) { - this[`_on${capitalize(eventName)}`] = callback + this.listeners[eventName] = callback } } diff --git a/src/wifi/index.ts b/src/wifi/index.ts index e5d2d38..3181f9c 100644 --- a/src/wifi/index.ts +++ b/src/wifi/index.ts @@ -11,7 +11,7 @@ const iwgetid : string = '/sbin/iwgetid' const log : any = require('../log')('wifi') import { exec } from 'child_process' -import { readFile, writeFile } from 'fs' +import { readFile, writeFile } from 'fs-extra' import { reject } from 'q' interface Network { @@ -97,7 +97,7 @@ export class Wifi { */ private async _writeConfig (data : string) { try { - await writeFile(filePath, data, { encoding : 'utf-8' }) + await writeFile(filePath, data, 'utf8') } catch (err) { log.error('_readConfigCb', err) throw err From 1013ff117695207674a28105d4c3d090150167d4 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Fri, 27 Dec 2019 18:57:08 -0500 Subject: [PATCH 09/12] Broke the index page. I can't believe I let that slip. --- index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/index.js b/index.js index 370623f..c74ca82 100644 --- a/index.js +++ b/index.js @@ -655,6 +655,9 @@ async function index (req, res, next) { } catch (err) { return next(err) } + + res.send(data) + return next() } function init () { From a328e824fbf4a602050997b73c633285693a30f5 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Fri, 27 Dec 2019 18:57:39 -0500 Subject: [PATCH 10/12] update --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb84b99..7b5596a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "intval3", - "version": "3.1.1", + "version": "3.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 490a19e..1c3f738 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "intval3", - "version": "3.1.1", + "version": "3.1.2", "description": "Intervalometer for the Bolex", "main": "index.js", "scripts": { From ee6c3d1a8197fbb5774a4e6f8ef230ca5ddc0984 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Fri, 27 Dec 2019 19:49:31 -0500 Subject: [PATCH 11/12] Mortally stupid typo --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index c74ca82..08bdf8d 100644 --- a/index.js +++ b/index.js @@ -656,7 +656,7 @@ async function index (req, res, next) { return next(err) } - res.send(data) + res.end(data) return next() } From e745ce404d62f885b5694b8cac367dce8fcee92b Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Fri, 27 Dec 2019 19:49:36 -0500 Subject: [PATCH 12/12] update --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b5596a..a5ed427 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "intval3", - "version": "3.1.2", + "version": "3.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1c3f738..b1d5691 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "intval3", - "version": "3.1.2", + "version": "3.1.3", "description": "Intervalometer for the Bolex", "main": "index.js", "scripts": {