From c28cc52d3878dcae33aa0585f1b176ca28f85467 Mon Sep 17 00:00:00 2001 From: Satyajit Sahoo Date: Mon, 9 Sep 2019 12:08:22 +0200 Subject: [PATCH] refactor: migrate project to TypeScript (#161) --- packages/tabs/.circleci/config.yml | 19 +- packages/tabs/.eslintignore | 3 + packages/tabs/.gitignore | 4 +- packages/tabs/example/app.json | 2 +- packages/tabs/example/package.json | 10 +- packages/tabs/example/yarn.lock | 28 +- packages/tabs/package.json | 40 +- packages/tabs/src/index.js | 31 -- packages/tabs/src/index.tsx | 20 + ...igator.js => createBottomTabNavigator.tsx} | 60 ++- ...r.js => createMaterialTopTabNavigator.tsx} | 70 +-- packages/tabs/src/types.tsx | 210 ++++++++ ...TabNavigator.js => createTabNavigator.tsx} | 130 +++-- .../{withDimensions.js => withDimensions.tsx} | 23 +- .../{BottomTabBar.js => BottomTabBar.tsx} | 90 ++-- .../{CrossFadeIcon.js => CrossFadeIcon.tsx} | 26 +- ...rialTopTabBar.js => MaterialTopTabBar.tsx} | 73 +-- ...SavingScene.js => ResourceSavingScene.tsx} | 9 +- packages/tabs/tsconfig.json | 22 + .../tabs/types/@react-navigation/core.d.ts | 58 +++ .../tabs/types/@react-navigation/native.d.ts | 32 ++ packages/tabs/yarn.lock | 461 ++++++++++++++++-- 22 files changed, 1081 insertions(+), 340 deletions(-) delete mode 100644 packages/tabs/src/index.js create mode 100644 packages/tabs/src/index.tsx rename packages/tabs/src/navigators/{createBottomTabNavigator.js => createBottomTabNavigator.tsx} (73%) rename packages/tabs/src/navigators/{createMaterialTopTabNavigator.js => createMaterialTopTabNavigator.tsx} (65%) create mode 100644 packages/tabs/src/types.tsx rename packages/tabs/src/utils/{createTabNavigator.js => createTabNavigator.tsx} (62%) rename packages/tabs/src/utils/{withDimensions.js => withDimensions.tsx} (59%) rename packages/tabs/src/views/{BottomTabBar.js => BottomTabBar.tsx} (86%) rename packages/tabs/src/views/{CrossFadeIcon.js => CrossFadeIcon.tsx} (78%) rename packages/tabs/src/views/{MaterialTopTabBar.js => MaterialTopTabBar.tsx} (55%) rename packages/tabs/src/views/{ResourceSavingScene.js => ResourceSavingScene.tsx} (94%) create mode 100644 packages/tabs/tsconfig.json create mode 100644 packages/tabs/types/@react-navigation/core.d.ts create mode 100644 packages/tabs/types/@react-navigation/native.d.ts diff --git a/packages/tabs/.circleci/config.yml b/packages/tabs/.circleci/config.yml index fc251811..ed7da768 100644 --- a/packages/tabs/.circleci/config.yml +++ b/packages/tabs/.circleci/config.yml @@ -21,8 +21,8 @@ jobs: - v1-dependencies-example-{{ checksum "example/package.json" }} - v1-dependencies-example- - run: | - yarn install - yarn install --cwd example + yarn install --frozen-lockfile + yarn install --frozen-lockfile --cwd example - save_cache: key: v1-dependencies-{{ checksum "package.json" }} paths: node_modules @@ -32,20 +32,29 @@ jobs: - persist_to_workspace: root: . paths: . - lint-and-flow: + lint-and-typecheck: <<: *defaults steps: - attach_workspace: at: ~/project - run: | yarn lint - yarn flow check + yarn typescript + unit-tests: + <<: *defaults + steps: + - attach_workspace: + at: ~/project + - run: yarn test -- --coverage + - store_artifacts: + path: coverage + destination: coverage workflows: version: 2 build-and-test: jobs: - install-dependencies - - lint-and-flow: + - lint-and-typecheck: requires: - install-dependencies diff --git a/packages/tabs/.eslintignore b/packages/tabs/.eslintignore index 1efc53d8..9dbd6428 100644 --- a/packages/tabs/.eslintignore +++ b/packages/tabs/.eslintignore @@ -1,3 +1,6 @@ node_modules/ flow-typed/ dist/ + +# generated by bob +lib/ diff --git a/packages/tabs/.gitignore b/packages/tabs/.gitignore index f968dd3b..4733334c 100644 --- a/packages/tabs/.gitignore +++ b/packages/tabs/.gitignore @@ -7,7 +7,6 @@ # VSCode .vscode/ -tsconfig.json jsconfig.json # Xcode @@ -51,3 +50,6 @@ android/keystores/debug.keystore # Build dist/ + +# generated by bob +lib/ diff --git a/packages/tabs/example/app.json b/packages/tabs/example/app.json index c272b01b..c4aa2cb7 100644 --- a/packages/tabs/example/app.json +++ b/packages/tabs/example/app.json @@ -1,7 +1,7 @@ { "expo": { "name": "React Navigation Tabs Example", - "description": "Demonstrates the various capabilities of react-navigation-tabs: https://github.com/react-navigation/react-navigation-tabs", + "description": "Demonstrates the various capabilities of react-navigation-tabs: https://github.com/react-navigation/tabs", "slug": "react-navigation-tabs-demos", "sdkVersion": "33.0.0", "version": "1.0.0", diff --git a/packages/tabs/example/package.json b/packages/tabs/example/package.json index 7f7b6583..85c0301e 100644 --- a/packages/tabs/example/package.json +++ b/packages/tabs/example/package.json @@ -10,8 +10,8 @@ "main": "App.js", "dependencies": { "@expo/vector-icons": "^10.0.0", - "@react-navigation/core": "3.5.0-alpha.7", - "@react-navigation/native": "^3.6.0-alpha.1", + "@react-navigation/core": "3.5.0", + "@react-navigation/native": "^3.6.2", "expo": "^33.0.7", "expo-asset": "^6.0.0", "expo-constants": "~5.0.1", @@ -19,8 +19,8 @@ "react-native": "https://github.com/expo/react-native/archive/sdk-33.0.0.tar.gz", "react-native-safe-area-view": "^0.13.1", "react-native-screens": "1.0.0-alpha.22", - "react-native-tab-view": "^1.2.0", - "react-navigation-stack": "1.4.0-alpha.0" + "react-native-tab-view": "^2.10.0", + "react-navigation-stack": "1.5.3" }, "devDependencies": { "babel-plugin-module-resolver": "^3.2.0", @@ -29,7 +29,7 @@ }, "resolutions": { "**/hoist-non-react-statics": "2.5.0", - "**/react-native-tab-view": "1.2.0", + "**/react-native-tab-view": "2.10.0", "**/prop-types": "15.6.1" } } diff --git a/packages/tabs/example/yarn.lock b/packages/tabs/example/yarn.lock index dcf04462..d5727ec8 100644 --- a/packages/tabs/example/yarn.lock +++ b/packages/tabs/example/yarn.lock @@ -902,17 +902,17 @@ resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-2.0.10.tgz#d28a446352e75754b78509557988359133cdbcca" integrity sha512-NrIzyLe0eSbhgMnHl2QdSEhaA7yXh6p9jzMomfUa//hoTXE+xbObGDdiWWSQm2bnXnZJg8XCU3AB9qzvqcuLnA== -"@react-navigation/core@3.5.0-alpha.7": - version "3.5.0-alpha.7" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.5.0-alpha.7.tgz#97fa67bff84e6398b15b857045b6f0b6614cd65a" - integrity sha512-mVq9eaNLb+cuytrgdaNHaG4t7Nrgc7G1uPB7rBhNDQqzy5XWvhdJnK6D5yi3mv1z9AvB2I556ffKHWM9TSf09g== +"@react-navigation/core@3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.5.0.tgz#73d1a12448e2bd71855e0080b95a7f51ede0cd9e" + integrity sha512-NLm24lA51R8o8c+iFnwtN9elqRzm4OJ8f1qPBCUNIYW1sb8M5yCD53vRP0fRcPFpr/6Xzs2TJMsWnnebwFp0Rw== dependencies: hoist-non-react-statics "^3.3.0" path-to-regexp "^1.7.0" query-string "^6.4.2" react-is "^16.8.6" -"@react-navigation/native@^3.6.0-alpha.1": +"@react-navigation/native@^3.6.2": version "3.6.2" resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.6.2.tgz#3634697b6350cc5189657ae4551f2d52b57fbbf0" integrity sha512-Cybeou6N82ZeRmgnGlu+wzlV3z5BZQR2dmYaNFV1TNLUGHqtvv8E7oNw9uYcz9Ox5LFbiX+FdNTn2d6ZPlK0kg== @@ -4541,12 +4541,10 @@ react-native-tab-view@1.2.0: dependencies: prop-types "^15.6.1" -react-native-tab-view@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-1.4.1.tgz#f113cd87485808f0c991abec937f70fa380478b9" - integrity sha512-Bke8KkDcDhvB/z0AS7MnQKMD2p6Kwfc1rSKlMOvg9CC5CnClQ2QEnhPSbwegKDYhUkBI92iH/BYy7hNSm5kbUQ== - dependencies: - prop-types "^15.6.1" +react-native-tab-view@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-2.10.0.tgz#5e249e5650502010013449ffd4e5edc18a95364b" + integrity sha512-qgexVz5eO4yaFjdkmn/sURXgVvaBo6pZD/q1eoca96SbPVbaH3WzVhF3bRUfeTHwZkXwznFTpS3JURqIFU8vQA== react-native-view-shot@2.6.0: version "2.6.0" @@ -4616,10 +4614,10 @@ react-native-webview@5.8.1: xmldoc "^0.4.0" yargs "^9.0.0" -react-navigation-stack@1.4.0-alpha.0: - version "1.4.0-alpha.0" - resolved "https://registry.yarnpkg.com/react-navigation-stack/-/react-navigation-stack-1.4.0-alpha.0.tgz#795c7813de71cd7123ddee7483f931abc105bf12" - integrity sha512-ke9MHr07vcv6tteMgvXA8LkdvBq0Lb63aNwNrgjFtEnjIj7nASOnDGlU8emDt6wEhziXYoOQ83TUuyKqc7sP6g== +react-navigation-stack@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/react-navigation-stack/-/react-navigation-stack-1.5.3.tgz#cdc9f5a6dbdc55509a15f60d765722573dec1997" + integrity sha512-MQcwDVbZUYsTtDJb5cFOSm+K+e7KpUCoROaGoUOR+JHWE3uuaJ3pd/Nu+32a57J98TNBf4qq0+2TPJWl6z6IBg== dependencies: prop-types "^15.7.2" diff --git a/packages/tabs/package.json b/packages/tabs/package.json index dd16291b..69cbc38c 100644 --- a/packages/tabs/package.json +++ b/packages/tabs/package.json @@ -2,17 +2,22 @@ "name": "react-navigation-tabs", "version": "2.4.0", "description": "Tab Navigation components for React Navigation", - "main": "src/index.js", + "main": "lib/commonjs/index.js", + "module": "lib/module/index.js", + "react-native": "lib/module/index.js", + "types": "lib/typescript/index.d.ts", "files": [ - "src/" + "src", + "lib" ], "scripts": { "test": "jest", - "flow": "flow", - "lint": "eslint .", + "typescript": "tsc --noEmit", + "lint": "eslint --ext .js,.ts,.tsx .", "bootstrap": "yarn && yarn --cwd example", "example": "yarn --cwd example", - "release": "yarn release-it" + "release": "yarn release-it", + "prepare": "bob build" }, "keywords": [ "react-native-component", @@ -38,11 +43,16 @@ "dependencies": { "hoist-non-react-statics": "^3.3.0", "react-lifecycles-compat": "^3.0.4", + "react-native-safe-area-view": "^0.14.6", "react-native-tab-view": "^2.9.0" }, "devDependencies": { "@commitlint/config-conventional": "^7.5.0", "@expo/vector-icons": "^10.0.1", + "@react-native-community/bob": "^0.6.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/react": "^16.8.17", + "@types/react-native": "^0.57.57", "babel-jest": "^24.5.0", "commitlint": "^7.5.2", "conventional-changelog-cli": "^2.0.12", @@ -50,23 +60,23 @@ "enzyme-adapter-react-16": "^1.11.2", "enzyme-to-json": "^3.2.2", "eslint": "^5.16.0", - "eslint-config-satya164": "^2.3.5", + "eslint-config-satya164": "^2.4.1", "eslint-plugin-react-native-globals": "^0.1.0", "flow-bin": "~0.78.0", "husky": "^1.3.1", "jest": "^24.5.0", - "prettier": "^1.8.2", + "prettier": "^1.17.1", "react": "16.5.0", "react-dom": "16.5.0", "react-native": "~0.57.1", "react-native-reanimated": "^1.0.0-alpha.12", "react-navigation": "^3.3.2", "react-test-renderer": "16.5.0", - "release-it": "^10.3.1" + "release-it": "^10.3.1", + "typescript": "^3.5.2" }, "peerDependencies": { "@react-navigation/core": "^3.4.0", - "@react-navigation/native": "^3.0.0", "react": "*", "react-native": "*", "react-native-gesture-handler": "^1.0.0", @@ -85,10 +95,20 @@ "/__setup__/enzyme.js" ], "modulePathIgnorePatterns": [ - "/example/node_modules" + "/example/node_modules", + "/lib/" ], "snapshotSerializers": [ "enzyme-to-json/serializer" ] + }, + "@react-native-community/bob": { + "source": "src", + "output": "lib", + "targets": [ + "commonjs", + "module", + "typescript" + ] } } diff --git a/packages/tabs/src/index.js b/packages/tabs/src/index.js deleted file mode 100644 index dd4a92c8..00000000 --- a/packages/tabs/src/index.js +++ /dev/null @@ -1,31 +0,0 @@ -/* @flow */ -/* eslint-disable import/no-commonjs */ - -module.exports = { - /** - * Navigators - */ - get createBottomTabNavigator() { - return require('./navigators/createBottomTabNavigator').default; - }, - get createMaterialTopTabNavigator() { - return require('./navigators/createMaterialTopTabNavigator').default; - }, - - /** - * Views - */ - get BottomTabBar() { - return require('./views/BottomTabBar').default; - }, - get MaterialTopTabBar() { - return require('./views/MaterialTopTabBar').default; - }, - - /** - * Utils - */ - get createTabNavigator() { - return require('./utils/createTabNavigator').default; - }, -}; diff --git a/packages/tabs/src/index.tsx b/packages/tabs/src/index.tsx new file mode 100644 index 00000000..027fb6da --- /dev/null +++ b/packages/tabs/src/index.tsx @@ -0,0 +1,20 @@ +/** + * Navigators + */ +export { + default as createBottomTabNavigator, +} from './navigators/createBottomTabNavigator'; +export { + default as createMaterialTopTabNavigator, +} from './navigators/createMaterialTopTabNavigator'; + +/** + * Views + */ +export { default as BottomTabBar } from './views/BottomTabBar'; +export { default as MaterialTopTabBar } from './views/MaterialTopTabBar'; + +/** + * Utils + */ +export { default as createTabNavigator } from './utils/createTabNavigator'; diff --git a/packages/tabs/src/navigators/createBottomTabNavigator.js b/packages/tabs/src/navigators/createBottomTabNavigator.tsx similarity index 73% rename from packages/tabs/src/navigators/createBottomTabNavigator.js rename to packages/tabs/src/navigators/createBottomTabNavigator.tsx index adf180fa..2985d06b 100644 --- a/packages/tabs/src/navigators/createBottomTabNavigator.js +++ b/packages/tabs/src/navigators/createBottomTabNavigator.tsx @@ -1,37 +1,59 @@ -/* @flow */ - import * as React from 'react'; -import { View, StyleSheet } from 'react-native'; +import { + View, + StyleSheet, + AccessibilityRole, + AccessibilityState, +} from 'react-native'; // eslint-disable-next-line import/no-unresolved import { ScreenContainer } from 'react-native-screens'; import createTabNavigator, { - type InjectedProps, + NavigationViewProps, } from '../utils/createTabNavigator'; -import BottomTabBar, { type TabBarOptions } from '../views/BottomTabBar'; +import BottomTabBar from '../views/BottomTabBar'; import ResourceSavingScene from '../views/ResourceSavingScene'; +import { + NavigationProp, + Route, + SceneDescriptor, + NavigationBottomTabOptions, + BottomTabBarOptions, +} from '../types'; -type Props = InjectedProps & { - getAccessibilityRole: (props: { route: any }) => string, - getAccessibilityStates: (props: { route: any }) => string[], - lazy?: boolean, - tabBarComponent?: React.ComponentType<*>, - tabBarOptions?: TabBarOptions, +type Props = NavigationViewProps & { + getAccessibilityRole: (props: { + route: Route; + }) => AccessibilityRole | undefined; + getAccessibilityStates: (props: { + route: Route; + focused: boolean; + }) => AccessibilityState[]; + lazy?: boolean; + tabBarComponent?: React.ComponentType; + tabBarOptions?: BottomTabBarOptions; + navigation: NavigationProp; + descriptors: { [key: string]: SceneDescriptor }; + screenProps?: unknown; }; type State = { - loaded: number[], + loaded: number[]; }; class TabNavigationView extends React.PureComponent { static defaultProps = { lazy: true, - getAccessibilityRole: () => 'button', - getAccessibilityStates: ({ focused }) => (focused ? ['selected'] : []), + getAccessibilityRole: (): AccessibilityRole => 'button', + getAccessibilityStates: ({ + focused, + }: { + focused: boolean; + }): AccessibilityState[] => (focused ? ['selected'] : []), }; - static getDerivedStateFromProps(nextProps, prevState) { + static getDerivedStateFromProps(nextProps: Props, prevState: State) { const { index } = nextProps.navigation.state; return { @@ -46,7 +68,7 @@ class TabNavigationView extends React.PureComponent { loaded: [this.props.navigation.state.index], }; - _getButtonComponent = ({ route }) => { + _getButtonComponent = ({ route }: { route: Route }) => { const { descriptors } = this.props; const descriptor = descriptors[route.key]; const options = descriptor.options; @@ -55,7 +77,7 @@ class TabNavigationView extends React.PureComponent { return options.tabBarButtonComponent; } - return null; + return undefined; }; _renderTabBar = () => { @@ -154,4 +176,6 @@ const styles = StyleSheet.create({ }, }); -export default createTabNavigator(TabNavigationView); +export default createTabNavigator( + TabNavigationView +); diff --git a/packages/tabs/src/navigators/createMaterialTopTabNavigator.js b/packages/tabs/src/navigators/createMaterialTopTabNavigator.tsx similarity index 65% rename from packages/tabs/src/navigators/createMaterialTopTabNavigator.js rename to packages/tabs/src/navigators/createMaterialTopTabNavigator.tsx index 076b98c7..9416c376 100644 --- a/packages/tabs/src/navigators/createMaterialTopTabNavigator.js +++ b/packages/tabs/src/navigators/createMaterialTopTabNavigator.tsx @@ -1,40 +1,44 @@ -/* @flow */ - import * as React from 'react'; -import { TabView } from 'react-native-tab-view'; -import type { ViewStyleProp } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import { StyleProp, ViewStyle } from 'react-native'; +import { TabView, SceneRendererProps } from 'react-native-tab-view'; import createTabNavigator, { - type InjectedProps, + NavigationViewProps, } from '../utils/createTabNavigator'; -import MaterialTopTabBar, { - type TabBarOptions, -} from '../views/MaterialTopTabBar'; +import MaterialTopTabBar from '../views/MaterialTopTabBar'; +import { + NavigationProp, + SceneDescriptor, + NavigationMaterialTabOptions, + MaterialTabBarOptions, +} from '../types'; type Route = { - key: string, - routeName: string, + key: string; + routeName: string; }; -type Props = {| - ...InjectedProps, - keyboardDismissMode?: 'none' | 'on-drag', - swipeEnabled?: boolean, - swipeDistanceThreshold?: number, - swipeVelocityThreshold?: number, - onSwipeStart?: () => mixed, - onSwipeEnd?: () => mixed, - initialLayout?: { width?: number, height?: number }, - lazy?: boolean, - lazyPlaceholderComponent?: React.ComponentType<{ route: Route }>, - tabBarComponent?: React.ComponentType<*>, - tabBarOptions?: TabBarOptions, - tabBarPosition?: 'top' | 'bottom', - sceneContainerStyle?: ViewStyleProp, - style?: ViewStyleProp, -|}; +type Props = NavigationViewProps & { + keyboardDismissMode?: 'none' | 'on-drag'; + swipeEnabled?: boolean; + swipeDistanceThreshold?: number; + swipeVelocityThreshold?: number; + onSwipeStart?: () => void; + onSwipeEnd?: () => void; + initialLayout?: { width?: number; height?: number }; + lazy?: boolean; + lazyPlaceholderComponent?: React.ComponentType<{ route: Route }>; + tabBarComponent?: React.ComponentType; + tabBarOptions?: MaterialTabBarOptions; + tabBarPosition?: 'top' | 'bottom'; + sceneContainerStyle?: StyleProp; + style?: StyleProp; + navigation: NavigationProp; + descriptors: { [key: string]: SceneDescriptor }; + screenProps?: unknown; +}; class MaterialTabView extends React.PureComponent { - _renderLazyPlaceholder = props => { + _renderLazyPlaceholder = (props: { route: Route }) => { const { lazyPlaceholderComponent: LazyPlaceholder } = this.props; if (LazyPlaceholder != null) { @@ -44,7 +48,7 @@ class MaterialTabView extends React.PureComponent { return null; }; - _renderTabBar = props => { + _renderTabBar = (props: SceneRendererProps) => { const { state } = this.props.navigation; const route = state.routes[state.index]; const { descriptors } = this.props; @@ -91,7 +95,7 @@ class MaterialTabView extends React.PureComponent { render() { const { - /* eslint-disable no-unused-vars */ + /* eslint-disable @typescript-eslint/no-unused-vars */ getLabelText, getAccessibilityLabel, getTestID, @@ -102,7 +106,7 @@ class MaterialTabView extends React.PureComponent { lazyPlaceholderComponent, tabBarComponent, tabBarOptions, - /* eslint-enable no-unused-vars */ + /* eslint-enable @typescript-eslint/no-unused-vars */ navigation, descriptors, ...rest @@ -135,4 +139,6 @@ class MaterialTabView extends React.PureComponent { } } -export default createTabNavigator(MaterialTabView); +export default createTabNavigator( + MaterialTabView +); diff --git a/packages/tabs/src/types.tsx b/packages/tabs/src/types.tsx new file mode 100644 index 00000000..918afe52 --- /dev/null +++ b/packages/tabs/src/types.tsx @@ -0,0 +1,210 @@ +import * as React from 'react'; +import { + AccessibilityRole, + AccessibilityState, + StyleProp, + TextStyle, + ViewStyle, +} from 'react-native'; +import SafeAreaView from 'react-native-safe-area-view'; +import Animated from 'react-native-reanimated'; + +export type Route = { + key: string; + routeName: string; +} & (NavigationState | undefined); + +export type NavigationEventName = + | 'willFocus' + | 'didFocus' + | 'willBlur' + | 'didBlur'; + +export type NavigationState = { + key: string; + index: number; + routes: Route[]; + isTransitioning?: boolean; + params?: { [key: string]: unknown }; +}; + +export type NavigationProp = { + emit(eventName: string): void; + navigate(routeName: RouteName): void; + goBack(): void; + goBack(key: string | null): void; + addListener: ( + event: NavigationEventName, + callback: () => void + ) => { remove: () => void }; + isFocused(): boolean; + state: NavigationState; + setParams(params: Params): void; + getParam(): Params; + dispatch(action: { type: string }): void; + dangerouslyGetParent(): NavigationProp | undefined; +}; + +export type ThemedColor = + | string + | { + light: string; + dark: string; + }; + +export type Orientation = 'horizontal' | 'vertical'; + +export type LabelPosition = 'beside-icon' | 'below-icon'; + +export type BottomTabBarOptions = { + keyboardHidesTabBar?: boolean; + activeTintColor?: ThemedColor; + inactiveTintColor?: ThemedColor; + activeBackgroundColor?: ThemedColor; + inactiveBackgroundColor?: ThemedColor; + allowFontScaling?: boolean; + showLabel?: boolean; + showIcon?: boolean; + labelStyle?: StyleProp; + tabStyle?: StyleProp; + labelPosition?: + | LabelPosition + | ((options: { deviceOrientation: Orientation }) => LabelPosition); + adaptive?: boolean; + style?: StyleProp; +}; + +export type BottomTabBarProps = BottomTabBarOptions & { + navigation: NavigationProp; + onTabPress: (props: { route: Route }) => void; + onTabLongPress: (props: { route: Route }) => void; + getAccessibilityLabel: (props: { route: Route }) => string | undefined; + getAccessibilityRole: (props: { + route: Route; + }) => AccessibilityRole | undefined; + getAccessibilityStates: (props: { + route: Route; + focused: boolean; + }) => AccessibilityState[]; + getButtonComponent: (props: { + route: Route; + }) => React.ComponentType | undefined; + getLabelText: (props: { + route: Route; + }) => + | ((scene: { + focused: boolean; + tintColor?: string; + orientation?: 'horizontal' | 'vertical'; + }) => string | undefined) + | string + | undefined; + getTestID: (props: { route: Route }) => string | undefined; + renderIcon: (props: { + route: Route; + focused: boolean; + tintColor?: string; + horizontal?: boolean; + }) => React.ReactNode; + dimensions: { width: number; height: number }; + isLandscape: boolean; + safeAreaInset?: React.ComponentProps['forceInset']; + jumpTo: (key: string) => void; + screenProps: unknown; +}; + +export type MaterialTabBarOptions = { + activeTintColor?: string; + allowFontScaling?: boolean; + bounces?: boolean; + inactiveTintColor?: string; + pressColor?: string; + pressOpacity?: number; + scrollEnabled?: boolean; + showIcon?: boolean; + showLabel?: boolean; + upperCaseLabel?: boolean; + tabStyle?: StyleProp; + indicatorStyle?: StyleProp; + iconStyle?: StyleProp; + labelStyle?: StyleProp; + contentContainerStyle?: StyleProp; + style?: StyleProp; +}; + +export type MaterialTabBarProps = MaterialTabBarOptions & { + layout: { + width: number; + height: number; + }; + position: Animated.Node; + jumpTo: (key: string) => void; + getLabelText: (scene: { + route: Route; + }) => + | ((scene: { focused: boolean; tintColor: string }) => string | undefined) + | string + | undefined; + getAccessible?: (scene: { route: Route }) => boolean | undefined; + getAccessibilityLabel: (scene: { route: Route }) => string | undefined; + getTestID: (scene: { route: Route }) => string | undefined; + renderIcon: (scene: { + route: Route; + focused: boolean; + tintColor: string; + horizontal?: boolean; + }) => React.ReactNode; + renderBadge?: (scene: { route: Route }) => React.ReactNode; + onTabPress?: (scene: { route: Route }) => void; + onTabLongPress?: (scene: { route: Route }) => void; + tabBarPosition?: 'top' | 'bottom'; + screenProps: unknown; + navigation: NavigationProp; +}; + +export type NavigationCommonTabOptions = { + title?: string; + tabBarLabel?: React.ReactNode; + tabBarVisible?: boolean; + tabBarAccessibilityLabel?: string; + tabBarTestID?: string; + tabBarIcon?: + | React.ReactNode + | ((props: { + focused: boolean; + tintColor?: string; + horizontal?: boolean; + }) => React.ReactNode); + tabBarOnPress?: (props: { + navigation: NavigationProp; + defaultHandler: () => void; + }) => void; + tabBarOnLongPress?: (props: { + navigation: NavigationProp; + defaultHandler: () => void; + }) => void; +}; + +export type NavigationBottomTabOptions = NavigationCommonTabOptions & { + tabBarButtonComponent?: React.ComponentType; +}; + +export type NavigationMaterialTabOptions = NavigationCommonTabOptions & { + tabBarButtonComponent?: React.ComponentType; + swipeEnabled?: boolean | ((state: NavigationState) => boolean); +}; + +export type SceneDescriptor = { + key: string; + options: Options; + navigation: NavigationProp; + getComponent(): React.ComponentType; +}; + +export type Screen< + Options extends NavigationCommonTabOptions +> = React.ComponentType & { + navigationOptions?: Options & { + [key: string]: any; + }; +}; diff --git a/packages/tabs/src/utils/createTabNavigator.js b/packages/tabs/src/utils/createTabNavigator.tsx similarity index 62% rename from packages/tabs/src/utils/createTabNavigator.js rename to packages/tabs/src/utils/createTabNavigator.tsx index 347a59a9..0c1b5911 100644 --- a/packages/tabs/src/utils/createTabNavigator.js +++ b/packages/tabs/src/utils/createTabNavigator.tsx @@ -1,5 +1,3 @@ -/* @flow */ - import * as React from 'react'; import { TabRouter, @@ -8,29 +6,68 @@ import { createNavigator, SwitchActions, } from '@react-navigation/core'; +import { + NavigationProp, + SceneDescriptor, + Route, + Screen, + NavigationCommonTabOptions, +} from '../types'; -export type InjectedProps = {| - getLabelText: (props: { route: any }) => any, - getAccessibilityLabel: (props: { route: any }) => string, - getTestID: (props: { route: any }) => string, - renderIcon: (props: { - route: any, - focused: boolean, - tintColor: string, - horizontal?: boolean, - }) => React.Node, - renderScene: (props: { route: any }) => ?React.Node, - onIndexChange: (index: number) => any, - onTabPress: (props: { route: any }) => mixed, - onTabLongPress: (props: { route: any }) => mixed, - navigation: any, - descriptors: any, - screenProps?: any, -|}; +type RouteConfig = { + [key: string]: + | Screen + | ({ screen: Screen } | { getScreen(): Screen }) & { + path?: string; + navigationOptions?: + | Options + | ((options: { navigation: NavigationProp }) => Options); + }; +}; -export default function createTabNavigator(TabView: React.ComponentType<*>) { - class NavigationView extends React.Component<*, *> { - _renderScene = ({ route }) => { +type CommonProps = { + navigation: NavigationProp; + descriptors: { [key: string]: SceneDescriptor }; + screenProps?: unknown; +}; + +type ExtraProps = { + navigationConfig: any; +}; + +export type RenderIconProps = { + route: Route; + focused: boolean; + tintColor?: string; + horizontal?: boolean; +}; + +export type NavigationViewProps = { + getLabelText: (props: { route: Route }) => string | undefined; + getAccessibilityLabel: (props: { route: Route }) => string | undefined; + getTestID: (props: { route: Route }) => string | undefined; + renderIcon: (props: RenderIconProps) => React.ReactNode; + renderScene: (props: { route: Route }) => React.ReactNode; + onIndexChange: (index: number) => void; + onTabPress: (props: { route: Route }) => void; + onTabLongPress: (props: { route: Route }) => void; +}; + +export default function createTabNavigator< + Options extends NavigationCommonTabOptions, + Props extends NavigationViewProps & CommonProps +>( + TabView: React.ComponentType +): ( + routes: RouteConfig, + config: Options +) => React.ComponentType< + Pick> & ExtraProps +> { + class NavigationView extends React.Component< + Pick> & ExtraProps + > { + _renderScene = ({ route }: { route: { key: string } }) => { const { screenProps, descriptors } = this.props; const descriptor = descriptors[route.key]; const TabComponent = descriptor.getComponent(); @@ -43,7 +80,12 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { ); }; - _renderIcon = ({ route, focused, tintColor, horizontal = false }) => { + _renderIcon = ({ + route, + focused, + tintColor, + horizontal = false, + }: RenderIconProps) => { const { descriptors } = this.props; const descriptor = descriptors[route.key]; const options = descriptor.options; @@ -57,7 +99,7 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { return null; }; - _getLabelText = ({ route }) => { + _getLabelText = ({ route }: { route: Route }) => { const { descriptors } = this.props; const descriptor = descriptors[route.key]; const options = descriptor.options; @@ -73,7 +115,7 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { return route.routeName; }; - _getAccessibilityLabel = ({ route }) => { + _getAccessibilityLabel = ({ route }: { route: Route }) => { const { descriptors } = this.props; const descriptor = descriptors[route.key]; const options = descriptor.options; @@ -90,9 +132,11 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { routes.length }`; } + + return undefined; }; - _getTestID = ({ route }) => { + _getTestID = ({ route }: { route: Route }) => { const { descriptors } = this.props; const descriptor = descriptors[route.key]; const options = descriptor.options; @@ -100,7 +144,13 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { return options.tabBarTestID; }; - _makeDefaultHandler = ({ route, navigation }) => () => { + _makeDefaultHandler = ({ + route, + navigation, + }: { + route: Route; + navigation: NavigationProp; + }) => () => { if (navigation.isFocused()) { if (route.hasOwnProperty('index') && route.index > 0) { // If current tab has a nested navigator, pop to top @@ -113,7 +163,7 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { } }; - _handleTabPress = ({ route }) => { + _handleTabPress = ({ route }: { route: Route }) => { this._isTabPress = true; // After tab press, handleIndexChange will be called synchronously @@ -133,7 +183,7 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { } }; - _handleTabLongPress = ({ route }) => { + _handleTabLongPress = ({ route }: { route: Route }) => { const { descriptors } = this.props; const descriptor = descriptors[route.key]; const { navigation, options } = descriptor; @@ -147,7 +197,7 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { } }; - _handleIndexChange = index => { + _handleIndexChange = (index: number) => { if (this._isTabPress) { this._isTabPress = false; return; @@ -156,14 +206,13 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { this._jumpTo(this.props.navigation.state.routes[index].routeName); }; - _jumpTo = routeName => { + _jumpTo = (routeName: string) => { const { navigation } = this.props; navigation.dispatch( SwitchActions.jumpTo({ routeName, key: navigation.state.key, - preserveFocus: true, }) ); }; @@ -171,12 +220,17 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { _isTabPress: boolean = false; render() { - const { descriptors, navigation, screenProps } = this.props; + const { + descriptors, + navigation, + screenProps, + navigationConfig, + } = this.props; const { state } = navigation; const route = state.routes[state.index]; const descriptor = descriptors[route.key]; const options = { - ...this.props.navigationConfig, + ...navigationConfig, ...descriptor.options, }; @@ -199,8 +253,8 @@ export default function createTabNavigator(TabView: React.ComponentType<*>) { } } - return (routes: *, config: * = {}) => { - const router = TabRouter(routes, config); - return createNavigator(NavigationView, router, config); + return (routes: RouteConfig, config: Partial = {}) => { + const router = TabRouter(routes, config as any); + return createNavigator(NavigationView, router, config as any); }; } diff --git a/packages/tabs/src/utils/withDimensions.js b/packages/tabs/src/utils/withDimensions.tsx similarity index 59% rename from packages/tabs/src/utils/withDimensions.js rename to packages/tabs/src/utils/withDimensions.tsx index f0e2d77b..2e3b3336 100644 --- a/packages/tabs/src/utils/withDimensions.js +++ b/packages/tabs/src/utils/withDimensions.tsx @@ -1,10 +1,23 @@ import * as React from 'react'; -import { Dimensions } from 'react-native'; +import { Dimensions, ScaledSize } from 'react-native'; import hoistNonReactStatic from 'hoist-non-react-statics'; -export const isOrientationLandscape = ({ width, height }) => width > height; +type DimensionsType = { + width: number; + height: number; +}; -export default function withDimensions(WrappedComponent) { +type InjectedProps = { + dimensions: DimensionsType; + isLandscape: boolean; +}; + +export const isOrientationLandscape = ({ width, height }: DimensionsType) => + width > height; + +export default function withDimensions( + WrappedComponent: React.ComponentType +): React.ComponentType>> { const { width, height } = Dimensions.get('window'); class EnhancedComponent extends React.Component { @@ -23,15 +36,17 @@ export default function withDimensions(WrappedComponent) { Dimensions.removeEventListener('change', this.handleOrientationChange); } - handleOrientationChange = ({ window }) => { + handleOrientationChange = ({ window }: { window: ScaledSize }) => { const isLandscape = isOrientationLandscape(window); this.setState({ isLandscape }); }; render() { + // @ts-ignore return ; } } + // @ts-ignore return hoistNonReactStatic(EnhancedComponent, WrappedComponent); } diff --git a/packages/tabs/src/views/BottomTabBar.js b/packages/tabs/src/views/BottomTabBar.tsx similarity index 86% rename from packages/tabs/src/views/BottomTabBar.js rename to packages/tabs/src/views/BottomTabBar.tsx index a31f0a68..326a7120 100644 --- a/packages/tabs/src/views/BottomTabBar.js +++ b/packages/tabs/src/views/BottomTabBar.tsx @@ -1,5 +1,3 @@ -/* @flow */ - import React from 'react'; import { Animated, @@ -8,69 +6,32 @@ import { View, Keyboard, Platform, + LayoutChangeEvent, } from 'react-native'; +import SafeAreaView from 'react-native-safe-area-view'; import { ThemeColors, ThemeContext } from '@react-navigation/core'; -import { SafeAreaView } from '@react-navigation/native'; import CrossFadeIcon from './CrossFadeIcon'; import withDimensions from '../utils/withDimensions'; - -type Orientation = 'horizontal' | 'vertical'; -type Position = 'beside-icon' | 'below-icon'; -type LabelPosition = - | Position - | ((options: { deviceOrientation: Orientation }) => Position); - -export type ThemedColor = { - light: string, - dark: string, -}; - -export type TabBarOptions = { - keyboardHidesTabBar: boolean, - activeTintColor?: string | ThemedColor, - inactiveTintColor?: string | ThemedColor, - activeBackgroundColor?: string | ThemedColor, - inactiveBackgroundColor?: string | ThemedColor, - allowFontScaling: boolean, - showLabel: boolean, - showIcon: boolean, - labelStyle: any, - tabStyle: any, - labelPosition?: LabelPosition, - adaptive?: boolean, - style: any, -}; - -type Props = TabBarOptions & { - navigation: any, - onTabPress: any, - onTabLongPress: any, - getAccessibilityLabel: (props: { route: any }) => string, - getAccessibilityRole: (props: { route: any }) => string, - getAccessibilityStates: (props: { route: any }) => string[], - getButtonComponent: ({ route: any }) => any, - getLabelText: ({ route: any }) => any, - getTestID: (props: { route: any }) => string, - renderIcon: any, - dimensions: { width: number, height: number }, - isLandscape: boolean, - safeAreaInset: { top: string, right: string, bottom: string, left: string }, -}; +import { Route, BottomTabBarProps } from '../types'; type State = { - layout: { height: number, width: number }, - keyboard: boolean, - visible: Animated.Value, + layout: { height: number; width: number }; + keyboard: boolean; + visible: Animated.Value; }; -const majorVersion = parseInt(Platform.Version, 10); +const majorVersion = parseInt(Platform.Version as string, 10); const isIos = Platform.OS === 'ios'; const isIOS11 = majorVersion >= 11 && isIos; const DEFAULT_MAX_TAB_ITEM_WIDTH = 125; -class TouchableWithoutFeedbackWrapper extends React.Component<*> { +class TouchableWithoutFeedbackWrapper extends React.Component< + React.ComponentProps & { + children: React.ReactNode; + } +> { render() { const { onPress, @@ -98,9 +59,7 @@ class TouchableWithoutFeedbackWrapper extends React.Component<*> { } } -class TabBarBottom extends React.Component { - static contextType = ThemeContext; - +class TabBarBottom extends React.Component { static defaultProps = { keyboardHidesTabBar: true, activeTintColor: { @@ -117,9 +76,13 @@ class TabBarBottom extends React.Component { showIcon: true, allowFontScaling: true, adaptive: isIOS11, - safeAreaInset: { bottom: 'always', top: 'never' }, + safeAreaInset: { bottom: 'always', top: 'never' } as React.ComponentProps< + typeof SafeAreaView + >['forceInset'], }; + static contextType = ThemeContext; + state = { layout: { height: 0, width: 0 }, keyboard: false, @@ -146,6 +109,9 @@ class TabBarBottom extends React.Component { } } + // @ts-ignore + context: 'light' | 'dark'; + _handleKeyboardShow = () => this.setState({ keyboard: true }, () => Animated.timing(this.state.visible, { @@ -164,7 +130,7 @@ class TabBarBottom extends React.Component { this.setState({ keyboard: false }); }); - _handleLayout = e => { + _handleLayout = (e: LayoutChangeEvent) => { const { layout } = this.state; const { height, width } = e.nativeEvent.layout; @@ -224,7 +190,7 @@ class TabBarBottom extends React.Component { return inactiveBackgroundColor[this.context]; }; - _renderLabel = ({ route, focused }) => { + _renderLabel = ({ route, focused }: { route: Route; focused: boolean }) => { const { labelStyle, showLabel, showIcon, allowFontScaling } = this.props; if (showLabel === false) { @@ -256,7 +222,6 @@ class TabBarBottom extends React.Component { if (typeof label === 'function') { return label({ - route, focused, tintColor, orientation: horizontal ? 'horizontal' : 'vertical', @@ -266,8 +231,9 @@ class TabBarBottom extends React.Component { return label; }; - _renderIcon = ({ route, focused }) => { - const { navigation, renderIcon, showIcon, showLabel } = this.props; + _renderIcon = ({ route, focused }: { route: Route; focused: boolean }) => { + const { renderIcon, showIcon, showLabel } = this.props; + if (showIcon === false) { return null; } @@ -283,7 +249,6 @@ class TabBarBottom extends React.Component { { return false; } + // @ts-ignore if (Platform.isPad) { let maxTabItemWidth = DEFAULT_MAX_TAB_ITEM_WIDTH; @@ -366,6 +332,7 @@ class TabBarBottom extends React.Component { const tabBarStyle = [ styles.tabBar, isDark ? styles.tabBarDark : styles.tabBarLight, + // @ts-ignore this._shouldUseHorizontalLabels() && !Platform.isPad ? styles.tabBarCompact : styles.tabBarRegular, @@ -501,6 +468,7 @@ const styles = StyleSheet.create({ flex: 1, }, iconWithExplicitHeight: { + // @ts-ignore height: Platform.isPad ? DEFAULT_HEIGHT : COMPACT_HEIGHT, }, label: { diff --git a/packages/tabs/src/views/CrossFadeIcon.js b/packages/tabs/src/views/CrossFadeIcon.tsx similarity index 78% rename from packages/tabs/src/views/CrossFadeIcon.js rename to packages/tabs/src/views/CrossFadeIcon.tsx index a881581f..da8ff9a4 100644 --- a/packages/tabs/src/views/CrossFadeIcon.js +++ b/packages/tabs/src/views/CrossFadeIcon.tsx @@ -1,18 +1,22 @@ -/* @flow */ - import React from 'react'; -import { View, StyleSheet } from 'react-native'; +import { View, StyleSheet, StyleProp, ViewStyle } from 'react-native'; import Animated from 'react-native-reanimated'; +import { Route } from '../types'; type Props = { - route: any, - horizontal?: boolean, - activeOpacity: any, - inactiveOpacity: any, - activeTintColor: any, - inactiveTintColor: any, - renderIcon: any, - style: any, + route: Route; + horizontal?: boolean; + activeOpacity: number; + inactiveOpacity: number; + activeTintColor?: string; + inactiveTintColor?: string; + renderIcon: (props: { + route: Route; + focused: boolean; + tintColor?: string; + horizontal?: boolean; + }) => React.ReactNode; + style: StyleProp; }; export default class TabBarIcon extends React.Component { diff --git a/packages/tabs/src/views/MaterialTopTabBar.js b/packages/tabs/src/views/MaterialTopTabBar.tsx similarity index 55% rename from packages/tabs/src/views/MaterialTopTabBar.js rename to packages/tabs/src/views/MaterialTopTabBar.tsx index 87b98e94..f10c26a6 100644 --- a/packages/tabs/src/views/MaterialTopTabBar.js +++ b/packages/tabs/src/views/MaterialTopTabBar.tsx @@ -1,68 +1,14 @@ -/* @flow */ - import * as React from 'react'; import { View, StyleSheet } from 'react-native'; import { TabBar } from 'react-native-tab-view'; import Animated from 'react-native-reanimated'; -import type { - ViewStyleProp, - TextStyleProp, -} from 'react-native/Libraries/StyleSheet/StyleSheet'; +import { MaterialTabBarProps, Route } from '../types'; -type Route = { - key: string, - routeName: string, -}; +type Scene = { route: Route; focused: boolean; color: string }; -type Layout = {| - width: number, - height: number, -|}; - -export type TabBarOptions = {| - activeTintColor?: string, - allowFontScaling?: boolean, - bounces?: boolean, - inactiveTintColor?: string, - pressColor?: string, - pressOpacity?: number, - scrollEnabled?: boolean, - showIcon?: boolean, - showLabel?: boolean, - upperCaseLabel?: boolean, - tabStyle?: ViewStyleProp, - indicatorStyle?: ViewStyleProp, - iconStyle?: any, - labelStyle?: TextStyleProp, - contentContainerStyle?: ViewStyleProp, - style?: ViewStyleProp, -|}; - -type Props = {| - ...TabBarOptions, - layout: Layout, - position: Animated.Node, - jumpTo: (key: string) => void, - getLabelText: (scene: { route: Route }) => ?string, - getAccessible?: (scene: { route: Route }) => ?boolean, - getAccessibilityLabel: (scene: { route: Route }) => ?string, - getTestID: (scene: { route: Route }) => ?string, - renderIcon: (scene: { - route: Route, - focused: boolean, - tintColor: string, - horizontal?: boolean, - }) => React.Node, - renderBadge?: (scene: { route: Route }) => React.Node, - onTabPress?: (scene: { route: Route }) => mixed, - onTabLongPress?: (scene: { route: Route }) => mixed, - tabBarPosition: 'top' | 'bottom', - navigationState: any, - screenProps: any, - navigation: any, -|}; - -export default class TabBarTop extends React.PureComponent { +export default class TabBarTop extends React.PureComponent< + MaterialTabBarProps +> { static defaultProps = { activeTintColor: 'rgba(255, 255, 255, 1)', inactiveTintColor: 'rgba(255, 255, 255, 0.7)', @@ -72,7 +18,7 @@ export default class TabBarTop extends React.PureComponent { allowFontScaling: true, }; - _renderLabel = ({ route, focused, color }) => { + _renderLabel = ({ route, focused, color }: Scene) => { const { showLabel, upperCaseLabel, @@ -104,7 +50,7 @@ export default class TabBarTop extends React.PureComponent { return label; }; - _renderIcon = ({ route, focused, color }) => { + _renderIcon = ({ route, focused, color }: Scene) => { const { renderIcon, showIcon, iconStyle } = this.props; if (showIcon === false) { @@ -127,7 +73,7 @@ export default class TabBarTop extends React.PureComponent { navigation, activeTintColor, inactiveTintColor, - /* eslint-disable no-unused-vars */ + /* eslint-disable @typescript-eslint/no-unused-vars */ renderIcon, getLabelText, allowFontScaling, @@ -135,10 +81,9 @@ export default class TabBarTop extends React.PureComponent { showIcon, upperCaseLabel, tabBarPosition, - navigationState, screenProps, iconStyle, - /* eslint-enable no-unused-vars */ + /* eslint-enable @typescript-eslint/no-unused-vars */ ...rest } = this.props; diff --git a/packages/tabs/src/views/ResourceSavingScene.js b/packages/tabs/src/views/ResourceSavingScene.tsx similarity index 94% rename from packages/tabs/src/views/ResourceSavingScene.js rename to packages/tabs/src/views/ResourceSavingScene.tsx index 719d2e9b..7bcc400a 100644 --- a/packages/tabs/src/views/ResourceSavingScene.js +++ b/packages/tabs/src/views/ResourceSavingScene.tsx @@ -1,5 +1,3 @@ -/* @flow */ - import * as React from 'react'; import { Platform, StyleSheet, View } from 'react-native'; @@ -7,9 +5,9 @@ import { Platform, StyleSheet, View } from 'react-native'; import { Screen, screensEnabled } from 'react-native-screens'; type Props = { - isVisible: boolean, - children: React.Node, - style?: any, + isVisible: boolean; + children: React.ReactNode; + style?: any; }; const FAR_FAR_AWAY = 3000; // this should be big enough to move the whole view out of its container @@ -18,6 +16,7 @@ export default class ResourceSavingScene extends React.Component { render() { if (screensEnabled && screensEnabled()) { const { isVisible, ...rest } = this.props; + // @ts-ignore return ; } diff --git a/packages/tabs/tsconfig.json b/packages/tabs/tsconfig.json new file mode 100644 index 00000000..c09b2877 --- /dev/null +++ b/packages/tabs/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react", + "lib": ["esnext"], + "module": "esnext", + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noStrictGenericChecks": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "esnext" + } +} diff --git a/packages/tabs/types/@react-navigation/core.d.ts b/packages/tabs/types/@react-navigation/core.d.ts new file mode 100644 index 00000000..dd44d0c5 --- /dev/null +++ b/packages/tabs/types/@react-navigation/core.d.ts @@ -0,0 +1,58 @@ +declare module '@react-navigation/core' { + import * as React from 'react'; + + export type ThemeType = { + header: string; + headerBorder: string; + }; + + export const ThemeContext: React.Context<'light' | 'dark'>; + + export const ThemeColors: { + light: ThemeType; + dark: ThemeType; + }; + + export const StackActions: { + completeTransition( + options?: T + ): { type: string } & T; + popToTop(options: { key: string }): { type: string }; + }; + + export const SwitchActions: { + jumpTo(payload: { + routeName: string; + key: string; + params?: object; + }): { type: string } & payload; + }; + + export const NavigationActions: { + back(payload: { key: string; immediate?: boolean }): { type: string }; + }; + + export const NavigationProvider: React.ComponentType<{ + value: object; + }>; + + export const SceneView: React.ComponentType<{ + screenProps: unknown; + navigation: object; + component: React.ComponentType; + }>; + + export function createNavigator( + view: React.ComponentType, + router: any, + config: object + ): React.ComponentType; + + export function withNavigation( + Comp: React.ComponentType + ): React.ComponentType>>; + + export function StackRouter(routes: object, config: object): unknown; + + export function TabRouter(routes: object, config: object): unknown; +} diff --git a/packages/tabs/types/@react-navigation/native.d.ts b/packages/tabs/types/@react-navigation/native.d.ts new file mode 100644 index 00000000..27791045 --- /dev/null +++ b/packages/tabs/types/@react-navigation/native.d.ts @@ -0,0 +1,32 @@ +declare module '@react-navigation/native' { + import { ComponentType } from 'react'; + import { StyleProp, ViewStyle, ViewProps } from 'react-native'; + + export function createAppContainer( + Comp: React.ComponentType + ): React.ComponentType; + + export function withOrientation( + Comp: React.ComponentType + ): React.ComponentType>>; + + export function createKeyboardAwareNavigator( + Comp: React.ComponentType, + stackConfig: object + ): React.ComponentType; + + export type SafeAreaViewForceInsetValue = 'always' | 'never'; + + export const SafeAreaView: ComponentType< + ViewProps & { + forceInset?: { + top?: SafeAreaViewForceInsetValue; + bottom?: SafeAreaViewForceInsetValue; + left?: SafeAreaViewForceInsetValue; + right?: SafeAreaViewForceInsetValue; + horizontal?: SafeAreaViewForceInsetValue; + vertical?: SafeAreaViewForceInsetValue; + }; + } + >; +} diff --git a/packages/tabs/yarn.lock b/packages/tabs/yarn.lock index bc90182e..ee6c85f4 100644 --- a/packages/tabs/yarn.lock +++ b/packages/tabs/yarn.lock @@ -49,6 +49,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.4.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" + integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.0.0", "@babel/generator@^7.1.3", "@babel/generator@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" @@ -71,6 +91,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -243,6 +274,13 @@ dependencies: "@babel/types" "^7.4.0" +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -271,6 +309,15 @@ "@babel/traverse" "^7.4.0" "@babel/types" "^7.4.0" +"@babel/helpers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" + integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -290,6 +337,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== +"@babel/parser@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" + integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== + "@babel/plugin-external-helpers@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz#7f4cb7dee651cd380d2034847d914288467a6be4" @@ -708,6 +760,15 @@ "@babel/parser" "^7.4.0" "@babel/types" "^7.4.0" +"@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" @@ -753,6 +814,21 @@ globals "^11.1.0" lodash "^4.17.11" +"@babel/traverse@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" + integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" @@ -780,6 +856,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -1122,6 +1207,24 @@ universal-user-agent "^2.0.0" url-template "^2.0.8" +"@react-native-community/bob@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@react-native-community/bob/-/bob-0.6.1.tgz#dddee0f5d622e2479b2e13a3dd15241c8eaee5c9" + integrity sha512-DD7zWZVLifUQhbA3H2OAhPqyW3aqZJ15FUqb7ztZfwWyUwbLfz+K4wyUzfLPRG718vyau56lBWa0jsXgpCqF5g== + dependencies: + "@babel/core" "^7.4.0" + chalk "^2.4.2" + cosmiconfig "^5.2.0" + del "^4.1.0" + fs-extra "^7.0.1" + glob "^7.1.3" + inquirer "^6.2.2" + is-git-dirty "^1.0.0" + metro-react-native-babel-preset "^0.53.1" + yargs "^13.2.2" + optionalDependencies: + jetifier "^1.0.0-beta04.2" + "@react-navigation/core@3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.1.1.tgz#badf449ac7d2ae65b0f5aa1bf63a87e7888458d3" @@ -1203,6 +1306,14 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/istanbul-lib-coverage@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a" @@ -1218,6 +1329,27 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.10.0.tgz#08eeb736ae678ccf9ca0922063f3a08795894ede" integrity sha512-6Mb9+PPq9UzRpQrlPzZAbhEvodWDTnsIakddUAtSDpKYF6eu5zAdW31n8x7UZStvqGnDC7dCJnvU188ylv/Ytw== +"@types/prop-types@*": + version "15.7.1" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6" + integrity sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg== + +"@types/react-native@^0.57.57": + version "0.57.57" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.57.57.tgz#4b59068acf6e542ac8e1e02e8a639b47e3e02c02" + integrity sha512-OZyBlMyMeU3gXAmc1nnJhlWGihWUOiVR5Tj0y4TAA0rkKKHJwuNPPba6aaFmEaNcoZ9ejc3G30H+dneDOqICdg== + dependencies: + "@types/prop-types" "*" + "@types/react" "*" + +"@types/react@*", "@types/react@^16.8.17": + version "16.8.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.17.tgz#f287b76a5badb93bc9aa3f54521a3eb53d6c2374" + integrity sha512-pln3mgc6VfkNg92WXODul/ONo140huK9OMsx62GlBlZ2lvjNK86PQJhYMPLO1i66aF5O9OPyZefogvNltBIszA== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1228,29 +1360,40 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.10.tgz#17a8ec65cd8e88f51b418ceb271af18d3137df67" integrity sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ== -"@typescript-eslint/eslint-plugin@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.5.0.tgz#85c509bcfc2eb35f37958fa677379c80b7a8f66f" - integrity sha512-TZ5HRDFz6CswqBUviPX8EfS+iOoGbclYroZKT3GWGYiGScX0qo6QjHc5uuM7JN920voP2zgCkHgF5SDEVlCtjQ== +"@typescript-eslint/eslint-plugin@^1.6.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.9.0.tgz#29d73006811bf2563b88891ceeff1c5ea9c8d9c6" + integrity sha512-FOgfBorxjlBGpDIw+0LaZIXRX6GEEUfzj8LXwaQIUCp+gDOvkI+1WgugJ7SmWiISqK9Vj5r8S7NDKO/LB+6X9A== dependencies: - "@typescript-eslint/parser" "1.5.0" - "@typescript-eslint/typescript-estree" "1.5.0" + "@typescript-eslint/experimental-utils" "1.9.0" + "@typescript-eslint/parser" "1.9.0" + eslint-utils "^1.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^2.0.1" requireindex "^1.2.0" tsutils "^3.7.0" -"@typescript-eslint/parser@1.5.0", "@typescript-eslint/parser@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.5.0.tgz#a96114d195dff2a49534e4c4850fb676f905a072" - integrity sha512-pRWTnJrnxuT0ragdY26hZL+bxqDd4liMlftpH2CBlMPryOIOb1J+MdZuw6R4tIu6bWVdwbHKPTs+Q34LuGvfGw== +"@typescript-eslint/experimental-utils@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.9.0.tgz#a92777d0c92d7bc8627abd7cdb06cdbcaf2b39e8" + integrity sha512-1s2dY9XxBwtS9IlSnRIlzqILPyeMly5tz1bfAmQ84Ul687xBBve5YsH5A5EKeIcGurYYqY2w6RkHETXIwnwV0A== dependencies: - "@typescript-eslint/typescript-estree" "1.5.0" + "@typescript-eslint/typescript-estree" "1.9.0" + +"@typescript-eslint/parser@1.9.0", "@typescript-eslint/parser@^1.6.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.9.0.tgz#5796cbfcb9a3a5757aeb671c1ac88d7a94a95962" + integrity sha512-CWgC1XrQ34H/+LwAU7vY5xteZDkNqeAkeidEpJnJgkKu0yqQ3ZhQ7S+dI6MX4vmmM1TKRbOrKuXc6W0fIHhdbA== + dependencies: + "@typescript-eslint/experimental-utils" "1.9.0" + "@typescript-eslint/typescript-estree" "1.9.0" eslint-scope "^4.0.0" eslint-visitor-keys "^1.0.0" -"@typescript-eslint/typescript-estree@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.5.0.tgz#986b356ecdf5a0c3bc9889d221802149cf5dbd4e" - integrity sha512-XqR14d4BcYgxcrpxIwcee7UEjncl9emKc/MgkeUfIk2u85KlsGYyaxC7Zxjmb17JtWERk/NaO+KnBsqgpIXzwA== +"@typescript-eslint/typescript-estree@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.9.0.tgz#5d6d49be936e96fb0f859673480f89b070a5dd9b" + integrity sha512-7Eg0TEQpCkTsEwsl1lIzd6i7L3pJLQFWesV08dS87bNz0NeSjbL78gNAP1xCKaCejkds4PhpLnZkaAjx9SU8OA== dependencies: lodash.unescape "4.0.1" semver "5.5.0" @@ -1539,7 +1682,7 @@ array-slice@^0.2.3: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= -array-union@^1.0.2: +array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -2158,6 +2301,15 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -2560,6 +2712,16 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.0.7: lodash.get "^4.4.2" parse-json "^4.0.0" +cosmiconfig@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + cp-file@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.1.0.tgz#b48d2d80577d4c5025c68eb597a38093c1dc9ccf" @@ -2657,6 +2819,11 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.4.tgz#d585a6062096e324e7187f80e04f92bd0f00e37f" + integrity sha512-lAJUJP3M6HxFXbqtGRc0iZrdyeN+WzOWeY0q/VnFzI+kqVrYIzC7bWlKqCW7oCIdzoPkvfp82EVvrTlQ8zsWQg== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -2801,6 +2968,19 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -3130,25 +3310,25 @@ eslint-config-prettier@^4.1.0: dependencies: get-stdin "^6.0.0" -eslint-config-satya164@^2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/eslint-config-satya164/-/eslint-config-satya164-2.3.5.tgz#b5397699edef5c37c74ff27afd2e9cbe3f80cb6e" - integrity sha512-2ESncdSG2PMqa3+/eAqwTZArHtwvh7kpZNQ/mP03QDUNMYW8lx03vjcFzXTN9KvJpbVfrfaoXzyPMwwbkeDysw== +eslint-config-satya164@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/eslint-config-satya164/-/eslint-config-satya164-2.4.1.tgz#139909a590d4503197d501051deef9aa67768990" + integrity sha512-i9fqMDq4XywgRrcYdaPwmv/i+FtGI1FTXz9yKb4JktlWnU555cxmryFDknNJJj9cL06RR5a/O5hnJSoLksGWbQ== dependencies: - "@typescript-eslint/eslint-plugin" "^1.5.0" - "@typescript-eslint/parser" "^1.5.0" + "@typescript-eslint/eslint-plugin" "^1.6.0" + "@typescript-eslint/parser" "^1.6.0" babel-eslint "^10.0.1" eslint-config-prettier "^4.1.0" eslint-plugin-babel "^5.3.0" eslint-plugin-eslint-comments "^3.1.1" - eslint-plugin-flowtype "^3.4.2" + eslint-plugin-flowtype "^3.6.1" eslint-plugin-import "^2.16.0" eslint-plugin-jest "^22.4.1" eslint-plugin-json "^1.4.0" eslint-plugin-markdown "^1.0.0" eslint-plugin-prettier "^3.0.1" eslint-plugin-react "^7.12.4" - eslint-plugin-react-hooks "^1.5.1" + eslint-plugin-react-hooks "^1.6.0" eslint-plugin-react-native "^3.6.0" eslint-import-resolver-node@^0.3.2: @@ -3182,10 +3362,10 @@ eslint-plugin-eslint-comments@^3.1.1: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-flowtype@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.4.2.tgz#55475e10b05fd714d60bceebbbed596cb8706b16" - integrity sha512-sv6O6fiN3dIwhU4qRxfcyIpbKGVvsxwIQ6vgBLudpQKjH1rEyEFEOjGzGEUBTQP9J8LdTZm37OjiqZ0ZeFOa6g== +eslint-plugin-flowtype@^3.6.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.9.0.tgz#031949e2685e9e8658a1166e1cac3163313c3e0d" + integrity sha512-g5CMBJx0dagvOOYLo0ws5Y4+Ma8BBDtgQU+AkjL3W0z8LJUsGL2avY2/bsTZS69qzEA+G7qWKleI1aZp6QNBBw== dependencies: lodash "^4.17.11" @@ -3233,7 +3413,7 @@ eslint-plugin-prettier@^3.0.1: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^1.5.1: +eslint-plugin-react-hooks@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz#348efcda8fb426399ac7b8609607c7b4025a6f5f" integrity sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag== @@ -3419,6 +3599,19 @@ execa@^0.10.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" + integrity sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3827,6 +4020,15 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3896,6 +4098,11 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" @@ -4080,6 +4287,17 @@ globby@9.1.0: pify "^4.0.1" slash "^2.0.0" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^9.1.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -4640,6 +4858,22 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g== +is-git-dirty@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-git-dirty/-/is-git-dirty-1.0.0.tgz#cd58f329ea826bd4d5388f1ef90459fe947e3b96" + integrity sha512-Qg7kqQ99B++ucplBiYvSahvPxQD63979CMv3TSJ66ZjjjulkPh4InXPAf//ZO1cq7W4d+pjGdObwS2LvXnldTQ== + dependencies: + execa "^0.10.0" + is-git-repository "^1.1.1" + +is-git-repository@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-git-repository/-/is-git-repository-1.1.1.tgz#c68e4b7a806422349aaec488973a90558d7e9be0" + integrity sha1-xo5LeoBkIjSarsSIlzqQVY1+m+A= + dependencies: + execa "^0.6.1" + path-is-absolute "^1.0.1" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4708,6 +4942,18 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-path-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" + integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -4715,6 +4961,13 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -5319,6 +5572,11 @@ jest@^24.5.0: import-local "^2.0.0" jest-cli "^24.5.0" +jetifier@^1.0.0-beta04.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.1.tgz#4aa50dd35c5f6893c35c2278c53972852fd0e877" + integrity sha512-EF55MQWvFRaTA8LwHW15N4qnYm2a1Crg95YcVI7cTTzS9iNkBFgJ/f+o0OeJ62U1Laidrq/WG7HkYKoGwwPRRQ== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -5332,6 +5590,14 @@ js-yaml@^3.12.0, js-yaml@^3.13.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.9.0: version "3.12.2" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" @@ -5443,6 +5709,13 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -5894,6 +6167,13 @@ metro-babel7-plugin-react-transform@0.48.5: dependencies: "@babel/helper-module-imports" "^7.0.0" +metro-babel7-plugin-react-transform@0.53.1: + version "0.53.1" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.53.1.tgz#9ad31e5c84f5003333a6a3cf79f2d093cd3b2ddc" + integrity sha512-98lEpTu7mox/7QurxVuLnbjrGDdayjpS2Z1T4vkLcP+mBxzloKJuTRnmtyWC8cNlx9qjimHGDlqtNY78rQ8rsA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + metro-cache@0.48.5: version "0.48.5" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.48.5.tgz#5ab3ad13c9df527f4196f0de096a3d496db97a6b" @@ -5978,6 +6258,48 @@ metro-react-native-babel-preset@0.48.5: metro-babel7-plugin-react-transform "0.48.5" react-transform-hmr "^1.0.4" +metro-react-native-babel-preset@^0.53.1: + version "0.53.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.53.1.tgz#6cd9e41a1b9a6e210e71ef2adf114219b4eaf2ec" + integrity sha512-Uf8EGL8kIPhDkoSdAAysNPxPQclUS2R1QC4cwnc8bkk2f6yqGn+1CorfiY9AaqlLEth5mKQqdtRYFDTFfB9QyA== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.53.1" + react-transform-hmr "^1.0.4" + metro-resolver@0.48.5: version "0.48.5" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.48.5.tgz#d2ff84afab13ec3962685953ebd03d878e1f4c36" @@ -6633,7 +6955,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.0.0: +os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -6718,6 +7040,11 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -6854,7 +7181,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -7030,10 +7357,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.8.2: - version "1.16.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" - integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== +prettier@^1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.1.tgz#ed64b4e93e370cb8a25b9ef7fef3e4fd1c0995db" + integrity sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg== pretty-format@^23.4.1: version "23.6.0" @@ -7274,6 +7601,13 @@ react-native-safe-area-view@^0.13.0: dependencies: hoist-non-react-statics "^2.3.1" +react-native-safe-area-view@^0.14.6: + version "0.14.6" + resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.6.tgz#9a9d37d9f8f3887d60c4076eae7b5d2319539446" + integrity sha512-dbzuvaeHFV1VBpyMaC0gtJ2BqFt6ls/405A0t78YN1sXiTrVr3ki86Ysct8mzifWqLdvWzcWagE5wfMtdxnqoA== + dependencies: + hoist-non-react-statics "^2.3.1" + "react-native-screens@^1.0.0 || ^1.0.0-alpha": version "1.0.0-alpha.22" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-1.0.0-alpha.22.tgz#7a120377b52aa9bbb94d0b8541a014026be9289b" @@ -7784,6 +8118,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requireindex@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" @@ -7867,7 +8206,7 @@ retry@0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -8388,7 +8727,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -8441,7 +8780,7 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" -strip-ansi@^5.1.0: +strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -8741,6 +9080,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.2.tgz#a09e1dc69bc9551cadf17dba10ee42cf55e5d56c" + integrity sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA== + ua-parser-js@^0.7.18: version "0.7.19" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" @@ -8870,6 +9214,11 @@ universal-user-agent@^2.0.0, universal-user-agent@^2.0.1: dependencies: os-name "^3.0.0" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -9170,6 +9519,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -9293,7 +9651,7 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= -"y18n@^3.2.1 || ^4.0.0": +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -9331,6 +9689,14 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" + integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -9356,6 +9722,23 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@^13.2.2: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c"