From d49ad5e75a7b10b2710f085ae4c353abba398f35 Mon Sep 17 00:00:00 2001 From: Vincent Taverna Date: Wed, 4 Jan 2017 11:06:23 -0500 Subject: [PATCH 1/3] use react-bootstrap, prepare signin for hashing option --- app/actions/authenticate.js | 21 +- app/actions/trainer.js | 20 +- app/client.js | 12 +- .../Login/components/LoginFormContainer.js | 182 +++++++++++------- 4 files changed, 148 insertions(+), 87 deletions(-) diff --git a/app/actions/authenticate.js b/app/actions/authenticate.js index 04b8e2b..e738838 100644 --- a/app/actions/authenticate.js +++ b/app/actions/authenticate.js @@ -9,7 +9,7 @@ import { import * as fs from 'async-file' -import client from '../client' +import { setClient } from '../client' import { getTrainerInfo, @@ -29,9 +29,7 @@ const userLoginFailed = createAction('USER_LOGIN_FAILED') const accountPath = path.join(remote.app.getPath('appData'), '/pokenurse/account.json') export default { - client, - - login({ method, username, password }) { + login({ method, username, password, hashingKey }) { return async (dispatch) => { dispatch(userLoginStarted()) @@ -45,9 +43,22 @@ export default { try { const token = await login.login(username, password) - client.setAuthInfo(method, token) + const options = { + hashingKey, + authType: method, + authToken: token, + useHashingServer: !!hashingKey, + } + + // Use API version 0.51 (minimum version for hashing server) + if (hashingKey) options.version = 5100 + + const client = new pogobuf.Client(options) + client.init() + setClient(client) + // TODO display a loading spinner // then fetch all necessary things await Promise.all([ diff --git a/app/actions/trainer.js b/app/actions/trainer.js index 628e744..45d8260 100644 --- a/app/actions/trainer.js +++ b/app/actions/trainer.js @@ -10,7 +10,7 @@ import { ipcRenderer, } from 'electron' -import client from '../client' +import { getClient } from '../client' // TODO Must move these helpers to app folder import utils from '../utils' @@ -53,7 +53,7 @@ function generateEmptySpecies(candies, pokemonSettings) { }) } -// TODO Can we find these constants in POGOBuf or item templates? +// TODO Can we find these constants in POGOProtos or item templates? const MILLISECONDS_FACTOR = 1000 const MOVE2_CHARGE_DELAY_MS = 500 const STAB_MULTIPLIER = 1.25 // 25% damage boost @@ -259,7 +259,7 @@ const evolvePokemonFailed = createAction('EVOLVE_POKEMON_FAILED') function getTrainerInfo() { return async (dispatch) => { try { - const response = await client.getPlayer() + const response = await getClient().getPlayer() if (!response.success) { dispatch(getTrainerInfoFailed('Failed in retrieving player info. Please restart.')) @@ -317,7 +317,7 @@ let splitItemTemplates = null async function getInventoryAndItemTemplates(dispatch, inventoryOnly) { try { - const batch = client.batchStart() + const batch = getClient().batchStart() batch.getInventory(0) if (!inventoryOnly) batch.downloadItemTemplates() @@ -368,7 +368,7 @@ function getTrainerPokemon() { function powerUpPokemon(pokemon) { return async (dispatch) => { try { - await client.upgradePokemon(pokemon.id) + await getClient().upgradePokemon(pokemon.id) // TODO parse the response instead of retrieving all the new pokemon // Requires replacing the main parsing with more functional code @@ -388,7 +388,7 @@ function toggleFavoritePokemon(pokemon) { favorite: !pokemon.favorite ? -1 : -0 }) - await client.setFavoritePokemon(pokemon.id, !!updatedPokemon.favorite) + await getClient().setFavoritePokemon(pokemon.id, !!updatedPokemon.favorite) dispatch(toggleFavoritePokemonSuccess(updatedPokemon)) } catch (error) { dispatch(toggleFavoritePokemonFailed(error)) @@ -401,7 +401,7 @@ function renamePokemon(pokemon, nickname, callback) { return async (dispatch) => { try { - await client.nicknamePokemon(updatedPokemon.id, updatedPokemon.nickname) + await getClient().nicknamePokemon(updatedPokemon.id, updatedPokemon.nickname) dispatch(renamePokemonSuccess(updatedPokemon)) @@ -429,7 +429,7 @@ function transferPokemon(pokemon, delay) { return async (dispatch) => { try { await sleep(delay) - await client.releasePokemon(pokemon.id) + await getClient().releasePokemon(pokemon.id) dispatch(transferPokemonSuccess(pokemon)) } catch (error) { dispatch(transferPokemonFailed(error)) @@ -442,7 +442,7 @@ function evolvePokemon(pokemon, delay) { return async (dispatch) => { try { await sleep(delay) - await client.evolvePokemon(pokemon.id) + await getClient().evolvePokemon(pokemon.id) dispatch(evolvePokemonSuccess(pokemon)) } catch (error) { dispatch(evolvePokemonFailed(error)) @@ -454,7 +454,7 @@ function evolvePokemon(pokemon, delay) { const updateMonster = createAction('UPDATE_MONSTER') function batchStart(selectedPokemon, method) { - let batch = client.batchStart() + let batch = getClient().batchStart() selectedPokemon.forEach((p) => { batch = batch[method](p.id) diff --git a/app/client.js b/app/client.js index 7742893..cf45068 100644 --- a/app/client.js +++ b/app/client.js @@ -1,3 +1,11 @@ -import pogobuf from 'pogobuf' +let client = null -export default new pogobuf.Client() +export default { + getClient() { + return client + }, + + setClient(c) { + client = c + } +} diff --git a/app/screens/Login/components/LoginFormContainer.js b/app/screens/Login/components/LoginFormContainer.js index 7f482de..2e01864 100644 --- a/app/screens/Login/components/LoginFormContainer.js +++ b/app/screens/Login/components/LoginFormContainer.js @@ -2,10 +2,18 @@ import React, { PropTypes } from 'react' import { ipcRenderer } from 'electron' +import { findDOMNode } from 'react-dom' import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import { - ProgressBar + ProgressBar, + InputGroup, + FormControl, + FormGroup, + OverlayTrigger, + Tooltip, + ButtonGroup, + Button, } from 'react-bootstrap' import { @@ -19,6 +27,11 @@ const AUTH_METHODS = { google: 'google' } +const hashKeyTooltip = ( + Hash Keys for 0.51+ support, instead of the potentially unsafe 0.45 API. + Note that Hash Keys currently have varying costs based on your Requests per Minute. +) + const LoginForm = React.createClass({ displayName: 'LoginForm', @@ -56,70 +69,86 @@ const LoginForm = React.createClass({ return (
-
- - -
- -
- - - { this.username = c }} - onKeyPress={this.handleEnterKey} - defaultValue={credentials.username || ''} - /> -
- -
- - - { this.password = c }} - onKeyPress={this.handleEnterKey} - defaultValue={credentials.password || ''} - /> -
+ + + + + + + + + + { this.hashKey = c }} + /> + + -
+ - -
+
) }, radioLabelClick(authMethod) { - this[authMethod].click() + const authButtonNode = findDOMNode(this[authMethod]) + authButtonNode.click() }, handleChangeAuth(e) { @@ -159,18 +190,29 @@ const LoginForm = React.createClass({ const method = this.state.authMethod - if (this.username.value === '' || this.password.value === '') { - ipcRenderer.send('error-message', 'Missing username and/or password') + const username = findDOMNode(this.username).value + const password = findDOMNode(this.password).value + const hashingKey = findDOMNode(this.hashKey).value + const rememberMe = findDOMNode(this.rememberMe).checked + + if (!username) { + ipcRenderer.send('error-message', 'A username is required to login.') + return + } + + if (!password) { + ipcRenderer.send('error-message', 'A password is required to login.') return } const credentials = { method, - username: this.username.value, - password: this.password.value + username, + password, + hashingKey, } - if (this.rememberMe.checked) { + if (rememberMe) { this.props.saveAccountCredentials(credentials) } else { this.props.checkAndDeleteCredentials() From 3acb03dcfcd24e1d2dd94223bb651fc9731f1c44 Mon Sep 17 00:00:00 2001 From: Vincent Taverna Date: Thu, 5 Jan 2017 10:48:11 -0500 Subject: [PATCH 2/3] try to batch initial start calls --- app/actions/authenticate.js | 8 +--- app/actions/trainer.js | 90 ++++++++++++++++++++++++------------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/app/actions/authenticate.js b/app/actions/authenticate.js index e738838..70610ec 100644 --- a/app/actions/authenticate.js +++ b/app/actions/authenticate.js @@ -12,8 +12,7 @@ import * as fs from 'async-file' import { setClient } from '../client' import { - getTrainerInfo, - getTrainerPokemon + getTrainerInfoAndPokemon, } from './trainer' const saveAccountCredentialsFailed = createAction('SAVE_ACCOUNT_CREDENTIALS_FAILED') @@ -61,10 +60,7 @@ export default { // TODO display a loading spinner // then fetch all necessary things - await Promise.all([ - dispatch(getTrainerInfo()), - dispatch(getTrainerPokemon()) - ]) + await dispatch(getTrainerInfoAndPokemon()) dispatch(userLoginSuccess()) } catch (error) { diff --git a/app/actions/trainer.js b/app/actions/trainer.js index 45d8260..c9048bb 100644 --- a/app/actions/trainer.js +++ b/app/actions/trainer.js @@ -256,18 +256,22 @@ const transferPokemonFailed = createAction('TRANSFER_POKEMON_FAILED') const evolvePokemonSuccess = createAction('EVOLVE_POKEMON_SUCCESS') const evolvePokemonFailed = createAction('EVOLVE_POKEMON_FAILED') +function handleGetPlayerResponse(dispatch, response) { + if (!response.success) { + throw new Error('Failed in retrieving player info. Please restart.') + } + + dispatch(getTrainerInfoSuccess({ + trainerData: response.player_data + })) +} + function getTrainerInfo() { return async (dispatch) => { try { const response = await getClient().getPlayer() - if (!response.success) { - dispatch(getTrainerInfoFailed('Failed in retrieving player info. Please restart.')) - return - } - dispatch(getTrainerInfoSuccess({ - trainerData: response.player_data - })) + handleGetPlayerResponse(dispatch, response) } catch (error) { dispatch(getTrainerInfoFailed(error)) } @@ -315,6 +319,29 @@ function parseItemTemplates(templates) { let splitItemTemplates = null +function handleGetItemTemplatesResponse(dispatch, itemTemplates) { + if (!itemTemplates) return + + // TODO do not do this everytime we fetch the trainer pokemon, separate first fetch + refresh + itemTemplates.success = itemTemplates.result === 1 + + if (!itemTemplates.success) { + throw new Error('Failed to retrieve item templates') + } + + splitItemTemplates = parseItemTemplates(itemTemplates) +} + +function handleGetInventoryResponse(dispatch, inventory) { + if (!inventory.success) { + throw new Error('Failed to retrieve Trainers Pokemon') + } + + const payload = parseInventory(inventory) + + dispatch(getTrainerPokemonSuccess(payload)) +} + async function getInventoryAndItemTemplates(dispatch, inventoryOnly) { try { const batch = getClient().batchStart() @@ -332,37 +359,37 @@ async function getInventoryAndItemTemplates(dispatch, inventoryOnly) { [inventory, itemTemplates] = response } - if (!inventory.success) { - dispatch(getTrainerPokemonFailed('Failed to retrieve Trainers Pokemon')) - return - } - - if (!inventoryOnly) { - // TODO do not do this everytime we fetch the trainer pokemon, separate first fetch + refresh - itemTemplates.success = itemTemplates.result === 1 - - if (!itemTemplates.success) { - dispatch(getTrainerPokemonFailed('Failed to retrieve item templates')) - return - } - - splitItemTemplates = parseItemTemplates(itemTemplates) - } - - const payload = parseInventory(inventory) - - dispatch(getTrainerPokemonSuccess(payload)) + handleGetItemTemplatesResponse(dispatch, itemTemplates) + handleGetInventoryResponse(dispatch, inventory) } catch (error) { dispatch(getTrainerPokemonFailed(error)) } } +function getTrainerInfoAndPokemon() { + return async (dispatch) => { + const response = await getClient() + .batchStart() + .getInventory(0) + .downloadItemTemplates() + .getPlayer() + .batchCall() + + const [inventory, itemTemplates, player] = response + + handleGetItemTemplatesResponse(dispatch, itemTemplates) + handleGetInventoryResponse(dispatch, inventory) + handleGetPlayerResponse(dispatch, player) + } +} + function refreshPokemon() { - return (dispatch) => getInventoryAndItemTemplates(dispatch, true) + return async (dispatch) => getInventoryAndItemTemplates(dispatch, true) } +// TODO might be unnecessary now function getTrainerPokemon() { - return (dispatch) => getInventoryAndItemTemplates(dispatch) + return async (dispatch) => getInventoryAndItemTemplates(dispatch) } function powerUpPokemon(pokemon) { @@ -372,7 +399,7 @@ function powerUpPokemon(pokemon) { // TODO parse the response instead of retrieving all the new pokemon // Requires replacing the main parsing with more functional code - await dispatch(getTrainerPokemon()) + await dispatch(refreshPokemon()) dispatch(powerUpPokemonSuccess(pokemon)) } catch (error) { dispatch(powerUpPokemonFailed(error)) @@ -468,7 +495,7 @@ function resetStatusAndGetPokemon(errorMessage) { try { dispatch(resetStatus()) await sleep(100) // Pogobuf may need a tick after a large batch - await dispatch(getTrainerPokemon()) + await dispatch(refreshPokemon()) if (errorMessage) ipcRenderer.send('error-message', errorMessage) } catch (e) { errorMessage = errorMessage ? `${errorMessage}\n\n${e}` : `Failed to fetch pokemon:\n\n${e}` @@ -513,6 +540,7 @@ export default { sortWithDefaults: createAction('SORT_WITH_DEFAULTS'), getTrainerInfo, getTrainerPokemon, + getTrainerInfoAndPokemon, powerUpPokemon, toggleFavoritePokemon, renamePokemon, From 1d195672d83eeb83e8b14a6bf1f48cbe0dac7811 Mon Sep 17 00:00:00 2001 From: Vincent Taverna Date: Thu, 5 Jan 2017 22:32:42 -0500 Subject: [PATCH 3/3] prepare v2.0.0, update node-pogo-protos and pogobuf --- README.md | 10 +++--- app/package.json | 6 ++-- app/yarn.lock | 52 +++++++++++++++--------------- package.json | 16 ++++----- yarn.lock | 84 +++++++++++++++++++++++++----------------------- 5 files changed, 86 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index f7cae8c..8a99a94 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,12 @@ **PokéNurse** is a desktop application for Windows and Mac that allows you to manage your pokémon from Pokémon Go without the need for a mobile device. You can now favorite, transfer, and evolve from the comfort of your own home! -## Downloads for v1.9.0 +## Downloads for v2.0.0 You may view all the releases [here](https://github.com/vinnymac/PokeNurse/releases) -* [macOS](https://github.com/vinnymac/PokeNurse/releases/download/v1.9.0/PokeNurse.dmg) -* [Windows](https://github.com/vinnymac/PokeNurse/releases/download/v1.9.0/PokeNurse.exe) -* [Linux 32 bit](https://github.com/vinnymac/PokeNurse/releases/download/v1.9.0/PokeNurse-ia32.deb) -* [Linux 64 bit](https://github.com/vinnymac/PokeNurse/releases/download/v1.9.0/PokeNurse-x64.deb) +* [macOS](https://github.com/vinnymac/PokeNurse/releases/download/v2.0.0/PokeNurse.dmg) +* [Windows](https://github.com/vinnymac/PokeNurse/releases/download/v2.0.0/PokeNurse.exe) +* [Linux 32 bit](https://github.com/vinnymac/PokeNurse/releases/download/v2.0.0/PokeNurse-ia32.deb) +* [Linux 64 bit](https://github.com/vinnymac/PokeNurse/releases/download/v2.0.0/PokeNurse-x64.deb) ## Examples ![Login Window](app/loginExample.png) diff --git a/app/package.json b/app/package.json index 3458b8c..57e9954 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "PokeNurse", "productName": "PokeNurse", - "version": "1.9.0", + "version": "2.0.0", "description": "A tool for Pokémon Go to aid in transferring and evolving Pokémon", "main": "./main.js", "author": { @@ -13,7 +13,7 @@ "dependencies": { "async-file": "^2.0.2", "electron-localshortcut": "^1.0.0", - "node-pogo-protos": "2.4.0", - "pogobuf": "1.8.0" + "node-pogo-protos": "2.4.2", + "pogobuf": "1.9.0" } } diff --git a/app/yarn.lock b/app/yarn.lock index 5e5e342..88ca4c4 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -55,13 +55,13 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bluebird-retry@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.8.0.tgz#2d05d01b4ad1d9e99e9a89a0b158737175863ff7" +bluebird-retry@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.10.1.tgz#cdf76b01d4a6dd4fec4e2c84360a8a09007f67da" -bluebird@^3.4.1: - version "3.4.6" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" +bluebird@^3.4.7: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" boom@2.x.x: version "2.10.1" @@ -376,18 +376,18 @@ minimatch@^3.0.2, "minimatch@2 || 3": dependencies: brace-expansion "^1.0.0" -node-pogo-protos@^2.0.0, node-pogo-protos@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/node-pogo-protos/-/node-pogo-protos-2.4.0.tgz#37af78e4eeeeff1b9c8185b1d8afa14a0b0a8407" +node-pogo-protos@^2.4.0, node-pogo-protos@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/node-pogo-protos/-/node-pogo-protos-2.4.2.tgz#eac822e0fcbc89bbd052249350109b3b499ebfa2" dependencies: protobufjs "^5.0.1" -"node-pogo-signature@git+https://github.com/starkevin/node-pogo-signature.git": - version "3.0.0" - resolved "git+https://github.com/starkevin/node-pogo-signature.git#b0dc68d3524c80ebadecef5ad8945cec88103271" +node-pogo-signature@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/node-pogo-signature/-/node-pogo-signature-4.0.0.tgz#2b4b2b1d7784d94d8717e54567d42cb834f86dba" dependencies: long "^3.2.0" - pcrypt laverdet/pcrypt + pcrypt starkevin/pcrypt protobufjs "^5.0.1" number-is-nan@^1.0.0: @@ -418,9 +418,9 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -pcrypt@laverdet/pcrypt: +"pcrypt@github:starkevin/pcrypt": version "1.0.0" - resolved "https://codeload.github.com/laverdet/pcrypt/tar.gz/3339506cb2ee58d23ad96f4391c6e33e62c71243" + resolved "https://codeload.github.com/starkevin/pcrypt/tar.gz/867562d3a55f41cf2cc542d1e492d5b094c820de" pinkie-promise@^2.0.0: version "2.0.1" @@ -432,18 +432,18 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pogobuf@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/pogobuf/-/pogobuf-1.8.0.tgz#5f0e17c4f9a41690a50b235cfc96fd7764e34eab" +pogobuf@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/pogobuf/-/pogobuf-1.9.0.tgz#62f9750e1dc0dba6941a858bcc2cf16176628065" dependencies: - bluebird "^3.4.1" - bluebird-retry "^0.8.0" + bluebird "^3.4.7" + bluebird-retry "^0.10.1" gpsoauthnode "0.0.5" long "^3.2.0" - node-pogo-protos "^2.0.0" - node-pogo-signature "git+https://github.com/starkevin/node-pogo-signature.git" - request "^2.74.0" - s2-geometry "^1.2.7" + node-pogo-protos "^2.4.0" + node-pogo-signature "^4.0.0" + request "^2.79.0" + s2-geometry "^1.2.9" protobufjs@^5.0.1: version "5.0.1" @@ -462,7 +462,7 @@ qs@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" -request@^2.73.0, request@^2.74.0: +request@^2.73.0, request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -493,7 +493,7 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" -s2-geometry@^1.2.7: +s2-geometry@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/s2-geometry/-/s2-geometry-1.2.9.tgz#20c2eadc621322c0f5ebc5098fa614525031f1e4" dependencies: diff --git a/package.json b/package.json index 6ff9bcd..00c880f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "PokeNurse", - "version": "1.9.0", + "version": "2.0.0", "description": "A tool for Pokémon Go to aid in transferring and evolving Pokémon", "main": "main.js", "scripts": { @@ -93,7 +93,7 @@ "babel-preset-stage-0": "^6.5.0", "babel-register": "6.18.0", "babili-webpack-plugin": "^0.0.7", - "cross-env": "3.1.3", + "cross-env": "3.1.4", "css-loader": "0.26.1", "del": "^2.2.2", "devtron": "^1.3.0", @@ -111,10 +111,10 @@ "express": "^4.14.0", "extract-text-webpack-plugin": "^1.0.1", "file-loader": "^0.9.0", - "html-webpack-plugin": "2.25.0", + "html-webpack-plugin": "2.26.0", "jquery": "^2.2.4", "json-loader": "^0.5.4", - "lodash": "4.17.3", + "lodash": "4.17.4", "minimist": "^1.2.0", "moment": "2.17.1", "postcss": "5.2.8", @@ -128,8 +128,8 @@ "webpack": "1.14.0", "webpack-dashboard": "0.2.0", "webpack-dev-middleware": "1.9.0", - "webpack-hot-middleware": "2.14.0", - "webpack-merge": "2.0.0", + "webpack-hot-middleware": "2.15.0", + "webpack-merge": "2.2.0", "webpack-validator": "2.3.0" }, "dependencies": { @@ -138,8 +138,8 @@ "electron-debug": "^1.1.0", "electron-localshortcut": "^1.0.0", "font-awesome": "^4.7.0", - "node-pogo-protos": "2.4.0", - "pogobuf": "1.8.0", + "node-pogo-protos": "2.4.2", + "pogobuf": "1.9.0", "react": "^15.4.1", "react-dom": "^15.4.1", "react-redux": "5.0.1", diff --git a/yarn.lock b/yarn.lock index 8eae95c..ecf3179 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1419,18 +1419,22 @@ bluebird-lst-c@^1.0.4, bluebird-lst-c@^1.0.5: dependencies: bluebird "^3.4.6" -bluebird-retry@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.8.0.tgz#2d05d01b4ad1d9e99e9a89a0b158737175863ff7" +bluebird-retry@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.10.1.tgz#cdf76b01d4a6dd4fec4e2c84360a8a09007f67da" bluebird@^2.9.30: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" -bluebird@^3.4.1, bluebird@^3.4.6: +bluebird@^3.4.6: version "3.4.6" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" +bluebird@^3.4.7: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" @@ -2005,12 +2009,18 @@ create-hmac@^1.1.0, create-hmac@^1.1.2: create-hash "^1.1.0" inherits "^2.0.1" -cross-env@^3.1.1, cross-env@3.1.3: +cross-env@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-3.1.3.tgz#58cd8231808f50089708b091f7dd37275a8e8154" dependencies: cross-spawn "^3.0.1" +cross-env@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-3.1.4.tgz#56e8bca96f17908a6eb1bc2012ca126f92842130" + dependencies: + cross-spawn "^3.0.1" + cross-spawn@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -4230,9 +4240,9 @@ lodash@4.11.1: version "4.11.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.11.1.tgz#a32106eb8e2ec8e82c241611414773c9df15f8bc" -lodash@4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.3.tgz#557ed7d2a9438cac5fd5a43043ca60cb455e01f7" +lodash@4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" log-symbols@^1.0.2: version "1.0.2" @@ -4597,24 +4607,18 @@ node-libs-browser@^1.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-pogo-protos@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-pogo-protos/-/node-pogo-protos-2.2.0.tgz#715f35f2aa084d04d2eaa2a40b7ea984b6ef30cd" - dependencies: - protobufjs "^5.0.1" - -node-pogo-protos@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/node-pogo-protos/-/node-pogo-protos-2.4.0.tgz#37af78e4eeeeff1b9c8185b1d8afa14a0b0a8407" +node-pogo-protos@^2.4.0, node-pogo-protos@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/node-pogo-protos/-/node-pogo-protos-2.4.2.tgz#eac822e0fcbc89bbd052249350109b3b499ebfa2" dependencies: protobufjs "^5.0.1" -"node-pogo-signature@git+https://github.com/starkevin/node-pogo-signature.git": - version "3.0.0" - resolved "git+https://github.com/starkevin/node-pogo-signature.git#b0dc68d3524c80ebadecef5ad8945cec88103271" +node-pogo-signature@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/node-pogo-signature/-/node-pogo-signature-4.0.0.tgz#2b4b2b1d7784d94d8717e54567d42cb834f86dba" dependencies: long "^3.2.0" - pcrypt laverdet/pcrypt + pcrypt starkevin/pcrypt protobufjs "^5.0.1" node-pre-gyp@^0.6.29: @@ -4956,9 +4960,9 @@ pbkdf2@^3.0.3: dependencies: create-hmac "^1.1.2" -pcrypt@laverdet/pcrypt: +"pcrypt@github:starkevin/pcrypt": version "1.0.0" - resolved "https://codeload.github.com/laverdet/pcrypt/tar.gz/161f98fbea3e0ae1fe6e3b5a47e6ab029afdd9be" + resolved "https://codeload.github.com/starkevin/pcrypt/tar.gz/867562d3a55f41cf2cc542d1e492d5b094c820de" pend@~1.2.0: version "1.2.0" @@ -5021,18 +5025,18 @@ pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" -pogobuf@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/pogobuf/-/pogobuf-1.8.0.tgz#5f0e17c4f9a41690a50b235cfc96fd7764e34eab" +pogobuf@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/pogobuf/-/pogobuf-1.9.0.tgz#62f9750e1dc0dba6941a858bcc2cf16176628065" dependencies: - bluebird "^3.4.1" - bluebird-retry "^0.8.0" + bluebird "^3.4.7" + bluebird-retry "^0.10.1" gpsoauthnode "0.0.5" long "^3.2.0" - node-pogo-protos "^2.0.0" - node-pogo-signature "git+https://github.com/starkevin/node-pogo-signature.git" - request "^2.74.0" - s2-geometry "^1.2.7" + node-pogo-protos "^2.4.0" + node-pogo-signature "^4.0.0" + request "^2.79.0" + s2-geometry "^1.2.9" postcss, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.5: version "5.2.6" @@ -5802,7 +5806,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.45.0, request@^2.72.0, request@^2.73.0, request@^2.74.0, request@^2.75.0: +request@^2.45.0, request@^2.72.0, request@^2.73.0, request@^2.75.0, request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -5927,7 +5931,7 @@ rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" -s2-geometry@^1.2.7: +s2-geometry@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/s2-geometry/-/s2-geometry-1.2.9.tgz#20c2eadc621322c0f5ebc5098fa614525031f1e4" dependencies: @@ -6724,18 +6728,18 @@ webpack-dev-middleware@1.9.0: path-is-absolute "^1.0.0" range-parser "^1.0.3" -webpack-hot-middleware@2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.14.0.tgz#64bb8cf056ba84c699d148840ae77e54179abb6d" +webpack-hot-middleware@2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.15.0.tgz#71995af7c0025f109df482f86f1e10379526d026" dependencies: ansi-html "0.0.6" html-entities "^1.2.0" querystring "^0.2.0" strip-ansi "^3.0.0" -webpack-merge@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-2.0.0.tgz#fd328707d26f6f9852be2767557cef51d942c1dc" +webpack-merge@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-2.2.0.tgz#8e26ee10d440be647f533ad3a93e1670fe5c5506" dependencies: lodash.clonedeep "^4.5.0" lodash.differencewith "^4.5.0"