mirror of
https://github.com/zhigang1992/react-navigation.git
synced 2026-02-28 22:38:00 +08:00
Compare commits
1 Commits
2.10.0
...
@ericvicen
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
655453aed3 |
65
CHANGELOG.md
65
CHANGELOG.md
@@ -6,65 +6,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|||||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
## [2.10.0] - [2018-08-02](https://github.com/react-navigation/react-navigation/releases/tag/2.10.0)
|
|
||||||
### Added
|
|
||||||
- `lazy` and `optimizationsEnabled` options to `createMaterialTopTabNavigator` (react-navigation-tabs@0.6.0)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Android back button in stack with drawer closes drawer properly if open (react-navigation-drawer@0.5.0)
|
|
||||||
- Fixes bug where `null` doesn't work in routerOptions `paths` object for deeplinking ([#4791](https://github.com/react-navigation/react-navigation/pull/4791))
|
|
||||||
|
|
||||||
## [2.9.3] - [2018-07-26](https://github.com/react-navigation/react-navigation/releases/tag/2.9.3)
|
|
||||||
### Added
|
|
||||||
- Add `NavigationTestUtils` which can be imported by path to be used with jest snapshot testing.
|
|
||||||
|
|
||||||
## [2.9.2] - [2018-07-25](https://github.com/react-navigation/react-navigation/releases/tag/2.9.2)
|
|
||||||
### Added
|
|
||||||
- Export `StackViewTransitionConfigs` to allow you to extend default config in custom transition configs. [#4761](https://github.com/react-navigation/react-navigation/pull/4761)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Error when building with haul: ref to pathToRegexp.compile(#4658).
|
|
||||||
- Error when building with haul: ref to pathToRegexp.compile. [#4658](https://github.com/react-navigation/react-navigation/pull/4658).
|
|
||||||
|
|
||||||
## [2.9.1] - [2018-07-24](https://github.com/react-navigation/react-navigation/releases/tag/2.9.1)
|
|
||||||
### Fixed
|
|
||||||
- Incorrect parameters passed to title offset calculation led to bug in header layout when no right component (https://github.com/react-navigation/react-navigation/issues/4754)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Typo in Header transition preset check.
|
|
||||||
|
|
||||||
## [2.9.0] - [2018-07-20](https://github.com/react-navigation/react-navigation/releases/tag/2.9.0)
|
|
||||||
### Added
|
|
||||||
- `headerLayoutPreset: 'center' | 'left'` to provide an easy solution for [questions like this](https://github.com/react-navigation/react-navigation/issues/4615).
|
|
||||||
- `headerBackTitleEnabled` - this configuration option for stack navigator allows you to force back button titles to either be rendered or not (if you disagree with defaults for your platform and layout preset).
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Android back button ripple is now appropriately sized (fixes [#3955](https://github.com/react-navigation/react-navigation/issues/3955)).
|
|
||||||
- Respect header background color on container (fixes edge case where user depended on displaying content that was rendered behind the navigator, this particular behavior should not be depended on and may break in the future, but this change is still useful regardless).
|
|
||||||
|
|
||||||
|
|
||||||
## [2.8.0] - [2018-07-19](https://github.com/react-navigation/react-navigation/releases/tag/2.8.0)
|
|
||||||
### Added
|
|
||||||
- `headerLeftContainerStyle`, `headerTitleContainerStyle`, and `headerRightContainerStyle` are exposed on `navigationOptions`. These properties allow you to customize the style of the container of `headerLeft`, `headerTitle` and `headerRight` components.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Fixed memory leaks in `createNavigator`: [closure scope leak](https://github.com/react-navigation/react-navigation/commit/1a765562905e93bbae0262dd20c2688221c999e8), and [clean up old descriptors](https://github.com/react-navigation/react-navigation/commit/93642e16e7ff029586b68ee732ec790504ee4862).
|
|
||||||
|
|
||||||
## [2.7.0] - [2018-07-17](https://github.com/react-navigation/react-navigation/releases/tag/2.7.0)
|
|
||||||
### Added
|
|
||||||
- The enableURLHandling prop on the top level navigator component allows you to disable deep linking handling. Currently it is always enabled. To disable it, `<RootNavigator enableURLHandling={false} />`
|
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- StackNavigator.replace method no longer requires a key param. If the key is left undefined, the last screen in the stack will be replaced.
|
- StackNavigator.replace method no longer requires a key param. If the key is left undefined, the last screen in the stack will be replaced.
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Support headerLeft component for the first screen in a stack (#4608).
|
|
||||||
- Removed bottomBorder when `headerTransparent` is set to true.
|
|
||||||
- Improve empty path and param handling in deep linking (#4671). This fixes issues with deep linking and fully tests the differences between path: '' and path: null. Empty string matches empty paths, and null path will let the child router handle paths at the same level. Also it makes sure that params are not duplicated between path and query when they are serialized with getPathAndParamsForState.
|
|
||||||
- Fix onTransitionStart not being invoked when provided in navigator config.(#4100)
|
|
||||||
- Rare case when users navigated back and forth quickly with exactly the right timing would cause a crash due to a scene being queued to transition, then clobbered, then attempted to render as a stale scene but without a descriptor. ([commit](https://github.com/react-navigation/react-navigation/commit/cab4d71a5e09188df3f4a294c98779eecb860a78))
|
|
||||||
|
|
||||||
## [2.6.2] - [2018-07-06](https://github.com/react-navigation/react-navigation/releases/tag/2.6.2)
|
## [2.6.2] - [2018-07-06](https://github.com/react-navigation/react-navigation/releases/tag/2.6.2)
|
||||||
### Changed
|
### Changed
|
||||||
- Relax vertical padding warnings on header.
|
- Relax vertical padding warnings on header.
|
||||||
@@ -127,14 +71,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|||||||
### Changed
|
### Changed
|
||||||
- Improved examples
|
- Improved examples
|
||||||
|
|
||||||
[Unreleased]: https://github.com/react-navigation/react-navigation/compare/2.10.0...HEAD
|
[Unreleased]: https://github.com/react-navigation/react-navigation/compare/2.6.2...HEAD
|
||||||
[2.10.0]: https://github.com/react-navigation/react-navigation/compare/2.9.3...2.10.0
|
|
||||||
[2.9.3]: https://github.com/react-navigation/react-navigation/compare/2.9.2...2.9.3
|
|
||||||
[2.9.2]: https://github.com/react-navigation/react-navigation/compare/2.9.1...2.9.2
|
|
||||||
[2.9.1]: https://github.com/react-navigation/react-navigation/compare/2.9.0...2.9.1
|
|
||||||
[2.9.0]: https://github.com/react-navigation/react-navigation/compare/2.8.0...2.9.0
|
|
||||||
[2.8.0]: https://github.com/react-navigation/react-navigation/compare/2.7.0...2.8.0
|
|
||||||
[2.7.0]: https://github.com/react-navigation/react-navigation/compare/2.6.2...2.7.0
|
|
||||||
[2.6.2]: https://github.com/react-navigation/react-navigation/compare/2.6.1...2.6.2
|
[2.6.2]: https://github.com/react-navigation/react-navigation/compare/2.6.1...2.6.2
|
||||||
[2.6.1]: https://github.com/react-navigation/react-navigation/compare/2.6.0...2.6.1
|
[2.6.1]: https://github.com/react-navigation/react-navigation/compare/2.6.0...2.6.1
|
||||||
[2.6.0]: https://github.com/react-navigation/react-navigation/compare/2.5.5...2.6.0
|
[2.6.0]: https://github.com/react-navigation/react-navigation/compare/2.5.5...2.6.0
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
import { _TESTING_ONLY_reset_container_count } from './src/createNavigationContainer';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
resetInternalState: () => {
|
|
||||||
_TESTING_ONLY_reset_container_count();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -11,7 +11,8 @@
|
|||||||
"splash": {
|
"splash": {
|
||||||
"image": "./assets/icons/splash.png"
|
"image": "./assets/icons/splash.png"
|
||||||
},
|
},
|
||||||
"sdkVersion": "28.0.0",
|
"sdkVersion": "27.0.0",
|
||||||
|
"entryPoint": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
|
||||||
"assetBundlePatterns": [
|
"assetBundlePatterns": [
|
||||||
"**/*"
|
"**/*"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import {
|
|||||||
StatusBar,
|
StatusBar,
|
||||||
View,
|
View,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
|
|
||||||
|
import Reactotron from 'reactotron-react-native';
|
||||||
|
|
||||||
import { SafeAreaView, createStackNavigator } from 'react-navigation';
|
import { SafeAreaView, createStackNavigator } from 'react-navigation';
|
||||||
|
|
||||||
import CustomTabs from './CustomTabs';
|
import CustomTabs from './CustomTabs';
|
||||||
@@ -39,6 +42,11 @@ import TabsWithNavigationFocus from './TabsWithNavigationFocus';
|
|||||||
import TabsWithNavigationEvents from './TabsWithNavigationEvents';
|
import TabsWithNavigationEvents from './TabsWithNavigationEvents';
|
||||||
import KeyboardHandlingExample from './KeyboardHandlingExample';
|
import KeyboardHandlingExample from './KeyboardHandlingExample';
|
||||||
|
|
||||||
|
Reactotron.configure()
|
||||||
|
.useReactNative()
|
||||||
|
.connect();
|
||||||
|
console.tron = Reactotron;
|
||||||
|
|
||||||
const ExampleInfo = {
|
const ExampleInfo = {
|
||||||
SimpleStack: {
|
SimpleStack: {
|
||||||
name: 'Stack Example',
|
name: 'Stack Example',
|
||||||
@@ -340,7 +348,9 @@ const AppNavigator = createStackNavigator(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
export default AppNavigator;
|
const App = () => <AppNavigator persistenceKey="yes" />;
|
||||||
|
|
||||||
|
export default App;
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
item: {
|
item: {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import type {
|
|||||||
} from 'react-navigation';
|
} from 'react-navigation';
|
||||||
|
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { Platform, ScrollView, StatusBar } from 'react-native';
|
import { ScrollView, StatusBar } from 'react-native';
|
||||||
import {
|
import {
|
||||||
createStackNavigator,
|
createStackNavigator,
|
||||||
SafeAreaView,
|
SafeAreaView,
|
||||||
@@ -24,8 +24,6 @@ import SampleText from './SampleText';
|
|||||||
import { Button } from './commonComponents/ButtonWithMargin';
|
import { Button } from './commonComponents/ButtonWithMargin';
|
||||||
import { HeaderButtons } from './commonComponents/HeaderButtons';
|
import { HeaderButtons } from './commonComponents/HeaderButtons';
|
||||||
|
|
||||||
const DEBUG = false;
|
|
||||||
|
|
||||||
type MyNavScreenProps = {
|
type MyNavScreenProps = {
|
||||||
navigation: NavigationScreenProp<NavigationState>,
|
navigation: NavigationScreenProp<NavigationState>,
|
||||||
banner: React.Node,
|
banner: React.Node,
|
||||||
@@ -135,16 +133,16 @@ class MyHomeScreen extends React.Component<MyHomeScreenProps> {
|
|||||||
this._s3.remove();
|
this._s3.remove();
|
||||||
}
|
}
|
||||||
_onWF = a => {
|
_onWF = a => {
|
||||||
DEBUG && console.log('_willFocus HomeScreen', a);
|
console.log('_willFocus HomeScreen', a);
|
||||||
};
|
};
|
||||||
_onDF = a => {
|
_onDF = a => {
|
||||||
DEBUG && console.log('_didFocus HomeScreen', a);
|
console.log('_didFocus HomeScreen', a);
|
||||||
};
|
};
|
||||||
_onWB = a => {
|
_onWB = a => {
|
||||||
DEBUG && console.log('_willBlur HomeScreen', a);
|
console.log('_willBlur HomeScreen', a);
|
||||||
};
|
};
|
||||||
_onDB = a => {
|
_onDB = a => {
|
||||||
DEBUG && console.log('_didBlur HomeScreen', a);
|
console.log('_didBlur HomeScreen', a);
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -179,16 +177,16 @@ class MyPhotosScreen extends React.Component<MyPhotosScreenProps> {
|
|||||||
this._s3.remove();
|
this._s3.remove();
|
||||||
}
|
}
|
||||||
_onWF = a => {
|
_onWF = a => {
|
||||||
DEBUG && console.log('_willFocus PhotosScreen', a);
|
console.log('_willFocus PhotosScreen', a);
|
||||||
};
|
};
|
||||||
_onDF = a => {
|
_onDF = a => {
|
||||||
DEBUG && console.log('_didFocus PhotosScreen', a);
|
console.log('_didFocus PhotosScreen', a);
|
||||||
};
|
};
|
||||||
_onWB = a => {
|
_onWB = a => {
|
||||||
DEBUG && console.log('_willBlur PhotosScreen', a);
|
console.log('_willBlur PhotosScreen', a);
|
||||||
};
|
};
|
||||||
_onDB = a => {
|
_onDB = a => {
|
||||||
DEBUG && console.log('_didBlur PhotosScreen', a);
|
console.log('_didBlur PhotosScreen', a);
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -233,23 +231,18 @@ MyProfileScreen.navigationOptions = props => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const SimpleStack = createStackNavigator(
|
const SimpleStack = createStackNavigator({
|
||||||
{
|
Home: {
|
||||||
Home: {
|
screen: MyHomeScreen,
|
||||||
screen: MyHomeScreen,
|
|
||||||
},
|
|
||||||
Profile: {
|
|
||||||
path: 'people/:name',
|
|
||||||
screen: MyProfileScreen,
|
|
||||||
},
|
|
||||||
Photos: {
|
|
||||||
path: 'photos/:name',
|
|
||||||
screen: MyPhotosScreen,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
Profile: {
|
||||||
// headerLayoutPreset: 'center',
|
path: 'people/:name',
|
||||||
}
|
screen: MyProfileScreen,
|
||||||
);
|
},
|
||||||
|
Photos: {
|
||||||
|
path: 'photos/:name',
|
||||||
|
screen: MyPhotosScreen,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default SimpleStack;
|
export default SimpleStack;
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import {
|
|||||||
Platform,
|
Platform,
|
||||||
ScrollView,
|
ScrollView,
|
||||||
StatusBar,
|
StatusBar,
|
||||||
StyleSheet,
|
|
||||||
View,
|
View,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { Header, createStackNavigator } from 'react-navigation';
|
import { Header, createStackNavigator } from 'react-navigation';
|
||||||
@@ -232,10 +231,6 @@ const StackWithTranslucentHeader = createStackNavigator(
|
|||||||
headerTransitionPreset: 'uikit',
|
headerTransitionPreset: 'uikit',
|
||||||
navigationOptions: {
|
navigationOptions: {
|
||||||
headerTransparent: true,
|
headerTransparent: true,
|
||||||
headerStyle: {
|
|
||||||
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
||||||
borderBottomColor: '#A7A7AA',
|
|
||||||
},
|
|
||||||
headerBackground: Platform.select({
|
headerBackground: Platform.select({
|
||||||
ios: <BlurView style={{ flex: 1 }} intensity={98} />,
|
ios: <BlurView style={{ flex: 1 }} intensity={98} />,
|
||||||
android: (
|
android: (
|
||||||
|
|||||||
@@ -2,32 +2,34 @@
|
|||||||
"name": "NavigationPlayground",
|
"name": "NavigationPlayground",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "node_modules/expo/AppEntry.js",
|
"main": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "expo start",
|
"start": "react-native-scripts start",
|
||||||
"android": "expo start --android",
|
"eject": "react-native-scripts eject",
|
||||||
"ios": "expo start --ios",
|
"android": "react-native-scripts android",
|
||||||
|
"ios": "react-native-scripts ios",
|
||||||
"test": "flow"
|
"test": "flow"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"expo": "^28.0.0",
|
"expo": "^27.0.0",
|
||||||
"invariant": "^2.2.4",
|
"invariant": "^2.2.4",
|
||||||
"react": "16.3.1",
|
"react": "16.3.1",
|
||||||
"react-native": "^0.55.0",
|
"react-native": "^0.55.0",
|
||||||
"react-native-iphone-x-helper": "^1.0.2",
|
"react-native-iphone-x-helper": "^1.0.2",
|
||||||
"react-navigation": "link:../..",
|
"react-navigation": "link:../..",
|
||||||
"react-navigation-header-buttons": "^0.0.4",
|
"react-navigation-header-buttons": "^0.0.4",
|
||||||
"react-navigation-material-bottom-tabs": "^0.3.0",
|
"react-navigation-material-bottom-tabs": "0.1.3",
|
||||||
"react-navigation-tabs": "^0.5.1"
|
"react-navigation-tabs": "^0.5.1",
|
||||||
|
"reactotron-react-native": "^2.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-jest": "^22.4.1",
|
"babel-jest": "^22.4.1",
|
||||||
"babel-plugin-transform-remove-console": "^6.9.0",
|
"babel-plugin-transform-remove-console": "^6.9.0",
|
||||||
"flow-bin": "^0.67.0",
|
"flow-bin": "^0.67.0",
|
||||||
"jest": "^22.1.3",
|
"jest": "^22.1.3",
|
||||||
"jest-expo": "^28.0.0",
|
"jest-expo": "^26.0.0",
|
||||||
"react-test-renderer": "16.3.1"
|
"react-native-scripts": "^1.5.0",
|
||||||
|
"react-test-renderer": "16.3.0-alpha.1"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"preset": "jest-expo",
|
"preset": "jest-expo",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "react-navigation",
|
"name": "react-navigation",
|
||||||
"version": "2.10.0",
|
"version": "2.6.2",
|
||||||
"description": "Routing and navigation for your React Native apps",
|
"description": "Routing and navigation for your React Native apps",
|
||||||
"main": "src/react-navigation.js",
|
"main": "src/react-navigation.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -22,8 +22,7 @@
|
|||||||
"precommit": "lint-staged"
|
"precommit": "lint-staged"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"src",
|
"src"
|
||||||
"NavigationTestUtils.js"
|
|
||||||
],
|
],
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"react": "*",
|
"react": "*",
|
||||||
@@ -38,8 +37,8 @@
|
|||||||
"react-lifecycles-compat": "^3",
|
"react-lifecycles-compat": "^3",
|
||||||
"react-native-safe-area-view": "^0.8.0",
|
"react-native-safe-area-view": "^0.8.0",
|
||||||
"react-navigation-deprecated-tab-navigator": "1.3.0",
|
"react-navigation-deprecated-tab-navigator": "1.3.0",
|
||||||
"react-navigation-drawer": "0.5.0",
|
"react-navigation-drawer": "0.4.3",
|
||||||
"react-navigation-tabs": "0.6.0"
|
"react-navigation-tabs": "0.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-cli": "^6.24.1",
|
"babel-cli": "^6.24.1",
|
||||||
|
|||||||
@@ -265,6 +265,16 @@ export default function createNavigationContainer(Component) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.tron &&
|
||||||
|
console.tron.display({
|
||||||
|
name: 'Navigation',
|
||||||
|
preview: 'Initial State',
|
||||||
|
value: {
|
||||||
|
initialState: startupState,
|
||||||
|
initialAction: this._initialAction,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
this.setState({ nav: startupState }, () => {
|
this.setState({ nav: startupState }, () => {
|
||||||
_reactNavigationIsHydratingState = false;
|
_reactNavigationIsHydratingState = false;
|
||||||
dispatchActions();
|
dispatchActions();
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ exports[`Nested navigators renders succesfully as direct child 1`] = `
|
|||||||
<View
|
<View
|
||||||
onLayout={[Function]}
|
onLayout={[Function]}
|
||||||
style={
|
style={
|
||||||
Object {
|
Array [
|
||||||
"flex": 1,
|
Object {
|
||||||
}
|
"flex": 1,
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<View
|
<View
|
||||||
@@ -75,9 +77,11 @@ exports[`Nested navigators renders succesfully as direct child 1`] = `
|
|||||||
<View
|
<View
|
||||||
onLayout={[Function]}
|
onLayout={[Function]}
|
||||||
style={
|
style={
|
||||||
Object {
|
Array [
|
||||||
"flex": 1,
|
Object {
|
||||||
}
|
"flex": 1,
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<View
|
<View
|
||||||
|
|||||||
@@ -4,9 +4,11 @@ exports[`StackNavigator applies correct values when headerRight is present 1`] =
|
|||||||
<View
|
<View
|
||||||
onLayout={[Function]}
|
onLayout={[Function]}
|
||||||
style={
|
style={
|
||||||
Object {
|
Array [
|
||||||
"flex": 1,
|
Object {
|
||||||
}
|
"flex": 1,
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<View
|
<View
|
||||||
@@ -81,7 +83,7 @@ exports[`StackNavigator applies correct values when headerRight is present 1`] =
|
|||||||
collapsable={undefined}
|
collapsable={undefined}
|
||||||
style={
|
style={
|
||||||
Object {
|
Object {
|
||||||
"backgroundColor": "red",
|
"backgroundColor": "#F7F7F7",
|
||||||
"transform": Array [
|
"transform": Array [
|
||||||
Object {
|
Object {
|
||||||
"translateX": 0,
|
"translateX": 0,
|
||||||
@@ -208,9 +210,11 @@ exports[`StackNavigator renders successfully 1`] = `
|
|||||||
<View
|
<View
|
||||||
onLayout={[Function]}
|
onLayout={[Function]}
|
||||||
style={
|
style={
|
||||||
Object {
|
Array [
|
||||||
"flex": 1,
|
Object {
|
||||||
}
|
"flex": 1,
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<View
|
<View
|
||||||
@@ -285,7 +289,7 @@ exports[`StackNavigator renders successfully 1`] = `
|
|||||||
collapsable={undefined}
|
collapsable={undefined}
|
||||||
style={
|
style={
|
||||||
Object {
|
Object {
|
||||||
"backgroundColor": "red",
|
"backgroundColor": "#F7F7F7",
|
||||||
"transform": Array [
|
"transform": Array [
|
||||||
Object {
|
Object {
|
||||||
"translateX": 0,
|
"translateX": 0,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { TextInput } from 'react-native';
|
import { TextInput } from 'react-native';
|
||||||
|
|
||||||
export default (Navigator, navigatorConfig) =>
|
export default Navigator =>
|
||||||
class KeyboardAwareNavigator extends React.Component {
|
class KeyboardAwareNavigator extends React.Component {
|
||||||
static router = Navigator.router;
|
static router = Navigator.router;
|
||||||
_previouslyFocusedTextInput = null;
|
_previouslyFocusedTextInput = null;
|
||||||
@@ -49,9 +49,7 @@ export default (Navigator, navigatorConfig) =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onTransitionStart =
|
this.props.onTransitionStart &&
|
||||||
this.props.onTransitionStart || navigatorConfig.onTransitionStart;
|
this.props.onTransitionStart(transitionProps, prevTransitionProps);
|
||||||
onTransitionStart &&
|
|
||||||
onTransitionStart(transitionProps, prevTransitionProps);
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ function createNavigator(NavigatorView, router, navigationConfig) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const descriptors = {};
|
const descriptors = { ...prevState.descriptors };
|
||||||
|
|
||||||
routes.forEach(route => {
|
routes.forEach(route => {
|
||||||
if (
|
if (
|
||||||
@@ -36,10 +36,8 @@ function createNavigator(NavigatorView, router, navigationConfig) {
|
|||||||
descriptors[route.key] = prevDescriptors[route.key];
|
descriptors[route.key] = prevDescriptors[route.key];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const getComponent = router.getComponentForRouteName.bind(
|
const getComponent = () =>
|
||||||
null,
|
router.getComponentForRouteName(route.routeName);
|
||||||
route.routeName
|
|
||||||
);
|
|
||||||
const childNavigation = navigation.getChildNavigation(route.key);
|
const childNavigation = navigation.getChildNavigation(route.key);
|
||||||
const options = router.getScreenOptions(childNavigation, screenProps);
|
const options = router.getScreenOptions(childNavigation, screenProps);
|
||||||
descriptors[route.key] = {
|
descriptors[route.key] = {
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ function createStackNavigator(routeConfigMap, stackConfig = {}) {
|
|||||||
// Create a navigator with StackView as the view
|
// Create a navigator with StackView as the view
|
||||||
let Navigator = createNavigator(StackView, router, stackConfig);
|
let Navigator = createNavigator(StackView, router, stackConfig);
|
||||||
if (!disableKeyboardHandling) {
|
if (!disableKeyboardHandling) {
|
||||||
Navigator = createKeyboardAwareNavigator(Navigator, stackConfig);
|
Navigator = createKeyboardAwareNavigator(Navigator);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Navigator;
|
return Navigator;
|
||||||
|
|||||||
3
src/react-navigation.js
vendored
3
src/react-navigation.js
vendored
@@ -99,9 +99,6 @@ module.exports = {
|
|||||||
get StackViewCard() {
|
get StackViewCard() {
|
||||||
return require('./views/StackView/StackViewCard').default;
|
return require('./views/StackView/StackViewCard').default;
|
||||||
},
|
},
|
||||||
get StackViewTransitionConfigs() {
|
|
||||||
return require('./views/StackView/StackViewTransitionConfigs').default;
|
|
||||||
},
|
|
||||||
get SafeAreaView() {
|
get SafeAreaView() {
|
||||||
return require('react-native-safe-area-view').default;
|
return require('react-native-safe-area-view').default;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -107,7 +107,13 @@ export default (routeConfigs, stackConfig = {}) => {
|
|||||||
const {
|
const {
|
||||||
getPathAndParamsForRoute,
|
getPathAndParamsForRoute,
|
||||||
getActionForPathAndParams,
|
getActionForPathAndParams,
|
||||||
} = createPathParser(childRouters, routeConfigs, stackConfig.paths);
|
} = createPathParser(
|
||||||
|
childRouters,
|
||||||
|
routeConfigs,
|
||||||
|
stackConfig.paths,
|
||||||
|
initialRouteName,
|
||||||
|
initialRouteParams
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
childRouters,
|
childRouters,
|
||||||
|
|||||||
@@ -47,7 +47,13 @@ export default (routeConfigs, config = {}) => {
|
|||||||
const {
|
const {
|
||||||
getPathAndParamsForRoute,
|
getPathAndParamsForRoute,
|
||||||
getActionForPathAndParams,
|
getActionForPathAndParams,
|
||||||
} = createPathParser(childRouters, routeConfigs, config.paths);
|
} = createPathParser(
|
||||||
|
childRouters,
|
||||||
|
routeConfigs,
|
||||||
|
config.paths,
|
||||||
|
initialRouteName,
|
||||||
|
initialRouteParams
|
||||||
|
);
|
||||||
|
|
||||||
if (initialRouteIndex === -1) {
|
if (initialRouteIndex === -1) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
|
|||||||
@@ -13,50 +13,50 @@ beforeEach(() => {
|
|||||||
_TESTING_ONLY_normalize_keys();
|
_TESTING_ONLY_normalize_keys();
|
||||||
});
|
});
|
||||||
|
|
||||||
const performRouterTest = createTestRouter => {
|
const ListScreen = () => <div />;
|
||||||
const ListScreen = () => <div />;
|
|
||||||
|
|
||||||
const ProfileNavigator = () => <div />;
|
const ProfileNavigator = () => <div />;
|
||||||
ProfileNavigator.router = StackRouter({
|
ProfileNavigator.router = StackRouter({
|
||||||
list: {
|
list: {
|
||||||
path: 'list/:id',
|
path: 'list/:id',
|
||||||
screen: ListScreen,
|
screen: ListScreen,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const MainNavigator = () => <div />;
|
||||||
|
MainNavigator.router = StackRouter({
|
||||||
|
profile: {
|
||||||
|
path: 'p/:id',
|
||||||
|
screen: ProfileNavigator,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const LoginScreen = () => <div />;
|
||||||
|
|
||||||
|
const AuthNavigator = () => <div />;
|
||||||
|
AuthNavigator.router = StackRouter({
|
||||||
|
login: {
|
||||||
|
screen: LoginScreen,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const BarScreen = () => <div />;
|
||||||
|
|
||||||
|
class FooNavigator extends React.Component {
|
||||||
|
static router = StackRouter({
|
||||||
|
bar: {
|
||||||
|
path: 'b/:barThing',
|
||||||
|
screen: BarScreen,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
render() {
|
||||||
const MainNavigator = () => <div />;
|
return <div />;
|
||||||
MainNavigator.router = StackRouter({
|
|
||||||
profile: {
|
|
||||||
path: 'p/:id',
|
|
||||||
screen: ProfileNavigator,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const LoginScreen = () => <div />;
|
|
||||||
|
|
||||||
const AuthNavigator = () => <div />;
|
|
||||||
AuthNavigator.router = StackRouter({
|
|
||||||
login: {
|
|
||||||
screen: LoginScreen,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const BarScreen = () => <div />;
|
|
||||||
|
|
||||||
class FooNavigator extends React.Component {
|
|
||||||
static router = StackRouter({
|
|
||||||
bar: {
|
|
||||||
path: 'b/:barThing',
|
|
||||||
screen: BarScreen,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
render() {
|
|
||||||
return <div />;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const PersonScreen = () => <div />;
|
const PersonScreen = () => <div />;
|
||||||
|
|
||||||
|
const performRouterTest = createTestRouter => {
|
||||||
const testRouter = createTestRouter({
|
const testRouter = createTestRouter({
|
||||||
main: {
|
main: {
|
||||||
screen: MainNavigator,
|
screen: MainNavigator,
|
||||||
@@ -78,7 +78,7 @@ const performRouterTest = createTestRouter => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Handles empty URIs with empty action', () => {
|
test('Handles empty URIs', () => {
|
||||||
const router = createTestRouter(
|
const router = createTestRouter(
|
||||||
{
|
{
|
||||||
Foo: {
|
Foo: {
|
||||||
@@ -91,8 +91,12 @@ const performRouterTest = createTestRouter => {
|
|||||||
{ initialRouteName: 'Bar', initialRouteParams: { foo: 42 } }
|
{ initialRouteName: 'Bar', initialRouteParams: { foo: 42 } }
|
||||||
);
|
);
|
||||||
const action = router.getActionForPathAndParams('');
|
const action = router.getActionForPathAndParams('');
|
||||||
expect(action).toEqual(null);
|
expect(action).toEqual({
|
||||||
const state = router.getStateForAction(action || NavigationActions.init());
|
type: NavigationActions.NAVIGATE,
|
||||||
|
routeName: 'Bar',
|
||||||
|
params: { foo: 42 },
|
||||||
|
});
|
||||||
|
const state = router.getStateForAction(action);
|
||||||
expect(state.routes[state.index]).toEqual(
|
expect(state.routes[state.index]).toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
routeName: 'Bar',
|
routeName: 'Bar',
|
||||||
@@ -101,244 +105,6 @@ const performRouterTest = createTestRouter => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Handles paths with several params', () => {
|
|
||||||
const router = createTestRouter({
|
|
||||||
Person: {
|
|
||||||
path: 'people/:person',
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
Task: {
|
|
||||||
path: 'people/:person/tasks/:task',
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
ThingA: {
|
|
||||||
path: 'things/:good',
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
Thing: {
|
|
||||||
path: 'things/:good/:thing',
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const action = router.getActionForPathAndParams(
|
|
||||||
'people/brent/tasks/everything'
|
|
||||||
);
|
|
||||||
expect(action).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'Task',
|
|
||||||
params: { person: 'brent', task: 'everything' },
|
|
||||||
});
|
|
||||||
|
|
||||||
const action1 = router.getActionForPathAndParams('people/lucy');
|
|
||||||
expect(action1).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'Person',
|
|
||||||
params: { person: 'lucy' },
|
|
||||||
});
|
|
||||||
|
|
||||||
const action2 = router.getActionForPathAndParams('things/foo/bar');
|
|
||||||
expect(action2).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'Thing',
|
|
||||||
params: { good: 'foo', thing: 'bar' },
|
|
||||||
});
|
|
||||||
|
|
||||||
const action3 = router.getActionForPathAndParams('things/foo');
|
|
||||||
expect(action3).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'ThingA',
|
|
||||||
params: { good: 'foo' },
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Handles empty path configuration', () => {
|
|
||||||
const router = createTestRouter({
|
|
||||||
Foo: {
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
Bar: {
|
|
||||||
screen: () => <div />,
|
|
||||||
path: '',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const action = router.getActionForPathAndParams('');
|
|
||||||
expect(action).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'Bar',
|
|
||||||
params: {},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Handles wildcard path configuration', () => {
|
|
||||||
const router = createTestRouter({
|
|
||||||
Foo: {
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
Bar: {
|
|
||||||
screen: () => <div />,
|
|
||||||
path: ':something',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const action = router.getActionForPathAndParams('');
|
|
||||||
expect(action).toEqual(null);
|
|
||||||
|
|
||||||
const action1 = router.getActionForPathAndParams('Foo');
|
|
||||||
expect(action1).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'Foo',
|
|
||||||
params: {},
|
|
||||||
});
|
|
||||||
const action2 = router.getActionForPathAndParams('asdf');
|
|
||||||
expect(action2).toEqual({
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
routeName: 'Bar',
|
|
||||||
params: { something: 'asdf' },
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Null path behavior', () => {
|
|
||||||
const ScreenA = () => <div />;
|
|
||||||
const router = createTestRouter({
|
|
||||||
Bar: {
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
Foo: {
|
|
||||||
path: null,
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
Baz: {
|
|
||||||
path: '',
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const action0 = router.getActionForPathAndParams('test/random', {});
|
|
||||||
expect(action0).toBe(null);
|
|
||||||
|
|
||||||
const action1 = router.getActionForPathAndParams('', {});
|
|
||||||
expect(action1.routeName).toBe('Baz');
|
|
||||||
const state1 = router.getStateForAction(action1);
|
|
||||||
expect(state1.routes[state1.index].routeName).toBe('Baz');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Multiple null path sub routers path behavior', () => {
|
|
||||||
const ScreenA = () => <div />;
|
|
||||||
const ScreenB = () => <div />;
|
|
||||||
ScreenB.router = createTestRouter({
|
|
||||||
Foo: ScreenA,
|
|
||||||
});
|
|
||||||
const ScreenC = () => <div />;
|
|
||||||
ScreenC.router = createTestRouter({
|
|
||||||
Bar: {
|
|
||||||
path: 'bar/:id',
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
Empty: {
|
|
||||||
path: '',
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const router = createTestRouter({
|
|
||||||
A: {
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
B: {
|
|
||||||
path: null,
|
|
||||||
screen: ScreenB,
|
|
||||||
},
|
|
||||||
C: {
|
|
||||||
path: null,
|
|
||||||
screen: ScreenC,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const action0 = router.getActionForPathAndParams('Foo', {});
|
|
||||||
expect(action0.routeName).toBe('B');
|
|
||||||
expect(action0.action.routeName).toBe('Foo');
|
|
||||||
|
|
||||||
const action1 = router.getActionForPathAndParams('', {});
|
|
||||||
expect(action1.routeName).toBe('C');
|
|
||||||
expect(action1.action.routeName).toBe('Empty');
|
|
||||||
|
|
||||||
const action2 = router.getActionForPathAndParams('A', {});
|
|
||||||
expect(action2.routeName).toBe('A');
|
|
||||||
|
|
||||||
const action3 = router.getActionForPathAndParams('bar/asdf', {});
|
|
||||||
expect(action3.routeName).toBe('C');
|
|
||||||
expect(action3.action.routeName).toBe('Bar');
|
|
||||||
expect(action3.action.params.id).toBe('asdf');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Null and empty string path sub routers behavior', () => {
|
|
||||||
const ScreenA = () => <div />;
|
|
||||||
const ScreenB = () => <div />;
|
|
||||||
ScreenB.router = createTestRouter({
|
|
||||||
Foo: ScreenA,
|
|
||||||
Baz: {
|
|
||||||
screen: ScreenA,
|
|
||||||
path: '',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const ScreenC = () => <div />;
|
|
||||||
ScreenC.router = createTestRouter({
|
|
||||||
Boo: ScreenA,
|
|
||||||
Bar: ScreenA,
|
|
||||||
Baz: {
|
|
||||||
screen: ScreenA,
|
|
||||||
path: '',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const router = createTestRouter({
|
|
||||||
B: {
|
|
||||||
path: null,
|
|
||||||
screen: ScreenB,
|
|
||||||
},
|
|
||||||
C: {
|
|
||||||
path: '',
|
|
||||||
screen: ScreenC,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const action0 = router.getActionForPathAndParams('', {});
|
|
||||||
expect(action0.routeName).toBe('C');
|
|
||||||
expect(action0.action.routeName).toBe('Baz');
|
|
||||||
|
|
||||||
const action1 = router.getActionForPathAndParams('Foo', {});
|
|
||||||
expect(action1.routeName).toBe('B');
|
|
||||||
expect(action1.action.routeName).toBe('Foo');
|
|
||||||
|
|
||||||
const action2 = router.getActionForPathAndParams('Bar', {});
|
|
||||||
expect(action2.routeName).toBe('C');
|
|
||||||
expect(action2.action.routeName).toBe('Bar');
|
|
||||||
|
|
||||||
const action3 = router.getActionForPathAndParams('unknown', {});
|
|
||||||
expect(action3).toBe(null);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Empty path acts as wildcard for nested router', () => {
|
|
||||||
const ScreenA = () => <div />;
|
|
||||||
const Foo = () => <div />;
|
|
||||||
const ScreenC = () => <div />;
|
|
||||||
ScreenC.router = createTestRouter({
|
|
||||||
Boo: ScreenA,
|
|
||||||
Bar: ScreenA,
|
|
||||||
});
|
|
||||||
Foo.router = createTestRouter({
|
|
||||||
Quo: ScreenA,
|
|
||||||
Qux: {
|
|
||||||
screen: ScreenC,
|
|
||||||
path: '',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const router = createTestRouter({
|
|
||||||
Bar: {
|
|
||||||
screen: ScreenA,
|
|
||||||
},
|
|
||||||
Foo,
|
|
||||||
});
|
|
||||||
const action0 = router.getActionForPathAndParams('Foo/Bar', {});
|
|
||||||
expect(action0.routeName).toBe('Foo');
|
|
||||||
expect(action0.action.routeName).toBe('Qux');
|
|
||||||
expect(action0.action.action.routeName).toBe('Bar');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Gets deep path with pure wildcard match', () => {
|
test('Gets deep path with pure wildcard match', () => {
|
||||||
const ScreenA = () => <div />;
|
const ScreenA = () => <div />;
|
||||||
const ScreenB = () => <div />;
|
const ScreenB = () => <div />;
|
||||||
@@ -387,6 +153,7 @@ const performRouterTest = createTestRouter => {
|
|||||||
const { path, params } = router.getPathAndParamsForState(state);
|
const { path, params } = router.getPathAndParamsForState(state);
|
||||||
expect(path).toEqual('baz/321');
|
expect(path).toEqual('baz/321');
|
||||||
expect(params.id).toEqual('123');
|
expect(params.id).toEqual('123');
|
||||||
|
expect(params.bazId).toEqual('321');
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -441,31 +208,6 @@ const performRouterTest = createTestRouter => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('URI encoded path param gets parsed and correctly printed', () => {
|
|
||||||
const router = createTestRouter({
|
|
||||||
main: {
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
person: {
|
|
||||||
path: 'people/:name',
|
|
||||||
screen: () => <div />,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const action = testRouter.getActionForPathAndParams('people/Henry%20L');
|
|
||||||
expect(action).toEqual({
|
|
||||||
routeName: 'person',
|
|
||||||
params: {
|
|
||||||
id: 'Henry L',
|
|
||||||
},
|
|
||||||
type: NavigationActions.NAVIGATE,
|
|
||||||
});
|
|
||||||
const s = testRouter.getStateForAction(action);
|
|
||||||
const out = testRouter.getPathAndParamsForState(s);
|
|
||||||
expect(out.path).toEqual('people/Henry%20L');
|
|
||||||
expect(out.params).toEqual({});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Querystring params get passed to nested deep link', () => {
|
test('Querystring params get passed to nested deep link', () => {
|
||||||
const action = testRouter.getActionForPathAndParams(
|
const action = testRouter.getActionForPathAndParams(
|
||||||
'main/p/4/list/10259959195',
|
'main/p/4/list/10259959195',
|
||||||
@@ -547,24 +289,6 @@ const performRouterTest = createTestRouter => {
|
|||||||
expect(action.type).toEqual(NavigationActions.NAVIGATE);
|
expect(action.type).toEqual(NavigationActions.NAVIGATE);
|
||||||
expect(action.routeName).toEqual('baz');
|
expect(action.routeName).toEqual('baz');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('paths option set as null on router overrides path from route config', () => {
|
|
||||||
const router = createTestRouter(
|
|
||||||
{
|
|
||||||
main: {
|
|
||||||
screen: MainNavigator,
|
|
||||||
},
|
|
||||||
baz: {
|
|
||||||
path: 'bazPath',
|
|
||||||
screen: FooNavigator,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{ paths: { baz: null } }
|
|
||||||
);
|
|
||||||
const action = router.getActionForPathAndParams('b/noBaz', {});
|
|
||||||
expect(action.type).toEqual(NavigationActions.NAVIGATE);
|
|
||||||
expect(action.routeName).toEqual('baz');
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
describe('Path handling for stack router', () => {
|
describe('Path handling for stack router', () => {
|
||||||
@@ -573,24 +297,3 @@ describe('Path handling for stack router', () => {
|
|||||||
describe('Path handling for switch router', () => {
|
describe('Path handling for switch router', () => {
|
||||||
performRouterTest(SwitchRouter);
|
performRouterTest(SwitchRouter);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Handles nested switch routers', () => {
|
|
||||||
const AScreen = () => <div />;
|
|
||||||
const DocsNavigator = () => <div />;
|
|
||||||
DocsNavigator.router = SwitchRouter({
|
|
||||||
A: AScreen,
|
|
||||||
B: AScreen,
|
|
||||||
C: AScreen,
|
|
||||||
});
|
|
||||||
DocsNavigator.path = 'docs';
|
|
||||||
const router = SwitchRouter({
|
|
||||||
Docs: DocsNavigator,
|
|
||||||
D: AScreen,
|
|
||||||
});
|
|
||||||
const action = router.getActionForPathAndParams('docs/B', {});
|
|
||||||
|
|
||||||
expect(action.type).toEqual(NavigationActions.NAVIGATE);
|
|
||||||
expect(action.routeName).toEqual('Docs');
|
|
||||||
expect(action.action.type).toEqual(NavigationActions.NAVIGATE);
|
|
||||||
expect(action.action.routeName).toEqual('B');
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ describe('StackRouter', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('Correctly returns action chain for partially matched path', () => {
|
test('Correctly returns action chain for partially matched path', () => {
|
||||||
const uri = 'auth/login';
|
const uri = 'auth/login/2';
|
||||||
const action = TestStackRouter.getActionForPathAndParams(uri);
|
const action = TestStackRouter.getActionForPathAndParams(uri);
|
||||||
expect(action).toEqual({
|
expect(action).toEqual({
|
||||||
type: NavigationActions.NAVIGATE,
|
type: NavigationActions.NAVIGATE,
|
||||||
@@ -1206,7 +1206,8 @@ describe('StackRouter', () => {
|
|||||||
};
|
};
|
||||||
const { path, params } = router.getPathAndParamsForState(state);
|
const { path, params } = router.getPathAndParamsForState(state);
|
||||||
expect(path).toEqual('f/123/baz/321');
|
expect(path).toEqual('f/123/baz/321');
|
||||||
expect(params).toEqual({});
|
expect(params.id).toEqual('123');
|
||||||
|
expect(params.bazId).toEqual('321');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Handle goBack identified by key', () => {
|
test('Handle goBack identified by key', () => {
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import pathToRegexp, { compile } from 'path-to-regexp';
|
import pathToRegexp from 'path-to-regexp';
|
||||||
import NavigationActions from '../NavigationActions';
|
import NavigationActions from '../NavigationActions';
|
||||||
import invariant from '../utils/invariant';
|
|
||||||
|
|
||||||
const queryString = require('query-string');
|
const queryString = require('query-string');
|
||||||
|
|
||||||
function isEmpty(obj) {
|
function isEmpty(obj) {
|
||||||
@@ -12,37 +10,6 @@ function isEmpty(obj) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const getParamsFromPath = (inputParams, pathMatch, pathMatchKeys) => {
|
|
||||||
const params = pathMatch.slice(1).reduce(
|
|
||||||
// iterate over matched path params
|
|
||||||
(paramsOut, matchResult, i) => {
|
|
||||||
const key = pathMatchKeys[i];
|
|
||||||
if (!key || key.asterisk) {
|
|
||||||
return paramsOut;
|
|
||||||
}
|
|
||||||
const paramName = key.name;
|
|
||||||
|
|
||||||
let decodedMatchResult;
|
|
||||||
try {
|
|
||||||
decodedMatchResult = decodeURIComponent(matchResult);
|
|
||||||
} catch (e) {
|
|
||||||
// ignore `URIError: malformed URI`
|
|
||||||
}
|
|
||||||
|
|
||||||
paramsOut[paramName] = decodedMatchResult || matchResult;
|
|
||||||
return paramsOut;
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// start with the input(query string) params, which will get overridden by path params
|
|
||||||
...inputParams,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return params;
|
|
||||||
};
|
|
||||||
const getRestOfPath = (pathMatch, pathMatchKeys) => {
|
|
||||||
const rest = pathMatch[pathMatchKeys.findIndex(k => k.asterisk) + 1];
|
|
||||||
return rest;
|
|
||||||
};
|
|
||||||
export const urlToPathAndParams = (url, uriPrefix) => {
|
export const urlToPathAndParams = (url, uriPrefix) => {
|
||||||
const searchMatch = url.match(/^(.*)\?(.*)$/);
|
const searchMatch = url.match(/^(.*)\?(.*)$/);
|
||||||
const params = searchMatch ? queryString.parse(searchMatch[2]) : {};
|
const params = searchMatch ? queryString.parse(searchMatch[2]) : {};
|
||||||
@@ -67,151 +34,138 @@ export const urlToPathAndParams = (url, uriPrefix) => {
|
|||||||
export const createPathParser = (
|
export const createPathParser = (
|
||||||
childRouters,
|
childRouters,
|
||||||
routeConfigs,
|
routeConfigs,
|
||||||
pathConfigs = {}
|
pathConfigs = {},
|
||||||
|
initialRouteName,
|
||||||
|
initialRouteParams
|
||||||
) => {
|
) => {
|
||||||
const pathsByRouteNames = {};
|
const pathsByRouteNames = {};
|
||||||
let paths = [];
|
let paths = [];
|
||||||
|
|
||||||
// Build pathsByRouteNames, which includes a regex to match paths for each route. Keep in mind, the regex will pass for the route and all child routes. The code that uses pathsByRouteNames will need to also verify that the child router produces an action, in the case of isPathMatchable false (a null path).
|
// Build paths for each route
|
||||||
Object.keys(childRouters).forEach(routeName => {
|
Object.keys(childRouters).forEach(routeName => {
|
||||||
let pathPattern;
|
let pathPattern = pathConfigs[routeName] || routeConfigs[routeName].path;
|
||||||
|
let matchExact = !!pathPattern && !childRouters[routeName];
|
||||||
// First check for paths on the router, then check the route config
|
|
||||||
if (pathConfigs[routeName] !== undefined) {
|
|
||||||
pathPattern = pathConfigs[routeName];
|
|
||||||
} else {
|
|
||||||
pathPattern = routeConfigs[routeName].path;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pathPattern === undefined) {
|
if (pathPattern === undefined) {
|
||||||
// If the user hasn't specified a path at all, then we assume the routeName is an appropriate path
|
|
||||||
pathPattern = routeName;
|
pathPattern = routeName;
|
||||||
}
|
}
|
||||||
|
const keys = [];
|
||||||
invariant(
|
let re, toPath, priority;
|
||||||
pathPattern === null || typeof pathPattern === 'string',
|
if (typeof pathPattern === 'string') {
|
||||||
`Route path for ${routeName} must be specified as a string, or null.`
|
// pathPattern may be either a string or a regexp object according to path-to-regexp docs.
|
||||||
);
|
re = pathToRegexp(pathPattern, keys);
|
||||||
|
toPath = pathToRegexp.compile(pathPattern);
|
||||||
// the path may be specified as null, which is similar to empty string because it allows child routers to handle the action, but it will not match empty paths
|
priority = 0;
|
||||||
const isPathMatchable = pathPattern !== null;
|
} else if (pathPattern === null) {
|
||||||
// pathPattern is a string with inline params, such as people/:id/*foo
|
// for wildcard match
|
||||||
const exactReKeys = [];
|
re = pathToRegexp('*', keys);
|
||||||
const exactRe = isPathMatchable
|
toPath = () => '';
|
||||||
? pathToRegexp(pathPattern, exactReKeys)
|
matchExact = true;
|
||||||
: null;
|
priority = -1;
|
||||||
const extendedPathReKeys = [];
|
}
|
||||||
const isWildcard = pathPattern === '' || !isPathMatchable;
|
if (!matchExact) {
|
||||||
const extendedPathRe = pathToRegexp(
|
const wildcardRe = pathToRegexp(`${pathPattern}/*`, keys);
|
||||||
isWildcard ? '*' : `${pathPattern}/*`,
|
re = new RegExp(`(?:${re.source})|(?:${wildcardRe.source})`);
|
||||||
extendedPathReKeys
|
}
|
||||||
);
|
pathsByRouteNames[routeName] = { re, keys, toPath, priority, pathPattern };
|
||||||
|
|
||||||
pathsByRouteNames[routeName] = {
|
|
||||||
exactRe,
|
|
||||||
exactReKeys,
|
|
||||||
extendedPathRe,
|
|
||||||
extendedPathReKeys,
|
|
||||||
isWildcard,
|
|
||||||
toPath: pathPattern === null ? () => '' : compile(pathPattern),
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
paths = Object.entries(pathsByRouteNames);
|
paths = Object.entries(pathsByRouteNames);
|
||||||
|
paths.sort((a, b) => b[1].priority - a[1].priority);
|
||||||
|
|
||||||
const getActionForPathAndParams = (pathToResolve = '', inputParams = {}) => {
|
const getActionForPathAndParams = (pathToResolve, inputParams = {}) => {
|
||||||
// Attempt to match `pathToResolve` with a route in this router's routeConfigs, deferring to child routers
|
// If the path is empty (null or empty string)
|
||||||
|
// just return the initial route action
|
||||||
|
if (!pathToResolve) {
|
||||||
|
return NavigationActions.navigate({
|
||||||
|
routeName: initialRouteName,
|
||||||
|
params: { ...inputParams, ...initialRouteParams },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let matchedAction = null;
|
// Attempt to match `pathToResolve` with a route in this router's
|
||||||
|
// routeConfigs
|
||||||
|
let matchedRouteName;
|
||||||
|
let pathMatch;
|
||||||
|
let pathMatchKeys;
|
||||||
|
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
for (const [routeName, path] of paths) {
|
for (const [routeName, path] of paths) {
|
||||||
const { exactRe, exactReKeys, extendedPathRe, extendedPathReKeys } = path;
|
const { re, keys } = path;
|
||||||
const childRouter = childRouters[routeName];
|
pathMatch = re.exec(pathToResolve);
|
||||||
|
if (pathMatch && pathMatch.length) {
|
||||||
const exactMatch = exactRe && exactRe.exec(pathToResolve);
|
pathMatchKeys = keys;
|
||||||
|
matchedRouteName = routeName;
|
||||||
if (exactMatch && exactMatch.length) {
|
break;
|
||||||
const extendedMatch =
|
|
||||||
extendedPathRe && extendedPathRe.exec(pathToResolve);
|
|
||||||
let childAction = null;
|
|
||||||
if (extendedMatch && childRouter) {
|
|
||||||
const restOfPath = getRestOfPath(extendedMatch, extendedPathReKeys);
|
|
||||||
childAction = childRouter.getActionForPathAndParams(
|
|
||||||
restOfPath,
|
|
||||||
inputParams
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NavigationActions.navigate({
|
|
||||||
routeName,
|
|
||||||
params: getParamsFromPath(inputParams, exactMatch, exactReKeys),
|
|
||||||
action: childAction,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
// We didn't match -- return null to signify no action available
|
||||||
for (const [routeName, path] of paths) {
|
if (!matchedRouteName) {
|
||||||
const { extendedPathRe, extendedPathReKeys } = path;
|
return null;
|
||||||
const childRouter = childRouters[routeName];
|
}
|
||||||
|
|
||||||
const extendedMatch =
|
// Determine nested actions:
|
||||||
extendedPathRe && extendedPathRe.exec(pathToResolve);
|
// If our matched route for this router is a child router,
|
||||||
|
// get the action for the path AFTER the matched path for this
|
||||||
if (extendedMatch && extendedMatch.length) {
|
// router
|
||||||
const restOfPath = getRestOfPath(extendedMatch, extendedPathReKeys);
|
let nestedAction;
|
||||||
let childAction = null;
|
if (childRouters[matchedRouteName]) {
|
||||||
if (childRouter) {
|
nestedAction = childRouters[matchedRouteName].getActionForPathAndParams(
|
||||||
childAction = childRouter.getActionForPathAndParams(
|
pathMatch.slice(pathMatchKeys.length).join('/'),
|
||||||
restOfPath,
|
inputParams
|
||||||
inputParams
|
);
|
||||||
);
|
if (!nestedAction) {
|
||||||
}
|
return null;
|
||||||
if (!childAction) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return NavigationActions.navigate({
|
|
||||||
routeName,
|
|
||||||
params: getParamsFromPath(
|
|
||||||
inputParams,
|
|
||||||
extendedMatch,
|
|
||||||
extendedPathReKeys
|
|
||||||
),
|
|
||||||
action: childAction,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
const params = pathMatch.slice(1).reduce(
|
||||||
|
// iterate over matched path params
|
||||||
|
(paramsOut, matchResult, i) => {
|
||||||
|
const key = pathMatchKeys[i];
|
||||||
|
if (!key || key.asterisk) {
|
||||||
|
return paramsOut;
|
||||||
|
}
|
||||||
|
const paramName = key.name;
|
||||||
|
|
||||||
|
let decodedMatchResult;
|
||||||
|
try {
|
||||||
|
decodedMatchResult = decodeURIComponent(matchResult);
|
||||||
|
} catch (e) {
|
||||||
|
// ignore `URIError: malformed URI`
|
||||||
|
}
|
||||||
|
|
||||||
|
paramsOut[paramName] = decodedMatchResult || matchResult;
|
||||||
|
return paramsOut;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// start with the input(query string) params, which will get overridden by path params
|
||||||
|
...inputParams,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return NavigationActions.navigate({
|
||||||
|
routeName: matchedRouteName,
|
||||||
|
...(params ? { params } : {}),
|
||||||
|
...(nestedAction ? { action: nestedAction } : {}),
|
||||||
|
});
|
||||||
};
|
};
|
||||||
const getPathAndParamsForRoute = route => {
|
const getPathAndParamsForRoute = route => {
|
||||||
const { routeName, params } = route;
|
const { routeName, params } = route;
|
||||||
const childRouter = childRouters[routeName];
|
const childRouter = childRouters[routeName];
|
||||||
const { toPath, exactReKeys } = pathsByRouteNames[routeName];
|
const subPath = pathsByRouteNames[routeName].toPath(params);
|
||||||
const subPath = toPath(params);
|
|
||||||
const nonPathParams = {};
|
|
||||||
if (params) {
|
|
||||||
Object.keys(params)
|
|
||||||
.filter(paramName => !exactReKeys.find(k => k.name === paramName))
|
|
||||||
.forEach(paramName => {
|
|
||||||
nonPathParams[paramName] = params[paramName];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (childRouter) {
|
if (childRouter) {
|
||||||
// If it has a router it's a navigator.
|
// If it has a router it's a navigator.
|
||||||
// If it doesn't have router it's an ordinary React component.
|
// If it doesn't have router it's an ordinary React component.
|
||||||
const child = childRouter.getPathAndParamsForState(route);
|
const child = childRouter.getPathAndParamsForState(route);
|
||||||
return {
|
return {
|
||||||
path: subPath ? `${subPath}/${child.path}` : child.path,
|
path: subPath ? `${subPath}/${child.path}` : child.path,
|
||||||
params: child.params
|
params: child.params ? { ...params, ...child.params } : params,
|
||||||
? { ...nonPathParams, ...child.params }
|
|
||||||
: nonPathParams,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
path: subPath,
|
path: subPath,
|
||||||
params: nonPathParams,
|
params,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return { getActionForPathAndParams, getPathAndParamsForRoute };
|
return { getActionForPathAndParams, getPathAndParamsForRoute };
|
||||||
|
|||||||
@@ -21,47 +21,7 @@ import withOrientation from '../withOrientation';
|
|||||||
|
|
||||||
const APPBAR_HEIGHT = Platform.OS === 'ios' ? 44 : 56;
|
const APPBAR_HEIGHT = Platform.OS === 'ios' ? 44 : 56;
|
||||||
const STATUSBAR_HEIGHT = Platform.OS === 'ios' ? 20 : 0;
|
const STATUSBAR_HEIGHT = Platform.OS === 'ios' ? 20 : 0;
|
||||||
|
const TITLE_OFFSET = Platform.OS === 'ios' ? 70 : 56;
|
||||||
// These can be adjusted by using headerTitleContainerStyle on navigationOptions
|
|
||||||
const TITLE_OFFSET_CENTER_ALIGN = Platform.OS === 'ios' ? 70 : 56;
|
|
||||||
const TITLE_OFFSET_LEFT_ALIGN = Platform.OS === 'ios' ? 20 : 56;
|
|
||||||
|
|
||||||
const getTitleOffsets = (
|
|
||||||
layoutPreset,
|
|
||||||
forceBackTitle,
|
|
||||||
hasLeftComponent,
|
|
||||||
hasRightComponent
|
|
||||||
) => {
|
|
||||||
if (layoutPreset === 'left') {
|
|
||||||
// Maybe at some point we should do something different if the back title is
|
|
||||||
// explicitly enabled, for now people can control it manually
|
|
||||||
|
|
||||||
let style = {
|
|
||||||
left: TITLE_OFFSET_LEFT_ALIGN,
|
|
||||||
right: TITLE_OFFSET_LEFT_ALIGN,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!hasLeftComponent) {
|
|
||||||
style.left = 0;
|
|
||||||
}
|
|
||||||
if (!hasRightComponent) {
|
|
||||||
style.right = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return style;
|
|
||||||
} else if (layoutPreset === 'center') {
|
|
||||||
let style = {
|
|
||||||
left: TITLE_OFFSET_CENTER_ALIGN,
|
|
||||||
right: TITLE_OFFSET_CENTER_ALIGN,
|
|
||||||
};
|
|
||||||
if (!hasLeftComponent && !hasRightComponent) {
|
|
||||||
style.left = 0;
|
|
||||||
style.right = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return style;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const getAppBarHeight = isLandscape => {
|
const getAppBarHeight = isLandscape => {
|
||||||
return Platform.OS === 'ios'
|
return Platform.OS === 'ios'
|
||||||
@@ -132,7 +92,6 @@ class Header extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_renderTitleComponent = props => {
|
_renderTitleComponent = props => {
|
||||||
const { layoutPreset } = this.props;
|
|
||||||
const { options } = props.scene.descriptor;
|
const { options } = props.scene.descriptor;
|
||||||
const headerTitle = options.headerTitle;
|
const headerTitle = options.headerTitle;
|
||||||
if (React.isValidElement(headerTitle)) {
|
if (React.isValidElement(headerTitle)) {
|
||||||
@@ -144,10 +103,10 @@ class Header extends React.PureComponent {
|
|||||||
const color = options.headerTintColor;
|
const color = options.headerTintColor;
|
||||||
const allowFontScaling = options.headerTitleAllowFontScaling;
|
const allowFontScaling = options.headerTitleAllowFontScaling;
|
||||||
|
|
||||||
// When title is centered, the width of left/right components depends on the
|
// On iOS, width of left/right components depends on the calculated
|
||||||
// calculated size of the title.
|
// size of the title.
|
||||||
const onLayout =
|
const onLayoutIOS =
|
||||||
layoutPreset === 'center'
|
Platform.OS === 'ios'
|
||||||
? e => {
|
? e => {
|
||||||
this.setState({
|
this.setState({
|
||||||
widths: {
|
widths: {
|
||||||
@@ -158,24 +117,18 @@ class Header extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
const HeaderTitleComponent =
|
const RenderedHeaderTitle =
|
||||||
headerTitle && typeof headerTitle !== 'string'
|
headerTitle && typeof headerTitle !== 'string'
|
||||||
? headerTitle
|
? headerTitle
|
||||||
: HeaderTitle;
|
: HeaderTitle;
|
||||||
return (
|
return (
|
||||||
<HeaderTitleComponent
|
<RenderedHeaderTitle
|
||||||
onLayout={onLayout}
|
onLayout={onLayoutIOS}
|
||||||
allowFontScaling={allowFontScaling == null ? true : allowFontScaling}
|
allowFontScaling={allowFontScaling == null ? true : allowFontScaling}
|
||||||
style={[
|
style={[color ? { color } : null, titleStyle]}
|
||||||
color ? { color } : null,
|
|
||||||
layoutPreset === 'center'
|
|
||||||
? { textAlign: 'center' }
|
|
||||||
: { textAlign: 'left' },
|
|
||||||
titleStyle,
|
|
||||||
]}
|
|
||||||
>
|
>
|
||||||
{titleString}
|
{titleString}
|
||||||
</HeaderTitleComponent>
|
</RenderedHeaderTitle>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -188,7 +141,7 @@ class Header extends React.PureComponent {
|
|||||||
return options.headerLeft;
|
return options.headerLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.headerLeft && props.scene.index === 0) {
|
if (props.scene.index === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,9 +167,7 @@ class Header extends React.PureComponent {
|
|||||||
backImage={options.headerBackImage}
|
backImage={options.headerBackImage}
|
||||||
title={backButtonTitle}
|
title={backButtonTitle}
|
||||||
truncatedTitle={truncatedBackButtonTitle}
|
truncatedTitle={truncatedBackButtonTitle}
|
||||||
backTitleVisible={this.props.backTitleVisible}
|
|
||||||
titleStyle={options.headerBackTitleStyle}
|
titleStyle={options.headerBackTitleStyle}
|
||||||
layoutPreset={this.props.layoutPreset}
|
|
||||||
width={width}
|
width={width}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@@ -269,11 +220,6 @@ class Header extends React.PureComponent {
|
|||||||
|
|
||||||
const { transitionPreset } = this.props;
|
const { transitionPreset } = this.props;
|
||||||
|
|
||||||
let { style } = props;
|
|
||||||
if (options.headerLeftContainerStyle) {
|
|
||||||
style = [style, options.headerLeftContainerStyle];
|
|
||||||
}
|
|
||||||
|
|
||||||
// On Android, or if we have a custom header left, or if we have a custom back image, we
|
// On Android, or if we have a custom header left, or if we have a custom back image, we
|
||||||
// do not use the modular header (which is the one that imitates UINavigationController)
|
// do not use the modular header (which is the one that imitates UINavigationController)
|
||||||
if (
|
if (
|
||||||
@@ -283,14 +229,14 @@ class Header extends React.PureComponent {
|
|||||||
options.headerLeft === null
|
options.headerLeft === null
|
||||||
) {
|
) {
|
||||||
return this._renderSubView(
|
return this._renderSubView(
|
||||||
{ ...props, style },
|
props,
|
||||||
'left',
|
'left',
|
||||||
this._renderLeftComponent,
|
this._renderLeftComponent,
|
||||||
this.props.leftInterpolator
|
this.props.leftInterpolator
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return this._renderModularSubView(
|
return this._renderModularSubView(
|
||||||
{ ...props, style },
|
props,
|
||||||
'left',
|
'left',
|
||||||
this._renderModularLeftComponent,
|
this._renderModularLeftComponent,
|
||||||
this.props.leftLabelInterpolator,
|
this.props.leftLabelInterpolator,
|
||||||
@@ -300,17 +246,24 @@ class Header extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_renderTitle(props, options) {
|
_renderTitle(props, options) {
|
||||||
const { layoutPreset, transitionPreset } = this.props;
|
const style = {};
|
||||||
let style = [
|
const { transitionPreset } = this.props;
|
||||||
{ justifyContent: layoutPreset === 'center' ? 'center' : 'flex-start' },
|
|
||||||
getTitleOffsets(
|
if (Platform.OS === 'android') {
|
||||||
layoutPreset,
|
if (!options.hasLeftComponent) {
|
||||||
false,
|
style.left = 0;
|
||||||
options.hasLeftComponent,
|
}
|
||||||
options.hasRightComponent
|
if (!options.hasRightComponent) {
|
||||||
),
|
style.right = 0;
|
||||||
options.headerTitleContainerStyle,
|
}
|
||||||
];
|
} else if (
|
||||||
|
Platform.OS === 'ios' &&
|
||||||
|
!options.hasLeftComponent &&
|
||||||
|
!options.hasRightComponent
|
||||||
|
) {
|
||||||
|
style.left = 0;
|
||||||
|
style.right = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return this._renderSubView(
|
return this._renderSubView(
|
||||||
{ ...props, style },
|
{ ...props, style },
|
||||||
@@ -323,15 +276,8 @@ class Header extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_renderRight(props) {
|
_renderRight(props) {
|
||||||
const { options } = props.scene.descriptor;
|
|
||||||
|
|
||||||
let { style } = props;
|
|
||||||
if (options.headerRightContainerStyle) {
|
|
||||||
style = [style, options.headerRightContainerStyle];
|
|
||||||
}
|
|
||||||
|
|
||||||
return this._renderSubView(
|
return this._renderSubView(
|
||||||
{ ...props, style },
|
props,
|
||||||
'right',
|
'right',
|
||||||
this._renderRightComponent,
|
this._renderRightComponent,
|
||||||
this.props.rightInterpolator
|
this.props.rightInterpolator
|
||||||
@@ -425,6 +371,7 @@ class Header extends React.PureComponent {
|
|||||||
styles[name],
|
styles[name],
|
||||||
props.style,
|
props.style,
|
||||||
styleInterpolator({
|
styleInterpolator({
|
||||||
|
// todo: determine if we really need to splat all this.props
|
||||||
...this.props,
|
...this.props,
|
||||||
...props,
|
...props,
|
||||||
}),
|
}),
|
||||||
@@ -445,7 +392,6 @@ class Header extends React.PureComponent {
|
|||||||
const title = this._renderTitle(props, {
|
const title = this._renderTitle(props, {
|
||||||
hasLeftComponent: !!left,
|
hasLeftComponent: !!left,
|
||||||
hasRightComponent: !!right,
|
hasRightComponent: !!right,
|
||||||
headerTitleContainerStyle: options.headerTitleContainerStyle,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const { isLandscape, transitionPreset } = this.props;
|
const { isLandscape, transitionPreset } = this.props;
|
||||||
@@ -581,11 +527,8 @@ class Header extends React.PureComponent {
|
|||||||
<Animated.View
|
<Animated.View
|
||||||
style={[
|
style={[
|
||||||
this.props.layoutInterpolator(this.props),
|
this.props.layoutInterpolator(this.props),
|
||||||
Platform.OS === 'ios' && !options.headerTransparent
|
Platform.OS === 'ios'
|
||||||
? {
|
? { backgroundColor: DEFAULT_BACKGROUND_COLOR }
|
||||||
backgroundColor:
|
|
||||||
safeHeaderStyle.backgroundColor || DEFAULT_BACKGROUND_COLOR,
|
|
||||||
}
|
|
||||||
: null,
|
: null,
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
@@ -643,8 +586,6 @@ const styles = StyleSheet.create({
|
|||||||
left: 0,
|
left: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
...platformContainerStyles,
|
...platformContainerStyles,
|
||||||
borderBottomWidth: 0,
|
|
||||||
borderBottomColor: 'transparent',
|
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
},
|
},
|
||||||
header: {
|
header: {
|
||||||
@@ -677,9 +618,12 @@ const styles = StyleSheet.create({
|
|||||||
title: {
|
title: {
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
top: 0,
|
top: 0,
|
||||||
|
left: TITLE_OFFSET,
|
||||||
|
right: TITLE_OFFSET,
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
|
justifyContent: Platform.OS === 'ios' ? 'center' : 'flex-start',
|
||||||
},
|
},
|
||||||
left: {
|
left: {
|
||||||
left: 0,
|
left: 0,
|
||||||
|
|||||||
@@ -62,38 +62,9 @@ class HeaderBackButton extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { onPress, pressColorAndroid, layoutPreset, title } = this.props;
|
|
||||||
|
|
||||||
let button = (
|
|
||||||
<TouchableItem
|
|
||||||
accessibilityComponentType="button"
|
|
||||||
accessibilityLabel={title}
|
|
||||||
accessibilityTraits="button"
|
|
||||||
testID="header-back"
|
|
||||||
delayPressIn={0}
|
|
||||||
onPress={onPress}
|
|
||||||
pressColor={pressColorAndroid}
|
|
||||||
style={styles.container}
|
|
||||||
borderless
|
|
||||||
>
|
|
||||||
<View style={styles.container}>
|
|
||||||
{this._renderBackImage()}
|
|
||||||
{this._maybeRenderTitle()}
|
|
||||||
</View>
|
|
||||||
</TouchableItem>
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Platform.OS === 'android') {
|
|
||||||
return <View style={styles.androidButtonWrapper}>{button}</View>;
|
|
||||||
} else {
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_maybeRenderTitle() {
|
|
||||||
const {
|
const {
|
||||||
layoutPreset,
|
onPress,
|
||||||
backTitleVisible,
|
pressColorAndroid,
|
||||||
width,
|
width,
|
||||||
title,
|
title,
|
||||||
titleStyle,
|
titleStyle,
|
||||||
@@ -108,35 +79,41 @@ class HeaderBackButton extends React.PureComponent {
|
|||||||
|
|
||||||
const backButtonTitle = renderTruncated ? truncatedTitle : title;
|
const backButtonTitle = renderTruncated ? truncatedTitle : title;
|
||||||
|
|
||||||
// If the left preset is used and we aren't on Android, then we
|
|
||||||
// default to disabling the label
|
|
||||||
const titleDefaultsToDisabled =
|
|
||||||
layoutPreset === 'left' ||
|
|
||||||
Platform.OS === 'android' ||
|
|
||||||
typeof backButtonTitle !== 'string';
|
|
||||||
|
|
||||||
// If the title is explicitly enabled then we respect that
|
|
||||||
if (titleDefaultsToDisabled && !backTitleVisible) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Text
|
<TouchableItem
|
||||||
onLayout={this._onTextLayout}
|
accessibilityComponentType="button"
|
||||||
style={[styles.title, !!tintColor && { color: tintColor }, titleStyle]}
|
accessibilityLabel={backButtonTitle}
|
||||||
numberOfLines={1}
|
accessibilityTraits="button"
|
||||||
|
testID="header-back"
|
||||||
|
delayPressIn={0}
|
||||||
|
onPress={onPress}
|
||||||
|
pressColor={pressColorAndroid}
|
||||||
|
style={styles.container}
|
||||||
|
borderless
|
||||||
>
|
>
|
||||||
{backButtonTitle}
|
<View style={styles.container}>
|
||||||
</Text>
|
{this._renderBackImage()}
|
||||||
|
{Platform.OS === 'ios' &&
|
||||||
|
typeof backButtonTitle === 'string' && (
|
||||||
|
<Text
|
||||||
|
onLayout={this._onTextLayout}
|
||||||
|
style={[
|
||||||
|
styles.title,
|
||||||
|
!!tintColor && { color: tintColor },
|
||||||
|
titleStyle,
|
||||||
|
]}
|
||||||
|
numberOfLines={1}
|
||||||
|
>
|
||||||
|
{backButtonTitle}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</TouchableItem>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
androidButtonWrapper: {
|
|
||||||
margin: 13,
|
|
||||||
backgroundColor: 'transparent',
|
|
||||||
},
|
|
||||||
container: {
|
container: {
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
@@ -160,7 +137,7 @@ const styles = StyleSheet.create({
|
|||||||
: {
|
: {
|
||||||
height: 24,
|
height: 24,
|
||||||
width: 24,
|
width: 24,
|
||||||
margin: 3,
|
margin: 16,
|
||||||
resizeMode: 'contain',
|
resizeMode: 'contain',
|
||||||
transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],
|
transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ const styles = StyleSheet.create({
|
|||||||
fontSize: Platform.OS === 'ios' ? 17 : 20,
|
fontSize: Platform.OS === 'ios' ? 17 : 20,
|
||||||
fontWeight: Platform.OS === 'ios' ? '700' : '500',
|
fontWeight: Platform.OS === 'ios' ? '700' : '500',
|
||||||
color: 'rgba(0, 0, 0, .9)',
|
color: 'rgba(0, 0, 0, .9)',
|
||||||
|
textAlign: Platform.OS === 'ios' ? 'center' : 'left',
|
||||||
marginHorizontal: 16,
|
marginHorizontal: 16,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -130,26 +130,16 @@ export default function ScenesReducer(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const lastScene = scenes.find(scene => scene.route.key === route.key);
|
const lastScene = scenes.find(scene => scene.route.key === route.key);
|
||||||
|
const descriptor = lastScene && lastScene.descriptor;
|
||||||
|
|
||||||
// We can get into a weird place where we have a queued transition and then clobber
|
staleScenes.set(key, {
|
||||||
// that transition without ever actually rendering the scene, in which case
|
index,
|
||||||
// there is no lastScene. If the descriptor is not available on the lastScene
|
isActive: false,
|
||||||
// or the descriptors prop then we just skip adding it to stale scenes and it's
|
isStale: true,
|
||||||
// not ever rendered.
|
key,
|
||||||
const descriptor = lastScene
|
route,
|
||||||
? lastScene.descriptor
|
descriptor,
|
||||||
: descriptors[route.key];
|
});
|
||||||
|
|
||||||
if (descriptor) {
|
|
||||||
staleScenes.set(key, {
|
|
||||||
index,
|
|
||||||
isActive: false,
|
|
||||||
isStale: true,
|
|
||||||
key,
|
|
||||||
route,
|
|
||||||
descriptor,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,14 +24,10 @@ class StackView extends React.Component {
|
|||||||
screenProps={this.props.screenProps}
|
screenProps={this.props.screenProps}
|
||||||
navigation={this.props.navigation}
|
navigation={this.props.navigation}
|
||||||
descriptors={this.props.descriptors}
|
descriptors={this.props.descriptors}
|
||||||
onTransitionStart={
|
onTransitionStart={this.props.onTransitionStart}
|
||||||
this.props.onTransitionStart ||
|
|
||||||
this.props.navigationConfig.onTransitionStart
|
|
||||||
}
|
|
||||||
onTransitionEnd={(transition, lastTransition) => {
|
onTransitionEnd={(transition, lastTransition) => {
|
||||||
const { navigationConfig, navigation } = this.props;
|
const { navigationConfig, navigation } = this.props;
|
||||||
const onTransitionEnd =
|
const { onTransitionEnd } = navigationConfig;
|
||||||
this.props.onTransitionEnd || navigationConfig.onTransitionEnd;
|
|
||||||
if (transition.navigation.state.isTransitioning) {
|
if (transition.navigation.state.isTransitioning) {
|
||||||
navigation.dispatch(
|
navigation.dispatch(
|
||||||
StackActions.completeTransition({
|
StackActions.completeTransition({
|
||||||
|
|||||||
@@ -34,12 +34,6 @@ const IS_IPHONE_X =
|
|||||||
|
|
||||||
const EaseInOut = Easing.inOut(Easing.ease);
|
const EaseInOut = Easing.inOut(Easing.ease);
|
||||||
|
|
||||||
/**
|
|
||||||
* Enumerate possible values for validation
|
|
||||||
*/
|
|
||||||
const HEADER_LAYOUT_PRESET_VALUES = ['center', 'left'];
|
|
||||||
const HEADER_TRANSITION_PRESET_VALUES = ['uikit', 'fade-in-place'];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The max duration of the card animation in milliseconds after released gesture.
|
* The max duration of the card animation in milliseconds after released gesture.
|
||||||
* The actual duration should be always less then that because the rest distance
|
* The actual duration should be always less then that because the rest distance
|
||||||
@@ -165,8 +159,6 @@ class StackViewLayout extends React.Component {
|
|||||||
scene,
|
scene,
|
||||||
mode: headerMode,
|
mode: headerMode,
|
||||||
transitionPreset: this._getHeaderTransitionPreset(),
|
transitionPreset: this._getHeaderTransitionPreset(),
|
||||||
layoutPreset: this._getHeaderLayoutPreset(),
|
|
||||||
backTitleVisible: this._getheaderBackTitleVisible(),
|
|
||||||
leftInterpolator: headerLeftInterpolator,
|
leftInterpolator: headerLeftInterpolator,
|
||||||
titleInterpolator: headerTitleInterpolator,
|
titleInterpolator: headerTitleInterpolator,
|
||||||
rightInterpolator: headerRightInterpolator,
|
rightInterpolator: headerRightInterpolator,
|
||||||
@@ -485,40 +477,6 @@ class StackViewLayout extends React.Component {
|
|||||||
return 'float';
|
return 'float';
|
||||||
}
|
}
|
||||||
|
|
||||||
_getHeaderLayoutPreset() {
|
|
||||||
const { headerLayoutPreset } = this.props;
|
|
||||||
if (headerLayoutPreset) {
|
|
||||||
if (__DEV__) {
|
|
||||||
if (
|
|
||||||
this._getHeaderTransitionPreset() === 'uikit' &&
|
|
||||||
headerLayoutPreset === 'left' &&
|
|
||||||
Platform.OS === 'ios'
|
|
||||||
) {
|
|
||||||
console.warn(
|
|
||||||
`headerTransitionPreset with the value 'ui-kit' is incompatible with headerLayoutPreset 'left'`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (HEADER_LAYOUT_PRESET_VALUES.includes(headerLayoutPreset)) {
|
|
||||||
return headerLayoutPreset;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__DEV__) {
|
|
||||||
console.error(
|
|
||||||
`Invalid configuration applied for headerLayoutPreset - expected one of ${HEADER_LAYOUT_PRESET_VALUES.join(
|
|
||||||
', '
|
|
||||||
)} but received ${JSON.stringify(headerLayoutPreset)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Platform.OS === 'android') {
|
|
||||||
return 'left';
|
|
||||||
} else {
|
|
||||||
return 'center';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_getHeaderTransitionPreset() {
|
_getHeaderTransitionPreset() {
|
||||||
// On Android or with header mode screen, we always just use in-place,
|
// On Android or with header mode screen, we always just use in-place,
|
||||||
// we ignore the option entirely (at least until we have other presets)
|
// we ignore the option entirely (at least until we have other presets)
|
||||||
@@ -526,28 +484,12 @@ class StackViewLayout extends React.Component {
|
|||||||
return 'fade-in-place';
|
return 'fade-in-place';
|
||||||
}
|
}
|
||||||
|
|
||||||
const { headerTransitionPreset } = this.props;
|
// TODO: validations: 'fade-in-place' or 'uikit' are valid
|
||||||
if (headerTransitionPreset) {
|
if (this.props.headerTransitionPreset) {
|
||||||
if (HEADER_TRANSITION_PRESET_VALUES.includes(headerTransitionPreset)) {
|
return this.props.headerTransitionPreset;
|
||||||
return headerTransitionPreset;
|
} else {
|
||||||
}
|
return 'fade-in-place';
|
||||||
|
|
||||||
if (__DEV__) {
|
|
||||||
console.error(
|
|
||||||
`Invalid configuration applied for headerTransitionPreset - expected one of ${HEADER_TRANSITION_PRESET_VALUES.join(
|
|
||||||
', '
|
|
||||||
)} but received ${JSON.stringify(headerTransitionPreset)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'fade-in-place';
|
|
||||||
}
|
|
||||||
|
|
||||||
_getheaderBackTitleVisible() {
|
|
||||||
const { headerBackTitleVisible } = this.props;
|
|
||||||
|
|
||||||
return headerBackTitleVisible;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_renderInnerScene(scene) {
|
_renderInnerScene(scene) {
|
||||||
|
|||||||
@@ -107,8 +107,4 @@ function getTransitionConfig(
|
|||||||
export default {
|
export default {
|
||||||
defaultTransitionConfig,
|
defaultTransitionConfig,
|
||||||
getTransitionConfig,
|
getTransitionConfig,
|
||||||
SlideFromRightIOS,
|
|
||||||
ModalSlideFromBottomIOS,
|
|
||||||
FadeInFromBottomAndroid,
|
|
||||||
FadeOutToBottomAndroid,
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ class Transitioner extends React.Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<View onLayout={this._onLayout} style={styles.main}>
|
<View onLayout={this._onLayout} style={[styles.main]}>
|
||||||
{this.props.render(this._transitionProps, this._prevTransitionProps)}
|
{this.props.render(this._transitionProps, this._prevTransitionProps)}
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,17 +1,9 @@
|
|||||||
import ScenesReducer from '../ScenesReducer';
|
import ScenesReducer from '../ScenesReducer';
|
||||||
|
|
||||||
const MOCK_DESCRIPTOR = {};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simulate scenes transtion with changes of navigation states.
|
* Simulate scenes transtion with changes of navigation states.
|
||||||
*/
|
*/
|
||||||
function testTransition(states) {
|
function testTransition(states) {
|
||||||
let descriptors = states
|
|
||||||
.reduce((acc, state) => acc.concat(state), [])
|
|
||||||
.reduce((acc, key) => {
|
|
||||||
acc[key] = MOCK_DESCRIPTOR;
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
const routes = states.map(keys => ({
|
const routes = states.map(keys => ({
|
||||||
index: 0,
|
index: 0,
|
||||||
routes: keys.map(key => ({ key, routeName: '' })),
|
routes: keys.map(key => ({ key, routeName: '' })),
|
||||||
@@ -21,7 +13,7 @@ function testTransition(states) {
|
|||||||
let scenes = [];
|
let scenes = [];
|
||||||
let prevState = null;
|
let prevState = null;
|
||||||
routes.forEach(nextState => {
|
routes.forEach(nextState => {
|
||||||
scenes = ScenesReducer(scenes, nextState, prevState, descriptors);
|
scenes = ScenesReducer(scenes, nextState, prevState);
|
||||||
prevState = nextState;
|
prevState = nextState;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -37,7 +29,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_1',
|
key: 'scene_1',
|
||||||
route: {
|
route: {
|
||||||
key: '1',
|
key: '1',
|
||||||
@@ -48,7 +39,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 1,
|
index: 1,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_2',
|
key: 'scene_2',
|
||||||
route: {
|
route: {
|
||||||
key: '2',
|
key: '2',
|
||||||
@@ -67,7 +57,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_1',
|
key: 'scene_1',
|
||||||
route: {
|
route: {
|
||||||
key: '1',
|
key: '1',
|
||||||
@@ -78,7 +67,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 1,
|
index: 1,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_2',
|
key: 'scene_2',
|
||||||
route: {
|
route: {
|
||||||
key: '2',
|
key: '2',
|
||||||
@@ -89,7 +77,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 2,
|
index: 2,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_3',
|
key: 'scene_3',
|
||||||
route: {
|
route: {
|
||||||
key: '3',
|
key: '3',
|
||||||
@@ -149,10 +136,8 @@ describe('ScenesReducer', () => {
|
|||||||
isTransitioning: false,
|
isTransitioning: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const descriptors = { 1: jest.mock(), 2: jest.mock() };
|
const scenes1 = ScenesReducer([], state1, null);
|
||||||
|
const scenes2 = ScenesReducer(scenes1, state2, state1);
|
||||||
const scenes1 = ScenesReducer([], state1, null, descriptors);
|
|
||||||
const scenes2 = ScenesReducer(scenes1, state2, state1, descriptors);
|
|
||||||
expect(scenes1).not.toBe(scenes2);
|
expect(scenes1).not.toBe(scenes2);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -175,10 +160,8 @@ describe('ScenesReducer', () => {
|
|||||||
isTransitioning: false,
|
isTransitioning: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const descriptors = { 1: MOCK_DESCRIPTOR, 2: MOCK_DESCRIPTOR };
|
const scenes1 = ScenesReducer([], state1, null);
|
||||||
|
const scenes2 = ScenesReducer(scenes1, state2, state1);
|
||||||
const scenes1 = ScenesReducer([], state1, null, descriptors);
|
|
||||||
const scenes2 = ScenesReducer(scenes1, state2, state1, descriptors);
|
|
||||||
expect(scenes1).not.toBe(scenes2);
|
expect(scenes1).not.toBe(scenes2);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -201,9 +184,8 @@ describe('ScenesReducer', () => {
|
|||||||
isTransitioning: false,
|
isTransitioning: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const descriptors = { 1: MOCK_DESCRIPTOR, 2: MOCK_DESCRIPTOR };
|
const scenes1 = ScenesReducer([], state1, null);
|
||||||
const scenes1 = ScenesReducer([], state1, null, descriptors);
|
const scenes2 = ScenesReducer(scenes1, state2, state1);
|
||||||
const scenes2 = ScenesReducer(scenes1, state2, state1, descriptors);
|
|
||||||
expect(scenes1).not.toBe(scenes2);
|
expect(scenes1).not.toBe(scenes2);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -216,7 +198,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_1',
|
key: 'scene_1',
|
||||||
route: {
|
route: {
|
||||||
key: '1',
|
key: '1',
|
||||||
@@ -227,7 +208,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 1,
|
index: 1,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_2',
|
key: 'scene_2',
|
||||||
route: {
|
route: {
|
||||||
key: '2',
|
key: '2',
|
||||||
@@ -238,7 +218,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 2,
|
index: 2,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: true,
|
isStale: true,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_3',
|
key: 'scene_3',
|
||||||
route: {
|
route: {
|
||||||
key: '3',
|
key: '3',
|
||||||
@@ -256,7 +235,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: true,
|
isStale: true,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_1',
|
key: 'scene_1',
|
||||||
route: {
|
route: {
|
||||||
key: '1',
|
key: '1',
|
||||||
@@ -267,7 +245,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_3',
|
key: 'scene_3',
|
||||||
route: {
|
route: {
|
||||||
key: '3',
|
key: '3',
|
||||||
@@ -278,7 +255,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 1,
|
index: 1,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: true,
|
isStale: true,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_2',
|
key: 'scene_2',
|
||||||
route: {
|
route: {
|
||||||
key: '2',
|
key: '2',
|
||||||
@@ -296,7 +272,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: true,
|
isStale: true,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_1',
|
key: 'scene_1',
|
||||||
route: {
|
route: {
|
||||||
key: '1',
|
key: '1',
|
||||||
@@ -307,7 +282,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isStale: false,
|
isStale: false,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_2',
|
key: 'scene_2',
|
||||||
route: {
|
route: {
|
||||||
key: '2',
|
key: '2',
|
||||||
@@ -318,7 +292,6 @@ describe('ScenesReducer', () => {
|
|||||||
index: 0,
|
index: 0,
|
||||||
isActive: false,
|
isActive: false,
|
||||||
isStale: true,
|
isStale: true,
|
||||||
descriptor: MOCK_DESCRIPTOR,
|
|
||||||
key: 'scene_3',
|
key: 'scene_3',
|
||||||
route: {
|
route: {
|
||||||
key: '3',
|
key: '3',
|
||||||
|
|||||||
361
yarn.lock
361
yarn.lock
@@ -3,14 +3,14 @@
|
|||||||
|
|
||||||
|
|
||||||
"@babel/code-frame@^7.0.0-beta.35":
|
"@babel/code-frame@^7.0.0-beta.35":
|
||||||
version "7.0.0-beta.55"
|
version "7.0.0-beta.51"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.55.tgz#71f530e7b010af5eb7a7df7752f78921dd57e9ee"
|
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/highlight" "7.0.0-beta.55"
|
"@babel/highlight" "7.0.0-beta.51"
|
||||||
|
|
||||||
"@babel/highlight@7.0.0-beta.55":
|
"@babel/highlight@7.0.0-beta.51":
|
||||||
version "7.0.0-beta.55"
|
version "7.0.0-beta.51"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.55.tgz#988653647d629c261dae156e74d5f0252ba520c0"
|
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d"
|
||||||
dependencies:
|
dependencies:
|
||||||
chalk "^2.0.0"
|
chalk "^2.0.0"
|
||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
@@ -20,10 +20,6 @@ abab@^1.0.4:
|
|||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
|
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
|
||||||
|
|
||||||
abab@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f"
|
|
||||||
|
|
||||||
abbrev@1:
|
abbrev@1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
|
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
|
||||||
@@ -62,7 +58,7 @@ acorn@^3.0.4:
|
|||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
|
||||||
|
|
||||||
acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3:
|
acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0:
|
||||||
version "5.7.1"
|
version "5.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
|
||||||
|
|
||||||
@@ -164,8 +160,8 @@ anymatch@^2.0.0:
|
|||||||
normalize-path "^2.1.1"
|
normalize-path "^2.1.1"
|
||||||
|
|
||||||
app-root-path@^2.0.0:
|
app-root-path@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a"
|
resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
|
||||||
|
|
||||||
append-transform@^1.0.0:
|
append-transform@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
@@ -198,9 +194,9 @@ argv@0.0.2:
|
|||||||
version "0.0.2"
|
version "0.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab"
|
resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab"
|
||||||
|
|
||||||
aria-query@^3.0.0:
|
aria-query@^0.7.0:
|
||||||
version "3.0.0"
|
version "0.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
|
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e"
|
||||||
dependencies:
|
dependencies:
|
||||||
ast-types-flow "0.0.7"
|
ast-types-flow "0.0.7"
|
||||||
commander "^2.11.0"
|
commander "^2.11.0"
|
||||||
@@ -284,8 +280,8 @@ arrify@^1.0.0, arrify@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
|
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
|
||||||
|
|
||||||
art@^0.10.0:
|
art@^0.10.0:
|
||||||
version "0.10.3"
|
version "0.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/art/-/art-0.10.3.tgz#b01d84a968ccce6208df55a733838c96caeeaea2"
|
resolved "https://registry.yarnpkg.com/art/-/art-0.10.2.tgz#55c3738d82a3a07e0623943f070ebe86297253d9"
|
||||||
|
|
||||||
asap@~2.0.3:
|
asap@~2.0.3:
|
||||||
version "2.0.6"
|
version "2.0.6"
|
||||||
@@ -307,7 +303,7 @@ assign-symbols@^1.0.0:
|
|||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
|
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
|
||||||
|
|
||||||
ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
|
ast-types-flow@0.0.7:
|
||||||
version "0.0.7"
|
version "0.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
|
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
|
||||||
|
|
||||||
@@ -353,9 +349,9 @@ aws4@^1.2.1, aws4@^1.6.0:
|
|||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
|
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
|
||||||
|
|
||||||
axobject-query@^2.0.1:
|
axobject-query@^0.1.0:
|
||||||
version "2.0.1"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07"
|
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0"
|
||||||
dependencies:
|
dependencies:
|
||||||
ast-types-flow "0.0.7"
|
ast-types-flow "0.0.7"
|
||||||
|
|
||||||
@@ -870,8 +866,8 @@ babel-preset-es2015-node@^6.1.1:
|
|||||||
semver "5.x"
|
semver "5.x"
|
||||||
|
|
||||||
babel-preset-fbjs@^2.1.2, babel-preset-fbjs@^2.1.4:
|
babel-preset-fbjs@^2.1.2, babel-preset-fbjs@^2.1.4:
|
||||||
version "2.2.0"
|
version "2.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.2.0.tgz#c25b879a914feefd964052b1bce4c90ee915023a"
|
resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz#22f358e6654073acf61e47a052a777d7bccf03af"
|
||||||
dependencies:
|
dependencies:
|
||||||
babel-plugin-check-es2015-constants "^6.8.0"
|
babel-plugin-check-es2015-constants "^6.8.0"
|
||||||
babel-plugin-syntax-class-properties "^6.8.0"
|
babel-plugin-syntax-class-properties "^6.8.0"
|
||||||
@@ -1080,14 +1076,14 @@ batch@0.5.3:
|
|||||||
resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464"
|
resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464"
|
||||||
|
|
||||||
bcrypt-pbkdf@^1.0.0:
|
bcrypt-pbkdf@^1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
|
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
|
||||||
dependencies:
|
dependencies:
|
||||||
tweetnacl "^0.14.3"
|
tweetnacl "^0.14.3"
|
||||||
|
|
||||||
big-integer@^1.6.7:
|
big-integer@^1.6.7:
|
||||||
version "1.6.34"
|
version "1.6.31"
|
||||||
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.34.tgz#701affc8f0d73c490930a6b482dc23ed6ffc7484"
|
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.31.tgz#6d7852486e67c642502dcc03f7225a245c9fc7fa"
|
||||||
|
|
||||||
binary-extensions@^1.0.0:
|
binary-extensions@^1.0.0:
|
||||||
version "1.11.0"
|
version "1.11.0"
|
||||||
@@ -1173,8 +1169,8 @@ bser@^2.0.0:
|
|||||||
node-int64 "^0.4.0"
|
node-int64 "^0.4.0"
|
||||||
|
|
||||||
buffer-from@^1.0.0:
|
buffer-from@^1.0.0:
|
||||||
version "1.1.1"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
|
||||||
|
|
||||||
builtin-modules@^1.0.0:
|
builtin-modules@^1.0.0:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
@@ -1409,8 +1405,8 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
|
|||||||
delayed-stream "~1.0.0"
|
delayed-stream "~1.0.0"
|
||||||
|
|
||||||
commander@^2.11.0, commander@^2.9.0:
|
commander@^2.11.0, commander@^2.9.0:
|
||||||
version "2.16.0"
|
version "2.15.1"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||||
|
|
||||||
commander@~2.13.0:
|
commander@~2.13.0:
|
||||||
version "2.13.0"
|
version "2.13.0"
|
||||||
@@ -1436,7 +1432,7 @@ compressible@~2.0.5:
|
|||||||
|
|
||||||
compression@~1.5.2:
|
compression@~1.5.2:
|
||||||
version "1.5.2"
|
version "1.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395"
|
resolved "http://registry.npmjs.org/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395"
|
||||||
dependencies:
|
dependencies:
|
||||||
accepts "~1.2.12"
|
accepts "~1.2.12"
|
||||||
bytes "2.1.0"
|
bytes "2.1.0"
|
||||||
@@ -1614,12 +1610,12 @@ csrf@~3.0.0:
|
|||||||
uid-safe "2.1.4"
|
uid-safe "2.1.4"
|
||||||
|
|
||||||
cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
|
cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
|
||||||
version "0.3.4"
|
version "0.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797"
|
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
|
||||||
|
|
||||||
cssstyle@^1.0.0:
|
"cssstyle@>= 0.3.1 < 0.4.0":
|
||||||
version "1.0.0"
|
version "0.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129"
|
resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf"
|
||||||
dependencies:
|
dependencies:
|
||||||
cssom "0.3.x"
|
cssom "0.3.x"
|
||||||
|
|
||||||
@@ -1632,7 +1628,7 @@ csurf@~1.8.3:
|
|||||||
csrf "~3.0.0"
|
csrf "~3.0.0"
|
||||||
http-errors "~1.3.1"
|
http-errors "~1.3.1"
|
||||||
|
|
||||||
damerau-levenshtein@^1.0.4:
|
damerau-levenshtein@^1.0.0:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
|
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
|
||||||
|
|
||||||
@@ -1795,18 +1791,17 @@ dom-walk@^0.1.0:
|
|||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
|
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
|
||||||
|
|
||||||
domexception@^1.0.1:
|
domexception@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
|
resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
|
||||||
dependencies:
|
dependencies:
|
||||||
webidl-conversions "^4.0.2"
|
webidl-conversions "^4.0.2"
|
||||||
|
|
||||||
ecc-jsbn@~0.1.1:
|
ecc-jsbn@~0.1.1:
|
||||||
version "0.1.2"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
|
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
|
||||||
dependencies:
|
dependencies:
|
||||||
jsbn "~0.1.0"
|
jsbn "~0.1.0"
|
||||||
safer-buffer "^2.1.0"
|
|
||||||
|
|
||||||
ee-first@1.1.1:
|
ee-first@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
@@ -1816,7 +1811,7 @@ elegant-spinner@^1.0.1:
|
|||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
|
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
|
||||||
|
|
||||||
emoji-regex@^6.5.1:
|
emoji-regex@^6.1.0:
|
||||||
version "6.5.1"
|
version "6.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
|
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
|
||||||
|
|
||||||
@@ -1883,9 +1878,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
|
|||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||||
|
|
||||||
escodegen@^1.9.1:
|
escodegen@^1.9.0:
|
||||||
version "1.11.0"
|
version "1.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
|
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e"
|
||||||
dependencies:
|
dependencies:
|
||||||
esprima "^3.1.3"
|
esprima "^3.1.3"
|
||||||
estraverse "^4.2.0"
|
estraverse "^4.2.0"
|
||||||
@@ -1915,8 +1910,8 @@ eslint-module-utils@^2.2.0:
|
|||||||
pkg-dir "^1.0.0"
|
pkg-dir "^1.0.0"
|
||||||
|
|
||||||
eslint-plugin-import@^2.7.0:
|
eslint-plugin-import@^2.7.0:
|
||||||
version "2.13.0"
|
version "2.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz#df24f241175e312d91662dc91ca84064caec14ed"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz#dad31781292d6664b25317fd049d2e2b2f02205d"
|
||||||
dependencies:
|
dependencies:
|
||||||
contains-path "^0.1.0"
|
contains-path "^0.1.0"
|
||||||
debug "^2.6.8"
|
debug "^2.6.8"
|
||||||
@@ -1930,37 +1925,36 @@ eslint-plugin-import@^2.7.0:
|
|||||||
resolve "^1.6.0"
|
resolve "^1.6.0"
|
||||||
|
|
||||||
eslint-plugin-jsx-a11y@^6.0.2:
|
eslint-plugin-jsx-a11y@^6.0.2:
|
||||||
version "6.1.1"
|
version "6.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.1.tgz#7bf56dbe7d47d811d14dbb3ddff644aa656ce8e1"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5"
|
||||||
dependencies:
|
dependencies:
|
||||||
aria-query "^3.0.0"
|
aria-query "^0.7.0"
|
||||||
array-includes "^3.0.3"
|
array-includes "^3.0.3"
|
||||||
ast-types-flow "^0.0.7"
|
ast-types-flow "0.0.7"
|
||||||
axobject-query "^2.0.1"
|
axobject-query "^0.1.0"
|
||||||
damerau-levenshtein "^1.0.4"
|
damerau-levenshtein "^1.0.0"
|
||||||
emoji-regex "^6.5.1"
|
emoji-regex "^6.1.0"
|
||||||
has "^1.0.3"
|
jsx-ast-utils "^2.0.0"
|
||||||
jsx-ast-utils "^2.0.1"
|
|
||||||
|
|
||||||
eslint-plugin-prettier@^2.6.0:
|
eslint-plugin-prettier@^2.6.0:
|
||||||
version "2.6.2"
|
version "2.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz#71998c60aedfa2141f7bfcbf9d1c459bf98b4fad"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz#33e4e228bdb06142d03c560ce04ec23f6c767dd7"
|
||||||
dependencies:
|
dependencies:
|
||||||
fast-diff "^1.1.1"
|
fast-diff "^1.1.1"
|
||||||
jest-docblock "^21.0.0"
|
jest-docblock "^21.0.0"
|
||||||
|
|
||||||
eslint-plugin-react@^7.1.0:
|
eslint-plugin-react@^7.1.0:
|
||||||
version "7.10.0"
|
version "7.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz#af5c1fef31c4704db02098f9be18202993828b50"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.9.1.tgz#101aadd15e7c7b431ed025303ac7b421a8e3dc15"
|
||||||
dependencies:
|
dependencies:
|
||||||
doctrine "^2.1.0"
|
doctrine "^2.1.0"
|
||||||
has "^1.0.3"
|
has "^1.0.2"
|
||||||
jsx-ast-utils "^2.0.1"
|
jsx-ast-utils "^2.0.1"
|
||||||
prop-types "^15.6.2"
|
prop-types "^15.6.1"
|
||||||
|
|
||||||
eslint-scope@^3.7.1:
|
eslint-scope@^3.7.1:
|
||||||
version "3.7.3"
|
version "3.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
|
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
|
||||||
dependencies:
|
dependencies:
|
||||||
esrecurse "^4.1.0"
|
esrecurse "^4.1.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
@@ -2012,7 +2006,7 @@ eslint@^4.0.0, eslint@^4.2.0:
|
|||||||
table "4.0.2"
|
table "4.0.2"
|
||||||
text-table "~0.2.0"
|
text-table "~0.2.0"
|
||||||
|
|
||||||
espree@^3.5.2, espree@^3.5.4:
|
espree@^3.5.4:
|
||||||
version "3.5.4"
|
version "3.5.4"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2024,8 +2018,8 @@ esprima@^3.1.3:
|
|||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
|
||||||
|
|
||||||
esprima@^4.0.0:
|
esprima@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
|
||||||
|
|
||||||
esquery@^1.0.0:
|
esquery@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
@@ -2060,10 +2054,10 @@ eventemitter3@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
|
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
|
||||||
|
|
||||||
exec-sh@^0.2.0:
|
exec-sh@^0.2.0:
|
||||||
version "0.2.2"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
|
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
|
||||||
dependencies:
|
dependencies:
|
||||||
merge "^1.2.0"
|
merge "^1.1.3"
|
||||||
|
|
||||||
execa@^0.7.0:
|
execa@^0.7.0:
|
||||||
version "0.7.0"
|
version "0.7.0"
|
||||||
@@ -2166,8 +2160,8 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
|
|||||||
is-extendable "^1.0.1"
|
is-extendable "^1.0.1"
|
||||||
|
|
||||||
extend@~3.0.0, extend@~3.0.1:
|
extend@~3.0.0, extend@~3.0.1:
|
||||||
version "3.0.2"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
|
||||||
|
|
||||||
external-editor@^2.0.4:
|
external-editor@^2.0.4:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
@@ -2469,8 +2463,8 @@ generate-object-property@^1.1.0:
|
|||||||
is-property "^1.0.0"
|
is-property "^1.0.0"
|
||||||
|
|
||||||
get-caller-file@^1.0.1:
|
get-caller-file@^1.0.1:
|
||||||
version "1.0.3"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
|
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
|
||||||
|
|
||||||
get-own-enumerable-property-symbols@^2.0.1:
|
get-own-enumerable-property-symbols@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@@ -2631,7 +2625,7 @@ has-values@^1.0.0:
|
|||||||
is-number "^3.0.0"
|
is-number "^3.0.0"
|
||||||
kind-of "^4.0.0"
|
kind-of "^4.0.0"
|
||||||
|
|
||||||
has@^1.0.1, has@^1.0.3:
|
has@^1.0.1, has@^1.0.2:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2662,8 +2656,8 @@ home-or-tmp@^2.0.0:
|
|||||||
os-tmpdir "^1.0.1"
|
os-tmpdir "^1.0.1"
|
||||||
|
|
||||||
hosted-git-info@^2.1.4:
|
hosted-git-info@^2.1.4:
|
||||||
version "2.7.1"
|
version "2.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
|
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
|
||||||
|
|
||||||
html-encoding-sniffer@^1.0.2:
|
html-encoding-sniffer@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
@@ -2727,8 +2721,8 @@ ignore-walk@^3.0.1:
|
|||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
ignore@^3.3.3:
|
ignore@^3.3.3:
|
||||||
version "3.3.10"
|
version "3.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
|
||||||
|
|
||||||
image-size@^0.6.0:
|
image-size@^0.6.0:
|
||||||
version "0.6.3"
|
version "0.6.3"
|
||||||
@@ -2832,8 +2826,8 @@ is-builtin-module@^1.0.0:
|
|||||||
builtin-modules "^1.0.0"
|
builtin-modules "^1.0.0"
|
||||||
|
|
||||||
is-callable@^1.1.1, is-callable@^1.1.3:
|
is-callable@^1.1.1, is-callable@^1.1.3:
|
||||||
version "1.1.4"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
|
||||||
|
|
||||||
is-ci@^1.0.10:
|
is-ci@^1.0.10:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
@@ -2967,6 +2961,12 @@ is-obj@^1.0.1:
|
|||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
|
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
|
||||||
|
|
||||||
|
is-odd@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
|
||||||
|
dependencies:
|
||||||
|
is-number "^4.0.0"
|
||||||
|
|
||||||
is-path-cwd@^1.0.0:
|
is-path-cwd@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
|
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
|
||||||
@@ -3458,10 +3458,6 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
|
|||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
|
||||||
|
|
||||||
"js-tokens@^3.0.0 || ^4.0.0":
|
|
||||||
version "4.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
|
||||||
|
|
||||||
js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1:
|
js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1:
|
||||||
version "3.12.0"
|
version "3.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
|
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
|
||||||
@@ -3474,34 +3470,34 @@ jsbn@~0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
|
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
|
||||||
|
|
||||||
jsdom@^11.5.1:
|
jsdom@^11.5.1:
|
||||||
version "11.12.0"
|
version "11.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
|
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e"
|
||||||
dependencies:
|
dependencies:
|
||||||
abab "^2.0.0"
|
abab "^1.0.4"
|
||||||
acorn "^5.5.3"
|
acorn "^5.3.0"
|
||||||
acorn-globals "^4.1.0"
|
acorn-globals "^4.1.0"
|
||||||
array-equal "^1.0.0"
|
array-equal "^1.0.0"
|
||||||
cssom ">= 0.3.2 < 0.4.0"
|
cssom ">= 0.3.2 < 0.4.0"
|
||||||
cssstyle "^1.0.0"
|
cssstyle ">= 0.3.1 < 0.4.0"
|
||||||
data-urls "^1.0.0"
|
data-urls "^1.0.0"
|
||||||
domexception "^1.0.1"
|
domexception "^1.0.0"
|
||||||
escodegen "^1.9.1"
|
escodegen "^1.9.0"
|
||||||
html-encoding-sniffer "^1.0.2"
|
html-encoding-sniffer "^1.0.2"
|
||||||
left-pad "^1.3.0"
|
left-pad "^1.2.0"
|
||||||
nwsapi "^2.0.7"
|
nwsapi "^2.0.0"
|
||||||
parse5 "4.0.0"
|
parse5 "4.0.0"
|
||||||
pn "^1.1.0"
|
pn "^1.1.0"
|
||||||
request "^2.87.0"
|
request "^2.83.0"
|
||||||
request-promise-native "^1.0.5"
|
request-promise-native "^1.0.5"
|
||||||
sax "^1.2.4"
|
sax "^1.2.4"
|
||||||
symbol-tree "^3.2.2"
|
symbol-tree "^3.2.2"
|
||||||
tough-cookie "^2.3.4"
|
tough-cookie "^2.3.3"
|
||||||
w3c-hr-time "^1.0.1"
|
w3c-hr-time "^1.0.1"
|
||||||
webidl-conversions "^4.0.2"
|
webidl-conversions "^4.0.2"
|
||||||
whatwg-encoding "^1.0.3"
|
whatwg-encoding "^1.0.3"
|
||||||
whatwg-mimetype "^2.1.0"
|
whatwg-mimetype "^2.1.0"
|
||||||
whatwg-url "^6.4.1"
|
whatwg-url "^6.4.1"
|
||||||
ws "^5.2.0"
|
ws "^4.0.0"
|
||||||
xml-name-validator "^3.0.0"
|
xml-name-validator "^3.0.0"
|
||||||
|
|
||||||
jsesc@^1.3.0:
|
jsesc@^1.3.0:
|
||||||
@@ -3565,7 +3561,7 @@ jsprim@^1.2.2:
|
|||||||
json-schema "0.2.3"
|
json-schema "0.2.3"
|
||||||
verror "1.10.0"
|
verror "1.10.0"
|
||||||
|
|
||||||
jsx-ast-utils@^2.0.1:
|
jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
|
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3611,7 +3607,7 @@ lcid@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
invert-kv "^1.0.0"
|
invert-kv "^1.0.0"
|
||||||
|
|
||||||
left-pad@^1.1.3, left-pad@^1.3.0:
|
left-pad@^1.1.3, left-pad@^1.2.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
|
resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
|
||||||
|
|
||||||
@@ -3790,10 +3786,10 @@ longest@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
|
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
|
||||||
|
|
||||||
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
|
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
|
||||||
version "1.4.0"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
|
||||||
dependencies:
|
dependencies:
|
||||||
js-tokens "^3.0.0 || ^4.0.0"
|
js-tokens "^3.0.0"
|
||||||
|
|
||||||
lru-cache@^4.0.1:
|
lru-cache@^4.0.1:
|
||||||
version "4.1.3"
|
version "4.1.3"
|
||||||
@@ -3842,7 +3838,7 @@ merge-stream@^1.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
readable-stream "^2.0.1"
|
readable-stream "^2.0.1"
|
||||||
|
|
||||||
merge@^1.2.0:
|
merge@^1.1.3:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
|
resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
|
||||||
|
|
||||||
@@ -3957,14 +3953,18 @@ micromatch@^3.1.4, micromatch@^3.1.8:
|
|||||||
snapdragon "^0.8.1"
|
snapdragon "^0.8.1"
|
||||||
to-regex "^3.0.2"
|
to-regex "^3.0.2"
|
||||||
|
|
||||||
"mime-db@>= 1.34.0 < 2", mime-db@~1.35.0:
|
"mime-db@>= 1.34.0 < 2":
|
||||||
version "1.35.0"
|
version "1.34.0"
|
||||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47"
|
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
|
||||||
|
|
||||||
mime-db@~1.23.0:
|
mime-db@~1.23.0:
|
||||||
version "1.23.0"
|
version "1.23.0"
|
||||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659"
|
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659"
|
||||||
|
|
||||||
|
mime-db@~1.33.0:
|
||||||
|
version "1.33.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
|
||||||
|
|
||||||
mime-types@2.1.11:
|
mime-types@2.1.11:
|
||||||
version "2.1.11"
|
version "2.1.11"
|
||||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c"
|
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c"
|
||||||
@@ -3972,10 +3972,10 @@ mime-types@2.1.11:
|
|||||||
mime-db "~1.23.0"
|
mime-db "~1.23.0"
|
||||||
|
|
||||||
mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9:
|
mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9:
|
||||||
version "2.1.19"
|
version "2.1.18"
|
||||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0"
|
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
|
||||||
dependencies:
|
dependencies:
|
||||||
mime-db "~1.35.0"
|
mime-db "~1.33.0"
|
||||||
|
|
||||||
mime@1.3.4:
|
mime@1.3.4:
|
||||||
version "1.3.4"
|
version "1.3.4"
|
||||||
@@ -4077,14 +4077,15 @@ nan@^2.9.2:
|
|||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
||||||
|
|
||||||
nanomatch@^1.2.9:
|
nanomatch@^1.2.9:
|
||||||
version "1.2.13"
|
version "1.2.9"
|
||||||
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
|
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
|
||||||
dependencies:
|
dependencies:
|
||||||
arr-diff "^4.0.0"
|
arr-diff "^4.0.0"
|
||||||
array-unique "^0.3.2"
|
array-unique "^0.3.2"
|
||||||
define-property "^2.0.2"
|
define-property "^2.0.2"
|
||||||
extend-shallow "^3.0.2"
|
extend-shallow "^3.0.2"
|
||||||
fragment-cache "^0.2.1"
|
fragment-cache "^0.2.1"
|
||||||
|
is-odd "^2.0.0"
|
||||||
is-windows "^1.0.2"
|
is-windows "^1.0.2"
|
||||||
kind-of "^6.0.2"
|
kind-of "^6.0.2"
|
||||||
object.pick "^1.3.0"
|
object.pick "^1.3.0"
|
||||||
@@ -4096,7 +4097,7 @@ natural-compare@^1.4.0:
|
|||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
|
|
||||||
needle@^2.2.1:
|
needle@^2.2.0:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
|
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4133,16 +4134,16 @@ node-notifier@^5.1.2, node-notifier@^5.2.1:
|
|||||||
which "^1.3.0"
|
which "^1.3.0"
|
||||||
|
|
||||||
node-pre-gyp@^0.10.0:
|
node-pre-gyp@^0.10.0:
|
||||||
version "0.10.3"
|
version "0.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
|
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46"
|
||||||
dependencies:
|
dependencies:
|
||||||
detect-libc "^1.0.2"
|
detect-libc "^1.0.2"
|
||||||
mkdirp "^0.5.1"
|
mkdirp "^0.5.1"
|
||||||
needle "^2.2.1"
|
needle "^2.2.0"
|
||||||
nopt "^4.0.1"
|
nopt "^4.0.1"
|
||||||
npm-packlist "^1.1.6"
|
npm-packlist "^1.1.6"
|
||||||
npmlog "^4.0.2"
|
npmlog "^4.0.2"
|
||||||
rc "^1.2.7"
|
rc "^1.1.7"
|
||||||
rimraf "^2.6.1"
|
rimraf "^2.6.1"
|
||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
tar "^4"
|
tar "^4"
|
||||||
@@ -4182,8 +4183,8 @@ npm-bundled@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
|
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
|
||||||
|
|
||||||
npm-packlist@^1.1.6:
|
npm-packlist@^1.1.6:
|
||||||
version "1.1.11"
|
version "1.1.10"
|
||||||
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
|
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
|
||||||
dependencies:
|
dependencies:
|
||||||
ignore-walk "^3.0.1"
|
ignore-walk "^3.0.1"
|
||||||
npm-bundled "^1.0.1"
|
npm-bundled "^1.0.1"
|
||||||
@@ -4229,9 +4230,9 @@ number-is-nan@^1.0.0:
|
|||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
||||||
|
|
||||||
nwsapi@^2.0.7:
|
nwsapi@^2.0.0:
|
||||||
version "2.0.8"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.8.tgz#e3603579b7e162b3dbedae4fb24e46f771d8fa24"
|
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.4.tgz#dc79040a5f77b97716dc79565fc7fc3ef7d50570"
|
||||||
|
|
||||||
oauth-sign@~0.8.1, oauth-sign@~0.8.2:
|
oauth-sign@~0.8.1, oauth-sign@~0.8.2:
|
||||||
version "0.8.2"
|
version "0.8.2"
|
||||||
@@ -4563,8 +4564,8 @@ preserve@^0.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
|
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
|
||||||
|
|
||||||
prettier-eslint@^8.8.1:
|
prettier-eslint@^8.8.1:
|
||||||
version "8.8.2"
|
version "8.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.2.tgz#fcb29a48ab4524e234680797fe70e9d136ccaf0b"
|
resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.1.tgz#38505163274742f2a0b31653c39e40f37ebd07da"
|
||||||
dependencies:
|
dependencies:
|
||||||
babel-runtime "^6.26.0"
|
babel-runtime "^6.26.0"
|
||||||
common-tags "^1.4.0"
|
common-tags "^1.4.0"
|
||||||
@@ -4574,15 +4575,14 @@ prettier-eslint@^8.8.1:
|
|||||||
lodash.merge "^4.6.0"
|
lodash.merge "^4.6.0"
|
||||||
loglevel-colored-level-prefix "^1.0.0"
|
loglevel-colored-level-prefix "^1.0.0"
|
||||||
prettier "^1.7.0"
|
prettier "^1.7.0"
|
||||||
pretty-format "^23.0.1"
|
pretty-format "^22.0.3"
|
||||||
require-relative "^0.8.7"
|
require-relative "^0.8.7"
|
||||||
typescript "^2.5.1"
|
typescript "^2.5.1"
|
||||||
typescript-eslint-parser "^16.0.0"
|
typescript-eslint-parser "^11.0.0"
|
||||||
vue-eslint-parser "^2.0.2"
|
|
||||||
|
|
||||||
prettier@^1.12.1, prettier@^1.7.0:
|
prettier@^1.12.1, prettier@^1.7.0:
|
||||||
version "1.14.0"
|
version "1.13.5"
|
||||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372"
|
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0"
|
||||||
|
|
||||||
pretty-format@^21.2.1:
|
pretty-format@^21.2.1:
|
||||||
version "21.2.1"
|
version "21.2.1"
|
||||||
@@ -4591,20 +4591,13 @@ pretty-format@^21.2.1:
|
|||||||
ansi-regex "^3.0.0"
|
ansi-regex "^3.0.0"
|
||||||
ansi-styles "^3.2.0"
|
ansi-styles "^3.2.0"
|
||||||
|
|
||||||
pretty-format@^22.4.0, pretty-format@^22.4.3:
|
pretty-format@^22.0.3, pretty-format@^22.4.0, pretty-format@^22.4.3:
|
||||||
version "22.4.3"
|
version "22.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
|
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-regex "^3.0.0"
|
ansi-regex "^3.0.0"
|
||||||
ansi-styles "^3.2.0"
|
ansi-styles "^3.2.0"
|
||||||
|
|
||||||
pretty-format@^23.0.1:
|
|
||||||
version "23.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017"
|
|
||||||
dependencies:
|
|
||||||
ansi-regex "^3.0.0"
|
|
||||||
ansi-styles "^3.2.0"
|
|
||||||
|
|
||||||
pretty-format@^4.2.1:
|
pretty-format@^4.2.1:
|
||||||
version "4.3.1"
|
version "4.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d"
|
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d"
|
||||||
@@ -4631,7 +4624,7 @@ promise@^7.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
asap "~2.0.3"
|
asap "~2.0.3"
|
||||||
|
|
||||||
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2:
|
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1:
|
||||||
version "15.6.2"
|
version "15.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4697,7 +4690,7 @@ raw-body@~2.1.2:
|
|||||||
iconv-lite "0.4.13"
|
iconv-lite "0.4.13"
|
||||||
unpipe "1.0.0"
|
unpipe "1.0.0"
|
||||||
|
|
||||||
rc@^1.2.7:
|
rc@^1.1.7:
|
||||||
version "1.2.8"
|
version "1.2.8"
|
||||||
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4721,9 +4714,9 @@ react-devtools-core@3.0.0:
|
|||||||
shell-quote "^1.6.1"
|
shell-quote "^1.6.1"
|
||||||
ws "^2.0.3"
|
ws "^2.0.3"
|
||||||
|
|
||||||
react-is@^16.4.2:
|
react-is@^16.4.1:
|
||||||
version "16.4.2"
|
version "16.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e"
|
||||||
|
|
||||||
react-lifecycles-compat@^3, react-lifecycles-compat@^3.0.4:
|
react-lifecycles-compat@^3, react-lifecycles-compat@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
@@ -4842,15 +4835,15 @@ react-navigation-deprecated-tab-navigator@1.3.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react-native-tab-view "^0.0.77"
|
react-native-tab-view "^0.0.77"
|
||||||
|
|
||||||
react-navigation-drawer@0.5.0:
|
react-navigation-drawer@0.4.3:
|
||||||
version "0.5.0"
|
version "0.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-0.5.0.tgz#d91b6a6ec65c34ba78c00f814b1e6508922cc9ec"
|
resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-0.4.3.tgz#c04c94e2429b7e724801af05bd0a93a79cb27f71"
|
||||||
dependencies:
|
dependencies:
|
||||||
react-native-drawer-layout-polyfill "^1.3.2"
|
react-native-drawer-layout-polyfill "^1.3.2"
|
||||||
|
|
||||||
react-navigation-tabs@0.6.0:
|
react-navigation-tabs@0.5.1:
|
||||||
version "0.6.0"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-0.6.0.tgz#2f526194f4360e56c2702e736887449acc2080dc"
|
resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-0.5.1.tgz#ed33bce3a3e21b92646700de25bd94b8fc570371"
|
||||||
dependencies:
|
dependencies:
|
||||||
hoist-non-react-statics "^2.5.0"
|
hoist-non-react-statics "^2.5.0"
|
||||||
prop-types "^15.6.1"
|
prop-types "^15.6.1"
|
||||||
@@ -4874,17 +4867,17 @@ react-test-renderer@16.2.0:
|
|||||||
prop-types "^15.6.0"
|
prop-types "^15.6.0"
|
||||||
|
|
||||||
react-test-renderer@^16.0.0:
|
react-test-renderer@^16.0.0:
|
||||||
version "16.4.2"
|
version "16.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e"
|
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70"
|
||||||
dependencies:
|
dependencies:
|
||||||
fbjs "^0.8.16"
|
fbjs "^0.8.16"
|
||||||
object-assign "^4.1.1"
|
object-assign "^4.1.1"
|
||||||
prop-types "^15.6.0"
|
prop-types "^15.6.0"
|
||||||
react-is "^16.4.2"
|
react-is "^16.4.1"
|
||||||
|
|
||||||
react-timer-mixin@^0.13.2:
|
react-timer-mixin@^0.13.2:
|
||||||
version "0.13.4"
|
version "0.13.3"
|
||||||
resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3"
|
resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.3.tgz#0da8b9f807ec07dc3e854d082c737c65605b3d22"
|
||||||
|
|
||||||
react-transform-hmr@^1.0.4:
|
react-transform-hmr@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
@@ -4963,8 +4956,8 @@ readdirp@^2.0.0:
|
|||||||
set-immediate-shim "^1.0.1"
|
set-immediate-shim "^1.0.1"
|
||||||
|
|
||||||
realpath-native@^1.0.0:
|
realpath-native@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633"
|
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0"
|
||||||
dependencies:
|
dependencies:
|
||||||
util.promisify "^1.0.0"
|
util.promisify "^1.0.0"
|
||||||
|
|
||||||
@@ -5080,7 +5073,7 @@ request@2.77.0:
|
|||||||
tough-cookie "~2.3.0"
|
tough-cookie "~2.3.0"
|
||||||
tunnel-agent "~0.4.1"
|
tunnel-agent "~0.4.1"
|
||||||
|
|
||||||
request@^2.79.0, request@^2.87.0:
|
request@^2.79.0, request@^2.83.0:
|
||||||
version "2.87.0"
|
version "2.87.0"
|
||||||
resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
|
resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5241,7 +5234,7 @@ safe-regex@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ret "~0.1.10"
|
ret "~0.1.10"
|
||||||
|
|
||||||
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0:
|
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||||
|
|
||||||
@@ -5268,10 +5261,14 @@ sax@~1.1.1:
|
|||||||
version "1.1.6"
|
version "1.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240"
|
resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240"
|
||||||
|
|
||||||
"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@5.x, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1:
|
"semver@2 || 3 || 4 || 5", semver@5.x, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1:
|
||||||
version "5.5.0"
|
version "5.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
|
||||||
|
|
||||||
|
semver@5.4.1:
|
||||||
|
version "5.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
|
||||||
|
|
||||||
send@0.13.2:
|
send@0.13.2:
|
||||||
version "0.13.2"
|
version "0.13.2"
|
||||||
resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de"
|
resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de"
|
||||||
@@ -5693,8 +5690,8 @@ table@4.0.2:
|
|||||||
string-width "^2.1.1"
|
string-width "^2.1.1"
|
||||||
|
|
||||||
tar@^4:
|
tar@^4:
|
||||||
version "4.4.6"
|
version "4.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
|
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
|
||||||
dependencies:
|
dependencies:
|
||||||
chownr "^1.0.1"
|
chownr "^1.0.1"
|
||||||
fs-minipass "^1.2.5"
|
fs-minipass "^1.2.5"
|
||||||
@@ -5780,9 +5777,9 @@ to-regex@^3.0.1, to-regex@^3.0.2:
|
|||||||
regex-not "^1.0.2"
|
regex-not "^1.0.2"
|
||||||
safe-regex "^1.1.0"
|
safe-regex "^1.1.0"
|
||||||
|
|
||||||
tough-cookie@>=2.3.3, tough-cookie@^2.3.4:
|
tough-cookie@>=2.3.3, tough-cookie@^2.3.3:
|
||||||
version "2.4.3"
|
version "2.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
|
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c"
|
||||||
dependencies:
|
dependencies:
|
||||||
psl "^1.1.24"
|
psl "^1.1.24"
|
||||||
punycode "^1.4.1"
|
punycode "^1.4.1"
|
||||||
@@ -5838,12 +5835,12 @@ typedarray@^0.0.6:
|
|||||||
version "0.0.6"
|
version "0.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||||
|
|
||||||
typescript-eslint-parser@^16.0.0:
|
typescript-eslint-parser@^11.0.0:
|
||||||
version "16.0.1"
|
version "11.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b"
|
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-11.0.0.tgz#37dba6a0130dd307504aa4b4b21b0d3dc7d4e9f2"
|
||||||
dependencies:
|
dependencies:
|
||||||
lodash.unescape "4.0.1"
|
lodash.unescape "4.0.1"
|
||||||
semver "5.5.0"
|
semver "5.4.1"
|
||||||
|
|
||||||
typescript@^2.5.1:
|
typescript@^2.5.1:
|
||||||
version "2.9.2"
|
version "2.9.2"
|
||||||
@@ -5922,8 +5919,10 @@ urlgrey@0.4.4:
|
|||||||
resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f"
|
resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f"
|
||||||
|
|
||||||
use@^3.1.0:
|
use@^3.1.0:
|
||||||
version "3.1.1"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
|
resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
|
||||||
|
dependencies:
|
||||||
|
kind-of "^6.0.2"
|
||||||
|
|
||||||
user-home@^1.1.1:
|
user-home@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
@@ -5953,8 +5952,8 @@ uuid@3.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
|
||||||
|
|
||||||
uuid@^3.1.0:
|
uuid@^3.1.0:
|
||||||
version "3.3.2"
|
version "3.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
|
||||||
|
|
||||||
v8flags@^2.1.1:
|
v8flags@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
@@ -5989,17 +5988,6 @@ vhost@~3.0.1:
|
|||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5"
|
resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5"
|
||||||
|
|
||||||
vue-eslint-parser@^2.0.2:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
|
|
||||||
dependencies:
|
|
||||||
debug "^3.1.0"
|
|
||||||
eslint-scope "^3.7.1"
|
|
||||||
eslint-visitor-keys "^1.0.0"
|
|
||||||
espree "^3.5.2"
|
|
||||||
esquery "^1.0.0"
|
|
||||||
lodash "^4.17.4"
|
|
||||||
|
|
||||||
w3c-hr-time@^1.0.1:
|
w3c-hr-time@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
|
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
|
||||||
@@ -6134,11 +6122,12 @@ ws@^2.0.3:
|
|||||||
safe-buffer "~5.0.1"
|
safe-buffer "~5.0.1"
|
||||||
ultron "~1.1.0"
|
ultron "~1.1.0"
|
||||||
|
|
||||||
ws@^5.2.0:
|
ws@^4.0.0:
|
||||||
version "5.2.2"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
|
resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289"
|
||||||
dependencies:
|
dependencies:
|
||||||
async-limiter "~1.0.0"
|
async-limiter "~1.0.0"
|
||||||
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
xcode@^0.9.1:
|
xcode@^0.9.1:
|
||||||
version "0.9.3"
|
version "0.9.3"
|
||||||
|
|||||||
Reference in New Issue
Block a user