From f4fada9041296648265d9d945dea692b215fa93a Mon Sep 17 00:00:00 2001 From: Satyajit Sahoo Date: Wed, 1 May 2019 23:58:06 +0200 Subject: [PATCH] refactor: rewrite drawer layout with reanimated (#60) --- packages/drawer/.circleci/config.yml | 9 + packages/drawer/commitlint.config.js | 5 + packages/drawer/example/.babelrc | 7 + packages/drawer/example/.eslintrc | 15 +- packages/drawer/example/package.json | 4 +- packages/drawer/example/src/ParallaxDrawer.js | 7 +- packages/drawer/example/src/SimpleDrawer.js | 2 +- packages/drawer/example/src/StyledDrawer.js | 2 +- packages/drawer/example/yarn.lock | 30 +- packages/drawer/jest-setup.js | 72 +- packages/drawer/package.json | 26 +- packages/drawer/src/index.tsx | 10 +- .../__tests__/createDrawerNavigator.test.tsx | 227 ++++-- .../src/navigators/createDrawerNavigator.tsx | 6 +- packages/drawer/src/routers/DrawerActions.tsx | 22 +- packages/drawer/src/routers/DrawerRouter.tsx | 78 +- .../routers/__tests__/DrawerRouter.test.tsx | 275 ++++--- packages/drawer/src/types.tsx | 4 - packages/drawer/src/views/Drawer.tsx | 586 ++++++++++++++ packages/drawer/src/views/DrawerView.tsx | 231 +++--- .../types/react-native-gesture-handler.d.ts | 1 - packages/drawer/yarn.lock | 716 ++++++++++++++++-- 22 files changed, 1777 insertions(+), 558 deletions(-) create mode 100644 packages/drawer/commitlint.config.js create mode 100644 packages/drawer/src/views/Drawer.tsx delete mode 100644 packages/drawer/types/react-native-gesture-handler.d.ts diff --git a/packages/drawer/.circleci/config.yml b/packages/drawer/.circleci/config.yml index 6bd370d7..4d20345b 100644 --- a/packages/drawer/.circleci/config.yml +++ b/packages/drawer/.circleci/config.yml @@ -55,6 +55,12 @@ jobs: - store_artifacts: path: coverage destination: coverage + build: + <<: *defaults + steps: + - attach_workspace: + at: ~/project + - run: yarn prepare workflows: version: 2 @@ -70,3 +76,6 @@ workflows: - unit-tests: requires: - install-dependencies + - build: + requires: + - install-dependencies diff --git a/packages/drawer/commitlint.config.js b/packages/drawer/commitlint.config.js new file mode 100644 index 00000000..cc8383f7 --- /dev/null +++ b/packages/drawer/commitlint.config.js @@ -0,0 +1,5 @@ +/* eslint-disable import/no-commonjs */ + +module.exports = { + extends: ['@commitlint/config-conventional'], +}; diff --git a/packages/drawer/example/.babelrc b/packages/drawer/example/.babelrc index 76d1cd70..8d3a6e8d 100644 --- a/packages/drawer/example/.babelrc +++ b/packages/drawer/example/.babelrc @@ -1,5 +1,12 @@ { "presets": [ "expo" + ], + "plugins": [ + ["module-resolver", { + "alias": { + "react-navigation-drawer": "../src/index" + } + }] ] } diff --git a/packages/drawer/example/.eslintrc b/packages/drawer/example/.eslintrc index c7e5070d..449f211c 100644 --- a/packages/drawer/example/.eslintrc +++ b/packages/drawer/example/.eslintrc @@ -1,7 +1,14 @@ { - "extends": '../.eslintrc', + 'extends': '../.eslintrc', - "settings": { - "import/core-modules": [ "react-navigation-drawer", "react-native-gesture-handler", "react-native-vector-icons" ] - } + 'settings': + { + 'import/core-modules': + [ + 'react-navigation-drawer', + 'react-native-gesture-handler', + 'react-native-reanimated', + 'react-native-vector-icons', + ], + }, } diff --git a/packages/drawer/example/package.json b/packages/drawer/example/package.json index 7d08d577..6b81a624 100644 --- a/packages/drawer/example/package.json +++ b/packages/drawer/example/package.json @@ -10,8 +10,8 @@ "eject": "expo eject" }, "dependencies": { - "@react-navigation/core": "^3.3.0", - "@react-navigation/native": "^3.3.0", + "@react-navigation/core": "^3.4.0", + "@react-navigation/native": "^3.4.1", "expo": "32.0.6", "hoist-non-react-statics": "^3.3.0", "react": "16.5.0", diff --git a/packages/drawer/example/src/ParallaxDrawer.js b/packages/drawer/example/src/ParallaxDrawer.js index cbf8fd66..f25ad041 100644 --- a/packages/drawer/example/src/ParallaxDrawer.js +++ b/packages/drawer/example/src/ParallaxDrawer.js @@ -1,6 +1,5 @@ import * as React from 'react'; import { - Animated, Button, Dimensions, TextInput, @@ -17,6 +16,7 @@ import { createStackNavigator } from 'react-navigation-stack'; import { SafeAreaView } from '@react-navigation/native'; import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import { createDrawerNavigator } from 'react-navigation-drawer'; +import Animated from 'react-native-reanimated'; import { KeepAwake } from 'expo'; const SampleText = ({ children }) => {children}; @@ -168,9 +168,9 @@ const DraftsStack = createStackNavigator( const DrawerContents = ({ drawerOpenProgress, navigation }) => { // `contentComponent` is passed an Animated.Value called drawerOpenProgress // that can be used to do interesting things like a simple parallax drawe - const translateX = drawerOpenProgress.interpolate({ + const translateX = Animated.interpolate(drawerOpenProgress, { inputRange: [0, 1], - outputRange: [-50, 0], + outputRange: [-100, 0], }); return ( @@ -210,7 +210,6 @@ function createDrawerExample(options = {}) { { overlayColor: 'rgba(0,0,0,0)', drawerType: 'back', - useNativeAnimations: true, contentContainerStyle: { shadowColor: '#000000', shadowOpacity: 0.4, diff --git a/packages/drawer/example/src/SimpleDrawer.js b/packages/drawer/example/src/SimpleDrawer.js index 07325f92..ab2d78a8 100644 --- a/packages/drawer/example/src/SimpleDrawer.js +++ b/packages/drawer/example/src/SimpleDrawer.js @@ -176,7 +176,7 @@ function createDrawerExample(options = {}) { }, { initialRouteName: 'Drafts', - drawerWidth: 210, + drawerWidth: '60%', navigationOptions: { header: null, }, diff --git a/packages/drawer/example/src/StyledDrawer.js b/packages/drawer/example/src/StyledDrawer.js index 69d40da8..19473d93 100644 --- a/packages/drawer/example/src/StyledDrawer.js +++ b/packages/drawer/example/src/StyledDrawer.js @@ -88,7 +88,7 @@ const DrawerExample = createDrawerNavigator( activeTintColor: '#e91e63', }, drawerType: 'back', - overlayColor: '#00000000', + overlayColor: 'rgba(233, 30, 99, 0.5)', hideStatusBar: true, } ); diff --git a/packages/drawer/example/yarn.lock b/packages/drawer/example/yarn.lock index 8e3aea11..41f6c043 100644 --- a/packages/drawer/example/yarn.lock +++ b/packages/drawer/example/yarn.lock @@ -848,20 +848,20 @@ pouchdb-collections "^1.0.1" tiny-queue "^0.2.1" -"@react-navigation/core@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.3.0.tgz#a8fa76e1c2a0da588da3d94ec9ea0956b7df753e" - integrity sha512-jCtvNnJu6CBctIvaGzL82xedWG0IQv+URwZfKQSkoUgiFViSsUhoDWHgnoRXAlWvR8Js7au3hrC/Cwshwhi9/w== +"@react-navigation/core@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.4.0.tgz#776845f9d4f8b2b9cb99c5d2d4433ebcef290d92" + integrity sha512-YAnx9mK6P/zYkvn4YxZL6thaNdouSmD7FUaftFrOAbE7y7cCfH8hmk7BOLoOet6Sh2+UnrpkWX7Kg54cT2Jw+g== dependencies: - hoist-non-react-statics "^2.5.5" + hoist-non-react-statics "^3.3.0" path-to-regexp "^1.7.0" - query-string "^6.2.0" - react-is "^16.6.3" + query-string "^6.4.2" + react-is "^16.8.6" -"@react-navigation/native@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.3.0.tgz#def7a94ef17581a404a3de2a3200f986e999dac1" - integrity sha512-w/+2B0qX441BpNkYb5QoPY8+Q4Q18adGTahVpc6o8Juj6odAxyIJ2RozXk7dCpN/w0dz4B+5ggqMKHVniE6K7w== +"@react-navigation/native@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.4.1.tgz#e1fbf334ac834a9f10dd7d9c3af3e36939486089" + integrity sha512-pMAPQfvwC4DvhQfsrXKAf+FiU+A5XAh216v17rEePSFcbeOEt7cvewmWxCxydN/vFjJChFiPV+xnjJyJBdPLOg== dependencies: hoist-non-react-statics "^3.0.1" react-native-safe-area-view "^0.13.0" @@ -3157,7 +3157,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -hoist-non-react-statics@2.5.0, hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5, hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.1.0: +hoist-non-react-statics@2.5.0, hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.1.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" integrity sha512-6Bl6XsDT1ntE0lHbIhr4Kp2PGcleGZ66qu5Jqk8lc0Xc/IeG6gVLmwUGs/K0Us+L8VWoKgj0uWdPMataOsm31w== @@ -4831,7 +4831,7 @@ qs@^6.5.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -query-string@^6.2.0: +query-string@^6.4.2: version "6.4.2" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.4.2.tgz#8be1dbd105306aebf86022144f575a29d516b713" integrity sha512-DfJqAen17LfLA3rQ+H5S4uXphrF+ANU1lT2ijds4V/Tj4gZxA3gx5/tg1bz7kYCmwna7LyJNCYqO7jNRzo3aLw== @@ -4882,7 +4882,7 @@ react-devtools-core@3.3.4: shell-quote "^1.6.1" ws "^3.3.1" -react-is@^16.6.3, react-is@^16.7.0: +react-is@^16.7.0, react-is@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== @@ -4906,7 +4906,7 @@ react-native-gesture-handler@~1.0.14: invariant "^2.2.2" prop-types "^15.5.10" -"react-native-maps@github:expo/react-native-maps#v0.22.1-exp.0": +react-native-maps@expo/react-native-maps#v0.22.1-exp.0: version "0.22.1" resolved "https://codeload.github.com/expo/react-native-maps/tar.gz/e6f98ff7272e5d0a7fe974a41f28593af2d77bb2" diff --git a/packages/drawer/jest-setup.js b/packages/drawer/jest-setup.js index ab1e3ae4..eb81c11f 100644 --- a/packages/drawer/jest-setup.js +++ b/packages/drawer/jest-setup.js @@ -1,16 +1,64 @@ /* eslint-env jest */ -jest.mock('react-native-gesture-handler/DrawerLayout', () => { - const React = require('react'); - const View = require.requireActual('View'); - const DrawerLayout = React.forwardRef((props, ref) => ( - - )); +import NativeModules from 'NativeModules'; - DrawerLayout.positions = { - Left: 'left', - Right: 'right', - }; - - return DrawerLayout; +Object.assign(NativeModules, { + RNGestureHandlerModule: { + attachGestureHandler: jest.fn(), + createGestureHandler: jest.fn(), + dropGestureHandler: jest.fn(), + updateGestureHandler: jest.fn(), + State: {}, + Directions: {}, + }, + ReanimatedModule: { + createNode: jest.fn(), + configureProps: jest.fn(), + configureNativeProps: jest.fn(), + connectNodes: jest.fn(), + disconnectNodes: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), + }, + PlatformConstants: { + forceTouchAvailable: false, + }, }); + +jest.mock('react-native-reanimated', () => ({ + __esModule: true, + default: { + View: require('react-native').Animated.View, + Text: require('react-native').Animated.Text, + Clock: jest.fn(), + Value: jest.fn(), + onChange: jest.fn(), + interpolate: jest.fn(), + abs: jest.fn(), + add: jest.fn(), + sub: jest.fn(), + and: jest.fn(), + block: jest.fn(), + call: jest.fn(), + clockRunning: jest.fn(), + cond: jest.fn(), + divide: jest.fn(), + eq: jest.fn(), + event: jest.fn(), + greaterThan: jest.fn(), + lessThan: jest.fn(), + max: jest.fn(), + min: jest.fn(), + multiply: jest.fn(), + neq: jest.fn(), + or: jest.fn(), + set: jest.fn(), + spring: jest.fn(), + startClock: jest.fn(), + stopClock: jest.fn(), + timing: jest.fn(), + }, + Easing: { + out: jest.fn(), + }, +})); diff --git a/packages/drawer/package.json b/packages/drawer/package.json index 0f061157..2b3f78a3 100644 --- a/packages/drawer/package.json +++ b/packages/drawer/package.json @@ -14,7 +14,8 @@ "test": "jest", "lint": "eslint --ext .js,.ts,.tsx .", "typescript": "tsc --noEmit", - "bootstrap": "yarn && yarn --cwd example", + "example": "yarn --cwd example", + "bootstrap": "yarn && yarn example", "prepare": "bob build" }, "keywords": [ @@ -38,30 +39,34 @@ "homepage": "https://github.com/react-navigation/react-navigation-drawer#readme", "devDependencies": { "@babel/core": "^7.4.3", + "@commitlint/config-conventional": "^7.5.0", "@expo/vector-icons": "^10.0.1", - "@react-native-community/bob": "^0.3.3", - "@react-navigation/core": "^3.3.0", - "@react-navigation/native": "^3.3.0", + "@react-native-community/bob": "^0.3.4", + "@react-navigation/core": "^3.4.0", + "@react-navigation/native": "^3.4.1", "@types/jest": "^24.0.11", "@types/react": "^16.8.13", - "@types/react-native": "^0.57.43", + "@types/react-native": "^0.57.49", "@types/react-test-renderer": "^16.8.1", "babel-jest": "^24.7.1", + "commitlint": "^7.5.2", "escape-string-regexp": "^1.0.5", "eslint": "^5.16.0", "eslint-config-satya164": "^2.4.1", "eslint-plugin-react-native-globals": "^0.1.0", "husky": "^1.3.1", "jest": "^24.7.1", - "prettier": "^1.16.4", + "prettier": "^1.17.0", "react": "16.5.0", "react-dom": "16.5.0", "react-lifecycles-compat": "^3.0.4", "react-native": "~0.57.1", "react-native-gesture-handler": "^1.1.0", + "react-native-reanimated": "^1.0.1", "react-native-screens": "^1.0.0-alpha.22", + "react-native-testing-library": "^1.7.0", "react-test-renderer": "16.8.6", - "typescript": "^3.4.3" + "typescript": "^3.4.5" }, "peerDependencies": { "@react-navigation/core": "^3.0.0", @@ -69,6 +74,7 @@ "react": "*", "react-native": "*", "react-native-gesture-handler": "^1.0.12", + "react-native-reanimated": "^1.0.0", "react-native-screens": "^1.0.0 || ^1.0.0-alpha" }, "jest": { @@ -97,7 +103,8 @@ }, "husky": { "hooks": { - "pre-commit": "yarn lint && yarn typescript && yarn test" + "pre-commit": "yarn lint && yarn typescript && yarn test", + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } }, "@react-native-community/bob": { @@ -105,7 +112,8 @@ "output": "lib", "targets": [ "commonjs", - "module" + "module", + "typescript" ] } } diff --git a/packages/drawer/src/index.tsx b/packages/drawer/src/index.tsx index 1f4f091c..0537142a 100644 --- a/packages/drawer/src/index.tsx +++ b/packages/drawer/src/index.tsx @@ -1,15 +1,15 @@ +import * as DrawerAcions from './routers/DrawerActions'; + /** * Navigators */ -/** - * Router - */ -import * as DrawerAcions from './routers/DrawerActions'; - export { default as createDrawerNavigator, } from './navigators/createDrawerNavigator'; +/** + * Router + */ export { DrawerAcions }; export { default as DrawerRouter } from './routers/DrawerRouter'; diff --git a/packages/drawer/src/navigators/__tests__/createDrawerNavigator.test.tsx b/packages/drawer/src/navigators/__tests__/createDrawerNavigator.test.tsx index 5a9ed1bf..87e00d5d 100644 --- a/packages/drawer/src/navigators/__tests__/createDrawerNavigator.test.tsx +++ b/packages/drawer/src/navigators/__tests__/createDrawerNavigator.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { View } from 'react-native'; -import renderer from 'react-test-renderer'; +import { render } from 'react-native-testing-library'; import { createAppContainer } from '@react-navigation/native'; import createDrawerNavigator from '../createDrawerNavigator'; @@ -21,62 +21,63 @@ class HomeScreen extends React.Component { it('renders successfully', () => { const MyDrawerNavigator = createDrawerNavigator({ Home: HomeScreen }); const App = createAppContainer(MyDrawerNavigator); - const rendered = renderer.create().toJSON(); + const rendered = render().toJSON(); expect(rendered).toMatchInlineSnapshot(` - { "flex": 1, } } - /> + > + + + - + + + + + + + + + + Welcome anonymous + + + + + + + + + + `); }); diff --git a/packages/drawer/src/navigators/createDrawerNavigator.tsx b/packages/drawer/src/navigators/createDrawerNavigator.tsx index 383e6cdc..a318d6ec 100644 --- a/packages/drawer/src/navigators/createDrawerNavigator.tsx +++ b/packages/drawer/src/navigators/createDrawerNavigator.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { Dimensions, Platform, ScrollView } from 'react-native'; +import { Dimensions, Platform, ScrollView, I18nManager } from 'react-native'; import { createNavigator } from '@react-navigation/core'; import { SafeAreaView } from '@react-navigation/native'; import DrawerRouter from '../routers/DrawerRouter'; @@ -35,14 +35,12 @@ const DefaultDrawerConfig = { return Math.min(smallerAxisSize - appBarHeight, maxWidth); }, contentComponent: defaultContentComponent, - drawerPosition: 'left', + drawerPosition: I18nManager.isRTL ? 'right' : 'left', keyboardDismissMode: 'on-drag', drawerBackgroundColor: 'white', - useNativeAnimations: true, drawerType: 'front', hideStatusBar: false, statusBarAnimation: 'slide', - overlayColor: 'black', }; const DrawerNavigator = (routeConfigs: object, config: any = {}) => { diff --git a/packages/drawer/src/routers/DrawerActions.tsx b/packages/drawer/src/routers/DrawerActions.tsx index 777ddedf..8234a3d8 100644 --- a/packages/drawer/src/routers/DrawerActions.tsx +++ b/packages/drawer/src/routers/DrawerActions.tsx @@ -10,12 +10,7 @@ export const MARK_DRAWER_IDLE = 'Navigation/MARK_DRAWER_IDLE'; export type DrawerActionType = | typeof OPEN_DRAWER | typeof CLOSE_DRAWER - | typeof TOGGLE_DRAWER - | typeof DRAWER_OPENED - | typeof DRAWER_CLOSED - | typeof MARK_DRAWER_ACTIVE - | typeof MARK_DRAWER_SETTLING - | typeof MARK_DRAWER_IDLE; + | typeof TOGGLE_DRAWER; export const openDrawer = (payload?: any) => ({ type: OPEN_DRAWER, @@ -27,21 +22,6 @@ export const closeDrawer = (payload?: any) => ({ ...payload, }); -export const markDrawerActive = (payload?: any) => ({ - type: MARK_DRAWER_ACTIVE, - ...payload, -}); - -export const markDrawerIdle = (payload?: any) => ({ - type: MARK_DRAWER_IDLE, - ...payload, -}); - -export const markDrawerSettling = (payload?: any) => ({ - type: MARK_DRAWER_SETTLING, - ...payload, -}); - export const toggleDrawer = (payload?: any) => ({ type: TOGGLE_DRAWER, ...payload, diff --git a/packages/drawer/src/routers/DrawerRouter.tsx b/packages/drawer/src/routers/DrawerRouter.tsx index 6df9da21..d5676097 100644 --- a/packages/drawer/src/routers/DrawerRouter.tsx +++ b/packages/drawer/src/routers/DrawerRouter.tsx @@ -15,8 +15,6 @@ type Action = { type State = Route & { isDrawerOpen?: any; - isDrawerIdle?: any; - drawerMovementDirection?: any; }; function withDefaultValue(obj: object, key: string, defaultValue: any): any { @@ -60,12 +58,6 @@ export default ( const switchRouter = SwitchRouter(routeConfigs, config); - let __id = -1; - const genId = () => { - __id++; - return __id; - }; - return { ...switchRouter, @@ -84,11 +76,6 @@ export default ( return { ...switchRouter.getStateForAction(action, undefined), isDrawerOpen: false, - isDrawerIdle: true, - drawerMovementDirection: null, - openId: genId(), - closeId: genId(), - toggleId: genId(), }; } @@ -96,78 +83,27 @@ export default ( if (isRouterTargeted) { // Only handle actions that are meant for this drawer, as specified by action.key. - - if (action.type === DrawerActions.DRAWER_CLOSED) { - return { - ...state, - isDrawerOpen: false, - isDrawerIdle: true, - drawerMovementDirection: null, - }; - } - - if (action.type === DrawerActions.DRAWER_OPENED) { - return { - ...state, - isDrawerOpen: true, - isDrawerIdle: true, - drawerMovementDirection: null, - }; - } - - if (action.type === DrawerActions.CLOSE_DRAWER) { - return { - ...state, - closeId: genId(), - }; - } - - if (action.type === DrawerActions.MARK_DRAWER_SETTLING) { - return { - ...state, - isDrawerIdle: false, - drawerMovementDirection: action.willShow ? 'opening' : 'closing', - }; - } - - if (action.type === DrawerActions.MARK_DRAWER_ACTIVE) { - return { - ...state, - isDrawerIdle: false, - drawerMovementDirection: null, - }; - } - - if (action.type === DrawerActions.MARK_DRAWER_IDLE) { - return { - ...state, - isDrawerIdle: true, - drawerMovementDirection: null, - }; - } - if ( - action.type === NavigationActions.BACK && - (state.isDrawerOpen || !state.isDrawerIdle) && - state.drawerMovementDirection !== 'closing' + action.type === DrawerActions.CLOSE_DRAWER || + (action.type === NavigationActions.BACK && state.isDrawerOpen) ) { return { ...state, - closeId: genId(), + isDrawerOpen: false, }; } if (action.type === DrawerActions.OPEN_DRAWER) { return { ...state, - openId: genId(), + isDrawerOpen: true, }; } if (action.type === DrawerActions.TOGGLE_DRAWER) { return { ...state, - toggleId: genId(), + isDrawerOpen: !state.isDrawerOpen, }; } } @@ -185,11 +121,11 @@ export default ( // If any navigation has happened, and the drawer is maybe open, make sure to close it if ( getActiveRouteKey(switchedState) !== getActiveRouteKey(state) && - (state.isDrawerOpen || state.drawerMovementDirection !== 'closing') + state.isDrawerOpen ) { return { ...switchedState, - closeId: genId(), + isDrawerOpen: false, }; } diff --git a/packages/drawer/src/routers/__tests__/DrawerRouter.test.tsx b/packages/drawer/src/routers/__tests__/DrawerRouter.test.tsx index 93042e7d..c7fe062e 100644 --- a/packages/drawer/src/routers/__tests__/DrawerRouter.test.tsx +++ b/packages/drawer/src/routers/__tests__/DrawerRouter.test.tsx @@ -12,143 +12,136 @@ import * as DrawerActions from '../../routers/DrawerActions'; const INIT_ACTION = { type: NavigationActions.INIT }; -describe('DrawerRouter', () => { - it('Handles basic drawer logic and fires close on switch', () => { - const ScreenA = () =>
; - const ScreenB = () =>
; - const router = DrawerRouter({ - Foo: { screen: ScreenA }, - Bar: { screen: ScreenB }, - }); - const state = router.getStateForAction(INIT_ACTION); - const expectedState = { - index: 0, - isTransitioning: false, - routes: [ - { key: 'Foo', routeName: 'Foo', params: undefined }, - { key: 'Bar', routeName: 'Bar', params: undefined }, - ], - isDrawerOpen: false, - isDrawerIdle: true, - drawerMovementDirection: null, - openId: 0, - closeId: 1, - toggleId: 2, - }; - expect(state).toEqual(expectedState); - const state2 = router.getStateForAction( - { type: NavigationActions.NAVIGATE, routeName: 'Bar' }, - state - ); - const expectedState2 = { - index: 1, - isTransitioning: false, - routes: [ - { key: 'Foo', routeName: 'Foo', params: undefined }, - { key: 'Bar', routeName: 'Bar', params: undefined }, - ], - isDrawerOpen: false, - isDrawerIdle: true, - drawerMovementDirection: null, - openId: 0, - closeId: 3, - toggleId: 2, - }; - expect(state2).toEqual(expectedState2); - expect(router.getComponentForState(expectedState)).toEqual(ScreenA); - expect(router.getComponentForState(expectedState2)).toEqual(ScreenB); +it('handles basic drawer logic and fires close on switch', () => { + const ScreenA = () =>
; + const ScreenB = () =>
; + const router = DrawerRouter({ + Foo: { screen: ScreenA }, + Bar: { screen: ScreenB }, }); + const state = router.getStateForAction(INIT_ACTION); + const expectedState = { + index: 0, + isTransitioning: false, + routes: [ + { key: 'Foo', routeName: 'Foo', params: undefined }, + { key: 'Bar', routeName: 'Bar', params: undefined }, + ], + isDrawerOpen: false, + }; + expect(state).toEqual(expectedState); + const state2 = router.getStateForAction( + { type: NavigationActions.NAVIGATE, routeName: 'Bar' }, + state + ); + const expectedState2 = { + index: 1, + isTransitioning: false, + routes: [ + { key: 'Foo', routeName: 'Foo', params: undefined }, + { key: 'Bar', routeName: 'Bar', params: undefined }, + ], + isDrawerOpen: false, + }; + expect(state2).toEqual(expectedState2); + expect(router.getComponentForState(expectedState)).toEqual(ScreenA); + expect(router.getComponentForState(expectedState2)).toEqual(ScreenB); +}); - it('Handles initial route navigation', () => { - const FooScreen = () =>
; - const BarScreen = () =>
; - const router = DrawerRouter( - { - Foo: { - screen: FooScreen, - }, - Bar: { - screen: BarScreen, - }, +it('handles initial route navigation', () => { + const FooScreen = () =>
; + const BarScreen = () =>
; + const router = DrawerRouter( + { + Foo: { + screen: FooScreen, }, - { initialRouteName: 'Bar' } - ); - const state = router.getStateForAction({ - type: NavigationActions.NAVIGATE, - routeName: 'Foo', - }); - expect(state).toEqual({ - index: 0, - isDrawerOpen: false, - isDrawerIdle: true, - drawerMovementDirection: null, - isTransitioning: false, - openId: 0, - closeId: 1, - toggleId: 2, - routes: [ - { - key: 'Foo', - params: undefined, - routeName: 'Foo', - }, - { - key: 'Bar', - params: undefined, - routeName: 'Bar', - }, - ], - }); + Bar: { + screen: BarScreen, + }, + }, + { initialRouteName: 'Bar' } + ); + const state = router.getStateForAction({ + type: NavigationActions.NAVIGATE, + routeName: 'Foo', }); - - it('Drawer opens closes and toggles', () => { - const ScreenA = () =>
; - const ScreenB = () =>
; - const router = DrawerRouter({ - Foo: { screen: ScreenA }, - Bar: { screen: ScreenB }, - }); - const state = router.getStateForAction(INIT_ACTION); - expect(state.toggleId).toEqual(2); - const state2 = router.getStateForAction( - { type: DrawerActions.OPEN_DRAWER }, - state - ); - expect(state2.openId).toEqual(3); - const state3 = router.getStateForAction( - { type: DrawerActions.CLOSE_DRAWER }, - state2 - ); - expect(state3.closeId).toEqual(4); - const state4 = router.getStateForAction( - { type: DrawerActions.TOGGLE_DRAWER }, - state3 - ); - expect(state4.toggleId).toEqual(5); - }); - - it('Drawer opens closes with key targeted', () => { - const ScreenA = () =>
; - const ScreenB = () =>
; - const router = DrawerRouter({ - Foo: { screen: ScreenA }, - Bar: { screen: ScreenB }, - }); - const state = router.getStateForAction(INIT_ACTION); - const state2 = router.getStateForAction( - { type: DrawerActions.OPEN_DRAWER, key: 'wrong' }, - state - ); - expect(state2.openId).toEqual(0); - const state3 = router.getStateForAction( - { type: DrawerActions.OPEN_DRAWER, key: state.key }, - state2 - ); - expect(state3.openId).toEqual(3); + expect(state).toEqual({ + index: 0, + isDrawerOpen: false, + isTransitioning: false, + routes: [ + { + key: 'Foo', + params: undefined, + routeName: 'Foo', + }, + { + key: 'Bar', + params: undefined, + routeName: 'Bar', + }, + ], }); }); -it('Nested routers bubble up blocked actions', () => { +it('drawer opens, closes and toggles', () => { + const ScreenA = () =>
; + const ScreenB = () =>
; + const router = DrawerRouter({ + Foo: { screen: ScreenA }, + Bar: { screen: ScreenB }, + }); + const state = router.getStateForAction(INIT_ACTION); + + expect(state.isDrawerOpen).toEqual(false); + + const state2 = router.getStateForAction( + { type: DrawerActions.OPEN_DRAWER }, + state + ); + + expect(state2.isDrawerOpen).toEqual(true); + + const state3 = router.getStateForAction( + { type: DrawerActions.CLOSE_DRAWER }, + state2 + ); + + expect(state3.isDrawerOpen).toEqual(false); + + const state4 = router.getStateForAction( + { type: DrawerActions.TOGGLE_DRAWER }, + state3 + ); + + expect(state4.isDrawerOpen).toEqual(true); +}); + +it('drawer opens, closes with key targeted', () => { + const ScreenA = () =>
; + const ScreenB = () =>
; + const router = DrawerRouter({ + Foo: { screen: ScreenA }, + Bar: { screen: ScreenB }, + }); + const state = router.getStateForAction(INIT_ACTION); + const state2 = router.getStateForAction( + { type: DrawerActions.OPEN_DRAWER, key: 'wrong' }, + state + ); + + expect(state2.isDrawerOpen).toEqual(false); + + const state3 = router.getStateForAction( + { type: DrawerActions.OPEN_DRAWER, key: state.key }, + state2 + ); + + expect(state3.isDrawerOpen).toEqual(true); +}); + +it('nested routers bubble up blocked actions', () => { const ScreenA = () =>
; ScreenA.router = { getStateForAction(action: { type: string }, lastState: any) { @@ -167,7 +160,7 @@ it('Nested routers bubble up blocked actions', () => { expect(state2).toEqual(null); }); -it('Drawer does not fire close when child routers return new state', () => { +it('drawer does not fire close when child routers return new state', () => { const ScreenA = () =>
; ScreenA.router = { getStateForAction( @@ -184,14 +177,14 @@ it('Drawer does not fire close when child routers return new state', () => { }); const state = router.getStateForAction(INIT_ACTION); - expect(state.closeId).toEqual(1); + expect(state.isDrawerOpen).toEqual(false); const state2 = router.getStateForAction({ type: 'CHILD_ACTION' }, state); - expect(state2.closeId).toEqual(1); + expect(state2.isDrawerOpen).toEqual(false); expect(state2.routes[0].changed).toEqual(true); }); -it('DrawerRouter will close drawer on child navigaton, not on child param changes', () => { +it('drawerRouter will close drawer on child navigaton, not on child param changes', () => { class FooView extends React.Component { render() { return
; @@ -217,13 +210,13 @@ it('DrawerRouter will close drawer on child navigaton, not on child param change DrawerActions.openDrawer(), emptyState ); - expect(initState.openId).toBe(3); + expect(initState.isDrawerOpen).toBe(true); const state0 = router.getStateForAction( NavigationActions.navigate({ routeName: 'Quo' }), initState ); - expect(state0.closeId).toBe(4); + expect(state0.isDrawerOpen).toBe(false); const initSwitchState = initState.routes[initState.index]; const initQuxState = initSwitchState.routes[initSwitchState.index]; @@ -237,7 +230,7 @@ it('DrawerRouter will close drawer on child navigaton, not on child param change ); const state1switchState = state1.routes[state1.index]; const state1quxState = state1switchState.routes[state1switchState.index]; - expect(state1.closeId).toBe(1); // don't fire close + expect(state1.isDrawerOpen).toBe(true); // don't fire close expect(state1quxState.params.foo).toEqual('bar'); }); @@ -266,12 +259,6 @@ it('goBack closes drawer when inside of stack', () => { ); expect(state3.index).toEqual(1); expect(state3.routes[1].isDrawerOpen).toEqual(true); - expect(state3.routes[1].closeId).toEqual(1); // changed const state4 = router.getStateForAction(NavigationActions.back(), state3); - expect(state4.routes[1].closeId).toEqual(4); - const state5 = router.getStateForAction( - { type: DrawerActions.DRAWER_CLOSED }, - state4 - ); - expect(state5.routes[1].isDrawerOpen).toEqual(false); + expect(state4.routes[1].isDrawerOpen).toEqual(false); }); diff --git a/packages/drawer/src/types.tsx b/packages/drawer/src/types.tsx index a04d64a7..a077deb2 100644 --- a/packages/drawer/src/types.tsx +++ b/packages/drawer/src/types.tsx @@ -17,10 +17,6 @@ export type Navigation = { key: string; index: number; routes: Route[]; - openId: string; - closeId: string; - toggleId: string; - isDrawerIdle: boolean; isDrawerOpen: boolean; }; openDrawer: () => void; diff --git a/packages/drawer/src/views/Drawer.tsx b/packages/drawer/src/views/Drawer.tsx new file mode 100644 index 00000000..a41a44f5 --- /dev/null +++ b/packages/drawer/src/views/Drawer.tsx @@ -0,0 +1,586 @@ +import * as React from 'react'; +import { + StyleSheet, + ViewStyle, + LayoutChangeEvent, + I18nManager, + Platform, + Keyboard, + StatusBar, +} from 'react-native'; +import { + PanGestureHandler, + TapGestureHandler, + State, + TapGestureHandlerStateChangeEvent, +} from 'react-native-gesture-handler'; +import Animated from 'react-native-reanimated'; + +const { + Clock, + Value, + onChange, + clockRunning, + startClock, + stopClock, + interpolate, + spring, + abs, + add, + and, + block, + call, + cond, + divide, + eq, + event, + greaterThan, + lessThan, + max, + min, + multiply, + neq, + or, + set, + sub, +} = Animated; + +const TRUE = 1; +const FALSE = 0; +const NOOP = 0; +const UNSET = -1; + +const PROGRESS_EPSILON = 0.05; + +const DIRECTION_LEFT = 1; +const DIRECTION_RIGHT = -1; + +const SWIPE_DISTANCE_THRESHOLD_DEFAULT = 60; + +const SWIPE_DISTANCE_MINIMUM = 5; + +const SPRING_CONFIG = { + damping: 30, + mass: 0.5, + stiffness: 150, + overshootClamping: true, + restSpeedThreshold: 0.001, + restDisplacementThreshold: 0.001, +}; + +type Binary = 0 | 1; + +type Renderer = (props: { progress: Animated.Node }) => React.ReactNode; + +type Props = { + open: boolean; + onOpen: () => void; + onClose: () => void; + onGestureRef?: (ref: PanGestureHandler | null) => void; + locked: boolean; + drawerPosition: 'left' | 'right'; + drawerType: 'front' | 'back' | 'slide'; + keyboardDismissMode: 'none' | 'on-drag'; + swipeEdgeWidth: number; + swipeDistanceThreshold?: number; + swipeVelocityThreshold: number; + hideStatusBar: boolean; + statusBarAnimation: 'slide' | 'none' | 'fade'; + overlayStyle?: ViewStyle; + drawerStyle?: ViewStyle; + contentContainerStyle?: ViewStyle; + renderDrawerContent: Renderer; + renderSceneContent: Renderer; +}; + +export default class DrawerView extends React.PureComponent { + static defaultProps = { + locked: false, + drawerPostion: I18nManager.isRTL ? 'left' : 'right', + drawerType: 'front', + swipeEdgeWidth: 32, + swipeVelocityThreshold: 500, + keyboardDismissMode: 'on-drag', + hideStatusBar: false, + statusBarAnimation: 'slide', + }; + + componentDidUpdate(prevProps: Props) { + const { + open, + drawerPosition, + drawerType, + swipeDistanceThreshold, + swipeVelocityThreshold, + hideStatusBar, + } = this.props; + + if ( + // If we're not in the middle of a transition, sync the drawer's open state + typeof this.pendingOpenValue !== 'boolean' || + open !== this.pendingOpenValue + ) { + this.toggleDrawer(open); + } + + this.pendingOpenValue = undefined; + + if (open !== prevProps.open && hideStatusBar) { + this.toggleStatusBar(open); + } + + if (prevProps.drawerPosition !== drawerPosition) { + this.drawerPosition.setValue( + drawerPosition === 'right' ? DIRECTION_RIGHT : DIRECTION_LEFT + ); + } + + if (prevProps.drawerType !== drawerType) { + this.isDrawerTypeFront.setValue(drawerType === 'front' ? TRUE : FALSE); + } + + if (prevProps.swipeDistanceThreshold !== swipeDistanceThreshold) { + this.swipeDistanceThreshold.setValue( + swipeDistanceThreshold !== undefined + ? swipeDistanceThreshold + : SWIPE_DISTANCE_THRESHOLD_DEFAULT + ); + } + + if (prevProps.swipeVelocityThreshold !== swipeVelocityThreshold) { + this.swipeVelocityThreshold.setValue(swipeVelocityThreshold); + } + } + + componentWillUnmount() { + this.toggleStatusBar(false); + } + + private clock = new Clock(); + + private isDrawerTypeFront = new Value( + this.props.drawerType === 'front' ? TRUE : FALSE + ); + + private isOpen = new Value(this.props.open ? TRUE : FALSE); + private nextIsOpen = new Value(UNSET); + private isSwiping = new Value(FALSE); + + private gestureState = new Value(State.UNDETERMINED); + private touchX = new Value(0); + private velocityX = new Value(0); + private gestureX = new Value(0); + private offsetX = new Value(0); + private position = new Value(0); + + private containerWidth = new Value(0); + private drawerWidth = new Value(0); + private drawerOpacity = new Value(0); + private drawerPosition = new Value( + this.props.drawerPosition === 'right' ? DIRECTION_RIGHT : DIRECTION_LEFT + ); + + // Comment stolen from react-native-gesture-handler/DrawerLayout + // + // While closing the drawer when user starts gesture outside of its area (in greyed + // out part of the window), we want the drawer to follow only once finger reaches the + // edge of the drawer. + // E.g. on the diagram below drawer is illustrate by X signs and the greyed out area by + // dots. The touch gesture starts at '*' and moves left, touch path is indicated by + // an arrow pointing left + // 1) +---------------+ 2) +---------------+ 3) +---------------+ 4) +---------------+ + // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........| + // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........| + // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........| + // |XXXXXXXX|......| |XXXXXXXX|.<-*..| |XXXXXXXX|<--*..| |XXXXX|<-----*..| + // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........| + // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........| + // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........| + // +---------------+ +---------------+ +---------------+ +---------------+ + // + // For the above to work properly we define animated value that will keep start position + // of the gesture. Then we use that value to calculate how much we need to subtract from + // the dragX. If the gesture started on the greyed out area we take the distance from the + // edge of the drawer to the start position. Otherwise we don't subtract at all and the + // drawer be pulled back as soon as you start the pan. + // + // This is used only when drawerType is "front" + private touchDistanceFromDrawer = cond( + this.isDrawerTypeFront, + cond( + eq(this.drawerPosition, DIRECTION_LEFT), + max( + // Distance of touch start from left screen edge - Drawer width + sub(sub(this.touchX, this.gestureX), this.drawerWidth), + 0 + ), + min( + multiply( + // Distance of drawer from left screen edge - Touch start point + sub( + sub(this.containerWidth, this.drawerWidth), + sub(this.touchX, this.gestureX) + ), + DIRECTION_RIGHT + ), + 0 + ) + ), + 0 + ); + + private swipeDistanceThreshold = new Value( + this.props.swipeDistanceThreshold !== undefined + ? this.props.swipeDistanceThreshold + : SWIPE_DISTANCE_THRESHOLD_DEFAULT + ); + private swipeVelocityThreshold = new Value( + this.props.swipeVelocityThreshold + ); + + private currentOpenValue: boolean = this.props.open; + private pendingOpenValue: boolean | undefined; + + private isStatusBarHidden: boolean = false; + + private transitionTo = (isOpen: number | Animated.Node) => { + const toValue = new Value(0); + const frameTime = new Value(0); + + const state = { + position: this.position, + time: new Value(0), + finished: new Value(FALSE), + }; + + return block([ + cond(clockRunning(this.clock), NOOP, [ + // Animation wasn't running before + // Set the initial values and start the clock + set(toValue, multiply(isOpen, this.drawerWidth, this.drawerPosition)), + set(frameTime, 0), + set(state.time, 0), + set(state.finished, FALSE), + set(this.isOpen, isOpen), + startClock(this.clock), + ]), + spring( + this.clock, + { ...state, velocity: this.velocityX }, + { ...SPRING_CONFIG, toValue } + ), + cond(state.finished, [ + // Reset gesture and velocity from previous gesture + set(this.touchX, 0), + set(this.gestureX, 0), + set(this.velocityX, 0), + set(this.offsetX, 0), + // When the animation finishes, stop the clock + stopClock(this.clock), + call([this.isOpen], ([value]: ReadonlyArray) => { + const open = Boolean(value); + + if (open !== this.props.open) { + // Sync drawer's state after animation finished + // This shouldn't be necessary, but there seems to be an issue on iOS + this.toggleDrawer(this.props.open); + } + }), + ]), + ]); + }; + + private dragX = block([ + onChange( + this.isOpen, + call([this.isOpen], ([value]: ReadonlyArray) => { + const open = Boolean(value); + + this.currentOpenValue = open; + + // Without this check, the drawer can go to an infinite update <-> animate loop for sync updates + if (open !== this.props.open) { + // If the mode changed, update state + if (open) { + this.props.onOpen(); + } else { + this.props.onClose(); + } + + this.pendingOpenValue = open; + + // Force componentDidUpdate to fire, whether user does a setState or not + // This allows us to detect when the user drops the update and revert back + // It's necessary to make sure that the state stays in sync + this.forceUpdate(); + } + }) + ), + onChange( + this.nextIsOpen, + cond(neq(this.nextIsOpen, UNSET), [ + // Stop any running animations + cond(clockRunning(this.clock), stopClock(this.clock)), + // Update the open value to trigger the transition + set(this.isOpen, this.nextIsOpen), + set(this.nextIsOpen, UNSET), + ]) + ), + // This block must be after the this.isOpen listener since we check for current value + onChange( + this.isSwiping, + // Listen to updates for this value only when it changes + // Without `onChange`, this will fire even if the value didn't change + // We don't want to call the listeners if the value didn't change + call([this.isSwiping], ([value]: ReadonlyArray) => { + const { keyboardDismissMode } = this.props; + + if (value === TRUE) { + if (keyboardDismissMode === 'on-drag') { + Keyboard.dismiss(); + } + + this.toggleStatusBar(true); + } else { + this.toggleStatusBar(this.currentOpenValue); + } + }) + ), + cond( + eq(this.gestureState, State.ACTIVE), + [ + cond(this.isSwiping, NOOP, [ + // We weren't dragging before, set it to true + set(this.isSwiping, TRUE), + // Also update the drag offset to the last position + set(this.offsetX, this.position), + ]), + // Update position with previous offset + gesture distance + set( + this.position, + add(this.offsetX, this.gestureX, this.touchDistanceFromDrawer) + ), + // Stop animations while we're dragging + stopClock(this.clock), + ], + [ + set(this.isSwiping, FALSE), + set(this.touchX, 0), + this.transitionTo( + cond( + or( + and( + greaterThan(abs(this.gestureX), SWIPE_DISTANCE_MINIMUM), + greaterThan(abs(this.velocityX), this.swipeVelocityThreshold) + ), + greaterThan(abs(this.gestureX), this.swipeDistanceThreshold) + ), + cond( + eq(this.drawerPosition, DIRECTION_LEFT), + // If swiped to right, open the drawer, otherwise close it + greaterThan( + cond(eq(this.velocityX, 0), this.gestureX, this.velocityX), + 0 + ), + // If swiped to left, open the drawer, otherwise close it + lessThan( + cond(eq(this.velocityX, 0), this.gestureX, this.velocityX), + 0 + ) + ), + this.isOpen + ) + ), + ] + ), + this.position, + ]); + + private translateX = cond( + eq(this.drawerPosition, DIRECTION_RIGHT), + min(max(multiply(this.drawerWidth, -1), this.dragX), 0), + max(min(this.drawerWidth, this.dragX), 0) + ); + + private progress = cond( + // Check if the drawer width is available to avoid division by zero + eq(this.drawerWidth, 0), + 0, + abs(divide(this.translateX, this.drawerWidth)) + ); + + private handleGestureEvent = event([ + { + nativeEvent: { + x: this.touchX, + translationX: this.gestureX, + velocityX: this.velocityX, + state: this.gestureState, + }, + }, + ]); + + private handleTapStateChange = ({ + nativeEvent, + }: TapGestureHandlerStateChangeEvent) => { + if (nativeEvent.oldState === State.ACTIVE && !this.props.locked) { + this.toggleDrawer(false); + } + }; + + private handleContainerLayout = (e: LayoutChangeEvent) => + this.containerWidth.setValue(e.nativeEvent.layout.width); + + private handleDrawerLayout = (e: LayoutChangeEvent) => { + this.drawerWidth.setValue(e.nativeEvent.layout.width); + this.toggleDrawer(this.props.open); + + // Until layout is available, drawer is hidden with opacity: 0 by default + // Show it in the next frame when layout is available + // If we don't delay it until the next frame, there's a visible flicker + requestAnimationFrame(() => this.drawerOpacity.setValue(1)); + }; + + private toggleDrawer = (open: boolean) => { + this.nextIsOpen.setValue(open ? TRUE : FALSE); + + // This value will also be set shortly after as changing this.nextIsOpen changes this.isOpen + // However, there's a race condition on Android, so we need to set a bit earlier + this.currentOpenValue = open; + }; + + private toggleStatusBar = (hidden: boolean) => { + const { hideStatusBar, statusBarAnimation } = this.props; + + if (hideStatusBar && this.isStatusBarHidden !== hidden) { + this.isStatusBarHidden = hidden; + StatusBar.setHidden(hidden, statusBarAnimation); + } + }; + + render() { + const { + open, + locked, + drawerPosition, + drawerType, + swipeEdgeWidth, + contentContainerStyle, + drawerStyle, + overlayStyle, + onGestureRef, + renderDrawerContent, + renderSceneContent, + } = this.props; + + const right = drawerPosition === 'right'; + + const contentTranslateX = drawerType === 'front' ? 0 : this.translateX; + const drawerTranslateX = + drawerType === 'back' + ? I18nManager.isRTL + ? multiply(this.drawerWidth, DIRECTION_RIGHT) + : this.drawerWidth + : this.translateX; + + const offset = I18nManager.isRTL ? '100%' : multiply(this.drawerWidth, -1); + + // FIXME: Currently hitSlop is broken when on Android when drawer is on right + // https://github.com/kmagiera/react-native-gesture-handler/issues/569 + const hitSlop = right + ? // Extend hitSlop to the side of the screen when drawer is closed + // This lets the user drag the drawer from the side of the screen + { right: 0, width: open ? undefined : swipeEdgeWidth } + : { left: 0, width: open ? undefined : swipeEdgeWidth }; + + return ( + + + + {renderSceneContent({ progress: this.progress })} + + + + + + {renderDrawerContent({ progress: this.progress })} + + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + backgroundColor: 'white', + position: 'absolute', + top: 0, + bottom: 0, + width: '80%', + maxWidth: '100%', + }, + overlay: { + ...StyleSheet.absoluteFillObject, + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + content: { + flex: 1, + }, + main: { + flex: 1, + overflow: 'hidden', + }, +}); diff --git a/packages/drawer/src/views/DrawerView.tsx b/packages/drawer/src/views/DrawerView.tsx index 56610325..c00732c2 100644 --- a/packages/drawer/src/views/DrawerView.tsx +++ b/packages/drawer/src/views/DrawerView.tsx @@ -1,30 +1,28 @@ import * as React from 'react'; -import { Dimensions, StyleSheet, ViewStyle, Animated } from 'react-native'; +import { Dimensions, StyleSheet, ViewStyle } from 'react-native'; import { SceneView } from '@react-navigation/core'; -import DrawerLayout from 'react-native-gesture-handler/DrawerLayout'; import { ScreenContainer } from 'react-native-screens'; import * as DrawerActions from '../routers/DrawerActions'; import DrawerSidebar, { ContentComponentProps } from './DrawerSidebar'; import DrawerGestureContext from '../utils/DrawerGestureContext'; -import ResourceSavingScene from '../views/ResourceSavingScene'; +import ResourceSavingScene from './ResourceSavingScene'; +import Drawer from './Drawer'; import { Navigation } from '../types'; +import { PanGestureHandler } from 'react-native-gesture-handler'; type DrawerOptions = { drawerBackgroundColor?: string; overlayColor?: string; minSwipeDistance?: number; drawerPosition: 'left' | 'right'; + drawerType: 'front' | 'back' | 'slide'; drawerLockMode?: 'unlocked' | 'locked-closed' | 'locked-open'; keyboardDismissMode?: 'on-drag' | 'none'; - drawerType: 'front' | 'back' | 'slide'; drawerWidth: number | (() => number); statusBarAnimation: 'slide' | 'none' | 'fade'; - useNativeAnimations?: boolean; onDrawerClose?: () => void; onDrawerOpen?: () => void; - onDrawerStateChanged?: () => void; - drawerContainerStyle?: ViewStyle; contentContainerStyle?: ViewStyle; edgeWidth: number; hideStatusBar?: boolean; @@ -82,90 +80,36 @@ export default class DrawerView extends React.PureComponent { }; componentDidMount() { - Dimensions.addEventListener('change', this._updateWidth); - } - - componentDidUpdate(prevProps: Props) { - const { - openId, - closeId, - toggleId, - isDrawerOpen, - } = this.props.navigation.state; - const { - openId: prevOpenId, - closeId: prevCloseId, - toggleId: prevToggleId, - } = prevProps.navigation.state; - - let prevIds = [prevOpenId, prevCloseId, prevToggleId]; - let changedIds = [openId, closeId, toggleId] - .filter(id => !prevIds.includes(id)) - // @ts-ignore - .sort((a, b) => a > b); - - changedIds.forEach(id => { - if (id === openId) { - this._drawer.openDrawer(); - } else if (id === closeId) { - this._drawer.closeDrawer(); - } else if (id === toggleId) { - if (isDrawerOpen) { - this._drawer.closeDrawer(); - } else { - this._drawer.openDrawer(); - } - } - }); + Dimensions.addEventListener('change', this.updateWidth); } componentWillUnmount() { - Dimensions.removeEventListener('change', this._updateWidth); + Dimensions.removeEventListener('change', this.updateWidth); } - _drawer: typeof DrawerLayout; + private drawerGestureRef = React.createRef(); - drawerGestureRef = React.createRef(); + private handleDrawerOpen = () => { + const { navigation } = this.props; - _handleDrawerStateChange = (newState: string, willShow: boolean) => { - if (newState === 'Idle') { - if (!this.props.navigation.state.isDrawerIdle) { - this.props.navigation.dispatch({ - type: DrawerActions.MARK_DRAWER_IDLE, - key: this.props.navigation.state.key, - }); - } - } else if (newState === 'Settling') { - this.props.navigation.dispatch({ - type: DrawerActions.MARK_DRAWER_SETTLING, - key: this.props.navigation.state.key, - willShow, - }); - } else { - if (this.props.navigation.state.isDrawerIdle) { - this.props.navigation.dispatch({ - type: DrawerActions.MARK_DRAWER_ACTIVE, - key: this.props.navigation.state.key, - }); - } - } + navigation.dispatch( + DrawerActions.openDrawer({ + key: navigation.state.key, + }) + ); }; - _handleDrawerOpen = () => { - this.props.navigation.dispatch({ - type: DrawerActions.DRAWER_OPENED, - key: this.props.navigation.state.key, - }); + private handleDrawerClose = () => { + const { navigation } = this.props; + + navigation.dispatch( + DrawerActions.closeDrawer({ + key: navigation.state.key, + }) + ); }; - _handleDrawerClose = () => { - this.props.navigation.dispatch({ - type: DrawerActions.DRAWER_CLOSED, - key: this.props.navigation.state.key, - }); - }; - - _updateWidth = () => { + private updateWidth = () => { const drawerWidth = typeof this.props.navigationConfig.drawerWidth === 'function' ? this.props.navigationConfig.drawerWidth() @@ -176,27 +120,23 @@ export default class DrawerView extends React.PureComponent { } }; - _renderNavigationView = ( - drawerOpenProgress: Animated.AnimatedInterpolation - ) => { + private renderNavigationView = ({ progress }: any) => { return ( - - - + ); }; - _renderContent = () => { + private renderContent = () => { let { lazy, navigation } = this.props; let { loaded } = this.state; let { routes } = navigation.state; @@ -214,7 +154,7 @@ export default class DrawerView extends React.PureComponent { ); } else { return ( - + {routes.map((route, index) => { if (lazy && !loaded.includes(index)) { // Don't render a screen if we've never navigated to it @@ -246,67 +186,68 @@ export default class DrawerView extends React.PureComponent { } }; - _setDrawerGestureRef = (ref: any) => { + private setDrawerGestureRef = (ref: PanGestureHandler | null) => { // @ts-ignore this.drawerGestureRef.current = ref; }; render() { - const { navigation, screenProps } = this.props; + const { navigation } = this.props; + const { + drawerType, + drawerBackgroundColor, + overlayColor, + contentContainerStyle, + edgeWidth, + minSwipeDistance, + hideStatusBar, + statusBarAnimation, + } = this.props.navigationConfig; const activeKey = navigation.state.routes[navigation.state.index].key; const { drawerLockMode } = this.props.descriptors[activeKey].options; + const isOpen = + drawerLockMode === 'locked-closed' + ? false + : drawerLockMode === 'locked-open' + ? true + : this.props.navigation.state.isDrawerOpen; + return ( - { - this._drawer = c; - }} - onGestureRef={this._setDrawerGestureRef} - drawerLockMode={ - drawerLockMode || - (typeof screenProps === 'object' && - screenProps != null && - // @ts-ignore - screenProps.drawerLockMode) || - this.props.navigationConfig.drawerLockMode - } - drawerBackgroundColor={ - this.props.navigationConfig.drawerBackgroundColor - } - keyboardDismissMode={this.props.navigationConfig.keyboardDismissMode} - drawerWidth={this.state.drawerWidth} - onDrawerOpen={this._handleDrawerOpen} - onDrawerClose={this._handleDrawerClose} - onDrawerStateChanged={this._handleDrawerStateChange} - useNativeAnimations={this.props.navigationConfig.useNativeAnimations} - renderNavigationView={this._renderNavigationView} - drawerPosition={ - this.props.navigationConfig.drawerPosition === 'right' - ? DrawerLayout.positions.Right - : DrawerLayout.positions.Left - } - /* props specific to react-native-gesture-handler/DrawerLayout */ - drawerType={this.props.navigationConfig.drawerType} - edgeWidth={this.props.navigationConfig.edgeWidth} - hideStatusBar={this.props.navigationConfig.hideStatusBar} - statusBarAnimation={this.props.navigationConfig.statusBarAnimation} - minSwipeDistance={this.props.navigationConfig.minSwipeDistance} - overlayColor={this.props.navigationConfig.overlayColor} - drawerContainerStyle={this.props.navigationConfig.drawerContainerStyle} - contentContainerStyle={ - this.props.navigationConfig.contentContainerStyle - } - > - - {this._renderContent()} - - + + + ); } } const styles = StyleSheet.create({ - pages: { + content: { flex: 1, }, }); diff --git a/packages/drawer/types/react-native-gesture-handler.d.ts b/packages/drawer/types/react-native-gesture-handler.d.ts deleted file mode 100644 index 907266a2..00000000 --- a/packages/drawer/types/react-native-gesture-handler.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'react-native-gesture-handler/DrawerLayout'; diff --git a/packages/drawer/yarn.lock b/packages/drawer/yarn.lock index d56e5078..5b011dff 100644 --- a/packages/drawer/yarn.lock +++ b/packages/drawer/yarn.lock @@ -198,7 +198,14 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== @@ -238,6 +245,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== +"@babel/parser@^7.1.2": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" + integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== + "@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" @@ -614,7 +626,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": +"@babel/template@^7.0.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== @@ -623,6 +635,15 @@ "@babel/parser" "^7.4.0" "@babel/types" "^7.4.0" +"@babel/template@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" @@ -638,7 +659,16 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": +"@babel/types@^7.0.0", "@babel/types@^7.1.2": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" + integrity sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== @@ -655,6 +685,137 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@commitlint/cli@^7.5.2": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-7.5.2.tgz#2475cd8f7ed3b2f9c2ab96c06bc24d61d23f8716" + integrity sha512-UQdW/wNb+XeANoYYLyuKEDIfWKSzdhJkPQZ8ie/IjfMNnsP+B23bkX4Ati+6U8zgz0yyngoxWl+3lfExiIL4hQ== + dependencies: + "@commitlint/format" "^7.5.0" + "@commitlint/lint" "^7.5.2" + "@commitlint/load" "^7.5.0" + "@commitlint/read" "^7.5.0" + babel-polyfill "6.26.0" + chalk "2.3.1" + get-stdin "5.0.1" + lodash "4.17.11" + meow "5.0.0" + resolve-from "4.0.0" + resolve-global "0.1.0" + +"@commitlint/config-conventional@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-7.5.0.tgz#3afd4e3e34e5c2f6ec6af03e78ae924fed883ce7" + integrity sha512-odLgBfQ5xntFAmMfAmDY2C4EWhW+cSTbvbsRS7seb55DCa3IaxxSHHC9eXrR+hN/BdUT5vqAxdX1PkR996sq9Q== + +"@commitlint/ensure@^7.5.2": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-7.5.2.tgz#57bb7dcbf1e9913e27c3b294325d0d68dd14cebf" + integrity sha512-ZMJKHhSJC789chKy0kWp8EWbCpLPy6vKa+fopUVx+tWL7H8AeBbibXlqAnybg+HWNcb/RD7ORROx0IsgrK4IYA== + dependencies: + lodash "4.17.11" + +"@commitlint/execute-rule@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-7.5.0.tgz#c9cfbab71eb962e1c46e78d76375e32754ab1e38" + integrity sha512-K66aoly8mxSHmBA/Y8bKSPPcCAR4GpJEsvHaLDYOG7GsyChu8NgCD53L8GUqPW8lBCWwnmCiSL+RlOkNHJ0Gag== + dependencies: + babel-runtime "6.26.0" + +"@commitlint/format@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-7.5.0.tgz#57a2b92dc58a3409b2be67c4c8c10bd1b28e9fe8" + integrity sha512-DEeQXfTLUm9kARliCBfw3SlQRAYjK2aXeRAUMs1HPhLA2tjNFFGv6LOpFFNdiu/WV+o1ojcgIvBBjpHaVT+Tvw== + dependencies: + babel-runtime "^6.23.0" + chalk "^2.0.1" + +"@commitlint/is-ignored@^7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-7.5.1.tgz#c4f7ffc1c8b4cf9dc3204d22ef8e78ff82536d67" + integrity sha512-8JZCgy6bWSnjOT5cTTiyEAGp+Y4+5CUknhVbyiPxTRbjy6yF0aMKs1gMTfHrNHTKsasgmkCyPQd4C2eOPceuKA== + dependencies: + semver "5.6.0" + +"@commitlint/lint@^7.5.2": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-7.5.2.tgz#26cb819c74f8770413c4f6ef1e7abf1b739eda77" + integrity sha512-DY/UfGFDquMno+5c6+tE50rMxpjdQK3CRG+nktgYlVz1UAqeUD+bRc3pvX5HwAsuGvyDrWAjtszHtEDeYJKcjw== + dependencies: + "@commitlint/is-ignored" "^7.5.1" + "@commitlint/parse" "^7.5.0" + "@commitlint/rules" "^7.5.2" + babel-runtime "^6.23.0" + lodash "4.17.11" + +"@commitlint/load@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-7.5.0.tgz#2b225b97d631c2235d8b2084bc2fefb4d4d66719" + integrity sha512-fhBER/rzPsteM6zq5qqMiOi+A2bHKCE/0PKmOzYgaqTKcG9c1SsOle9phPemW85to8Gxd2YgUOVLsZkCMltLtA== + dependencies: + "@commitlint/execute-rule" "^7.5.0" + "@commitlint/resolve-extends" "^7.5.0" + babel-runtime "^6.23.0" + cosmiconfig "^4.0.0" + lodash "4.17.11" + resolve-from "^4.0.0" + +"@commitlint/message@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-7.5.0.tgz#2572fad648c769dd210374c8b95fb37124302bc5" + integrity sha512-5YOhsqy/MgHH7vyDsmmzO6Jr3ygr1pXbCm9NR3XB51wjg55Kd6/6dVlkhS/FmDp99pfwTdHb0TyeDFEjP98waw== + +"@commitlint/parse@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-7.5.0.tgz#d9374266493e5229ec61d92316d28e02419c600f" + integrity sha512-hWASM8SBFTBtlFkKrEtD1qW6yTe2BsfoRiMKuYyRCTd+739TUF17og5vgQVuWttbGP0gXaciW44NygS2YjZmfA== + dependencies: + conventional-changelog-angular "^1.3.3" + conventional-commits-parser "^2.1.0" + lodash "^4.17.11" + +"@commitlint/read@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-7.5.0.tgz#35d563b0f3075da2ce6945978996b16fb4acb0f8" + integrity sha512-uqGFCKZGnBUCTkxoCCJp4MfWUkegXkyT0T0RVM9diyG6uNWPWlMH1509sjLFlyeJKG+cSyYGG/d6T103ScMb4Q== + dependencies: + "@commitlint/top-level" "^7.5.0" + "@marionebl/sander" "^0.6.0" + babel-runtime "^6.23.0" + git-raw-commits "^1.3.0" + +"@commitlint/resolve-extends@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-7.5.0.tgz#d95a3058e83ddbaef5e3045835b9a3a1fba3422c" + integrity sha512-FRIyPuqGvGa03OT4VgOHakizcw8YR5rdm77JsZff1rSnpxk6i+025I6qMeHqCIr5FaVIA0kR3FlC+MJFUs165A== + dependencies: + babel-runtime "6.26.0" + import-fresh "^3.0.0" + lodash "4.17.11" + resolve-from "^4.0.0" + resolve-global "^0.1.0" + +"@commitlint/rules@^7.5.2": + version "7.5.2" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-7.5.2.tgz#da03d754625b2e67c0a6b8b9ab89eae1952a4f2e" + integrity sha512-eDN1UFPcBOjdnlI3syuo7y99SjGH/dUV6S9NvBocAye8ln5dfKiI2shhWochJhl36r/kYWU8Wrvl2NZJL3c52g== + dependencies: + "@commitlint/ensure" "^7.5.2" + "@commitlint/message" "^7.5.0" + "@commitlint/to-lines" "^7.5.0" + babel-runtime "^6.23.0" + +"@commitlint/to-lines@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-7.5.0.tgz#a24410d25bb85a5fff3b8d610277b3145f899766" + integrity sha512-ZQ3LxPNuQ/J7q42hkiPWN5fUIjWae85H2HHoBB+/Rw1fo+oehvr4Xyt+Oa9Mx5WbBnev/wXnUFjXgoadv1RZ5A== + +"@commitlint/top-level@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-7.5.0.tgz#01e740167e3d15110794192cd754f49f27d4a16d" + integrity sha512-oTu185GufTYHjTXPHu6k6HL7iuASOvDOtQizZWRSxj0VXuoki6e0HzvGZsRsycDTOn04Q9hVu+PhF83IUwRpeg== + dependencies: + find-up "^2.1.0" + "@expo/vector-icons@^10.0.1": version "10.0.1" resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-10.0.1.tgz#dbb0a9ab68b53aa6cbbc04b48421e4db862535d9" @@ -806,10 +967,19 @@ "@types/istanbul-lib-coverage" "^2.0.0" "@types/yargs" "^12.0.9" -"@react-native-community/bob@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@react-native-community/bob/-/bob-0.3.3.tgz#ffcf7a16b773722b8c69345d9f5d822458f44529" - integrity sha512-v6FHHwOBIx6BH5Wxm0YfESZH7qyRpSj8CXYBgepGDUKKp8gxGYSjsJHnYZjoJgki0JjVLmGTHozJ8sFHBLwxww== +"@marionebl/sander@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" + integrity sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s= + dependencies: + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +"@react-native-community/bob@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@react-native-community/bob/-/bob-0.3.4.tgz#dd04498cf8edc8ae515f32eb63413f5aa83a72f8" + integrity sha512-esZGZwcwuwTm8bAp33jtzvPfPfVpt+wxDl0mlaLuTceao/aeAGs0XPm51SZkPnc4HOv4YBiDJBlc3HWXcadu+g== dependencies: "@babel/core" "^7.4.0" chalk "^2.4.2" @@ -822,20 +992,20 @@ metro-react-native-babel-preset "^0.53.1" yargs "^13.2.2" -"@react-navigation/core@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.3.0.tgz#a8fa76e1c2a0da588da3d94ec9ea0956b7df753e" - integrity sha512-jCtvNnJu6CBctIvaGzL82xedWG0IQv+URwZfKQSkoUgiFViSsUhoDWHgnoRXAlWvR8Js7au3hrC/Cwshwhi9/w== +"@react-navigation/core@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.4.0.tgz#776845f9d4f8b2b9cb99c5d2d4433ebcef290d92" + integrity sha512-YAnx9mK6P/zYkvn4YxZL6thaNdouSmD7FUaftFrOAbE7y7cCfH8hmk7BOLoOet6Sh2+UnrpkWX7Kg54cT2Jw+g== dependencies: - hoist-non-react-statics "^2.5.5" + hoist-non-react-statics "^3.3.0" path-to-regexp "^1.7.0" - query-string "^6.2.0" - react-is "^16.6.3" + query-string "^6.4.2" + react-is "^16.8.6" -"@react-navigation/native@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.3.0.tgz#def7a94ef17581a404a3de2a3200f986e999dac1" - integrity sha512-w/+2B0qX441BpNkYb5QoPY8+Q4Q18adGTahVpc6o8Juj6odAxyIJ2RozXk7dCpN/w0dz4B+5ggqMKHVniE6K7w== +"@react-navigation/native@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.4.1.tgz#e1fbf334ac834a9f10dd7d9c3af3e36939486089" + integrity sha512-pMAPQfvwC4DvhQfsrXKAf+FiU+A5XAh216v17rEePSFcbeOEt7cvewmWxCxydN/vFjJChFiPV+xnjJyJBdPLOg== dependencies: hoist-non-react-statics "^3.0.1" react-native-safe-area-view "^0.13.0" @@ -896,10 +1066,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.0.tgz#4c48fed958d6dcf9487195a0ef6456d5f6e0163a" integrity sha512-eItQyV43bj4rR3JPV0Skpl1SncRCdziTEK9/v8VwXmV6d/qOUO8/EuWeHBbCZcsfSHfzI5UyMJLCSXtxxznyZg== -"@types/react-native@^0.57.43": - version "0.57.43" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.57.43.tgz#a4d3fa7be905a8e28b7682220335dacefffd816f" - integrity sha512-hYt5a+Kj/Cy0102b+WZpNhnm1AWNz6HnVYwk41BSDZpDoJweo1BuJv1FStd6ClzCdTPJlfImF8ZqpM2xDoO2aA== +"@types/react-native@^0.57.49": + version "0.57.49" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.57.49.tgz#eef43fba8149c6591201edcde9930cb30169b97f" + integrity sha512-Qv9goNNMTMo/KQNV6KrkJkRi8+X+JnkVws3ST1yW//iloRqkxreYHxQb0aFFXI+Cj/TRsEimszK82eujBn4wNw== dependencies: "@types/prop-types" "*" "@types/react" "*" @@ -956,6 +1126,14 @@ lodash.unescape "4.0.1" semver "5.5.0" +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -993,16 +1171,21 @@ acorn-jsx@^5.0.0: integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== acorn-walk@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + version "6.1.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.0.tgz#c957f4a1460da46af4a0388ce28b4c99355b0cbc" + integrity sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg== acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.7: +acorn@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" + integrity sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg== + +acorn@^6.0.7: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== @@ -1167,6 +1350,16 @@ array-filter@~0.0.0: resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + array-includes@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" @@ -1327,6 +1520,15 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-polyfill@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + babel-preset-fbjs@^3.0.1, babel-preset-fbjs@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz#c0e6347d3e0379ed84b3c2434d3467567aa05297" @@ -1368,6 +1570,14 @@ babel-preset-jest@^24.6.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.6.0" +babel-runtime@6.26.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + bail@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3" @@ -1535,6 +1745,15 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1564,6 +1783,15 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +chalk@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1716,11 +1944,28 @@ commander@~2.13.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commitlint@^7.5.2: + version "7.5.2" + resolved "https://registry.yarnpkg.com/commitlint/-/commitlint-7.5.2.tgz#75ebee72175e451f37132113d410f095ea24c56c" + integrity sha512-AnLHmX0E8Y+MulPGOWFwSPG02kKd3GI0daQ7GeJ8blKo+2OrgBRPbnU70vV6rcdz2lwe5pE+shlu8Dx9ftIoxA== + dependencies: + "@commitlint/cli" "^7.5.2" + read-pkg "3.0.0" + resolve-pkg "1.0.0" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + compare-versions@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" @@ -1786,6 +2031,27 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= +conventional-changelog-angular@^1.3.3: + version "1.6.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" + integrity sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg== + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-commits-parser@^2.1.0: + version "2.1.7" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e" + integrity sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.0" + lodash "^4.2.1" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + trim-off-newlines "^1.0.0" + convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -1803,7 +2069,7 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.2, core-js@^2.4.1: +core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: version "2.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== @@ -1818,6 +2084,16 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" + cosmiconfig@^5.0.5, cosmiconfig@^5.0.7, cosmiconfig@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" @@ -1874,6 +2150,20 @@ csstype@^2.2.0: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.3.tgz#b701e5968245bf9b08d54ac83d00b624e622a9fa" integrity sha512-rINUZXOkcBmoHWEyu7JdHu5JMzkGRoMX4ov9830WNgxf5UYxcBUO0QTKAqeJ5EZfSdlrcJYkC8WwfVW7JYi4yg== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dargs@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= + dependencies: + number-is-nan "^1.0.0" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1904,7 +2194,15 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.2.0: +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2046,6 +2344,13 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -2103,7 +2408,7 @@ errorhandler@^1.5.0: accepts "~1.3.3" escape-html "~1.0.3" -es-abstract@^1.11.0, es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.11.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -2115,7 +2420,18 @@ es-abstract@^1.11.0, es-abstract@^1.5.1, es-abstract@^1.7.0: is-regex "^1.0.4" object-keys "^1.0.12" -es-to-primitive@^1.2.0: +es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1, es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== @@ -2905,6 +3221,11 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-stdin@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -2934,6 +3255,17 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-raw-commits@^1.3.0: + version "1.3.6" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff" + integrity sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg== + dependencies: + dargs "^4.0.1" + lodash.template "^4.0.2" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -2949,7 +3281,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -2961,6 +3293,13 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + global@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" @@ -2969,7 +3308,12 @@ global@^4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" + integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== + +globals@^11.7.0: version "11.11.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== @@ -2985,7 +3329,12 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + +graceful-fs@^4.1.15: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -3079,12 +3428,12 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" -hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.5: +hoist-non-react-statics@^2.3.1: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.0.1: +hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== @@ -3196,6 +3545,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3209,7 +3563,7 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -3307,7 +3661,7 @@ is-buffer@^1.1.4, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4: +is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== @@ -3459,6 +3813,11 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-obj@^1.0.0: + version "1.0.1" + 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.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.0.0.tgz#d4777a8e227a00096a31f030db3770f84b116c02" @@ -3524,6 +3883,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-text-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -4050,7 +4416,7 @@ jest@^24.7.1: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.13.0: +js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -4168,6 +4534,11 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4294,6 +4665,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + lodash.pad@^4.1.0: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" @@ -4314,6 +4690,21 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.template@^4.0.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -4324,7 +4715,7 @@ lodash.unescape@4.0.1: resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= -lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: +lodash@4.17.11, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.6.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -4336,6 +4727,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -4378,6 +4777,16 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -4411,6 +4820,36 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" +meow@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +meow@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist "^1.1.3" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -4751,12 +5190,20 @@ minimatch@^3.0.3, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.1, minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -4931,7 +5378,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -5314,7 +5761,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -5456,10 +5903,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.16.4: - 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.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.0.tgz#53b303676eed22cc14a9f0cec09b477b3026c008" + integrity sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw== pretty-format@^23.4.1: version "23.6.0" @@ -5469,7 +5916,7 @@ pretty-format@^23.4.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -pretty-format@^24.7.0: +pretty-format@^24.0.0, pretty-format@^24.7.0: version "24.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== @@ -5556,12 +6003,17 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^6.2.0: +query-string@^6.4.2: version "6.4.2" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.4.2.tgz#8be1dbd105306aebf86022144f575a29d516b713" integrity sha512-DfJqAen17LfLA3rQ+H5S4uXphrF+ANU1lT2ijds4V/Tj4gZxA3gx5/tg1bz7kYCmwna7LyJNCYqO7jNRzo3aLw== @@ -5570,6 +6022,11 @@ query-string@^6.2.0: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -5622,7 +6079,7 @@ react-dom@16.5.0: prop-types "^15.6.2" schedule "^0.3.0" -react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== @@ -5641,6 +6098,11 @@ react-native-gesture-handler@^1.1.0: invariant "^2.2.2" prop-types "^15.5.10" +react-native-reanimated@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-1.0.1.tgz#5ecb6a2f6dad0351077ac9b771ca943b7ad6feda" + integrity sha512-RENoo6/sJc3FApP7vJ1Js7WyDuTVh97bbr5aMjJyw3kqpR2/JDHyL/dQFfOvSSAc+VjitpR9/CfPPad7tLRiIA== + react-native-safe-area-view@^0.13.0: version "0.13.1" resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.13.1.tgz#834bbb6d22f76a7ff07de56725ee5667ba1386b0" @@ -5648,11 +6110,23 @@ react-native-safe-area-view@^0.13.0: dependencies: hoist-non-react-statics "^2.3.1" -"react-native-screens@^1.0.0 || ^1.0.0-alpha", react-native-screens@^1.0.0-alpha.22: +"react-native-screens@^1.0.0 || ^1.0.0-alpha": + version "1.0.0-alpha.19" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-1.0.0-alpha.19.tgz#ecf3c9023e169b7013266d40b9c5599f37667f6d" + integrity sha512-+a7GdwzLWYWYVUJMg+XuyBoRFGD8GdGyBfebuTNBY+xwUZpTXCaK/GlLGL6EE3h0iBHZu83do7zViEailWRNyA== + +react-native-screens@^1.0.0-alpha.22: version "1.0.0-alpha.22" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-1.0.0-alpha.22.tgz#7a120377b52aa9bbb94d0b8541a014026be9289b" integrity sha512-kSyAt0AeVU6N7ZonfV6dP6iZF8B7Bce+tk3eujXhzBGsLg0VSLnU7uE9VqJF0xdQrHR91ZjGgVMieo/8df9KTA== +react-native-testing-library@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/react-native-testing-library/-/react-native-testing-library-1.7.0.tgz#8b53d5361faaa276bf67cd0e50dab1d2e26754ad" + integrity sha512-aciXmBjZ8GXbkgwBTyXUBSUBqYyIa/m+mZM3ZqU44pfeu+LihuvpljucSQaUutbUEywKb2sgEJWeS8GwEBa09w== + dependencies: + pretty-format "^24.0.0" + react-native@~0.57.1: version "0.57.8" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.57.8.tgz#1a840fbe144cd3902cc14313a783ce28efc48cb9" @@ -5760,6 +6234,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -5768,6 +6250,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg@3.0.0, read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -5777,15 +6268,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -5815,6 +6297,14 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + regenerate-unicode-properties@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" @@ -5827,6 +6317,11 @@ regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -5976,6 +6471,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -5998,15 +6498,34 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-from@4.0.0, resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-global@0.1.0, resolve-global@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-0.1.0.tgz#8fb02cfd5b7db20118e886311f15af95bd15fbd9" + integrity sha1-j7As/Vt9sgEY6IYxHxWvlb0V+9k= + dependencies: + global-dirs "^0.1.0" + +resolve-pkg@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-1.0.0.tgz#e19a15e78aca2e124461dc92b2e3943ef93494d9" + integrity sha1-4ZoV54rKLhJEYdySsuOUPvk0lNk= + dependencies: + resolve-from "^2.0.0" resolve-url@^0.2.1: version "0.2.1" @@ -6018,13 +6537,20 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.8.1, resolve@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" +resolve@^1.3.2, resolve@^1.5.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + dependencies: + path-parse "^1.0.5" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -6038,13 +6564,20 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2.6.3, rimraf@^2.5.2, 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== dependencies: glob "^7.1.3" +rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -6179,6 +6712,11 @@ semver@5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +semver@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -6415,6 +6953,13 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split2@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -6562,6 +7107,11 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6572,7 +7122,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0: +supports-color@^5.2.0, supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -6632,6 +7182,11 @@ test-exclude@^5.0.0: read-pkg-up "^4.0.0" require-main-filename "^1.0.1" +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6642,7 +7197,7 @@ throat@^4.0.0, throat@^4.1.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -through2@^2.0.0: +through2@^2.0.0, through2@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -6650,7 +7205,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: +"through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -6725,6 +7280,16 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -6786,10 +7351,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.3.tgz#0eb320e4ace9b10eadf5bc6103286b0f8b7c224f" - integrity sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ== +typescript@^3.4.5: + version "3.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" + integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== ua-parser-js@^0.7.18: version "0.7.19" @@ -7256,6 +7821,13 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"