From 5801e5f3ef418e7a947e02422f00d64d0f5a9aeb Mon Sep 17 00:00:00 2001 From: Shivang Date: Mon, 16 Dec 2019 12:13:34 +0530 Subject: [PATCH 01/14] Instructions to fix image issue in meteor 1.8.1 --- docs/ANDROID.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/ANDROID.md b/docs/ANDROID.md index 841bcbb..1d65dcb 100644 --- a/docs/ANDROID.md +++ b/docs/ANDROID.md @@ -98,8 +98,14 @@ For more info and checking the validity of a server key, reference [official doc To show you app's icon in the notification you will have to prepare an image file with your icon in it and every else being transparent. You can see [here](https://clevertap.com/blog/fixing-notification-icon-for-android-lollipop-and-above/) how it can be done. -Then put the file (e.g. "logo.png") in your project directory under this path: +Then based on your meteor version put the file (e.g. "logo.png") in your project directory under this path: +__For meteor ≥ 1.8.1__ +``` +cordova-build-override/platforms/android/app/src/main/res/drawable/ +``` + +__For meteor < 1.8.1__ ``` cordova-build-override/platforms/android/res/drawable/ ``` @@ -115,4 +121,30 @@ In your `Push.configure` block on the **client** you have to set the name of the }, ``` + +## Notification Sound + +If you want to notify your users using a personalized sound, prepare a mp3 file (e.g. yellow.mp3). + +Then based on your meteor version put that file in your project directory under this path: + +__For meteor ≥ 1.8.1__ +``` +cordova-build-override/platforms/android/app/src/main/res/raw/ +``` + +__For meteor < 1.8.1__ +``` +cordova-build-override/platforms/android/res/raw/ +``` + +In your `Push.configure` block on the **client** you have to set the sound property: + +```js + Push.Configure({ + android: { + ... + sound: 'yellow' + }, +``` From fcf28ebc3375b4af2e50f06b8e2c19b32c36c633 Mon Sep 17 00:00:00 2001 From: Shivang Date: Tue, 17 Dec 2019 11:05:27 +0530 Subject: [PATCH 02/14] Updated versions to latest --- README.md | 99 ++++--------------------------------------------------- 1 file changed, 7 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index 782eff7..374570a 100644 --- a/README.md +++ b/README.md @@ -23,98 +23,14 @@ Status: We are using [semantic-release](https://github.com/semantic-release/semantic-release) following the [AngularJS Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) - Following this pattern will result in better versioning, better changelog and shorter release cycle. -## Updates For Android 8.0 - -Meteor must be version 1.6.1 - -Cordova Android must be version 6.3.0 -Cordova IOS must be version 4.5.0 - -Meteor release 1.6.1 https://docs.meteor.com/changelog.html#changes-10 -"The cordova-lib package has been updated to version 7.1.0, cordova-android has been updated to version 6.4.0 (plus one additional commit), and cordova-ios has been updated to version 4.5.4" - -To verify the correct installation ADD phonegap-plugin-push@2.1.2 to your cordova plugins file. - -After your app builds, Make the following changes to your build.gradle file. The simpliest solution to modify this file is in android studio. - -The correct gradle file to modify has this line at the begining of the file: - -apply plugin: 'com.android.application' - -Add this two your dependencies: - -```js -classpath 'com.google.gms:google-services:4.1.0' // I added both of these -classpath 'com.google.firebase:firebase-core:11.0.1' // I added both of these -``` -At the end of your build.gradle file add: - -```js -apply plugin: 'com.google.gms.google-services' -``` -In case your run into errors with conflicting google libraries add: - -```js -configurations.all { - resolutionStrategy { - force 'com.android.support:support-v4:27.1.0' - } -} - -configurations { - all*.exclude group: 'com.android.support', module: 'support-v13' -} -``` -Other errors refer to: - -https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/INSTALLATION.md#co-existing-with-plugins-that-use-firebase - - -Changes for the API: -On the client make sure you add a android channel: - -```js -PushNotification.createChannel( - () => { - console.log('createChannel'); - }, - () => { - console.log('error'); - }, - { - id: Meteor.userId(), //Use any Id you prefer, but the same Id for this channel must be sent from the server, - description: 'Android Channel', //And any description your prefer - importance: 3, - vibration: true - } -); -``` - -Server changes: -Add the android_channel_id so the Push message like below: - -```js -Push.send({ - from: 'test', - title: 'test', - text: 'hello', - android_channel_id:this.userId, //The android channel should match the id on the client - query: { - userId: this.userId - }, - gcm: { - style: 'inbox', - summaryText: 'There are %n% notifications' - }, -}); -``` - ## Install +Meteor version should be ≥ 1.8.1 + +For lower versions of meteor please follow the **_Four changes you need to do in your project for meteor < 1.8.1_** section [here](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/INSTALLATION.md#installation-requirements). ```bash $ meteor add raix:push - $ meteor add cordova:cordova-plugin-device@1.1.5 - $ meteor add cordova:phonegap-plugin-push@1.5.2 - # Note: you probably want to adjust the version numbers to the latest versions of the packages + $ meteor add cordova:cordova-plugin-device@1.1.6 + $ meteor add cordova:phonegap-plugin-push@2.2.3 ``` ## Getting started @@ -131,10 +47,9 @@ Read the [raix:push Newbie Manual](https://github.com/raix/push/wiki/raix:push-N Or check out the [DEMO](https://github.com/elvismercado/meteor-raix-push-demo) by [@elvismercado](https://github.com/elvismercado) (This example uses the deprecated config.push.json) -Example code for [sound](https://github.com/raix/push/issues/9#issuecomment-216068188) *(todo: add in docs)* +For implementation of Notification Channels, check out the **Raix:Push - Support for Android Channels** by [Shivang Kar](https://medium.com/fasal-engineering/raix-push-support-for-android-channels-f3060b1bb7db) -Note: -Version 3 uses the cordova npm plugin [phonegap-plugin-push](https://github.com/phonegap/phonegap-plugin-push#pushnotificationinitoptions) +Example code for [sound](https://github.com/raix/push/issues/9#issuecomment-216068188) *(todo: add in docs)* Note: Some of the documentation is outdated, please file an issue or create a pull request - same if you find a bug or want to add tests From 1b1a0543cb9d5196d541614845018906e6ddc9e5 Mon Sep 17 00:00:00 2001 From: MrSpark2591 Date: Wed, 29 Apr 2020 17:25:53 +0530 Subject: [PATCH 03/14] fix(version bumping): changes according to node apn and Gcm pacakge --- lib/client/browser.js | 62 +- lib/client/client.js | 7 +- lib/client/cordova.js | 4 +- lib/common/notifications.js | 21 +- lib/server/push.api.js | 1233 +++++------ lib/server/server.js | 12 +- package-lock.json | 3741 +++++++++++++++++++--------------- package.js | 18 +- package.json | 12 +- plugin/push.configuration.js | 17 +- 10 files changed, 2787 insertions(+), 2340 deletions(-) diff --git a/lib/client/browser.js b/lib/client/browser.js index 31979f9..f9dd0b8 100644 --- a/lib/client/browser.js +++ b/lib/client/browser.js @@ -25,7 +25,7 @@ var onNotification = function(notification) { } }; -Push.setBadge = function(/* count */) { +Push.setBadge = function( /* count */ ) { // XXX: Not implemented }; @@ -34,7 +34,7 @@ var isConfigured = false; Push.Configure = function(options) { var self = this; - options = options || {}; + options = options ||  {}; // check(options, { // gcm: Match.Optional(Match.ObjectIncluding({ @@ -81,14 +81,14 @@ Push.Configure = function(options) { var _parsePayload = function(value) { // Android actually parses payload into an object - this is not the case with // iOS (here is it just a string) - if (value !== ''+value) { + if (value !== '' + value) { value = JSON.stringify(value); } // Run the string through ejson try { return EJSON.parse(value); - } catch(err) { + } catch (err) { return { error: err }; } }; @@ -199,7 +199,7 @@ Push.Configure = function(options) { }); options.iframe.addEventListener('pushError', function(evt) { - Push.emit('error', { type: 'cordova.browser', error: evt.error || evt }); + Push.emit('error', { type: 'cordova.browser', error: evt.error ||  evt }); }); }); @@ -234,27 +234,25 @@ Push.Configure = function(options) { checkRemotePermission(permissionData); }); - var checkRemotePermission = function (permissionData) { - if (permissionData.permission === 'default') { - // This is a new web service URL and its validity is unknown. - window.safari.pushNotification.requestPermission( - options.apn.webServiceUrl, // The web service URL. - options.apn.websitePushId, // The Website Push ID. - {}, // Data that you choose to send to your server to help you identify the user. - checkRemotePermission // The callback function. - ); - } - else if (permissionData.permission === 'denied') { - // alert('denied'); - // The user said no. - self.emit('error', { type: 'apn.browser', error: 'Access denied' }); - } - else if (permissionData.permission === 'granted') { - // alert('granted'); - // The web service URL is a valid push provider, and the user said yes. - // permissionData.deviceToken is now available to use. - self.emitState('token', { apn: permissionData.deviceToken }); - } + var checkRemotePermission = function(permissionData) { + if (permissionData.permission === 'default') { + // This is a new web service URL and its validity is unknown. + window.safari.pushNotification.requestPermission( + options.apn.webServiceUrl, // The web service URL. + options.apn.websitePushId, // The Website Push ID. + {}, // Data that you choose to send to your server to help you identify the user. + checkRemotePermission // The callback function. + ); + } else if (permissionData.permission === 'denied') { + // alert('denied'); + // The user said no. + self.emit('error', { type: 'apn.browser', error: 'Access denied' }); + } else if (permissionData.permission === 'granted') { + // alert('granted'); + // The web service URL is a valid push provider, and the user said yes. + // permissionData.deviceToken is now available to use. + self.emitState('token', { apn: permissionData.deviceToken }); + } }; } @@ -298,11 +296,11 @@ Push.Configure = function(options) { // Once we've registered, the AppServer can send version pings to the EndPoint. // This will trigger a 'push' message to be sent to this handler. navigator.mozSetMessageHandler('push', function(message) { - if (message.pushEndpoint === pushEndpoint) { - // Did we launch or were we already running? - self.emit('startup', message); - } - }); + if (message.pushEndpoint === pushEndpoint) { + // Did we launch or were we already running? + self.emit('startup', message); + } + }); // // to unregister, you simply call.. // AppFramework.addEventListener('user-logout', function() { @@ -312,7 +310,7 @@ Push.Configure = function(options) { // error recovery mechanism // will be called very rarely, but application // should register again when it is called - navigator.mozSetMessageHandler('register', function(/* e */) { + navigator.mozSetMessageHandler('register', function( /* e */ ) { setupAppRegistrations(); }); diff --git a/lib/client/client.js b/lib/client/client.js index cd2c468..561e84c 100644 --- a/lib/client/client.js +++ b/lib/client/client.js @@ -10,7 +10,6 @@ var addUserId = !!Package['accounts-base']; 2. If not then create an app id 3. Refresh the apn/gcm push token for this app */ - var loadLocalstorage = function() { var data = {}; @@ -18,7 +17,7 @@ var loadLocalstorage = function() { // Get the stored object from local storage data = JSON.parse(localStorage.getItem(localStorageKey)); - } catch(err) { + } catch (err) { // XXX: Error using the local storage } @@ -36,7 +35,7 @@ var saveLocalstorage = function(data) { try { // Try setting the id localStorage.setItem(localStorageKey, JSON.stringify(data)); - } catch(err) { + } catch (err) { // XXX: storage error } }; @@ -153,7 +152,7 @@ initPushUpdates = function(appName) { console.log('Got token:', token); } // The app should be ready, lets call in - reportTokenToServer(token, appName || 'main'); + reportTokenToServer(token, appName ||  'main'); }); // Start listening for user updates if accounts package is added diff --git a/lib/client/cordova.js b/lib/client/cordova.js index ef0e293..62a01a7 100644 --- a/lib/client/cordova.js +++ b/lib/client/cordova.js @@ -86,11 +86,11 @@ class PushHandle extends EventState { // xxx: check ejson support on "additionalData" json object if (data.additionalData.ejson) { - if (data.additionalData.ejson === ''+data.additionalData.ejson) { + if (data.additionalData.ejson === '' + data.additionalData.ejson) { try { data.payload = EJSON.parse(data.additionalData.ejson); this.log('Push.Parsed.EJSON.Payload:', data.payload); - } catch(err) { + } catch (err) { this.log('Push.Parsed.EJSON.Payload.Error', err.message, data.payload); } } else { diff --git a/lib/common/notifications.js b/lib/common/notifications.js index 616060e..7e3bffe 100644 --- a/lib/common/notifications.js +++ b/lib/common/notifications.js @@ -1,4 +1,3 @@ - // This is the match pattern for tokens _matchToken = Match.OneOf({ apn: String }, { gcm: String }); @@ -70,23 +69,23 @@ Push.send = function(options) { // If current user not set see if we can set it to the logged in user // this will only run on the client if Meteor.userId is available var currentUser = Meteor.isClient && Meteor.userId && Meteor.userId() || - Meteor.isServer && (options.createdBy || '') || null; + Meteor.isServer && (options.createdBy || '') || null; // Rig the notification object - var notification = _.extend({ + var notification = _.extend({ createdAt: new Date(), createdBy: currentUser }, _.pick(options, 'from', 'title', 'text')); - // Add extra - _.extend(notification, _.pick(options, 'payload', 'badge', 'sound', 'notId', 'delayUntil', 'android_channel_id')); + // Add extra + _.extend(notification, _.pick(options, 'payload', 'badge', 'sound', 'notId', 'delayUntil', 'android_channel_id')); if (Match.test(options.apn, Object)) { notification.apn = _.pick(options.apn, 'from', 'title', 'text', 'badge', 'sound', 'notId', 'category'); } if (Match.test(options.gcm, Object)) { - notification.gcm = _.pick(options.gcm, 'image', 'style', 'summaryText', 'picture', 'from', 'title', 'text', 'badge', 'sound', 'notId','actions', 'android_channel_id'); + notification.gcm = _.pick(options.gcm, 'image', 'style', 'summaryText', 'picture', 'from', 'title', 'text', 'badge', 'sound', 'notId', 'actions', 'android_channel_id'); } // Set one token selector, this can be token, array of tokens or query @@ -104,10 +103,10 @@ Push.send = function(options) { if (typeof options.contentAvailable !== 'undefined') { notification.contentAvailable = options.contentAvailable; } - - if (typeof options.forceStart !== 'undefined') { - notification.forceStart = options.forceStart; - } + + if (typeof options.forceStart !== 'undefined') { + notification.forceStart = options.forceStart; + } notification.sent = false; notification.sending = 0; @@ -143,4 +142,4 @@ Push.deny = function(rules) { } }); } -}; \ No newline at end of file +}; diff --git a/lib/server/push.api.js b/lib/server/push.api.js index f900199..1ad26ea 100644 --- a/lib/server/push.api.js +++ b/lib/server/push.api.js @@ -7,8 +7,8 @@ // getText / getBinary -Push.setBadge = function(/* id, count */) { - // throw new Error('Push.setBadge not implemented on the server'); +Push.setBadge = function( /* id, count */ ) { + // throw new Error('Push.setBadge not implemented on the server'); }; var isConfigured = false; @@ -25,7 +25,7 @@ var sendWorker = function(task, interval) { // xxx: add exponential backoff on error try { task(); - } catch(error) { + } catch (error) { if (typeof Push.Log === 'function') { Push.Log('Push: Error while sending:', error.message); } @@ -36,714 +36,741 @@ var sendWorker = function(task, interval) { }, interval); }; +var checkConfig = function(config) { // jshint ignore:line + check(config, { + apn: Match.Optional({ + passphrase: String, + cert: String, + key: String, + topic: String, + // Web site config is optional + webServiceUrl: Match.Optional(String), + websitePushId: Match.Optional(String), + // Production is optional, defaults to development + production: Match.Optional(Boolean), + gateway: Match.Optional(String), + }), + gcm: Match.Optional({ + apiKey: String, + projectNumber: Match.OneOf(String, Number) + }), + // Allow optional production + production: Match.Optional(Boolean), + // Allow optional sound, badge, alert, vibrate + sound: Match.Optional(Boolean), + badge: Match.Optional(Boolean), + alert: Match.Optional(Boolean), + vibrate: Match.Optional(Boolean), + // Support the old iframe Meteor cordova integration + iframe: Match.Optional(String), + // Controls the sending interval + sendInterval: Match.Optional(Number), + // Controls the sending batch size per interval + sendBatchSize: Match.Optional(Number), + // Allow optional keeping notifications in collection + keepNotifications: Match.Optional(Boolean) + }); + + // Make sure at least one service is configured? + if (!config.apn && !config.gcm) { + console.warn('Push configuration: No push services configured'); + } + + // If apn webServiceUrl or websitePushId then make sure both are set + if (config.apn && (config.apn.webServiceUrl || config.apn.websitePushId) && !(config.apn.webServiceUrl && config.apn.websitePushId)) { // jshint ignore:line + throw new Error('Push configuration: Both "apn.webServiceUrl" and "apn.websitePushId" must be set'); + } + if (config.apn && !config.apn.topic) { + throw new Error('Topic must be set to yor app bundle name'); + } + if (config.apn && (!config.apn.cert || !config.apn.key)) { + throw new Error('Key or certificate is missing form apn option'); + } +}; + Push.Configure = function(options) { - var self = this; - options = _.extend({ - sendTimeout: 60000, // Timeout period for notification send - }, options); - // https://npmjs.org/package/apn - - // After requesting the certificate from Apple, export your private key as - // a .p12 file anddownload the .cer file from the iOS Provisioning Portal. - - // gateway.push.apple.com, port 2195 - // gateway.sandbox.push.apple.com, port 2195 - - // Now, in the directory containing cert.cer and key.p12 execute the - // following commands to generate your .pem files: - // $ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem - // $ openssl pkcs12 -in key.p12 -out key.pem -nodes - - // Block multiple calls - if (isConfigured) { - throw new Error('Push.Configure should not be called more than once!'); - } + checkConfig(options); + var self = this; + options = _.extend({ + sendTimeout: 60000, // Timeout period for notification send + }, options); + // https://npmjs.org/package/apn + + // After requesting the certificate from Apple, export your private key as + // a .p12 file anddownload the .cer file from the iOS Provisioning Portal. + + // gateway.push.apple.com, port 2195 + // gateway.sandbox.push.apple.com, port 2195 + + // Now, in the directory containing cert.cer and key.p12 execute the + // following commands to generate your .pem files: + // $ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem + // $ openssl pkcs12 -in key.p12 -out key.pem -nodes + + // Block multiple calls + if (isConfigured) { + throw new Error('Push.Configure should not be called more than once!'); + } - isConfigured = true; + isConfigured = true; - // Add debug info - if (Push.debug) { - console.log('Push.Configure', options); - } + // Add debug info + if (Push.debug) { + console.log('Push.Configure', options); + } - // This function is called when a token is replaced on a device - normally - // this should not happen, but if it does we should take action on it - _replaceToken = function(currentToken, newToken) { - // console.log('Replace token: ' + currentToken + ' -- ' + newToken); - // If the server gets a token event its passing in the current token and - // the new value - if new value is undefined this empty the token - self.emitState('token', currentToken, newToken); - }; + // This function is called when a token is replaced on a device - normally + // this should not happen, but if it does we should take action on it + _replaceToken = function(currentToken, newToken) { + // console.log('Replace token: ' + currentToken + ' -- ' + newToken); + // If the server gets a token event its passing in the current token and + // the new value - if new value is undefined this empty the token + self.emitState('token', currentToken, newToken); + }; - // Rig the removeToken callback - _removeToken = function(token) { - // console.log('Remove token: ' + token); - // Invalidate the token - self.emitState('token', token, null); - }; + // Rig the removeToken callback + _removeToken = function(token) { + // console.log('Remove token: ' + token); + // Invalidate the token + self.emitState('token', token, null); + }; - if (options.apn) { - if (Push.debug) { - console.log('Push: APN configured'); - } + if (options.apn) { + if (Push.debug) { + console.log('Push: APN configured'); + } - // Allow production to be a general option for push notifications - if (options.production === Boolean(options.production)) { - options.apn.production = options.production; - } + // Allow production to be a general option for push notifications + if (options.production === Boolean(options.production)) { + options.apn.production = options.production; + } - // Give the user warnings about development settings - if (options.apn.development) { - // This flag is normally set by the configuration file - console.warn('WARNING: Push APN is using development key and certificate'); + // Give the user warnings about development settings + if (options.apn.development) { + // This flag is normally set by the configuration file + console.warn('WARNING: Push APN is using development key and certificate'); + } else { + // We check the apn gateway i the options, we could risk shipping + // server into production while using the production configuration. + // On the other hand we could be in development but using the production + // configuration. And finally we could have configured an unknown apn + // gateway (this could change in the future - but a warning about typos + // can save hours of debugging) + // + // Warn about gateway configurations - it's more a guide + if (options.apn.gateway) { + + if (options.apn.gateway === 'gateway.sandbox.push.apple.com') { + // Using the development sandbox + console.warn('WARNING: Push APN is in development mode'); + } else if (options.apn.gateway === 'gateway.push.apple.com') { + // In production - but warn if we are running on localhost + if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { + console.warn('WARNING: Push APN is configured to production mode - but server is running' + + ' from localhost'); + } } else { - // We check the apn gateway i the options, we could risk shipping - // server into production while using the production configuration. - // On the other hand we could be in development but using the production - // configuration. And finally we could have configured an unknown apn - // gateway (this could change in the future - but a warning about typos - // can save hours of debugging) - // - // Warn about gateway configurations - it's more a guide - if (options.apn.gateway) { - - if (options.apn.gateway === 'gateway.sandbox.push.apple.com') { - // Using the development sandbox - console.warn('WARNING: Push APN is in development mode'); - } else if (options.apn.gateway === 'gateway.push.apple.com') { - // In production - but warn if we are running on localhost - if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { - console.warn('WARNING: Push APN is configured to production mode - but server is running' + - ' from localhost'); - } - } else { - // Warn about gateways we dont know about - console.warn('WARNING: Push APN unkown gateway "' + options.apn.gateway + '"'); - } + // Warn about gateways we dont know about + console.warn('WARNING: Push APN unkown gateway "' + options.apn.gateway + '"'); + } - } else { - if (options.apn.production) { - if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { - console.warn('WARNING: Push APN is configured to production mode - but server is running' + - ' from localhost'); - } - } else { - console.warn('WARNING: Push APN is in development mode'); - } + } else { + if (options.apn.production) { + if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { + console.warn('WARNING: Push APN is configured to production mode - but server is running' + + ' from localhost'); } - + } else { + console.warn('WARNING: Push APN is in development mode'); } + } - // Check certificate data - if (!options.apn.certData || !options.apn.certData.length) { - console.error('ERROR: Push server could not find certData'); - } + } - // Check key data - if (!options.apn.keyData || !options.apn.keyData.length) { - console.error('ERROR: Push server could not find keyData'); - } + // Check certificate data + if (!options.apn.cert || !options.apn.cert.length) { + console.error('ERROR: Push server could not find certData'); + } - // Rig apn connection - var apn = Npm.require('apn'); - var apnConnection = new apn.Connection( options.apn ); + // Check key data + if (!options.apn.key || !options.apn.key.length) { + console.error('ERROR: Push server could not find keyData'); + } - // Listen to transmission errors - should handle the same way as feedback. - apnConnection.on('transmissionError', Meteor.bindEnvironment(function (errCode, notification, recipient) { - if (Push.debug) { - console.log('Got error code %d for token %s', errCode, notification.token); - } - if ([2, 5, 8].indexOf(errCode) >= 0) { + // Rig apn connection + var apn = Npm.require('apn'); + var apnProvider = new apn.Provider(options.apn); + // // Listen to transmission errors - should handle the same way as feedback. + // apnConnection.on('transmissionError', Meteor.bindEnvironment(function (errCode, notification, recipient) { + // if (Push.debug) { + // console.log('Got error code %d for token %s', errCode, notification.token); + // } + // if ([2, 5, 8].indexOf(errCode) >= 0) { + + + // // Invalid token errors... + // _removeToken({ + // apn: notification.token + // }); + // } + // })); + // XXX: should we do a test of the connection? It would be nice to know + // That the server/certificates/network are correct configured + + // apnConnection.connect().then(function() { + // console.info('CHECK: Push APN connection OK'); + // }, function(err) { + // console.warn('CHECK: Push APN connection FAILURE'); + // }); + // Note: the above code spoils the connection - investigate how to + // shutdown/close it. + + self.sendAPN = function(userToken, notification) { + if (Match.test(notification.apn, Object)) { + notification = _.extend({}, notification, notification.apn); + } + // console.log('sendAPN', notification.from, userToken, notification.title, notification.text, + // notification.badge, notification.priority); + var priority = (notification.priority || notification.priority === 0) ? notification.priority : 10; - // Invalid token errors... - _removeToken({ - apn: notification.token - }); - } - })); - // XXX: should we do a test of the connection? It would be nice to know - // That the server/certificates/network are correct configured - - // apnConnection.connect().then(function() { - // console.info('CHECK: Push APN connection OK'); - // }, function(err) { - // console.warn('CHECK: Push APN connection FAILURE'); - // }); - // Note: the above code spoils the connection - investigate how to - // shutdown/close it. - - self.sendAPN = function(userToken, notification) { - if (Match.test(notification.apn, Object)) { - notification = _.extend({}, notification, notification.apn); - } - // console.log('sendAPN', notification.from, userToken, notification.title, notification.text, - // notification.badge, notification.priority); - var priority = (notification.priority || notification.priority === 0)? notification.priority : 10; + var note = new apn.Notification(); - var myDevice = new apn.Device(userToken); + note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now. + if (typeof notification.badge !== 'undefined') { + note.badge = notification.badge; + } + if (typeof notification.sound !== 'undefined') { + note.sound = notification.sound; + } + if (typeof notification.contentAvailable !== 'undefined') { + note.contentAvailable = notification.contentAvailable; + } - var note = new apn.Notification(); + // adds category support for iOS8 custom actions as described here: + // https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/ + // RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW36 + if (typeof notification.category !== 'undefined') { + note.category = notification.category; + } - note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now. - if (typeof notification.badge !== 'undefined') { - note.badge = notification.badge; - } - if (typeof notification.sound !== 'undefined') { - note.sound = notification.sound; - } - //console.log(notification.contentAvailable); - //console.log("lala2"); - //console.log(notification); - if (typeof notification.contentAvailable !== 'undefined') { - //console.log("lala"); - note.setContentAvailable(notification.contentAvailable); - //console.log(note); - } + note.alert = { + body: notification.text, + }; - // adds category support for iOS8 custom actions as described here: - // https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/ - // RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW36 - if (typeof notification.category !== 'undefined') { - note.category = notification.category; - } + if (typeof notification.title !== 'undefined') { + note.aps.alert.title = notification.title; + } + note.topic = notification.topic; + // Allow the user to set payload data + note.payload = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; - note.alert = { - body: notification.text - }; + note.payload.messageFrom = notification.from; + note.priority = priority; - if (typeof notification.title !== 'undefined') { - note.alert.title = notification.title; - } - // Allow the user to set payload data - note.payload = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; + // Store the token on the note so we can reference it if there was an error + note.token = userToken; + if (Push.debug) { + console.log('notification obejct for apn' + note); + } + // console.log('I:Send message to: ' + userToken + ' count=' + count); + apnProvider.send(note, userToken).then((result) => { + if (result.failed && result.failed.length > 0) { + if (result.failed[0].response.result === 'BadDeviceToken') { + _removeToken({ + apn: userToken + }); + } else { + console.error(JSON.stringify(result, undefined, 2)); + } + } + }); + }; - note.payload.messageFrom = notification.from; - note.priority = priority; + } // EO ios notification + if (options.gcm && options.gcm.apiKey) { + if (Push.debug) { + console.log('GCM configured'); + } + //self.sendGCM = function(options.from, userTokens, options.title, options.text, options.badge, options.priority) { + self.sendGCM = function(userTokens, notification) { + if (Match.test(notification.gcm, Object)) { + notification = _.extend({}, notification, notification.gcm); + } - // Store the token on the note so we can reference it if there was an error - note.token = userToken; + // Make sure userTokens are an array of strings + if (userTokens === '' + userTokens) { + userTokens = [userTokens]; + } - // console.log('I:Send message to: ' + userToken + ' count=' + count); + // Check if any tokens in there to send + if (!userTokens.length) { + if (Push.debug) { + console.log('sendGCM no push tokens found'); + } + return; + } - apnConnection.pushNotification(note, myDevice); + if (Push.debug) { + console.log('sendGCM', userTokens, notification); + } - }; + var gcm = Npm.require('node-gcm'); + var Fiber = Npm.require('fibers'); + // Allow user to set payload + var data = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; - var initFeedback = function () { - var apn = Npm.require('apn'); - // console.log('Init feedback'); - var feedbackOptions = { - 'batchFeedback': true, + data.title = notification.title; + data.message = notification.text; - // Time in SECONDS - 'interval': 5, - production: !options.apn.development, - cert: options.certData, - key: options.keyData, - passphrase: options.passphrase - }; + // Set image + if (typeof notification.image !== 'undefined') { + data.image = notification.image; + } - var feedback = new apn.Feedback(feedbackOptions); - feedback.on('feedback', function (devices) { - devices.forEach(function (item) { - // Do something with item.device and item.time; - // console.log('A:PUSH FEEDBACK ' + item.device + ' - ' + item.time); - // The app is most likely removed from the device, we should - // remove the token - _removeToken({ - apn: item.device - }); - }); - }); + if (typeof notification.android_channel_id !== 'undefined') { + data.android_channel_id = notification.android_channel_id; + } else if (Push.debug) { + console.warn(`For devices running Android 8.0 or later you are required to provide an android_channel_id. See https://github.com/raix/push/issues/341 for more info`); + } - feedback.start(); - }; + // Set extra details + if (typeof notification.badge !== 'undefined') { + data.msgcnt = notification.badge; + } + if (typeof notification.sound !== 'undefined') { + data.soundname = notification.sound; + } + if (typeof notification.notId !== 'undefined') { + data.notId = notification.notId; + } + if (typeof notification.style !== 'undefined') { + data.style = notification.style; + } + if (typeof notification.summaryText !== 'undefined') { + data.summaryText = notification.summaryText; + } + if (typeof notification.picture !== 'undefined') { + data.picture = notification.picture; + } - // Init feedback from apn server - // This will help keep the appCollection up-to-date, it will help update - // and remove token from appCollection. - initFeedback(); + //Action Buttons + if (typeof notification.actions !== 'undefined') { + data.actions = notification.actions; + } - } // EO ios notification + //Force Start + if (typeof notification.forceStart !== 'undefined') { + data['force-start'] = notification.forceStart; + } + if (typeof notification.contentAvailable !== 'undefined') { + data['content-available'] = notification.contentAvailable; + } + + //var message = new gcm.Message(); + var message = new gcm.Message({ + collapseKey: notification.from, + // delayWhileIdle: true, + // timeToLive: 4, + // restricted_package_name: 'dk.gi2.app' + data: data + }); - if (options.gcm && options.gcm.apiKey) { + if (Push.debug) { + console.log('Create GCM Sender using "' + options.gcm.apiKey + '"'); + } + var sender = new gcm.Sender(options.gcm.apiKey); + + _.each(userTokens, function(value /*, key */ ) { if (Push.debug) { - console.log('GCM configured'); + console.log('A:Send message to: ' + value); } - //self.sendGCM = function(options.from, userTokens, options.title, options.text, options.badge, options.priority) { - self.sendGCM = function(userTokens, notification) { - if (Match.test(notification.gcm, Object)) { - notification = _.extend({}, notification, notification.gcm); - } + }); - // Make sure userTokens are an array of strings - if (userTokens === ''+userTokens) { - userTokens = [userTokens]; - } + /*message.addData('title', title); + message.addData('message', text); + message.addData('msgcnt', '1'); + message.collapseKey = 'sitDrift'; + message.delayWhileIdle = true; + message.timeToLive = 3;*/ - // Check if any tokens in there to send - if (!userTokens.length) { - if (Push.debug) { - console.log('sendGCM no push tokens found'); - } - return; - } + // /** + // * Parameters: message-literal, userTokens-array, No. of retries, callback-function + // */ + + var userToken = (userTokens.length === 1) ? userTokens[0] : null; + sender.send(message, userTokens, 5, function(err, result) { + if (err) { + if (Push.debug) { + console.log('ANDROID ERROR: result of sender: ' + result); + } + } else { + if (result === null) { if (Push.debug) { - console.log('sendGCM', userTokens, notification); + console.log('ANDROID: Result of sender is null'); } + return; + } + if (Push.debug) { + console.log('ANDROID: Result of sender: ' + JSON.stringify(result)); + } + if (result.canonical_ids === 1 && userToken) { // jshint ignore:line - var gcm = Npm.require('node-gcm'); - var Fiber = Npm.require('fibers'); + // This is an old device, token is replaced + Fiber(function(self) { + // Run in fiber + try { + self.callback(self.oldToken, self.newToken); + } catch (err) { - // Allow user to set payload - var data = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; + } - data.title = notification.title; - data.message = notification.text; + }).run({ + oldToken: { gcm: userToken }, + newToken: { gcm: result.results[0].registration_id }, // jshint ignore:line + callback: _replaceToken + }); + //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); - // Set image - if(typeof notification.image !== 'undefined') { - data.image = notification.image; - } - - if(typeof notification.android_channel_id !== 'undefined') { - data.android_channel_id = notification.android_channel_id; - } - else if(Push.debug) { - console.warn(`For devices running Android 8.0 or later you are required to provide an android_channel_id. See https://github.com/raix/push/issues/341 for more info`); - } + } + // We cant send to that token - might not be registred + // ask the user to remove the token from the list + if (result.failure !== 0 && userToken) { - // Set extra details - if (typeof notification.badge !== 'undefined') { - data.msgcnt = notification.badge; - } - if (typeof notification.sound !== 'undefined') { - data.soundname = notification.sound; - } - if (typeof notification.notId !== 'undefined') { - data.notId = notification.notId; - } - if(typeof notification.style !== 'undefined') { - data.style = notification.style; - } - if(typeof notification.summaryText !== 'undefined') { - data.summaryText = notification.summaryText; - } - if(typeof notification.picture !== 'undefined') { - data.picture = notification.picture; - } - - //Action Buttons - if(typeof notification.actions !== 'undefined') { - data.actions = notification.actions; - } - - //Force Start - if(typeof notification.forceStart !== 'undefined') { - data['force-start'] = notification.forceStart; - } - if(typeof notification.contentAvailable !== 'undefined') { - data['content-available'] = notification.contentAvailable; - } - - //var message = new gcm.Message(); - var message = new gcm.Message({ - collapseKey: notification.from, - // delayWhileIdle: true, - // timeToLive: 4, - // restricted_package_name: 'dk.gi2.app' - data: data - }); + // This is an old device, token is replaced + Fiber(function(self) { + // Run in fiber + try { + self.callback(self.token); + } catch (err) { - if (Push.debug) { - console.log('Create GCM Sender using "' + options.gcm.apiKey + '"'); - } - var sender = new gcm.Sender(options.gcm.apiKey); + } - _.each(userTokens, function(value /*, key */) { - if (Push.debug) { - console.log('A:Send message to: ' + value); - } + }).run({ + token: { gcm: userToken }, + callback: _removeToken }); + //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); - /*message.addData('title', title); - message.addData('message', text); - message.addData('msgcnt', '1'); - message.collapseKey = 'sitDrift'; - message.delayWhileIdle = true; - message.timeToLive = 3;*/ - - // /** - // * Parameters: message-literal, userTokens-array, No. of retries, callback-function - // */ - - var userToken = (userTokens.length === 1)?userTokens[0]:null; - - sender.send(message, userTokens, 5, function (err, result) { - if (err) { - if (Push.debug) { - console.log('ANDROID ERROR: result of sender: ' + result); - } - } else { - if (result === null) { - if (Push.debug) { - console.log('ANDROID: Result of sender is null'); - } - return; - } - if (Push.debug) { - console.log('ANDROID: Result of sender: ' + JSON.stringify(result)); - } - if (result.canonical_ids === 1 && userToken) { // jshint ignore:line - - // This is an old device, token is replaced - Fiber(function(self) { - // Run in fiber - try { - self.callback(self.oldToken, self.newToken); - } catch(err) { - - } - - }).run({ - oldToken: { gcm: userToken }, - newToken: { gcm: result.results[0].registration_id }, // jshint ignore:line - callback: _replaceToken - }); - //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); - - } - // We cant send to that token - might not be registred - // ask the user to remove the token from the list - if (result.failure !== 0 && userToken) { - - // This is an old device, token is replaced - Fiber(function(self) { - // Run in fiber - try { - self.callback(self.token); - } catch(err) { - - } - - }).run({ - token: { gcm: userToken }, - callback: _removeToken - }); - //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); - - } - - } - }); - // /** Use the following line if you want to send the message without retries - // sender.sendNoRetry(message, userTokens, function (result) { - // console.log('ANDROID: ' + JSON.stringify(result)); - // }); - // **/ - }; // EO sendAndroid + } - } // EO Android + } + }); + // /** Use the following line if you want to send the message without retries + // sender.sendNoRetry(message, userTokens, function (result) { + // console.log('ANDROID: ' + JSON.stringify(result)); + // }); + // **/ + }; // EO sendAndroid - // Universal send function - var _querySend = function(query, options) { + } // EO Android - var countApn = []; - var countGcm = []; + // Universal send function + var _querySend = function(query, options) { - Push.appCollection.find(query).forEach(function(app) { + var countApn = []; + var countGcm = []; - if (Push.debug) { - console.log('send to token', app.token); - } + Push.appCollection.find(query).forEach(function(app) { - if (app.token.apn) { - countApn.push(app._id); - // Send to APN - if (self.sendAPN) { - self.sendAPN(app.token.apn, options); - } - - } else if (app.token.gcm) { - countGcm.push(app._id); - - // Send to GCM - // We do support multiple here - so we should construct an array - // and send it bulk - Investigate limit count of id's - if (self.sendGCM) { - self.sendGCM(app.token.gcm, options); - } - - } else { - throw new Error('Push.send got a faulty query'); - } + if (Push.debug) { + console.log('send to token', app.token); + } - }); + if (app.token.apn) { + countApn.push(app._id); + // Send to APN + if (self.sendAPN) { + self.sendAPN(app.token.apn, options); + } - if (Push.debug) { + } else if (app.token.gcm) { + countGcm.push(app._id); - console.log('Push: Sent message "' + options.title + '" to ' + countApn.length + ' ios apps ' + - countGcm.length + ' android apps'); + // Send to GCM + // We do support multiple here - so we should construct an array + // and send it bulk - Investigate limit count of id's + if (self.sendGCM) { + self.sendGCM(app.token.gcm, options); + } - // Add some verbosity about the send result, making sure the developer - // understands what just happened. - if (!countApn.length && !countGcm.length) { - if (Push.appCollection.find().count() === 0) { - console.log('Push, GUIDE: The "Push.appCollection" is empty -' + - ' No clients have registred on the server yet...'); - } - } else if (!countApn.length) { - if (Push.appCollection.find({ 'token.apn': { $exists: true } }).count() === 0) { - console.log('Push, GUIDE: The "Push.appCollection" - No APN clients have registred on the server yet...'); - } - } else if (!countGcm.length) { - if (Push.appCollection.find({ 'token.gcm': { $exists: true } }).count() === 0) { - console.log('Push, GUIDE: The "Push.appCollection" - No GCM clients have registred on the server yet...'); - } - } + } else { + throw new Error('Push.send got a faulty query'); + } + + }); + + if (Push.debug) { + console.log('Push: Sent message "' + options.title + '" to ' + countApn.length + ' ios apps ' + + countGcm.length + ' android apps'); + + // Add some verbosity about the send result, making sure the developer + // understands what just happened. + if (!countApn.length && !countGcm.length) { + if (Push.appCollection.find().count() === 0) { + console.log('Push, GUIDE: The "Push.appCollection" is empty -' + + ' No clients have registred on the server yet...'); + } + } else if (!countApn.length) { + if (Push.appCollection.find({ 'token.apn': { $exists: true } }).count() === 0) { + console.log('Push, GUIDE: The "Push.appCollection" - No APN clients have registred on the server yet...'); + } + } else if (!countGcm.length) { + if (Push.appCollection.find({ 'token.gcm': { $exists: true } }).count() === 0) { + console.log('Push, GUIDE: The "Push.appCollection" - No GCM clients have registred on the server yet...'); } + } + + } - return { - apn: countApn, - gcm: countGcm - }; + return { + apn: countApn, + gcm: countGcm }; + }; - self.serverSend = function(options) { - options = options || { badge: 0 }; - var query; + self.serverSend = function(options) { + options = options || { badge: 0 }; + var query; - // Check basic options - if (options.from !== ''+options.from) { - throw new Error('Push.send: option "from" not a string'); - } + // Check basic options + if (options.from !== '' + options.from) { + throw new Error('Push.send: option "from" not a string'); + } - if (options.title !== ''+options.title) { - throw new Error('Push.send: option "title" not a string'); - } + if (options.title !== '' + options.title) { + throw new Error('Push.send: option "title" not a string'); + } - if (options.text !== ''+options.text) { - throw new Error('Push.send: option "text" not a string'); - } + if (options.text !== '' + options.text) { + throw new Error('Push.send: option "text" not a string'); + } - if (options.token || options.tokens) { + if (options.token || options.tokens) { - // The user set one token or array of tokens - var tokenList = (options.token)? [options.token] : options.tokens; + // The user set one token or array of tokens + var tokenList = (options.token) ? [options.token] : options.tokens; - if (Push.debug) { - console.log('Push: Send message "' + options.title + '" via token(s)', tokenList); - } + if (Push.debug) { + console.log('Push: Send message "' + options.title + '" via token(s)', tokenList); + } - query = { - $or: [ - // XXX: Test this query: can we hand in a list of push tokens? - { $and: [ - { token: { $in: tokenList } }, - // And is not disabled - { enabled: { $ne: false }} + query = { + $or: [ + // XXX: Test this query: can we hand in a list of push tokens? + { + $and: [ + { token: { $in: tokenList } }, + // And is not disabled + { enabled: { $ne: false } } + ] + }, + // XXX: Test this query: does this work on app id? + { + $and: [ + { _id: { $in: tokenList } }, // one of the app ids + { + $or: [ + { 'token.apn': { $exists: true } }, // got apn token + { 'token.gcm': { $exists: true } } // got gcm token ] }, - // XXX: Test this query: does this work on app id? - { $and: [ - { _id: { $in: tokenList } }, // one of the app ids - { $or: [ - { 'token.apn': { $exists: true } }, // got apn token - { 'token.gcm': { $exists: true } } // got gcm token - ]}, - // And is not disabled - { enabled: { $ne: false }} - ] - } - ] - }; - - } else if (options.query) { + // And is not disabled + { enabled: { $ne: false } } + ] + } + ] + }; - if (Push.debug) { - console.log('Push: Send message "' + options.title + '" via query', options.query); - } + } else if (options.query) { - query = { - $and: [ - options.query, // query object - { $or: [ - { 'token.apn': { $exists: true } }, // got apn token - { 'token.gcm': { $exists: true } } // got gcm token - ]}, - // And is not disabled - { enabled: { $ne: false }} - ] - }; + if (Push.debug) { + console.log('Push: Send message "' + options.title + '" via query', options.query); } + query = { + $and: [ + options.query, // query object + { + $or: [ + { 'token.apn': { $exists: true } }, // got apn token + { 'token.gcm': { $exists: true } } // got gcm token + ] + }, + // And is not disabled + { enabled: { $ne: false } } + ] + }; + } - if (query) { - // Convert to querySend and return status - return _querySend(query, options); + if (query) { - } else { - throw new Error('Push.send: please set option "token"/"tokens" or "query"'); - } + // Convert to querySend and return status + return _querySend(query, options); - }; + } else { + throw new Error('Push.send: please set option "token"/"tokens" or "query"'); + } + }; + + + // This interval will allow only one notification to be sent at a time, it + // will check for new notifications at every `options.sendInterval` + // (default interval is 15000 ms) + // + // It looks in notifications collection to see if theres any pending + // notifications, if so it will try to reserve the pending notification. + // If successfully reserved the send is started. + // + // If notification.query is type string, it's assumed to be a json string + // version of the query selector. Making it able to carry `$` properties in + // the mongo collection. + // + // Pr. default notifications are removed from the collection after send have + // completed. Setting `options.keepNotifications` will update and keep the + // notification eg. if needed for historical reasons. + // + // After the send have completed a "send" event will be emitted with a + // status object containing notification id and the send result object. + // + var isSendingNotification = false; + + if (options.sendInterval !== null) { + + // This will require index since we sort notifications by createdAt + Push.notifications._ensureIndex({ createdAt: 1 }); + Push.notifications._ensureIndex({ sent: 1 }); + Push.notifications._ensureIndex({ sending: 1 }); + Push.notifications._ensureIndex({ delayUntil: 1 }); + + var sendNotification = function(notification) { + // Reserve notification + var now = +new Date(); + var timeoutAt = now + options.sendTimeout; + var reserved = Push.notifications.update({ + _id: notification._id, + sent: false, // xxx: need to make sure this is set on create + sending: { $lt: now }, + }, { + $set: { + sending: timeoutAt, + } + }); - // This interval will allow only one notification to be sent at a time, it - // will check for new notifications at every `options.sendInterval` - // (default interval is 15000 ms) - // - // It looks in notifications collection to see if theres any pending - // notifications, if so it will try to reserve the pending notification. - // If successfully reserved the send is started. - // - // If notification.query is type string, it's assumed to be a json string - // version of the query selector. Making it able to carry `$` properties in - // the mongo collection. - // - // Pr. default notifications are removed from the collection after send have - // completed. Setting `options.keepNotifications` will update and keep the - // notification eg. if needed for historical reasons. - // - // After the send have completed a "send" event will be emitted with a - // status object containing notification id and the send result object. - // - var isSendingNotification = false; - - if (options.sendInterval !== null) { - - // This will require index since we sort notifications by createdAt - Push.notifications._ensureIndex({ createdAt: 1 }); - Push.notifications._ensureIndex({ sent: 1 }); - Push.notifications._ensureIndex({ sending: 1 }); - Push.notifications._ensureIndex({ delayUntil: 1 }); - - var sendNotification = function(notification) { - // Reserve notification - var now = +new Date(); - var timeoutAt = now + options.sendTimeout; - var reserved = Push.notifications.update({ - _id: notification._id, - sent: false, // xxx: need to make sure this is set on create - sending: { $lt: now }, - }, - { - $set: { - sending: timeoutAt, - } - }); + // Make sure we only handle notifications reserved by this + // instance + if (reserved) { - // Make sure we only handle notifications reserved by this - // instance - if (reserved) { - - // Check if query is set and is type String - if (notification.query && notification.query === ''+notification.query) { - try { - // The query is in string json format - we need to parse it - notification.query = JSON.parse(notification.query); - } catch(err) { - // Did the user tamper with this?? - throw new Error('Push: Error while parsing query string, Error: ' + err.message); - } + // Check if query is set and is type String + if (notification.query && notification.query === '' + notification.query) { + try { + // The query is in string json format - we need to parse it + notification.query = JSON.parse(notification.query); + } catch (err) { + // Did the user tamper with this?? + throw new Error('Push: Error while parsing query string, Error: ' + err.message); } + } - // Send the notification - var result = Push.serverSend(notification); + // Send the notification + var result = Push.serverSend(notification); - if (!options.keepNotifications) { - // Pr. Default we will remove notifications - Push.notifications.remove({ _id: notification._id }); - } else { + if (!options.keepNotifications) { + // Pr. Default we will remove notifications + Push.notifications.remove({ _id: notification._id }); + } else { - // Update the notification - Push.notifications.update({ _id: notification._id }, { - $set: { - // Mark as sent - sent: true, - // Set the sent date - sentAt: new Date(), - // Count - count: result, - // Not being sent anymore - sending: 0 - } - }); + // Update the notification + Push.notifications.update({ _id: notification._id }, { + $set: { + // Mark as sent + sent: true, + // Set the sent date + sentAt: new Date(), + // Count + count: result, + // Not being sent anymore + sending: 0 + } + }); - } + } - // Emit the send - self.emit('send', { notification: notification._id, result: result }); + // Emit the send + self.emit('send', { notification: notification._id, result: result }); - } // Else could not reserve - }; // EO sendNotification + } // Else could not reserve + }; // EO sendNotification sendWorker(function() { - if (isSendingNotification) { - return; - } + if (isSendingNotification) { + return; + } - try { + try { - // Set send fence - isSendingNotification = true; - - // var countSent = 0; - var batchSize = options.sendBatchSize || 1; - - var now = +new Date(); - - // Find notifications that are not being or already sent - var pendingNotifications = Push.notifications.find({ $and: [ - // Message is not sent - { sent : false }, - // And not being sent by other instances - { sending: { $lt: now } }, - // And not queued for future - { $or: [ - { delayUntil: { $exists: false } }, - { delayUntil: { $lte: new Date() } } - ] - } - ]}, { - // Sort by created date - sort: { createdAt: 1 }, - limit: batchSize - }); - - pendingNotifications.forEach(function(notification) { - try { - sendNotification(notification); - } catch(error) { - if (typeof Push.Log === 'function') { - Push.Log('Push: Could not send notification id: "' + notification._id + '", Error:', error.message); - } - if (Push.debug) { - console.log('Push: Could not send notification id: "' + notification._id + '", Error: ' + error.message); - } - } - }); // EO forEach - } finally { + // Set send fence + isSendingNotification = true; + + // var countSent = 0; + var batchSize = options.sendBatchSize || 1; + + var now = +new Date(); - // Remove the send fence - isSendingNotification = false; + // Find notifications that are not being or already sent + var pendingNotifications = Push.notifications.find({ + $and: [ + // Message is not sent + { sent: false }, + // And not being sent by other instances + { sending: { $lt: now } }, + // And not queued for future + { + $or: [ + { delayUntil: { $exists: false } }, + { delayUntil: { $lte: new Date() } } + ] + } + ] + }, { + // Sort by created date + sort: { createdAt: 1 }, + limit: batchSize + }); + + pendingNotifications.forEach(function(notification) { + try { + sendNotification(notification); + } catch (error) { + if (typeof Push.Log === 'function') { + Push.Log('Push: Could not send notification id: "' + notification._id + '", Error:', error.message); + } + if (Push.debug) { + console.log('Push: Could not send notification id: "' + notification._id + '", Error: ' + error.message); + } } - }, options.sendInterval || 15000); // Default every 15th sec + }); // EO forEach + } finally { - } else { - if (Push.debug) { - console.log('Push: Send server is disabled'); + // Remove the send fence + isSendingNotification = false; } + }, options.sendInterval || 15000); // Default every 15th sec + + } else { + if (Push.debug) { + console.log('Push: Send server is disabled'); } + } }; diff --git a/lib/server/server.js b/lib/server/server.js index a6a973d..9054adb 100644 --- a/lib/server/server.js +++ b/lib/server/server.js @@ -85,13 +85,13 @@ Meteor.methods({ if (doc) { if(doc.token) - { - var removed = Push.appCollection.remove({ + { + var removed = Push.appCollection.remove({ $and: [ { _id: { $ne: doc._id } }, - { token: doc.token }, // Match token - { appName: doc.appName }, // Match appName - { token: { $exists: true } } // Make sure token exists - ] }); + { token: doc.token }, // Match token + { appName: doc.appName }, // Match appName + { token: { $exists: true } } // Make sure token exists + ] }); } if (removed && Push.debug) { console.log('Push: Removed ' + removed + ' existing app items'); diff --git a/package-lock.json b/package-lock.json index 11c7283..2065c0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,108 +1,148 @@ { "name": "push", - "version": "0.0.0-semantic-release", + "version": "4.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@commitlint/cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-5.1.1.tgz", - "integrity": "sha512-dO2GOL5rnnusnkBd5eWZ7irK0bDjOVpuwWHxqTamlxcf4Scy1uQEQXflWqcvW4ftq7VtZ+SAEEdDphe84elDkQ==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-5.2.8.tgz", + "integrity": "sha512-XSej+/Pvl3gMOahEZpbsE5F1hPzMVPMXuK6MWZxsou3fyPUeAzHK9F2C76WCDVLIBVte/lxow7QQtUtMQEyiOg==", "dev": true, "requires": { - "@commitlint/core": "5.1.1", + "@commitlint/core": "^5.2.8", "babel-polyfill": "6.26.0", "chalk": "2.3.0", "get-stdin": "5.0.1", - "lodash": "4.17.4", + "lodash.merge": "4.6.0", + "lodash.pick": "4.4.0", "meow": "3.7.0" - }, - "dependencies": { - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - } } }, "@commitlint/config-conventional": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-5.1.3.tgz", - "integrity": "sha512-8y5w4kmxBKK0Pz9XlaQ/3bfNNTyBCPsmdrz24K76vm8DYleGXEz/vV2n4nLqsKUPa7wiKWw/d1gxWM/msz0XeA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-5.2.3.tgz", + "integrity": "sha512-W2OarrGyHP+ihgqNv6iLSAXBNw5KBXAkuAf2cHD9+KpIA8rTtOCfbZsIc6DNPQc4+0Ysh0jsk6ePrL0NGTtp0w==", "dev": true }, "@commitlint/core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/core/-/core-5.1.1.tgz", - "integrity": "sha512-dIXsspjzruBcLyNqQLmPsGN0dN1sj318qq1KY5+KTHCHIs4TUnlWomDi2gvZ5SdgZEHahnpXf0RB9C0PAiRaZA==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/core/-/core-5.2.8.tgz", + "integrity": "sha512-E/2gJ6BpO43E3OeT1z99oPzVu9SHOprdjiBZ8ZwgmW8NynzhfSsSqrP+fHcro0ig8FcynRI/tYnpGeBGFC8DXg==", + "dev": true, + "requires": { + "@commitlint/execute-rule": "^5.2.8", + "@commitlint/is-ignored": "^5.2.8", + "@commitlint/parse": "^5.2.8", + "@commitlint/resolve-extends": "^5.2.8", + "@commitlint/rules": "^5.2.8", + "@commitlint/top-level": "^5.2.8", + "@marionebl/sander": "^0.6.0", + "babel-runtime": "^6.23.0", + "chalk": "^2.0.1", + "cosmiconfig": "^3.0.1", + "git-raw-commits": "^1.3.0", + "lodash.merge": "4.6.0", + "lodash.mergewith": "4.6.0", + "lodash.pick": "4.4.0", + "lodash.topairs": "4.3.0", + "resolve-from": "4.0.0" + } + }, + "@commitlint/ensure": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-5.2.8.tgz", + "integrity": "sha512-SWclCuYUmzTUDw0RL/ktO6qzkX2uo3PwGz+4nEyZK00ZCnZk9V99A4AX1fW3VyhB3J1C40QIztNGpafk3iCvkg==", + "dev": true, + "requires": { + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.startcase": "4.4.0", + "lodash.upperfirst": "4.3.1" + } + }, + "@commitlint/execute-rule": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-5.2.8.tgz", + "integrity": "sha512-0ShMDkTXdGnb21U2MfTtpnhySVZJ8FuEH4F9S9c0zoRlbVrphIfX8m+2T4p4ge3AGM0E/QDi8bZqLrD/E8edHQ==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "@commitlint/is-ignored": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-5.2.8.tgz", + "integrity": "sha512-AGViKcJ2/F2HXJNM+vBHxGrAMxJ3ZXGqQYZXC9hjF5d1x3tLFe5uYkI2WBdX6YiAsZbKk5a+Cchr2qojkckqRA==", "dev": true, "requires": { - "@marionebl/conventional-commits-parser": "3.0.0", - "@marionebl/git-raw-commits": "1.2.0", - "@marionebl/sander": "0.6.1", - "babel-runtime": "6.26.0", - "chalk": "2.3.0", - "conventional-changelog-angular": "1.5.2", - "cosmiconfig": "3.1.0", - "find-up": "2.1.0", - "lodash": "4.17.4", - "path-exists": "3.0.0", - "require-uncached": "1.0.3", - "resolve-from": "4.0.0", - "resolve-global": "0.1.0", "semver": "5.4.1" }, "dependencies": { - "@marionebl/conventional-commits-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@marionebl/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz", - "integrity": "sha1-naKbTSyPBcD5zdApNnE7gJbJWNM=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "is-text-path": "1.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", "dev": true } } }, - "@marionebl/git-raw-commits": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@marionebl/git-raw-commits/-/git-raw-commits-1.2.0.tgz", - "integrity": "sha512-kI7s1W+GFMLJkuesgBdMgr1NCkChqfhP+wT6REoPsgtJGGwN0L/84gSw9pyH3u1bAK3uHjAkGZQ2bileBVVWtg==", + "@commitlint/message": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-5.2.8.tgz", + "integrity": "sha512-5k4pOPX5hwS34xAYzSZZFxsW0MCaJbbcjCTiqbyf8WEPep0ru2dsZg6EsBqLTe9IG1YjQM/Z5/udkfIwBXOYpw==", + "dev": true + }, + "@commitlint/parse": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-5.2.8.tgz", + "integrity": "sha512-XSBuLXuyOJ7u4aOM4XdGUvcfaLZ8By4abFF9VzF6tbek+R3jylSlrULqeX8oNnzkSn2PWtf9sYDb2dt5z9XWjw==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^1.3.3", + "conventional-commits-parser": "^2.1.0" + } + }, + "@commitlint/resolve-extends": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-5.2.8.tgz", + "integrity": "sha512-3d4Qk5/IQiX95nGn5pmtPAkoueKZLgz8VCdOxf1fNegudyl2EaRxKLIoaZ9DmZz6RE1CpRCinvsFFdESq3tvTw==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "lodash.merge": "4.6.0", + "lodash.omit": "4.5.0", + "require-uncached": "^1.0.3", + "resolve-from": "^4.0.0", + "resolve-global": "^0.1.0" + } + }, + "@commitlint/rules": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-5.2.8.tgz", + "integrity": "sha512-R2shsQJk2q0Wd+zBKbeKDVJszEpiTNL7OnPavXr9wdseHPtpXNUTn3YiWtipgNOW3Rfb9t2A5mxgn0uF0ce3iQ==", + "dev": true, + "requires": { + "@commitlint/ensure": "^5.2.8", + "@commitlint/message": "^5.2.8", + "@commitlint/to-lines": "^5.2.8", + "babel-runtime": "^6.23.0" + } + }, + "@commitlint/to-lines": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-5.2.8.tgz", + "integrity": "sha512-BI0wuimKkV/DrEHf7Ze2DIY9tY9E1MWz3/Ox3hheyQeTjDD3MSNdEs4KmXtIXfoAAPifOMmRUccbcEIR6vW3UQ==", + "dev": true + }, + "@commitlint/top-level": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-5.2.8.tgz", + "integrity": "sha512-0WdwHKLUXVCr2CYtAIZWdYLo4kSIlEs+q24/rt55SNl7/QRT6/UKMiyHN/gLeK7Q0CzEOebXD8Jjrl3BCUTyYg==", "dev": true, "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3" + "find-up": "^2.1.0" } }, "@marionebl/sander": { @@ -111,9 +151,9 @@ "integrity": "sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" } }, "@semantic-release/commit-analyzer": { @@ -122,11 +162,11 @@ "integrity": "sha512-mbyk+KPnI2UesHC1Az21CTZjzoGkzFm3w9qGKxifkmaAPMObKmbD6tPLwcFu8Bz5h08xG5yjtp1K0Pb3AKk+Dw==", "dev": true, "requires": { - "conventional-changelog-angular": "1.5.2", - "conventional-commits-parser": "2.0.1", - "debug": "3.1.0", - "import-from": "2.1.0", - "lodash": "4.17.4" + "conventional-changelog-angular": "^1.4.0", + "conventional-commits-parser": "^2.0.0", + "debug": "^3.1.0", + "import-from": "^2.1.0", + "lodash": "^4.17.4" } }, "@semantic-release/condition-travis": { @@ -135,17 +175,17 @@ "integrity": "sha512-0g8O/OObhqjAotztjPjMJ43I6oX05z/Ffdu6HMsScDgLX1+QQzq5w0HnUxjmiXUGNwqi5M6s7BF65ZKHbGOytQ==", "dev": true, "requires": { - "@semantic-release/error": "2.1.0", - "github": "12.0.5", - "parse-github-repo-url": "1.4.1", - "semver": "5.4.1", - "travis-deploy-once": "3.0.0" + "@semantic-release/error": "^2.0.0", + "github": "^12.0.0", + "parse-github-repo-url": "^1.4.1", + "semver": "^5.0.3", + "travis-deploy-once": "^3.0.0" } }, "@semantic-release/error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.1.0.tgz", - "integrity": "sha512-r3pcw7lhzoSalM55O7L8R3gNq8AnZ7OS7RReHqJDTIuyRaQbtfZ+9S8Krvh/BSnTMYYhs4TgZctb6pOamegUtQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", "dev": true }, "@semantic-release/github": { @@ -154,12 +194,12 @@ "integrity": "sha512-Rofz+v4y/dUm1jMOPjG3c/z44uiOVjdSH+PYb0DJbCsTYBiDI3YGmyIrvR/g2LeoA43deOPjIovqqp2So+TzLw==", "dev": true, "requires": { - "@semantic-release/error": "2.1.0", - "debug": "3.1.0", - "fs-extra": "4.0.2", - "git-url-parse": "7.0.1", - "github": "12.0.5", - "p-each-series": "1.0.0" + "@semantic-release/error": "^2.1.0", + "debug": "^3.1.0", + "fs-extra": "^4.0.2", + "git-url-parse": "^7.0.1", + "github": "^12.0.3", + "p-each-series": "^1.0.0" } }, "@semantic-release/npm": { @@ -168,13 +208,13 @@ "integrity": "sha512-BRSAildRf6ZnQ0LdwACSPsWWcxeMFEoGVitbLO1yorXHfN4K+Nn3P0OT+ZuRRYB8rRdTEdn5JMieW0I9WqDS4g==", "dev": true, "requires": { - "@semantic-release/error": "2.1.0", - "execa": "0.8.0", - "fs-extra": "4.0.2", - "nerf-dart": "1.0.0", - "npm-conf": "1.1.3", - "npm-registry-client": "8.5.0", - "registry-auth-token": "3.3.1" + "@semantic-release/error": "^2.1.0", + "execa": "^0.8.0", + "fs-extra": "^4.0.2", + "nerf-dart": "^1.0.0", + "npm-conf": "^1.1.3", + "npm-registry-client": "^8.5.0", + "registry-auth-token": "^3.3.1" } }, "@semantic-release/release-notes-generator": { @@ -183,31 +223,37 @@ "integrity": "sha512-mV2wi5ldwAsksC41OcRWxWeFfeguBvUEcPgglHyBv5GgIAo1dWFQ3rbqLdcCktKrCCKY+AdOwchbcYWTp0V+1Q==", "dev": true, "requires": { - "conventional-changelog-angular": "1.5.2", - "conventional-changelog-writer": "2.0.2", - "conventional-commits-parser": "2.0.1", - "debug": "3.1.0", - "get-stream": "3.0.0", - "hosted-git-info": "2.5.0", - "import-from": "2.1.0", - "into-stream": "3.1.0", - "lodash": "4.17.4" + "conventional-changelog-angular": "^1.4.0", + "conventional-changelog-writer": "^2.0.1", + "conventional-commits-parser": "^2.0.0", + "debug": "^3.1.0", + "get-stream": "^3.0.0", + "hosted-git-info": "^2.5.0", + "import-from": "^2.1.0", + "into-stream": "^3.1.0", + "lodash": "^4.17.4" } }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "acorn-jsx": { @@ -216,7 +262,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -228,24 +274,24 @@ } }, "agent-base": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.1.2.tgz", - "integrity": "sha512-VE6QoEdaugY86BohRtfGmTDabxdU5sCKOkbcPA6PXKJsRzEi/7A3RCTxJal1ft/4qSfPht5/iQLhMh/wzSkkNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" } }, "ajv": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.4.0.tgz", - "integrity": "sha1-MtHPCNvIDEMvQm8S4QslEfa0ZHQ=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -254,27 +300,10 @@ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -284,10 +313,13 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "ansicolors": { "version": "0.2.1", @@ -303,23 +335,23 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "argv-formatter": { @@ -340,20 +372,26 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "array-uniq": "1.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } }, "arrify": { "version": "1.0.1", @@ -362,36 +400,36 @@ "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, "babel-code-frame": { @@ -400,22 +438,28 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -424,8 +468,14 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -435,9 +485,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -454,8 +504,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "balanced-match": { @@ -465,69 +515,28 @@ "dev": true }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "requires": { - "readable-stream": "2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "hoek": "2.16.3" + "tweetnacl": "^0.14.3" } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "builtin-modules": { + "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtins": { @@ -536,13 +545,36 @@ "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", "dev": true }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -552,19 +584,20 @@ "dev": true }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } }, "cardinal": { @@ -573,68 +606,37 @@ "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", "dev": true, "requires": { - "ansicolors": "0.2.1", - "redeyed": "1.0.1" + "ansicolors": "~0.2.1", + "redeyed": "~1.0.0" } }, "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, "chalk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "chardet": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.0.tgz", - "integrity": "sha1-C74TVaxE16PtSpJXB8TvcPgZD2w=", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, "ci-info": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", - "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, "circular-json": { @@ -649,7 +651,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-table": { @@ -662,30 +664,18 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, - "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } + "mimic-response": "^1.0.0" } }, "co": { @@ -698,12 +688,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -722,18 +713,18 @@ "dev": true }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.1.tgz", - "integrity": "sha512-PCNLExLlI5HiPdaJs4pMXwOTHkSCpNQ1QJH9ykZLKtKEyKu3p9HgmH5l97vM8c0IUz6d54l+xEu2GG9yuYrFzA==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "compare-func": { @@ -742,8 +733,8 @@ "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", "dev": true, "requires": { - "array-ify": "1.0.0", - "dot-prop": "3.0.0" + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" } }, "concat-map": { @@ -753,31 +744,33 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "contains-path": { "version": "0.1.0", @@ -786,62 +779,81 @@ "dev": true }, "conventional-changelog-angular": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.5.2.tgz", - "integrity": "sha1-Kzj2Zf6cWSCvGi+C9Uf0ur5t5Xw=", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", "dev": true, "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" + "compare-func": "^1.3.1", + "q": "^1.5.1" } }, "conventional-changelog-writer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-2.0.2.tgz", - "integrity": "sha1-tYV97RsAHa+aeLnNQJJvRcE0lJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-2.0.3.tgz", + "integrity": "sha512-2E1h7UXL0fhRO5h0CxDZ5EBc5sfBZEQePvuZ+gPvApiRrICUyNDy/NQIP+2TBd4wKZQf2Zm7TxbzXHG5HkPIbA==", "dev": true, "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.0", - "dateformat": "1.0.12", - "handlebars": "4.0.11", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "semver": "5.4.1", - "split": "1.0.1", - "through2": "2.0.3" + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.1", + "dateformat": "^1.0.11", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.0.0", + "meow": "^3.3.0", + "semver": "^5.0.1", + "split": "^1.0.0", + "through2": "^2.0.0" } }, "conventional-commits-filter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.0.tgz", - "integrity": "sha1-H8Ka8wte2rdvVOIpxBGwxmPQ+es=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", "dev": true, "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.0" + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" } }, "conventional-commits-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.0.1.tgz", - "integrity": "sha1-HxXOa4RPfKQUlcgZDAgzwwuLFpM=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "is-text-path": "1.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + } } }, "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "core-util-is": { @@ -856,10 +868,10 @@ "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.10.0", - "parse-json": "3.0.0", - "require-from-string": "2.0.1" + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^3.0.0", + "require-from-string": "^2.0.1" }, "dependencies": { "parse-json": { @@ -868,7 +880,7 @@ "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.3.1" } } } @@ -879,18 +891,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "currently-unhandled": { @@ -899,7 +902,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "dargs": { @@ -908,7 +911,7 @@ "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "dashdash": { @@ -917,15 +920,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "assert-plus": "^1.0.0" } }, "dateformat": { @@ -934,17 +929,25 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + } } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -953,10 +956,43 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "deep-is": { @@ -965,19 +1001,13 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "object-keys": "^1.0.12" } }, "delayed-stream": { @@ -994,13 +1024,12 @@ "optional": true }, "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2" } }, "dot-prop": { @@ -1009,7 +1038,7 @@ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -1024,32 +1053,68 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.2" } }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es6-promise": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", - "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-promisify": { @@ -1058,7 +1123,7 @@ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "es6-promise": "4.1.1" + "es6-promise": "^4.0.3" } }, "escape-string-regexp": { @@ -1068,48 +1133,49 @@ "dev": true }, "eslint": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.11.0.tgz", - "integrity": "sha512-UWbhQpaKlm8h5x/VLwm0S1kheMrDj8jPwhnBMjr/Dlo3qqT7MvcN/UfKAR3E1N4lr4YNtOvS4m3hwsrVc/ky7g==", - "dev": true, - "requires": { - "ajv": "5.4.0", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.0.0", - "eslint-scope": "3.7.1", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", "table": "4.0.2", - "text-table": "0.2.0" + "text-table": "~0.2.0" } }, "eslint-config-standard": { @@ -1119,13 +1185,13 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", - "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "dev": true, "requires": { - "debug": "2.6.9", - "resolve": "1.5.0" + "debug": "^2.6.9", + "resolve": "^1.13.1" }, "dependencies": { "debug": { @@ -1136,17 +1202,23 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { @@ -1157,25 +1229,33 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", "dev": true, "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" }, "dependencies": { "debug": { @@ -1193,29 +1273,35 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "locate-path": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, - "load-json-file": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "error-ex": "^1.2.0" } }, "path-type": { @@ -1224,18 +1310,24 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -1244,15 +1336,9 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, @@ -1262,9 +1348,9 @@ "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", "dev": true, "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.5.0", + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", "semver": "5.3.0" }, "dependencies": { @@ -1277,72 +1363,85 @@ } }, "eslint-plugin-promise": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", - "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", "dev": true }, "eslint-plugin-standard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", - "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", + "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", "dev": true }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "dev": true, "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0" } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "execa": { @@ -1351,30 +1450,30 @@ "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.0", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extsprintf": { @@ -1384,15 +1483,15 @@ "dev": true }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -1407,7 +1506,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -1416,30 +1515,40 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "locate-path": "^2.0.0" } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "follow-redirects": { @@ -1448,7 +1557,7 @@ "integrity": "sha512-FrMqZ/FONtHnbqO651UPpfRUVukIEwJhXMfdr/JWAmrDbeYBu773b1J6gdWDyRIj4hvvzQEHoEOTrdR8o6KLYA==", "dev": true, "requires": { - "debug": "3.1.0" + "debug": "^3.1.0" } }, "forever-agent": { @@ -1458,14 +1567,14 @@ "dev": true }, "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "async": "2.6.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "from2": { @@ -1474,19 +1583,19 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { @@ -1514,14 +1623,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -1531,7 +1640,7 @@ "dev": true, "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -1541,9 +1650,9 @@ "dev": true, "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -1551,31 +1660,17 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, "get-stream": { @@ -1590,15 +1685,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "assert-plus": "^1.0.0" } }, "git-log-parser": { @@ -1607,12 +1694,12 @@ "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", "dev": true, "requires": { - "argv-formatter": "1.0.0", - "spawn-error-forwarder": "1.0.0", - "split2": "1.0.0", - "stream-combiner2": "1.1.1", - "through2": "2.0.3", - "traverse": "0.6.6" + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" }, "dependencies": { "split2": { @@ -1621,56 +1708,88 @@ "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", "dev": true, "requires": { - "through2": "2.0.3" + "through2": "~2.0.0" + } + } + } + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" } } } }, "git-up": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.0.9.tgz", - "integrity": "sha1-IZv9J8gtrurYSVvrOG3Bjq5jY20=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.1.0.tgz", + "integrity": "sha512-MJgwfcSd9qxgDyEYpRU/CDxNpUadrK80JHuEQDG4Urn0m7tpSOgCBrtiSIa9S9KH8Tbuo/TN8SSQmJBvsw1HkA==", "dev": true, "requires": { - "is-ssh": "1.3.0", - "parse-url": "1.3.11" + "is-ssh": "^1.3.0", + "parse-url": "^3.0.2" } }, "git-url-parse": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-7.0.1.tgz", - "integrity": "sha1-Gj3/xuqp42NN7txY4g2eMxBtPUE=", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-7.2.0.tgz", + "integrity": "sha512-dVF8edkWPnkCTdtY2OKL6hDmwghFjcXGEBnDjT5nfL0Gr2QR4yEDqbskV/KJfPhrEcn70eKpTlkHlMlaYuxjrg==", "dev": true, "requires": { - "git-up": "2.0.9" + "git-up": "^2.0.0" } }, "github": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/github/-/github-12.0.5.tgz", - "integrity": "sha512-4U81TDODHt6RcbuRGwKYmdCmiV4PfnR0NWRIyiZdBoYYGZCRav+KiL45XMueJW8EU5FBiZ2Ox9RoPz1iQUmlJQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/github/-/github-12.1.0.tgz", + "integrity": "sha512-HhWjhd/OATC4Hjj7xfGjGRtwWzo/fzTc55EkvsRatI9G6Vp47mVcdBIt1lQ56A9Qit/yVQRX1+M9jbWlcJvgug==", "dev": true, "requires": { - "dotenv": "4.0.0", + "dotenv": "^4.0.0", "follow-redirects": "1.2.6", - "https-proxy-agent": "2.1.0", - "lodash": "4.17.4", - "mime": "2.0.3", - "netrc": "0.1.4" + "https-proxy-agent": "^2.1.0", + "lodash": "^4.17.4", + "mime": "^2.0.3", + "netrc": "^0.1.4" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "global-dirs": { @@ -1679,98 +1798,108 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.12.1", - "is-my-json-valid": "2.16.1", - "pinkie-promise": "2.0.1" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true } } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -1779,7 +1908,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -1788,6 +1917,27 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1795,60 +1945,37 @@ "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.1.0.tgz", - "integrity": "sha512-/DTVSUCbRc6AiyOV4DBRvPDpKKCJh4qQJNaCgypX0T41quD9hp/PB5iUyx/60XobuMPQa9ce1jNV9UOUq6PnTg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { - "agent-base": "4.1.2", - "debug": "2.6.9" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "agent-base": "^4.3.0", + "debug": "^3.1.0" } }, "husky": { @@ -1857,29 +1984,24 @@ "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", "dev": true, "requires": { - "is-ci": "1.0.10", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" - }, - "dependencies": { - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - } + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "import-from": { @@ -1888,7 +2010,7 @@ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" }, "dependencies": { "resolve-from": { @@ -1906,13 +2028,10 @@ "dev": true }, "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, "inflight": { "version": "1.0.6", @@ -1920,14 +2039,14 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { @@ -1942,20 +2061,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, "into-stream": { @@ -1964,8 +2083,8 @@ "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" } }, "is-arrayish": { @@ -1974,30 +2093,27 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, "is-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "ci-info": "1.1.2" + "ci-info": "^1.5.0" } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -2005,13 +2121,10 @@ "dev": true }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -2019,76 +2132,52 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "has": "^1.0.3" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, "is-ssh": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", - "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", "dev": true, "requires": { - "protocols": "1.4.6" + "protocols": "^1.1.0" } }, "is-stream": { @@ -2097,19 +2186,34 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-subset": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { - "text-extensions": "1.7.0" + "text-extensions": "^1.0.0" } }, "is-typedarray": { @@ -2142,6 +2246,16 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2149,21 +2263,32 @@ "dev": true }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-schema": { "version": "0.2.3", @@ -2195,7 +2320,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonparse": { @@ -2204,12 +2329,6 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -2220,53 +2339,37 @@ "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, "requires": { - "is-buffer": "1.1.6" + "json-buffer": "3.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -2275,22 +2378,14 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash._reinterpolate": { @@ -2305,29 +2400,71 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, - "lodash.template": { + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "dev": true + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", + "dev": true + }, + "lodash.startcase": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "lodash.toarray": { @@ -2336,10 +2473,16 @@ "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "lodash.topairs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.topairs/-/lodash.topairs-4.3.0.tgz", + "integrity": "sha1-O23qo31g+xFnE8RsXxfqGQ7EjWQ=", + "dev": true + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", "dev": true }, "loud-rejection": { @@ -2348,30 +2491,36 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, "marked-terminal": { @@ -2380,24 +2529,30 @@ "integrity": "sha1-Xq9Wi+ZvaGVBr6UqVYKAMQox3i0=", "dev": true, "requires": { - "cardinal": "1.0.0", - "chalk": "1.1.3", - "cli-table": "0.3.1", - "lodash.assign": "4.2.0", - "node-emoji": "1.8.1" + "cardinal": "^1.0.0", + "chalk": "^1.1.3", + "cli-table": "^0.3.1", + "lodash.assign": "^4.2.0", + "node-emoji": "^1.4.1" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -2406,8 +2561,14 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -2417,22 +2578,166 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true } } @@ -2443,35 +2748,41 @@ "integrity": "sha512-QjaUF0wa10WyOTWOZl31WcoQA4szcOFjWCeN7tth5lbCsGMvEC62f7t1yLfHzZmo2ft6ZUexw7zudnB+NkSCzQ==", "dev": true, "requires": { - "commander": "2.12.1", - "eslint": "4.11.0" + "commander": "^2.11.0", + "eslint": "^4.11.0" } }, "mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-TrpAd/vX3xaLPDgVRm6JkZwLR0KHfukMdU2wTEbqMDdCnY6Yo3mE+mjs9YE6oMNw2QRfXVeBEYpmpO94BIqiug==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "1.44.0" } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, "minimatch": { @@ -2480,34 +2791,44 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "modify-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.0.tgz", - "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { @@ -2522,6 +2843,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "nerf-dart": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", @@ -2535,30 +2862,24 @@ "dev": true }, "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", "dev": true, "requires": { - "lodash.toarray": "4.4.0" + "lodash.toarray": "^4.4.0" } }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -2567,53 +2888,57 @@ "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", "dev": true }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", "dev": true, "requires": { - "config-chain": "1.1.11", - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "config-chain": "^1.1.11", + "pify": "^3.0.0" } }, "npm-package-arg": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-5.1.2.tgz", - "integrity": "sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.4", - "semver": "5.4.1", - "validate-npm-package-name": "3.0.0" + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" } }, "npm-registry-client": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.0.tgz", - "integrity": "sha512-Nkcw24bfECKFNt0FLDQ+PjVqSlKxMggcboXiUBIvjbCnA15xjRO4kCwRDluGNXZjHFLx/vPjN4+ESXyVjpXLbQ==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", + "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", "dev": true, "requires": { - "concat-stream": "1.6.0", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "5.1.2", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.74.0", - "retry": "0.10.1", - "semver": "5.4.1", - "slide": "1.1.6", - "ssri": "4.1.6" + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" } }, "npm-run-path": { @@ -2622,7 +2947,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -2632,10 +2957,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -2645,9 +2970,9 @@ "dev": true }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { @@ -2656,13 +2981,49 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -2671,39 +3032,21 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } + "mimic-fn": "^1.0.0" } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" } }, "os-homedir": { @@ -2719,22 +3062,28 @@ "dev": true }, "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "1.0.0" + "p-reduce": "^1.0.0" } }, "p-finally": { @@ -2750,10 +3099,13 @@ "dev": true }, "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } }, "p-locate": { "version": "2.0.0", @@ -2761,7 +3113,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "p-reduce": { @@ -2776,9 +3128,24 @@ "integrity": "sha1-OSczKkt9cCabU1UVEX/FR9oaaWg=", "dev": true, "requires": { - "retry": "0.10.1" + "retry": "^0.10.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", @@ -2786,33 +3153,82 @@ "dev": true }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "parse-url": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", - "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", + "parse-path": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-3.0.4.tgz", + "integrity": "sha512-wP70vtwv2DyrM2YoA7ZHVv4zIXa4P7dGgHlj+VwyXNDduLLVJ7NMY1zsFxjUUJ3DAwJLupGb1H5gMDDiNlJaxw==", "dev": true, "requires": { - "is-ssh": "1.3.0", - "protocols": "1.4.6" + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "parse-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-3.0.2.tgz", + "integrity": "sha1-YCeHpwY6eV1yuGcxl1BecvYGEL4=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "is-ssh": "^1.3.0", + "normalize-url": "^1.9.1", + "parse-path": "^3.0.1", + "protocols": "^1.4.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } } }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2832,26 +3248,30 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "pify": "^3.0.0" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -2866,16 +3286,16 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^2.1.0" } }, "pluralize": { @@ -2890,16 +3310,22 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "proto-list": { @@ -2909,9 +3335,9 @@ "dev": true }, "protocols": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz", - "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", "dev": true }, "pseudomap": { @@ -2920,10 +3346,16 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "q": { @@ -2933,75 +3365,84 @@ "dev": true }, "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, "rc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", - "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" } }, "redeyed": { @@ -3010,7 +3451,7 @@ "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", "dev": true, "requires": { - "esprima": "3.0.0" + "esprima": "~3.0.0" }, "dependencies": { "esprima": { @@ -3022,69 +3463,68 @@ } }, "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { - "rc": "1.2.2", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { - "version": "2.74.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", - "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "1.0.1", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "6.2.3", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3" + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "require-from-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", - "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-uncached": { @@ -3093,23 +3533,31 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } } }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.6" } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-global": { @@ -3118,7 +3566,16 @@ "integrity": "sha1-j7As/Vt9sgEY6IYxHxWvlb0V+9k=", "dev": true, "requires": { - "global-dirs": "0.1.1" + "global-dirs": "^0.1.0" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" } }, "restore-cursor": { @@ -3127,8 +3584,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "retry": { @@ -3137,33 +3594,20 @@ "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.1.3" } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "rx-lite": { "version": "4.0.8", @@ -3177,13 +3621,19 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "semantic-release": { @@ -3192,26 +3642,26 @@ "integrity": "sha512-VNJ/0Q2Ao8kW2Pku3WYpt6BuKt3ovDlJQCfwUVv03OzTaj88sIyN3gU+Zcrfb3tfCPjzTNdU9p6OhBN8d3itow==", "dev": true, "requires": { - "@semantic-release/commit-analyzer": "4.0.1", - "@semantic-release/condition-travis": "6.2.1", - "@semantic-release/error": "2.1.0", - "@semantic-release/github": "1.0.0", - "@semantic-release/npm": "1.0.0", - "@semantic-release/release-notes-generator": "5.1.1", - "chalk": "2.3.0", - "commander": "2.12.1", - "debug": "3.1.0", - "execa": "0.8.0", - "fs-extra": "4.0.2", - "get-stream": "3.0.0", - "git-log-parser": "1.2.0", - "import-from": "2.1.0", - "lodash": "4.17.4", - "marked": "0.3.6", - "marked-terminal": "2.0.0", - "normalize-package-data": "2.4.0", - "p-reduce": "1.0.0", - "semver": "5.4.1" + "@semantic-release/commit-analyzer": "^4.0.0", + "@semantic-release/condition-travis": "^6.0.0", + "@semantic-release/error": "^2.1.0", + "@semantic-release/github": "^1.0.0", + "@semantic-release/npm": "^1.0.0", + "@semantic-release/release-notes-generator": "^5.0.0", + "chalk": "^2.3.0", + "commander": "^2.11.0", + "debug": "^3.1.0", + "execa": "^0.8.0", + "fs-extra": "^4.0.2", + "get-stream": "^3.0.0", + "git-log-parser": "^1.2.0", + "import-from": "^2.1.0", + "lodash": "^4.0.0", + "marked": "^0.3.6", + "marked-terminal": "^2.0.0", + "normalize-package-data": "^2.3.4", + "p-reduce": "^1.0.0", + "semver": "^5.4.1" } }, "semantic-release-meteor": { @@ -3220,24 +3670,24 @@ "integrity": "sha512-jhwXhmHJwu/0EgolwDe1WBNm1sIoX5d/JioWiLsooJZgUG0G48Iaefw7RUsSIXToWdNkLzYALmd/jz6ejzti/Q==", "dev": true, "requires": { - "@semantic-release/error": "2.1.0", - "commander": "2.12.1", - "eslint": "4.11.0", - "eslint-config-standard": "10.2.1", - "eslint-plugin-import": "2.8.0", - "eslint-plugin-node": "5.2.1", - "eslint-plugin-promise": "3.6.0", - "eslint-plugin-standard": "3.0.1", - "execa": "0.8.0", - "fs-extra": "4.0.2", - "meteor-ci": "0.3.1", - "semver": "5.4.1" + "@semantic-release/error": "^2.1.0", + "commander": "^2.11.0", + "eslint": "^4.11.0", + "eslint-config-standard": "^10.2.1", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-standard": "^3.0.1", + "execa": "^0.8.0", + "fs-extra": "^4.0.2", + "meteor-ci": "^0.3.1", + "semver": "^5.4.1" } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -3253,7 +3703,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -3263,9 +3713,9 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "slice-ansi": { @@ -3274,7 +3724,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "slide": { @@ -3283,23 +3733,20 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "dev": true, "requires": { - "hoek": "2.16.3" + "is-plain-obj": "^1.0.0" } }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "spawn-error-forwarder": { "version": "1.0.0", @@ -3308,24 +3755,35 @@ "dev": true }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split": { @@ -3334,7 +3792,7 @@ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "split2": { @@ -3343,7 +3801,7 @@ "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { - "through2": "2.0.3" + "through2": "^2.0.2" } }, "sprintf-js": { @@ -3353,36 +3811,29 @@ "dev": true }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "ssri": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-4.1.6.tgz", - "integrity": "sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.1" } }, "stream-combiner2": { @@ -3391,34 +3842,76 @@ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { - "duplexer2": "0.1.4", - "readable-stream": "2.3.3" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, "strip-ansi": { "version": "4.0.0", @@ -3426,7 +3919,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -3438,13 +3931,10 @@ } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -3453,13 +3943,10 @@ "dev": true }, "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", @@ -3468,10 +3955,13 @@ "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } }, "table": { "version": "4.0.2", @@ -3479,18 +3969,18 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.4.0", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "text-extensions": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", - "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, "text-table": { @@ -3506,31 +3996,38 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "punycode": "1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "traverse": { @@ -3539,48 +4036,23 @@ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, - "travis-ci": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/travis-ci/-/travis-ci-2.1.1.tgz", - "integrity": "sha1-mGliZa+CeuNXbzGqBth250tLCC4=", - "dev": true, - "requires": { - "github": "0.1.16", - "lodash": "1.3.1", - "request": "2.74.0", - "underscore.string": "2.2.1" - }, - "dependencies": { - "github": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/github/-/github-0.1.16.tgz", - "integrity": "sha1-iV0qhbD+t5gNiawM5PRNyqA/F7U=", - "dev": true - }, - "lodash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.3.1.tgz", - "integrity": "sha1-pGY7U2hriV/wdOK6UE37dqjit3A=", - "dev": true - } - } - }, "travis-deploy-once": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/travis-deploy-once/-/travis-deploy-once-3.0.0.tgz", - "integrity": "sha512-ST4Rs/WrAeq6MXi9/Iagw7p1MLje1mPV1UqGXB2jvBAweBlFHOjqbBvfpGLjmI+ZckOc2FkX0X1gNBOa9nc13w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/travis-deploy-once/-/travis-deploy-once-3.3.0.tgz", + "integrity": "sha512-N0l+sdYHMQbJmQWfjmxkKRJrMWJ+52Ve1dhGDiPhGXFiWO0A0zSeTxiFujz0rSOLOl9OhsZ9EMlJh2lNrgGugA==", "dev": true, "requires": { - "chalk": "2.3.0", - "p-retry": "1.0.0", - "semver": "5.4.1", - "travis-ci": "2.1.1" + "chalk": "^2.1.0", + "got": "^8.0.1", + "p-retry": "^1.0.0", + "semver": "^5.4.1", + "url-join": "^2.0.2" } }, "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true }, "trim-off-newlines": { @@ -3589,24 +4061,20 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -3614,7 +4082,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "typedarray": { @@ -3624,43 +4092,49 @@ "dev": true }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", + "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } + "commander": "~2.20.3" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, - "optional": true + "requires": { + "punycode": "^2.1.0" + } }, - "underscore.string": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", - "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", "dev": true }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", "dev": true }, "util-deprecate": { @@ -3669,14 +4143,20 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validate-npm-package-name": { @@ -3685,7 +4165,7 @@ "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "dev": true, "requires": { - "builtins": "1.0.3" + "builtins": "^1.0.3" } }, "verror": { @@ -3694,78 +4174,35 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "extsprintf": "^1.2.0" } }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "2.1.1" - } - } + "string-width": "^1.0.2 || 2" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, "wordwrap": { "version": "1.0.0", @@ -3785,13 +4222,13 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "yallist": { @@ -3799,28 +4236,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - } - } } } } diff --git a/package.js b/package.js index eafc734..2ef9689 100644 --- a/package.js +++ b/package.js @@ -7,13 +7,13 @@ Package.describe({ // Server-side push deps Npm.depends({ - 'apn' : '1.6.2', // '1.7.4', // working: 1.6.2 - 'node-gcm' : '0.14.4', // previously: 0.9.6 + 'apn': '2.2.0', // previously: 1.6.2 + 'node-gcm': '1.0.2', // previously: 0.14.4 }); Cordova.depends({ - 'phonegap-plugin-push': '1.9.0', // previously 1.8.4 - 'cordova-plugin-device': '1.1.3', // previously 1.1.1 + 'phonegap-plugin-push': '2.3.0', // previously 1.9.0 + 'cordova-plugin-device': '2.0.3', // previously 1.1.3 }); Package.registerBuildPlugin({ @@ -25,12 +25,12 @@ Package.registerBuildPlugin({ 'plugin/push.configuration.js' ], npmDependencies: { - 'strip-json-comments': '1.0.4' + 'strip-json-comments': '3.1.0' } }); -Package.onUse(function(api) { - api.versionsFrom('1.2'); +Package.onUse(function (api) { + api.versionsFrom('1.8'); api.use(['ecmascript']); @@ -44,12 +44,12 @@ Package.onUse(function(api) { ], ['client', 'server'], { weak: true }); api.use([ - 'raix:eventstate@0.0.2', + 'raix:eventstate@0.0.5', 'check', 'mongo', 'underscore', 'ejson', - 'random', // The push it is created with Random.id() + 'random', // The push it is created with Random.id() ], ['client', 'server']); api.use('mongo', 'server'); diff --git a/package.json b/package.json index c39ab81..3bcc9e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "push", - "version": "3.0.2", + "version": "4.0.0", "description": "Isomorphic Push notifications for APN and GCM", "main": "index.js", "scripts": { @@ -20,7 +20,9 @@ ] }, "commitlint": { - "extends": ["@commitlint/config-conventional"] + "extends": [ + "@commitlint/config-conventional" + ] }, "repository": "https://github.com/raix/push.git", "author": "", @@ -30,12 +32,12 @@ }, "homepage": "https://github.com/raix/push#readme", "devDependencies": { - "@commitlint/cli": "^5.1.1", - "@commitlint/config-conventional": "^5.1.3", + "@commitlint/cli": "^5.2.8", + "@commitlint/config-conventional": "^5.2.3", "husky": "^0.14.3", "meteor-ci": "0.3.1", "semantic-release": "^10.0.1", "semantic-release-meteor": "^0.0.7", - "semver": "^5.4.1" + "semver": "^5.7.1" } } diff --git a/plugin/push.configuration.js b/plugin/push.configuration.js index 051f285..72ef327 100644 --- a/plugin/push.configuration.js +++ b/plugin/push.configuration.js @@ -8,6 +8,7 @@ var checkConfig = function(config) { // jshint ignore:line passphrase: String, cert: String, key: String, + topic: String, // Web site config is optional webServiceUrl: Match.Optional(String), websitePushId: Match.Optional(String), @@ -17,7 +18,7 @@ var checkConfig = function(config) { // jshint ignore:line }), gcm: Match.Optional({ apiKey: String, - projectNumber: String + projectNumber: Match.OneOf(String, Number) }), // Allow optional production production: Match.Optional(Boolean), @@ -45,6 +46,12 @@ var checkConfig = function(config) { // jshint ignore:line if (config.apn && (config.apn.webServiceUrl || config.apn.websitePushId) && !(config.apn.webServiceUrl && config.apn.websitePushId)) { // jshint ignore:line throw new Error('Push configuration: Both "apn.webServiceUrl" and "apn.websitePushId" must be set'); } + if (config.apn && !config.apn.topic) { + throw new Error('Topic must be set to yor app bundle name'); + } + if (config.apn && (!config.apn.cert || !config.apn.key)) { + throw new Error('Key or certificate is missing form apn option'); + } }; var clone = function(name, config, result) { @@ -170,8 +177,8 @@ var configStringify = function(config) { // We need to do some extra work for apn on the server - since we would // load certificates from the app private folder if (config.apn && config.apn.key && config.apn.cert) { - str = str.replace('"key": "' + config.apn.key + '"', '"keyData": Assets.getText(\'' + config.apn.key + '\')'); - str = str.replace('"cert": "' + config.apn.cert + '"', '"certData": Assets.getText(\'' + config.apn.cert + '\')'); + str = str.replace('"key": "' + config.apn.key + '"', '"key": Assets.getText(\'' + config.apn.key + '\')'); + str = str.replace('"cert": "' + config.apn.cert + '"', '"cert": Assets.getText(\'' + config.apn.cert + '\')'); } if (config.iframe) { @@ -208,11 +215,11 @@ Plugin.registerSourceHandler('push.json', function(compileStep) { // console.log(compileStep.arch, configStringify(cloned)); - // } else { + // } else { // No configuration for architecture } - } catch(err) { + } catch (err) { console.error('Push configuration "config.push.json", JSON Error:', err.message); } // compileStep.arch From 59dba38e1d3c601602924d925625941c93192934 Mon Sep 17 00:00:00 2001 From: MrSpark2591 Date: Wed, 13 May 2020 11:05:48 +0530 Subject: [PATCH 04/14] fix(formatting): previous commit formatting issues solved --- lib/client/browser.js | 62 +- lib/client/client.js | 7 +- lib/client/cordova.js | 4 +- lib/common/notifications.js | 11 +- lib/server/push.api.js | 1163 +++++++++++++++++------------------ 5 files changed, 623 insertions(+), 624 deletions(-) diff --git a/lib/client/browser.js b/lib/client/browser.js index f9dd0b8..95c892b 100644 --- a/lib/client/browser.js +++ b/lib/client/browser.js @@ -25,7 +25,7 @@ var onNotification = function(notification) { } }; -Push.setBadge = function( /* count */ ) { +Push.setBadge = function(/* count */) { // XXX: Not implemented }; @@ -34,7 +34,7 @@ var isConfigured = false; Push.Configure = function(options) { var self = this; - options = options ||  {}; + options = options || {}; // check(options, { // gcm: Match.Optional(Match.ObjectIncluding({ @@ -81,14 +81,14 @@ Push.Configure = function(options) { var _parsePayload = function(value) { // Android actually parses payload into an object - this is not the case with // iOS (here is it just a string) - if (value !== '' + value) { + if (value !== ''+value) { value = JSON.stringify(value); } // Run the string through ejson try { return EJSON.parse(value); - } catch (err) { + } catch(err) { return { error: err }; } }; @@ -199,7 +199,7 @@ Push.Configure = function(options) { }); options.iframe.addEventListener('pushError', function(evt) { - Push.emit('error', { type: 'cordova.browser', error: evt.error ||  evt }); + Push.emit('error', { type: 'cordova.browser', error: evt.error || evt }); }); }); @@ -234,25 +234,27 @@ Push.Configure = function(options) { checkRemotePermission(permissionData); }); - var checkRemotePermission = function(permissionData) { - if (permissionData.permission === 'default') { - // This is a new web service URL and its validity is unknown. - window.safari.pushNotification.requestPermission( - options.apn.webServiceUrl, // The web service URL. - options.apn.websitePushId, // The Website Push ID. - {}, // Data that you choose to send to your server to help you identify the user. - checkRemotePermission // The callback function. - ); - } else if (permissionData.permission === 'denied') { - // alert('denied'); - // The user said no. - self.emit('error', { type: 'apn.browser', error: 'Access denied' }); - } else if (permissionData.permission === 'granted') { - // alert('granted'); - // The web service URL is a valid push provider, and the user said yes. - // permissionData.deviceToken is now available to use. - self.emitState('token', { apn: permissionData.deviceToken }); - } + var checkRemotePermission = function (permissionData) { + if (permissionData.permission === 'default') { + // This is a new web service URL and its validity is unknown. + window.safari.pushNotification.requestPermission( + options.apn.webServiceUrl, // The web service URL. + options.apn.websitePushId, // The Website Push ID. + {}, // Data that you choose to send to your server to help you identify the user. + checkRemotePermission // The callback function. + ); + } + else if (permissionData.permission === 'denied') { + // alert('denied'); + // The user said no. + self.emit('error', { type: 'apn.browser', error: 'Access denied' }); + } + else if (permissionData.permission === 'granted') { + // alert('granted'); + // The web service URL is a valid push provider, and the user said yes. + // permissionData.deviceToken is now available to use. + self.emitState('token', { apn: permissionData.deviceToken }); + } }; } @@ -296,11 +298,11 @@ Push.Configure = function(options) { // Once we've registered, the AppServer can send version pings to the EndPoint. // This will trigger a 'push' message to be sent to this handler. navigator.mozSetMessageHandler('push', function(message) { - if (message.pushEndpoint === pushEndpoint) { - // Did we launch or were we already running? - self.emit('startup', message); - } - }); + if (message.pushEndpoint === pushEndpoint) { + // Did we launch or were we already running? + self.emit('startup', message); + } + }); // // to unregister, you simply call.. // AppFramework.addEventListener('user-logout', function() { @@ -310,7 +312,7 @@ Push.Configure = function(options) { // error recovery mechanism // will be called very rarely, but application // should register again when it is called - navigator.mozSetMessageHandler('register', function( /* e */ ) { + navigator.mozSetMessageHandler('register', function(/* e */) { setupAppRegistrations(); }); diff --git a/lib/client/client.js b/lib/client/client.js index 561e84c..ba54af8 100644 --- a/lib/client/client.js +++ b/lib/client/client.js @@ -10,6 +10,7 @@ var addUserId = !!Package['accounts-base']; 2. If not then create an app id 3. Refresh the apn/gcm push token for this app */ + var loadLocalstorage = function() { var data = {}; @@ -17,7 +18,7 @@ var loadLocalstorage = function() { // Get the stored object from local storage data = JSON.parse(localStorage.getItem(localStorageKey)); - } catch (err) { + } catch(err) { // XXX: Error using the local storage } @@ -35,7 +36,7 @@ var saveLocalstorage = function(data) { try { // Try setting the id localStorage.setItem(localStorageKey, JSON.stringify(data)); - } catch (err) { + } catch(err) { // XXX: storage error } }; @@ -152,7 +153,7 @@ initPushUpdates = function(appName) { console.log('Got token:', token); } // The app should be ready, lets call in - reportTokenToServer(token, appName ||  'main'); + reportTokenToServer(token, appName || 'main'); }); // Start listening for user updates if accounts package is added diff --git a/lib/client/cordova.js b/lib/client/cordova.js index 62a01a7..ef0e293 100644 --- a/lib/client/cordova.js +++ b/lib/client/cordova.js @@ -86,11 +86,11 @@ class PushHandle extends EventState { // xxx: check ejson support on "additionalData" json object if (data.additionalData.ejson) { - if (data.additionalData.ejson === '' + data.additionalData.ejson) { + if (data.additionalData.ejson === ''+data.additionalData.ejson) { try { data.payload = EJSON.parse(data.additionalData.ejson); this.log('Push.Parsed.EJSON.Payload:', data.payload); - } catch (err) { + } catch(err) { this.log('Push.Parsed.EJSON.Payload.Error', err.message, data.payload); } } else { diff --git a/lib/common/notifications.js b/lib/common/notifications.js index 7e3bffe..4333382 100644 --- a/lib/common/notifications.js +++ b/lib/common/notifications.js @@ -1,3 +1,4 @@ + // This is the match pattern for tokens _matchToken = Match.OneOf({ apn: String }, { gcm: String }); @@ -69,23 +70,23 @@ Push.send = function(options) { // If current user not set see if we can set it to the logged in user // this will only run on the client if Meteor.userId is available var currentUser = Meteor.isClient && Meteor.userId && Meteor.userId() || - Meteor.isServer && (options.createdBy || '') || null; + Meteor.isServer && (options.createdBy || '') || null; // Rig the notification object - var notification = _.extend({ + var notification = _.extend({ createdAt: new Date(), createdBy: currentUser }, _.pick(options, 'from', 'title', 'text')); - // Add extra - _.extend(notification, _.pick(options, 'payload', 'badge', 'sound', 'notId', 'delayUntil', 'android_channel_id')); + // Add extra + _.extend(notification, _.pick(options, 'payload', 'badge', 'sound', 'notId', 'delayUntil', 'android_channel_id')); if (Match.test(options.apn, Object)) { notification.apn = _.pick(options.apn, 'from', 'title', 'text', 'badge', 'sound', 'notId', 'category'); } if (Match.test(options.gcm, Object)) { - notification.gcm = _.pick(options.gcm, 'image', 'style', 'summaryText', 'picture', 'from', 'title', 'text', 'badge', 'sound', 'notId', 'actions', 'android_channel_id'); + notification.gcm = _.pick(options.gcm, 'image', 'style', 'summaryText', 'picture', 'from', 'title', 'text', 'badge', 'sound', 'notId','actions', 'android_channel_id'); } // Set one token selector, this can be token, array of tokens or query diff --git a/lib/server/push.api.js b/lib/server/push.api.js index 1ad26ea..8ca5152 100644 --- a/lib/server/push.api.js +++ b/lib/server/push.api.js @@ -7,8 +7,8 @@ // getText / getBinary -Push.setBadge = function( /* id, count */ ) { - // throw new Error('Push.setBadge not implemented on the server'); +Push.setBadge = function(/* id, count */) { + // throw new Error('Push.setBadge not implemented on the server'); }; var isConfigured = false; @@ -25,7 +25,7 @@ var sendWorker = function(task, interval) { // xxx: add exponential backoff on error try { task(); - } catch (error) { + } catch(error) { if (typeof Push.Log === 'function') { Push.Log('Push: Error while sending:', error.message); } @@ -89,688 +89,683 @@ var checkConfig = function(config) { // jshint ignore:line }; Push.Configure = function(options) { - checkConfig(options); - var self = this; - options = _.extend({ - sendTimeout: 60000, // Timeout period for notification send - }, options); - // https://npmjs.org/package/apn - - // After requesting the certificate from Apple, export your private key as - // a .p12 file anddownload the .cer file from the iOS Provisioning Portal. - - // gateway.push.apple.com, port 2195 - // gateway.sandbox.push.apple.com, port 2195 - - // Now, in the directory containing cert.cer and key.p12 execute the - // following commands to generate your .pem files: - // $ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem - // $ openssl pkcs12 -in key.p12 -out key.pem -nodes - - // Block multiple calls - if (isConfigured) { - throw new Error('Push.Configure should not be called more than once!'); - } + checkConfig(options); + var self = this; + options = _.extend({ + sendTimeout: 60000, // Timeout period for notification send + }, options); + // https://npmjs.org/package/apn + + // After requesting the certificate from Apple, export your private key as + // a .p12 file anddownload the .cer file from the iOS Provisioning Portal. + + // gateway.push.apple.com, port 2195 + // gateway.sandbox.push.apple.com, port 2195 + + // Now, in the directory containing cert.cer and key.p12 execute the + // following commands to generate your .pem files: + // $ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem + // $ openssl pkcs12 -in key.p12 -out key.pem -nodes + + // Block multiple calls + if (isConfigured) { + throw new Error('Push.Configure should not be called more than once!'); + } - isConfigured = true; + isConfigured = true; - // Add debug info - if (Push.debug) { - console.log('Push.Configure', options); - } + // Add debug info + if (Push.debug) { + console.log('Push.Configure', options); + } - // This function is called when a token is replaced on a device - normally - // this should not happen, but if it does we should take action on it - _replaceToken = function(currentToken, newToken) { - // console.log('Replace token: ' + currentToken + ' -- ' + newToken); - // If the server gets a token event its passing in the current token and - // the new value - if new value is undefined this empty the token - self.emitState('token', currentToken, newToken); - }; + // This function is called when a token is replaced on a device - normally + // this should not happen, but if it does we should take action on it + _replaceToken = function(currentToken, newToken) { + // console.log('Replace token: ' + currentToken + ' -- ' + newToken); + // If the server gets a token event its passing in the current token and + // the new value - if new value is undefined this empty the token + self.emitState('token', currentToken, newToken); + }; - // Rig the removeToken callback - _removeToken = function(token) { - // console.log('Remove token: ' + token); - // Invalidate the token - self.emitState('token', token, null); - }; + // Rig the removeToken callback + _removeToken = function(token) { + // console.log('Remove token: ' + token); + // Invalidate the token + self.emitState('token', token, null); + }; - if (options.apn) { - if (Push.debug) { - console.log('Push: APN configured'); - } + if (options.apn) { + if (Push.debug) { + console.log('Push: APN configured'); + } - // Allow production to be a general option for push notifications - if (options.production === Boolean(options.production)) { - options.apn.production = options.production; - } + // Allow production to be a general option for push notifications + if (options.production === Boolean(options.production)) { + options.apn.production = options.production; + } - // Give the user warnings about development settings - if (options.apn.development) { - // This flag is normally set by the configuration file - console.warn('WARNING: Push APN is using development key and certificate'); - } else { - // We check the apn gateway i the options, we could risk shipping - // server into production while using the production configuration. - // On the other hand we could be in development but using the production - // configuration. And finally we could have configured an unknown apn - // gateway (this could change in the future - but a warning about typos - // can save hours of debugging) - // - // Warn about gateway configurations - it's more a guide - if (options.apn.gateway) { - - if (options.apn.gateway === 'gateway.sandbox.push.apple.com') { - // Using the development sandbox - console.warn('WARNING: Push APN is in development mode'); - } else if (options.apn.gateway === 'gateway.push.apple.com') { - // In production - but warn if we are running on localhost - if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { - console.warn('WARNING: Push APN is configured to production mode - but server is running' + - ' from localhost'); - } + // Give the user warnings about development settings + if (options.apn.development) { + // This flag is normally set by the configuration file + console.warn('WARNING: Push APN is using development key and certificate'); } else { - // Warn about gateways we dont know about - console.warn('WARNING: Push APN unkown gateway "' + options.apn.gateway + '"'); - } + // We check the apn gateway i the options, we could risk shipping + // server into production while using the production configuration. + // On the other hand we could be in development but using the production + // configuration. And finally we could have configured an unknown apn + // gateway (this could change in the future - but a warning about typos + // can save hours of debugging) + // + // Warn about gateway configurations - it's more a guide + if (options.apn.gateway) { + + if (options.apn.gateway === 'gateway.sandbox.push.apple.com') { + // Using the development sandbox + console.warn('WARNING: Push APN is in development mode'); + } else if (options.apn.gateway === 'gateway.push.apple.com') { + // In production - but warn if we are running on localhost + if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { + console.warn('WARNING: Push APN is configured to production mode - but server is running' + + ' from localhost'); + } + } else { + // Warn about gateways we dont know about + console.warn('WARNING: Push APN unkown gateway "' + options.apn.gateway + '"'); + } - } else { - if (options.apn.production) { - if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { - console.warn('WARNING: Push APN is configured to production mode - but server is running' + - ' from localhost'); + } else { + if (options.apn.production) { + if (/http:\/\/localhost/.test(Meteor.absoluteUrl())) { + console.warn('WARNING: Push APN is configured to production mode - but server is running' + + ' from localhost'); + } + } else { + console.warn('WARNING: Push APN is in development mode'); + } } - } else { - console.warn('WARNING: Push APN is in development mode'); - } - } - } + } - // Check certificate data - if (!options.apn.cert || !options.apn.cert.length) { - console.error('ERROR: Push server could not find certData'); - } + // Check certificate data + if (!options.apn.cert || !options.apn.cert.length) { + console.error('ERROR: Push server could not find certData'); + } - // Check key data - if (!options.apn.key || !options.apn.key.length) { - console.error('ERROR: Push server could not find keyData'); - } + // Check key data + if (!options.apn.key || !options.apn.key.length) + console.error('ERROR: Push server could not find keyData'); + } - // Rig apn connection - var apn = Npm.require('apn'); - var apnProvider = new apn.Provider(options.apn); - // // Listen to transmission errors - should handle the same way as feedback. - // apnConnection.on('transmissionError', Meteor.bindEnvironment(function (errCode, notification, recipient) { - // if (Push.debug) { - // console.log('Got error code %d for token %s', errCode, notification.token); - // } - // if ([2, 5, 8].indexOf(errCode) >= 0) { - - - // // Invalid token errors... - // _removeToken({ - // apn: notification.token - // }); - // } - // })); - // XXX: should we do a test of the connection? It would be nice to know - // That the server/certificates/network are correct configured - - // apnConnection.connect().then(function() { - // console.info('CHECK: Push APN connection OK'); - // }, function(err) { - // console.warn('CHECK: Push APN connection FAILURE'); - // }); - // Note: the above code spoils the connection - investigate how to - // shutdown/close it. - - self.sendAPN = function(userToken, notification) { - if (Match.test(notification.apn, Object)) { - notification = _.extend({}, notification, notification.apn); - } + // Rig apn connection + var apn = Npm.require('apn'); + var apnProvider = new apn.Provider(options.apn); + + // Listen to transmission errors - should handle the same way as feedback. + // apnConnection.on('transmissionError', Meteor.bindEnvironment(function (errCode, notification, recipient) { + // if (Push.debug) { + // console.log('Got error code %d for token %s', errCode, notification.token); + // } + // if ([2, 5, 8].indexOf(errCode) >= 0) { + + + // // Invalid token errors... + // _removeToken({ + // apn: notification.token + // }); + // } + // })); + // XXX: should we do a test of the connection? It would be nice to know + // That the server/certificates/network are correct configured + + // apnConnection.connect().then(function() { + // console.info('CHECK: Push APN connection OK'); + // }, function(err) { + // console.warn('CHECK: Push APN connection FAILURE'); + // }); + // Note: the above code spoils the connection - investigate how to + // shutdown/close it. + + self.sendAPN = function(userToken, notification) { + if (Match.test(notification.apn, Object)) { + notification = _.extend({}, notification, notification.apn); + } - // console.log('sendAPN', notification.from, userToken, notification.title, notification.text, - // notification.badge, notification.priority); - var priority = (notification.priority || notification.priority === 0) ? notification.priority : 10; + // console.log('sendAPN', notification.from, userToken, notification.title, notification.text, + // notification.badge, notification.priority); + var priority = (notification.priority || notification.priority === 0)? notification.priority : 10; + var note = new apn.Notification(); - var note = new apn.Notification(); + note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now. + if (typeof notification.badge !== 'undefined') { + note.badge = notification.badge; + } + if (typeof notification.sound !== 'undefined') { + note.sound = notification.sound; + } + //console.log(notification.contentAvailable); + //console.log("lala2"); + //console.log(notification); + if (typeof notification.contentAvailable !== 'undefined') { + //console.log("lala"); + note.setContentAvailable(notification.contentAvailable); + //console.log(note); + } - note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now. - if (typeof notification.badge !== 'undefined') { - note.badge = notification.badge; - } - if (typeof notification.sound !== 'undefined') { - note.sound = notification.sound; - } - if (typeof notification.contentAvailable !== 'undefined') { - note.contentAvailable = notification.contentAvailable; - } + // adds category support for iOS8 custom actions as described here: + // https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/ + // RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW36 + if (typeof notification.category !== 'undefined') { + note.category = notification.category; + } - // adds category support for iOS8 custom actions as described here: - // https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/ - // RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW36 - if (typeof notification.category !== 'undefined') { - note.category = notification.category; - } + note.alert = { + body: notification.text + }; - note.alert = { - body: notification.text, - }; + if (typeof notification.title !== 'undefined') { + note.aps.alert.title = notification.title; + } - if (typeof notification.title !== 'undefined') { - note.aps.alert.title = notification.title; - } - note.topic = notification.topic; - // Allow the user to set payload data - note.payload = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; + note.topic = notification.topic; + // Allow the user to set payload data + note.payload = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; - note.payload.messageFrom = notification.from; - note.priority = priority; + note.payload.messageFrom = notification.from; + note.priority = priority; - // Store the token on the note so we can reference it if there was an error - note.token = userToken; - if (Push.debug) { - console.log('notification obejct for apn' + note); - } - // console.log('I:Send message to: ' + userToken + ' count=' + count); - apnProvider.send(note, userToken).then((result) => { - if (result.failed && result.failed.length > 0) { - if (result.failed[0].response.result === 'BadDeviceToken') { - _removeToken({ - apn: userToken - }); - } else { - console.error(JSON.stringify(result, undefined, 2)); - } - } - }); - }; + // Store the token on the note so we can reference it if there was an error + note.token = userToken; - } // EO ios notification + // console.log('I:Send message to: ' + userToken + ' count=' + count); - if (options.gcm && options.gcm.apiKey) { - if (Push.debug) { - console.log('GCM configured'); - } - //self.sendGCM = function(options.from, userTokens, options.title, options.text, options.badge, options.priority) { - self.sendGCM = function(userTokens, notification) { - if (Match.test(notification.gcm, Object)) { - notification = _.extend({}, notification, notification.gcm); - } - - // Make sure userTokens are an array of strings - if (userTokens === '' + userTokens) { - userTokens = [userTokens]; - } + apnProvider.send(note, userToken).then((result) => { + if (result.failed && result.failed.length > 0 && result.failed[0].response.result === 'BadDeviceToken') { + _removeToken({ + apn: userToken + }); + } else { + console.error(JSON.stringify(result, undefined, 2)); + } + }); + }; + } // EO ios notification - // Check if any tokens in there to send - if (!userTokens.length) { + if (options.gcm && options.gcm.apiKey) { if (Push.debug) { - console.log('sendGCM no push tokens found'); + console.log('GCM configured'); } - return; - } - - if (Push.debug) { - console.log('sendGCM', userTokens, notification); - } - - var gcm = Npm.require('node-gcm'); - var Fiber = Npm.require('fibers'); + //self.sendGCM = function(options.from, userTokens, options.title, options.text, options.badge, options.priority) { + self.sendGCM = function(userTokens, notification) { + if (Match.test(notification.gcm, Object)) { + notification = _.extend({}, notification, notification.gcm); + } - // Allow user to set payload - var data = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; + // Make sure userTokens are an array of strings + if (userTokens === ''+userTokens) { + userTokens = [userTokens]; + } - data.title = notification.title; - data.message = notification.text; + // Check if any tokens in there to send + if (!userTokens.length) { + if (Push.debug) { + console.log('sendGCM no push tokens found'); + } + return; + } - // Set image - if (typeof notification.image !== 'undefined') { - data.image = notification.image; - } + if (Push.debug) { + console.log('sendGCM', userTokens, notification); + } - if (typeof notification.android_channel_id !== 'undefined') { - data.android_channel_id = notification.android_channel_id; - } else if (Push.debug) { - console.warn(`For devices running Android 8.0 or later you are required to provide an android_channel_id. See https://github.com/raix/push/issues/341 for more info`); - } + var gcm = Npm.require('node-gcm'); + var Fiber = Npm.require('fibers'); - // Set extra details - if (typeof notification.badge !== 'undefined') { - data.msgcnt = notification.badge; - } - if (typeof notification.sound !== 'undefined') { - data.soundname = notification.sound; - } - if (typeof notification.notId !== 'undefined') { - data.notId = notification.notId; - } - if (typeof notification.style !== 'undefined') { - data.style = notification.style; - } - if (typeof notification.summaryText !== 'undefined') { - data.summaryText = notification.summaryText; - } - if (typeof notification.picture !== 'undefined') { - data.picture = notification.picture; - } + // Allow user to set payload + var data = (notification.payload) ? { ejson: EJSON.stringify(notification.payload) } : {}; - //Action Buttons - if (typeof notification.actions !== 'undefined') { - data.actions = notification.actions; - } + data.title = notification.title; + data.message = notification.text; - //Force Start - if (typeof notification.forceStart !== 'undefined') { - data['force-start'] = notification.forceStart; - } - if (typeof notification.contentAvailable !== 'undefined') { - data['content-available'] = notification.contentAvailable; - } - - //var message = new gcm.Message(); - var message = new gcm.Message({ - collapseKey: notification.from, - // delayWhileIdle: true, - // timeToLive: 4, - // restricted_package_name: 'dk.gi2.app' - data: data - }); + // Set image + if(typeof notification.image !== 'undefined') { + data.image = notification.image; + } - if (Push.debug) { - console.log('Create GCM Sender using "' + options.gcm.apiKey + '"'); - } - var sender = new gcm.Sender(options.gcm.apiKey); + if(typeof notification.android_channel_id !== 'undefined') { + data.android_channel_id = notification.android_channel_id; + } + else if(Push.debug) { + console.warn(`For devices running Android 8.0 or later you are required to provide an android_channel_id. See https://github.com/raix/push/issues/341 for more info`); + } - _.each(userTokens, function(value /*, key */ ) { - if (Push.debug) { - console.log('A:Send message to: ' + value); - } - }); + // Set extra details + if (typeof notification.badge !== 'undefined') { + data.msgcnt = notification.badge; + } + if (typeof notification.sound !== 'undefined') { + data.soundname = notification.sound; + } + if (typeof notification.notId !== 'undefined') { + data.notId = notification.notId; + } + if(typeof notification.style !== 'undefined') { + data.style = notification.style; + } + if(typeof notification.summaryText !== 'undefined') { + data.summaryText = notification.summaryText; + } + if(typeof notification.picture !== 'undefined') { + data.picture = notification.picture; + } - /*message.addData('title', title); - message.addData('message', text); - message.addData('msgcnt', '1'); - message.collapseKey = 'sitDrift'; - message.delayWhileIdle = true; - message.timeToLive = 3;*/ + //Action Buttons + if(typeof notification.actions !== 'undefined') { + data.actions = notification.actions; + } - // /** - // * Parameters: message-literal, userTokens-array, No. of retries, callback-function - // */ + //Force Start + if(typeof notification.forceStart !== 'undefined') { + data['force-start'] = notification.forceStart; + } + if(typeof notification.contentAvailable !== 'undefined') { + data['content-available'] = notification.contentAvailable; + } - var userToken = (userTokens.length === 1) ? userTokens[0] : null; + //var message = new gcm.Message(); + var message = new gcm.Message({ + collapseKey: notification.from, + // delayWhileIdle: true, + // timeToLive: 4, + // restricted_package_name: 'dk.gi2.app' + data: data + }); - sender.send(message, userTokens, 5, function(err, result) { - if (err) { - if (Push.debug) { - console.log('ANDROID ERROR: result of sender: ' + result); - } - } else { - if (result === null) { if (Push.debug) { - console.log('ANDROID: Result of sender is null'); + console.log('Create GCM Sender using "' + options.gcm.apiKey + '"'); } - return; - } - if (Push.debug) { - console.log('ANDROID: Result of sender: ' + JSON.stringify(result)); - } - if (result.canonical_ids === 1 && userToken) { // jshint ignore:line - - // This is an old device, token is replaced - Fiber(function(self) { - // Run in fiber - try { - self.callback(self.oldToken, self.newToken); - } catch (err) { + var sender = new gcm.Sender(options.gcm.apiKey); - } + _.each(userTokens, function(value /*, key */) { + if (Push.debug) { + console.log('A:Send message to: ' + value); + } + }); - }).run({ - oldToken: { gcm: userToken }, - newToken: { gcm: result.results[0].registration_id }, // jshint ignore:line - callback: _replaceToken + /*message.addData('title', title); + message.addData('message', text); + message.addData('msgcnt', '1'); + message.collapseKey = 'sitDrift'; + message.delayWhileIdle = true; + message.timeToLive = 3;*/ + + // /** + // * Parameters: message-literal, userTokens-array, No. of retries, callback-function + // */ + + var userToken = (userTokens.length === 1)?userTokens[0]:null; + + sender.send(message, userTokens, 5, function (err, result) { + if (err) { + if (Push.debug) { + console.log('ANDROID ERROR: result of sender: ' + result); + } + } else { + if (result === null) { + if (Push.debug) { + console.log('ANDROID: Result of sender is null'); + } + return; + } + if (Push.debug) { + console.log('ANDROID: Result of sender: ' + JSON.stringify(result)); + } + if (result.canonical_ids === 1 && userToken) { // jshint ignore:line + + // This is an old device, token is replaced + Fiber(function(self) { + // Run in fiber + try { + self.callback(self.oldToken, self.newToken); + } catch(err) { + + } + + }).run({ + oldToken: { gcm: userToken }, + newToken: { gcm: result.results[0].registration_id }, // jshint ignore:line + callback: _replaceToken + }); + //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); + + } + // We cant send to that token - might not be registred + // ask the user to remove the token from the list + if (result.failure !== 0 && userToken) { + + // This is an old device, token is replaced + Fiber(function(self) { + // Run in fiber + try { + self.callback(self.token); + } catch(err) { + + } + + }).run({ + token: { gcm: userToken }, + callback: _removeToken + }); + //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); + + } + + } }); - //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); + // /** Use the following line if you want to send the message without retries + // sender.sendNoRetry(message, userTokens, function (result) { + // console.log('ANDROID: ' + JSON.stringify(result)); + // }); + // **/ + }; // EO sendAndroid - } - // We cant send to that token - might not be registred - // ask the user to remove the token from the list - if (result.failure !== 0 && userToken) { + } // EO Android - // This is an old device, token is replaced - Fiber(function(self) { - // Run in fiber - try { - self.callback(self.token); - } catch (err) { + // Universal send function + var _querySend = function(query, options) { - } + var countApn = []; + var countGcm = []; - }).run({ - token: { gcm: userToken }, - callback: _removeToken - }); - //_replaceToken({ gcm: userToken }, { gcm: result.results[0].registration_id }); + Push.appCollection.find(query).forEach(function(app) { + if (Push.debug) { + console.log('send to token', app.token); } - } - }); - // /** Use the following line if you want to send the message without retries - // sender.sendNoRetry(message, userTokens, function (result) { - // console.log('ANDROID: ' + JSON.stringify(result)); - // }); - // **/ - }; // EO sendAndroid - - } // EO Android + if (app.token.apn) { + countApn.push(app._id); + // Send to APN + if (self.sendAPN) { + self.sendAPN(app.token.apn, options); + } + + } else if (app.token.gcm) { + countGcm.push(app._id); + + // Send to GCM + // We do support multiple here - so we should construct an array + // and send it bulk - Investigate limit count of id's + if (self.sendGCM) { + self.sendGCM(app.token.gcm, options); + } + + } else { + throw new Error('Push.send got a faulty query'); + } - // Universal send function - var _querySend = function(query, options) { + }); - var countApn = []; - var countGcm = []; + if (Push.debug) { - Push.appCollection.find(query).forEach(function(app) { + console.log('Push: Sent message "' + options.title + '" to ' + countApn.length + ' ios apps ' + + countGcm.length + ' android apps'); - if (Push.debug) { - console.log('send to token', app.token); - } + // Add some verbosity about the send result, making sure the developer + // understands what just happened. + if (!countApn.length && !countGcm.length) { + if (Push.appCollection.find().count() === 0) { + console.log('Push, GUIDE: The "Push.appCollection" is empty -' + + ' No clients have registred on the server yet...'); + } + } else if (!countApn.length) { + if (Push.appCollection.find({ 'token.apn': { $exists: true } }).count() === 0) { + console.log('Push, GUIDE: The "Push.appCollection" - No APN clients have registred on the server yet...'); + } + } else if (!countGcm.length) { + if (Push.appCollection.find({ 'token.gcm': { $exists: true } }).count() === 0) { + console.log('Push, GUIDE: The "Push.appCollection" - No GCM clients have registred on the server yet...'); + } + } - if (app.token.apn) { - countApn.push(app._id); - // Send to APN - if (self.sendAPN) { - self.sendAPN(app.token.apn, options); } - } else if (app.token.gcm) { - countGcm.push(app._id); + return { + apn: countApn, + gcm: countGcm + }; + }; - // Send to GCM - // We do support multiple here - so we should construct an array - // and send it bulk - Investigate limit count of id's - if (self.sendGCM) { - self.sendGCM(app.token.gcm, options); - } + self.serverSend = function(options) { + options = options || { badge: 0 }; + var query; - } else { - throw new Error('Push.send got a faulty query'); + // Check basic options + if (options.from !== ''+options.from) { + throw new Error('Push.send: option "from" not a string'); } - }); - - if (Push.debug) { - - console.log('Push: Sent message "' + options.title + '" to ' + countApn.length + ' ios apps ' + - countGcm.length + ' android apps'); - - // Add some verbosity about the send result, making sure the developer - // understands what just happened. - if (!countApn.length && !countGcm.length) { - if (Push.appCollection.find().count() === 0) { - console.log('Push, GUIDE: The "Push.appCollection" is empty -' + - ' No clients have registred on the server yet...'); - } - } else if (!countApn.length) { - if (Push.appCollection.find({ 'token.apn': { $exists: true } }).count() === 0) { - console.log('Push, GUIDE: The "Push.appCollection" - No APN clients have registred on the server yet...'); - } - } else if (!countGcm.length) { - if (Push.appCollection.find({ 'token.gcm': { $exists: true } }).count() === 0) { - console.log('Push, GUIDE: The "Push.appCollection" - No GCM clients have registred on the server yet...'); - } + if (options.title !== ''+options.title) { + throw new Error('Push.send: option "title" not a string'); } - } - - return { - apn: countApn, - gcm: countGcm - }; - }; - - self.serverSend = function(options) { - options = options || { badge: 0 }; - var query; - - // Check basic options - if (options.from !== '' + options.from) { - throw new Error('Push.send: option "from" not a string'); - } - - if (options.title !== '' + options.title) { - throw new Error('Push.send: option "title" not a string'); - } - - if (options.text !== '' + options.text) { - throw new Error('Push.send: option "text" not a string'); - } + if (options.text !== ''+options.text) { + throw new Error('Push.send: option "text" not a string'); + } - if (options.token || options.tokens) { + if (options.token || options.tokens) { - // The user set one token or array of tokens - var tokenList = (options.token) ? [options.token] : options.tokens; + // The user set one token or array of tokens + var tokenList = (options.token)? [options.token] : options.tokens; - if (Push.debug) { - console.log('Push: Send message "' + options.title + '" via token(s)', tokenList); - } + if (Push.debug) { + console.log('Push: Send message "' + options.title + '" via token(s)', tokenList); + } - query = { - $or: [ - // XXX: Test this query: can we hand in a list of push tokens? - { - $and: [ - { token: { $in: tokenList } }, - // And is not disabled - { enabled: { $ne: false } } - ] - }, - // XXX: Test this query: does this work on app id? - { - $and: [ - { _id: { $in: tokenList } }, // one of the app ids - { - $or: [ - { 'token.apn': { $exists: true } }, // got apn token - { 'token.gcm': { $exists: true } } // got gcm token + query = { + $or: [ + // XXX: Test this query: can we hand in a list of push tokens? + { $and: [ + { token: { $in: tokenList } }, + // And is not disabled + { enabled: { $ne: false }} ] }, - // And is not disabled - { enabled: { $ne: false } } - ] - } - ] - }; + // XXX: Test this query: does this work on app id? + { $and: [ + { _id: { $in: tokenList } }, // one of the app ids + { $or: [ + { 'token.apn': { $exists: true } }, // got apn token + { 'token.gcm': { $exists: true } } // got gcm token + ]}, + // And is not disabled + { enabled: { $ne: false }} + ] + } + ] + }; - } else if (options.query) { + } else if (options.query) { - if (Push.debug) { - console.log('Push: Send message "' + options.title + '" via query', options.query); - } + if (Push.debug) { + console.log('Push: Send message "' + options.title + '" via query', options.query); + } - query = { - $and: [ - options.query, // query object - { - $or: [ - { 'token.apn': { $exists: true } }, // got apn token - { 'token.gcm': { $exists: true } } // got gcm token - ] - }, - // And is not disabled - { enabled: { $ne: false } } - ] - }; - } + query = { + $and: [ + options.query, // query object + { $or: [ + { 'token.apn': { $exists: true } }, // got apn token + { 'token.gcm': { $exists: true } } // got gcm token + ]}, + // And is not disabled + { enabled: { $ne: false }} + ] + }; + } - if (query) { + if (query) { - // Convert to querySend and return status - return _querySend(query, options); + // Convert to querySend and return status + return _querySend(query, options); - } else { - throw new Error('Push.send: please set option "token"/"tokens" or "query"'); - } + } else { + throw new Error('Push.send: please set option "token"/"tokens" or "query"'); + } - }; - - - // This interval will allow only one notification to be sent at a time, it - // will check for new notifications at every `options.sendInterval` - // (default interval is 15000 ms) - // - // It looks in notifications collection to see if theres any pending - // notifications, if so it will try to reserve the pending notification. - // If successfully reserved the send is started. - // - // If notification.query is type string, it's assumed to be a json string - // version of the query selector. Making it able to carry `$` properties in - // the mongo collection. - // - // Pr. default notifications are removed from the collection after send have - // completed. Setting `options.keepNotifications` will update and keep the - // notification eg. if needed for historical reasons. - // - // After the send have completed a "send" event will be emitted with a - // status object containing notification id and the send result object. - // - var isSendingNotification = false; - - if (options.sendInterval !== null) { - - // This will require index since we sort notifications by createdAt - Push.notifications._ensureIndex({ createdAt: 1 }); - Push.notifications._ensureIndex({ sent: 1 }); - Push.notifications._ensureIndex({ sending: 1 }); - Push.notifications._ensureIndex({ delayUntil: 1 }); - - var sendNotification = function(notification) { - // Reserve notification - var now = +new Date(); - var timeoutAt = now + options.sendTimeout; - var reserved = Push.notifications.update({ - _id: notification._id, - sent: false, // xxx: need to make sure this is set on create - sending: { $lt: now }, - }, { - $set: { - sending: timeoutAt, - } - }); + }; - // Make sure we only handle notifications reserved by this - // instance - if (reserved) { - // Check if query is set and is type String - if (notification.query && notification.query === '' + notification.query) { - try { - // The query is in string json format - we need to parse it - notification.query = JSON.parse(notification.query); - } catch (err) { - // Did the user tamper with this?? - throw new Error('Push: Error while parsing query string, Error: ' + err.message); + // This interval will allow only one notification to be sent at a time, it + // will check for new notifications at every `options.sendInterval` + // (default interval is 15000 ms) + // + // It looks in notifications collection to see if theres any pending + // notifications, if so it will try to reserve the pending notification. + // If successfully reserved the send is started. + // + // If notification.query is type string, it's assumed to be a json string + // version of the query selector. Making it able to carry `$` properties in + // the mongo collection. + // + // Pr. default notifications are removed from the collection after send have + // completed. Setting `options.keepNotifications` will update and keep the + // notification eg. if needed for historical reasons. + // + // After the send have completed a "send" event will be emitted with a + // status object containing notification id and the send result object. + // + var isSendingNotification = false; + + if (options.sendInterval !== null) { + + // This will require index since we sort notifications by createdAt + Push.notifications._ensureIndex({ createdAt: 1 }); + Push.notifications._ensureIndex({ sent: 1 }); + Push.notifications._ensureIndex({ sending: 1 }); + Push.notifications._ensureIndex({ delayUntil: 1 }); + + var sendNotification = function(notification) { + // Reserve notification + var now = +new Date(); + var timeoutAt = now + options.sendTimeout; + var reserved = Push.notifications.update({ + _id: notification._id, + sent: false, // xxx: need to make sure this is set on create + sending: { $lt: now }, + }, + { + $set: { + sending: timeoutAt, } - } - - // Send the notification - var result = Push.serverSend(notification); - - if (!options.keepNotifications) { - // Pr. Default we will remove notifications - Push.notifications.remove({ _id: notification._id }); - } else { + }); - // Update the notification - Push.notifications.update({ _id: notification._id }, { - $set: { - // Mark as sent - sent: true, - // Set the sent date - sentAt: new Date(), - // Count - count: result, - // Not being sent anymore - sending: 0 + // Make sure we only handle notifications reserved by this + // instance + if (reserved) { + + // Check if query is set and is type String + if (notification.query && notification.query === ''+notification.query) { + try { + // The query is in string json format - we need to parse it + notification.query = JSON.parse(notification.query); + } catch(err) { + // Did the user tamper with this?? + throw new Error('Push: Error while parsing query string, Error: ' + err.message); } - }); + } - } + // Send the notification + var result = Push.serverSend(notification); - // Emit the send - self.emit('send', { notification: notification._id, result: result }); + if (!options.keepNotifications) { + // Pr. Default we will remove notifications + Push.notifications.remove({ _id: notification._id }); + } else { - } // Else could not reserve - }; // EO sendNotification + // Update the notification + Push.notifications.update({ _id: notification._id }, { + $set: { + // Mark as sent + sent: true, + // Set the sent date + sentAt: new Date(), + // Count + count: result, + // Not being sent anymore + sending: 0 + } + }); - sendWorker(function() { + } - if (isSendingNotification) { - return; - } + // Emit the send + self.emit('send', { notification: notification._id, result: result }); - try { + } // Else could not reserve + }; // EO sendNotification - // Set send fence - isSendingNotification = true; + sendWorker(function() { - // var countSent = 0; - var batchSize = options.sendBatchSize || 1; + if (isSendingNotification) { + return; + } - var now = +new Date(); + try { - // Find notifications that are not being or already sent - var pendingNotifications = Push.notifications.find({ - $and: [ - // Message is not sent - { sent: false }, - // And not being sent by other instances - { sending: { $lt: now } }, - // And not queued for future - { - $or: [ - { delayUntil: { $exists: false } }, - { delayUntil: { $lte: new Date() } } - ] - } - ] - }, { - // Sort by created date - sort: { createdAt: 1 }, - limit: batchSize - }); + // Set send fence + isSendingNotification = true; + + // var countSent = 0; + var batchSize = options.sendBatchSize || 1; + + var now = +new Date(); + + // Find notifications that are not being or already sent + var pendingNotifications = Push.notifications.find({ $and: [ + // Message is not sent + { sent : false }, + // And not being sent by other instances + { sending: { $lt: now } }, + // And not queued for future + { $or: [ + { delayUntil: { $exists: false } }, + { delayUntil: { $lte: new Date() } } + ] + } + ]}, { + // Sort by created date + sort: { createdAt: 1 }, + limit: batchSize + }); + + pendingNotifications.forEach(function(notification) { + try { + sendNotification(notification); + } catch(error) { + if (typeof Push.Log === 'function') { + Push.Log('Push: Could not send notification id: "' + notification._id + '", Error:', error.message); + } + if (Push.debug) { + console.log('Push: Could not send notification id: "' + notification._id + '", Error: ' + error.message); + } + } + }); // EO forEach + } finally { - pendingNotifications.forEach(function(notification) { - try { - sendNotification(notification); - } catch (error) { - if (typeof Push.Log === 'function') { - Push.Log('Push: Could not send notification id: "' + notification._id + '", Error:', error.message); - } - if (Push.debug) { - console.log('Push: Could not send notification id: "' + notification._id + '", Error: ' + error.message); - } + // Remove the send fence + isSendingNotification = false; } - }); // EO forEach - } finally { + }, options.sendInterval || 15000); // Default every 15th sec - // Remove the send fence - isSendingNotification = false; + } else { + if (Push.debug) { + console.log('Push: Send server is disabled'); } - }, options.sendInterval || 15000); // Default every 15th sec - - } else { - if (Push.debug) { - console.log('Push: Send server is disabled'); } - } }; From d4df4309c4d24c539b6405751b41d8f59e370186 Mon Sep 17 00:00:00 2001 From: MrSpark2591 Date: Wed, 13 May 2020 11:35:31 +0530 Subject: [PATCH 05/14] docs(readme): updated readme about breaking changes and configs --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 782eff7..c623ad3 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ Status: We are using [semantic-release](https://github.com/semantic-release/semantic-release) following the [AngularJS Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) - Following this pattern will result in better versioning, better changelog and shorter release cycle. +## breaking changes in 4.X.X +If you are using apn options and upgrading from any lower version. You have to make changes in config of apn updated configs + ## Updates For Android 8.0 Meteor must be version 1.6.1 @@ -180,7 +183,34 @@ App.configurePlugin('phonegap-plugin-push', { ### Server -For example in `Meteor.startup()` block of main.js +For example in `Meteor.startup()` block of main.js. *Version 4.0.0 and above* + +```js +Push.Configure({ + apn: { + cert: Assets.getText('apnDevCert.pem'), + key: Assets.getText('apnDevKey.pem'), + passphrase: 'xxxxxxxxx', + production: true, + topic: 'com.your.app.identifier' + //gateway: 'gateway.push.apple.com', + }, + gcm: { + apiKey: 'xxxxxxx', // GCM/FCM server key + } + // production: true, + // 'sound' true, + // 'badge' true, + // 'alert' true, + // 'vibrate' true, + // 'sendInterval': 15000, Configurable interval between sending + // 'sendBatchSize': 1, Configurable number of notifications to send per batch + // 'keepNotifications': false, +// +}); +``` + +For example in `Meteor.startup()` block of main.js. *Version 3.0.2 and below* ```js Push.Configure({ From 635ff304cefa13d7f5e873dc9a284533a1743f82 Mon Sep 17 00:00:00 2001 From: MrSpark2591 Date: Wed, 13 May 2020 11:37:56 +0530 Subject: [PATCH 06/14] docs(readme): doc improvment --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c623ad3..c48e992 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Status: We are using [semantic-release](https://github.com/semantic-release/semantic-release) following the [AngularJS Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) - Following this pattern will result in better versioning, better changelog and shorter release cycle. ## breaking changes in 4.X.X -If you are using apn options and upgrading from any lower version. You have to make changes in config of apn updated configs +If you are using apn options and upgrading from any lower version. You have to make changes in config of apn. New configs are listed below. ## Updates For Android 8.0 @@ -192,7 +192,7 @@ Push.Configure({ key: Assets.getText('apnDevKey.pem'), passphrase: 'xxxxxxxxx', production: true, - topic: 'com.your.app.identifier' + topic: 'com.your.app.identifier' //required //gateway: 'gateway.push.apple.com', }, gcm: { From a4d876addeb26030f4ec15a0bd35108c9d6b015a Mon Sep 17 00:00:00 2001 From: MrSpark2591 Date: Wed, 13 May 2020 11:45:00 +0530 Subject: [PATCH 07/14] docs(readme): doc improvment --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c48e992..9daaa5e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,9 @@ Status: We are using [semantic-release](https://github.com/semantic-release/semantic-release) following the [AngularJS Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) - Following this pattern will result in better versioning, better changelog and shorter release cycle. -## breaking changes in 4.X.X +```diff +- ## Breaking changes in 4.X.X +``` If you are using apn options and upgrading from any lower version. You have to make changes in config of apn. New configs are listed below. ## Updates For Android 8.0 From 1d6264f162838160a55cff2d14bba96a829c48af Mon Sep 17 00:00:00 2001 From: MrSpark2591 Date: Wed, 13 May 2020 11:45:29 +0530 Subject: [PATCH 08/14] docs(readme): doc improvment --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9daaa5e..72ac180 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ Status: We are using [semantic-release](https://github.com/semantic-release/semantic-release) following the [AngularJS Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit) - Following this pattern will result in better versioning, better changelog and shorter release cycle. -```diff -- ## Breaking changes in 4.X.X -``` + +## Breaking changes in 4.X.X + If you are using apn options and upgrading from any lower version. You have to make changes in config of apn. New configs are listed below. ## Updates For Android 8.0 From 47b9ec69f1be4c3f165e5e3656147df5ddccf7db Mon Sep 17 00:00:00 2001 From: Shivang Date: Wed, 30 Sep 2020 01:36:37 +0530 Subject: [PATCH 09/14] Changed package dependecy names --- package.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.js b/package.js index 2ef9689..305c2be 100644 --- a/package.js +++ b/package.js @@ -1,8 +1,8 @@ Package.describe({ - name: 'raix:push', - version: '0.0.0-semantic-release', + name: 'shivangkar:push', + version: '1.0.0', summary: 'Isomorphic Push notifications for APN and GCM', - git: 'https://github.com/raix/push.git' + git: 'https://github.com/shivang007/push.git' }); // Server-side push deps @@ -44,7 +44,7 @@ Package.onUse(function (api) { ], ['client', 'server'], { weak: true }); api.use([ - 'raix:eventstate@0.0.5', + 'shivangkar:eventstate@0.0.5', 'check', 'mongo', 'underscore', From 2c22013e767abc875e22b730b270f4e20b00e1de Mon Sep 17 00:00:00 2001 From: Shivang Date: Wed, 30 Sep 2020 01:58:29 +0530 Subject: [PATCH 10/14] Added missing bracket --- .versions | 95 +++++++++++++++++++++--------------------- lib/server/push.api.js | 2 +- package.js | 4 +- 3 files changed, 50 insertions(+), 51 deletions(-) diff --git a/.versions b/.versions index 4564c0f..925ddc4 100644 --- a/.versions +++ b/.versions @@ -1,49 +1,48 @@ -allow-deny@1.0.5 -babel-compiler@6.8.4 -babel-runtime@0.1.9_1 -base64@1.0.9 -binary-heap@1.0.9 -blaze@2.1.8 -blaze-tools@1.0.9 -boilerplate-generator@1.0.9 -callback-hook@1.0.9 -check@1.2.3 -ddp@1.2.5 -ddp-client@1.2.9 -ddp-common@1.2.6 -ddp-server@1.2.9 -deps@1.0.12 -diff-sequence@1.0.6 -ecmascript@0.4.7 -ecmascript-runtime@0.2.12 -ejson@1.0.12 -geojson-utils@1.0.9 -html-tools@1.0.10 -htmljs@1.0.10 -id-map@1.0.8 -jquery@1.11.9 -logging@1.0.14 -meteor@1.1.16 -minimongo@1.0.17 -modules@0.6.5 -modules-runtime@0.6.5 -mongo@1.1.9_1 -mongo-id@1.0.5 -npm-mongo@1.4.45 -observe-sequence@1.0.12 -ordered-dict@1.0.8 -promise@0.7.3 -raix:eventemitter@0.1.3 -raix:eventstate@0.0.2 -raix:push@3.1.0-pre.1 -random@1.0.10 -reactive-var@1.0.10 -retry@1.0.8 -routepolicy@1.0.11 -spacebars@1.0.12 -spacebars-compiler@1.0.12 -tracker@1.0.14 -ui@1.0.11 -underscore@1.0.9 -webapp@1.2.10 +allow-deny@1.1.0 +babel-compiler@7.5.3 +babel-runtime@1.5.0 +base64@1.0.12 +binary-heap@1.0.11 +boilerplate-generator@1.7.1 +callback-hook@1.3.0 +check@1.3.1 +ddp@1.4.0 +ddp-client@2.3.3 +ddp-common@1.4.0 +ddp-server@2.3.2 +diff-sequence@1.1.1 +dynamic-import@0.5.2 +ecmascript@0.14.3 +ecmascript-runtime@0.7.0 +ecmascript-runtime-client@0.11.0 +ecmascript-runtime-server@0.10.0 +ejson@1.1.1 +fetch@0.1.1 +geojson-utils@1.0.10 +id-map@1.1.0 +inter-process-messaging@0.1.1 +logging@1.1.20 +meteor@1.9.3 +minimongo@1.6.0 +modern-browsers@0.1.5 +modules@0.15.0 +modules-runtime@0.12.0 +mongo@1.10.0 +mongo-decimal@0.1.1 +mongo-dev-server@1.1.0 +mongo-id@1.0.7 +npm-mongo@3.8.1 +ordered-dict@1.1.0 +promise@0.11.2 +random@1.2.0 +reload@1.3.0 +retry@1.1.0 +routepolicy@1.1.0 +shivangkar:eventemitter@1.0.0 +shivangkar:eventstate@1.0.0 +shivangkar:push@1.0.1 +socket-stream-client@0.3.1 +tracker@1.2.0 +underscore@1.0.10 +webapp@1.9.1 webapp-hashing@1.0.9 diff --git a/lib/server/push.api.js b/lib/server/push.api.js index 8ca5152..eacfc11 100644 --- a/lib/server/push.api.js +++ b/lib/server/push.api.js @@ -194,7 +194,7 @@ Push.Configure = function(options) { } // Check key data - if (!options.apn.key || !options.apn.key.length) + if (!options.apn.key || !options.apn.key.length) { console.error('ERROR: Push server could not find keyData'); } diff --git a/package.js b/package.js index 305c2be..48a93f2 100644 --- a/package.js +++ b/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'shivangkar:push', - version: '1.0.0', + version: '1.0.2', summary: 'Isomorphic Push notifications for APN and GCM', git: 'https://github.com/shivang007/push.git' }); @@ -44,7 +44,7 @@ Package.onUse(function (api) { ], ['client', 'server'], { weak: true }); api.use([ - 'shivangkar:eventstate@0.0.5', + 'shivangkar:eventstate@1.0.0', 'check', 'mongo', 'underscore', From bf0880ee9a12c20b3225075044e6df65cb644a04 Mon Sep 17 00:00:00 2001 From: Dhaval chaudhary Date: Tue, 26 Oct 2021 16:15:40 +0530 Subject: [PATCH 11/14] api version upgrade --- package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.js b/package.js index 48a93f2..067249e 100644 --- a/package.js +++ b/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'shivangkar:push', - version: '1.0.2', + version: '1.0.3', summary: 'Isomorphic Push notifications for APN and GCM', git: 'https://github.com/shivang007/push.git' }); @@ -30,7 +30,7 @@ Package.registerBuildPlugin({ }); Package.onUse(function (api) { - api.versionsFrom('1.8'); + api.versionsFrom('2.3'); api.use(['ecmascript']); From 1fa41e74ed10096d691c547671a358eafa9451fd Mon Sep 17 00:00:00 2001 From: Dhaval chaudhary Date: Mon, 8 Nov 2021 15:47:34 +0530 Subject: [PATCH 12/14] push changes --- package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.js b/package.js index 067249e..fba2d76 100644 --- a/package.js +++ b/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'shivangkar:push', - version: '1.0.3', + version: '1.0.4', summary: 'Isomorphic Push notifications for APN and GCM', git: 'https://github.com/shivang007/push.git' }); @@ -12,7 +12,7 @@ Npm.depends({ }); Cordova.depends({ - 'phonegap-plugin-push': '2.3.0', // previously 1.9.0 + '@havesource/cordova-plugin-push': '3.0.0-dev.1', // previously phonegap-plugin-push': '2.3.0 'cordova-plugin-device': '2.0.3', // previously 1.1.3 }); From e3c6270150177fe1cea8d19a9a5cf92a6bafc0d3 Mon Sep 17 00:00:00 2001 From: Dhaval chaudhary Date: Sat, 19 Nov 2022 16:28:39 +0530 Subject: [PATCH 13/14] cordova-plugin-push version bump --- package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.js b/package.js index fba2d76..b86a450 100644 --- a/package.js +++ b/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'shivangkar:push', - version: '1.0.4', + version: '1.0.5', summary: 'Isomorphic Push notifications for APN and GCM', git: 'https://github.com/shivang007/push.git' }); @@ -12,7 +12,7 @@ Npm.depends({ }); Cordova.depends({ - '@havesource/cordova-plugin-push': '3.0.0-dev.1', // previously phonegap-plugin-push': '2.3.0 + '@havesource/cordova-plugin-push': '3.0.1', // previously phonegap-plugin-push': '2.3.0 'cordova-plugin-device': '2.0.3', // previously 1.1.3 }); From 6123381b0a5a2d000cc6aa5d71a0aea01face131 Mon Sep 17 00:00:00 2001 From: Dhaval chaudhary Date: Mon, 5 Jun 2023 17:37:39 +0530 Subject: [PATCH 14/14] changes for cordova plugin --- package.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.js b/package.js index b86a450..83f04cc 100644 --- a/package.js +++ b/package.js @@ -1,6 +1,6 @@ Package.describe({ name: 'shivangkar:push', - version: '1.0.5', + version: '1.0.6', summary: 'Isomorphic Push notifications for APN and GCM', git: 'https://github.com/shivang007/push.git' }); @@ -12,7 +12,7 @@ Npm.depends({ }); Cordova.depends({ - '@havesource/cordova-plugin-push': '3.0.1', // previously phonegap-plugin-push': '2.3.0 + '@havesource/cordova-plugin-push': '4.0.0-dev.0', // previously phonegap-plugin-push': '2.3.0 'cordova-plugin-device': '2.0.3', // previously 1.1.3 });