diff --git a/app/package.json b/app/package.json index 2d104cf734..88972a541e 100755 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "2.2.5-600series-qa.16", + "version": "2.2.5-600series-qa.17", "description": "Tidepool Project Universal Uploader", "main": "./main.js", "author": { @@ -10,9 +10,11 @@ }, "license": "BSD-2-Clause", "dependencies": { + "drivelist": "5.1.8", "keytar": "4.0.4", "node-hid": "0.5.7", - "serialport": "5.0.0" + "serialport": "5.0.0", + "usb": "1.3.1" }, "optionalDependencies": { "winreg": "1.2.4" diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 3a3ed16f2e..78785d925c 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -24,7 +24,7 @@ const devices = { name: 'Medtronic 523, 723 or 530G', selectName: 'Medtronic 523, 723, 530G (Bayer Contour Next Link)', source: {type: 'device', driverId: 'Medtronic'}, - enabled: {mac: true, win: true} + enabled: {mac: true, win: true, linux: true} }, medtronic600: { instructions: 'Pair your Bayer Contour Next Link 2.4 with your Medtronic pump and connect to your computer', @@ -46,7 +46,7 @@ const devices = { key: 'omnipod', name: 'Insulet OmniPod', source: {type: 'block', driverId: 'InsuletOmniPod', extension: '.ibf'}, - enabled: {mac: true, win: true} + enabled: {mac: true, win: true, linux: true} }, dexcom: { instructions: 'Plug in receiver with micro-USB', @@ -89,7 +89,7 @@ const devices = { key: 'bayercontournext', name: 'Bayer Contour Next', source: {type: 'device', driverId: 'BayerContourNext'}, - enabled: {mac: true, win: true} + enabled: {mac: true, win: true, linux: true} }, animas: { instructions: 'Suspend and align back of pump with IR dongle front', @@ -98,6 +98,13 @@ const devices = { source: {type: 'device', driverId: 'Animas'}, enabled: {mac: true, win: true} }, + onetouchverio: { + instructions: 'Plug in meter with micro-USB', + name: 'OneTouch Verio & Verio Flex', + key: 'onetouchverio', + source: {type: 'device', driverId: 'OneTouchVerio'}, + enabled: {linux: true, mac: true, win: false} + }, onetouchverioiq: { instructions: 'Plug in meter with mini-USB', name: 'OneTouch VerioIQ', diff --git a/app/utils/drivers.darwin.js b/app/utils/drivers.darwin.js index 1833c52f9e..72380a182a 100644 --- a/app/utils/drivers.darwin.js +++ b/app/utils/drivers.darwin.js @@ -27,22 +27,21 @@ export function checkVersion(dispatch) { dispatch(sync.checkingForDriverUpdate()); - function setInstallOpts(iconsPath, scriptPath, driverPath) { + function setInstallOpts(iconsPath, scriptPath, extractPath) { const options = { name: 'Tidepool Driver Installer', icns: iconsPath }; - const execString = scriptPath.replace(/ /g, '\\ ') + ' ' + driverPath.replace(/ /g, '\\ '); + const execString = scriptPath.replace(/ /g, '\\ ') + ' ' + extractPath.replace(/ /g, '\\ '); dispatch(sync.driverUpdateShellOpts({options,execString})); } - function readVersion(dPath, driver) { + function readVersion(pListFile) { try { - const list = plist.parse(fs.readFileSync(path.join(dPath, driver, '/Contents/Info.plist'), 'utf8')); - const version = list.CFBundleVersion; - return version; + const list = plist.parse(fs.readFileSync(pListFile, 'utf8')); + return list.CFBundleVersion; } catch (error) { - if(error.code ==='ENOENT') { + if (error.code === 'ENOENT') { return 'Not found'; } else { console.log(error); @@ -51,11 +50,16 @@ export function checkVersion(dispatch) { } } - function hasOldDriver(dPath, driverList) { - let installedVersion; + function hasOldDriver(dPath, driverList, installPath, pListFile) { + let installedVersion, currentVersion; for (const driver of driverList) { - const currentVersion = readVersion(dPath, driver); - installedVersion = readVersion('/Library/Extensions/', driver); + if (pListFile === null) { + currentVersion = readVersion(path.join(dPath, driver, driver + '.plist')); + installedVersion = readVersion(path.join(installPath, driver + '.plist')); + } else { + currentVersion = readVersion(path.join(dPath, driver, pListFile)); + installedVersion = readVersion(path.join(installPath, driver, pListFile)); + } console.log(driver,'version: Installed =', installedVersion, ', Current =', currentVersion); if(currentVersion !== installedVersion) { @@ -68,26 +72,30 @@ export function checkVersion(dispatch) { } const appFolder = path.dirname(remote.app.getAppPath()); - let zipPath = path.join(appFolder,'driver/extensions.zip'); - let extractPath = path.join(appFolder,'driver/'); - let driverPath = path.join(extractPath,'extensions'); - let iconsPath = path.join(appFolder,'/Tidepool Uploader.icns'); - let scriptPath = path.join(appFolder,'driver/updateDrivers.sh'); + let zipPath = path.join(appFolder, 'driver/extensions.zip'); + let extractPath = path.join(appFolder, 'driver/'); + let driverPath = path.join(extractPath, 'extensions'); + let helperPath = path.join(extractPath, 'helpers'); + let iconsPath = path.join(appFolder, '/Tidepool Uploader.icns'); + let scriptPath = path.join(appFolder, 'driver/updateDrivers.sh'); if (isDev) { const rootDir = path.resolve(appFolder, '../../../../../../'); zipPath = path.resolve(rootDir, 'resources/mac/extensions.zip'); extractPath = path.resolve(rootDir, 'build/driver/'); driverPath = path.join(extractPath, 'extensions'); + helperPath = path.join(extractPath, 'helpers'); iconsPath = path.join(rootDir, 'resources/icon.icns'); scriptPath = path.resolve(rootDir, 'resources/mac/updateDrivers.sh'); } decompress(zipPath, extractPath).then(files => { const driverList = fs.readdirSync(driverPath).filter(e => path.extname(e) === '.kext' ); + const helperList = fs.readdirSync(helperPath).filter(e => e[0] !== '.'); - if (hasOldDriver(driverPath, driverList)) { - setInstallOpts(iconsPath, scriptPath, driverPath); + if (hasOldDriver(driverPath, driverList, '/Library/Extensions/', '/Contents/Info.plist') || + hasOldDriver(helperPath, helperList, '/Library/LaunchDaemons/', null)) { + setInstallOpts(iconsPath, scriptPath, extractPath); } }); diff --git a/app/utils/rollbar.js b/app/utils/rollbar.js index bddfda6860..e2a2b6d954 100644 --- a/app/utils/rollbar.js +++ b/app/utils/rollbar.js @@ -5,6 +5,7 @@ import Rollbar from 'rollbar/dist/rollbar.umd'; let rollbar = new Rollbar({ accessToken: '1843589282464f4facd43f794c8201a8', captureUncaught: true, + enabled: process.env.NODE_ENV === 'production', payload: { environment: 'electron_renderer', client: { diff --git a/app/yarn.lock b/app/yarn.lock index 3547edcbe6..39f7dd0cf8 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -18,8 +18,8 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" aproba@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" are-we-there-yet@~1.1.2: version "1.1.4" @@ -28,6 +28,12 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -62,7 +68,7 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bindings@1.3.0, bindings@^1.3.0: +bindings@1.3.0, bindings@^1.2.1, bindings@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" @@ -114,8 +120,8 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: delayed-stream "~1.0.0" commander@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + version "2.12.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" concat-map@0.0.1: version "0.0.1" @@ -141,7 +147,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@^2.2.0, debug@^2.6.6: +debug@^2.2.0, debug@^2.6.0, debug@^2.6.6: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -160,8 +166,18 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" detect-libc@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +drivelist@5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-5.1.8.tgz#76f0d5f747e36544b5fa77ff914ff9a97877b01f" + dependencies: + bindings "^1.2.1" + debug "^2.6.0" + js-yaml "^3.4.1" + lodash "^4.16.4" + nan "^2.6.2" ecc-jsbn@~0.1.1: version "0.1.1" @@ -175,6 +191,10 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + expand-template@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc" @@ -183,10 +203,14 @@ extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -306,8 +330,8 @@ inherits@2, inherits@~2.0.0, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -327,6 +351,13 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +js-yaml@^3.4.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -364,6 +395,10 @@ keytar@4.0.4: dependencies: nan "2.5.1" +lodash@^4.16.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -402,13 +437,15 @@ nan@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" -nan@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" +nan@^2.6.2, nan@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" node-abi@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.1.tgz#c9cda256ec8aa99bcab2f6446db38af143338b2a" + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.2.tgz#4da6caceb6685fcd31e7dd1994ef6bb7d0a9c0b2" + dependencies: + semver "^5.4.1" node-hid@0.5.7: version "0.5.7" @@ -418,7 +455,7 @@ node-hid@0.5.7: nan "^2.6.2" prebuild-install "^2.2.2" -node-pre-gyp@^0.6.36: +node-pre-gyp@^0.6.30, node-pre-gyp@^0.6.36: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" dependencies: @@ -496,8 +533,8 @@ performance-now@^0.2.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" prebuild-install@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.3.0.tgz#19481247df728b854ab57b187ce234211311b485" + version "2.4.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.4.1.tgz#c28ba1d1eedc17fbd6b3229a657ffc0fba479b49" dependencies: expand-template "^1.0.2" github-from-package "0.0.0" @@ -523,8 +560,8 @@ promirepl@^1.0.1: resolved "https://registry.yarnpkg.com/promirepl/-/promirepl-1.0.1.tgz#2951aaeba2bf3fe2274ff63a16d94c04ca60872e" pump@^1.0.0, pump@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -595,7 +632,7 @@ safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -semver@^5.3.0: +semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -633,6 +670,10 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" @@ -698,8 +739,8 @@ tar-pack@^3.4.0: uid-number "^0.0.6" tar-stream@^1.1.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" + version "1.5.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" dependencies: bl "^1.0.0" end-of-stream "^1.0.0" @@ -738,6 +779,13 @@ unzip-response@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" +usb@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.3.1.tgz#b5f8c360a53bf28f5c9fbc12d64c7f61e4346ab7" + dependencies: + nan "^2.8.0" + node-pre-gyp "^0.6.30" + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" diff --git a/appveyor.yml b/appveyor.yml index 3827648a22..578be5d702 100755 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -image: Visual Studio 2013 +image: Visual Studio 2017 environment: APPVEYOR_CACHE_ENTRY_ZIP_ARGS: -t7z @@ -22,6 +22,8 @@ shallow_clone: true clone_depth: 1 +skip_branch_with_pr: true + install: - ps: $env:package_version = (Get-Content -Raw -Path package.json | ConvertFrom-Json).version - ps: Update-AppveyorBuild -Version "$env:package_version-$env:APPVEYOR_BUILD_NUMBER" diff --git a/config/development.sh b/config/development.sh new file mode 100644 index 0000000000..72d7940aff --- /dev/null +++ b/config/development.sh @@ -0,0 +1,7 @@ +export API_URL='https://dev-api.tidepool.org' +export UPLOAD_URL='https://dev-uploads.tidepool.org' +export BLIP_URL='https://dev-blip.tidepool.org' +export DATA_URL='https://dev-api.tidepool.org/dataservices' +export DEBUG_ERROR=false +export REDUX_LOG=false +export REDUX_DEV_UI=false diff --git a/docs/checklists/oneTouchVerio.md b/docs/checklists/oneTouchVerio.md new file mode 100644 index 0000000000..d73e2ae3a5 --- /dev/null +++ b/docs/checklists/oneTouchVerio.md @@ -0,0 +1,44 @@ +# LifeScan OneTouch Verio & Verio Flex + +## Checklist for Blood Glucose Meter Implementation + +(Key: + + - `[x]` available in data protocol/documented in spec and implemented + - `[-]` available in data protocol/documented in spec but *not* yet implemented + - `[?]` unknown whether available in data protocol/documented in spec; *not* yet implemented + - `*[ ]` TODO: needs implementation! + - `[ ]` unavailable in data protocol and/or not documented in spec and not yet implemented) + +### Required if Present + +- `[x]` smbg values +- `[-]` units of smbg values (read from device, not hard-coded) +- `[x]` out-of-range values (LO or HI) +- `[ ]` out-of-range value thresholds (e.g., often 20 for low and 600 for high on BGMs) +- `[ ]` date & time settings changes +- `[ ]` blood ketone values +- `[ ]` units of blood ketone values (read from device, not hard-coded) +- `[ ]` ketone out-of-range values +- `[ ]` ketone out-of-range value thresholds + +## Notes +- Display units of smbg values are available in data protocol, but always reported in mg/dL +- HI/LO values are not described in spec, but user manual states that values above 600 and below 20 mg/dL are out-of-range, and are annotated as such + +### No Tidepool Data Model Yet + +- `[-]` control (solution) tests (whether marked in UI or auto-detected) - until we have a data model, these should be discarded +- `[-]` device settings, other than date & time (e.g., target blood glucose range) +- `[-]` tag/note (e.g., pre- vs. post-meal) + +### Tidepool ingestion API + +Choose one of the following: + + - `[x]` legacy "jellyfish" ingestion API + - `[ ]` platform ingestion API + +### Known implementation issues/TODOs + +*Use this space to describe device-specific known issues or implementation TODOs **not** contained in the above datatype-specific sections.* diff --git a/lib/core/api.js b/lib/core/api.js index fbf44fd812..9084596072 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -31,6 +31,7 @@ var errorText = require('../../app/constants/errors'); var log = isElectron() ? bows('Api') : console.log; var builder = require('../objectBuilder')(); var localStore = require('./localStore'); +var rollbar = require('../../app/utils/rollbar.js'); // for cli tools running in node if (typeof localStore === 'function') { @@ -656,6 +657,7 @@ api.errors = {}; api.errors.log = function(error, message, properties) { api.log('GET /errors'); + rollbar.error(error, error.debug); return tidepool.logAppError(error.debug, message, properties); }; diff --git a/lib/core/device.js b/lib/core/device.js index 8c28f24a5d..dd5c0e46be 100644 --- a/lib/core/device.js +++ b/lib/core/device.js @@ -23,9 +23,11 @@ var async = require('async'); var debugMode = require('../../app/utils/debugMode'); var serialDevice = require('../serialDevice'); var hidDevice = require('../hidDevice'); +var usbDevice = require('../usbDevice'); var driverManager = require('../driverManager'); var builder = require('../objectBuilder')(); var hid = require('node-hid'); +var usb = require('usb'); var SerialPort = require('serialport'); var dexcomDriver = require('../drivers/dexcom/dexcomDriver'); @@ -34,6 +36,7 @@ var abbottPrecisionXtra = require('../drivers/abbott/abbottPrecisionXtra'); var tandemDriver = require('../drivers/tandem/tandemDriver'); var insuletOmniPod = require('../drivers/insulet/insuletDriver'); var oneTouchUltra2 = require('../drivers/onetouch/oneTouchUltra2'); +var oneTouchVerio = require('../drivers/onetouch/oneTouchVerio'); var oneTouchVerioIQ = require('../drivers/onetouch/oneTouchVerioIQ'); var abbottFreeStyleLite = require('../drivers/abbott/abbottFreeStyleLite'); var abbottFreeStyleLibre = require('../drivers/abbott/abbottFreeStyleLibre'); @@ -59,6 +62,7 @@ device._deviceDrivers = { 'InsuletOmniPod': insuletOmniPod, 'Tandem': tandemDriver, 'OneTouchUltra2': oneTouchUltra2, + 'OneTouchVerio': oneTouchVerio, 'OneTouchVerioIQ': oneTouchVerioIQ, 'AbbottFreeStyleLite': abbottFreeStyleLite, 'AbbottFreeStyleLibre': abbottFreeStyleLibre, @@ -73,6 +77,7 @@ device._deviceComms = { 'OneTouchUltraMini': serialDevice, 'AbbottPrecisionXtra': serialDevice, 'OneTouchUltra2': serialDevice, + 'OneTouchVerio': usbDevice, 'OneTouchVerioIQ': serialDevice, 'AbbottFreeStyleLite': serialDevice, 'AbbottFreeStyleLibre': hidDevice, @@ -136,7 +141,8 @@ device._driverManifests = { 'AbbottFreeStyleLibre': { mode: 'HID', usb: [ - {vendorId: 6753, productId: 13904} + {vendorId: 6753, productId: 13904}, // FreeStyle Libre + {vendorId: 6753, productId: 13936} // FreeStyle Libre Pro ] }, 'BayerContourNext': { @@ -147,7 +153,8 @@ device._driverManifests = { {vendorId: 6777, productId: 25088}, // Bayer Contour Next Link {vendorId: 6777, productId: 25344}, // Bayer Contour Next Link mmol/L {vendorId: 6777, productId: 25104}, // Bayer Contour Next Link 2.4 - {vendorId: 6777, productId: 24578} // Bayer Contour USB + {vendorId: 6777, productId: 24578}, // Bayer Contour USB + {vendorId: 6777, productId: 30720} // Bayer Contour Next One ] }, 'Animas': { @@ -160,6 +167,13 @@ device._driverManifests = { {vendorId: 1659, productId: 8963} ] }, + 'OneTouchVerio': { + mode: 'usb', + usb: [ + {vendorId: 10086, productId: 0}, + {vendorId: 10086, productId: 4} + ] + }, 'OneTouchVerioIQ': { mode: 'serial', bitrate: 38400, @@ -284,43 +298,54 @@ device._createDriverConfig = function(driverId, options) { }; }; -device.detectHid = function(driverId, cb) { - var self = this; +device.findUsbDevice = function(driverId, usbDevices) { var driverManifest = this.getDriverManifest(driverId); - var results = hid.devices(); - results = _.filter(results, function(p) { + + var matchingUsbDevices = _.filter(usbDevices, function(usbDevice) { var found = false; for (var i = 0; i < driverManifest.usb.length; i++) { - if(driverManifest.usb[i].vendorId === p.vendorId && - driverManifest.usb[i].productId === p.productId) { - found = true; + if(driverManifest.usb[i].vendorId === usbDevice.vendorId && + driverManifest.usb[i].productId === usbDevice.productId) { + found = true; } - }; + } return found; }); - var devices = _.map(results, function(result) { - var retval = { + var devices = _.map(matchingUsbDevices, function(result) { + return { driverId: driverId, deviceId: result.deviceId, vendorId: result.vendorId, productId: result.productId }; - - return retval; }); - var devdata = _.head(devices); - if (devices.length > 1) { - self.log('WARNING: More than one device found for "' + driverId + '"'); + this.log('WARNING: More than one device found for "' + driverId + '"'); device.othersConnected = devices.length - 1; } - return cb(null, devdata); + return _.first(devices); }; device.detectUsb = function(driverId, cb) { + var usbDevices = _.map(usb.getDeviceList(), function(result) { + return { + deviceId: result.deviceDescriptor.idDevice, + vendorId: result.deviceDescriptor.idVendor, + productId: result.deviceDescriptor.idProduct + }; + }); + + return cb(null, this.findUsbDevice(driverId, usbDevices)); +}; + +device.detectHid = function(driverId, cb) { + return cb(null, this.findUsbDevice(driverId, hid.devices())); +}; + +device.detectUsbSerial = function(driverId, cb) { var self = this; var driverManifest = this.getDriverManifest(driverId); @@ -358,28 +383,30 @@ device.detectUsb = function(driverId, cb) { }; - SerialPort.list(function (err, results) { - console.log('Connected device(s):', results); - results = _.filter(results, function(p) { - var vendorId = parseInt(p.vendorId,16); - var productId = parseInt(p.productId,16); + SerialPort.list(function (err, serialDevices) { + console.log('Connected device(s):', serialDevices); + serialDevices = _.filter(serialDevices, function(serialDevice) { + var vendorId = parseInt(serialDevice.vendorId, 16); + var productId = parseInt(serialDevice.productId, 16); - var found = false; for (var i = 0; i < driverManifest.usb.length; i++) { if(driverManifest.usb[i].vendorId === vendorId && - driverManifest.usb[i].productId == productId) { + driverManifest.usb[i].productId === productId) { - if (self._os == 'win') { - found = true; - } else if (p.comName.match('/dev/tty.+')) { - found = true; + if (self._os === 'mac') { + if (serialDevice.comName.match('/dev/tty.+')) { + return true; } + } else { + return true; + } } - }; - return found; + } + return false; }); - getDevice(results); + console.log('Possible device(s):', serialDevices); + getDevice(serialDevices); }); }; @@ -413,7 +440,7 @@ device.detect = function(driverId, options, cb) { }); }); - }else{ + } else if (driverManifest.mode === 'usb') { this.detectUsb(driverId, function(err, devdata) { @@ -425,6 +452,30 @@ device.detect = function(driverId, options, cb) { return cb(); } + self._deviceInfoCache[driverId] = _.cloneDeep(devdata); + + self.detectHelper(driverId, options, function(err, usbDevice) { + + if (err) { + return cb(err); + } + device = _.assign(devdata, usbDevice); + return cb(null, devdata); + }); + }); + + } else { + + this.detectUsbSerial(driverId, function(err, devdata) { + + if (err) { + return cb(err); + } + + if (!devdata) { + return cb(); + } + self._deviceInfoCache[driverId] = _.cloneDeep(devdata); self.detectHelper(driverId, options, function(err, ftdiDevice) { if (err) { diff --git a/lib/drivers/abbott/abbottFreeStyleLibre.js b/lib/drivers/abbott/abbottFreeStyleLibre.js index 8832244412..77fc5973f6 100644 --- a/lib/drivers/abbott/abbottFreeStyleLibre.js +++ b/lib/drivers/abbott/abbottFreeStyleLibre.js @@ -15,13 +15,21 @@ * == BSD2 LICENSE == */ -import { clone, assign } from 'lodash'; +import { clone, assign, forEach, forEachRight, map } from 'lodash'; import async from 'async'; import sundial from 'sundial'; +import crypto from 'crypto'; import FreeStyleLibreProtocol from './freeStyleLibreProtocol'; import FreeStyleLibreData from './freeStyleLibreData'; -import { DB_TABLE_ID, CFG_TABLE_ID, DEVICE_MODEL_NAME, COMPRESSION } from './freeStyleLibreConstants'; +import { + FSLIBRE_PRO_PRODUCT_ID, + DB_TABLE_ID, + CFG_TABLE_ID, + DEVICE_MODEL_NAME, + COMPRESSION, + OP_CODE, +} from './freeStyleLibreConstants'; const isBrowser = typeof window !== 'undefined'; // eslint-disable-next-line no-console @@ -77,7 +85,7 @@ export default function (config) { return cb(err, null); } data.connect = true; - result.forEach((element) => { + forEach(result, (element) => { if (typeof element === 'object') { debug('getConfigInfo: result object: ', element); assign(data.deviceInfo, element); @@ -93,37 +101,64 @@ export default function (config) { fetchData(progress, data, cb) { progress(0); - const getterFunctions = [ - (callback) => { protocol.setCompression(COMPRESSION.ENABLED, callback); }, - (callback) => { protocol.getDbSchema(callback); }, - (callback) => { protocol.getCfgSchema(callback); }, - (callback) => { protocol.getDateTime(callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.METER_FACTORY_CONFIGURATION, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.METER_SETTINGS, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.USER_PATIENT_CONFIGURATION, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.USER_PATIENT_SETTINGS, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.INSULIN_SETTINGS, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.REMINDER_STRING, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.SMART_TAG_NOTES, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.STORED_SENSOR_INFORMATION, callback); }, - (callback) => { protocol.getCfgData(CFG_TABLE_ID.REMINDER_DATA, callback); }, - (callback) => { protocol.getDatabase(DB_TABLE_ID.GLUCOSE_RESULT, callback); }, - (callback) => { protocol.getDatabase(DB_TABLE_ID.RAPID_ACTING_INSULIN, callback); }, - (callback) => { protocol.getDatabase(DB_TABLE_ID.HISTORICAL_DATA, callback); }, - (callback) => { protocol.getDatabase(DB_TABLE_ID.EVENT, callback); }, - ]; + let getterFunctions; + if (data.deviceInfo.productId === FSLIBRE_PRO_PRODUCT_ID) { + getterFunctions = [ + (callback) => { protocol.getDbSchema(callback); }, + (callback) => { protocol.getCfgSchema(callback); }, + (callback) => { protocol.getDateTime(callback); }, + (callback) => { + protocol.getCfgData(CFG_TABLE_ID.METER_FACTORY_CONFIGURATION, callback); + }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.METER_SETTINGS, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.USER_PATIENT_CONFIGURATION, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.USER_PATIENT_SETTINGS, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.GLUCOSE_RESULT, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.HISTORICAL_DATA, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.EVENT, callback); }, + ]; + } else { + getterFunctions = [ + (callback) => { protocol.setCompression(COMPRESSION.ENABLED, callback); }, + (callback) => { protocol.getDbSchema(callback); }, + (callback) => { protocol.getCfgSchema(callback); }, + (callback) => { protocol.getDateTime(callback); }, + (callback) => { + protocol.getCfgData(CFG_TABLE_ID.METER_FACTORY_CONFIGURATION, callback); + }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.METER_SETTINGS, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.USER_PATIENT_CONFIGURATION, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.USER_PATIENT_SETTINGS, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.INSULIN_SETTINGS, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.REMINDER_STRING, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.SMART_TAG_NOTES, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.STORED_SENSOR_INFORMATION, callback); }, + (callback) => { protocol.getCfgData(CFG_TABLE_ID.REMINDER_DATA, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.GLUCOSE_RESULT, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.RAPID_ACTING_INSULIN, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.HISTORICAL_DATA, callback); }, + (callback) => { protocol.getDatabase(DB_TABLE_ID.EVENT, callback); }, + ]; + } - data.aapPackets = []; let counter = 0; - async.series(getterFunctions, (err, results) => { + const updateProgress = (getterFunction, callback) => { + getterFunction(callback); counter += 1; progress(100 * (counter / getterFunctions.length)); + }; + + // apply updateProgress function to all getterFunctions to update progress after each one + getterFunctions = map(getterFunctions, getterFunction => + (callback => updateProgress(getterFunction, callback))); + data.aapPackets = []; + async.series(getterFunctions, (err, results) => { if (err) { debug('fetchData: error: ', err); return cb(err, data); } - results.forEach((aapPackets) => { + forEach(results, (aapPackets) => { if (typeof aapPackets === 'object') { data.aapPackets = data.aapPackets.concat(aapPackets); } @@ -136,7 +171,34 @@ export default function (config) { debug('processData: num aapPackets:', data.aapPackets.length); progress(0); - data.deviceInfo.deviceId = `${data.deviceInfo.driverId}-${data.deviceInfo.serialNumber}`; + if (data.deviceInfo.productId === FSLIBRE_PRO_PRODUCT_ID) { + // The unique ID of the sensor read with the Libre Pro handheld device cannot be read from + // the device according to the available documentation. + // To still be able to identify each sensor, a unique ID is generated by hashing the oldest + // historical glucose data packet. + // This packet contains a timestamp and the handheld device's DB record number which make it + // unique for this device and globally unique in combination with the device ID. + let generatedSensorId = ''; + const TABLE_ID_OFFSET = 0; + // find oldest historical data packet + forEachRight(data.aapPackets, (aapPacket) => { + if (aapPacket.opCode === OP_CODE.GET_DATABASE && + aapPacket.data[TABLE_ID_OFFSET] === DB_TABLE_ID.HISTORICAL_DATA) { + // generate unique ID by hashing oldest historical data packet to identify this sensor + const hash = crypto.createHash('sha1'); + hash.update(aapPacket.data); + generatedSensorId = hash.digest('hex'); + } + }); + + // append generatedSensorId to deviceId to be able to identify duplicate uploads of the + // same sensor to different patient accounts + data.deviceInfo.deviceId = `${data.deviceInfo.driverId}Pro-${data.deviceInfo.serialNumber}-${generatedSensorId}`; + + debug('processData: Libre Pro device/sensor ID:', data.deviceInfo.deviceId); + } else { + data.deviceInfo.deviceId = `${data.deviceInfo.driverId}-${data.deviceInfo.serialNumber}`; + } cfg.builder.setDefaults({ deviceId: data.deviceInfo.deviceId }); data.post_records = diff --git a/lib/drivers/abbott/freeStyleLibreConstants.js b/lib/drivers/abbott/freeStyleLibreConstants.js index c77b7f886a..bb8c793098 100644 --- a/lib/drivers/abbott/freeStyleLibreConstants.js +++ b/lib/drivers/abbott/freeStyleLibreConstants.js @@ -16,6 +16,7 @@ */ export const DEVICE_MODEL_NAME = 'FreeStyle Libre'; +export const FSLIBRE_PRO_PRODUCT_ID = 0x3670; export const KETONE_VALUE_FACTOR = 18.0; // according to specs export const KETONE_HI = 8.0; diff --git a/lib/drivers/abbott/freeStyleLibreData.js b/lib/drivers/abbott/freeStyleLibreData.js index aa401b9352..1a1a34e097 100644 --- a/lib/drivers/abbott/freeStyleLibreData.js +++ b/lib/drivers/abbott/freeStyleLibreData.js @@ -123,10 +123,11 @@ export default class FreeStyleLibreData { // the oldest record number in the result DB is used as limit how far back the history records // are processed but in case the result record DB does not contain any data, process at least - // the last 1000 records this number is lower than the maximal size of the result DB, so we will - // not process further back than any potentially truncated time change records + // the last 5000 records + // this number is lower than the maximal size of the result DB, so we will not process further + // back than any potentially truncated time change records const oldestValidRecordNumber = - Math.max(0, this.oldestResultRecordNumber - Math.max(0, 1000 - this.numResultRecords)); + Math.max(0, this.oldestResultRecordNumber - Math.max(0, 5000 - this.numResultRecords)); // use only records that are newer than the oldestValidRecordNumber // older records cannot be properly timestamped due to potentially truncated time change records diff --git a/lib/drivers/abbott/tools/fslibre_usb_dissector.lua b/lib/drivers/abbott/tools/fslibre_usb_dissector.lua index cf36cf8727..b6ea22215e 100644 --- a/lib/drivers/abbott/tools/fslibre_usb_dissector.lua +++ b/lib/drivers/abbott/tools/fslibre_usb_dissector.lua @@ -272,7 +272,10 @@ function fslibre_usb.init() pkt_state = {} partial_aap_buf = {} - -- register this disector for USB vendor:product 1a61:3650 + -- register this disector for USB vendor:product 1a61:3650 (FreeStyle Libre) DissectorTable.get("usb.product"):add(0x1a613650, fslibre_usb) + + -- register this disector for USB vendor:product 1a61:3670 (FreeStyle Libre Pro) + DissectorTable.get("usb.product"):add(0x1a613670, fslibre_usb) end diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index 093a22a048..e5ecb05ab1 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -36,13 +36,12 @@ module.exports = function (config) { var hidDevice = config.deviceComms; var messageBuffer = []; var HID_PACKET_SIZE = 64; + var HEADER_SIZE = 3; var RETRIES = 6; // With no date & time settings changes available, // timezone is applied across-the-board cfg.tzoUtil = new TZOUtil(cfg.timezone, new Date().toISOString(), []); - var MAGIC_HEADER = 'ABC'; - /* end */ var ASCII_CONTROL = { @@ -63,7 +62,8 @@ module.exports = function (config) { 'Bayer6300' : 'Contour Next Link', // mmol/L 'Bayer7350' : 'Contour Next', // mg/dL & mmol/L 'Bayer7390' : 'Contour USB', // mg/dL - 'Bayer7410' : 'Contour Next USB' // mg/dL & mmol/L + 'Bayer7410' : 'Contour Next USB', // mg/dL & mmol/L + 'Contour7800' : 'Contour Next One' // mg/dL & mmol/L }; var astmMessageBuffer = { @@ -119,11 +119,12 @@ module.exports = function (config) { }; var buildPacket = function (command, cmdlength) { - var datalen = cmdlength + 4; // we used 4 bytes because we add (0x41 0x42 0x43 length) - // if this value is changed the driver always returns the header + var datalen = cmdlength + 4; // we use 4 bytes because we add 3 bytes for + // the header and 1 byte for the length of + // the payload var buf = new ArrayBuffer(datalen); var bytes = new Uint8Array(buf); - var ctr = struct.pack(bytes, 0, '3Z', MAGIC_HEADER ); + var ctr = HEADER_SIZE; // skip header which can be left blank if (cmdlength) { ctr += struct.pack(bytes, ctr, 'bb', cmdlength, command); } @@ -149,7 +150,11 @@ module.exports = function (config) { var parseHeader = function (header, callback){ var pString = header.split('|'); var pInfo = pString[4].split('^'); - var sNum = pInfo[2].match(/^\d+\-\s*(\w+)/); + + // serial number can be in two formats: + // 6301-1C2CF8C -> C2CF8C + // 7830H5001733 -> 5001733 + var sNum = pInfo[2].match(/^\d+[\w-]\s*(\w+)/); var threshold = null; var thrs = pString[5].split('^'); @@ -294,10 +299,12 @@ module.exports = function (config) { bcnCommandResponse(cmd, function (err, record) { if (err) { if (err.name === 'TIMEOUT' || err.name === 'TypeError') { + error = true; return whilstCb(err, null); } else { retry++; cmd = buildNakPacket(); + return whilstCb(null); } } else { var recordType = (record.messageType === ASCII_CONTROL.STX) ? @@ -307,41 +314,46 @@ module.exports = function (config) { switch(recordType) { case 'R': - parseDataRecord(record.frame, function(err, r) { - if (err) { - debug('Failure trying to read record', record.frame); - debug(err); - return whilstCb(err); - } else { - if(r) { - robj.timestamp = parseInt(r[4]); - robj.annotations = getAnnotations(r[3], data); - robj.control = isControl(r[3]); - robj.units = r[2]; - if(robj.units === 'mmol/L') { - robj.glucose = parseFloat(r[1]); - } else { - robj.glucose = parseInt(r[1]); + parseDataRecord(record.frame, function(err, r) { + if (err) { + debug('Failure trying to read record', record.frame); + debug(err); + return whilstCb(err); + } else { + if(r) { + robj.timestamp = parseInt(r[4]); + robj.annotations = getAnnotations(r[3], data); + robj.control = isControl(r[3]); + robj.units = r[2]; + if(robj.units === 'mmol/L') { + robj.glucose = parseFloat(r[1]); + } else { + robj.glucose = parseInt(r[1]); + } + robj.nrec = parseInt(r[0]); } - robj.nrec = parseInt(r[0]); + return whilstCb(null); } - } - }); + }); break; case 'H': - robj.header = record.frame; - parseHeader(record.frame, function(err, result) { - if (err) { - debug('Invalid header data'); - return whilstCb(new Error('Invalid header data'), null); - } else { - _.assign(robj, result); - } - }); + robj.header = record.frame; + parseHeader(record.frame, function(err, result) { + if (err) { + debug('Invalid header data'); + return whilstCb(new Error('Invalid header data'), null); + } else { + _.assign(robj, result); + return whilstCb(null); + } + }); + break; + case 'P': + case 'L': + return whilstCb(null); break; } } - whilstCb(null); }); }, function () { return (Object.getOwnPropertyNames(robj).length === 0 && retry < RETRIES) && !error; }, @@ -367,17 +379,28 @@ module.exports = function (config) { if (err) { return callback(err, null); } else { - callback(null, decodeMessage(result.bytes)); + var message = null; + try { + message = decodeMessage(result.bytes); + } catch (err) { + debug('Error:', err); + return callback(err, null); + } + callback(null, message); } }); }); }; var getASTMMessage = function (timeout, retries, cb) { + + var timedOut = false; + var abortTimer = setTimeout(function () { debug('TIMEOUT'); var e = new Error('Timeout error.'); e.name = 'TIMEOUT'; + timedOut = true; return cb(e, null); }, timeout); @@ -388,7 +411,7 @@ module.exports = function (config) { hidDevice.receive(function(raw) { try { var packet = new Uint8Array(raw); - message = extractPacketIntoMessage(packet.slice(MAGIC_HEADER.length)); + message = extractPacketIntoMessage(packet.slice(HEADER_SIZE)); // Only process if we get data if ( packet.length === 0 ) { @@ -397,17 +420,11 @@ module.exports = function (config) { var packetHead = struct.unpack(packet, 0, '3Z2b', ['HEADER', 'SIZE', 'BYTE1']); - if(packetHead['HEADER'] !== MAGIC_HEADER){ - debug('Invalid packet from Contour device'); - clearTimeout(abortTimer); - return callback(new Error('Invalid USB packet received.')); - } - // The tail of the packet starts 6 from the end, but because we haven't stripped the - // MAGIC_HEADER and length byte from packet, we're using SIZE - 2 + // header and length byte from packet, we're using SIZE - 2 var packetTail = struct.unpack(packet, parseInt(packetHead['SIZE']) - 2, '2b2Z2Z', ['CR', 'FRAME_TYPE', 'CHECKSUM', 'CRLF']); - // HID_PACKET_SIZE - 4, because we don't include the MAGIC_HEADER or the SIZE + // HID_PACKET_SIZE - 4, because we don't include the header or size if( packetHead['SIZE'] < ( HID_PACKET_SIZE - 4 ) || packetHead['BYTE1'] == ASCII_CONTROL.EOT || packetHead['BYTE1'] == ASCII_CONTROL.ENQ || @@ -418,12 +435,15 @@ module.exports = function (config) { } return callback(null, false); } catch (err) { - return callback(err); + debug('Error:', err); + if (!timedOut) { + return cb(err); + } } }); }, function (valid) { - return (valid !== true); + return (valid !== true && !timedOut); }, function (err) { return cb(err, message); @@ -529,7 +549,7 @@ module.exports = function (config) { async.whilst( // Get records from the meter until we get the Message Terminator Record (L) // The spec says that unless we get this, any preceding data should not be used. - function () { return (recordType !== ASCII_CONTROL.EOT && !error); }, + function () { return (recordType !== ASCII_CONTROL.EOT && recordType !== 'L' && !error); }, function (callback) { getOneRecord(data, function (err, result) { if (err) { diff --git a/lib/drivers/insulet/insuletDriver.js b/lib/drivers/insulet/insuletDriver.js index 7afbad987a..063f645cab 100644 --- a/lib/drivers/insulet/insuletDriver.js +++ b/lib/drivers/insulet/insuletDriver.js @@ -1379,8 +1379,6 @@ module.exports = function (config) { // so we always take the last (most current) one var download = data.log_records[downloads[downloads.length - 1]]; - var bgunits = ['mg/dL', 'mmol/L'][data.eeprom_settings.BG_DISPLAY]; - var schedules = {}; var generateSchedule = function (prof_idx) { var keyname = getItemWithValue(PROFILES, 'keyname', 'value', data.profiles[prof_idx].profile_idx); @@ -1459,7 +1457,7 @@ module.exports = function (config) { var postsettings = cfg.builder.makePumpSettings() .with_activeSchedule(data.basalPrograms.names[data.basalPrograms.enabled_idx].name) - .with_units({ carb: 'grams', bg: bgunits }) + .with_units({ carb: 'grams', bg: BG_UNITS }) // values are sent in mg/dL even on mmol/L PDMs .with_basalSchedules(schedules) .with_carbRatio(settings.carbRatio) .with_insulinSensitivity(settings.insulinSensitivity) diff --git a/lib/drivers/medtronic/cli/blob_loader.js b/lib/drivers/medtronic/cli/blob_loader.js index 4f973b3b01..cb2a62877b 100755 --- a/lib/drivers/medtronic/cli/blob_loader.js +++ b/lib/drivers/medtronic/cli/blob_loader.js @@ -34,7 +34,8 @@ function loadFile(filePath, tz, userid) { version : pkg.name+' '+pkg.version, groupId: userid, builder: builder, - api: api + api: api, + deviceInfo: { deviceId: 'MedT-00000' } } }; processMedtronic(driverManager(drivers,cfg)); diff --git a/lib/drivers/medtronic/medtronicDriver.js b/lib/drivers/medtronic/medtronicDriver.js index ad54346f9f..b204b1a8eb 100644 --- a/lib/drivers/medtronic/medtronicDriver.js +++ b/lib/drivers/medtronic/medtronicDriver.js @@ -353,6 +353,17 @@ module.exports = function (config) { }; }; + var positionToPage = function (lastPosition, currentPosition, strType) { + if (lastPosition != null) { + cfg.isFirstUpload = false; + debug('Last', strType, 'page was', lastPosition, ', now at', currentPosition); + return currentPosition - lastPosition; + } else { + cfg.isFirstUpload = true; + return currentPosition; + } + }; + var readCurrentPage = function () { return { @@ -360,11 +371,8 @@ module.exports = function (config) { parser: function (packet) { var medtronicMessage = packet.slice(MEDTRONIC_PACKET_START); - // pump only stores 36 history pages - var MAX_HISTORY_PAGES = 36; - var currentPage = Math.min(struct.extractBEInt(medtronicMessage,0), MAX_HISTORY_PAGES) + 1; - return { currentPage : currentPage }; + return { currentPage : struct.extractBEInt(medtronicMessage,0) }; } }; }; @@ -376,13 +384,12 @@ module.exports = function (config) { parser: function (packet) { var medtronicMessage = packet.slice(MEDTRONIC_PACKET_START); - // pump stores a maximum of 32 glucose and ISIG history pages - var MAX_CBG_PAGES = 32; - var currentPage = struct.extractBEInt(medtronicMessage,0); - var glucosePage = Math.min(struct.extractByte(medtronicMessage,5), MAX_CBG_PAGES); - var isigPage = Math.min(struct.extractByte(medtronicMessage,7), MAX_CBG_PAGES); - return { currentPage : currentPage, glucosePage: glucosePage, isigPage: isigPage }; + return { + currentCBGPosition : struct.extractBEInt(medtronicMessage,0), + currentGlucosePosition : struct.extractByte(medtronicMessage,5), + currentIsigPosition : struct.extractByte(medtronicMessage,7) + }; } }; }; @@ -1042,7 +1049,15 @@ module.exports = function (config) { return cb(new Error('Have you entered the correct serial number and is there enough battery power left?'),null); } if (_.indexOf(SUPPORTED_DEVICES,result.modelNumber) > -1 ) { - callback(err, result.modelNumber); + cfg.deviceInfo.deviceId = 'MedT-' + result.modelNumber + '-' + serial; + + cfg.api.getMostRecentUploadRecord(cfg.groupId, cfg.deviceInfo.deviceId, function(apiErr, lastUpload) { + if (apiErr) { + return cb(apiErr, null); + } + cfg.lastUpload = lastUpload; + callback(err, result.modelNumber); + }); } else { var err = new Error('Unsupported pump model: ' + result.modelNumber); err.code = 'E_MEDTRONIC_UNSUPPORTED'; @@ -1120,7 +1135,21 @@ module.exports = function (config) { if(err) { return cb(err,null); } - callback(null, result); + + // pump only stores 36 history pages + var MAX_HISTORY_PAGES = 36; + var lastPosition = null; + var currentPosition = result.currentPage; + + if (_.has(cfg, 'lastUpload.client.private.delta')) { + // retrieve last position from most recent upload record + lastPosition = cfg.lastUpload.client.private.delta.lastPosition; + } + + _.merge(cfg, { delta : {lastPosition : currentPosition}}); // will form part of upload record + + var currentPage = positionToPage(lastPosition, currentPosition, 'pump history'); + callback(null, { currentPage : Math.min(currentPage, MAX_HISTORY_PAGES) + 1 }); }); }, current_cbg_page : function(callback){ @@ -1128,7 +1157,31 @@ module.exports = function (config) { if(err) { return cb(err,null); } - callback(null, result); + + // pump stores a maximum of 32 glucose and ISIG history pages + var MAX_CBG_PAGES = 32; + var lastCBGPosition = null; + var lastGlucosePosition = null; + var lastIsigPosition = null; + + if (_.has(cfg, 'lastUpload.client.private.delta')) { + // retrieve last positions from most recent upload record + lastCBGPosition = cfg.lastUpload.client.private.delta.lastCBGPosition; + lastGlucosePosition = cfg.lastUpload.client.private.delta.lastGlucosePosition; + lastIsigPosition = cfg.lastUpload.client.private.delta.lastIsigPosition; + } + + _.merge(cfg, { delta : { + lastCBGPosition : result.currentCBGPosition, + lastGlucosePosition : result.currentGlucosePosition, + lastIsigPosition : result.currentIsigPosition + }}); // will form part of upload record + + var currentPage = result.currentCBGPosition; + var glucosePage = positionToPage(lastGlucosePosition, result.currentGlucosePosition, 'glucose') + 1; + var isigPage = positionToPage(lastIsigPosition, result.currentIsigPosition, 'isig') + 1; + + callback(null, { currentPage : currentPage, glucosePage: Math.min(glucosePage, MAX_CBG_PAGES), isigPage: Math.min(isigPage, MAX_CBG_PAGES) }); }); }, current_time : function(callback){ @@ -1289,7 +1342,7 @@ module.exports = function (config) { pages[count] = result; count++; - progress(progressOffset + ((count/numberOfPages) * 20)); + progress(progressOffset + ((count / (end - start)) * 20), cfg.isFirstUpload); debug('Read', count, 'pages so far.'); messageBuffer.reset(); @@ -1412,8 +1465,7 @@ module.exports = function (config) { processData: function (progress, data, cb) { debug('in processData'); console.time('processData elapsed'); - data.settings.deviceId = 'MedT-' + data.settings.modelNumber + '-' + serial; - cfg.builder.setDefaults({ deviceId: data.settings.deviceId}); + cfg.builder.setDefaults({ deviceId: cfg.deviceInfo.deviceId}); progress(0); proc.processPages(data, function (err, records) { @@ -1549,11 +1601,12 @@ module.exports = function (config) { console.time('uploadData elapsed'); var sessionInfo = { + delta: cfg.delta, deviceTags: ['insulin-pump'], deviceManufacturers: ['Medtronic'], deviceModel: data.settings.modelNumber, deviceSerialNumber: serial, - deviceId: data.settings.deviceId, + deviceId: cfg.deviceInfo.deviceId, start: sundial.utcDateString(), timeProcessing: cfg.tzoUtil.type, tzName : cfg.timezone, diff --git a/lib/drivers/medtronic/medtronicSimulator.js b/lib/drivers/medtronic/medtronicSimulator.js index 9d8295f20d..40652a14d0 100644 --- a/lib/drivers/medtronic/medtronicSimulator.js +++ b/lib/drivers/medtronic/medtronicSimulator.js @@ -694,6 +694,8 @@ exports.make = function(config){ currBasal.with_scheduleName(currPumpSettings.activeSchedule); if(!currBasal.isAssigned('duration')) { currBasal = common.finalScheduledBasal(currBasal, currPumpSettings, 'medtronic'); + } else { + currBasal = currBasal.done(); } } else { if(!currBasal.isAssigned('duration')) { diff --git a/lib/drivers/onetouch/.eslintrc b/lib/drivers/onetouch/.eslintrc new file mode 100644 index 0000000000..1dde8ab016 --- /dev/null +++ b/lib/drivers/onetouch/.eslintrc @@ -0,0 +1,74 @@ +{ + "extends": "airbnb", + "parser": "babel-eslint", + "plugins": ["lodash"], + "parserOptions": { + "ecmaVersion": 6 + }, + "rules": { + "no-plusplus": [ + "error", + { + "allowForLoopAfterthoughts": true + } + ] + }, + "overrides": [ + { + "files": [ + "oneTouchUltraMini.js", + "oneTouchUltra2.js", + "oneTouchVerioIQ.js" + ], + "rules": { + "brace-style": "warn", + "comma-spacing": "warn", + "no-empty": "warn", + "radix": "warn", + "no-regex-spaces": "warn", + "operator-assignment": "warn", + "prefer-spread": "warn", + "one-var": "warn", + "one-var-declaration-per-line": "warn", + "space-before-blocks": "warn", + "camelcase": "warn", + "func-names": "warn", + "no-var": "warn", + "vars-on-top": "warn", + "no-unused-vars": "warn", + "object-shorthand": "warn", + "comma-dangle": "warn", + "space-before-function-paren": "warn", + "no-param-reassign": "warn", + "prefer-template": "warn", + "no-useless-escape": "warn", + "keyword-spacing": "warn", + "indent": "warn", + "spaced-comment": "warn", + "eqeqeq": "warn", + "space-infix-ops": "warn", + "prefer-arrow-callback": "warn", + "no-shadow": "warn", + "array-bracket-spacing": "warn", + "no-use-before-define": "warn", + "no-else-return": "warn", + "no-bitwise": "warn", + "consistent-return": "warn", + "no-plusplus": "warn", + "no-continue": "warn", + "no-loop-func": "warn", + "object-curly-spacing": "warn", + "key-spacing": "warn", + "padded-blocks": "warn", + "no-console": "warn", + "no-multi-spaces": "warn", + "no-mixed-operators": "warn", + "max-len": "warn", + "prefer-destructuring": "warn" + } + } + ], + "settings": { + "lodash": 3 + } +} diff --git a/lib/drivers/onetouch/cli/otverio.js b/lib/drivers/onetouch/cli/otverio.js new file mode 100644 index 0000000000..fb031e85b9 --- /dev/null +++ b/lib/drivers/onetouch/cli/otverio.js @@ -0,0 +1,105 @@ +#!/usr/bin/env babel-node +/* eslint-disable no-console */ + +import program from 'commander'; + +import api from '../../../core/api'; +import config from '../../../../.config'; +import pkg from '../../../../package.json'; +import builder from '../../../objectBuilder'; + +import OneTouchVerioModule from '../oneTouchVerio'; + +const intro = 'OTVerio CLI:'; + +program + .version('0.0.1', null) + .option('-u, --username [user]', 'username') + .option('-p, --password [pw]', 'password') + .option('-t, --timezone [tz]', 'named timezone', config.DEFAULT_TIMEZONE) + .parse(process.argv); + +const options = { + api, + timezone: program.timezone, + version: `${pkg.name} ${pkg.version}`, + builder: builder(), +}; + +const data = { + deviceInfo: { + driverId: 'OneTouchVerio', + }, +}; + +function showData(err, resultData) { + if (err) { + console.log(intro, 'ERROR:', err); + process.exit(1); + } + console.log(intro, resultData); +} + +function processDevice(opt) { + const OTVerio = OneTouchVerioModule(opt); + OTVerio.connect(() => {}, data, (err1, data1) => { + showData(err1, data1); + OTVerio.getConfigInfo(() => {}, data1, (err2, data2) => { + showData(err2, data2); + OTVerio.fetchData(() => {}, data2, (err3, data3) => { + showData(err3, data3); + OTVerio.processData(() => {}, data2, (err4, data4) => { + showData(err4, data4); + if (opt.groupId) { + OTVerio.uploadData(() => {}, data2, (err5, data5) => { + showData(err5, data5); + OTVerio.disconnect(() => {}, {}, () => { + process.exit(0); + }); + }); + } else { + console.log(intro, 'processDevice: No login provided, not uploading!'); + OTVerio.disconnect(() => {}, {}, () => { + process.exit(0); + }); + } + }); + }); + }); + }); +} + +function loginCallback(error, loginData) { + if (error) { + console.log(intro, 'loginCallback: Failed authentication!'); + console.log(error); + process.exit(); + } + console.log(intro, 'loginCallback:', 'Uploading using the timezone', program.timezone); + console.log(intro, 'loginCallback:', 'Uploading for user ', loginData.userid); + + console.log(intro, 'loginCallback:', 'Starting connection to device...'); + options.targetId = loginData.userid; + options.groupId = loginData.userid; + processDevice(options); +} + +function login(username, password, cfg) { + console.log(intro, 'login:', cfg.API_URL); + api.create({ + apiUrl: cfg.API_URL, + uploadUrl: cfg.UPLOAD_URL, + dataUrl: cfg.DATA_URL, + version: 'uploader CLI tool - otverio', + }); + api.init(() => { + api.user.login({ username, password }, loginCallback); + }); +} + + +if (program.username && program.password) { + login(program.username, program.password, config); +} else { + processDevice(options); +} diff --git a/lib/drivers/onetouch/oneTouchVerio.js b/lib/drivers/onetouch/oneTouchVerio.js new file mode 100644 index 0000000000..a00b535817 --- /dev/null +++ b/lib/drivers/onetouch/oneTouchVerio.js @@ -0,0 +1,739 @@ +/* + * == BSD2 LICENSE == + * Copyright (c) 2017, Tidepool Project + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the associated License, which is identical to the BSD 2-Clause + * License as published by the Open Source Initiative at opensource.org. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the License for more details. + * + * You should have received a copy of the License along with this program; if + * not, you can obtain one from Tidepool Project at tidepool.org. + * == BSD2 LICENSE == + */ + +import fs from 'fs'; +import { assign, clone, invert } from 'lodash'; +// eslint-disable-next-line +import drivelist from 'drivelist'; +import sundial from 'sundial'; +import TZOUtil from '../../TimezoneOffsetUtil'; +import annotate from '../../eventAnnotations'; +import crc from '../../crc'; + +// load usb module only on Linux (OSX and Windows use block device access) +// eslint-disable-next-line import/no-extraneous-dependencies +const usb = (process.platform === 'linux') ? require('usb') : null; + +const isBrowser = typeof window !== 'undefined'; +// eslint-disable-next-line no-console +const debug = isBrowser ? require('bows')('OneTouchVerio') : console.log; + +const VENDOR_IDENTIFICATION = Buffer.from('LifeScan\x00'); +const USB_SIGNATURE = { + RECEIVE: Buffer.from('USBS'), + SEND: Buffer.from('USBC'), +}; +const USB_BULK_BLOCKSIZE = 512; +const USB_INQUIRY_BLOCKSIZE = 96; +const USB_FLAGS_READ = 0x80; +const USB_FLAGS_WRITE = 0x00; +const LINK_LAYER_HEADER_LENGTH = 3; +const LINK_LAYER_CRC_LENGTH = 2; +const STX = 0x02; +const ETX = 0x03; +const RESPONSE_OK = 0x06; +const APPLICATION_LAYER_HEADER_LENGTH = 2; +const WSTRING_ZERO_TERMINATOR_LENGTH = 2; +const CBD_OP_CODE = { + INQUIRY: 0x12, + WRITE_10: 0x2a, + READ_10: 0x28, +}; +const CBD_TRANSFER_LENGTH = 1; +const LBA_NUMBER = { + GENERAL: 3, + PARAMETER: 4, +}; +const BLOCKDEVICE_BLOCKSIZE = 512; +const BLOCKDEVICE_SIGNATURE = 'LIFESCAN FAT16'; +const SERVICE_ID = 0x04; +const QUERY_TYPE = { + serialNumber: 0x00, + deviceModel: 0x01, + softwareVersion: 0x02, + unknown: 0x03, + dateFormat: 0x04, + timeFormat: 0x05, + vendorUrl: 0x07, + languages: 0x09, +}; +const QUERY_NAME = invert(QUERY_TYPE); +const PARAMETER_TYPE = { + timeFormat: 0x00, + dateFormat: 0x02, + displayUnit: 0x04, +}; +const PARAMETER_NAME = invert(PARAMETER_TYPE); +const UNIT_OF_MEASURE = [ + 'mg/dL', + 'mmol/L', +]; +const TIMESTAMP_EPOCH = 946684800; // 2000-01-01T00:00:00+00:00 + +const GLUCOSE_LO = 20; +const GLUCOSE_HI = 600; + + +class USBScsiDevice { + constructor() { + this.usbDataBuffer = Buffer.alloc(0); + this.usbMassStorageTag = 0; + this.device = null; + this.kernelDriverWasAttached = false; + } + + openDevice(deviceInfo, callback) { + this.device = usb.findByIds(deviceInfo.vendorId, deviceInfo.productId); + if (!this.device) { + return callback(new Error(`Failed to open connection to ${deviceInfo.driverId}`)); + } + this.device.open(); + + if (this.device.interfaces.length < 1) { + return callback(new Error('No USB interface found!')); + } + const deviceInterface = this.device.interfaces[0]; + + if (deviceInterface.isKernelDriverActive()) { + debug('openDevice: detachKernelDriver'); + this.kernelDriverWasAttached = true; + deviceInterface.detachKernelDriver(); + } + + deviceInterface.claim(); + + if (deviceInterface.endpoints.length < 2) { + return callback(new Error('USB interface does not have enough endpoints!')); + } + + deviceInterface.endpoints[0].transferType = usb.LIBUSB_TRANSFER_TYPE_BULK; + deviceInterface.endpoints[1].transferType = usb.LIBUSB_TRANSFER_TYPE_BULK; + + [this.inEndpoint, this.outEndpoint] = deviceInterface.endpoints; + + this.inEndpoint.addListener('error', (error) => { + debug(`${deviceInfo.driverId} inEndpoint.error: ${error}`); + }); + + this.inEndpoint.startPoll(1, USB_BULK_BLOCKSIZE); + + return callback(null); + } + + closeDevice(callback) { + if (this.device) { + const deviceInterface = this.device.interfaces[0]; + deviceInterface.release(true, (err) => { + if (err) { + debug('closeDevice: error releasing USB device interface:', err); + } + if (this.kernelDriverWasAttached) { + debug('closeDevice: attachKernelDriver'); + deviceInterface.attachKernelDriver(); + this.kernelDriverWasAttached = false; + } + this.device.close(); + this.device = null; + callback(); + }); + } + } + + parseUsbLayer(data, callback) { + if (data && data.length > USB_SIGNATURE.RECEIVE.length) { + if (data.slice(0, USB_SIGNATURE.RECEIVE.length).equals(USB_SIGNATURE.RECEIVE)) { + // end of transmission found + + // check status byte + if (data[data.length - 1] !== 0) { + debug('parseUsbLayer: Error code:', data[data.length - 1]); + } else if (callback) { + // copy reference to pass on + const receivedData = this.usbDataBuffer; + // start new buffer + this.usbDataBuffer = Buffer.alloc(0); + // pass reference to buffer + callback(receivedData); + } + } else { + // payload packet found, append to buffer + this.usbDataBuffer = Buffer.concat([this.usbDataBuffer, data]); + } + } + } + + sendPacket(data) { + this.outEndpoint.transfer(data, (err) => { + if (err !== undefined) { + debug('sendPacket: outEndpoint.error:', err); + process.exit(); + } + }); + } + + requestResponse(usbPackets, callback) { + this.inEndpoint.removeAllListeners('data'); + this.inEndpoint.addListener('data', data => this.parseUsbLayer(data, callback)); + usbPackets.forEach(usbPacketData => this.sendPacket(usbPacketData)); + } + + buildUsbPacket(dataTransferLength, flags, cbd) { + const usbRequestData = Buffer.alloc(31); + USB_SIGNATURE.SEND.copy(usbRequestData); + this.usbMassStorageTag += 1; + usbRequestData.writeUInt32LE(this.usbMassStorageTag, 4); + usbRequestData.writeUInt32LE(dataTransferLength, 8); + usbRequestData.writeUInt8(flags, 12); + usbRequestData.writeUInt8(cbd.length, 14); + cbd.copy(usbRequestData, 15); + return usbRequestData; + } + + static buildScsiCbd10(opCode, lbaNumber) { + // event though USB data is little endian, the SCSI CBD uses big endian + const cbd = Buffer.alloc(10); + cbd.writeUInt8(opCode, 0); + cbd.writeUInt32BE(lbaNumber, 2); + cbd.writeUInt16BE(CBD_TRANSFER_LENGTH, 7); + return cbd; + } + + sendScsiWrite10(lbaNumber, usbRequestData, callback) { + const cbd = this.constructor.buildScsiCbd10(CBD_OP_CODE.WRITE_10, lbaNumber); + const writeCommand = this.buildUsbPacket(USB_BULK_BLOCKSIZE, USB_FLAGS_WRITE, cbd); + this.requestResponse([writeCommand, usbRequestData], callback); + } + + sendScsiRead10(lbaNumber, callback) { + const cbd = this.constructor.buildScsiCbd10(CBD_OP_CODE.READ_10, lbaNumber); + this.requestResponse( + [this.buildUsbPacket(USB_BULK_BLOCKSIZE, USB_FLAGS_READ, cbd)], + (queryResponseData) => { + callback(queryResponseData); + }, + ); + } + + static validateScsiVendorId(data) { + const VENDOR_ID_OFFSET = 8; + if (data.length === 36 && + data.slice(VENDOR_ID_OFFSET, VENDOR_ID_OFFSET + VENDOR_IDENTIFICATION.length) + .equals(VENDOR_IDENTIFICATION)) { + debug('validateScsiVendorId: Found vendor identification'); + return true; + } + debug('validateScsiVendorId: Vendor identification not found!'); + return false; + } + + static buildScsiCbdInquiry(opCode) { + // event though USB data is little endian, the SCSI CBD uses big endian + const cbd = Buffer.alloc(10); + cbd.writeUInt8(opCode, 0); + cbd.writeUInt16BE(USB_INQUIRY_BLOCKSIZE, 7); + return cbd; + } + + checkDevice(callback) { + const cbd = this.constructor.buildScsiCbdInquiry(CBD_OP_CODE.INQUIRY); + this.requestResponse( + [this.buildUsbPacket(USB_INQUIRY_BLOCKSIZE, USB_FLAGS_READ, cbd)], + (inquiryResponseData) => { + let error = null; + if (!this.constructor.validateScsiVendorId(inquiryResponseData)) { + error = new Error('Vendor identification not found'); + } + callback(error); + }, + ); + } + + retrieveData(lbaNumber, usbRequestData, callback) { + this.sendScsiWrite10(lbaNumber, usbRequestData, () => { + this.sendScsiRead10(lbaNumber, callback); + }); + } +} + + +class BlockDevice { + constructor() { + this.fileHandle = null; + } + + openDevice(deviceInfo, callback) { + // find correct device path + drivelist.list((err, drives) => { + if (err) { + callback(err); + return; + } + this.devicePath = null; + drives.forEach((drive) => { + if (drive.description.endsWith('LifeScan Media') && !drive.system) { + this.devicePath = drive.raw; + } + }); + if (this.devicePath) { + debug('devicePath:', this.devicePath); + + // TODO: On Windows we need to open this device with the following flags: + // FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING + // Otherwise writing to the device on Windows produces a permission error. + // For this we need to wait for Node v8 and check that it is using libuv with this PR: + // https://github.com/libuv/libuv/pull/1567 + // which will set the above flags if we fs.open using the following flags: + // UV_FS_O_DIRECT | UV_FS_O_DSYNC | UV_FS_O_SYNC + + // open device for synchronous read and write operation + fs.open(this.devicePath, 'rs+', (err2, fd) => { + if (err2) { + callback(err2); + } else { + this.fileHandle = fd; + callback(null); + } + }); + } else { + callback(new Error(`Could not find device "${deviceInfo.driverId}".`)); + } + }); + } + + closeDevice(callback) { + if (this.fileHandle) { + fs.close(this.fileHandle); + this.fileHandle = null; + } + if (callback) { + callback(); + } + } + + checkDevice(callback) { + const readBuffer = Buffer.alloc(3 * BLOCKDEVICE_BLOCKSIZE); + // read first 3 sectors to check if this is the correct device + fs.read(this.fileHandle, readBuffer, 0, readBuffer.length, 0, (err, numRead) => { + if (err) { + this.closeDevice(); + return callback(new Error(`Error reading from device '${this.devicePath}':`, err)); + } + if (numRead < readBuffer.length) { + this.closeDevice(); + return callback(new Error(`Error reading enough data from device '${this.devicePath}'.`)); + } + // make very sure this is the device we are looking for + if (!readBuffer.slice(0x2b, 0x3b).equals(Buffer.from(BLOCKDEVICE_SIGNATURE))) { + debug(`Device signature: '${readBuffer.slice(0x2b, 0x3b).toString()}' !== '${BLOCKDEVICE_SIGNATURE}'`); + this.closeDevice(); + return callback(new Error(`Did not find device signature on '${this.devicePath}'.`)); + } + if (!readBuffer.slice(BLOCKDEVICE_BLOCKSIZE) + .equals(Buffer.alloc(2 * BLOCKDEVICE_BLOCKSIZE))) { + debug('Device data:', readBuffer.slice(BLOCKDEVICE_BLOCKSIZE).toString('hex')); + this.closeDevice(); + return callback(new Error(`Found unexpected non-zero data on '${this.devicePath}'.`)); + } + return callback(null); + }); + } + + retrieveData(lbaNumber, requestData, callback) { + const seekOffset = lbaNumber * BLOCKDEVICE_BLOCKSIZE; + fs.write( + this.fileHandle, requestData, 0, BLOCKDEVICE_BLOCKSIZE, seekOffset, + (err) => { + if (err) { + debug(`retrieveData: Error writing to device '${this.devicePath}':`, err); + return; + } + const readBuffer = Buffer.alloc(BLOCKDEVICE_BLOCKSIZE); + fs.read( + this.fileHandle, readBuffer, 0, BLOCKDEVICE_BLOCKSIZE, seekOffset, + (err2) => { + if (err2) { + debug(`retrieveData: Error reading from device '${this.devicePath}':`, err2); + return; + } + callback(readBuffer); + }, + ); + }, + ); + } +} + + +class OneTouchVerio { + constructor(cfg) { + this.cfg = cfg; + if (process.platform === 'linux') { + this.communication = new USBScsiDevice(); + } else { + this.communication = new BlockDevice(); + } + } + + openDevice(deviceInfo, callback) { + return this.communication.openDevice(deviceInfo, callback); + } + + closeDevice(callback) { + return this.communication.closeDevice(callback); + } + + checkDevice(callback) { + return this.communication.checkDevice(callback); + } + + static parseApplicationLayer(data, callback) { + const responseCode = data[1]; + if (responseCode !== RESPONSE_OK) { + debug('parseApplicationLayer: Invalid response code:', responseCode); + return; + } + const commandData = data.slice(APPLICATION_LAYER_HEADER_LENGTH); + if (callback) { + callback(commandData); + } + } + + static parseLinkLayer(data, callback) { + if (data.length !== USB_BULK_BLOCKSIZE) { + debug('parseLinkLayer: Invalid data blocksize:', data.length); + return; + } + if (data[0] !== STX) { + debug('parseLinkLayer: Invalid start byte:', data[0]); + return; + } + const length = data.readUInt16LE(1); + if (data[length - 1 - LINK_LAYER_CRC_LENGTH] !== ETX) { + debug('parseLinkLayer: Invalid end byte:', data[length - 1 - LINK_LAYER_CRC_LENGTH]); + return; + } + const crc16 = data.readUInt16LE(length - LINK_LAYER_CRC_LENGTH); + const calculatedCrc16 = + crc.calcCRC_A(data.slice(0, length - LINK_LAYER_CRC_LENGTH), length - LINK_LAYER_CRC_LENGTH); + if (crc16 !== calculatedCrc16) { + debug('parseLinkLayer: CRC error:', crc16, '!=', calculatedCrc16); + return; + } + const applicationData = + data.slice(LINK_LAYER_HEADER_LENGTH, length - 1 - LINK_LAYER_CRC_LENGTH); + callback(applicationData); + } + + retrieveData(lbaNumber, linkLayerRequestData, callback) { + this.communication.retrieveData(lbaNumber, linkLayerRequestData, (linkResponseData) => { + this.constructor.parseLinkLayer(linkResponseData, (applicationResponseData) => { + this.constructor.parseApplicationLayer(applicationResponseData, (commandData) => { + callback(commandData); + }); + }); + }); + } + + static buildLinkLayerFrame(applicationData) { + const length = LINK_LAYER_HEADER_LENGTH + applicationData.length + 1 + LINK_LAYER_CRC_LENGTH; + const data = Buffer.alloc(length); + data[0] = STX; + data.writeUInt16LE(length, 1); + applicationData.copy(data, LINK_LAYER_HEADER_LENGTH); + data[length - 1 - LINK_LAYER_CRC_LENGTH] = ETX; + const calculatedCrc16 = + crc.calcCRC_A(data.slice(0, length - LINK_LAYER_CRC_LENGTH), length - LINK_LAYER_CRC_LENGTH); + data.writeUInt16LE(calculatedCrc16, length - LINK_LAYER_CRC_LENGTH); + return data; + } + + retrieveQueryData(queryType, callback) { + const linkRequestData = Buffer.alloc(USB_BULK_BLOCKSIZE); + const applicationData = Buffer.from([SERVICE_ID, 0xe6, 0x02, queryType]); + this.constructor.buildLinkLayerFrame(applicationData).copy(linkRequestData); + this.retrieveData(LBA_NUMBER.GENERAL, linkRequestData, (commandData) => { + const responseString = commandData + .slice(0, commandData.length - WSTRING_ZERO_TERMINATOR_LENGTH).toString('utf16le'); + debug('parseQueryResponse:', QUERY_NAME[queryType], ':', responseString); + const data = {}; + data[QUERY_NAME[queryType]] = responseString; + callback(null, data); + }); + } + + retrieveParameterData(parameterType, callback) { + const linkRequestData = Buffer.alloc(USB_BULK_BLOCKSIZE); + const applicationData = Buffer.from([SERVICE_ID, parameterType, 0x00]); + this.constructor.buildLinkLayerFrame(applicationData).copy(linkRequestData); + this.retrieveData(LBA_NUMBER.PARAMETER, linkRequestData, (commandData) => { + let responseString; + if (parameterType === PARAMETER_TYPE.displayUnit) { + responseString = UNIT_OF_MEASURE[commandData.readUInt32LE()]; + } else { + responseString = commandData + .slice(0, commandData.length - WSTRING_ZERO_TERMINATOR_LENGTH).toString('utf16le'); + } + debug('parseParameterResponse:', PARAMETER_NAME[parameterType], ':', responseString); + const data = {}; + data[PARAMETER_NAME[parameterType]] = responseString; + callback(null, data); + }); + } + + retrieveRecordCount(callback) { + const linkRequestData = Buffer.alloc(USB_BULK_BLOCKSIZE); + const applicationData = Buffer.from([SERVICE_ID, 0x27, 0x00]); + this.constructor.buildLinkLayerFrame(applicationData).copy(linkRequestData); + this.retrieveData(LBA_NUMBER.GENERAL, linkRequestData, (commandData) => { + const recordCount = commandData.readUInt16LE(); + debug('retrieveRecordCount:', recordCount); + const data = {}; + data.recordCount = recordCount; + callback(null, data); + }); + } + + static getDate(timestamp) { + return new Date((TIMESTAMP_EPOCH + timestamp) * 1000); + } + + retrieveRecord(recordIndex, callback) { + const linkRequestData = Buffer.alloc(USB_BULK_BLOCKSIZE); + const applicationData = Buffer.from([SERVICE_ID, 0x31, 0x02, 0x00, 0x00, 0x00]); + applicationData.writeUInt16LE(recordIndex, 3); + this.constructor.buildLinkLayerFrame(applicationData).copy(linkRequestData); + this.retrieveData(LBA_NUMBER.GENERAL, linkRequestData, (commandData) => { + const data = {}; + debug('Raw result:', commandData.toString('hex')); + data.globalRecordIndex = commandData.readUInt16LE(3); + data.timestamp = this.constructor.getDate(commandData.readUInt32LE(5)); + data.glucoseValueMgdl = commandData.readUInt16LE(9); + // eslint-disable-next-line no-bitwise + data.controlSolution = !!(0x01 & commandData.readUInt8(2)); + debug('retrieveRecord:', data); + callback(null, data); + }); + } + + retrieveRecords(recordCount, callback) { + const records = []; + const cb = (error, data) => { + records.push(data); + if (records.length < recordCount) { + this.retrieveRecord(records.length, cb); + } else { + callback(null, records); + } + }; + this.retrieveRecord(records.length, cb); + } + + static addOutOfRangeAnnotation(recordBuilder, low, high, step, type) { + if (low !== null && recordBuilder.value < low + step) { + recordBuilder.with_value(low); + annotate.annotateEvent(recordBuilder, { + code: `${type}/out-of-range`, + value: 'low', + threshold: low + step, + }); + } else if (high !== null && recordBuilder.value > high - step) { + recordBuilder.with_value(high); + annotate.annotateEvent(recordBuilder, { + code: `${type}/out-of-range`, + value: 'high', + threshold: high - step, + }); + } + } + + processData(data) { + const postRecords = []; + data.records.forEach((record) => { + if (!record.controlSolution) { + // values are always in 'mg/dL', independent of the unitOfMeasure setting + const recordBuilder = this.cfg.builder.makeSMBG() + .with_value(record.glucoseValueMgdl) + .with_units('mg/dL') + .with_deviceTime(sundial.formatDeviceTime(record.timestamp)) + .set('index', record.globalRecordIndex); + + this.cfg.tzoUtil.fillInUTCInfo(recordBuilder, record.timestamp); + + this.constructor.addOutOfRangeAnnotation(recordBuilder, GLUCOSE_LO, GLUCOSE_HI, 1, 'bg'); + + const postRecord = recordBuilder.done(); + delete postRecord.index; + postRecords.push(postRecord); + } + }); + return postRecords; + } +} + +export default function (config) { + const cfg = clone(config); + const driver = new OneTouchVerio(cfg); + + // With no date & time settings changes available, + // timezone is applied across-the-board + cfg.tzoUtil = new TZOUtil(cfg.timezone, new Date().toISOString(), []); + + return { + /* eslint no-param-reassign: + [ "error", { "props": true, "ignorePropertyModificationsFor": ["data"] } ] */ + + /* we let the default detect method handle this + detect(deviceInfo, cb) { + cb(null, deviceInfo); + }, + */ + + setup(deviceInfo, progress, cb) { + progress(100); + cb(null, { deviceInfo }); + }, + + connect(progress, data, cb) { + progress(0); + driver.openDevice(data.deviceInfo, (err) => { + if (err) { + cb(err, null); + return; + } + progress(20); + driver.checkDevice((err2) => { + if (err2) { + cb(err2, null); + return; + } + data.disconnect = false; + progress(100); + cb(null, data); + }); + }); + }, + + getConfigInfo(progress, data, cb) { + progress(0); + const querySerial = QUERY_TYPE.serialNumber; + driver.retrieveQueryData(querySerial, (err, serialNumber) => { + if (err) { + cb(err, null); + return; + } + assign(data.deviceInfo, serialNumber); + + const queryModel = QUERY_TYPE.deviceModel; + driver.retrieveQueryData(queryModel, (err2, deviceModel) => { + if (err2) { + cb(err2, null); + return; + } + assign(data.deviceInfo, deviceModel); + progress(100); + cb(null, data); + }); + }); + }, + + fetchData(progress, data, cb) { + progress(0); + driver.retrieveRecordCount((err1, resultData1) => { + if (err1) { + cb(err1, null); + return; + } + debug('fetchData: recordCount: ', resultData1.recordCount); + if (resultData1.recordCount === 0) { + data.records = []; + debug('fetchData: no records found on device!'); + cb(null, data); + } + + driver.retrieveRecords(resultData1.recordCount, (err2, records) => { + if (err2) { + cb(err2, null); + return; + } + data.records = records; + cb(null, data); + }); + }); + }, + + processData(progress, data, cb) { + debug('processData: num records:', data.records.length); + progress(0); + + data.deviceInfo.deviceId = + `${data.deviceInfo.deviceModel.replace(/\s+/g, '')}-${data.deviceInfo.serialNumber}`; + cfg.builder.setDefaults({ deviceId: data.deviceInfo.deviceId }); + + data.postRecords = driver.processData(data); + data.processData = true; + + progress(100); + cb(null, data); + }, + + uploadData(progress, data, cb) { + debug('uploadData: num post records:', data.postRecords.length); + progress(0); + + const sessionInfo = { + deviceTags: ['bgm'], + deviceManufacturers: ['LifeScan'], + deviceModel: data.deviceInfo.deviceModel, + deviceSerialNumber: data.deviceInfo.serialNumber, + deviceId: data.deviceInfo.deviceId, + start: sundial.utcDateString(), + timeProcessing: cfg.tzoUtil.type, + tzName: cfg.timezone, + version: cfg.version, + }; + + cfg.api.upload.toPlatform( + data.postRecords, sessionInfo, progress, cfg.groupId, + (err, result) => { + progress(100); + + if (err) { + debug(err); + debug(result); + return cb(err, data); + } + data.cleanup = true; + return cb(null, data); + }, + 'dataservices', + ); + }, + + disconnect(progress, data, cb) { + progress(0); + driver.closeDevice(() => { + progress(100); + cb(null, data); + }); + }, + + cleanup(progress, data, cb) { + progress(100); + cb(null, data); + }, + }; +} diff --git a/lib/drivers/tandem/tandemDriver.js b/lib/drivers/tandem/tandemDriver.js index 480b8294f3..938c3ba5b3 100644 --- a/lib/drivers/tandem/tandemDriver.js +++ b/lib/drivers/tandem/tandemDriver.js @@ -18,6 +18,7 @@ var _ = require('lodash'); var struct = require('../../struct.js')(); var sundial = require('sundial'); +var api = require('../../core/api.js'); var tandemSimulatorMaker = require('../tandem/tandemSimulator'); @@ -991,11 +992,14 @@ module.exports = function (config) { receiveSeq = pkt.payload['header_log_seq_no'] + 1; recovering = false; - percentage = ((receiveSeq-start)/(end-start) * 90)+10; + if(end-start > 0) { + percentage = ((receiveSeq-start)/(end-start) * 90) + 10; + } + if(percentage > (prevPercentage+1)) { // only update progress to UI if there's an increase of at least 1 percent prevPercentage = percentage; - progress(percentage); + progress(percentage, cfg.isFirstUpload); } if (receiveSeq % 1000 === 0) { @@ -1084,11 +1088,14 @@ module.exports = function (config) { retryTimer = setTimeout(retryTimeout,RETRY_TIMEOUT); // reset timeout receiveSeq = pkt.payload['header_log_seq_no'] + 1; - percentage = ((receiveSeq-start)/(end-start) * 90)+10; + if(end-start > 0) { + percentage = ((receiveSeq-start)/(end-start) * 90) + 10; + } + if(percentage > (prevPercentage+1)) { // only update progress to UI if there's an increase of at least 1 percent prevPercentage = percentage; - progress(percentage); + progress(percentage, cfg.isFirstUpload); } if (receiveSeq % 1000 === 0) { @@ -1122,138 +1129,6 @@ module.exports = function (config) { }); }; - var newestEventRequester = function (start, end, progress, callback) { - var sendSeq = start; - var end_seq = end; - var receiveSeq = start; - var recovering = false; - var percentageSeq = 0; - var retryRecoverTimer; - - // this contains only the log events that we consider to define - // a set of events that can truly be considered "pump data" - // (basically a subset of the log records we currently parse) - var headerIdFilter = [ - PUMP_LOG_RECORDS.LID_BASAL_RATE_CHANGE.value, - PUMP_LOG_RECORDS.LID_BG_READING_TAKEN.value, - PUMP_LOG_RECORDS.LID_BOLEX_ACTIVATED.value, - PUMP_LOG_RECORDS.LID_BOLEX_COMPLETED.value, - PUMP_LOG_RECORDS.LID_BOLUS_ACTIVATED.value, - PUMP_LOG_RECORDS.LID_BOLUS_COMPLETED.value, - PUMP_LOG_RECORDS.LID_BOLUS_REQUESTED_MSG1.value, - PUMP_LOG_RECORDS.LID_BOLUS_REQUESTED_MSG2.value, - PUMP_LOG_RECORDS.LID_BOLUS_REQUESTED_MSG3.value, - PUMP_LOG_RECORDS.LID_TEMP_RATE_ACTIVATED.value, - PUMP_LOG_RECORDS.LID_TEMP_RATE_COMPLETED.value, - PUMP_LOG_RECORDS.LID_PUMPING_SUSPENDED.value, - PUMP_LOG_RECORDS.LID_PUMPING_RESUMED.value, - PUMP_LOG_RECORDS.LID_CANNULA_FILLED.value, - PUMP_LOG_RECORDS.LID_CARTRIDGE_FILLED.value, - PUMP_LOG_RECORDS.LID_TUBING_FILLED.value, - PUMP_LOG_RECORDS.LID_CGM_DATA.value, - PUMP_LOG_RECORDS.LID_CGM_CALIBRATION.value, - PUMP_LOG_RECORDS.LID_CGM_DATA_GX.value, - PUMP_LOG_RECORDS.LID_CGM_CALIBRATION_GX.value - ]; - - var listenTimer = setInterval(function () { - if(pending) { - debug('pending'); - } - while (cfg.deviceComms.hasAvailablePacket() && !pending) { - var processPacket = function (pkt) { - if (pkt.valid && - pkt.descriptor === RESPONSES.LOG_ENTRY_TE.value && - pkt.payload['header_log_seq_no'] <= receiveSeq) { - if (receiveSeq != pkt.payload['header_log_seq_no']) { - if (!recovering) { - recovering = true; - debug('recovering ', receiveSeq); - } - - sendSeq = receiveSeq - 1; - tandemCommand(COMMANDS.LOG_ENTRY_SEQ_REQ, [receiveSeq], function (err) { - if(err) { - clearInterval(sendTimer); - clearInterval(listenTimer); - callback(err,null); - } - retryRecoverTimer = setTimeout(function() { - if(recovering) { - debug('Retrying to recover..',receiveSeq); - tandemCommand(COMMANDS.LOG_ENTRY_SEQ_REQ, [receiveSeq], function (err) { - if(err) { - clearInterval(sendTimer); - clearInterval(listenTimer); - callback(err,null); - } - }); - } - },RETRY_TIMEOUT); - }); - } - else { - if (recovering) { - debug('recovered ', receiveSeq, pkt); - } - receiveSeq = pkt.payload['header_log_seq_no'] - 1; - recovering = false; - - percentageSeq += 1; - if(percentageSeq % 100 === 0) { - // increase percentage every 100 records - var percentage = percentageSeq/100; - progress(percentage < 5 ? percentage : 5); //up to a max of 5 percent - } - - if (headerIdFilter.indexOf(pkt.payload.header_id) === -1 || pkt.payload.name === undefined) { - if(debugMode.isDebug) { - debug('skipping record in search for newest: ', pkt.payload ? pkt.payload.name : '', pkt); - } - end_seq--; - } - else{ - clearInterval(sendTimer); - clearInterval(listenTimer); - cfg.deviceComms.flush(); // making sure we flush the buffers - if(debugMode.isDebug) { - debug('Found newest event: ',pkt); - } - progress(5); - callback(null,pkt); - } - - if (receiveSeq < end_seq) { - debug('We did not find any events'); - clearInterval(sendTimer); - clearInterval(listenTimer); - } - } - } - }; - processPacket(cfg.deviceComms.nextPacket()); - } - }, INTERVAL_FREQ); - - var sendTimer = setInterval(function () { - if (sendSeq % 1000 === 0) { - console.log('requesting', sendSeq); - } - if (!recovering && !pending) { - tandemCommand(COMMANDS.LOG_ENTRY_SEQ_REQ, [sendSeq], function (err) { - if(err) { - clearInterval(sendTimer); - clearInterval(listenTimer); - callback(err,null); - } - }); - if ((sendSeq > end) && !recovering) { - sendSeq--; - } - } - }, INTERVAL_FREQ); // if we spin too quickly on this, packets don't get sent when window doesn't have focus - }; - var tandemCommandResponse = function (command, args, callback) { tandemCommand(command, args, function (err) { @@ -1394,85 +1269,6 @@ module.exports = function (config) { if (debugMode.isDebug) { var startExec = Date.now(); } - debug('getting event ranges'); - var entries; - var end_seq; - var start_seq; - - var minIndex; - var maxIndex; - var currentIndex; - var currentTimestamp; - var timestampToFind; - - function getNewestEvent(err, result) { - - if (err) { - debug('error retrieving record ', result); - callback(err, null); - } - - timestampToFind = result.payload.rawTimestamp - 90 * 24 * 60 * 60 * 1000; - - debug('newest record deviceTime: ', result.payload.deviceTime); - debug('end_seq after finding newest record: ', result.payload.header_log_seq_no); - maxIndex = result.payload.header_log_seq_no; - data.end_seq = result.payload.header_log_seq_no; - - if(debugMode.isDebug) { - debug('oldest event seq: ', start_seq); - } - minIndex = start_seq; - currentIndex = Math.floor( (minIndex + maxIndex) / 2); - tandemCommandResponse(COMMANDS.LOG_ENTRY_SEQ_REQ, [currentIndex], binarySearch); - } - - function binarySearch(err, result) { - - var foundClosest = function() { - debug('90 day, closest record: ', result.payload.deviceTime); - debug('start_seq: ', currentIndex); - - data.start_seq = currentIndex; - if (debugMode.isDebug) { - var endExec = Date.now(); - var time = endExec - startExec; - debug('Execution time for binary search: ' + time); - } - progress(10); - cfg.deviceComms.flush(); // making sure we flush the buffers - tandemFetchEventRange(progress, data, callback); - }; - - if (err) { - debug('error retrieving record during binary search ', result); - callback(err, null); - } - else { - if (minIndex <= maxIndex) { - - currentTimestamp = result.payload.rawTimestamp; - - if (currentTimestamp < timestampToFind) { - minIndex = currentIndex + 1; - } - else if (currentTimestamp > timestampToFind) { - maxIndex = currentIndex - 1; - } - else { - return foundClosest(); - } - currentIndex = Math.floor( (minIndex + maxIndex) / 2 ); - if (currentIndex < start_seq) { - currentIndex = start_seq; - } - tandemCommandResponse(COMMANDS.LOG_ENTRY_SEQ_REQ, [currentIndex], binarySearch); - } - else { - return foundClosest(); - } - } - } debug('requesting log size'); tandemCommandResponse(COMMANDS.LOG_SIZE_REQ, null, function (err, result) { @@ -1482,11 +1278,34 @@ module.exports = function (config) { } else { if (result.valid && (result.descriptor === RESPONSES.LOG_SIZE_TE.value)) { - entries = result.payload['entries']; - end_seq = result.payload['end_seq']; - start_seq = result.payload['start_seq']; // limit to 3000 for debugging - debug('end_seq before looking for newest record: ',end_seq); - newestEventRequester(end_seq, start_seq, progress, getNewestEvent); + + api.getMostRecentUploadRecord(cfg.groupId, cfg.deviceInfo.deviceId, function(err, lastUpload) { + if (err) { + return callback(err); + } + + var lastEndPosition = null; + if (lastUpload && lastUpload.client) { + lastEndPosition = lastUpload.client.private.delta.lastEndPosition; + } + + data.end_seq = result.payload['end_seq']; + + if (lastEndPosition != null) { + cfg.isFirstUpload = false; + debug('Last record read was', lastEndPosition, ', starting from there'); + data.start_seq = lastEndPosition; + } else { + cfg.isFirstUpload = true; + debug('Reading from record', result.payload['start_seq']); + data.start_seq = result.payload['start_seq']; + } + debug('Reading up until record', data.end_seq); + + progress(10, cfg.isFirstUpload); + cfg.deviceComms.flush(); // making sure we flush the buffers + tandemFetchEventRange(progress, data, callback); + }); } else{ console.log('Invalid log size:', result); @@ -1555,6 +1374,20 @@ module.exports = function (config) { data.log_records ); + var isValidTimeChange = function(fromDatum, toDatum) { + /* We need to filter out spurious time changes that appear in the data when + the battery is left out for too long. The strategy is to filter out any + time change to a date where the year is less than the current year + minus one. This is the same strategy used in the Medtronic driver. */ + if (fromDatum.getUTCFullYear() < (new Date().getUTCFullYear() - 1) || + toDatum.getUTCFullYear() < (new Date().getUTCFullYear() - 1)) { + debug('Excluding time change from',fromDatum.toISOString().slice(0,-5),'to', toDatum.toISOString().slice(0,-5), 'as spurious.'); + return false; + } + return true; + }; + + var postrecords = []; for (var i = 0; i < timeChangeLogs.length; ++i) { @@ -1573,17 +1406,20 @@ module.exports = function (config) { var event = _.find(dateChangeLogs, {index: k}); if (event) { found = true; + var rawFromTime = BASE_TIME + (event.date_prior * 864e5) + tc.time_prior; var rawToTime = BASE_TIME + (event.date_after * 864e5) + tc.time_after; - var datetimechange = cfg.builder.makeDeviceEventTimeChange() - .with_change({ - from: sundial.formatDeviceTime(BASE_TIME + (event.date_prior * 864e5) + tc.time_prior), - to: sundial.formatDeviceTime(rawToTime), - agent: 'manual' - }) - .with_deviceTime(sundial.formatDeviceTime(rawToTime)) - .set('jsDate', new Date(rawToTime)) - .set('index', tc.index); - postrecords.push(datetimechange); + if (isValidTimeChange(new Date(rawFromTime), new Date(rawToTime))) { + var datetimechange = cfg.builder.makeDeviceEventTimeChange() + .with_change({ + from: sundial.formatDeviceTime(rawFromTime), + to: sundial.formatDeviceTime(rawToTime), + agent: 'manual' + }) + .with_deviceTime(sundial.formatDeviceTime(rawToTime)) + .set('jsDate', new Date(rawToTime)) + .set('index', tc.index); + postrecords.push(datetimechange); + } // remove the date change event from dateChangeLogs so that we don't process it twice dateChangeLogs = _.without(dateChangeLogs, event); @@ -1607,16 +1443,21 @@ module.exports = function (config) { for (var j = 0; j < dateChangeLogs.length; ++j) { var dc = dateChangeLogs[j]; var dc_base = BASE_TIME; - var datechange = cfg.builder.makeDeviceEventTimeChange() - .with_change({ - from: sundial.formatDeviceTime(BASE_TIME + dc.date_prior * 864e5), - to: sundial.formatDeviceTime(BASE_TIME + dc.date_after * 864e5), - agent: 'manual' - }) - .with_deviceTime(dc.deviceTime) - .set('jsDate', dc.jsDate) - .set('index', dc.index); - postrecords.push(datechange); + + var rawFromTime = BASE_TIME + dc.date_prior * 864e5; + var rawToTime = BASE_TIME + dc.date_after * 864e5; + if (isValidTimeChange(new Date(rawFromTime), new Date(rawToTime))) { + var datechange = cfg.builder.makeDeviceEventTimeChange() + .with_change({ + from: sundial.formatDeviceTime(rawFromTime), + to: sundial.formatDeviceTime(rawToTime), + agent: 'manual' + }) + .with_deviceTime(dc.deviceTime) + .set('jsDate', dc.jsDate) + .set('index', dc.index); + postrecords.push(datechange); + } } var mostRecent = sundial.applyTimezone(data.log_records[data.log_records.length - 1].jsDate, cfg.timezone).toISOString(); @@ -2199,6 +2040,9 @@ module.exports = function (config) { data.model_no = result.payload.model_no; data.pump_sn = result.payload.pump_sn; data.firmware_version = parseInt(result.payload.arm_sw_ver); + data.deviceInfo.deviceId = 'tandem' + data.model_no + data.pump_sn; + cfg.builder.setDefaults({ deviceId: data.deviceInfo.deviceId }); + cb(null, data); } }); @@ -2248,8 +2092,6 @@ module.exports = function (config) { uploadData: function (progress, data, cb) { data.stage = 'uploadData'; progress(0); - var deviceId = 'tandem' + data.model_no + data.pump_sn; - cfg.builder.setDefaults({ deviceId: deviceId }); var postrecords = [], settings = null; /* @@ -2292,7 +2134,7 @@ module.exports = function (config) { postrecords = _.sortBy(postrecords, function(d) { return d.time; }); } else { - throw new Error('No records since most recent pump shut down; nothing to upload.'); + throw new Error('No records since last upload or most recent pump shut down; nothing to upload.'); } var simulator = tandemSimulatorMaker.make({settings: settings, profiles:data.profiles}); @@ -2358,11 +2200,12 @@ module.exports = function (config) { data.post_records = simulator.getEvents(); var sessionInfo = { + delta: {lastEndPosition: data.end_seq} , deviceTags: ['insulin-pump'], deviceManufacturers: ['Tandem'], deviceModel: String(data.model_no), deviceSerialNumber: String(data.pump_sn), - deviceId: deviceId, + deviceId: cfg.deviceInfo.deviceId, start: sundial.utcDateString(), timeProcessing: cfg.tzoUtil.type, tzName: cfg.timezone, diff --git a/lib/usbDevice.js b/lib/usbDevice.js new file mode 100644 index 0000000000..e66aae639f --- /dev/null +++ b/lib/usbDevice.js @@ -0,0 +1,20 @@ +/* + * == BSD2 LICENSE == + * Copyright (c) 2017, Tidepool Project + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the associated License, which is identical to the BSD 2-Clause + * License as published by the Open Source Initiative at opensource.org. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the License for more details. + * + * You should have received a copy of the License along with this program; if + * not, you can obtain one from Tidepool Project at tidepool.org. + * == BSD2 LICENSE == + */ + +export default function usbDevice() { + return {}; +}; diff --git a/package.json b/package.json index 790cecf5dd..c97eceaf3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "2.2.5-600series-qa.16", + "version": "2.2.5-600series-qa.17", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.js", @@ -63,7 +63,7 @@ "redux": "3.7.2", "redux-form": "7.1.2", "redux-thunk": "2.2.0", - "rollbar": "2.3.1", + "rollbar": "2.3.9", "rollbar-sourcemap-webpack-plugin": "2.2.0", "semver": "5.4.1", "source-map-support": "0.5.0", @@ -189,6 +189,7 @@ "css-loader": "0.28.7", "devtron": "1.4.0", "difflet": "1.0.1", + "drivelist": "5.1.8", "electron": "1.7.9", "electron-builder": "19.49.0", "electron-devtools-installer": "2.2.1", @@ -201,7 +202,7 @@ "eslint-import-resolver-webpack": "0.8.3", "eslint-plugin-import": "2.8.0", "eslint-plugin-jsx-a11y": "6.0.2", - "eslint-plugin-lodash": "2.4.3", + "eslint-plugin-lodash": "2.5.0", "eslint-plugin-mocha": "4.11.0", "eslint-plugin-promise": "3.6.0", "eslint-plugin-react": "7.4.0", @@ -218,6 +219,8 @@ "less": "2.7.3", "less-loader": "4.0.5", "minimist": "1.2.0", + "mocha": "3.2.0", + "node-hid": "0.5.7", "nodegit": "0.20.3", "object-invariant-test-helper": "0.1.1", "open": "0.0.5", @@ -227,9 +230,11 @@ "serialport": "5.0.0", "shelljs": "0.7.8", "sinon": "4.1.2", + "sinon-chai": "2.14.0", "spectron": "3.7.2", "style-loader": "0.19.0", "url-loader": "0.6.2", + "usb": "1.3.1", "webpack": "3.8.1", "webpack-dev-middleware": "1.12.0", "webpack-dev-server": "2.9.4", diff --git a/resources/mac/extensions.zip b/resources/mac/extensions.zip index efc898a52e..6abe405b73 100644 Binary files a/resources/mac/extensions.zip and b/resources/mac/extensions.zip differ diff --git a/resources/mac/updateDrivers.sh b/resources/mac/updateDrivers.sh index 1b02da82e4..8b2ac1126d 100755 --- a/resources/mac/updateDrivers.sh +++ b/resources/mac/updateDrivers.sh @@ -1,5 +1,6 @@ #!/bin/sh -DRIVER_PATH=$1 +DRIVER_PATH=$1/extensions +HELPER_PATH=$1/helpers echo "Driver path: $DRIVER_PATH" echo "Unloading and uninstalling old extensions..." @@ -15,6 +16,8 @@ rm -rf /Library/Extensions/DexcomUSB.kext rm -rf /Library/Extensions/SiLabsUSBDriver.kext rm -rf /Library/Extensions/ProlificUsbSerial.kext +"$HELPER_PATH/org.tidepool.disk-permissions/install.sh" --uninstall + # install new extensions echo "Installing and loading new extensions..." cp -R "$DRIVER_PATH/DexComUSB.kext" /Library/Extensions/DexComUSB.kext @@ -29,4 +32,6 @@ cp -R "$DRIVER_PATH/ProlificUsbSerial.kext" /Library/Extensions/ProlificUsbSeria chown -R root:wheel /Library/Extensions/ProlificUsbSerial.kext kextload /Library/Extensions/ProlificUsbSerial.kext/ +"$HELPER_PATH/org.tidepool.disk-permissions/install.sh" --install + echo "Done." diff --git a/scripts/json-compare.js b/scripts/json-compare.js new file mode 100644 index 0000000000..503ad24bb6 --- /dev/null +++ b/scripts/json-compare.js @@ -0,0 +1,109 @@ +#!/usr/bin/env node + +var program = require('commander'); +var fs = require('fs'); +var _ = require('lodash'); +var difflet = require('difflet')({ indent : 2, comment: true }); + +var intro = 'Compare JSON CLI:'; +var file1, file2; + +var EXCLUDES = ['payload','bolus.payload','guid','uploadId']; + +function loadFile(filePath, cb) { + fs.readFile(filePath, 'utf8', function(error, data) { + console.log(intro, 'Reading', filePath); + if (error) { + console.log(intro, 'Error reading JSON file', error); + return; + } + + return cb(JSON.parse(data)); + }); +} + +function cleanup(record) { + return _.omit(record,EXCLUDES); +} + +function compareData(data1, data2){ + var successful = 0; + + for (var i = 0; i < data1.length - 1; i++) { + var record1 = data1[i]; + var records2 = _.filter(data2, {deviceTime: record1.deviceTime, type: record1.type, type: record1.type}); + var matched = false; + if(records2.length > 0) { + records2.forEach(function (record2) { + matched = matched || _.isEqual(cleanup(record1), cleanup(record2)); + }); + if(!matched) { + + console.log('Difference at:', record1.deviceTime); + + records2.forEach(function (record2) { + + if(record1.type === record2.type) { + console.log('Diff:'); + var s = difflet.compare(cleanup(record1), cleanup(record2)); + process.stdout.write(s); + } else { + console.log('Record from',file1,':', JSON.stringify(cleanup(record1),null,4)); + console.log('Record from',file2,':', JSON.stringify(cleanup(record2),null,4)); + } + + }); + } else { + successful += 1; + } + } else { + console.log('No matching record at ', record1.deviceTime); + } + + }; + console.log('A total of',successful,'records passed successfully'); +} + +program + .version('0.0.1') + .arguments('[file1] [file2] ') + .option('-t, --type ', 'filter by type') + .option('-s, --subType ', 'filter by subType') + .action(function (f1, f2) { + file1 = f1; + file2 = f2; + }) + .parse(process.argv); + +if(file1 && file2) { + if (fs.existsSync(file1) && fs.existsSync(file2)){ + + console.log(intro, 'Loading files...'); + console.log(intro, 'Excluding ',EXCLUDES); + + loadFile(file1, function(json1) { + loadFile(file2, function(json2) { + _.remove(json1, function (record) { + return record.type === 'pumpSettings' || record.type == 'upload'; + }); + if(program.type) { + console.log(intro,'Filtering by', program.type); + json1 = _.filter(json1,{'type' : program.type}); + json2 = _.filter(json2,{'type' : program.type}); + } + if(program.subType) { + console.log(intro,'Filtering by', program.subType); + json1 = _.filter(json1,{'subType' : program.subType}); + json2 = _.filter(json2,{'subType' : program.subType}); + } + compareData(json1, json2); + return; + }); + }); + }else{ + console.log(intro + ' file not found'); + return; + } +}else{ + program.help(); +} diff --git a/test/app/reducers/misc.test.js b/test/app/reducers/misc.test.js index 5d66c44926..9f3dfe5830 100644 --- a/test/app/reducers/misc.test.js +++ b/test/app/reducers/misc.test.js @@ -58,7 +58,8 @@ describe('misc reducers', () => { payload: {os: 'mac'} }); expect(mutationTracker.hasMutated(tracked)).to.be.false; - // because we do currently have devices unavailable on Mac + // at least one device is unavailable on Mac, so available devices should be less than + // all devices expect(_.keys(actualResult).length).to.be.lessThan(_.keys(devices).length); }); @@ -69,8 +70,9 @@ describe('misc reducers', () => { }); let expectedResult = _.pickBy(devices, filterDevicesFn('win')); expect(actualResult).to.deep.equal(expectedResult); - // because nothing currently is unavailable on Windows - expect(_.keys(actualResult).length).to.equal(_.keys(devices).length); + // at least one device is unavailable on Windows, so available devices should be less than + // all devices + expect(_.keys(actualResult).length).to.be.lessThan(_.keys(devices).length); // test to be sure not *mutating* state object but rather returning new! let prevState = devices; const tracked = mutationTracker.trackObj(prevState); diff --git a/yarn.lock b/yarn.lock index 61ac1c7633..0e0b08bc30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,69 +26,88 @@ version "0.0.6" resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" -"@babel/code-frame@7.0.0-beta.39", "@babel/code-frame@^7.0.0-beta.31": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.39.tgz#91c90bb65207fc5a55128cb54956ded39e850457" +"@babel/code-frame@7.0.0-beta.42", "@babel/code-frame@^7.0.0-beta.31": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.42.tgz#a9c83233fa7cd06b39dc77adbb908616ff4f1962" dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" + "@babel/highlight" "7.0.0-beta.42" -"@babel/generator@7.0.0-beta.39": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.39.tgz#d2c9f0a9c47d5ff288f0306aedd0cf89983cb6ed" +"@babel/generator@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.42.tgz#777bb50f39c94a7e57f73202d833141f8159af33" dependencies: - "@babel/types" "7.0.0-beta.39" + "@babel/types" "7.0.0-beta.42" jsesc "^2.5.1" lodash "^4.2.0" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.39": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.39.tgz#34f8ca0c46cdd7056ae706468a8078dab53dbc91" +"@babel/helper-function-name@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.42.tgz#b38b8f4f85168d1812c543dd700b5d549b0c4658" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.42" + "@babel/template" "7.0.0-beta.42" + "@babel/types" "7.0.0-beta.42" + +"@babel/helper-get-function-arity@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.42.tgz#ad072e32f912c033053fc80478169aeadc22191e" + dependencies: + "@babel/types" "7.0.0-beta.42" + +"@babel/helper-split-export-declaration@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.42.tgz#0d0d5254220a9cc4e7e226240306b939dc210ee7" dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.39" - "@babel/template" "7.0.0-beta.39" - "@babel/types" "7.0.0-beta.39" + "@babel/types" "7.0.0-beta.42" -"@babel/helper-get-function-arity@7.0.0-beta.39": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.39.tgz#f542cb644c7866f9335b1ffc0614bbe633bd60ce" +"@babel/highlight@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.42.tgz#a502a1c0d6f99b2b0e81d468a1b0c0e81e3f3623" dependencies: - "@babel/types" "7.0.0-beta.39" + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" -"@babel/template@7.0.0-beta.39": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.39.tgz#98bd7b132d99f73547c473f2862f481ae84981c9" +"@babel/template@7.0.0-beta.42": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.42.tgz#7186d4e70d44cdec975049ba0a73bdaf5cdee052" dependencies: - "@babel/code-frame" "7.0.0-beta.39" - "@babel/types" "7.0.0-beta.39" - babylon "7.0.0-beta.39" + "@babel/code-frame" "7.0.0-beta.42" + "@babel/types" "7.0.0-beta.42" + babylon "7.0.0-beta.42" lodash "^4.2.0" "@babel/traverse@^7.0.0-beta.31": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.39.tgz#ccb5abfb878403a39af249997dd6f36136de7694" - dependencies: - "@babel/code-frame" "7.0.0-beta.39" - "@babel/generator" "7.0.0-beta.39" - "@babel/helper-function-name" "7.0.0-beta.39" - "@babel/types" "7.0.0-beta.39" - babylon "7.0.0-beta.39" - debug "^3.0.1" + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.42.tgz#f4bf4d1e33d41baf45205e2d0463591d57326285" + dependencies: + "@babel/code-frame" "7.0.0-beta.42" + "@babel/generator" "7.0.0-beta.42" + "@babel/helper-function-name" "7.0.0-beta.42" + "@babel/helper-split-export-declaration" "7.0.0-beta.42" + "@babel/types" "7.0.0-beta.42" + babylon "7.0.0-beta.42" + debug "^3.1.0" globals "^11.1.0" invariant "^2.2.0" lodash "^4.2.0" -"@babel/types@7.0.0-beta.39", "@babel/types@^7.0.0-beta.31": - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.39.tgz#2ea0d97efe4781688751edc68cde640d6559938c" +"@babel/types@7.0.0-beta.42", "@babel/types@^7.0.0-beta.31": + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.42.tgz#1e2118767684880f6963801b272fd2b3348efacc" dependencies: esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^2.0.0" +"@sinonjs/formatio@^2.0.0": + version "2.0.0" + resolved "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" + dependencies: + samsam "1.3.0" + "@types/core-js@^0.9.41": version "0.9.46" resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-0.9.46.tgz#ea701ee34cbb6dfe6d100f1530319547c93c8d79" @@ -98,16 +117,16 @@ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" "@types/node@*": - version "8.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.9.1.tgz#5a329d73a97f3c5a626dfe0ed8c0b831fee5357a" + version "9.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7" "@types/node@6.0.66": version "6.0.66" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.66.tgz#5680b74a6135d33d4c00447e7c3dc691a4601625" "@types/node@^7.0.18": - version "7.0.53" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.53.tgz#3465ada7e6f0f762f761779fcb4f041e795755cd" + version "7.0.57" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.57.tgz#eed149b2c75cdbd7b9823c3fd64ecddbdc68ed9c" "@types/rimraf@^0.0.28": version "0.0.28" @@ -128,11 +147,11 @@ abbrev@~1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: - mime-types "~2.1.16" + mime-types "~2.1.18" negotiator "0.6.1" accessibility-developer-tools@^2.11.0: @@ -159,9 +178,9 @@ acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.4.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" +acorn@^5.0.0, acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" agent-base@4, agent-base@^4.1.0: version "4.2.0" @@ -170,15 +189,19 @@ agent-base@4, agent-base@^4.1.0: es6-promisify "^5.0.0" agentkeepalive@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.3.0.tgz#6d5de5829afd3be2712201a39275fd11c651857c" + version "3.4.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" dependencies: humanize-ms "^1.2.1" -ajv-keywords@^2.0.0, ajv-keywords@^2.1.0, ajv-keywords@^2.1.1: +ajv-keywords@^2.0.0, ajv-keywords@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" +ajv-keywords@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" + ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -186,7 +209,7 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3, ajv@^5.3.0, ajv@^5.5.1: +ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.3.0, ajv@^5.5.1: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -195,6 +218,15 @@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3, ajv@^5.3.0, ajv@^5.5.1: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.0.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" + dependencies: + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + uri-js "^3.0.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -226,8 +258,8 @@ ansi-escapes@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" ansi-gray@^0.1.1: version "0.1.1" @@ -239,6 +271,10 @@ ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" +ansi-regex@*, ansi-regex@^3.0.0, ansi-regex@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" @@ -247,10 +283,6 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" -ansi-regex@^3.0.0, ansi-regex@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" @@ -259,9 +291,9 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: color-convert "^1.9.0" @@ -288,6 +320,13 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + app-package-builder@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-2.0.0.tgz#f0a6cbd2010e68fc79a44e9844c4a512e33ae55e" @@ -343,8 +382,8 @@ are-we-there-yet@~1.1.2: readable-stream "^2.0.6" argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" dependencies: sprintf-js "~1.0.2" @@ -361,10 +400,18 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -406,6 +453,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -422,8 +473,8 @@ asar-integrity@0.2.3: fs-extra-p "^4.4.4" asn1.js@^4.0.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -455,6 +506,10 @@ assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + ast-types-flow@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -499,6 +554,10 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + atob@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" @@ -1572,9 +1631,9 @@ babili-webpack-plugin@0.1.2: babel-preset-babili "^0.1.4" webpack-sources "^1.0.1" -babylon@7.0.0-beta.39, babylon@^7.0.0-beta.31: - version "7.0.0-beta.39" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.39.tgz#512833ea788f6570c6db026d743a7565e58d3aeb" +babylon@7.0.0-beta.42, babylon@^7.0.0-beta.31: + version "7.0.0-beta.42" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.42.tgz#67cfabcd4f3ec82999d29031ccdea89d0ba99657" babylon@^6.18.0, babylon@^6.3.26: version "6.18.0" @@ -1601,8 +1660,20 @@ base64-js@1.2.0: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + version "1.2.3" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" bash-color@0.0.4: version "0.0.4" @@ -1630,15 +1701,16 @@ binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" -bindings@1.3.0, bindings@^1.3.0: +bindings@1.3.0, bindings@^1.2.1, bindings@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" bl@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" dependencies: - readable-stream "^2.0.5" + readable-stream "^2.3.5" + safe-buffer "^5.1.1" bl@~1.1.2: version "1.1.2" @@ -1737,8 +1809,8 @@ boxen@^1.0.0, boxen@^1.2.1: widest-line "^2.0.0" brace-expansion@^1.1.7: - version "1.1.9" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.9.tgz#acdc7dde0e939fb3b32fe933336573e2a7dc2b7c" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1751,6 +1823,23 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.0, braces@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + kind-of "^6.0.2" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -1835,6 +1924,10 @@ buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" @@ -1953,22 +2046,22 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" cacache@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.2.tgz#105a93a162bbedf3a25da42e1939ed99ffb145f8" + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" dependencies: - bluebird "^3.5.0" + bluebird "^3.5.1" chownr "^1.0.1" glob "^7.1.2" graceful-fs "^4.1.11" lru-cache "^4.1.1" - mississippi "^1.3.0" + mississippi "^2.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.1" - ssri "^5.0.0" + rimraf "^2.6.2" + ssri "^5.2.4" unique-filename "^1.1.0" - y18n "^3.2.1" + y18n "^4.0.0" cacache@^9.2.9: version "9.3.0" @@ -2006,6 +2099,20 @@ cacache@~9.2.9: unique-filename "^1.1.0" y18n "^3.2.1" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + call-limit@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" @@ -2060,12 +2167,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000805" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000805.tgz#8f1ad9264c835989b5055dd9b009513ce6d95338" + version "1.0.30000820" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000820.tgz#7c20e25cea1768b261b724f82e3a6a253aaa1468" caniuse-lite@^1.0.30000792: - version "1.0.30000805" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000805.tgz#83a5f21ead01486e67bccca6fae5dca7cde496de" + version "1.0.30000820" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000820.tgz#6e36ee75187a2c83d26d6504a1af47cc580324d2" capture-stack-trace@^1.0.0: version "1.0.0" @@ -2124,13 +2231,13 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" dependencies: - ansi-styles "^3.1.0" + ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" - supports-color "^4.0.0" + supports-color "^5.3.0" char-spinner@~1.0.1: version "1.0.1" @@ -2165,7 +2272,7 @@ chmodr@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" -chokidar@^1.6.0, chokidar@^1.7.0: +chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -2180,6 +2287,24 @@ chokidar@^1.6.0, chokidar@^1.7.0: optionalDependencies: fsevents "^1.0.0" +chokidar@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.0" + optionalDependencies: + fsevents "^1.1.2" + chownr@^1.0.1, chownr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" @@ -2202,8 +2327,8 @@ chromium-pickle-js@^0.2.0: resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" ci-info@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -2222,13 +2347,22 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + classnames@2.2.5, classnames@^2.2.4: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" clean-css@4.1.x: - version "4.1.9" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.9.tgz#35cee8ae7687a49b98034f70de00c4edd3826301" + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" dependencies: source-map "0.5.x" @@ -2275,12 +2409,12 @@ clone-stats@^0.0.1: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" clone@^1.0.0, clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" clone@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" cmd-shim@~2.0.2: version "2.0.2" @@ -2303,6 +2437,13 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" @@ -2347,7 +2488,11 @@ colors@0.5.x: version "0.5.1" resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" -colors@^1.1.2, colors@~1.1.2: +colors@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794" + +colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -2358,9 +2503,9 @@ columnify@~1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" @@ -2374,17 +2519,19 @@ commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" -commander@2.12.x: - version "2.12.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" +commander@2.15.x, commander@^2.11.0, commander@^2.9.0, commander@~2.15.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" commander@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" -commander@^2.11.0, commander@^2.9.0, commander@~2.14.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" commander@~2.8.1: version "2.8.1" @@ -2404,6 +2551,10 @@ component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + compress-commons@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" @@ -2413,19 +2564,19 @@ compress-commons@^1.2.0: normalize-path "^2.0.0" readable-stream "^2.0.0" -compressible@~2.0.11: - version "2.0.12" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" +compressible@~2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" dependencies: - mime-db ">= 1.30.0 < 2" + mime-db ">= 1.33.0 < 2" compression@^1.5.2: - version "1.7.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + version "1.7.2" + resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" dependencies: accepts "~1.3.4" bytes "3.0.0" - compressible "~2.0.11" + compressible "~2.0.13" debug "2.6.9" on-headers "~1.0.1" safe-buffer "5.1.1" @@ -2435,7 +2586,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.0, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0: +concat-stream@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -2443,6 +2594,15 @@ concat-stream@1.6.0, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^ readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concurrently@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.5.0.tgz#8cf1b7707a6916a78a4ff5b77bb04dec54b379b2" @@ -2535,6 +2695,10 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -2791,19 +2955,25 @@ dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" -debug@2, debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2, debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + debug@3.1.0, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -2817,6 +2987,10 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -2912,6 +3086,25 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -2955,7 +3148,7 @@ depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" -depd@~1.1.1: +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3007,13 +3200,17 @@ dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@^1.0.2, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" diff@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" diffie-hellman@^5.0.0: version "5.0.2" @@ -3152,6 +3349,16 @@ dotenv@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" +drivelist@5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-5.1.8.tgz#76f0d5f747e36544b5fa77ff914ff9a97877b01f" + dependencies: + bindings "^1.2.1" + debug "^2.6.0" + js-yaml "^3.4.1" + lodash "^4.16.4" + nan "^2.6.2" + duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -3163,8 +3370,8 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" duplexify@^3.4.2, duplexify@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -3186,8 +3393,8 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" ejs@^2.5.7, ejs@~2.5.6: - version "2.5.7" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" + version "2.5.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.8.tgz#2ab6954619f225e6193b7ac5f7c39c48fefe4380" electron-builder-lib@19.49.0: version "19.49.0" @@ -3353,8 +3560,8 @@ electron-publish@19.49.0: mime "^2.0.3" electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: - version "1.3.33" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.33.tgz#bf00703d62a7c65238136578c352d6c5c042a545" + version "1.3.40" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz#1fbd6d97befd72b8a6f921dc38d22413d2f6fddf" electron-updater@2.16.1: version "2.16.1" @@ -3404,7 +3611,7 @@ emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" -encodeurl@~1.0.1: +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -3475,8 +3682,8 @@ err-code@^1.0.0: resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" "errno@>=0.1.1 <0.2.0-0", errno@^0.1.1, errno@^0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: prr "~1.0.1" @@ -3499,8 +3706,8 @@ error-stack-parser@^1.3.6: stackframe "^0.3.1" es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + version "1.11.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -3517,11 +3724,12 @@ es-to-primitive@^1.1.1: is-symbol "^1.0.1" es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.38" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3" + version "0.10.41" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.41.tgz#bab3e982d750f0112f0cb9e6abed72c59eb33eb2" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" + next-tick "1" es6-error@4.1.1, es6-error@^4.0.0: version "4.1.1" @@ -3757,10 +3965,10 @@ eslint@4.11.0: text-table "~0.2.0" espree@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: - acorn "^5.4.0" + acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@^2.6.0: @@ -3778,11 +3986,10 @@ esquery@^1.0.0: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: estraverse "^4.1.0" - object-assign "^4.0.1" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" @@ -3842,6 +4049,18 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" @@ -3852,7 +4071,7 @@ expand-template@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc" -express@4.16.2, express@^4.13.3: +express@4.16.2: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" dependencies: @@ -3887,6 +4106,54 @@ express@4.16.2, express@^4.13.3: utils-merge "1.0.1" vary "~1.1.2" +express@^4.13.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c" @@ -3913,6 +4180,19 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-text-webpack-plugin@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" @@ -3948,8 +4228,8 @@ fancy-log@^1.1.0: time-stamp "^1.0.0" fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -4052,6 +4332,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" @@ -4064,6 +4353,18 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + find-babel-config@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" @@ -4116,8 +4417,8 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" flush-write-stream@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" dependencies: inherits "^2.0.1" readable-stream "^2.0.4" @@ -4128,7 +4429,7 @@ flux-standard-action@2.0.0: dependencies: lodash "^4.0.0" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -4171,11 +4472,11 @@ form-data@~2.1.1: mime-types "^2.1.12" form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "1.0.6" mime-types "^2.1.12" formatio@1.1.1: @@ -4184,7 +4485,7 @@ formatio@1.1.1: dependencies: samsam "~1.1" -formatio@1.2.0, formatio@^1.2.0: +formatio@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" dependencies: @@ -4198,6 +4499,12 @@ forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -4217,8 +4524,8 @@ from2@^2.1.0: readable-stream "^2.0.0" fs-extra-p@^4.4.4, fs-extra-p@^4.4.5, fs-extra-p@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.5.0.tgz#b79f3f3fcc0b5e57b7e7caeb06159f958ef15fe8" + version "4.5.2" + resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.5.2.tgz#0a22aba489284d17f375d5dc5139aa777fe2df51" dependencies: bluebird-lst "^1.0.5" fs-extra "^5.0.0" @@ -4295,7 +4602,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0: +fsevents@^1.0.0, fsevents@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" dependencies: @@ -4436,6 +4743,10 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -4491,6 +4802,24 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -4527,8 +4856,8 @@ global@^4.3.0: process "~0.5.1" globals@^11.1.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + version "11.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc" globals@^9.17.0, globals@^9.18.0: version "9.18.0" @@ -4597,6 +4926,10 @@ growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + gulp-util@^3.0.4: version "3.0.8" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" @@ -4685,6 +5018,10 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -4699,6 +5036,33 @@ has-unicode@^2.0.0, has-unicode@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" @@ -4774,12 +5138,12 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" hoist-non-react-statics@^2.2.1, hoist-non-react-statics@^2.3.0, hoist-non-react-statics@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" + version "2.5.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" home-or-tmp@^2.0.0: version "2.0.0" @@ -4792,14 +5156,18 @@ home-path@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" -hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@^2.5.0, hosted-git-info@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" hosted-git-info@~2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" +hosted-git-info@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -4818,12 +5186,12 @@ html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" html-minifier@^3.2.3: - version "3.5.8" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.8.tgz#5ccdb1f73a0d654e6090147511f6e6b2ee312700" + version "3.5.12" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.12.tgz#6bfad4d0327f5b8d2b62f5854654ac3703b9b031" dependencies: camel-case "3.0.x" clean-css "4.1.x" - commander "2.12.x" + commander "2.15.x" he "1.1.x" ncname "1.0.x" param-case "2.1.x" @@ -4879,15 +5247,15 @@ http-errors@1.6.2, http-errors@~1.6.2: statuses ">= 1.3.1 < 2" http-parser-js@>=0.4.0: - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + version "0.4.11" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.11.tgz#5b720849c650903c27e521633d94696ee95f3529" http-proxy-agent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" dependencies: agent-base "4" - debug "2" + debug "3.1.0" http-proxy-middleware@~0.17.4: version "0.17.4" @@ -4930,8 +5298,8 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" https-proxy-agent@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.0.tgz#7fbba856be8cd677986f42ebd3664f6317257887" dependencies: agent-base "^4.1.0" debug "^3.1.0" @@ -4961,8 +5329,8 @@ icss-utils@^2.1.0: postcss "^6.0.1" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.11" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.11.tgz#c16384ffe00f5b7835824e67b6f2bd44a5229455" iferr@^0.1.5, iferr@~0.1.5: version "0.1.5" @@ -4993,7 +5361,7 @@ import-local@^0.1.1: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5031,11 +5399,11 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0, ini@~1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" init-package-json@~1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.1.tgz#cd873a167796befb99612b28762a0b6393fd8f6a" + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" dependencies: glob "^7.1.1" - npm-package-arg "^4.0.0 || ^5.0.0" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" promzard "^0.3.0" read "~1.0.1" read-package-json "1 || 2" @@ -5090,8 +5458,8 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.0.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" @@ -5103,9 +5471,9 @@ ip@^1.1.0, ip@^1.1.4, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -ipaddr.js@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" irregular-plurals@^1.0.0: version "1.4.0" @@ -5122,6 +5490,18 @@ is-absolute@^0.2.3: is-relative "^0.2.1" is-windows "^0.2.0" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5152,10 +5532,38 @@ is-ci@^1.0.10: dependencies: ci-info "^1.0.0" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -5174,15 +5582,21 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.0: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -5214,6 +5628,12 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -5221,12 +5641,17 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + is-my-json-valid@^2.12.4: - version "2.17.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" jsonpointer "^4.0.0" xtend "^4.0.0" @@ -5250,17 +5675,27 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" dependencies: is-path-inside "^1.0.0" @@ -5274,6 +5709,12 @@ is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -5350,9 +5791,9 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" -is-windows@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" +is-windows@^1.0.0, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" is-wsl@^1.1.0: version "1.1.0" @@ -5384,6 +5825,10 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -5403,9 +5848,9 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.10.0, js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@^3.10.0, js-yaml@^3.4.1, js-yaml@^3.9.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -5437,7 +5882,7 @@ json-loader@0.5.7, json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" -json-parse-better-errors@^1.0.0: +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" @@ -5463,7 +5908,7 @@ json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@^3.3.2: +json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -5520,7 +5965,7 @@ jsx-ast-utils@^2.0.0: dependencies: array-includes "^3.0.3" -just-extend@^1.1.26: +just-extend@^1.1.27: version "1.1.27" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" @@ -5536,7 +5981,7 @@ killable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -5548,6 +5993,14 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -5670,17 +6123,32 @@ lockfile@~1.0.1, lockfile@~1.0.3: resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" lodash-es@^4.17.3, lodash-es@^4.2.0, lodash-es@^4.2.1: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" + version "4.17.7" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.7.tgz#db240a3252c3dd8360201ac9feef91ac977ea856" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + lodash._baseget@^3.0.0: version "3.7.2" resolved "https://registry.yarnpkg.com/lodash._baseget/-/lodash._baseget-3.7.2.tgz#1b6ae1d5facf3c25532350a13c1197cb8bb674f4" +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + lodash._basetostring@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" @@ -5696,11 +6164,25 @@ lodash._basevalues@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@^3.0.0: +lodash._getnative@*, lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" @@ -5742,6 +6224,14 @@ lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.escape@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" @@ -5815,7 +6305,7 @@ lodash.reduce@^4.3.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" -lodash.restparam@^3.0.0: +lodash.restparam@*, lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -5868,7 +6358,7 @@ lodash@4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.4, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.0, lodash@~4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -5886,11 +6376,7 @@ lolex@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.1.0.tgz#5dbbbc850395e7523c74b3586f7fbd2626d25b1b" -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" - -lolex@^2.2.0: +lolex@^2.2.0, lolex@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807" @@ -5916,12 +6402,12 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -5942,8 +6428,8 @@ macaddress@^0.2.8: resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" make-dir@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + version "1.2.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" dependencies: pify "^3.0.0" @@ -5963,10 +6449,20 @@ make-fetch-happen@^2.4.13: socks-proxy-agent "^3.0.1" ssri "^5.0.0" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" @@ -6051,6 +6547,24 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -6058,23 +6572,19 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.30.0 < 2": - version "1.32.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" +"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" mime-db@~1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" +mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: - mime-db "~1.30.0" + mime-db "~1.33.0" mime-types@~2.0.3: version "2.0.14" @@ -6153,6 +6663,28 @@ mississippi@^1.2.0, mississippi@^1.3.0, mississippi@~1.3.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" @@ -6165,6 +6697,22 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi dependencies: minimist "0.0.8" +mocha@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + mocha@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" @@ -6187,8 +6735,8 @@ moment-timezone@0.4.1: moment ">= 2.6.0" "moment@>= 2.6.0": - version "2.20.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + version "2.21.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" move-concurrently@^1.0.1, move-concurrently@~1.0.1: version "1.0.1" @@ -6201,6 +6749,10 @@ move-concurrently@^1.0.1, move-concurrently@~1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6231,8 +6783,25 @@ mute-stream@0.0.7, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.2.0, nan@^2.3.0, nan@^2.6.2, nan@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" natural-compare@^1.4.0: version "1.4.0" @@ -6245,24 +6814,33 @@ ncname@1.0.x: xml-char-classes "^1.0.0" nearley@^2.7.10: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae" + version "2.13.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.13.0.tgz#6e7b0f4e68bfc3e74c99eaef2eda39e513143439" dependencies: nomnom "~1.6.2" railroad-diagrams "^1.0.0" - randexp "^0.4.2" + randexp "0.4.6" + semver "^5.4.1" negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +neo-async@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + nise@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.2.tgz#9aa5edb500da38035884106e3c571341bc68b2c1" + version "1.3.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.2.tgz#fd6fd8dc040dfb3c0a45252feb6ff21832309b14" dependencies: - formatio "^1.2.0" - just-extend "^1.1.26" - lolex "^1.6.0" + "@sinonjs/formatio" "^2.0.0" + just-extend "^1.1.27" + lolex "^2.3.2" path-to-regexp "^1.7.0" text-encoding "^0.6.4" @@ -6273,8 +6851,8 @@ no-case@^2.2.0: lower-case "^1.1.1" node-abi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.2.0.tgz#e802ac7a2408e2c0593fb3176ffdf8a99a9b4dec" + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.3.0.tgz#f3d554d6ac72a9ee16f0f4dc9548db7c08de4986" dependencies: semver "^5.4.1" @@ -6321,6 +6899,14 @@ node-gyp@^3.5.0, node-gyp@~3.6.0, node-gyp@~3.6.2: tar "^2.0.0" which "1" +node-hid@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-0.5.7.tgz#5c87c33e4bcb9db64decf21ba3c7b9d014eac123" + dependencies: + bindings "^1.3.0" + nan "^2.6.2" + prebuild-install "^2.2.2" + node-libs-browser@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-1.1.1.tgz#2a38243abedd7dffcd07a97c9aca5668975a6fea" @@ -6377,7 +6963,7 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-pre-gyp@^0.6.36, node-pre-gyp@^0.6.39, node-pre-gyp@~0.6.32: +node-pre-gyp@^0.6.30, node-pre-gyp@^0.6.36, node-pre-gyp@^0.6.39, node-pre-gyp@~0.6.32: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" dependencies: @@ -6460,7 +7046,7 @@ normalize-package-data@~2.3.5: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -6516,6 +7102,15 @@ npm-install-package@~2.1.0: semver "^5.1.0" validate-npm-package-name "^3.0.0" +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" + dependencies: + hosted-git-info "^2.5.0" + osenv "^0.1.4" + semver "^5.4.1" + validate-npm-package-name "^3.0.0" + npm-package-arg@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.1.1.tgz#86d9dca985b4c5e5d59772dfd5de6919998a495a" @@ -6813,6 +7408,14 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-invariant-test-helper@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/object-invariant-test-helper/-/object-invariant-test-helper-0.1.1.tgz#4bfbd68f3790ff4570a5e77f8e830613111af008" @@ -6829,6 +7432,12 @@ object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + object.assign@^4.0.4: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" @@ -6861,6 +7470,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + object.values@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" @@ -6871,8 +7486,8 @@ object.values@^1.0.4: has "^1.0.1" obuf@^1.0.0, obuf@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" on-finished@~2.3.0: version "2.3.0" @@ -6905,8 +7520,8 @@ opener@~1.4.1, opener@~1.4.3: resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" opn@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" dependencies: is-wsl "^1.1.0" @@ -6965,8 +7580,8 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" osenv@0, osenv@^0.1.4, osenv@~0.1.3, osenv@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -7093,10 +7708,18 @@ parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + path-exists@^2.0.0, path-exists@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -7235,6 +7858,10 @@ portfinder@^1.0.9: debug "^2.2.0" mkdirp "0.5.x" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" @@ -7474,14 +8101,14 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 supports-color "^3.2.3" postcss@^6.0.1: - version "6.0.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.17.tgz#e259a051ca513f81e9afd0c21f7f82eda50c65c5" + version "6.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.21.tgz#8265662694eddf9e9a5960db6da33c39e4cd069d" dependencies: - chalk "^2.3.0" + chalk "^2.3.2" source-map "^0.6.1" - supports-color "^5.1.0" + supports-color "^5.3.0" -prebuild-install@^2.3.0: +prebuild-install@^2.2.2, prebuild-install@^2.3.0: version "2.5.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.1.tgz#0f234140a73760813657c413cdccdda58296b1da" dependencies: @@ -7535,6 +8162,10 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + process@^0.11.0, process@^0.11.10, process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -7587,7 +8218,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@15.6.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0: +prop-types@15.6.0: version "15.6.0" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" dependencies: @@ -7595,6 +8226,14 @@ prop-types@15.6.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, loose-envify "^1.3.1" object-assign "^4.1.1" +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -7605,12 +8244,12 @@ protoduck@^4.0.0: dependencies: genfun "^4.0.1" -proxy-addr@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" +proxy-addr@~2.0.2, proxy-addr@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" dependencies: forwarded "~0.1.2" - ipaddr.js "1.5.2" + ipaddr.js "1.6.0" prr@~1.0.1: version "1.0.1" @@ -7660,6 +8299,10 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + q@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" @@ -7729,7 +8372,7 @@ ramda@^0.24.1: version "0.24.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" -randexp@^0.4.2: +randexp@0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" dependencies: @@ -7750,8 +8393,8 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: safe-buffer "^5.1.0" randomfill@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -7770,8 +8413,8 @@ raw-body@2.3.2: unpipe "1.0.0" rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7, rc@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + version "1.2.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -7928,11 +8571,11 @@ read-installed@~4.0.3: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.4, read-package-json@~2.0.9: - version "2.0.12" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.12.tgz#68ea45f98b3741cb6e10ae3bbd42a605026a6951" + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.0" + json-parse-better-errors "^1.0.1" normalize-package-data "^2.0.0" slash "^1.0.0" optionalDependencies: @@ -7984,14 +8627,14 @@ read@1, read@~1.0.1, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@~2.3.2: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.0.3" util-deprecate "~1.0.1" @@ -8046,7 +8689,7 @@ readable-stream@~2.1.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -8167,6 +8810,13 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -8228,7 +8878,7 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -8248,9 +8898,9 @@ request-ip@~2.0.1: dependencies: is_js "^0.9.0" -request@2, request@^2.45.0, request@^2.72.0, request@^2.74.0, request@^2.81.0, request@~2.83.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" +request@2, request@^2.45.0, request@^2.72.0, request@^2.74.0, request@^2.81.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -8328,6 +8978,33 @@ request@~2.74.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" +request@~2.83.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -8369,13 +9046,13 @@ resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" -resolve-url@~0.2.1: +resolve-url@^0.2.1, resolve-url@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" resolve@^1.1.6, resolve@^1.2.0, resolve@^1.4.0, resolve@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" dependencies: path-parse "^1.0.5" @@ -8404,7 +9081,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.0, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@~2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.0, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -8435,9 +9112,9 @@ rollbar-sourcemap-webpack-plugin@2.2.0: request "^2.72.0" verror "^1.6.1" -rollbar@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-2.3.1.tgz#5583875e8062dc1cb5458ab4b9b98f19a9f9f43e" +rollbar@2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-2.3.9.tgz#46dc6c5531177ae282c8622ad8e930dad9cf2305" dependencies: async "~1.2.1" console-polyfill "0.3.0" @@ -8488,6 +9165,12 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + salinity@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/salinity/-/salinity-0.0.8.tgz#5d3c1842121f54d929cb872c6a70643189df62dc" @@ -8496,7 +9179,7 @@ salinity@0.0.8: sinon "1.12.2" sinon-chai "2.7.0" -samsam@1.x: +samsam@1.3.0, samsam@1.x: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" @@ -8580,6 +9263,24 @@ send@0.16.1: range-parser "~1.2.0" statuses "~1.3.1" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serialport@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/serialport/-/serialport-5.0.0.tgz#08a1a494eaf5acdc34b5a7423c1877d997d2a8cf" @@ -8613,6 +9314,15 @@ serve-static@1.13.1: parseurl "~1.3.2" send "0.16.1" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -8621,6 +9331,24 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -8634,8 +9362,8 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.10" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -8687,6 +9415,10 @@ single-line-log@^1.1.2: dependencies: string-width "^1.0.1" +sinon-chai@2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d" + sinon-chai@2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.7.0.tgz#493df3a3d758933fdd3678d011a4f738d5e72540" @@ -8729,6 +9461,33 @@ smart-buffer@^1.0.13: version "1.1.15" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -8803,6 +9562,16 @@ source-map-resolve@^0.3.0: source-map-url "~0.3.0" urix "~0.1.0" +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab" @@ -8816,11 +9585,15 @@ source-map-support@^0.4.15: source-map "^0.5.6" source-map-support@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" + version "0.5.4" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8" dependencies: source-map "^0.6.0" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map-url@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -8857,23 +9630,35 @@ spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" -spdx-license-ids@^1.0.2, spdx-license-ids@~1.2.2: +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +spdx-license-ids@~1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" spdy-transport@^2.0.18: - version "2.0.20" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" dependencies: debug "^2.6.8" detect-node "^2.0.3" @@ -8908,6 +9693,12 @@ speedometer@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -8919,8 +9710,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -8938,9 +9729,9 @@ ssri@^4.1.2, ssri@^4.1.6, ssri@~4.1.6: dependencies: safe-buffer "^5.1.0" -ssri@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.1.tgz#8b6eb873688759bd3c75a88dee74593d179bb73c" +ssri@^5.0.0, ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" dependencies: safe-buffer "^5.1.1" @@ -8956,7 +9747,14 @@ stat-mode@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" -"statuses@>= 1.3.1 < 2": +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" @@ -8979,8 +9777,8 @@ stream-each@^1.1.0: stream-shift "^1.0.0" stream-http@^2.3.1, stream-http@^2.7.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" + version "2.8.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.1.tgz#d0441be1a457a73a733a8a7b53570bebd9ef66a4" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -9022,7 +9820,13 @@ string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -string_decoder@^1.0.0, string_decoder@~1.0.3: +string_decoder@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: @@ -9126,6 +9930,12 @@ superagent@1.2.0: readable-stream "1.0.27-1" reduce-component "1.0.1" +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + supports-color@4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" @@ -9146,17 +9956,17 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: +supports-color@^4.2.1, supports-color@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" -supports-color@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" +supports-color@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" dependencies: - has-flag "^2.0.0" + has-flag "^3.0.0" supports-color@~5.0.0: version "5.0.1" @@ -9181,11 +9991,11 @@ symbol-observable@^1.0.3: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" table@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" + ajv "^6.0.1" + ajv-keywords "^3.0.0" chalk "^2.1.0" lodash "^4.17.4" slice-ansi "1.0.0" @@ -9344,13 +10154,35 @@ to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + toposort@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec" tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" @@ -9412,12 +10244,12 @@ type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: media-typer "0.3.0" - mime-types "~2.1.15" + mime-types "~2.1.18" typedarray@^0.0.6: version "0.0.6" @@ -9428,10 +10260,10 @@ ua-parser-js@^0.7.9: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" uglify-js@3.3.x: - version "3.3.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.10.tgz#8e47821d4cf28e14c1826a0078ba0825ed094da8" + version "3.3.16" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.16.tgz#23ba13efa27aa00885be7417819e8a9787f94028" dependencies: - commander "~2.14.1" + commander "~2.15.0" source-map "~0.6.1" uglify-js@^2.8.29: @@ -9478,6 +10310,15 @@ underscore@~1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" @@ -9518,18 +10359,30 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" +upath@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" + update-notifier@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + version "2.4.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.4.0.tgz#f9b4c700fbfd4ec12c811587258777d563d8c866" dependencies: boxen "^1.2.1" chalk "^2.0.1" configstore "^3.0.0" import-lazy "^2.1.0" + is-ci "^1.0.10" is-installed-globally "^0.1.0" is-npm "^1.0.0" latest-version "^3.0.0" @@ -9553,6 +10406,12 @@ upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" +uri-js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" + dependencies: + punycode "^2.1.0" + urix@^0.1.0, urix@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -9592,6 +10451,19 @@ url@^0.11.0, url@~0.11.0: punycode "1.3.2" querystring "0.2.0" +usb@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.3.1.tgz#b5f8c360a53bf28f5c9fbc12d64c7f61e4346ab7" + dependencies: + nan "^2.8.0" + node-pre-gyp "^0.6.30" + +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + user-home@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -9650,12 +10522,12 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" -validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" +validate-npm-package-license@*, validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: version "3.0.0" @@ -9669,10 +10541,6 @@ validate-npm-package-name@~2.2.2: dependencies: builtins "0.0.7" -validator@~9.1.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/validator/-/validator-9.1.2.tgz#5711b6413f78bd9d56003130c81b47c39e86546c" - value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" @@ -9714,16 +10582,16 @@ warning@^3.0.0: loose-envify "^1.0.0" watchpack@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + version "1.5.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" dependencies: - async "^2.1.2" - chokidar "^1.7.0" + chokidar "^2.0.2" graceful-fs "^4.1.2" + neo-async "^2.5.0" wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" dependencies: minimalistic-assert "^1.0.0" @@ -9738,8 +10606,8 @@ wdio-dot-reporter@~0.0.8: resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz#929b2adafd49d6b0534fda068e87319b47e38fe5" webdriverio@^4.8.0: - version "4.10.2" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.10.2.tgz#0d28622802c966015afe34b3ac566dc339f22e43" + version "4.12.0" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.12.0.tgz#e340def272183c8168a4dd0b382322f9d7bee10d" dependencies: archiver "~2.1.0" babel-runtime "^6.26.0" @@ -9760,7 +10628,6 @@ webdriverio@^4.8.0: safe-buffer "~5.1.1" supports-color "~5.0.0" url "~0.11.0" - validator "~9.1.1" wdio-dot-reporter "~0.0.8" wgxpath "~1.0.0" @@ -10026,6 +10893,10 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"