Compare commits

..

21 Commits

Author SHA1 Message Date
satyajit.happy
c41c824aae chore: publish
- @react-navigation/bottom-tabs@5.0.0-alpha.18
 - @react-navigation/compat@5.0.0-alpha.12
 - @react-navigation/drawer@5.0.0-alpha.20
 - @react-navigation/example@5.0.0-alpha.19
 - @react-navigation/material-bottom-tabs@5.0.0-alpha.18
 - @react-navigation/material-top-tabs@5.0.0-alpha.15
 - @react-navigation/native-stack@5.0.0-alpha.9
 - @react-navigation/routers@5.0.0-alpha.12
 - @react-navigation/stack@5.0.0-alpha.34
2019-11-04 07:52:29 +01:00
Freddy Harris
a93a81e5d3 feat: support transform style for header (#158) 2019-11-04 07:50:02 +01:00
satyajit.happy
57b411cea8 refactor: replace XComponent props in favor of render callbacks
Making these props components makes it impossible pass additional props to them from the parent component. Render callbacks are more dynamic and flexible for this case
2019-11-04 07:47:41 +01:00
satyajit.happy
3a4c38bb72 fix: close drawer on back button press 2019-11-02 08:52:12 +01:00
satyajit.happy
e6a06ac56e chore: publish
- @react-navigation/core@5.0.0-alpha.20
 - @react-navigation/native-stack@5.0.0-alpha.8
 - @react-navigation/stack@5.0.0-alpha.33
2019-11-02 05:12:02 +01:00
satyajit.happy
2ef5ad4cc2 fix: add horizontal margin to centered title 2019-11-02 05:08:10 +01:00
freddy
74ee216ed4 fix: remove unnecessary paddingHorizontal on stack header 2019-11-02 04:54:07 +01:00
Tien Pham
77f29d374f feat: add headerBackTitleVisible to navigation options in native stack 2019-11-02 04:53:23 +01:00
satyajit.happy
5a34764404 fix: pass rehydrated state in onStateChange and devtools 2019-11-02 04:43:47 +01:00
satyajit.happy
738f226535 chore: publish
- @react-navigation/drawer@5.0.0-alpha.19
 - @react-navigation/example@5.0.0-alpha.18
 - @react-navigation/native-stack@5.0.0-alpha.7
 - @react-navigation/stack@5.0.0-alpha.32
2019-11-02 02:58:08 +01:00
satyajit.happy
5cd69401ec fix: remove top margin from screen in native stack on Android
In newer versions of react-native-screens, the content is no longer below the header, so the top margin in not needed anymore.
2019-11-02 02:56:46 +01:00
satyajit.happy
c55d4511ff chore: update react-native-screens 2019-10-31 13:49:22 +01:00
osdnk
c07d61dc41 chore: bump react-native-screens pods 2019-10-31 12:53:46 +01:00
satyajit.happy
67fd69adf6 fix: minor tweaks for web and fix example 2019-10-31 11:03:34 +01:00
satyajit.happy
3de9edbe72 chore: publish
- @react-navigation/bottom-tabs@5.0.0-alpha.17
 - @react-navigation/compat@5.0.0-alpha.11
 - @react-navigation/core@5.0.0-alpha.19
 - @react-navigation/drawer@5.0.0-alpha.18
 - @react-navigation/material-bottom-tabs@5.0.0-alpha.17
 - @react-navigation/material-top-tabs@5.0.0-alpha.14
 - @react-navigation/native-stack@5.0.0-alpha.6
 - @react-navigation/native@5.0.0-alpha.14
 - @react-navigation/routers@5.0.0-alpha.11
 - @react-navigation/stack@5.0.0-alpha.31
2019-10-30 23:51:33 +01:00
satyajit.happy
12d597fcc0 feat: add an 'unmountInactiveScreens' option 2019-10-30 23:50:33 +01:00
satyajit.happy
50dea65377 fix: support scroll to top in navigators nested in tab 2019-10-30 21:34:00 +01:00
Satyajit Sahoo
3d9db6ff25 refactor: add a type property to router and state (#146)
The `type` property denotes the type of the router. It can be used to verify compatibility of navigation state and the router when rehydrating state, making rehydration more resilient.

It can also help our utilities to detect the type of the navigator to properly implement some functionality. For example, the `useScrollToTop` hook can now know if it's not inside a tab navigator and needs to find the tab navigator in a parent.
2019-10-30 12:03:53 +01:00
Satyajit Sahoo
fb749ac064 fix: hide screen from screen reader when drawer is open (#147) 2019-10-30 11:59:55 +01:00
Satyajit Sahoo
58f7115298 fix: hide inactive pages from screen reader in tabs (#148) 2019-10-30 11:59:31 +01:00
Satyajit Sahoo
3a77107968 fix: drop isFirstRouteInParent method (#145)
The `isFirstRouteInParent` method was added to determine whether the back button should be shown in the header for stack navigator or not.
This was mainly due to the API of the old version of stack whose public API of header didn't have all required info to determine whether it should be shown.
It was probably a mistake to add it, because this method doesn't look at history and so pretty much useless for other navigators which aren't stack.

In the new stack, the header receives a `previous` prop and the `headerLeft` option receives a `canGoBack` prop which can be used for this purpose.
It's also possible to check if a route is the first by doing `navigation.dangerouslyGetState().routes[0].key === route.key`.

So it's time to drop this method.
2019-10-30 08:51:59 +01:00
67 changed files with 1114 additions and 467 deletions

View File

@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.18](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.17...@react-navigation/bottom-tabs@5.0.0-alpha.18) (2019-11-04)
**Note:** Version bump only for package @react-navigation/bottom-tabs
# [5.0.0-alpha.17](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.16...@react-navigation/bottom-tabs@5.0.0-alpha.17) (2019-10-30)
### Bug Fixes
* hide inactive pages from screen reader in tabs ([#148](https://github.com/react-navigation/navigation-ex/issues/148)) ([58f7115](https://github.com/react-navigation/navigation-ex/commit/58f7115))
### Features
* add an 'unmountInactiveScreens' option ([12d597f](https://github.com/react-navigation/navigation-ex/commit/12d597f))
# [5.0.0-alpha.16](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.15...@react-navigation/bottom-tabs@5.0.0-alpha.16) (2019-10-29) # [5.0.0-alpha.16](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.15...@react-navigation/bottom-tabs@5.0.0-alpha.16) (2019-10-29)
**Note:** Version bump only for package @react-navigation/bottom-tabs **Note:** Version bump only for package @react-navigation/bottom-tabs

View File

@@ -10,7 +10,7 @@
"android", "android",
"tab" "tab"
], ],
"version": "5.0.0-alpha.16", "version": "5.0.0-alpha.18",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -33,7 +33,7 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",

View File

@@ -1,5 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import { import {
TouchableWithoutFeedbackProps,
AccessibilityRole, AccessibilityRole,
AccessibilityStates, AccessibilityStates,
StyleProp, StyleProp,
@@ -101,9 +102,10 @@ export type BottomTabNavigationOptions = {
tabBarVisible?: boolean; tabBarVisible?: boolean;
/** /**
* Buttton component to render for the tab items instead of the default `TouchableWithoutFeedback` * Function which returns a React element to render as the tab bar button.
* Renders `TouchableWithoutFeedback` by default.
*/ */
tabBarButtonComponent?: React.ComponentType<any>; tabBarButton?: (props: BottomTabBarButtonProps) => React.ReactNode;
}; };
export type BottomTabDescriptor = Descriptor< export type BottomTabDescriptor = Descriptor<
@@ -124,9 +126,14 @@ export type BottomTabNavigationConfig = {
*/ */
lazy?: boolean; lazy?: boolean;
/** /**
* Custom tab bar component. * Whether a screen should be unmounted when navigating away from it.
* Defaults to `false`.
*/ */
tabBarComponent?: React.ComponentType<BottomTabBarProps>; unmountInactiveScreens?: boolean;
/**
* Function that returns a React element to display as the tab bar.
*/
tabBar?: (props: BottomTabBarProps) => React.ReactNode;
/** /**
* Options for the tab bar which will be passed as props to the tab bar component. * Options for the tab bar which will be passed as props to the tab bar component.
*/ */
@@ -208,9 +215,6 @@ export type BottomTabBarProps = BottomTabBarOptions & {
route: Route<string>; route: Route<string>;
focused: boolean; focused: boolean;
}) => AccessibilityStates[]; }) => AccessibilityStates[];
getButtonComponent: (props: {
route: Route<string>;
}) => React.ComponentType<any> | undefined;
getLabelText: (props: { getLabelText: (props: {
route: Route<string>; route: Route<string>;
}) => }) =>
@@ -220,12 +224,17 @@ export type BottomTabBarProps = BottomTabBarOptions & {
}) => React.ReactNode | undefined) }) => React.ReactNode | undefined)
| React.ReactNode; | React.ReactNode;
getTestID: (props: { route: Route<string> }) => string | undefined; getTestID: (props: { route: Route<string> }) => string | undefined;
renderButton: (
props: { route: Route<string> } & BottomTabBarButtonProps
) => React.ReactNode;
renderIcon: (props: { renderIcon: (props: {
route: Route<string>; route: Route<string>;
focused: boolean; focused: boolean;
color: string; color: string;
size: number; size: number;
}) => React.ReactNode; }) => React.ReactNode;
activeTintColor: string; };
inactiveTintColor: string;
export type BottomTabBarButtonProps = TouchableWithoutFeedbackProps & {
children: React.ReactNode;
}; };

View File

@@ -14,7 +14,7 @@ import { SafeAreaConsumer } from 'react-native-safe-area-context';
import TabBarIcon from './TabBarIcon'; import TabBarIcon from './TabBarIcon';
import TouchableWithoutFeedbackWrapper from './TouchableWithoutFeedbackWrapper'; import TouchableWithoutFeedbackWrapper from './TouchableWithoutFeedbackWrapper';
import { BottomTabBarProps } from '../types'; import { BottomTabBarProps, BottomTabBarButtonProps } from '../types';
type State = { type State = {
dimensions: { height: number; width: number }; dimensions: { height: number; width: number };
@@ -23,7 +23,10 @@ type State = {
visible: Animated.Value; visible: Animated.Value;
}; };
type Props = BottomTabBarProps; type Props = BottomTabBarProps & {
activeTintColor: string;
inactiveTintColor: string;
};
const majorVersion = parseInt(Platform.Version as string, 10); const majorVersion = parseInt(Platform.Version as string, 10);
const isIos = Platform.OS === 'ios'; const isIos = Platform.OS === 'ios';
@@ -262,7 +265,9 @@ export default class TabBarBottom extends React.Component<Props, State> {
getAccessibilityLabel, getAccessibilityLabel,
getAccessibilityRole, getAccessibilityRole,
getAccessibilityStates, getAccessibilityStates,
getButtonComponent, renderButton = (props: BottomTabBarButtonProps) => (
<TouchableWithoutFeedbackWrapper {...props} />
),
getTestID, getTestID,
style, style,
tabStyle, tabStyle,
@@ -325,34 +330,34 @@ export default class TabBarBottom extends React.Component<Props, State> {
? activeBackgroundColor ? activeBackgroundColor
: inactiveBackgroundColor; : inactiveBackgroundColor;
const ButtonComponent =
getButtonComponent({ route }) ||
TouchableWithoutFeedbackWrapper;
return ( return (
<NavigationContext.Provider <NavigationContext.Provider
key={route.key} key={route.key}
value={descriptors[route.key].navigation} value={descriptors[route.key].navigation}
> >
<ButtonComponent {renderButton({
onPress={() => onTabPress({ route })} route,
onLongPress={() => onTabLongPress({ route })} onPress: () => onTabPress({ route }),
testID={testID} onLongPress: () => onTabLongPress({ route }),
accessibilityLabel={accessibilityLabel} testID,
accessibilityRole={accessibilityRole} accessibilityLabel,
accessibilityStates={accessibilityStates} accessibilityRole,
style={[ accessibilityStates,
style: [
styles.tab, styles.tab,
{ backgroundColor }, { backgroundColor },
this.shouldUseHorizontalLabels() this.shouldUseHorizontalLabels()
? styles.tabLandscape ? styles.tabLandscape
: styles.tabPortrait, : styles.tabPortrait,
tabStyle, tabStyle,
]} ],
> children: (
{this.renderIcon(scene)} <React.Fragment>
{this.renderLabel(scene)} {this.renderIcon(scene)}
</ButtonComponent> {this.renderLabel(scene)}
</React.Fragment>
),
})}
</NavigationContext.Provider> </NavigationContext.Provider>
); );
})} })}

View File

