diff options
| -rw-r--r-- | app/components/Preferences.js | 57 | ||||
| -rw-r--r-- | app/components/PreferencesStyles.js | 103 | ||||
| -rw-r--r-- | app/components/Settings.js | 18 | ||||
| -rw-r--r-- | app/containers/PreferencesPage.js | 26 | ||||
| -rw-r--r-- | app/containers/SettingsPage.js | 1 | ||||
| -rw-r--r-- | app/lib/backend.js | 30 | ||||
| -rw-r--r-- | app/lib/ipc-facade.js | 32 | ||||
| -rw-r--r-- | app/redux/settings/actions.js | 20 | ||||
| -rw-r--r-- | app/redux/settings/reducers.js | 7 | ||||
| -rw-r--r-- | app/routes.js | 4 | ||||
| -rw-r--r-- | app/transitions.js | 3 | ||||
| -rw-r--r-- | flow-typed/npm/reactxp_vx.x.x.js | 4 | ||||
| -rw-r--r-- | test/components/Connect.spec.js | 1 | ||||
| -rw-r--r-- | test/components/Preferences.spec.js | 29 | ||||
| -rw-r--r-- | test/components/SelectLocation.spec.js | 1 | ||||
| -rw-r--r-- | test/components/Settings.spec.js | 18 | ||||
| -rw-r--r-- | test/mocks/ipc.js | 10 | ||||
| -rw-r--r-- | yarn.lock | 94 |
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(), @@ -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" |
