summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-01-03 12:43:36 +0100
committerAndrej Mihajlov <and@mullvad.net>2018-01-03 12:43:36 +0100
commitd19f790931beca0dcc62ae84f16d45b74d69a9c8 (patch)
tree42f2ddc38820c72517d1598835da718b583d07d9
parentd9f182e02742f9266941e4263e3e8f9cd92f6d32 (diff)
parent9c1589392d08c31bd4cc95f1e727c705bfb6900a (diff)
downloadmullvadvpn-d19f790931beca0dcc62ae84f16d45b74d69a9c8.tar.xz
mullvadvpn-d19f790931beca0dcc62ae84f16d45b74d69a9c8.zip
Merge branch 'add-lan-sharing'
-rw-r--r--app/components/Preferences.js57
-rw-r--r--app/components/PreferencesStyles.js103
-rw-r--r--app/components/Settings.js18
-rw-r--r--app/containers/PreferencesPage.js26
-rw-r--r--app/containers/SettingsPage.js1
-rw-r--r--app/lib/backend.js30
-rw-r--r--app/lib/ipc-facade.js32
-rw-r--r--app/redux/settings/actions.js20
-rw-r--r--app/redux/settings/reducers.js7
-rw-r--r--app/routes.js4
-rw-r--r--app/transitions.js3
-rw-r--r--flow-typed/npm/reactxp_vx.x.x.js4
-rw-r--r--test/components/Connect.spec.js1
-rw-r--r--test/components/Preferences.spec.js29
-rw-r--r--test/components/SelectLocation.spec.js1
-rw-r--r--test/components/Settings.spec.js18
-rw-r--r--test/mocks/ipc.js10
-rw-r--r--yarn.lock94
18 files changed, 404 insertions, 54 deletions
diff --git a/app/components/Preferences.js b/app/components/Preferences.js
new file mode 100644
index 0000000000..f0b65d4a06
--- /dev/null
+++ b/app/components/Preferences.js
@@ -0,0 +1,57 @@
+// @flow
+import React from 'react';
+import { Component, Text, Button, View } from 'reactxp';
+import { Layout, Container, Header } from './Layout';
+import Img from './Img';
+import Switch from './Switch';
+import styles from './PreferencesStyles';
+
+export type PreferencesProps = {
+ allowLan: boolean;
+ onChangeAllowLan: (boolean) => void;
+ onClose: () => void;
+};
+
+export default class Preferences extends Component {
+ props: PreferencesProps;
+
+ render() {
+ return (
+ <Layout>
+ <Header hidden={ true } style={ 'defaultDark' } />
+ <Container>
+ <View style={ styles.preferences }>
+ <Button style={ styles.preferences__close } cursor='default' onPress={ this.props.onClose } testName='closeButton'>
+ <View style={ styles.preferences__close_content }>
+ <Img style={ styles.preferences__close_icon } source="icon-back" />
+ <Text style={ styles.preferences__close_title }>Settings</Text>
+ </View>
+ </Button>
+ <View style={ styles.preferences__container }>
+
+ <View style={ styles.preferences__header }>
+ <Text style={ styles.preferences__title }>Preferences</Text>
+ </View>
+
+ <View style={ styles.preferences__content }>
+ <View style={ styles.preferences__cell }>
+ <View style={ styles.preferences__cell_label_container }>
+ <Text style={ styles.preferences__cell_label }>Local network sharing</Text>
+ </View>
+ <View style={ styles.preferences__cell_accessory }>
+ <Switch isOn={ this.props.allowLan } onChange={ this.props.onChangeAllowLan } />
+ </View>
+ </View>
+ <View style={ styles.preferences__cell_footer }>
+ <Text style={ styles.preferences__cell_footer_label }>
+ { 'Allows access to other devices on the same network for sharing, printing etc.' }
+ </Text>
+ </View>
+ </View>
+ </View>
+ </View>
+ </Container>
+ </Layout>
+ );
+ }
+}
diff --git a/app/components/PreferencesStyles.js b/app/components/PreferencesStyles.js
new file mode 100644
index 0000000000..64d900b09a
--- /dev/null
+++ b/app/components/PreferencesStyles.js
@@ -0,0 +1,103 @@
+// @flow
+
+import { createViewStyles, createTextStyles } from '../lib/styles';
+
+export default {
+ ...createViewStyles({
+ preferences: {
+ background: '#192E45',
+ height: '100%',
+ },
+ preferences__container: {
+ display: 'flex',
+ flexDirection: 'column',
+ height: '100%',
+ },
+ preferences__header: {
+ flexGrow: 0,
+ flexShrink: 0,
+ flexBasis: 'auto',
+ paddingTop: 40,
+ paddingRight: 24,
+ paddingLeft: 24,
+ paddingBottom: 24,
+ position: 'relative' /* anchor for close button */
+ },
+ preferences__close: {
+ position: 'absolute',
+ top: 0,
+ left: 12,
+ borderWidth: 0,
+ padding: 0,
+ margin: 0,
+ zIndex: 1, /* part of .preferences__container covers the button */
+ cursor: 'default',
+ },
+ preferences__close_content: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ },
+ preferences__close_icon: {
+ opacity: 0.6,
+ marginRight: 8,
+ },
+ preferences__content: {
+ flexDirection: 'column',
+ flexGrow: 1,
+ flexShrink: 1,
+ flexBasis: 'auto',
+ },
+ preferences__cell: {
+ backgroundColor: 'rgba(41,71,115,1)',
+ flexDirection: 'row',
+ alignItems: 'center',
+ },
+ preferences__cell_accessory: {
+ marginRight: 12,
+ },
+ preferences__cell_footer: {
+ paddingTop: 8,
+ paddingRight: 24,
+ paddingBottom: 24,
+ paddingLeft: 24,
+ },
+ preferences__cell_label_container: {
+ paddingTop: 15,
+ paddingRight: 12,
+ paddingBottom: 15,
+ paddingLeft: 24,
+ flexGrow: 1,
+ },
+ }),
+ ...createTextStyles({
+ preferences__close_title: {
+ fontFamily: 'Open Sans',
+ fontSize: 13,
+ fontWeight: 600,
+ color: 'rgba(255, 255, 255, 0.6)',
+ },
+ preferences__title: {
+ fontFamily: 'DINPro',
+ fontSize: 32,
+ fontWeight: 900,
+ lineHeight: 40,
+ color: '#fff',
+ },
+ preferences__cell_label: {
+ fontFamily: 'DINPro',
+ fontSize: 20,
+ fontWeight: 900,
+ lineHeight: 26,
+ letterSpacing: -0.2,
+ color: '#fff',
+ },
+ preferences__cell_footer_label: {
+ fontFamily: 'Open Sans',
+ fontSize: 13,
+ fontWeight: 600,
+ lineHeight: 20,
+ letterSpacing: -0.2,
+ color: 'rgba(255,255,255,0.8)'
+ }
+ })
+}; \ No newline at end of file
diff --git a/app/components/Settings.js b/app/components/Settings.js
index fe73ffd0af..b0b758b58c 100644
--- a/app/components/Settings.js
+++ b/app/components/Settings.js
@@ -18,6 +18,7 @@ export type SettingsProps = {
onClose: () => void,
onViewAccount: () => void,
onViewSupport: () => void,
+ onViewPreferences: () => void,
onViewAdvancedSettings: () => void,
onExternalLink: (type: string) => void
};
@@ -58,6 +59,7 @@ export default class Settings extends Component {
{/* show account options when logged in */}
{isLoggedIn ? (
<View style={styles.settings_account} testName='settings__account'>
+
<Button onPress={ this.props.onViewAccount } testName='settings__view_account'>
<View style={styles.settings__cell}>
<Text style={styles.settings__cell_label}>Account</Text>
@@ -75,15 +77,27 @@ export default class Settings extends Component {
) : null}
{isLoggedIn ? (
- <Button onPress={ this.props.onViewAdvancedSettings }>
+ <Button onPress={ this.props.onViewPreferences } testName='settings__preferences'>
+ <View style={styles.settings__cell}>
+ <Text style={styles.settings__cell_label}>Preferences</Text>
+ <Img style={styles.settings__cell_disclosure} source='icon-chevron' tintColor='currentColor' />
+ </View>
+ </Button>
+ ) : null}
+
+ {isLoggedIn ? (
+ <Button onPress={ this.props.onViewAdvancedSettings } testName="settings__advanced">
<View style={styles.settings__cell}>
<Text style={styles.settings__cell_label}>Advanced</Text>
<Img style={styles.settings__cell_disclosure} source='icon-chevron' tintColor='currentColor'/>
</View>
- <View style={styles.settings__cell_spacer}></View>
</Button>
) : null}
+ {isLoggedIn ? (
+ <View style={styles.settings__cell_spacer}></View>
+ ) : null}
+
<Button onPress={ this.props.onExternalLink.bind(this, 'faq') } testName='settings__external_link'>
<View style={styles.settings__cell}>
<Text style={styles.settings__cell_label}>FAQs</Text>
diff --git a/app/containers/PreferencesPage.js b/app/containers/PreferencesPage.js
new file mode 100644
index 0000000000..793848d35b
--- /dev/null
+++ b/app/containers/PreferencesPage.js
@@ -0,0 +1,26 @@
+// @flow
+
+import { connect } from 'react-redux';
+import { bindActionCreators } from 'redux';
+import { push } from 'react-router-redux';
+import Preferences from '../components/Preferences';
+
+import type { ReduxState, ReduxDispatch } from '../redux/store';
+import type { SharedRouteProps } from '../routes';
+
+const mapStateToProps = (state: ReduxState) => ({
+ allowLan: state.settings.allowLan
+});
+
+const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) => {
+ const { backend } = props;
+ const { push: pushHistory } = bindActionCreators({ push }, dispatch);
+ return {
+ onClose: () => pushHistory('/settings'),
+ onChangeAllowLan: (allowLan) => {
+ backend.setAllowLan(allowLan);
+ },
+ };
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Preferences);
diff --git a/app/containers/SettingsPage.js b/app/containers/SettingsPage.js
index 938d306fee..bfe30ee566 100644
--- a/app/containers/SettingsPage.js
+++ b/app/containers/SettingsPage.js
@@ -18,6 +18,7 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, _props: SharedRouteProps) =
onClose: () => pushHistory('/connect'),
onViewAccount: () => pushHistory('/settings/account'),
onViewSupport: () => pushHistory('/settings/support'),
+ onViewPreferences: () => pushHistory('/settings/preferences'),
onViewAdvancedSettings: () => pushHistory('/settings/advanced'),
onExternalLink: (type) => open(links[type]),
};
diff --git a/app/lib/backend.js b/app/lib/backend.js
index f78d359926..da87deced4 100644
--- a/app/lib/backend.js
+++ b/app/lib/backend.js
@@ -139,6 +139,12 @@ export class Backend {
log.error('Failed to fetch the location: ', e.message);
}
+ try {
+ await this._fetchAllowLan();
+ } catch(e) {
+ log.error('Failed to fetch the LAN sharing policy: ', e.message);
+ }
+
await this._fetchAccountHistory();
}
@@ -339,8 +345,6 @@ export class Backend {
}
}
-
-
async _fetchRelayLocations() {
await this._ensureAuthenticated();
@@ -395,6 +399,28 @@ export class Backend {
);
}
+ async setAllowLan(allowLan: boolean) {
+ try {
+ await this._ensureAuthenticated();
+ await this._ipc.setAllowLan(allowLan);
+
+ this._store.dispatch(
+ settingsActions.updateAllowLan(allowLan)
+ );
+ } catch(e) {
+ log.error('Failed to change the LAN sharing policy: ', e.message);
+ }
+ }
+
+ async _fetchAllowLan() {
+ await this._ensureAuthenticated();
+
+ const allowLan = await this._ipc.getAllowLan();
+ this._store.dispatch(
+ settingsActions.updateAllowLan(allowLan)
+ );
+ }
+
/**
* Start reachability monitoring for online/offline detection
* This is currently done via HTML5 APIs but will be replaced later
diff --git a/app/lib/ipc-facade.js b/app/lib/ipc-facade.js
index 567a6ab8f1..b2676193ee 100644
--- a/app/lib/ipc-facade.js
+++ b/app/lib/ipc-facade.js
@@ -142,11 +142,13 @@ const RelayListSchema = object({
export interface IpcFacade {
setConnectionString(string): void,
getAccountData(AccountToken): Promise<AccountData>,
+ getRelayLocations(): Promise<RelayList>,
getAccount(): Promise<?AccountToken>,
setAccount(accountToken: ?AccountToken): Promise<void>,
updateRelaySettings(RelaySettingsUpdate): Promise<void>,
getRelaySettings(): Promise<RelaySettings>,
- getRelayLocations(): Promise<RelayList>,
+ setAllowLan(boolean): Promise<void>,
+ getAllowLan(): Promise<boolean>,
connect(): Promise<void>,
disconnect(): Promise<void>,
shutdown(): Promise<void>,
@@ -186,6 +188,16 @@ export class RealIpc implements IpcFacade {
});
}
+ async getRelayLocations(): Promise<RelayList> {
+ const raw = await this._ipc.send('get_relay_locations');
+ try {
+ const validated: any = validate(RelayListSchema, raw);
+ return (validated: RelayList);
+ } catch (e) {
+ throw new InvalidReply(raw, e);
+ }
+ }
+
getAccount(): Promise<?AccountToken> {
return this._ipc.send('get_account')
.then( raw => {
@@ -223,13 +235,17 @@ export class RealIpc implements IpcFacade {
});
}
- async getRelayLocations(): Promise<RelayList> {
- const raw = await this._ipc.send('get_relay_locations');
- try {
- const validated: any = validate(RelayListSchema, raw);
- return (validated: RelayList);
- } catch (e) {
- throw new InvalidReply(raw, e);
+ setAllowLan(allowLan: boolean): Promise<void> {
+ return this._ipc.send('set_allow_lan', [allowLan])
+ .then(this._ignoreResponse);
+ }
+
+ async getAllowLan(): Promise<boolean> {
+ const raw = await this._ipc.send('get_allow_lan');
+ if(typeof(raw) === 'boolean') {
+ return raw;
+ } else {
+ throw new InvalidReply(raw, 'Expected a boolean');
}
}
diff --git a/app/redux/settings/actions.js b/app/redux/settings/actions.js
index 783eb042d2..02debd5b77 100644
--- a/app/redux/settings/actions.js
+++ b/app/redux/settings/actions.js
@@ -9,10 +9,15 @@ export type UpdateRelayAction = {
export type UpdateRelayLocationsAction = {
type: 'UPDATE_RELAY_LOCATIONS',
- relayLocations: Array<RelayLocationRedux>
-}
+ relayLocations: Array<RelayLocationRedux>,
+};
+
+export type UpdateAllowLanAction = {
+ type: 'UPDATE_ALLOW_LAN',
+ allowLan: boolean,
+};
-export type SettingsAction = UpdateRelayAction | UpdateRelayLocationsAction;
+export type SettingsAction = UpdateRelayAction | UpdateRelayLocationsAction | UpdateAllowLanAction;
function updateRelay(relay: RelaySettingsRedux): UpdateRelayAction {
return {
@@ -28,4 +33,11 @@ function updateRelayLocations(relayLocations: Array<RelayLocationRedux>): Update
};
}
-export default { updateRelay, updateRelayLocations };
+function updateAllowLan(allowLan: boolean): UpdateAllowLanAction {
+ return {
+ type: 'UPDATE_ALLOW_LAN',
+ allowLan: allowLan,
+ };
+}
+
+export default { updateRelay, updateRelayLocations, updateAllowLan };
diff --git a/app/redux/settings/reducers.js b/app/redux/settings/reducers.js
index 21258a80a7..59f51c2a66 100644
--- a/app/redux/settings/reducers.js
+++ b/app/redux/settings/reducers.js
@@ -34,6 +34,7 @@ export type RelayLocationRedux = {
export type SettingsReduxState = {
relaySettings: RelaySettingsRedux,
relayLocations: Array<RelayLocationRedux>,
+ allowLan: boolean,
};
const initialState: SettingsReduxState = {
@@ -45,6 +46,7 @@ const initialState: SettingsReduxState = {
}
},
relayLocations: [],
+ allowLan: false,
};
export default function(state: SettingsReduxState = initialState, action: ReduxAction): SettingsReduxState {
@@ -60,6 +62,11 @@ export default function(state: SettingsReduxState = initialState, action: ReduxA
relayLocations: action.relayLocations,
};
+ case 'UPDATE_ALLOW_LAN':
+ return { ...state,
+ allowLan: action.allowLan,
+ };
+
default:
return state;
}
diff --git a/app/routes.js b/app/routes.js
index f428c8093b..9caea27884 100644
--- a/app/routes.js
+++ b/app/routes.js
@@ -9,6 +9,7 @@ import ConnectPage from './containers/ConnectPage';
import SettingsPage from './containers/SettingsPage';
import AdvancedSettingsPage from './containers/AdvancedSettingsPage';
import AccountPage from './containers/AccountPage';
+import PreferencesPage from './containers/PreferencesPage';
import SupportPage from './containers/SupportPage';
import SelectLocationPage from './containers/SelectLocationPage';
import { getTransitionProps } from './transitions';
@@ -97,8 +98,9 @@ export default function makeRoutes(getState: ReduxGetState, componentProps: Shar
<PrivateRoute exact path="/connect" component={ ConnectPage } />
<PublicRoute exact path="/settings" component={ SettingsPage } />
<PrivateRoute exact path="/settings/account" component={ AccountPage } />
- <PublicRoute exact path="/settings/support" component={ SupportPage } />
+ <PublicRoute exact path="/settings/preferences" component={ PreferencesPage } />
<PublicRoute exact path="/settings/advanced" component={ AdvancedSettingsPage } />
+ <PublicRoute exact path="/settings/support" component={ SupportPage } />
<PrivateRoute exact path="/select-location" component={ SelectLocationPage } />
</Switch>
</CSSTransitionGroup>
diff --git a/app/transitions.js b/app/transitions.js
index fe6da53563..58e692f99c 100644
--- a/app/transitions.js
+++ b/app/transitions.js
@@ -49,8 +49,9 @@ const transitions: TransitionMap = {
*/
const transitionRules = [
r('/settings', '/settings/account', transitions.push),
- r('/settings', '/settings/support', transitions.push),
+ r('/settings', '/settings/preferences', transitions.push),
r('/settings', '/settings/advanced', transitions.push),
+ r('/settings', '/settings/support', transitions.push),
r(null, '/settings', transitions.slide),
r(null, '/select-location', transitions.slide)
];
diff --git a/flow-typed/npm/reactxp_vx.x.x.js b/flow-typed/npm/reactxp_vx.x.x.js
index 3a56f7269e..8746446718 100644
--- a/flow-typed/npm/reactxp_vx.x.x.js
+++ b/flow-typed/npm/reactxp_vx.x.x.js
@@ -1,5 +1,5 @@
-// flow-typed signature: 5f83476aa5cd27beb413f38456f55901
-// flow-typed version: <<STUB>>/reactxp_v^0.46.5/flow_v0.50.0
+// flow-typed signature: f4807f14e29bafb6e481251b9953eb13
+// flow-typed version: <<STUB>>/reactxp_v0.46.5/flow_v0.50.0
/**
* This is an autogenerated libdef stub for:
diff --git a/test/components/Connect.spec.js b/test/components/Connect.spec.js
index 4fcc3c6f60..ed8c17982a 100644
--- a/test/components/Connect.spec.js
+++ b/test/components/Connect.spec.js
@@ -161,6 +161,7 @@ const defaultProps: ConnectProps = {
position: [0, 0],
}]
}],
+ allowLan: false,
},
connection: {
status: 'disconnected',
diff --git a/test/components/Preferences.spec.js b/test/components/Preferences.spec.js
new file mode 100644
index 0000000000..cad039df32
--- /dev/null
+++ b/test/components/Preferences.spec.js
@@ -0,0 +1,29 @@
+// @flow
+
+import { expect } from 'chai';
+import React from 'react';
+import { shallow } from 'enzyme';
+import Preferences from '../../app/components/Preferences';
+
+require('../setup/enzyme');
+
+describe('components/Preferences', () => {
+
+ it('Should call close handler', (done) => {
+ const props = makeProps({ onClose: done });
+ const component = shallow(<Preferences { ...props } />);
+ const button = component.find({ testName: 'closeButton' });
+ expect(button).to.have.length(1);
+ button.simulate('press');
+ });
+
+});
+
+function makeProps(props) {
+ return {
+ onClose: () => {},
+ onChangeAllowLan: () => {},
+ allowLan: false,
+ ...props
+ };
+}
diff --git a/test/components/SelectLocation.spec.js b/test/components/SelectLocation.spec.js
index 1abdf515d9..459eb366ce 100644
--- a/test/components/SelectLocation.spec.js
+++ b/test/components/SelectLocation.spec.js
@@ -28,6 +28,7 @@ describe('components/SelectLocation', () => {
hasActiveRelays: true,
}],
}],
+ allowLan: false,
};
const makeProps = (state: SettingsReduxState, mergeProps: $Shape<SelectLocationProps>): SelectLocationProps => {
diff --git a/test/components/Settings.spec.js b/test/components/Settings.spec.js
index 7f949cb6c3..415be57fd2 100644
--- a/test/components/Settings.spec.js
+++ b/test/components/Settings.spec.js
@@ -45,6 +45,7 @@ describe('components/Settings', () => {
},
},
relayLocations: [],
+ allowLan: false,
};
const makeProps = (anAccountState: AccountReduxState, aSettingsState: SettingsReduxState, mergeProps: $Shape<SettingsProps> = {}): SettingsProps => {
@@ -56,6 +57,7 @@ describe('components/Settings', () => {
onViewAccount: () => {},
onViewSupport: () => {},
onViewAdvancedSettings: () => {},
+ onViewPreferences: () => {},
onExternalLink: (_type) => {}
};
return Object.assign({}, defaultProps, mergeProps);
@@ -139,6 +141,22 @@ describe('components/Settings', () => {
click(component);
});
+ it('should call advanced settings callback', (done) => {
+ const props = makeProps(loggedInAccountState, settingsState, {
+ onViewAdvancedSettings: () => done()
+ });
+ const component = getComponent(render(props), 'settings__advanced');
+ click(component);
+ });
+
+ it('should call preferences callback', (done) => {
+ const props = makeProps(loggedInAccountState, settingsState, {
+ onViewPreferences: () => done()
+ });
+ const component = getComponent(render(props), 'settings__preferences');
+ click(component);
+ });
+
it('should call support callback', (done) => {
const props = makeProps(loggedInAccountState, settingsState, {
onViewSupport: () => done()
diff --git a/test/mocks/ipc.js b/test/mocks/ipc.js
index ede4bd37b7..fc035f55ed 100644
--- a/test/mocks/ipc.js
+++ b/test/mocks/ipc.js
@@ -24,6 +24,10 @@ export function newMockIpc() {
expiry: '',
}),
+ getRelayLocations: () => Promise.resolve({
+ countries: [],
+ }),
+
getAccount: () => Promise.resolve('1111'),
setAccount: () => Promise.resolve(),
@@ -42,9 +46,9 @@ export function newMockIpc() {
},
}),
- getRelayLocations: () => Promise.resolve({
- countries: [],
- }),
+ setAllowLan: (_allowLan: boolean) => Promise.resolve(),
+
+ getAllowLan: () => Promise.resolve(true),
connect: () => Promise.resolve(),
diff --git a/yarn.lock b/yarn.lock
index 5e16592c88..bc57a0a9c2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -57,10 +57,14 @@
resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-4.7.4.tgz#6de2f1e9890b8f64b669e4b47c09b20893063977"
"@types/lodash@^4.14.64", "@types/lodash@^4.14.78":
- version "4.14.88"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.88.tgz#97eaf2dc668f33ed8e511a5b627035f4ea20b0f5"
+ version "4.14.91"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.91.tgz#794611b28056d16b5436059c6d800b39d573cd3a"
-"@types/node@*", "@types/node@^8.0.24":
+"@types/node@*":
+ version "8.5.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.2.tgz#83b8103fa9a2c2e83d78f701a9aa7c9539739aa5"
+
+"@types/node@^8.0.24":
version "8.0.56"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.56.tgz#c4652f88d7a677e26ccc16c1485c282ce28f1ce9"
@@ -72,8 +76,8 @@
"@types/react" "*"
"@types/react@*", "@types/react@^16.0.0":
- version "16.0.27"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.27.tgz#341899469ea2e98b48b11c18afb4d8361d03b013"
+ version "16.0.31"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.31.tgz#5285da62f3ac62b797f6d0729a1d6181f3180c3e"
abbrev@1:
version "1.1.1"
@@ -143,7 +147,16 @@ ajv@^4.9.1:
co "^4.6.0"
json-stable-stringify "^1.0.1"
-ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+ajv@^5.1.0:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+ajv@^5.2.3, ajv@^5.3.0:
version "5.5.1"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2"
dependencies:
@@ -170,6 +183,12 @@ ansi-escapes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+ansi-gray@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+ dependencies:
+ ansi-wrap "0.1.0"
+
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@@ -188,6 +207,10 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0:
dependencies:
color-convert "^1.9.0"
+ansi-wrap@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+
ansi@^0.3.0, ansi@~0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21"
@@ -1865,6 +1888,10 @@ color-name@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+
colors@0.5.x:
version "0.5.1"
resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774"
@@ -2076,10 +2103,14 @@ core-js@^1.0.0:
version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
-core-js@^2.0.0, core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
+core-js@^2.0.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
+core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -2880,10 +2911,10 @@ enzyme@^3.2.0:
rst-selector-parser "^2.2.3"
errno@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
dependencies:
- prr "~0.0.0"
+ prr "~1.0.1"
error-ex@^1.2.0, error-ex@^1.3.1:
version "1.3.1"
@@ -3259,10 +3290,11 @@ falafel@^2.1.0:
object-keys "^1.0.6"
fancy-log@^1.1.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
dependencies:
- chalk "^1.1.1"
+ ansi-gray "^0.1.1"
+ color-support "^1.1.3"
time-stamp "^1.0.0"
fast-deep-equal@^1.0.0:
@@ -3536,7 +3568,7 @@ fs-extra@^0.30.0:
fs-extra@^1.0.0:
version "1.0.0"
- resolved "http://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
dependencies:
graceful-fs "^4.1.2"
jsonfile "^2.1.0"
@@ -4193,8 +4225,8 @@ ignore@^3.3.3:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
image-size@^0.6.0:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.1.tgz#98122a562d59dcc097ef1b2c8191866eb8f5d663"
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.2.tgz#8ee316d4298b028b965091b673d5f1537adee5b4"
immutable@3.8.1:
version "3.8.1"
@@ -6162,9 +6194,9 @@ protocol-buffers-schema@^2.0.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-2.2.0.tgz#d29c6cd73fb655978fb6989691180db844119f61"
-prr@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
ps-tree@^1.1.0:
version "1.1.0"
@@ -6338,8 +6370,8 @@ react-mapbox-gl@^2.1.0:
supercluster "3.0.1"
react-native-windows@^0.50.0-rc.2:
- version "0.50.0-rc.2"
- resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.50.0-rc.2.tgz#70a459581d0e161ced5b6a8933b3a8e6837a5b51"
+ version "0.50.0"
+ resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.50.0.tgz#bf3cd3ec3df7272dbe3d1993da840fc02f7bb168"
dependencies:
chalk "^1.1.3"
glob "^7.1.2"
@@ -6491,8 +6523,8 @@ react@^16.0.0:
prop-types "^15.6.0"
reactxp@^0.46.5:
- version "0.46.5"
- resolved "https://registry.yarnpkg.com/reactxp/-/reactxp-0.46.5.tgz#aab94c04cc51320f21889d6402cc2858603cc2df"
+ version "0.46.6"
+ resolved "https://registry.yarnpkg.com/reactxp/-/reactxp-0.46.6.tgz#166a503a7147f3a1e29efc4469bda32603471a5f"
dependencies:
"@types/lodash" "^4.14.78"
"@types/react" "^16.0.0"
@@ -6503,7 +6535,7 @@ reactxp@^0.46.5:
prop-types "^15.5.9"
rebound "^0.0.13"
subscribableevent "^1.0.0"
- synctasks "^0.2.9"
+ synctasks "^0.3.0"
read-all-stream@^3.0.0:
version "3.1.0"
@@ -6667,8 +6699,8 @@ regenerator-runtime@^0.10.5:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
regenerator-runtime@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1"
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
regenerator-runtime@^0.9.5:
version "0.9.6"
@@ -7611,9 +7643,9 @@ sync-exec@~0.6.x:
version "0.6.2"
resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105"
-synctasks@^0.2.9:
- version "0.2.23"
- resolved "https://registry.yarnpkg.com/synctasks/-/synctasks-0.2.23.tgz#2f3378adca9bd65f8784b500dce5aff18ef446f7"
+synctasks@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/synctasks/-/synctasks-0.3.1.tgz#1f9012b23792ad775ba2693e0cafcfcd65b80d97"
table@^4.0.1:
version "4.0.2"
@@ -7893,8 +7925,8 @@ ua-parser-js@^0.7.9:
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
uglify-es@^3.1.8:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.1.tgz#93de0aad8a1bb629c8a316f686351bc4d6ece687"
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.2.tgz#2401df8be2a433314523753f28810793a40c5462"
dependencies:
commander "~2.12.1"
source-map "~0.6.1"