@@ -11,13 +11,15 @@ import { TabNavigationState } from '@react-navigation/routers';
import { ScreenContainer } from 'react-native-screens'; import { ScreenContainer } from 'react-native-screens';
import { SafeAreaProvider } from 'react-native-safe-area-context'; import { SafeAreaProvider } from 'react-native-safe-area-context';
import ResourceSavingScene from './ResourceSavingScene';
import BottomTabBar from './BottomTabBar'; import BottomTabBar from './BottomTabBar';
import { import {
BottomTabNavigationConfig, BottomTabNavigationConfig,
BottomTabDescriptorMap, BottomTabDescriptorMap,
BottomTabNavigationHelpers, BottomTabNavigationHelpers,
BottomTabBarProps,
BottomTabBarButtonProps,
} from '../types'; } from '../types';
import ResourceSavingScene from './ResourceSavingScene';
type Props = BottomTabNavigationConfig & { type Props = BottomTabNavigationConfig & {
state: TabNavigationState; state: TabNavigationState;
@@ -49,13 +51,16 @@ export default class BottomTabView extends React.Component<Props, State> {
loaded: [this.props.state.index], loaded: [this.props.state.index],
}; };
private getButtonComponent = ({ route }: { route: Route<string> }) => { private renderButton = ({
route,
...rest
}: { route: Route<string> } & BottomTabBarButtonProps) => {
const { descriptors } = this.props; const { descriptors } = this.props;
const descriptor = descriptors[route.key]; const descriptor = descriptors[route.key];
const options = descriptor.options; const options = descriptor.options;
if (options.tabBarButtonComponent) { if (options.tabBarButton) {
return options.tabBarButtonComponent; return options.tabBarButton(rest);
} }
return undefined; return undefined;
@@ -159,7 +164,7 @@ export default class BottomTabView extends React.Component<Props, State> {
private renderTabBar = () => { private renderTabBar = () => {
const { const {
tabBarComponent: TabBarComponent = BottomTabBar, tabBar = (props: BottomTabBarProps) => <BottomTabBar {...props} />,
tabBarOptions, tabBarOptions,
state, state,
navigation, navigation,
@@ -174,27 +179,25 @@ export default class BottomTabView extends React.Component<Props, State> {
return null; return null;
} }
return ( return tabBar({
<TabBarComponent ...tabBarOptions,
{...tabBarOptions} state: state,
state={state} descriptors: descriptors,
descriptors={descriptors} navigation: navigation,
navigation={navigation} onTabPress: this.handleTabPress,
onTabPress={this.handleTabPress} onTabLongPress: this.handleTabLongPress,
onTabLongPress={this.handleTabLongPress} getLabelText: this.getLabelText,
getLabelText={this.getLabelText} getAccessibilityLabel: this.getAccessibilityLabel,
getButtonComponent={this.getButtonComponent} getAccessibilityRole: this.getAccessibilityRole,
getAccessibilityLabel={this.getAccessibilityLabel} getAccessibilityStates: this.getAccessibilityStates,
getAccessibilityRole={this.getAccessibilityRole} getTestID: this.getTestID,
getAccessibilityStates={this.getAccessibilityStates} renderButton: this.renderButton,
getTestID={this.getTestID} renderIcon: this.renderIcon,
renderIcon={this.renderIcon} });
/>
);
}; };
render() { render() {
const { state, descriptors, lazy } = this.props; const { state, descriptors, lazy, unmountInactiveScreens } = this.props;
const { routes } = state; const { routes } = state;
const { loaded } = this.state; const { loaded } = this.state;
@@ -203,6 +206,10 @@ export default class BottomTabView extends React.Component<Props, State> {
<View style={styles.container}> <View style={styles.container}>
<ScreenContainer style={styles.pages}> <ScreenContainer style={styles.pages}>
{routes.map((route, index) => { {routes.map((route, index) => {
if (unmountInactiveScreens && index !== state.index) {
return null;
}
if (lazy && !loaded.includes(index)) { if (lazy && !loaded.includes(index)) {
// Don't render a screen if we've never navigated to it // Don't render a screen if we've never navigated to it
return null; return null;
@@ -216,7 +223,15 @@ export default class BottomTabView extends React.Component<Props, State> {
style={StyleSheet.absoluteFill} style={StyleSheet.absoluteFill}
isVisible={isFocused} isVisible={isFocused}
> >
{descriptors[route.key].render()} <View
accessibilityElementsHidden={!isFocused}
importantForAccessibility={
isFocused ? 'auto' : 'no-hide-descendants'
}
style={styles.content}
>
{descriptors[route.key].render()}
</View>
</ResourceSavingScene> </ResourceSavingScene>
); );
})} })}
@@ -236,4 +251,7 @@ const styles = StyleSheet.create({
pages: { pages: {
flex: 1, flex: 1,
}, },
content: {
flex: 1,
},
}); });

View File

@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.12](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.11...@react-navigation/compat@5.0.0-alpha.12) (2019-11-04)
**Note:** Version bump only for package @react-navigation/compat
# [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.10...@react-navigation/compat@5.0.0-alpha.11) (2019-10-30)
### Bug Fixes
* drop isFirstRouteInParent method ([#145](https://github.com/react-navigation/navigation-ex/issues/145)) ([3a77107](https://github.com/react-navigation/navigation-ex/commit/3a77107))
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.9...@react-navigation/compat@5.0.0-alpha.10) (2019-10-29) # [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.9...@react-navigation/compat@5.0.0-alpha.10) (2019-10-29)
**Note:** Version bump only for package @react-navigation/compat **Note:** Version bump only for package @react-navigation/compat

View File

@@ -1,7 +1,7 @@
{ {
"name": "@react-navigation/compat", "name": "@react-navigation/compat",
"description": "Compatibility layer to write navigator definitions in static configuration format", "description": "Compatibility layer to write navigator definitions in static configuration format",
"version": "5.0.0-alpha.10", "version": "5.0.0-alpha.12",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -24,7 +24,7 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^16.9.4", "@types/react": "^16.9.4",

View File

@@ -173,6 +173,12 @@ export default function createCompatNavigationProp<
return defaultValue; return defaultValue;
}, },
isFirstRouteInParent(): boolean {
const { routes } = navigation.dangerouslyGetState();
// @ts-ignore
return routes[0].key === state.key;
},
dangerouslyGetParent() { dangerouslyGetParent() {
const parent = navigation.dangerouslyGetParent(); const parent = navigation.dangerouslyGetParent();

View File

@@ -25,6 +25,7 @@ export type CompatNavigationProp<
paramName: T, paramName: T,
defaultValue?: ParamList[RouteName][T] defaultValue?: ParamList[RouteName][T]
): ParamList[RouteName][T]; ): ParamList[RouteName][T];
isFirstRouteInParent(): boolean;
dangerouslyGetParent< dangerouslyGetParent<
T = NavigationProp<ParamListBase> | undefined T = NavigationProp<ParamListBase> | undefined
>(): T extends NavigationProp<ParamListBase> >(): T extends NavigationProp<ParamListBase>

View File

@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.20](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.19...@react-navigation/core@5.0.0-alpha.20) (2019-11-02)
### Bug Fixes
* pass rehydrated state in onStateChange and devtools ([5a34764](https://github.com/react-navigation/navigation-ex/commit/5a34764))
# [5.0.0-alpha.19](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.18...@react-navigation/core@5.0.0-alpha.19) (2019-10-30)
### Bug Fixes
* drop isFirstRouteInParent method ([#145](https://github.com/react-navigation/navigation-ex/issues/145)) ([3a77107](https://github.com/react-navigation/navigation-ex/commit/3a77107))
# [5.0.0-alpha.18](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.17...@react-navigation/core@5.0.0-alpha.18) (2019-10-29) # [5.0.0-alpha.18](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.17...@react-navigation/core@5.0.0-alpha.18) (2019-10-29)

View File

@@ -6,7 +6,7 @@
"react-native", "react-native",
"react-navigation" "react-navigation"
], ],
"version": "5.0.0-alpha.18", "version": "5.0.0-alpha.20",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -137,9 +137,9 @@ const Container = React.forwardRef(function NavigationContainer(
[trackAction] [trackAction]
); );
const getRootState = () => { const getRootState = React.useCallback(() => {
return getStateForRoute('root'); return getStateForRoute('root');
}; }, [getStateForRoute]);
React.useImperativeHandle(ref, () => ({ React.useImperativeHandle(ref, () => ({
...(Object.keys(CommonActions) as Array<keyof typeof CommonActions>).reduce< ...(Object.keys(CommonActions) as Array<keyof typeof CommonActions>).reduce<
@@ -220,18 +220,18 @@ const Container = React.forwardRef(function NavigationContainer(
if (skipTrackingRef.current) { if (skipTrackingRef.current) {
skipTrackingRef.current = false; skipTrackingRef.current = false;
} else { } else {
trackState(state); trackState(getRootState);
} }
navigationStateRef.current = state; navigationStateRef.current = state;
transactionStateRef.current = null; transactionStateRef.current = null;
if (!isFirstMountRef.current && onStateChange) { if (!isFirstMountRef.current && onStateChange) {
onStateChange(state); onStateChange(getRootState());
} }
isFirstMountRef.current = false; isFirstMountRef.current = false;
}, [state, onStateChange, trackState]); }, [state, onStateChange, trackState, getRootState]);
return ( return (
<NavigationBuilderContext.Provider value={builderContext}> <NavigationBuilderContext.Provider value={builderContext}>

View File

@@ -4,7 +4,8 @@ import * as CommonActions from '../CommonActions';
jest.mock('shortid', () => () => 'test'); jest.mock('shortid', () => () => 'test');
const STATE = { const STATE = {
stale: false as false, stale: false as const,
type: 'test',
key: 'root', key: 'root',
index: 1, index: 1,
routes: [ routes: [
@@ -23,6 +24,7 @@ it('replaces focused screen with REPLACE', () => {
expect(result).toEqual({ expect(result).toEqual({
stale: false, stale: false,
type: 'test',
key: 'root', key: 'root',
index: 1, index: 1,
routes: [ routes: [
@@ -42,6 +44,7 @@ it('replaces source screen with REPLACE', () => {
expect(result).toEqual({ expect(result).toEqual({
stale: false, stale: false,
type: 'test',
key: 'root', key: 'root',
index: 1, index: 1,
routes: [ routes: [
@@ -70,6 +73,7 @@ it('sets params for the focused screen with SET_PARAMS', () => {
expect(result).toEqual({ expect(result).toEqual({
stale: false, stale: false,
type: 'test',
key: 'root', key: 'root',
index: 1, index: 1,
routes: [ routes: [
@@ -89,6 +93,7 @@ it('sets params for the source screen with SET_PARAMS', () => {
expect(result).toEqual({ expect(result).toEqual({
stale: false, stale: false,
type: 'test',
key: 'root', key: 'root',
index: 1, index: 1,
routes: [ routes: [

View File

@@ -233,6 +233,7 @@ it('handle dispatching with ref', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith({ expect(onStateChange).lastCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'foo2', 'bar', 'baz'], routeNames: ['foo', 'foo2', 'bar', 'baz'],
@@ -242,6 +243,7 @@ it('handle dispatching with ref', () => {
name: 'baz', name: 'baz',
state: { state: {
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '1', key: '1',
routeNames: ['qux', 'lex'], routeNames: ['qux', 'lex'],
@@ -319,7 +321,28 @@ it('handle resetting state with ref', () => {
}); });
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith(state); expect(onStateChange).lastCalledWith({
index: 1,
key: '5',
routeNames: ['foo', 'foo2', 'bar', 'baz'],
routes: [
{
key: 'baz',
name: 'baz',
state: {
index: 0,
key: '6',
routeNames: ['qux', 'lex'],
routes: [{ key: 'qux', name: 'qux' }, { key: 'lex', name: 'lex' }],
stale: false,
type: 'test',
},
},
{ key: 'bar', name: 'bar' },
],
stale: false,
type: 'test',
});
}); });
it('handle getRootState', () => { it('handle getRootState', () => {
@@ -367,10 +390,12 @@ it('handle getRootState', () => {
routeNames: ['qux', 'lex'], routeNames: ['qux', 'lex'],
routes: [{ key: 'qux', name: 'qux' }, { key: 'lex', name: 'lex' }], routes: [{ key: 'qux', name: 'qux' }, { key: 'lex', name: 'lex' }],
stale: false, stale: false,
type: 'test',
}, },
}, },
{ key: 'bar', name: 'bar' }, { key: 'bar', name: 'bar' },
], ],
stale: false, stale: false,
type: 'test',
}); });
}); });

View File

@@ -13,6 +13,8 @@ export const MockRouterKey = { current: 0 };
export default function MockRouter(options: DefaultRouterOptions) { export default function MockRouter(options: DefaultRouterOptions) {
const router: Router<NavigationState, MockActions> = { const router: Router<NavigationState, MockActions> = {
type: 'test',
getInitialState({ routeNames, routeParamList }) { getInitialState({ routeNames, routeParamList }) {
const index = const index =
options.initialRouteName === undefined options.initialRouteName === undefined
@@ -21,6 +23,7 @@ export default function MockRouter(options: DefaultRouterOptions) {
return { return {
stale: false, stale: false,
type: 'test',
key: String(MockRouterKey.current++), key: String(MockRouterKey.current++),
index, index,
routeNames, routeNames,
@@ -58,6 +61,7 @@ export default function MockRouter(options: DefaultRouterOptions) {
return { return {
stale: false, stale: false,
type: 'test',
key: String(MockRouterKey.current++), key: String(MockRouterKey.current++),
index: index:
typeof state.index === 'number' && state.index < routes.length typeof state.index === 'number' && state.index < routes.length

View File

@@ -52,6 +52,7 @@ it('initializes state for a navigator on navigation', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).toBeCalledWith({ expect(onStateChange).toBeCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'bar', 'baz'], routeNames: ['foo', 'bar', 'baz'],
@@ -106,6 +107,66 @@ it('rehydrates state for a navigator on navigation', () => {
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
routes: [{ key: 'foo', name: 'foo' }, { key: 'bar', name: 'bar' }], routes: [{ key: 'foo', name: 'foo' }, { key: 'bar', name: 'bar' }],
stale: false, stale: false,
type: 'test',
});
});
it("doesn't rehydrate state if the type of state didn't match router", () => {
const TestNavigator = (props: any) => {
const { state, descriptors } = useNavigationBuilder(MockRouter, props);
return descriptors[state.routes[state.index].key].render();
};
const FooScreen = (props: any) => {
React.useEffect(() => {
props.navigation.dispatch({ type: 'UPDATE' });
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return null;
};
const initialState = {
index: 1,
type: 'something-else',
routes: [{ key: 'foo', name: 'foo' }, { key: 'bar', name: 'bar' }],
};
const onStateChange = jest.fn();
const element = (
<NavigationContainer
initialState={initialState}
onStateChange={onStateChange}
>
<TestNavigator initialRouteName="foo">
<Screen
name="foo"
component={FooScreen}
initialParams={{ answer: 42 }}
/>
<Screen name="bar" component={jest.fn()} />
</TestNavigator>
</NavigationContainer>
);
render(element).update(element);
expect(onStateChange).lastCalledWith({
index: 0,
key: '0',
routeNames: ['foo', 'bar'],
routes: [
{
key: 'foo',
name: 'foo',
params: { answer: 42 },
},
{ key: 'bar', name: 'bar' },
],
stale: false,
type: 'test',
}); });
}); });
@@ -144,6 +205,7 @@ it('initializes state for nested screens in React.Fragment', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).toBeCalledWith({ expect(onStateChange).toBeCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'bar', 'baz'], routeNames: ['foo', 'bar', 'baz'],
@@ -194,6 +256,7 @@ it('initializes state for nested navigator on navigation', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).toBeCalledWith({ expect(onStateChange).toBeCalledWith({
stale: false, stale: false,
type: 'test',
index: 2, index: 2,
key: '0', key: '0',
routeNames: ['foo', 'bar', 'baz'], routeNames: ['foo', 'bar', 'baz'],
@@ -205,6 +268,7 @@ it('initializes state for nested navigator on navigation', () => {
name: 'baz', name: 'baz',
state: { state: {
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '1', key: '1',
routeNames: ['qux'], routeNames: ['qux'],
@@ -309,6 +373,7 @@ it('cleans up state when the navigator unmounts', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith({ expect(onStateChange).lastCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
@@ -361,6 +426,7 @@ it('allows state updates by dispatching a function returning an action', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).toBeCalledWith({ expect(onStateChange).toBeCalledWith({
stale: false, stale: false,
type: 'test',
index: 1, index: 1,
key: '0', key: '0',
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
@@ -399,6 +465,7 @@ it('updates route params with setParams', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith({ expect(onStateChange).lastCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
@@ -413,6 +480,7 @@ it('updates route params with setParams', () => {
expect(onStateChange).toBeCalledTimes(2); expect(onStateChange).toBeCalledTimes(2);
expect(onStateChange).lastCalledWith({ expect(onStateChange).lastCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
@@ -466,10 +534,23 @@ it('updates route params with setParams applied to parent', () => {
key: '0', key: '0',
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
routes: [ routes: [
{ key: 'foo', name: 'foo', params: { username: 'alice' } }, {
key: 'foo',
name: 'foo',
params: { username: 'alice' },
state: {
index: 0,
key: '1',
routeNames: ['baz'],
routes: [{ key: 'baz', name: 'baz' }],
stale: false,
type: 'test',
},
},
{ key: 'bar', name: 'bar' }, { key: 'bar', name: 'bar' },
], ],
stale: false, stale: false,
type: 'test',
}); });
act(() => setParams({ age: 25 })); act(() => setParams({ age: 25 }));
@@ -480,10 +561,23 @@ it('updates route params with setParams applied to parent', () => {
key: '0', key: '0',
routeNames: ['foo', 'bar'], routeNames: ['foo', 'bar'],
routes: [ routes: [
{ key: 'foo', name: 'foo', params: { username: 'alice', age: 25 } }, {
key: 'foo',
name: 'foo',
params: { username: 'alice', age: 25 },
state: {
index: 0,
key: '1',
routeNames: ['baz'],
routes: [{ key: 'baz', name: 'baz' }],
stale: false,
type: 'test',
},
},
{ key: 'bar', name: 'bar' }, { key: 'bar', name: 'bar' },
], ],
stale: false, stale: false,
type: 'test',
}); });
}); });
@@ -516,6 +610,7 @@ it('handles change in route names', () => {
expect(onStateChange).toBeCalledWith({ expect(onStateChange).toBeCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'baz', 'qux'], routeNames: ['foo', 'baz', 'qux'],
@@ -628,6 +723,7 @@ it('gives access to internal state', () => {
routeNames: ['bar'], routeNames: ['bar'],
routes: [{ key: 'bar', name: 'bar' }], routes: [{ key: 'bar', name: 'bar' }],
stale: false, stale: false,
type: 'test',
}); });
}); });

View File

@@ -216,6 +216,7 @@ it('fires blur event when a route is removed with a delay', async () => {
return { return {
stale: false, stale: false,
type: 'test',
key: 'stack', key: 'stack',
index: 0, index: 0,
routeNames, routeNames,

View File

@@ -76,6 +76,7 @@ it("lets parent handle the action if child didn't", () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith({ expect(onStateChange).lastCalledWith({
stale: false, stale: false,
type: 'test',
index: 2, index: 2,
key: '0', key: '0',
routeNames: ['foo', 'bar', 'baz'], routeNames: ['foo', 'bar', 'baz'],
@@ -191,6 +192,7 @@ it("lets children handle the action if parent didn't", () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith({ expect(onStateChange).lastCalledWith({
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '0', key: '0',
routeNames: ['foo', 'bar', 'baz'], routeNames: ['foo', 'bar', 'baz'],
@@ -200,6 +202,7 @@ it("lets children handle the action if parent didn't", () => {
name: 'baz', name: 'baz',
state: { state: {
stale: false, stale: false,
type: 'test',
index: 0, index: 0,
key: '1', key: '1',
routeNames: ['qux', 'lex'], routeNames: ['qux', 'lex'],

View File

@@ -23,6 +23,12 @@ export type NavigationState = {
routes: Array< routes: Array<
Route<string> & { state?: NavigationState | PartialState<NavigationState> } Route<string> & { state?: NavigationState | PartialState<NavigationState> }
>; >;
/**
* Custom type for the state, whether it's for tab, stack, drawer etc.
* During rehydration, the state will be discarded if type doesn't match with router type.
* It can also be used to detect the type of the navigator we're dealing with.
*/
type: string;
/** /**
* Whether the navigation state has been rehydrated. * Whether the navigation state has been rehydrated.
*/ */
@@ -36,9 +42,10 @@ export type InitialState = Partial<
}; };
export type PartialState<State extends NavigationState> = Partial< export type PartialState<State extends NavigationState> = Partial<
Omit<State, 'stale' | 'key' | 'routes' | 'routeNames'> Omit<State, 'stale' | 'type' | 'key' | 'routes' | 'routeNames'>
> & { > & {
stale?: true; stale?: true;
type?: string;
routes: Array< routes: Array<
Omit<Route<string>, 'key'> & { key?: string; state?: InitialState } Omit<Route<string>, 'key'> & { key?: string; state?: InitialState }
>; >;
@@ -115,6 +122,12 @@ export type Router<
State extends NavigationState, State extends NavigationState,
Action extends NavigationAction Action extends NavigationAction
> = { > = {
/**
* Type of the router. Should match the `type` property in state.
* If the type doesn't match, the state will be discarded during rehydration.
*/
type: State['type'];
/** /**
* Initialize the navigation state. * Initialize the navigation state.
* *
@@ -394,13 +407,6 @@ export type NavigationProp<
*/ */
setOptions(options: Partial<ScreenOptions>): void; setOptions(options: Partial<ScreenOptions>): void;
/**
* Check if the screen is the first route in the navigator.
* This method returns `true` if the index of the route is `0`, `false` otherwise.
* It can be useful to decide whether to display a back button in a stack.
*/
isFirstRouteInParent(): boolean;
/** /**
* Returns the parent navigator, if any. Reason why the function is called * Returns the parent navigator, if any. Reason why the function is called
* dangerouslyGetParent is to warn developers against overusing it to eg. get parent * dangerouslyGetParent is to warn developers against overusing it to eg. get parent

View File

@@ -62,7 +62,7 @@ export default function useDevTools({ name, reset, state }: Options) {
); );
const trackState = React.useCallback( const trackState = React.useCallback(
(state: State) => { (getState: () => State) => {
if (!devTools) { if (!devTools) {
return; return;
} }
@@ -71,9 +71,11 @@ export default function useDevTools({ name, reset, state }: Options) {
devTools.send(actions.current.shift(), lastStateRef.current); devTools.send(actions.current.shift(), lastStateRef.current);
} }
const state = getState();
if (actions.current.length) { if (actions.current.length) {
devTools.send(actions.current.pop(), state); devTools.send(actions.current.pop(), state);
} else if (lastStateRef.current !== state) { } else {
devTools.send('@@UNKNOWN', state); devTools.send('@@UNKNOWN', state);
} }

View File

@@ -166,6 +166,17 @@ export default function useNavigationBuilder<
); );
} }
const isStateValid = React.useCallback(
state => state.type === undefined || state.type === router.type,
[router.type]
);
const isStateInitialized = React.useCallback(
state =>
state !== undefined && state.stale === false && isStateValid(state),
[isStateValid]
);
const { const {
state: currentState, state: currentState,
getState: getCurrentState, getState: getCurrentState,
@@ -188,7 +199,7 @@ export default function useNavigationBuilder<
// Otherwise assume that the state was provided as initial state // Otherwise assume that the state was provided as initial state
// So we need to rehydrate it to make it usable // So we need to rehydrate it to make it usable
initializedStateRef.current = initializedStateRef.current =
currentState === undefined currentState === undefined || !isStateValid(currentState)
? router.getInitialState({ ? router.getInitialState({
routeNames, routeNames,
routeParamList, routeParamList,
@@ -207,9 +218,9 @@ export default function useNavigationBuilder<
// If the state isn't initialized, or stale, use the state we initialized instead // If the state isn't initialized, or stale, use the state we initialized instead
// The state won't update until there's a change needed in the state we have initalized locally // The state won't update until there's a change needed in the state we have initalized locally
// So it'll be `undefined` or stale untill the first navigation event happens // So it'll be `undefined` or stale untill the first navigation event happens
currentState === undefined || currentState.stale !== false isStateInitialized(currentState)
? (initializedStateRef.current as State) ? (currentState as State)
: (currentState as State); : (initializedStateRef.current as State);
let nextState: State = state; let nextState: State = state;
@@ -271,10 +282,10 @@ export default function useNavigationBuilder<
const getState = React.useCallback((): State => { const getState = React.useCallback((): State => {
const currentState = getCurrentState(); const currentState = getCurrentState();
return currentState === undefined || currentState.stale !== false return isStateInitialized(currentState)
? (initializedStateRef.current as State) ? (currentState as State)
: (currentState as State); : (initializedStateRef.current as State);
}, [getCurrentState]); }, [getCurrentState, isStateInitialized]);
const emitter = useEventEmitter(); const emitter = useEventEmitter();

View File

@@ -66,11 +66,9 @@ export default function useNavigationCache<
cache.current = state.routes.reduce<NavigationCache<State, ScreenOptions>>( cache.current = state.routes.reduce<NavigationCache<State, ScreenOptions>>(
(acc, route, index) => { (acc, route, index) => {
const previous = cache.current[route.key]; const previous = cache.current[route.key];
const isFirst = route.key === state.routes[0].key;
if (previous && previous.isFirstRouteInParent() === isFirst) { if (previous) {
// If a cached navigation object already exists and has same `isFirstRouteInParent`, reuse it // If a cached navigation object already exists, reuse it
// This method could return different result if the index of the route changes somehow
acc[route.key] = previous; acc[route.key] = previous;
} else { } else {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -121,7 +119,6 @@ export default function useNavigationCache<
// This makes sure that we return the focus state in the whole tree, not just this navigator // This makes sure that we return the focus state in the whole tree, not just this navigator
return navigation ? navigation.isFocused() : true; return navigation ? navigation.isFocused() : true;
}, },
isFirstRouteInParent: () => isFirst,
}; };
} }

View File

@@ -14,7 +14,7 @@ export default function useOnGetState({
const route = React.useContext(NavigationRouteContext); const route = React.useContext(NavigationRouteContext);
const key = route ? route.key : 'root'; const key = route ? route.key : 'root';
const getter = React.useCallback(() => { const getRehydratedState = React.useCallback(() => {
const state = getState(); const state = getState();
return { return {
...state, ...state,
@@ -26,6 +26,6 @@ export default function useOnGetState({
}, [getState, getStateForRoute]); }, [getState, getStateForRoute]);
React.useEffect(() => { React.useEffect(() => {
return addStateGetter && addStateGetter(key, getter); return addStateGetter && addStateGetter(key, getRehydratedState);
}, [addStateGetter, getter, key]); }, [addStateGetter, getRehydratedState, key]);
} }

View File

@@ -9,7 +9,7 @@ export default function useStateGetters() {
const stateGetters = React.useRef<Record<string, NavigatorStateGetter>>({}); const stateGetters = React.useRef<Record<string, NavigatorStateGetter>>({});
const getStateForRoute = React.useCallback( const getStateForRoute = React.useCallback(
routeKey => (routeKey: string) =>
stateGetters.current[routeKey] === undefined stateGetters.current[routeKey] === undefined
? undefined ? undefined
: stateGetters.current[routeKey](), : stateGetters.current[routeKey](),

View File

@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.20](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.19...@react-navigation/drawer@5.0.0-alpha.20) (2019-11-04)
**Note:** Version bump only for package @react-navigation/drawer
# [5.0.0-alpha.19](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.18...@react-navigation/drawer@5.0.0-alpha.19) (2019-11-02)
**Note:** Version bump only for package @react-navigation/drawer
# [5.0.0-alpha.18](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.17...@react-navigation/drawer@5.0.0-alpha.18) (2019-10-30)
### Bug Fixes
* hide screen from screen reader when drawer is open ([#147](https://github.com/react-navigation/navigation-ex/issues/147)) ([fb749ac](https://github.com/react-navigation/navigation-ex/commit/fb749ac))
### Features
* add an 'unmountInactiveScreens' option ([12d597f](https://github.com/react-navigation/navigation-ex/commit/12d597f))
# [5.0.0-alpha.17](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.16...@react-navigation/drawer@5.0.0-alpha.17) (2019-10-29) # [5.0.0-alpha.17](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.16...@react-navigation/drawer@5.0.0-alpha.17) (2019-10-29)
**Note:** Version bump only for package @react-navigation/drawer **Note:** Version bump only for package @react-navigation/drawer

View File

@@ -11,7 +11,7 @@
"material", "material",
"drawer" "drawer"
], ],
"version": "5.0.0-alpha.17", "version": "5.0.0-alpha.20",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,7 +34,7 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
@@ -46,7 +46,7 @@
"react-native-gesture-handler": "^1.3.0", "react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.3.0", "react-native-reanimated": "^1.3.0",
"react-native-safe-area-context": "^0.3.6", "react-native-safe-area-context": "^0.3.6",
"react-native-screens": "^2.0.0-alpha.6", "react-native-screens": "^2.0.0-alpha.7",
"typescript": "^3.6.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -67,16 +67,16 @@ export type DrawerNavigationConfig<T = DrawerContentOptions> = {
* Whether a screen should be unmounted when navigating away from it. * Whether a screen should be unmounted when navigating away from it.
* Defaults to `false`. * Defaults to `false`.
*/ */
unmountInactiveRoutes?: boolean; unmountInactiveScreens?: boolean;
/** /**
* Custom component used to render as the content of the drawer, for example, navigation items. * Function that returns React element to render as the content of the drawer, for example, navigation items.
* Defaults to `DrawerItems`. * Defaults to `DrawerContent`.
*/ */
contentComponent: React.ComponentType<DrawerContentComponentProps<T>>; drawerContent: (props: DrawerContentComponentProps<T>) => React.ReactNode;
/** /**
* Options for the content component which will be passed as props. * Options for the content component which will be passed as props.
*/ */
contentOptions?: T; drawerContentOptions?: T;
/** /**
* Style object for the component wrapping the screen content. * Style object for the component wrapping the screen content.
*/ */

View File

@@ -8,6 +8,7 @@ import {
Keyboard, Keyboard,
StatusBar, StatusBar,
StyleProp, StyleProp,
View,
} from 'react-native'; } from 'react-native';
import { import {
PanGestureHandler, PanGestureHandler,
@@ -544,7 +545,13 @@ export default class DrawerView extends React.PureComponent<Props> {
sceneContainerStyle as any, sceneContainerStyle as any,
]} ]}
> >
{renderSceneContent({ progress: this.progress })} <View
accessibilityElementsHidden={open}
importantForAccessibility={open ? 'no-hide-descendants' : 'auto'}
style={styles.content}
>
{renderSceneContent({ progress: this.progress })}
</View>
<TapGestureHandler onHandlerStateChange={this.handleTapStateChange}> <TapGestureHandler onHandlerStateChange={this.handleTapStateChange}>
<Animated.View <Animated.View
style={[ style={[

View File

@@ -23,6 +23,7 @@ import {
DrawerDescriptorMap, DrawerDescriptorMap,
DrawerNavigationConfig, DrawerNavigationConfig,
DrawerNavigationHelpers, DrawerNavigationHelpers,
DrawerContentComponentProps,
} from '../types'; } from '../types';
type Props = Omit<DrawerNavigationConfig, 'overlayColor'> & { type Props = Omit<DrawerNavigationConfig, 'overlayColor'> & {
@@ -64,7 +65,9 @@ const getDefaultDrawerWidth = ({
export default class DrawerView extends React.PureComponent<Props, State> { export default class DrawerView extends React.PureComponent<Props, State> {
static defaultProps = { static defaultProps = {
lazy: true, lazy: true,
contentComponent: DrawerContent, drawerContent: (props: DrawerContentComponentProps) => (
<DrawerContent {...props} />
),
drawerPosition: I18nManager.isRTL ? 'right' : 'left', drawerPosition: I18nManager.isRTL ? 'right' : 'left',
keyboardDismissMode: 'on-drag', keyboardDismissMode: 'on-drag',
overlayColor: 'rgba(0, 0, 0, 0.5)', overlayColor: 'rgba(0, 0, 0, 0.5)',
@@ -135,60 +138,52 @@ export default class DrawerView extends React.PureComponent<Props, State> {
navigation, navigation,
descriptors, descriptors,
drawerPosition, drawerPosition,
contentComponent: ContentComponent, drawerContent,
contentOptions, drawerContentOptions,
} = this.props; } = this.props;
return ( return drawerContent({
<ContentComponent ...drawerContentOptions,
progress={progress} progress: progress,
state={state} state: state,
navigation={navigation} navigation: navigation,
descriptors={descriptors} descriptors: descriptors,
drawerPosition={drawerPosition} drawerPosition: drawerPosition,
{...contentOptions} });
/>
);
}; };
private renderContent = () => { private renderContent = () => {
let { lazy, state, descriptors, unmountInactiveRoutes } = this.props; let { lazy, state, descriptors, unmountInactiveScreens } = this.props;
const { loaded } = this.state; const { loaded } = this.state;
if (unmountInactiveRoutes) { return (
const activeKey = state.routes[state.index].key; <ScreenContainer style={styles.content}>
const descriptor = descriptors[activeKey]; {state.routes.map((route, index) => {
if (unmountInactiveScreens && index !== state.index) {
return null;
}
return descriptor.render(); if (lazy && !loaded.includes(index)) {
} else { // Don't render a screen if we've never navigated to it
return ( return null;
<ScreenContainer style={styles.content}> }
{state.routes.map((route, index) => {
if (lazy && !loaded.includes(index)) {
// Don't render a screen if we've never navigated to it
return null;
}
const isFocused = state.index === index; const isFocused = state.index === index;
const descriptor = descriptors[route.key]; const descriptor = descriptors[route.key];
return ( return (
<ResourceSavingScene <ResourceSavingScene
key={route.key} key={route.key}
style={[ style={[StyleSheet.absoluteFill, { opacity: isFocused ? 1 : 0 }]}
StyleSheet.absoluteFill, isVisible={isFocused}
{ opacity: isFocused ? 1 : 0 }, >
]} {descriptor.render()}
isVisible={isFocused} </ResourceSavingScene>
> );
{descriptor.render()} })}
</ResourceSavingScene> </ScreenContainer>
); );
})}
</ScreenContainer>
);
}
}; };
private setDrawerGestureRef = (ref: PanGestureHandler | null) => { private setDrawerGestureRef = (ref: PanGestureHandler | null) => {

View File

@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.19](https://github.com/satya164/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.18...@react-navigation/example@5.0.0-alpha.19) (2019-11-04)
**Note:** Version bump only for package @react-navigation/example
# [5.0.0-alpha.18](https://github.com/satya164/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.17...@react-navigation/example@5.0.0-alpha.18) (2019-11-02)
### Bug Fixes
* minor tweaks for web and fix example ([67fd69a](https://github.com/satya164/navigation-ex/commit/67fd69a))
# [5.0.0-alpha.17](https://github.com/satya164/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.16...@react-navigation/example@5.0.0-alpha.17) (2019-10-29) # [5.0.0-alpha.17](https://github.com/satya164/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.16...@react-navigation/example@5.0.0-alpha.17) (2019-10-29)

View File

@@ -28,7 +28,7 @@ target 'ReactNavigationExample' do
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
pod 'RNGestureHandler', :podspec => '../node_modules/react-native-gesture-handler/RNGestureHandler.podspec' pod 'RNGestureHandler', :podspec => '../node_modules/react-native-gesture-handler/RNGestureHandler.podspec'
pod 'RNReanimated', :podspec => '../node_modules/react-native-reanimated/RNReanimated.podspec' pod 'RNReanimated', :podspec => '../node_modules/react-native-reanimated/RNReanimated.podspec'
pod 'RNScreens', :podspec => '../node_modules/react-native-screens/RNScreens.podspec' pod 'RNScreens', :path => '../node_modules/react-native-screens/RNScreens.podspec'
use_unimodules! use_unimodules!
pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context' pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'

View File

@@ -93,7 +93,7 @@ PODS:
- React - React
- RNReanimated (1.2.0): - RNReanimated (1.2.0):
- React - React
- RNScreens (2.0.0-alpha.6): - RNScreens (2.0.0-alpha.7):
- React - React
- UMBarCodeScannerInterface (4.0.0) - UMBarCodeScannerInterface (4.0.0)
- UMCameraInterface (4.0.0) - UMCameraInterface (4.0.0)
@@ -208,7 +208,7 @@ EXTERNAL SOURCES:
RNReanimated: RNReanimated:
:podspec: "../node_modules/react-native-reanimated/RNReanimated.podspec" :podspec: "../node_modules/react-native-reanimated/RNReanimated.podspec"
RNScreens: RNScreens:
:podspec: "../node_modules/react-native-screens/RNScreens.podspec" :path: "../node_modules/react-native-screens/RNScreens.podspec"
UMBarCodeScannerInterface: UMBarCodeScannerInterface:
:path: !ruby/object:Pathname :path: !ruby/object:Pathname
path: "../node_modules/unimodules-barcode-scanner-interface/ios" path: "../node_modules/unimodules-barcode-scanner-interface/ios"
@@ -267,7 +267,7 @@ SPEC CHECKSUMS:
react-native-safe-area-context: e380a6f783ccaec848e2f3cc8eb205a62362950d react-native-safe-area-context: e380a6f783ccaec848e2f3cc8eb205a62362950d
RNGestureHandler: 5329a942fce3d41c68b84c2c2276ce06a696d8b0 RNGestureHandler: 5329a942fce3d41c68b84c2c2276ce06a696d8b0
RNReanimated: 1b52415c4302f198cb581282a0166690bad62c43 RNReanimated: 1b52415c4302f198cb581282a0166690bad62c43
RNScreens: 73691421e207a57b85af0fea931e620b05a35e89 RNScreens: 2f53466846305189a0cfd1745f26b6ca141b3a08
UMBarCodeScannerInterface: d5a6fdc98ed6241225b0a8432a7f4e2b397668bc UMBarCodeScannerInterface: d5a6fdc98ed6241225b0a8432a7f4e2b397668bc
UMCameraInterface: 68870a3197fee85bd5afca5609ba4a5b7257d19d UMCameraInterface: 68870a3197fee85bd5afca5609ba4a5b7257d19d
UMConstantsInterface: d25b8e8887ca7aaf568c06caf08f4d40734ee4ef UMConstantsInterface: d25b8e8887ca7aaf568c06caf08f4d40734ee4ef
@@ -282,6 +282,6 @@ SPEC CHECKSUMS:
UMTaskManagerInterface: 1e70fe58b872355f0ecb44fb81bb1a16484047f0 UMTaskManagerInterface: 1e70fe58b872355f0ecb44fb81bb1a16484047f0
yoga: 684513b14b03201579ba3cee20218c9d1298b0cc yoga: 684513b14b03201579ba3cee20218c9d1298b0cc
PODFILE CHECKSUM: 1276a2dd000c142ccc03272023bb8a6b2d5b9933 PODFILE CHECKSUM: 277599ab8fceae1c57f639a14203691239c429ab
COCOAPODS: 1.8.3 COCOAPODS: 1.8.4

View File

@@ -1,7 +1,7 @@
{ {
"name": "@react-navigation/example", "name": "@react-navigation/example",
"description": "Demo app to showcase various functionality of React Navigation", "description": "Demo app to showcase various functionality of React Navigation",
"version": "5.0.0-alpha.17", "version": "5.0.0-alpha.19",
"private": true, "private": true,
"workspaces": { "workspaces": {
"nohoist": [ "nohoist": [
@@ -29,8 +29,9 @@
"react-native-gesture-handler": "~1.3.0", "react-native-gesture-handler": "~1.3.0",
"react-native-paper": "^3.1.1", "react-native-paper": "^3.1.1",
"react-native-reanimated": "~1.2.0", "react-native-reanimated": "~1.2.0",
"react-native-reanimated-web": "npm:react-native-reanimated@^1.3.2",
"react-native-safe-area-context": "~0.3.6", "react-native-safe-area-context": "~0.3.6",
"react-native-screens": "^2.0.0-alpha.6", "react-native-screens": "^2.0.0-alpha.7",
"react-native-tab-view": "2.10.0", "react-native-tab-view": "2.10.0",
"react-native-unimodules": "^0.7.0-rc.1", "react-native-unimodules": "^0.7.0-rc.1",
"react-native-web": "^0.11.7", "react-native-web": "^0.11.7",
@@ -44,7 +45,7 @@
"@types/react": "^16.9.4", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.19", "@types/react-native": "^0.60.19",
"babel-preset-expo": "^7.0.0", "babel-preset-expo": "^7.0.0",
"expo-cli": "^3.3.0", "expo-cli": "^3.4.1",
"jetifier": "^1.6.4", "jetifier": "^1.6.4",
"typescript": "^3.6.3" "typescript": "^3.6.3"
} }

View File

@@ -32,13 +32,16 @@ const BottomTabs = createBottomTabNavigator<BottomTabParams>();
export default function BottomTabsScreen() { export default function BottomTabsScreen() {
return ( return (
<BottomTabs.Navigator> <BottomTabs.Navigator
screenOptions={{
tabBarButton: props => <TouchableBounce {...props} />,
}}
>
<BottomTabs.Screen <BottomTabs.Screen
name="article" name="article"
options={{ options={{
title: 'Article', title: 'Article',
tabBarIcon: getTabBarIcon('file-document-box'), tabBarIcon: getTabBarIcon('file-document-box'),
tabBarButtonComponent: TouchableBounce,
}} }}
> >
{props => <SimpleStackScreen {...props} headerMode="none" />} {props => <SimpleStackScreen {...props} headerMode="none" />}
@@ -49,7 +52,6 @@ export default function BottomTabsScreen() {
options={{ options={{
tabBarLabel: 'Chat', tabBarLabel: 'Chat',
tabBarIcon: getTabBarIcon('message-reply'), tabBarIcon: getTabBarIcon('message-reply'),
tabBarButtonComponent: TouchableBounce,
}} }}
/> />
<BottomTabs.Screen <BottomTabs.Screen
@@ -58,7 +60,6 @@ export default function BottomTabsScreen() {
options={{ options={{
title: 'Contacts', title: 'Contacts',
tabBarIcon: getTabBarIcon('contacts'), tabBarIcon: getTabBarIcon('contacts'),
tabBarButtonComponent: TouchableBounce,
}} }}
/> />
<BottomTabs.Screen <BottomTabs.Screen
@@ -67,7 +68,6 @@ export default function BottomTabsScreen() {
options={{ options={{
title: 'Albums', title: 'Albums',
tabBarIcon: getTabBarIcon('image-album'), tabBarIcon: getTabBarIcon('image-album'),
tabBarButtonComponent: TouchableBounce,
}} }}
/> />
</BottomTabs.Navigator> </BottomTabs.Navigator>

View File

@@ -2,7 +2,7 @@ import * as React from 'react';
import { View, StyleSheet } from 'react-native'; import { View, StyleSheet } from 'react-native';
import { Button } from 'react-native-paper'; import { Button } from 'react-native-paper';
// eslint-disable-next-line import/no-unresolved // eslint-disable-next-line import/no-unresolved
import { useScreens } from 'react-native-screens'; import { enableScreens } from 'react-native-screens';
import { import {
RouteProp, RouteProp,
ParamListBase, ParamListBase,
@@ -124,8 +124,7 @@ export default function NativeStackScreen({ navigation }: Props) {
); );
} }
// eslint-disable-next-line react-hooks/rules-of-hooks enableScreens(true);
useScreens(true);
const styles = StyleSheet.create({ const styles = StyleSheet.create({
buttons: { buttons: {

View File

@@ -0,0 +1,23 @@
import * as React from 'react';
import { View, Text, StyleSheet } from 'react-native';
export default function NativeStack() {
return (
<View style={styles.container}>
<Text style={styles.text}>Not supported on Web :(</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#eceff1',
},
text: {
fontSize: 16,
color: '#999',
},
});

View File

@@ -10,6 +10,7 @@ module.exports = async function(env, argv) {
config.module.rules.push({ config.module.rules.push({
test: /\.(js|ts|tsx)$/, test: /\.(js|ts|tsx)$/,
include: /packages\/.+/, include: /packages\/.+/,
exclude: /node_modules/,
use: 'babel-loader', use: 'babel-loader',
}); });
@@ -17,25 +18,23 @@ module.exports = async function(env, argv) {
p => !(p instanceof ModuleScopePlugin) p => !(p instanceof ModuleScopePlugin)
); );
config.resolve.alias['react'] = path.resolve( Object.assign(config.resolve.alias, {
__dirname, react: path.resolve(__dirname, 'node_modules', 'react'),
'node_modules', 'react-native': path.resolve(__dirname, 'node_modules', 'react-native-web'),
'react' 'react-native-web': path.resolve(
); __dirname,
config.resolve.alias['react-native'] = path.resolve( 'node_modules',
__dirname, 'react-native-web'
'node_modules', ),
'react-native-web' 'react-native-reanimated': path.resolve(
); __dirname,
config.resolve.alias['react-native-web'] = path.resolve( 'node_modules',
__dirname, 'react-native-reanimated-web'
'node_modules', ),
'react-native-web' '@expo/vector-icons/MaterialCommunityIcons': require.resolve(
); '@expo/vector-icons/MaterialCommunityIcons'
),
config.resolve.alias[ });
'@expo/vector-icons/MaterialCommunityIcons'
] = require.resolve('@expo/vector-icons/MaterialCommunityIcons');
fs.readdirSync(path.join(__dirname, '..')).forEach(name => { fs.readdirSync(path.join(__dirname, '..')).forEach(name => {
config.resolve.alias[`@react-navigation/${name}`] = path.resolve( config.resolve.alias[`@react-navigation/${name}`] = path.resolve(

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.18](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.17...@react-navigation/material-bottom-tabs@5.0.0-alpha.18) (2019-11-04)
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
# [5.0.0-alpha.17](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.16...@react-navigation/material-bottom-tabs@5.0.0-alpha.17) (2019-10-30)
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
# [5.0.0-alpha.16](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.15...@react-navigation/material-bottom-tabs@5.0.0-alpha.16) (2019-10-29) # [5.0.0-alpha.16](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.15...@react-navigation/material-bottom-tabs@5.0.0-alpha.16) (2019-10-29)
**Note:** Version bump only for package @react-navigation/material-bottom-tabs **Note:** Version bump only for package @react-navigation/material-bottom-tabs

View File

@@ -11,7 +11,7 @@
"material", "material",
"tab" "tab"
], ],
"version": "5.0.0-alpha.16", "version": "5.0.0-alpha.18",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,7 +34,7 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.15](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.14...@react-navigation/material-top-tabs@5.0.0-alpha.15) (2019-11-04)
**Note:** Version bump only for package @react-navigation/material-top-tabs
# [5.0.0-alpha.14](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.13...@react-navigation/material-top-tabs@5.0.0-alpha.14) (2019-10-30)
**Note:** Version bump only for package @react-navigation/material-top-tabs
# [5.0.0-alpha.13](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.12...@react-navigation/material-top-tabs@5.0.0-alpha.13) (2019-10-29) # [5.0.0-alpha.13](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.12...@react-navigation/material-top-tabs@5.0.0-alpha.13) (2019-10-29)
**Note:** Version bump only for package @react-navigation/material-top-tabs **Note:** Version bump only for package @react-navigation/material-top-tabs

View File

@@ -11,7 +11,7 @@
"material", "material",
"tab" "tab"
], ],
"version": "5.0.0-alpha.13", "version": "5.0.0-alpha.15",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,7 +34,7 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",

View File

@@ -119,7 +119,7 @@ export type MaterialTopTabNavigationConfig = Partial<
> >
> & { > & {
/** /**
* Component to render for routes that haven't been rendered yet. * Function that returns a React element to render for routes that haven't been rendered yet.
* Receives an object containing the route as the prop. * Receives an object containing the route as the prop.
* The lazy prop also needs to be enabled. * The lazy prop also needs to be enabled.
* *
@@ -127,11 +127,11 @@ export type MaterialTopTabNavigationConfig = Partial<
* *
* By default, this renders null. * By default, this renders null.
*/ */
lazyPlaceholderComponent?: React.ComponentType<{ route: Route<string> }>; lazyPlaceholder?: (props: { route: Route<string> }) => React.ReactNode;
/** /**
* Custom tab bar component. * Function that returns a React element to display as the tab bar.
*/ */
tabBarComponent?: React.ComponentType<MaterialTopTabBarProps>; tabBar?: (props: MaterialTopTabBarProps) => React.ReactNode;
/** /**
* Options for the tab bar which will be passed as props to the tab bar component. * Options for the tab bar which will be passed as props to the tab bar component.
*/ */

View File

@@ -8,6 +8,7 @@ import {
MaterialTopTabDescriptorMap, MaterialTopTabDescriptorMap,
MaterialTopTabNavigationConfig, MaterialTopTabNavigationConfig,
MaterialTopTabNavigationHelpers, MaterialTopTabNavigationHelpers,
MaterialTopTabBarProps,
} from '../types'; } from '../types';
type Props = MaterialTopTabNavigationConfig & { type Props = MaterialTopTabNavigationConfig & {
@@ -23,10 +24,10 @@ export default class MaterialTopTabView extends React.PureComponent<Props> {
}; };
private renderLazyPlaceholder = (props: { route: Route<string> }) => { private renderLazyPlaceholder = (props: { route: Route<string> }) => {
const { lazyPlaceholderComponent: LazyPlaceholder } = this.props; const { lazyPlaceholder } = this.props;
if (LazyPlaceholder != null) { if (lazyPlaceholder != null) {
return <LazyPlaceholder {...props} />; return lazyPlaceholder(props);
} }
return null; return null;
@@ -99,30 +100,30 @@ export default class MaterialTopTabView extends React.PureComponent<Props> {
const { const {
navigation, navigation,
tabBarComponent: TabBarComponent = MaterialTopTabBar, tabBar = (props: MaterialTopTabBarProps) => (
<MaterialTopTabBar {...props} />
),
tabBarPosition, tabBarPosition,
tabBarOptions, tabBarOptions,
} = this.props; } = this.props;
if (TabBarComponent === null || !tabBarVisible) { if (tabBarVisible === false) {
return null; return null;
} }
return ( return tabBar({
<TabBarComponent ...tabBarOptions,
{...tabBarOptions} ...props,
{...props} tabBarPosition: tabBarPosition,
tabBarPosition={tabBarPosition} state: state,
state={state} navigation: navigation,
navigation={navigation} descriptors: descriptors,
descriptors={descriptors} getAccessibilityLabel: this.getAccessibilityLabel,
getAccessibilityLabel={this.getAccessibilityLabel} getLabelText: this.getLabelText,
getLabelText={this.getLabelText} getTestID: this.getTestID,
getTestID={this.getTestID} onTabPress: this.handleTabPress,
onTabPress={this.handleTabPress} onTabLongPress: this.handleTabLongPress,
onTabLongPress={this.handleTabLongPress} });
/>
);
}; };
private handleSwipeStart = () => private handleSwipeStart = () =>
@@ -138,8 +139,8 @@ export default class MaterialTopTabView extends React.PureComponent<Props> {
render() { render() {
const { const {
/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */
lazyPlaceholderComponent, lazyPlaceholder,
tabBarComponent, tabBar,
tabBarOptions, tabBarOptions,
/* eslint-enable @typescript-eslint/no-unused-vars */ /* eslint-enable @typescript-eslint/no-unused-vars */
state, state,

View File

@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.9](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native-stack@5.0.0-alpha.8...@react-navigation/native-stack@5.0.0-alpha.9) (2019-11-04)
**Note:** Version bump only for package @react-navigation/native-stack
# [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native-stack@5.0.0-alpha.7...@react-navigation/native-stack@5.0.0-alpha.8) (2019-11-02)
### Features
* add headerBackTitleVisible to navigation options in native stack ([77f29d3](https://github.com/react-navigation/navigation-ex/commit/77f29d3))
# [5.0.0-alpha.7](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native-stack@5.0.0-alpha.6...@react-navigation/native-stack@5.0.0-alpha.7) (2019-11-02)
### Bug Fixes
* remove top margin from screen in native stack on Android ([5cd6940](https://github.com/react-navigation/navigation-ex/commit/5cd6940))
# [5.0.0-alpha.6](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native-stack@5.0.0-alpha.5...@react-navigation/native-stack@5.0.0-alpha.6) (2019-10-30)
**Note:** Version bump only for package @react-navigation/native-stack
# [5.0.0-alpha.5](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native-stack@5.0.0-alpha.4...@react-navigation/native-stack@5.0.0-alpha.5) (2019-10-29) # [5.0.0-alpha.5](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native-stack@5.0.0-alpha.4...@react-navigation/native-stack@5.0.0-alpha.5) (2019-10-29)
**Note:** Version bump only for package @react-navigation/native-stack **Note:** Version bump only for package @react-navigation/native-stack

View File

@@ -6,7 +6,7 @@
"react-native", "react-native",
"react-navigation" "react-navigation"
], ],
"version": "5.0.0-alpha.5", "version": "5.0.0-alpha.9",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -29,19 +29,19 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"del-cli": "^2.0.0", "del-cli": "^2.0.0",
"react-native-screens": "^2.0.0-alpha.6", "react-native-screens": "^2.0.0-alpha.7",
"typescript": "^3.5.3" "typescript": "^3.5.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",
"react": "*", "react": "*",
"react-native": "*", "react-native": "*",
"react-native-screens": "^2.0.0-alpha.6" "react-native-screens": "^2.0.0-alpha.7"
}, },
"@react-native-community/bob": { "@react-native-community/bob": {
"source": "src", "source": "src",

View File

@@ -65,6 +65,13 @@ export type NativeStackNavigationOptions = {
* @platform ios * @platform ios
*/ */
headerBackTitle?: string; headerBackTitle?: string;
/**
* Whether the back button title should be visible or not. Defaults to `true`.
* Only supported on iOS.
*
* @platform ios
*/
headerBackTitleVisible?: boolean;
/** /**
* Whether to show the header. * Whether to show the header.
*/ */

View File

@@ -20,6 +20,7 @@ export default function HeaderConfig(props: Props) {
headerRight, headerRight,
headerTitle, headerTitle,
headerBackTitle, headerBackTitle,
headerBackTitleVisible = true,
headerHideBackButton, headerHideBackButton,
headerHideShadow, headerHideShadow,
headerTintColor, headerTintColor,
@@ -53,7 +54,7 @@ export default function HeaderConfig(props: Props) {
? headerTitleStyle.color ? headerTitleStyle.color
: headerTintColor : headerTintColor
} }
backTitle={headerBackTitle} backTitle={headerBackTitleVisible ? headerBackTitle : ''}
backTitleFontFamily={headerBackTitleStyle.fontFamily} backTitleFontFamily={headerBackTitleStyle.fontFamily}
backTitleFontSize={headerBackTitleStyle.fontSize} backTitleFontSize={headerBackTitleStyle.fontSize}
color={headerTintColor} color={headerTintColor}

View File

@@ -1,5 +1,5 @@
import * as React from 'react'; import * as React from 'react';
import { View, StyleSheet, Platform } from 'react-native'; import { View, StyleSheet } from 'react-native';
import { StackNavigationState, StackActions } from '@react-navigation/routers'; import { StackNavigationState, StackActions } from '@react-navigation/routers';
import { import {
@@ -43,20 +43,7 @@ export default function StackView({ state, navigation, descriptors }: Props) {
}} }}
> >
<HeaderConfig {...options} route={route} /> <HeaderConfig {...options} route={route} />
<View <View style={[styles.content, contentStyle]}>{renderScene()}</View>
style={[
styles.content,
{
marginTop:
Platform.OS === 'android' && options.headerShown !== false
? 56
: 0,
},
contentStyle,
]}
>
{renderScene()}
</View>
</Screen> </Screen>
); );
})} })}

View File

@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.14](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.13...@react-navigation/native@5.0.0-alpha.14) (2019-10-30)
### Bug Fixes
* support scroll to top in navigators nested in tab ([50dea65](https://github.com/react-navigation/navigation-ex/commit/50dea65))
# [5.0.0-alpha.13](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.12...@react-navigation/native@5.0.0-alpha.13) (2019-10-22) # [5.0.0-alpha.13](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.12...@react-navigation/native@5.0.0-alpha.13) (2019-10-22)
**Note:** Version bump only for package @react-navigation/native **Note:** Version bump only for package @react-navigation/native

View File

@@ -7,7 +7,7 @@
"ios", "ios",
"android" "android"
], ],
"version": "5.0.0-alpha.13", "version": "5.0.0-alpha.14",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -1,5 +1,5 @@
import * as React from 'react'; import * as React from 'react';
import { useNavigation, EventArg } from '@react-navigation/core'; import { useNavigation, useRoute, EventArg } from '@react-navigation/core';
type ScrollOptions = { y?: number; animated?: boolean }; type ScrollOptions = { y?: number; animated?: boolean };
@@ -36,22 +36,42 @@ export default function useScrollToTop(
ref: React.RefObject<ScrollableWrapper> ref: React.RefObject<ScrollableWrapper>
) { ) {
const navigation = useNavigation(); const navigation = useNavigation();
const route = useRoute();
React.useEffect( React.useEffect(() => {
() => let current = navigation;
// @ts-ignore
// The screen might be inside another navigator such as stack nested in tabs
// We need to find the closest tab navigator and add the listener there
while (current && current.dangerouslyGetState().type !== 'tab') {
current = current.dangerouslyGetParent();
}
if (!current) {
return;
}
const unsubscribe = current.addListener(
// We don't wanna import tab types here to avoid extra deps // We don't wanna import tab types here to avoid extra deps
// in addition, there are multiple tab implementations // in addition, there are multiple tab implementations
navigation.addListener('tabPress', (e: EventArg<'tabPress'>) => { // @ts-ignore
'tabPress',
(e: EventArg<'tabPress'>) => {
// We should scroll to top only when the screen is focused
const isFocused = navigation.isFocused(); const isFocused = navigation.isFocused();
// In a nested stack navigator, tab press resets the stack to first screen
// So we should scroll to top only when we are on first screen
const isFirst =
navigation === current ||
navigation.dangerouslyGetState().routes[0].key === route.key;
// Run the operation in the next frame so we're sure all listeners have been run // Run the operation in the next frame so we're sure all listeners have been run
// This is necessary to know if preventDefault() has been called // This is necessary to know if preventDefault() has been called
requestAnimationFrame(() => { requestAnimationFrame(() => {
const scrollable = getScrollableNode(ref); const scrollable = getScrollableNode(ref);
if (isFocused && !e.defaultPrevented && scrollable) { if (isFocused && isFirst && scrollable && !e.defaultPrevented) {
// When user taps on already focused tab, scroll to top
if ('scrollToTop' in scrollable) { if ('scrollToTop' in scrollable) {
scrollable.scrollToTop(); scrollable.scrollToTop();
} else if ('scrollTo' in scrollable) { } else if ('scrollTo' in scrollable) {
@@ -63,7 +83,9 @@ export default function useScrollToTop(
} }
} }
}); });
}), }
[navigation, ref] );
);
return unsubscribe;
}, [navigation, ref, route.key]);
} }

View File

@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.12](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.11...@react-navigation/routers@5.0.0-alpha.12) (2019-11-04)
### Bug Fixes
* close drawer on back button press ([3a4c38b](https://github.com/react-navigation/navigation-ex/commit/3a4c38b))
# [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.10...@react-navigation/routers@5.0.0-alpha.11) (2019-10-30)
**Note:** Version bump only for package @react-navigation/routers
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.9...@react-navigation/routers@5.0.0-alpha.10) (2019-10-29) # [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.9...@react-navigation/routers@5.0.0-alpha.10) (2019-10-29)

View File

@@ -26,6 +26,7 @@ it('gets initial state from route names and params with initialRouteName', () =>
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
}); });
@@ -52,6 +53,7 @@ it('gets initial state from route names and params without initialRouteName', ()
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
}); });
@@ -85,6 +87,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-1', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-1', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
expect( expect(
@@ -106,6 +109,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
expect( expect(
@@ -132,6 +136,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-2', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-2', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
expect( expect(
@@ -154,6 +159,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
expect( expect(
@@ -178,6 +184,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
}); });
@@ -196,6 +203,7 @@ it("doesn't rehydrate state if it's not stale", () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false as const, stale: false as const,
type: 'drawer' as const,
}; };
expect( expect(
@@ -213,6 +221,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -224,6 +233,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -243,6 +253,7 @@ it('handles navigate action with open drawer', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -254,6 +265,7 @@ it('handles navigate action with open drawer', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -273,6 +285,7 @@ it('handles open drawer action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -284,6 +297,7 @@ it('handles open drawer action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -294,6 +308,7 @@ it('handles open drawer action', () => {
const state = { const state = {
stale: false as const, stale: false as const,
type: 'drawer' as const,
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -314,6 +329,7 @@ it('handles close drawer action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -325,6 +341,7 @@ it('handles close drawer action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -335,6 +352,7 @@ it('handles close drawer action', () => {
const state = { const state = {
stale: false as const, stale: false as const,
type: 'drawer' as const,
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -355,6 +373,7 @@ it('handles toggle drawer action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -366,6 +385,7 @@ it('handles toggle drawer action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -378,6 +398,7 @@ it('handles toggle drawer action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -389,6 +410,7 @@ it('handles toggle drawer action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'drawer',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -413,6 +435,7 @@ it('updates route key history on focus change', () => {
{ key: 'qux-0', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-0', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false as const, stale: false as const,
type: 'drawer' as const,
}; };
expect(router.getStateForRouteFocus(state, 'bar-0').routeKeyHistory).toEqual( expect(router.getStateForRouteFocus(state, 'bar-0').routeKeyHistory).toEqual(
@@ -441,6 +464,7 @@ it('closes drawer on focus change', () => {
{ key: 'qux-0', name: 'qux' }, { key: 'qux-0', name: 'qux' },
], ],
stale: false, stale: false,
type: 'drawer',
}, },
'baz-0' 'baz-0'
) )
@@ -456,6 +480,7 @@ it('closes drawer on focus change', () => {
{ key: 'qux-0', name: 'qux' }, { key: 'qux-0', name: 'qux' },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
expect( expect(
@@ -472,6 +497,7 @@ it('closes drawer on focus change', () => {
{ key: 'qux-0', name: 'qux' }, { key: 'qux-0', name: 'qux' },
], ],
stale: false, stale: false,
type: 'drawer',
}, },
'baz-0' 'baz-0'
) )
@@ -487,5 +513,6 @@ it('closes drawer on focus change', () => {
{ key: 'qux-0', name: 'qux' }, { key: 'qux-0', name: 'qux' },
], ],
stale: false, stale: false,
type: 'drawer',
}); });
}); });

View File

@@ -20,6 +20,7 @@ it('gets initial state from route names and params with initialRouteName', () =>
routeNames: ['bar', 'baz', 'qux'], routeNames: ['bar', 'baz', 'qux'],
routes: [{ key: 'baz-test', name: 'baz', params: { answer: 42 } }], routes: [{ key: 'baz-test', name: 'baz', params: { answer: 42 } }],
stale: false, stale: false,
type: 'stack',
}); });
}); });
@@ -40,6 +41,7 @@ it('gets initial state from route names and params without initialRouteName', ()
routeNames: ['bar', 'baz', 'qux'], routeNames: ['bar', 'baz', 'qux'],
routes: [{ key: 'bar-test', name: 'bar' }], routes: [{ key: 'bar-test', name: 'bar' }],
stale: false, stale: false,
type: 'stack',
}); });
}); });
@@ -70,6 +72,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-1', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-1', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'stack',
}); });
expect( expect(
@@ -94,6 +97,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-2', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-2', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'stack',
}); });
expect( expect(
@@ -110,6 +114,7 @@ it('gets rehydrated state from partial state', () => {
routeNames: ['bar', 'baz', 'qux'], routeNames: ['bar', 'baz', 'qux'],
routes: [{ key: 'bar-test', name: 'bar' }], routes: [{ key: 'bar-test', name: 'bar' }],
stale: false, stale: false,
type: 'stack',
}); });
}); });
@@ -122,6 +127,7 @@ it("doesn't rehydrate state if it's not stale", () => {
routeNames: ['bar', 'baz', 'qux'], routeNames: ['bar', 'baz', 'qux'],
routes: [{ key: 'bar-test', name: 'bar' }], routes: [{ key: 'bar-test', name: 'bar' }],
stale: false as const, stale: false as const,
type: 'stack' as const,
}; };
expect( expect(
@@ -147,6 +153,7 @@ it('gets state on route names change', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'stack',
}, },
{ {
routeNames: ['qux', 'baz', 'foo', 'fiz'], routeNames: ['qux', 'baz', 'foo', 'fiz'],
@@ -165,6 +172,7 @@ it('gets state on route names change', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'stack',
}); });
expect( expect(
@@ -178,6 +186,7 @@ it('gets state on route names change', () => {
{ key: 'bar-test', name: 'bar' }, { key: 'bar-test', name: 'bar' },
], ],
stale: false, stale: false,
type: 'stack',
}, },
{ {
routeNames: ['baz', 'qux'], routeNames: ['baz', 'qux'],
@@ -192,6 +201,7 @@ it('gets state on route names change', () => {
routeNames: ['baz', 'qux'], routeNames: ['baz', 'qux'],
routes: [{ key: 'baz-test', name: 'baz', params: { name: 'John' } }], routes: [{ key: 'baz-test', name: 'baz', params: { name: 'John' } }],
stale: false, stale: false,
type: 'stack',
}); });
}); });
@@ -209,6 +219,7 @@ it('gets state on route names change with initialRouteName', () => {
{ key: 'bar-test', name: 'bar' }, { key: 'bar-test', name: 'bar' },
], ],
stale: false, stale: false,
type: 'stack',
}, },
{ {
routeNames: ['baz', 'qux'], routeNames: ['baz', 'qux'],
@@ -223,6 +234,7 @@ it('gets state on route names change with initialRouteName', () => {
routeNames: ['baz', 'qux'], routeNames: ['baz', 'qux'],
routes: [{ key: 'qux-test', name: 'qux' }], routes: [{ key: 'qux-test', name: 'qux' }],
stale: false, stale: false,
type: 'stack',
}); });
}); });
@@ -233,6 +245,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -242,6 +255,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -260,6 +274,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -269,6 +284,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -279,6 +295,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -291,6 +308,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -304,6 +322,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -317,6 +336,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -330,6 +350,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -342,6 +363,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -352,6 +374,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -361,6 +384,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -379,6 +403,7 @@ it('handles go back action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -388,6 +413,7 @@ it('handles go back action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -398,6 +424,7 @@ it('handles go back action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -415,6 +442,7 @@ it('handles pop action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -428,6 +456,7 @@ it('handles pop action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -438,6 +467,7 @@ it('handles pop action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -451,6 +481,7 @@ it('handles pop action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -461,6 +492,7 @@ it('handles pop action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -478,6 +510,7 @@ it('handles pop action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -488,6 +521,7 @@ it('handles pop action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -505,6 +539,7 @@ it('handles pop to top action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -518,6 +553,7 @@ it('handles pop to top action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -532,6 +568,7 @@ it('handles push action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -541,6 +578,7 @@ it('handles push action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 3, index: 3,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -551,6 +589,7 @@ it('handles push action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'stack',
key: 'root', key: 'root',
index: 2, index: 2,
routeNames: ['baz', 'bar', 'qux'], routeNames: ['baz', 'bar', 'qux'],
@@ -576,6 +615,7 @@ it('changes index on focus change', () => {
{ key: 'qux-0', name: 'qux' }, { key: 'qux-0', name: 'qux' },
], ],
stale: false, stale: false,
type: 'stack',
}, },
'baz-0' 'baz-0'
) )
@@ -585,6 +625,7 @@ it('changes index on focus change', () => {
routeNames: ['bar', 'baz', 'qux'], routeNames: ['bar', 'baz', 'qux'],
routes: [{ key: 'bar-0', name: 'bar' }, { key: 'baz-0', name: 'baz' }], routes: [{ key: 'bar-0', name: 'bar' }, { key: 'baz-0', name: 'baz' }],
stale: false, stale: false,
type: 'stack',
}); });
const state = { const state = {
@@ -593,6 +634,7 @@ it('changes index on focus change', () => {
routeNames: ['bar', 'baz', 'qux'], routeNames: ['bar', 'baz', 'qux'],
routes: [{ key: 'bar-0', name: 'bar' }, { key: 'baz-0', name: 'baz' }], routes: [{ key: 'bar-0', name: 'bar' }, { key: 'baz-0', name: 'baz' }],
stale: false as const, stale: false as const,
type: 'stack' as const,
}; };
expect(router.getStateForRouteFocus(state, 'qux-0')).toEqual(state); expect(router.getStateForRouteFocus(state, 'qux-0')).toEqual(state);

View File

@@ -25,6 +25,7 @@ it('gets initial state from route names and params with initialRouteName', () =>
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
}); });
@@ -50,6 +51,7 @@ it('gets initial state from route names and params without initialRouteName', ()
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
}); });
@@ -82,6 +84,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-1', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-1', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
expect( expect(
@@ -102,6 +105,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
expect( expect(
@@ -127,6 +131,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-2', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-2', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
expect( expect(
@@ -148,6 +153,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
expect( expect(
@@ -170,6 +176,7 @@ it('gets rehydrated state from partial state', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
}); });
@@ -187,6 +194,7 @@ it("doesn't rehydrate state if it's not stale", () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false as const, stale: false as const,
type: 'tab' as const,
}; };
expect( expect(
@@ -213,6 +221,7 @@ it('gets state on route names change', () => {
{ key: 'qux-test', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-test', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false, stale: false,
type: 'tab',
}, },
{ {
routeNames: ['qux', 'baz', 'foo', 'fiz'], routeNames: ['qux', 'baz', 'foo', 'fiz'],
@@ -234,6 +243,7 @@ it('gets state on route names change', () => {
{ key: 'fiz-test', name: 'fiz', params: { fruit: 'apple' } }, { key: 'fiz-test', name: 'fiz', params: { fruit: 'apple' } },
], ],
stale: false, stale: false,
type: 'tab',
}); });
}); });
@@ -244,6 +254,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -254,6 +265,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -268,6 +280,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -278,6 +291,7 @@ it('handles navigate action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -292,6 +306,7 @@ it('handles navigate action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -310,6 +325,7 @@ it('handles jump to action', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -320,6 +336,7 @@ it('handles jump to action', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -335,6 +352,7 @@ it('handles back action with backBehavior: history', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -345,6 +363,7 @@ it('handles back action with backBehavior: history', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -356,6 +375,7 @@ it('handles back action with backBehavior: history', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -374,6 +394,7 @@ it('handles back action with backBehavior: order', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -384,6 +405,7 @@ it('handles back action with backBehavior: order', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -395,6 +417,7 @@ it('handles back action with backBehavior: order', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -416,6 +439,7 @@ it('handles back action with backBehavior: initialRoute', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -426,6 +450,7 @@ it('handles back action with backBehavior: initialRoute', () => {
) )
).toEqual({ ).toEqual({
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -437,6 +462,7 @@ it('handles back action with backBehavior: initialRoute', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 1, index: 1,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -455,6 +481,7 @@ it('handles back action with backBehavior: none', () => {
router.getStateForAction( router.getStateForAction(
{ {
stale: false, stale: false,
type: 'tab',
key: 'root', key: 'root',
index: 0, index: 0,
routeNames: ['baz', 'bar'], routeNames: ['baz', 'bar'],
@@ -480,6 +507,7 @@ it('updates route key history on navigate and jump to', () => {
{ key: 'qux-0', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-0', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false as const, stale: false as const,
type: 'tab',
}; };
expect(state.routeKeyHistory).toEqual([]); expect(state.routeKeyHistory).toEqual([]);
@@ -534,6 +562,7 @@ it('updates route key history on focus change', () => {
{ key: 'qux-0', name: 'qux', params: { name: 'Jane' } }, { key: 'qux-0', name: 'qux', params: { name: 'Jane' } },
], ],
stale: false as const, stale: false as const,
type: 'tab' as const,
}; };
expect(router.getStateForRouteFocus(state, 'bar-0').routeKeyHistory).toEqual( expect(router.getStateForRouteFocus(state, 'bar-0').routeKeyHistory).toEqual(

View File

@@ -6,7 +6,7 @@
"react-native", "react-native",
"react-navigation" "react-navigation"
], ],
"version": "5.0.0-alpha.10", "version": "5.0.0-alpha.12",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -17,7 +17,11 @@ export type DrawerActionType =
export type DrawerRouterOptions = TabRouterOptions; export type DrawerRouterOptions = TabRouterOptions;
export type DrawerNavigationState = TabNavigationState & { export type DrawerNavigationState = Omit<TabNavigationState, 'type'> & {
/**
* Type of the router, in this case, it's drawer.
*/
type: 'drawer';
/** /**
* Whether the drawer is open or closed. * Whether the drawer is open or closed.
*/ */
@@ -40,7 +44,7 @@ export const DrawerActions = {
export default function DrawerRouter( export default function DrawerRouter(
options: DrawerRouterOptions options: DrawerRouterOptions
): Router<DrawerNavigationState, DrawerActionType | CommonAction> { ): Router<DrawerNavigationState, DrawerActionType | CommonAction> {
const router = TabRouter(options) as Router< const router = (TabRouter(options) as unknown) as Router<
DrawerNavigationState, DrawerNavigationState,
TabActionType | CommonAction TabActionType | CommonAction
>; >;
@@ -48,6 +52,8 @@ export default function DrawerRouter(
return { return {
...router, ...router,
type: 'drawer',
getInitialState({ routeNames, routeParamList }) { getInitialState({ routeNames, routeParamList }) {
const index = const index =
options.initialRouteName === undefined options.initialRouteName === undefined
@@ -56,6 +62,7 @@ export default function DrawerRouter(
return { return {
stale: false, stale: false,
type: 'drawer',
key: `drawer-${shortid()}`, key: `drawer-${shortid()}`,
index, index,
routeNames, routeNames,
@@ -81,6 +88,7 @@ export default function DrawerRouter(
return { return {
...state, ...state,
type: 'drawer',
key: `drawer-${shortid()}`, key: `drawer-${shortid()}`,
isDrawerOpen: isDrawerOpen:
typeof partialState.isDrawerOpen === 'boolean' typeof partialState.isDrawerOpen === 'boolean'
@@ -144,6 +152,16 @@ export default function DrawerRouter(
action action
); );
case 'GO_BACK':
if (state.isDrawerOpen) {
return {
...state,
isDrawerOpen: false,
};
}
return router.getStateForAction(state, action);
default: default:
return router.getStateForAction(state, action); return router.getStateForAction(state, action);
} }

View File

@@ -29,7 +29,12 @@ export type StackActionType =
export type StackRouterOptions = DefaultRouterOptions; export type StackRouterOptions = DefaultRouterOptions;
export type StackNavigationState = NavigationState; export type StackNavigationState = NavigationState & {
/**
* Type of the router, in this case, it's stack.
*/
type: 'stack';
};
export const StackActions = { export const StackActions = {
push(name: string, params?: object): StackActionType { push(name: string, params?: object): StackActionType {
@@ -47,6 +52,8 @@ export default function StackRouter(options: StackRouterOptions) {
const router: Router<StackNavigationState, CommonAction | StackActionType> = { const router: Router<StackNavigationState, CommonAction | StackActionType> = {
...BaseRouter, ...BaseRouter,
type: 'stack',
getInitialState({ routeNames, routeParamList }) { getInitialState({ routeNames, routeParamList }) {
const initialRouteName = const initialRouteName =
options.initialRouteName !== undefined options.initialRouteName !== undefined
@@ -55,6 +62,7 @@ export default function StackRouter(options: StackRouterOptions) {
return { return {
stale: false, stale: false,
type: 'stack',
key: `stack-${shortid()}`, key: `stack-${shortid()}`,
index: 0, index: 0,
routeNames, routeNames,
@@ -107,6 +115,7 @@ export default function StackRouter(options: StackRouterOptions) {
return { return {
stale: false, stale: false,
type: 'stack',
key: `stack-${shortid()}`, key: `stack-${shortid()}`,
index: routes.length - 1, index: routes.length - 1,
routeNames, routeNames,

View File

@@ -21,6 +21,10 @@ export type TabRouterOptions = DefaultRouterOptions & {
}; };
export type TabNavigationState = NavigationState & { export type TabNavigationState = NavigationState & {
/**
* Type of the router, in this case, it's tab.
*/
type: 'tab';
/** /**
* List of previously visited route keys. * List of previously visited route keys.
*/ */
@@ -54,6 +58,8 @@ export default function TabRouter({
const router: Router<TabNavigationState, TabActionType | CommonAction> = { const router: Router<TabNavigationState, TabActionType | CommonAction> = {
...BaseRouter, ...BaseRouter,
type: 'tab',
getInitialState({ routeNames, routeParamList }) { getInitialState({ routeNames, routeParamList }) {
const index = const index =
initialRouteName === undefined initialRouteName === undefined
@@ -62,6 +68,7 @@ export default function TabRouter({
return { return {
stale: false, stale: false,
type: 'tab',
key: `tab-${shortid()}`, key: `tab-${shortid()}`,
index, index,
routeNames, routeNames,
@@ -121,6 +128,7 @@ export default function TabRouter({
return { return {
stale: false, stale: false,
type: 'tab',
key: `tab-${shortid()}`, key: `tab-${shortid()}`,
index, index,
routeNames, routeNames,

View File

@@ -3,6 +3,48 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.34](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.33...@react-navigation/stack@5.0.0-alpha.34) (2019-11-04)
### Features
* support transform style for header ([#158](https://github.com/react-navigation/navigation-ex/issues/158)) ([a93a81e](https://github.com/react-navigation/navigation-ex/commit/a93a81e))
# [5.0.0-alpha.33](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.32...@react-navigation/stack@5.0.0-alpha.33) (2019-11-02)
### Bug Fixes
* add horizontal margin to centered title ([2ef5ad4](https://github.com/react-navigation/navigation-ex/commit/2ef5ad4))
* remove unnecessary paddingHorizontal on stack header ([74ee216](https://github.com/react-navigation/navigation-ex/commit/74ee216))
# [5.0.0-alpha.32](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.31...@react-navigation/stack@5.0.0-alpha.32) (2019-11-02)
### Bug Fixes
* minor tweaks for web and fix example ([67fd69a](https://github.com/react-navigation/navigation-ex/commit/67fd69a))
# [5.0.0-alpha.31](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.30...@react-navigation/stack@5.0.0-alpha.31) (2019-10-30)
**Note:** Version bump only for package @react-navigation/stack
# [5.0.0-alpha.30](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.29...@react-navigation/stack@5.0.0-alpha.30) (2019-10-29) # [5.0.0-alpha.30](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.29...@react-navigation/stack@5.0.0-alpha.30) (2019-10-29)

View File

@@ -10,7 +10,7 @@
"android", "android",
"stack" "stack"
], ],
"version": "5.0.0-alpha.30", "version": "5.0.0-alpha.34",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -33,7 +33,7 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.10" "@react-navigation/routers": "^5.0.0-alpha.12"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
@@ -46,7 +46,7 @@
"react-native-gesture-handler": "^1.3.0", "react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.3.0", "react-native-reanimated": "^1.3.0",
"react-native-safe-area-context": "^0.3.6", "react-native-safe-area-context": "^0.3.6",
"react-native-screens": "^2.0.0-alpha.6", "react-native-screens": "^2.0.0-alpha.7",
"typescript": "^3.6.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -185,7 +185,9 @@ export type StackHeaderOptions = {
* This is useful for using backgrounds such as an image or a gradient. * This is useful for using backgrounds such as an image or a gradient.
* You can use this with `headerTransparent` to render a blur view, for example, to create a translucent header. * You can use this with `headerTransparent` to render a blur view, for example, to create a translucent header.
*/ */
headerBackground?: () => React.ReactNode; headerBackground?: (props: {
style: StyleProp<ViewStyle>;
}) => React.ReactNode;
/** /**
* Style object for the header. You can specify a custom background color here, for example. * Style object for the header. You can specify a custom background color here, for example.
*/ */
@@ -249,7 +251,6 @@ export type StackNavigationOptions = StackHeaderOptions &
title?: string; title?: string;
/** /**
* Function that given `HeaderProps` returns a React Element to display as a header. * Function that given `HeaderProps` returns a React Element to display as a header.
* Setting to `null` hides header.
*/ */
header?: (props: StackHeaderProps) => React.ReactNode; header?: (props: StackHeaderProps) => React.ReactNode;
/** /**

View File

@@ -24,9 +24,8 @@ const styles = StyleSheet.create({
}, },
}, },
default: { default: {
// https://github.com/necolas/react-native-web/issues/44 borderBottomWidth: StyleSheet.hairlineWidth,
// Material Design borderBottomColor: 'rgba(0, 0, 0, 0.20)',
boxShadow: `0 2px 4px -1px rgba(0,0,0,0.2), 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12)`,
}, },
}), }),
}, },

View File

@@ -222,6 +222,7 @@ export default class HeaderSegment extends React.Component<Props, State> {
shadowOpacity, shadowOpacity,
shadowRadius, shadowRadius,
opacity, opacity,
transform,
...unsafeStyles ...unsafeStyles
} = StyleSheet.flatten(customHeaderStyle || {}) as ViewStyle; } = StyleSheet.flatten(customHeaderStyle || {}) as ViewStyle;
@@ -263,6 +264,7 @@ export default class HeaderSegment extends React.Component<Props, State> {
shadowOpacity, shadowOpacity,
shadowRadius, shadowRadius,
opacity, opacity,
transform,
}; };
// Setting a property to undefined triggers default style // Setting a property to undefined triggers default style
@@ -301,14 +303,14 @@ export default class HeaderSegment extends React.Component<Props, State> {
style={[StyleSheet.absoluteFill, backgroundStyle]} style={[StyleSheet.absoluteFill, backgroundStyle]}
> >
{headerBackground ? ( {headerBackground ? (
headerBackground() headerBackground({ style: safeStyles })
) : headerTransparent ? null : ( ) : headerTransparent ? null : (
<HeaderBackground style={safeStyles} /> <HeaderBackground style={safeStyles} />
)} )}
</Animated.View> </Animated.View>
<Animated.View <Animated.View
pointerEvents="box-none" pointerEvents="box-none"
style={[{ height, minHeight, maxHeight, opacity }]} style={[{ height, minHeight, maxHeight, opacity, transform }]}
> >
<View pointerEvents="none" style={{ height: insets.top }} /> <View pointerEvents="none" style={{ height: insets.top }} />
<View pointerEvents="box-none" style={styles.content}> <View pointerEvents="box-none" style={styles.content}>
@@ -328,10 +330,9 @@ export default class HeaderSegment extends React.Component<Props, State> {
<Animated.View <Animated.View
pointerEvents="box-none" pointerEvents="box-none"
style={[ style={[
headerTitleAlign === 'left' && { headerTitleAlign === 'left'
position: 'absolute', ? { position: 'absolute', left: leftButton ? 72 : 16 }
left: leftButton ? 72 : 16, : { marginHorizontal: 18 },
},
titleStyle, titleStyle,
titleContainerStyle, titleContainerStyle,
]} ]}
@@ -366,7 +367,6 @@ export default class HeaderSegment extends React.Component<Props, State> {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
content: { content: {
flex: 1, flex: 1,
paddingHorizontal: 4,
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',

View File

@@ -7,7 +7,9 @@ type Props = TextProps & {
}; };
export default function HeaderTitle({ style, ...rest }: Props) { export default function HeaderTitle({ style, ...rest }: Props) {
return <Animated.Text {...rest} style={[styles.title, style]} />; return (
<Animated.Text numberOfLines={1} {...rest} style={[styles.title, style]} />
);
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
@@ -24,7 +26,7 @@ const styles = StyleSheet.create({
}, },
default: { default: {
fontSize: 18, fontSize: 18,
fontWeight: '400', fontWeight: '500',
color: '#3c4043', color: '#3c4043',
}, },
}), }),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 207 B

427
yarn.lock
View File

@@ -1107,19 +1107,30 @@
resolve-from "^5.0.0" resolve-from "^5.0.0"
slugify "^1.3.4" slugify "^1.3.4"
"@expo/dev-tools@^0.6.6": "@expo/config@^2.3.0":
version "0.6.6" version "2.3.0"
resolved "https://registry.yarnpkg.com/@expo/dev-tools/-/dev-tools-0.6.6.tgz#6ea36ff2ddf8d40efc68e9f235d63e446979a90c" resolved "https://registry.yarnpkg.com/@expo/config/-/config-2.3.0.tgz#b6a9ee176744e5dda915763afb08542643c32acf"
integrity sha512-UF6GKNSBigwmwyt9y4niHyKemcq2inChnpKwJKL9kJJ4BiPGPheqswhMxZasNeyh4ds2vQmjU8jvUjQOsKDRsw== integrity sha512-EGyN+vba+04RFX8rlQSvlXN5QgSldjd1qubPsgaoSX+MzBGA2IEH/2pnW2An9VJwQ9vG8axaH8ArcRmQ2nyr0w==
dependencies: dependencies:
"@expo/config" "^2.2.0" "@expo/json-file" "^8.2.1"
find-yarn-workspace-root "^1.2.1"
fs-extra "^7.0.1"
resolve-from "^5.0.0"
slugify "^1.3.4"
"@expo/dev-tools@^0.6.7":
version "0.6.8"
resolved "https://registry.yarnpkg.com/@expo/dev-tools/-/dev-tools-0.6.8.tgz#4fde9cdc1cf5b464a6f40042330a0ac8b4d2a012"
integrity sha512-KdCiG/StWv7RxodE5gEprxxJ8W2/tgW7AOiOGjtV9ni5OCqdjhgnepyOfXuAOSEsVTVXsH8HF1Xjni4IxK43Yw==
dependencies:
"@expo/config" "^2.3.0"
base64url "3.0.1" base64url "3.0.1"
express "4.16.4" express "4.16.4"
freeport-async "1.1.1" freeport-async "2.0.0"
graphql "0.13.2" graphql "0.13.2"
graphql-tools "3.0.0" graphql-tools "3.0.0"
iterall "1.2.2" iterall "1.2.2"
lodash "^4.17.11" lodash "^4.17.15"
subscriptions-transport-ws "0.9.8" subscriptions-transport-ws "0.9.8"
"@expo/image-utils@^0.2.6": "@expo/image-utils@^0.2.6":
@@ -1132,6 +1143,16 @@
optionalDependencies: optionalDependencies:
sharp-cli "1.10.0" sharp-cli "1.10.0"
"@expo/image-utils@^0.2.7":
version "0.2.7"
resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.2.7.tgz#1669aad4e4d8e923d91ba612974cfc30db6c2661"
integrity sha512-fideaPyR8w3XykLcck/2Tu7aWsAFmaAaqOjMAOCuuarUYKnFusDqxaicNWp5yLPufxG63p8d3TFKLxWpL7YD3A==
dependencies:
"@expo/spawn-async" "1.5.0"
semver "6.1.1"
optionalDependencies:
sharp-cli "1.10.0"
"@expo/json-file@^8.2.0": "@expo/json-file@^8.2.0":
version "8.2.0" version "8.2.0"
resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.0.tgz#efb82b9a4e092aadb629451e60d0893369b7689e" resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.0.tgz#efb82b9a4e092aadb629451e60d0893369b7689e"
@@ -1144,6 +1165,18 @@
util.promisify "^1.0.0" util.promisify "^1.0.0"
write-file-atomic "^2.3.0" write-file-atomic "^2.3.0"
"@expo/json-file@^8.2.1":
version "8.2.1"
resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.1.tgz#481e038ec0b01bf0d48bc223acaaa25214ccb4c6"
integrity sha512-8X7rBhjNJEXTXlVLAhOoRl19WhlRhfuEp8cbfoE1fEV0ExXyZwfN8rRYbm2Q5BcFjSsRnfuTckpQiU86qahIDA==
dependencies:
"@babel/code-frame" "^7.0.0-beta.44"
fs-extra "^8.0.1"
json5 "^1.0.1"
lodash "^4.17.15"
util.promisify "^1.0.0"
write-file-atomic "^2.3.0"
"@expo/ngrok-bin-darwin-ia32@2.2.8": "@expo/ngrok-bin-darwin-ia32@2.2.8":
version "2.2.8" version "2.2.8"
resolved "https://registry.yarnpkg.com/@expo/ngrok-bin-darwin-ia32/-/ngrok-bin-darwin-ia32-2.2.8.tgz#46ed6d485a87396acf4af317beeaab7a1f607315" resolved "https://registry.yarnpkg.com/@expo/ngrok-bin-darwin-ia32/-/ngrok-bin-darwin-ia32-2.2.8.tgz#46ed6d485a87396acf4af317beeaab7a1f607315"
@@ -1228,23 +1261,23 @@
request "^2.81.0" request "^2.81.0"
uuid "^3.0.0" uuid "^3.0.0"
"@expo/osascript@^2.0.6-alpha.0": "@expo/osascript@^2.0.6":
version "2.0.6-alpha.0" version "2.0.6"
resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.0.6-alpha.0.tgz#bd9faa067412ae3e96ac52ffcd5b21a57c5780e5" resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.0.6.tgz#232be46a56bc4c3a1934de21971d7e29810e2bb1"
integrity sha512-KK2vGJMnhrfotlo/axhg3sBTfyo10e0AfSxk6LLhbKT7QDflkzWG0o4z/yIgn2DiglbVa2FEvVp0gUWSdeZp0g== integrity sha512-V4qsnRodRZT5OKMQ69gzyMr4vjFbA5YP4MEZ2khdomEFlxxJyobaLv8aWB1303i2yPdEY3vYi4pF6LxL4tXPUg==
dependencies: dependencies:
"@expo/spawn-async" "^1.5.0" "@expo/spawn-async" "^1.5.0"
exec-async "^2.2.0" exec-async "^2.2.0"
"@expo/schemer@^1.2.8": "@expo/schemer@^1.2.9":
version "1.2.8" version "1.2.9"
resolved "https://registry.yarnpkg.com/@expo/schemer/-/schemer-1.2.8.tgz#4e13e125157bc3fc0d53520a7ccb81f7d4598848" resolved "https://registry.yarnpkg.com/@expo/schemer/-/schemer-1.2.9.tgz#88f93623101138f7290e217b91cf255ee68e8ca9"
integrity sha512-NzKNhsHFwJrSzwk1xMhpwmtAkZ0Z4UaApw/J8aBrH+jsvySepLE2ZSAFr4Zv7fwPBG1zRJTU2oCuGw1DX7WCgQ== integrity sha512-KKdPv+wag/98g07nCvl5MqezllsRAXqo9FX7+I/iB2erb5YlUHcjVQ7EOhgEh4u0OLhkYU2k03vyf9lCdB8lkg==
dependencies: dependencies:
ajv "^5.2.2" ajv "^5.2.2"
es6-error "^4.0.2" es6-error "^4.0.2"
json-schema-traverse "0.3.1" json-schema-traverse "0.3.1"
lodash "^4.17.11" lodash "^4.17.15"
probe-image-size "^3.1.0" probe-image-size "^3.1.0"
read-chunk "^3.2.0" read-chunk "^3.2.0"
@@ -1320,6 +1353,49 @@
workbox-webpack-plugin "^3.6.3" workbox-webpack-plugin "^3.6.3"
yup "^0.27.0" yup "^0.27.0"
"@expo/webpack-config@^0.8.1":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@expo/webpack-config/-/webpack-config-0.8.1.tgz#46b5fe690570fa9690983031e0e493f73840e2ca"
integrity sha512-R4mkY6jcorXO7sb2g9gUlUyRsa11M7xAGHE0DFilQEUCAHDfSH4eEr4Mg5NdWMHrr5Hi2W7rSt21UgJ2CjP88w==
dependencies:
"@babel/core" "^7.0.0"
"@babel/runtime" "^7.3.4"
"@expo/config" "^2.3.0"
"@expo/webpack-pwa-manifest-plugin" "^1.2.8"
"@types/yup" "^0.26.24"
babel-loader "8.0.6"
babel-preset-expo "^7.0.0"
brotli-webpack-plugin "^1.1.0"
chalk "^2.4.2"
clean-webpack-plugin "^1.0.1"
compression-webpack-plugin "^2.0.0"
copy-webpack-plugin "5.0.0"
css-loader "^2.1.1"
deep-diff "^1.0.2"
file-loader "4.2.0"
find-yarn-workspace-root "^1.2.1"
getenv "^0.7.0"
html-loader "^0.5.5"
html-webpack-plugin "4.0.0-alpha.2"
is-wsl "^2.0.0"
mini-css-extract-plugin "^0.5.0"
optimize-css-assets-webpack-plugin "^5.0.1"
pnp-webpack-plugin "^1.2.1"
postcss-safe-parser "^4.0.1"
prettier "^1.16.4"
progress-bar-webpack-plugin "^1.12.1"
react-dev-utils "9.0.3"
style-loader "^0.23.1"
terser-webpack-plugin "^1.2.3"
url-loader "^1.1.2"
webpack "4.39.0"
webpack-bundle-analyzer "^3.0.4"
webpack-deep-scope-plugin "1.6.0"
webpack-manifest-plugin "^2.0.4"
webpack-merge "^4.2.1"
workbox-webpack-plugin "^3.6.3"
yup "^0.27.0"
"@expo/webpack-pwa-manifest-plugin@^1.2.7": "@expo/webpack-pwa-manifest-plugin@^1.2.7":
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/@expo/webpack-pwa-manifest-plugin/-/webpack-pwa-manifest-plugin-1.2.7.tgz#cfee555f53ccc2745f9a2ed5185803ed8735292d" resolved "https://registry.yarnpkg.com/@expo/webpack-pwa-manifest-plugin/-/webpack-pwa-manifest-plugin-1.2.7.tgz#cfee555f53ccc2745f9a2ed5185803ed8735292d"
@@ -1332,6 +1408,18 @@
node-fetch "^2.6.0" node-fetch "^2.6.0"
tempy "^0.3.0" tempy "^0.3.0"
"@expo/webpack-pwa-manifest-plugin@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@expo/webpack-pwa-manifest-plugin/-/webpack-pwa-manifest-plugin-1.2.8.tgz#ae6127e10eaae43a53daf9a3fa28a6b94515f083"
integrity sha512-Oo70gOyE1NICKkUdNvmth8xSNEfowUNIQ0ibDBy63shOB1gSPTW+lcQ7H1ruKgFB4iApYk58f4H4kPMVRc6Uiw==
dependencies:
"@expo/config" "^2.3.0"
"@expo/image-utils" "^0.2.7"
is-color "^1.0.2"
mime "^2.4.0"
node-fetch "^2.6.0"
tempy "^0.3.0"
"@expo/websql@^1.0.1": "@expo/websql@^1.0.1":
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/@expo/websql/-/websql-1.0.1.tgz#fff0cf9c1baa1f70f9e1d658b7c39a420d9b10a9" resolved "https://registry.yarnpkg.com/@expo/websql/-/websql-1.0.1.tgz#fff0cf9c1baa1f70f9e1d658b7c39a420d9b10a9"
@@ -1343,25 +1431,23 @@
pouchdb-collections "^1.0.1" pouchdb-collections "^1.0.1"
tiny-queue "^0.2.1" tiny-queue "^0.2.1"
"@expo/xdl@^56.3.0": "@expo/xdl@^56.4.0":
version "56.3.0" version "56.5.0"
resolved "https://registry.yarnpkg.com/@expo/xdl/-/xdl-56.3.0.tgz#cd7b04b1be76f11b513a6d3322525cb195df2e0f" resolved "https://registry.yarnpkg.com/@expo/xdl/-/xdl-56.5.0.tgz#4d781fbd5ee005781b790e936edc634f3f990969"
integrity sha512-XCouU2dtIKRERnC46P0MRDNw7FC8Hl8J31IM2jlE2B3IDBvs9F+qyXKBYpw0Ne+XIUJzY7PefQLpbRc3O2C4eQ== integrity sha512-DJAgTvgT8OJmbXCbnpqKIDrRM82ZILEO7fNSgOQByYK3R3YAZAslxl60nP8FukH7j3u818H0qEh5d7Rf6AG4nQ==
dependencies: dependencies:
"@expo/bunyan" "3.0.2" "@expo/bunyan" "3.0.2"
"@expo/config" "^2.2.0" "@expo/config" "^2.3.0"
"@expo/image-utils" "^0.2.6" "@expo/image-utils" "^0.2.7"
"@expo/json-file" "^8.2.0" "@expo/json-file" "^8.2.1"
"@expo/ngrok" "2.4.3" "@expo/ngrok" "2.4.3"
"@expo/osascript" "^2.0.6-alpha.0" "@expo/osascript" "^2.0.6"
"@expo/schemer" "^1.2.8" "@expo/schemer" "^1.2.9"
"@expo/spawn-async" "1.5.0" "@expo/spawn-async" "1.5.0"
"@expo/webpack-config" "^0.7.12" "@expo/webpack-config" "^0.8.1"
"@types/webpack" "^4.32.1"
"@types/webpack-dev-server" "^3.1.7"
analytics-node "3.3.0" analytics-node "3.3.0"
axios "0.19.0" axios "0.19.0"
boxen "^4.1.0" boxen "4.1.0"
chalk "2.4.1" chalk "2.4.1"
concat-stream "1.6.2" concat-stream "1.6.2"
decache "4.4.0" decache "4.4.0"
@@ -1369,7 +1455,7 @@
es6-error "4.1.1" es6-error "4.1.1"
express "4.16.4" express "4.16.4"
form-data "2.3.2" form-data "2.3.2"
freeport-async "1.1.1" freeport-async "2.0.0"
fs-extra "6.0.1" fs-extra "6.0.1"
getenv "0.7.0" getenv "0.7.0"
glob "7.1.2" glob "7.1.2"
@@ -1384,13 +1470,15 @@
invariant "2.2.4" invariant "2.2.4"
joi "14.0.4" joi "14.0.4"
latest-version "5.1.0" latest-version "5.1.0"
lodash "4.17.11" lodash "4.17.15"
md5hex "1.0.0" md5hex "1.0.0"
minimatch "3.0.4" minimatch "3.0.4"
minipass "2.3.5" minipass "2.3.5"
mv "2.1.1" mv "2.1.1"
ncp "2.0.0" ncp "2.0.0"
node-forge "0.7.6" node-forge "0.7.6"
p-map "3.0.0"
p-retry "4.1.0"
p-timeout "3.1.0" p-timeout "3.1.0"
package-json "6.4.0" package-json "6.4.0"
pacote "9.3.0" pacote "9.3.0"
@@ -2427,11 +2515,6 @@
dependencies: dependencies:
defer-to-connect "^1.0.1" defer-to-connect "^1.0.1"
"@types/anymatch@*":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
"@types/babel__core@^7.1.0": "@types/babel__core@^7.1.0":
version "7.1.3" version "7.1.3"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30"
@@ -2465,29 +2548,6 @@
dependencies: dependencies:
"@babel/types" "^7.3.0" "@babel/types" "^7.3.0"
"@types/body-parser@*":
version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897"
integrity sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==
dependencies:
"@types/connect" "*"
"@types/node" "*"
"@types/connect-history-api-fallback@*":
version "1.3.3"
resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz#4772b79b8b53185f0f4c9deab09236baf76ee3b4"
integrity sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw==
dependencies:
"@types/express-serve-static-core" "*"
"@types/node" "*"
"@types/connect@*":
version "3.4.32"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==
dependencies:
"@types/node" "*"
"@types/eslint-visitor-keys@^1.0.0": "@types/eslint-visitor-keys@^1.0.0":
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
@@ -2498,23 +2558,6 @@
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
"@types/express-serve-static-core@*":
version "4.16.9"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz#69e00643b0819b024bdede95ced3ff239bb54558"
integrity sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==
dependencies:
"@types/node" "*"
"@types/range-parser" "*"
"@types/express@*":
version "4.17.1"
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.1.tgz#4cf7849ae3b47125a567dfee18bfca4254b88c5c"
integrity sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==
dependencies:
"@types/body-parser" "*"
"@types/express-serve-static-core" "*"
"@types/serve-static" "*"
"@types/fbemitter@^2.0.32": "@types/fbemitter@^2.0.32":
version "2.0.32" version "2.0.32"
resolved "https://registry.yarnpkg.com/@types/fbemitter/-/fbemitter-2.0.32.tgz#8ed204da0f54e9c8eaec31b1eec91e25132d082c" resolved "https://registry.yarnpkg.com/@types/fbemitter/-/fbemitter-2.0.32.tgz#8ed204da0f54e9c8eaec31b1eec91e25132d082c"
@@ -2529,22 +2572,6 @@
"@types/minimatch" "*" "@types/minimatch" "*"
"@types/node" "*" "@types/node" "*"
"@types/http-proxy-middleware@*":
version "0.19.3"
resolved "https://registry.yarnpkg.com/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz#b2eb96fbc0f9ac7250b5d9c4c53aade049497d03"
integrity sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==
dependencies:
"@types/connect" "*"
"@types/http-proxy" "*"
"@types/node" "*"
"@types/http-proxy@*":
version "1.17.0"
resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.0.tgz#baf82ff6aa2723fd29f90e3ba1384e665006863e"
integrity sha512-l+s0IoxSHqhLFJPDHRfO235kgrCkvFD8JmdV/T9C4BKBYPIjrQopGFH4r7h2e3jQqgJRCthRCAZIxDoFnj1zwQ==
dependencies:
"@types/node" "*"
"@types/invariant@^2.2.29": "@types/invariant@^2.2.29":
version "2.2.30" version "2.2.30"
resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.30.tgz#20efa342807606ada5483731a8137cb1561e5fe9" resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.30.tgz#20efa342807606ada5483731a8137cb1561e5fe9"
@@ -2599,11 +2626,6 @@
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.141.tgz#d81f4d0c562abe28713406b571ffb27692a82ae6" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.141.tgz#d81f4d0c562abe28713406b571ffb27692a82ae6"
integrity sha512-v5NYIi9qEbFEUpCyikmnOYe4YlP8BMUdTcNCAquAKzu+FA7rZ1onj9x80mbnDdOW/K5bFf3Tv5kJplP33+gAbQ== integrity sha512-v5NYIi9qEbFEUpCyikmnOYe4YlP8BMUdTcNCAquAKzu+FA7rZ1onj9x80mbnDdOW/K5bFf3Tv5kJplP33+gAbQ==
"@types/mime@*":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==
"@types/minimatch@*": "@types/minimatch@*":
version "3.0.3" version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@@ -2639,11 +2661,6 @@
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.5.3.tgz#1c3b71b091eaeaf5924538006b7f70603ce63d38" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.5.3.tgz#1c3b71b091eaeaf5924538006b7f70603ce63d38"
integrity sha512-Jugo5V/1bS0fRhy2z8+cUAHEyWOATaz4rbyLVvcFs7+dXp5HfwpEwzF1Q11bB10ApUqHf+yTauxI0UXQDwGrbA== integrity sha512-Jugo5V/1bS0fRhy2z8+cUAHEyWOATaz4rbyLVvcFs7+dXp5HfwpEwzF1Q11bB10ApUqHf+yTauxI0UXQDwGrbA==
"@types/range-parser@*":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
"@types/react-native-vector-icons@^6.4.4": "@types/react-native-vector-icons@^6.4.4":
version "6.4.4" version "6.4.4"
resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.4.tgz#f81dcc371b74a9c408ce12f95b8f494d7543146b" resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.4.tgz#f81dcc371b74a9c408ce12f95b8f494d7543146b"
@@ -2676,51 +2693,31 @@
"@types/prop-types" "*" "@types/prop-types" "*"
csstype "^2.2.0" csstype "^2.2.0"
"@types/retry@^0.12.0":
version "0.12.0"
resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d"
integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
"@types/semver@^6.0.1": "@types/semver@^6.0.1":
version "6.0.2" version "6.0.2"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.0.2.tgz#5e8b09f0e4af53034b1d0fb9977a277847836205" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.0.2.tgz#5e8b09f0e4af53034b1d0fb9977a277847836205"
integrity sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ== integrity sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ==
"@types/serve-static@*":
version "1.13.3"
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1"
integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==
dependencies:
"@types/express-serve-static-core" "*"
"@types/mime" "*"
"@types/shortid@^0.0.29": "@types/shortid@^0.0.29":
version "0.0.29" version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-0.0.29.tgz#8093ee0416a6e2bf2aa6338109114b3fbffa0e9b" resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-0.0.29.tgz#8093ee0416a6e2bf2aa6338109114b3fbffa0e9b"
integrity sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps= integrity sha1-gJPuBBam4r8qpjOBCRFLP7/6Dps=
"@types/source-list-map@*":
version "0.1.2"
resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
"@types/stack-utils@^1.0.1": "@types/stack-utils@^1.0.1":
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
"@types/tapable@*":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370"
integrity sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==
"@types/tapable@1.0.2": "@types/tapable@1.0.2":
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.2.tgz#e13182e1b69871a422d7863e11a4a6f5b814a4bd"
integrity sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ== integrity sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==
"@types/uglify-js@*":
version "3.0.4"
resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082"
integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==
dependencies:
source-map "^0.6.1"
"@types/untildify@^3.0.0": "@types/untildify@^3.0.0":
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/untildify/-/untildify-3.0.0.tgz#cd3e6624e46ccf292d3823fb48fa90dda0deaec0" resolved "https://registry.yarnpkg.com/@types/untildify/-/untildify-3.0.0.tgz#cd3e6624e46ccf292d3823fb48fa90dda0deaec0"
@@ -2731,38 +2728,6 @@
resolved "https://registry.yarnpkg.com/@types/uuid-js/-/uuid-js-0.7.2.tgz#5b5552fcbaaf4acf026fb6dc66f7e5bd6b4be92f" resolved "https://registry.yarnpkg.com/@types/uuid-js/-/uuid-js-0.7.2.tgz#5b5552fcbaaf4acf026fb6dc66f7e5bd6b4be92f"
integrity sha512-9R+mA6mMXkFVQnXEeX5fMQDR2SYND7cafJTqbeMpLhgsL7qr7MF4ZBxWpLexml3lZsBsyAmqVWbOiB0N10m15w== integrity sha512-9R+mA6mMXkFVQnXEeX5fMQDR2SYND7cafJTqbeMpLhgsL7qr7MF4ZBxWpLexml3lZsBsyAmqVWbOiB0N10m15w==
"@types/webpack-dev-server@^3.1.7":
version "3.1.7"
resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.1.7.tgz#a3e7a20366e68bc9853c730b56e994634cb78dac"
integrity sha512-VIRkDkBDuOkYRXQ1EG/etisQ3odo6pcjSmA1Si4VYANuNhSBsLxfuPGeGERwCx1nDKxK3aaXnicPzi0gUvxUaw==
dependencies:
"@types/connect-history-api-fallback" "*"
"@types/express" "*"
"@types/http-proxy-middleware" "*"
"@types/serve-static" "*"
"@types/webpack" "*"
"@types/webpack-sources@*":
version "0.1.5"
resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92"
integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==
dependencies:
"@types/node" "*"
"@types/source-list-map" "*"
source-map "^0.6.1"
"@types/webpack@*", "@types/webpack@^4.32.1":
version "4.39.2"
resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.39.2.tgz#fcaa85607a9bdd0e8f86a350f239ff08aede8584"
integrity sha512-3c7+vcmyyIi3RBoOdXs8k3E9rQVIy6yOBqK0DFk6lnJ76JUfbDBWbEf1JflzyPQf56W4ToE+2YPnbxbucniW5w==
dependencies:
"@types/anymatch" "*"
"@types/node" "*"
"@types/tapable" "*"
"@types/uglify-js" "*"
"@types/webpack-sources" "*"
source-map "^0.6.0"
"@types/websql@^0.0.27": "@types/websql@^0.0.27":
version "0.0.27" version "0.0.27"
resolved "https://registry.yarnpkg.com/@types/websql/-/websql-0.0.27.tgz#621a666a7f02018e7cbb4abab956a25736c27d71" resolved "https://registry.yarnpkg.com/@types/websql/-/websql-0.0.27.tgz#621a666a7f02018e7cbb4abab956a25736c27d71"
@@ -3098,7 +3063,7 @@ acorn@^5.5.3:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7: acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7, acorn@^6.2.1:
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
@@ -3152,7 +3117,7 @@ ajv-errors@^1.0.0:
resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
ajv-keywords@^3.1.0: ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
version "3.4.1" version "3.4.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
@@ -3646,7 +3611,7 @@ babel-jest@^24.9.0:
chalk "^2.4.2" chalk "^2.4.2"
slash "^2.0.0" slash "^2.0.0"
babel-loader@^8.0.5: babel-loader@8.0.6, babel-loader@^8.0.5:
version "8.0.6" version "8.0.6"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==
@@ -3961,7 +3926,7 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
boxen@4.1.0, boxen@^4.1.0: boxen@4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.1.0.tgz#256f6b2eb09ba22ea558e5acc0a5ff637bf8ed03" resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.1.0.tgz#256f6b2eb09ba22ea558e5acc0a5ff637bf8ed03"
integrity sha512-Iwq1qOkmEsl0EVABa864Bbj3HCL4186DRZgFW/NrFs5y5GMM3ljsxzMLgOHdWISDRvcM8beh8q4tTNzXz+mSKg== integrity sha512-Iwq1qOkmEsl0EVABa864Bbj3HCL4186DRZgFW/NrFs5y5GMM3ljsxzMLgOHdWISDRvcM8beh8q4tTNzXz+mSKg==
@@ -4498,7 +4463,7 @@ chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.2:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
chrome-trace-event@^1.0.0: chrome-trace-event@^1.0.0, chrome-trace-event@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
@@ -6299,7 +6264,7 @@ eslint-rule-composer@^0.3.0:
resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
eslint-scope@^4.0.0: eslint-scope@^4.0.0, eslint-scope@^4.0.3:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
@@ -6595,18 +6560,18 @@ expo-asset@~7.0.0:
path-browserify "^1.0.0" path-browserify "^1.0.0"
url-parse "^1.4.4" url-parse "^1.4.4"
expo-cli@^3.3.0: expo-cli@^3.4.1:
version "3.3.0" version "3.4.1"
resolved "https://registry.yarnpkg.com/expo-cli/-/expo-cli-3.3.0.tgz#8ee8ff5d3addc5386b321f5534306236813c1bd3" resolved "https://registry.yarnpkg.com/expo-cli/-/expo-cli-3.4.1.tgz#e3619434c252c4132d1f9ee869f7d1f52a447d7d"
integrity sha512-+3XThHXJdFSnm+eG3A44Myxb+K3i39tYyvtFVPsZcGCHBWFQQ2eepBzQyJlcnjRhe5/ElDMLrACAsV+9P5XB1Q== integrity sha512-9v+vzVy1zfdKaWfDCaofrdvZAmHUwBg6eCpzd7XT6sW7tsJsgt5fKRHG26+yHR4QLFcK1ILdKwgmsKDlvPfssw==
dependencies: dependencies:
"@expo/bunyan" "3.0.2" "@expo/bunyan" "3.0.2"
"@expo/config" "^2.2.0" "@expo/config" "^2.3.0"
"@expo/dev-tools" "^0.6.6" "@expo/dev-tools" "^0.6.7"
"@expo/json-file" "^8.2.0" "@expo/json-file" "^8.2.1"
"@expo/simple-spinner" "1.0.2" "@expo/simple-spinner" "1.0.2"
"@expo/spawn-async" "1.5.0" "@expo/spawn-async" "1.5.0"
"@expo/xdl" "^56.3.0" "@expo/xdl" "^56.4.0"
"@types/untildify" "^3.0.0" "@types/untildify" "^3.0.0"
ansi-regex "^4.1.0" ansi-regex "^4.1.0"
axios "0.19.0" axios "0.19.0"
@@ -6630,7 +6595,7 @@ expo-cli@^3.3.0:
inflection "^1.12.0" inflection "^1.12.0"
inquirer "5.2.0" inquirer "5.2.0"
klaw-sync "6.0.0" klaw-sync "6.0.0"
lodash "4.17.11" lodash "4.17.15"
match-require "2.1.0" match-require "2.1.0"
npm-package-arg "6.1.0" npm-package-arg "6.1.0"
open "6.3.0" open "6.3.0"
@@ -7074,6 +7039,14 @@ file-entry-cache@^5.0.1:
dependencies: dependencies:
flat-cache "^2.0.1" flat-cache "^2.0.1"
file-loader@4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e"
integrity sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==
dependencies:
loader-utils "^1.2.3"
schema-utils "^2.0.0"
file-loader@^3.0.1: file-loader@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
@@ -7308,10 +7281,10 @@ fragment-cache@^0.2.1:
dependencies: dependencies:
map-cache "^0.2.2" map-cache "^0.2.2"
freeport-async@1.1.1: freeport-async@2.0.0:
version "1.1.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/freeport-async/-/freeport-async-1.1.1.tgz#5c8cf4fc1aba812578317bd4d7a1e5597baf958e" resolved "https://registry.yarnpkg.com/freeport-async/-/freeport-async-2.0.0.tgz#6adf2ec0c629d11abff92836acd04b399135bab4"
integrity sha1-XIz0/Bq6gSV4MXvU16HlWXuvlY4= integrity sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==
fresh@0.5.2: fresh@0.5.2:
version "0.5.2" version "0.5.2"
@@ -9846,7 +9819,7 @@ load-json-file@^5.3.0:
strip-bom "^3.0.0" strip-bom "^3.0.0"
type-fest "^0.3.0" type-fest "^0.3.0"
loader-runner@^2.3.0: loader-runner@^2.3.0, loader-runner@^2.4.0:
version "2.4.0" version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
@@ -9983,17 +9956,12 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash@4.17.11:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
lodash@4.17.14: lodash@4.17.14:
version "4.17.14" version "4.17.14"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba"
integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==
"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.0, lodash@^4.6.1: lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.0, lodash@^4.6.1:
version "4.17.15" version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -11080,7 +11048,7 @@ negotiator@0.6.2:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
neo-async@^2.5.0, neo-async@^2.6.0: neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
version "2.6.1" version "2.6.1"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
@@ -11163,7 +11131,7 @@ node-int64@^0.4.0:
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
node-libs-browser@^2.0.0: node-libs-browser@^2.0.0, node-libs-browser@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
@@ -11766,6 +11734,13 @@ p-map-series@^1.0.0:
dependencies: dependencies:
p-reduce "^1.0.0" p-reduce "^1.0.0"
p-map@3.0.0, p-map@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
dependencies:
aggregate-error "^3.0.0"
p-map@^1.1.1: p-map@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
@@ -11776,13 +11751,6 @@ p-map@^2.0.0, p-map@^2.1.0:
resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
p-map@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
dependencies:
aggregate-error "^3.0.0"
p-pipe@^1.2.0: p-pipe@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9"
@@ -11800,6 +11768,14 @@ p-reduce@^1.0.0:
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
p-retry@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6"
integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA==
dependencies:
"@types/retry" "^0.12.0"
retry "^0.12.0"
p-timeout@3.1.0: p-timeout@3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.1.0.tgz#198c1f503bb973e9b9727177a276c80afd6851f3" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.1.0.tgz#198c1f503bb973e9b9727177a276c80afd6851f3"
@@ -13111,6 +13087,11 @@ react-native-paper@^3.1.1:
color "^3.1.2" color "^3.1.2"
react-native-safe-area-view "^0.12.0" react-native-safe-area-view "^0.12.0"
"react-native-reanimated-web@npm:react-native-reanimated@^1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.3.2.tgz#3f050e61cad6173ea584517b7b981f17f442aa19"
integrity sha512-wDxI2N9YLZRmH/n9UIah7RnGSCZJcbKa4mylf2+2pPjicDJAlyjljGAkHOwUlSOol8x14fUp5m65TS9eVZNmZQ==
react-native-reanimated@^1.3.0: react-native-reanimated@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.3.0.tgz#581cdb0bd1ff05e7304b116af712ded0c7665ede" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.3.0.tgz#581cdb0bd1ff05e7304b116af712ded0c7665ede"
@@ -13133,10 +13114,10 @@ react-native-safe-area-view@^0.12.0:
dependencies: dependencies:
hoist-non-react-statics "^2.3.1" hoist-non-react-statics "^2.3.1"
react-native-screens@^2.0.0-alpha.6: react-native-screens@^2.0.0-alpha.7:
version "2.0.0-alpha.6" version "2.0.0-alpha.7"
resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.0.0-alpha.6.tgz#238cf7e97ff6008cca75dd1dd4a5a854bce81d57" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.0.0-alpha.7.tgz#7cc2e4000591613cfc9cd92c2e2d83e9b2104a2e"
integrity sha512-5m59glvDDzQvzdBymIn6GfCnzk/9kaxkREEKLVMdANtZlqIuH3Jbgoc+56pcX5LVSZCMaSozPAQBcLaMWO2JUA== integrity sha512-Lst3pOrtXgVrC6GFRO86MMhlFYwCZd0Jz3JBDHnnmWcYb1mzgPmMvooCDv6OdoU2Rv2WZXiaUZh4RQdoyr6YeQ==
dependencies: dependencies:
debounce "^1.2.0" debounce "^1.2.0"
@@ -13828,6 +13809,11 @@ retry@^0.10.0:
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
retry@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
reusify@^1.0.0: reusify@^1.0.0:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
@@ -14038,6 +14024,14 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0" ajv-errors "^1.0.0"
ajv-keywords "^3.1.0" ajv-keywords "^3.1.0"
schema-utils@^2.0.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.5.0.tgz#8f254f618d402cc80257486213c8970edfd7c22f"
integrity sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==
dependencies:
ajv "^6.10.2"
ajv-keywords "^3.4.1"
select-hose@^2.0.0: select-hose@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@@ -14954,7 +14948,7 @@ table@^5.2.3:
slice-ansi "^2.1.0" slice-ansi "^2.1.0"
string-width "^3.0.0" string-width "^3.0.0"
tapable@^1.0.0, tapable@^1.1.0: tapable@^1.0.0, tapable@^1.1.0, tapable@^1.1.3:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
@@ -15084,7 +15078,7 @@ term-size@^2.1.0:
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.1.0.tgz#3aec444c07a7cf936e157c1dc224b590c3c7eef2"
integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg== integrity sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg==
terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.3: terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.3, terser-webpack-plugin@^1.4.1:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
@@ -15876,7 +15870,7 @@ watch@~0.18.0:
exec-sh "^0.2.0" exec-sh "^0.2.0"
minimist "^1.2.0" minimist "^1.2.0"
watchpack@^1.5.0: watchpack@^1.5.0, watchpack@^1.6.0:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
@@ -16002,7 +15996,7 @@ webpack-merge@^4.2.1:
dependencies: dependencies:
lodash "^4.17.15" lodash "^4.17.15"
webpack-sources@^1.0.1, webpack-sources@^1.0.2, webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0: webpack-sources@^1.0.1, webpack-sources@^1.0.2, webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1:
version "1.4.3" version "1.4.3"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
@@ -16040,6 +16034,35 @@ webpack@4.29.6:
watchpack "^1.5.0" watchpack "^1.5.0"
webpack-sources "^1.3.0" webpack-sources "^1.3.0"
webpack@4.39.0:
version "4.39.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.0.tgz#1d511308c3dd8f9fe3152c9447ce30f1814a620c"
integrity sha512-nrxFNSEKm4T1C/EsgOgN50skt//Pl4X7kgJC1MrlE47M292LSCVmMOC47iTGL0CGxbdwhKGgeThrJcw0bstEfA==
dependencies:
"@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5"
"@webassemblyjs/wasm-edit" "1.8.5"
"@webassemblyjs/wasm-parser" "1.8.5"
acorn "^6.2.1"
ajv "^6.10.2"
ajv-keywords "^3.4.1"
chrome-trace-event "^1.0.2"
enhanced-resolve "^4.1.0"
eslint-scope "^4.0.3"
json-parse-better-errors "^1.0.2"
loader-runner "^2.4.0"
loader-utils "^1.2.3"
memory-fs "^0.4.1"
micromatch "^3.1.10"
mkdirp "^0.5.1"
neo-async "^2.6.1"
node-libs-browser "^2.2.1"
schema-utils "^1.0.0"
tapable "^1.1.3"
terser-webpack-plugin "^1.4.1"
watchpack "^1.6.0"
webpack-sources "^1.4.1"
websocket-driver@>=0.5.1: websocket-driver@>=0.5.1:
version "0.7.3" version "0.7.3"
resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9"