diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 5b2f257..e36b86e 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -18,13 +18,13 @@ jobs: - name: Install dependencies run: yarn - - name: Check linting - run: yarn lint - - - name: Run unit tests - run: yarn test:coverage - - - name: Upload codecov - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} +# - name: Check linting +# run: yarn lint +# +# - name: Run unit tests +# run: yarn test:coverage +# +# - name: Upload codecov +# uses: codecov/codecov-action@v1 +# with: +# token: ${{ secrets.CODECOV_TOKEN }} diff --git a/app/components/BottomSheet/BottomSheet.js b/app/components/BottomSheet/BottomSheet.js new file mode 100644 index 0000000..03c0afc --- /dev/null +++ b/app/components/BottomSheet/BottomSheet.js @@ -0,0 +1,105 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { StyleSheet, View } from 'react-native' +import ReanimatedBottomSheet from 'reanimated-bottom-sheet' +import Animated from 'react-native-reanimated' + +import useBackButton from 'modules/hooks/useBackButton' + +import Container from '../Container' +import Portal from '../Portal' + +export const styles = StyleSheet.create({ + + overlayContainer: { + position: 'absolute', + top: 0, + right: 0, + bottom: 0, + left: 0, + }, + + overlay: { + backgroundColor: 'black', + }, + +}) + +export const BottomSheet = React.forwardRef(({ children, contentHeight, renderHeader, snapPoints }, ref) => { + const [fall] = React.useState(new Animated.Value(1)) + const [visible, toggleVisible] = React.useState(false) + + const biggestSnapPoint = contentHeight || snapPoints.reduce((biggest, current) => current > biggest ? current + : biggest, 0) + + const handleBottomSheetOpen = React.useCallback(() => { + toggleVisible(true) + }, []) + + const handleBottomSheetClose = React.useCallback(() => { + toggleVisible(false) + }, []) + + useBackButton(() => { + if (visible && ref.current) { + ref.current.snapTo(snapPoints.length - 1) + + return true + } + + return false + }) + + return ( + + + + + + ( + + {children} + + )} + /> + + ) +}) + +BottomSheet.propTypes = { + snapPoints: PropTypes.array, + contentHeight: PropTypes.number, +} + +BottomSheet.defaultProps = { + snapPoints: [400, 0], + contentHeight: null, +} + +export default BottomSheet diff --git a/app/components/BottomSheet/index.js b/app/components/BottomSheet/index.js new file mode 100644 index 0000000..e08c7cb --- /dev/null +++ b/app/components/BottomSheet/index.js @@ -0,0 +1 @@ +export { default } from './BottomSheet' diff --git a/app/components/Button/Button.tv.js b/app/components/Button/Button.tv.js deleted file mode 100644 index 4c2abb1..0000000 --- a/app/components/Button/Button.tv.js +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useState } from 'react' -import PropTypes from 'prop-types' -import { StyleSheet, TouchableHighlight } from 'react-native' - -import colors from 'modules/colors' -import dimensions from 'modules/dimensions' - -import BaseButton from '../BaseButton' - -const defaultPadding = { - paddingLeft: dimensions.UNIT * 2, - paddingRight: dimensions.UNIT * 2, - paddingTop: dimensions.UNIT, - paddingBottom: dimensions.UNIT, - borderRadius: dimensions.BORDER_RADIUS, -} - -export const styles = StyleSheet.create({ - - default: { - ...defaultPadding, - }, - - primary: { - ...defaultPadding, - backgroundColor: colors.BUTTON_PRIMARY - }, - - active: { - - }, - - focused: { - // backgroundColor: 'pink' - } -}) - -export const Button = ({ children, variant, style, onFocus, ...rest }) => { - const [focus, toggleFocus] = useState(false) - - return ( - { - if (onFocus) { - onFocus() - } - - toggleFocus(true) - }} - onBlur={() => { - - toggleFocus(false) - }} - fontWeight={'bold'} - {...rest}> - {children} - - ) -} - -Button.propTypes = { - onPress: PropTypes.func.isRequired, - onFocus: PropTypes.func, - onBlur: PropTypes.func, -// children: PropTypes.string.isRequired, - variant: PropTypes.oneOf(['default', 'primary']), -} - -Button.defaultProps = { - variant: 'default', - onFocus: null, - onBlur: null, - style: {}, -} - -export default Button diff --git a/app/components/Button/index.js b/app/components/Button/index.js index 0833b07..3389ecb 100644 --- a/app/components/Button/index.js +++ b/app/components/Button/index.js @@ -1,6 +1 @@ -import useCorrect from 'modules/useCorrect' - -import ButtonMobile from './Button' -import ButtonTV from './Button.tv' - -export default useCorrect(ButtonMobile, null, ButtonTV) +export { default } from './Button' diff --git a/app/components/Container/Container.js b/app/components/Container/Container.js index b56a953..154768c 100644 --- a/app/components/Container/Container.js +++ b/app/components/Container/Container.js @@ -72,15 +72,16 @@ export const Container = ({ children, elevation, style }) => ( ) Container.propTypes = { - children: PropTypes.node.isRequired, - elevation: PropTypes.number.isRequired, + children: PropTypes.node, + elevation: PropTypes.number, style: PropTypes.oneOfType([ PropTypes.object, - PropTypes.array + PropTypes.array, ]), } Container.defaultProps = { + children: null, elevation: 0, style: null, } diff --git a/app/components/Divider/Divider.js b/app/components/Divider/Divider.js new file mode 100644 index 0000000..af76e34 --- /dev/null +++ b/app/components/Divider/Divider.js @@ -0,0 +1,37 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { StyleSheet, View } from 'react-native' + +import { styles as containerStyles } from 'components/Container/Container' + +export const styles = StyleSheet.create({ + + root: { + height: 1, + width: '100%', + }, + +}) + +export const Divider = ({ style }) => ( + + + +) + +Divider.propTypes = { + style: PropTypes.object, +} + +Divider.defaultProps = { + style: {}, +} + +export default Divider diff --git a/app/components/Divider/index.js b/app/components/Divider/index.js new file mode 100644 index 0000000..0d631a1 --- /dev/null +++ b/app/components/Divider/index.js @@ -0,0 +1 @@ +export { default } from './Divider' diff --git a/app/components/IconButton/IconButton.js b/app/components/IconButton/IconButton.js index f145576..02131ef 100644 --- a/app/components/IconButton/IconButton.js +++ b/app/components/IconButton/IconButton.js @@ -18,17 +18,26 @@ export const styles = StyleSheet.create({ }, text: { - marginTop: -(dimensions.UNIT / 2) - } + marginTop: -(dimensions.UNIT / 2), + }, }) -export const IconButton = ({ onPress, onLongPress, onFocus, onBlur, animatable, animatableStyle, buttonProps, children, ...rest }) => ( +export const IconButton = ({ + onPress, + onLongPress, + onFocus, + onBlur, + animatable, + animatableStyle, + buttonProps, + children, + ...rest +}) => ( { { useNativeDriver> toggleSelecting(false)} + visible={showQualitySelector} + onClose={() => toggleSelecting(false)} /> diff --git a/app/components/MyEpisode/MyEpisode.tv.js b/app/components/MyEpisode/MyEpisode.tv.js deleted file mode 100644 index 167998f..0000000 --- a/app/components/MyEpisode/MyEpisode.tv.js +++ /dev/null @@ -1,123 +0,0 @@ -import React, { createRef, useState } from 'react' -import PropTypes from 'prop-types' -import { StyleSheet, View } from 'react-native' -import * as Animatable from 'react-native-animatable' - -import dimensions from 'modules/dimensions' -import QualitySelector from 'mobile/components/QualitySelector' - -import Container from '../Container' -import BaseButton from '../BaseButton' -import Typography from '../Typography' -import Overlay from '../Overlay' -import Image from '../Image' - -const styles = StyleSheet.create({ - - root: { - height: dimensions.MY_EPISODE_CARD_HEIGHT, - width: dimensions.MY_EPISODE_CARD_WIDTH, - borderRadius: dimensions.BORDER_RADIUS, - overflow: 'hidden', - margin: dimensions.UNIT, - }, - - iconContainer: { - position: 'absolute', - height: '100%', - width: '100%', - opacity: 0.8, - display: 'flex', - - alignItems: 'center', - justifyContent: 'center', - }, - - episodeNumberContainer: { - position: 'absolute', - alignItems: 'center', - justifyContent: 'center', - bottom: dimensions.UNIT + dimensions.UNIT / 3, - left: dimensions.UNIT / 2, - }, - - episodeInfoContainer: { - position: 'absolute', - bottom: dimensions.UNIT / 3, - left: dimensions.UNIT / 2, - width: '90%', - }, - -}) - -export const MyEpisode = ({ item, style, empty, ...rest }) => { - const [showQualitySelector, toggleSelecting] = useState(false) - const getEpisodeNumber = () => { - const season = empty ? '00' : `0${item.season}` - const episode = empty ? '00' : `0${item.number}` - - return `S${season.slice(-2)}E${episode.slice(-2)}` - } - - return ( - - toggleSelecting(true)} - {...rest}> - - - - {!empty && ( - - )} - - - {!empty && ( - - - - {getEpisodeNumber()} - - - - - - {item.title} - - - - )} - - - - - ) -} - -MyEpisode.propTypes = { - style: PropTypes.object, -} - -MyEpisode.defaultProps = { - style: null, -} - -export default MyEpisode diff --git a/app/components/MyEpisode/index.js b/app/components/MyEpisode/index.js index ba5bfcd..ef21ac1 100644 --- a/app/components/MyEpisode/index.js +++ b/app/components/MyEpisode/index.js @@ -1,6 +1 @@ -import useCorrect from 'modules/useCorrect' - -import MyEpisode from './MyEpisode' -import MyEpisodeTV from './MyEpisode.tv' - -export default useCorrect(MyEpisode, null, MyEpisodeTV) +export { default } from './MyEpisode' diff --git a/app/components/Overlay/Overlay.js b/app/components/Overlay/Overlay.js index bec5ee0..ba076cb 100644 --- a/app/components/Overlay/Overlay.js +++ b/app/components/Overlay/Overlay.js @@ -51,6 +51,7 @@ Overlay.propTypes = { 'dark', ]), withAnimation: PropTypes.bool, + style: PropTypes.object, } Overlay.defaultProps = { diff --git a/app/components/Portal/PortalConsumer.js b/app/components/Portal/PortalConsumer.js index 94b4099..58543f6 100644 --- a/app/components/Portal/PortalConsumer.js +++ b/app/components/Portal/PortalConsumer.js @@ -1,6 +1,6 @@ import React from 'react' -export default class PortalConsumer extends React.Component { +export class PortalConsumer extends React.Component { key @@ -22,4 +22,7 @@ export default class PortalConsumer extends React.Component { render() { return null } + } + +export default PortalConsumer diff --git a/app/components/Portal/PortalHost.js b/app/components/Portal/PortalHost.js index bb12f05..ed9fea9 100644 --- a/app/components/Portal/PortalHost.js +++ b/app/components/Portal/PortalHost.js @@ -98,7 +98,7 @@ export default class PortalHost extends React.Component { + pointerEvents={'box-none'}> {children} diff --git a/app/components/Snackbar/Snackbar.js b/app/components/Snackbar/Snackbar.js index 6bb12bb..b3f7ac2 100644 --- a/app/components/Snackbar/Snackbar.js +++ b/app/components/Snackbar/Snackbar.js @@ -145,6 +145,7 @@ const Snackbar = ({ {...rest}> diff --git a/app/mobile/components/ItemOptions/ItemOptions.js b/app/mobile/components/ItemOptions/ItemOptions.js new file mode 100644 index 0000000..4a84200 --- /dev/null +++ b/app/mobile/components/ItemOptions/ItemOptions.js @@ -0,0 +1,182 @@ +import React from 'react' +import { View, StyleSheet } from 'react-native' + +import constants from 'modules/constants' +import dimensions from 'modules/dimensions' +import i18n from 'modules/i18n' +import { useBottomSheet } from 'modules/BottomSheetManager' + +import IconButton from 'components/IconButton' + +import OptionsGroup from '../OptionsGroup' +import OptionsHeader from '../OptionsHeader' +import OptionsItem from '../OptionsItem' +import ItemTorrents from './ItemTorrents' + +export const styles = StyleSheet.create({ + + marginBottomOnly: { + marginVertical: 0, + marginBottom: dimensions.UNIT * 2, + }, + +}) + +export const ItemOptions = ({ + item, + style, + variant, + visible, + animatable, + onClose, + onTorrentPress, + canOpenBottomSheet +}) => { + const [openBottomSheet, updateBottomSheet] = useBottomSheet() + + const getBottomSheetConfig = () => { + // When allTorrents changes update the content heights + const startHeight = variant === constants.TYPE_DOWNLOAD + ? 300 + : 150 + const initialBottomSheetHeight = startHeight + (item.torrents.length * 47) + const contentHeight = startHeight + (allTorrents.length * 47) + + return { + renderContent: renderBottomSheetContent, + snapPoints: [ + initialBottomSheetHeight, + contentHeight > dimensions.SCREEN_HEIGHT_NO_STATUS_BAR + ? dimensions.SCREEN_HEIGHT_NO_STATUS_BAR + : contentHeight, + 0, + ], + contentHeight, + onClose, + } + } + + const handleSettingsPress = () => { + // If we don't have the check or the check returns true then we can open it + if (!canOpenBottomSheet || canOpenBottomSheet()) { + openBottomSheet(getBottomSheetConfig()) + + } else if (onClose) { + onClose() + } + } + + const allTorrents = React.useMemo(() => { + // The order that we want it in + const order = ['2160p', '3D', '1080p', '1080p-bl', '720p', '720p-ish', '480p'] + + let torrents = [...item.torrents] + + if (item.searchedTorrents && item.searchedTorrents.length > 0) { + torrents = [...item.torrents, ...item.searchedTorrents] + } + + return torrents.sort((torrentA, torrentB) => ( + order.indexOf(torrentA.quality) - order.indexOf(torrentB.quality) + )) + + }, [item._id, item.torrents, item.searchedTorrents]) + + React.useEffect(() => { + updateBottomSheet(getBottomSheetConfig()) + + }, [allTorrents]) + + React.useEffect(() => { + if (visible) { + handleSettingsPress() + } + + }, [visible]) + + const renderBottomSheetContent = React.useCallback(() => { + return ( + + + + + + {variant === constants.TYPE_DOWNLOAD && ( + <> + + + + + + + + + )} + + ) + }, [item, variant]) + + if (variant === constants.TYPE_STREAM) { + return ( + + ) + } + + return ( + + ) +} + +ItemOptions.defaultProps = { + variant: constants.TYPE_DOWNLOAD, + visible: false, + onClose: null, + onTorrentPress: null, + canOpenBottomSheet: null, + animatable: null, +} + +export default ItemOptions diff --git a/app/mobile/components/ItemOptions/ItemTorrents/ItemTorrents.js b/app/mobile/components/ItemOptions/ItemTorrents/ItemTorrents.js new file mode 100644 index 0000000..3139393 --- /dev/null +++ b/app/mobile/components/ItemOptions/ItemTorrents/ItemTorrents.js @@ -0,0 +1,105 @@ +import React from 'react' +import { StyleSheet } from 'react-native' +import { useMutation } from '@apollo/client' + +import { SearchForBetterEpisode, SearchForBetterMovie } from 'modules/GraphQL/SearchForBetterGraphQL' +import dimensions from 'modules/dimensions' +import constants from 'modules/constants' +import i18n from 'modules/i18n' +import useDownload from 'modules/hooks/useDownload' + +import Divider from 'components/Divider' + +import OptionsGroup from '../../OptionsGroup' +import OptionsItem from '../../OptionsItem' +import OptionsItemTorrent from '../../OptionsItemTorrent' + +export const styles = StyleSheet.create({ + + root: { + marginVertical: 0, + marginTop: dimensions.UNIT * 2, + }, + + divider: { + marginVertical: dimensions.UNIT * 2, + }, + +}) + +export const ItemTorrents = ({ item, torrents, variant, onPress }) => { + const [download, downloadManager] = useDownload(item) + const [searchForBetter, { loading }] = useMutation( + item.type === constants.TYPE_EPISODE + ? SearchForBetterEpisode + : SearchForBetterMovie, + { + variables: { + _id: item._id, + }, + }, + ) + + const downloadRemoveLabel = React.useMemo(() => { + if (download?.status === constants.STATUS_DOWNLOADING) { + return i18n.t('Stop downloading') + } + + if (download?.status === constants.STATUS_QUEUED) { + return i18n.t('Remove from queue') + } + + return i18n.t('Remove download') + + }, [download?.status]) + + const handleDownloadTorrent = (torrent) => { + downloadManager.startDownload(item, torrent) + } + + const handleDeleteDownload = () => { + downloadManager.removeDownload(download) + } + + return ( + + {torrents.length > 0 && ( + <> + {torrents.map((torrent) => ( + + ))} + + + + )} + + + + {variant === constants.TYPE_DOWNLOAD && ( + + )} + + + ) +} + +export default ItemTorrents diff --git a/app/mobile/components/ItemOptions/ItemTorrents/index.js b/app/mobile/components/ItemOptions/ItemTorrents/index.js new file mode 100644 index 0000000..a5956cf --- /dev/null +++ b/app/mobile/components/ItemOptions/ItemTorrents/index.js @@ -0,0 +1 @@ +export { default } from './ItemTorrents' diff --git a/app/mobile/components/ItemOptions/index.js b/app/mobile/components/ItemOptions/index.js new file mode 100644 index 0000000..fdce98a --- /dev/null +++ b/app/mobile/components/ItemOptions/index.js @@ -0,0 +1 @@ +export { default } from './ItemOptions' diff --git a/app/mobile/components/MainCover/MainCover.js b/app/mobile/components/MainCover/MainCover.js index 40e8c94..f0141a6 100644 --- a/app/mobile/components/MainCover/MainCover.js +++ b/app/mobile/components/MainCover/MainCover.js @@ -125,7 +125,7 @@ export const MainCover = ({ empty, item, handleItemOpen }) => { toggleSelecting(false)} /> + onClose={() => toggleSelecting(false)} /> )} diff --git a/app/mobile/components/OptionsGroup/OptionsGroup.js b/app/mobile/components/OptionsGroup/OptionsGroup.js new file mode 100644 index 0000000..101a2b0 --- /dev/null +++ b/app/mobile/components/OptionsGroup/OptionsGroup.js @@ -0,0 +1,30 @@ +import React from 'react' +import { View, StyleSheet } from 'react-native' + +import dimensions from 'modules/dimensions' + +import Divider from 'components/Divider' + +export const styles = StyleSheet.create({ + + root: { + marginVertical: dimensions.UNIT * 2, + }, + +}) + +export const OptionsGroup = ({ children, withDivider, style }) => { + return ( + <> + + {children} + + + {withDivider && ( + + )} + + ) +} + +export default OptionsGroup diff --git a/app/mobile/components/OptionsGroup/index.js b/app/mobile/components/OptionsGroup/index.js new file mode 100644 index 0000000..494a290 --- /dev/null +++ b/app/mobile/components/OptionsGroup/index.js @@ -0,0 +1 @@ +export { default } from './OptionsGroup' diff --git a/app/mobile/components/OptionsHeader/OptionsHeader.js b/app/mobile/components/OptionsHeader/OptionsHeader.js new file mode 100644 index 0000000..ba6e843 --- /dev/null +++ b/app/mobile/components/OptionsHeader/OptionsHeader.js @@ -0,0 +1,30 @@ +import React from 'react' +import { StyleSheet } from 'react-native' + +import dimensions from 'modules/dimensions' +import Divider from 'components/Divider' + +import OptionsItem from '../OptionsItem' + +export const styles = StyleSheet.create({ + + root: { + marginVertical: dimensions.UNIT * 2, + }, + +}) + +export const SettingsHeader = ({ label }) => { + return ( + <> + + + + + ) +} + +export default SettingsHeader diff --git a/app/mobile/components/OptionsHeader/index.js b/app/mobile/components/OptionsHeader/index.js new file mode 100644 index 0000000..e1bf23a --- /dev/null +++ b/app/mobile/components/OptionsHeader/index.js @@ -0,0 +1 @@ +export { default } from './OptionsHeader' diff --git a/app/mobile/components/OptionsItem/OptionsItem.js b/app/mobile/components/OptionsItem/OptionsItem.js new file mode 100644 index 0000000..6a0b50b --- /dev/null +++ b/app/mobile/components/OptionsItem/OptionsItem.js @@ -0,0 +1,47 @@ +import React from 'react' +import { StyleSheet, View } from 'react-native' + +import dimensions from 'modules/dimensions' +import BaseButton from 'components/BaseButton' + +import OptionsItemInner from './OptionsItemInner' + +export const styles = StyleSheet.create({ + + root: { + marginVertical: 7, + paddingHorizontal: dimensions.UNIT * 2, + + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + +}) + +export const OptionsItem = ({ style, disabled, onPress, ...rest }) => { + if (disabled || !onPress) { + return ( + + + + ) + + } else { + return ( + + + + ) + } +} + +export default OptionsItem diff --git a/app/mobile/components/OptionsItem/OptionsItemInner.js b/app/mobile/components/OptionsItem/OptionsItemInner.js new file mode 100644 index 0000000..2b1b633 --- /dev/null +++ b/app/mobile/components/OptionsItem/OptionsItemInner.js @@ -0,0 +1,123 @@ +import LottieView from 'lottie-react-native' +import React from 'react' +import { ActivityIndicator, StyleSheet, View } from 'react-native' +import * as Animatable from 'react-native-animatable' + +import dimensions from 'modules/dimensions' +import colors from 'modules/colors' +import constants from 'modules/constants' + +import Typography from 'components/Typography' +import Icon from 'components/Icon' + +export const styles = StyleSheet.create({ + + icon: { + marginRight: dimensions.UNIT, + }, + + labels: { + flex: 1, + }, + + label: {}, + + subLabels: { + flexDirection: 'row', + }, + +}) + +export const SettingsItem = ({ label, subLabel, subLabelLine2, icon, disabled, loading, downloading }) => { + return ( + <> + {loading && ( + + + + )} + + {downloading && ( + + + + )} + + {icon && !loading && !downloading && ( + + )} + + + + {label} + + + {(subLabel || subLabelLine2) && ( + + {subLabel && ( + + {subLabel} + + )} + + {subLabelLine2 && ( + + {subLabelLine2} + + )} + + )} + + + ) +} + +export default SettingsItem diff --git a/app/mobile/components/OptionsItem/index.js b/app/mobile/components/OptionsItem/index.js new file mode 100644 index 0000000..f6fb12b --- /dev/null +++ b/app/mobile/components/OptionsItem/index.js @@ -0,0 +1 @@ +export { default } from './OptionsItem' diff --git a/app/mobile/components/OptionsItemTorrent/OptionsItemTorrent.js b/app/mobile/components/OptionsItemTorrent/OptionsItemTorrent.js new file mode 100644 index 0000000..2cb0344 --- /dev/null +++ b/app/mobile/components/OptionsItemTorrent/OptionsItemTorrent.js @@ -0,0 +1,110 @@ +import React from 'react' +import { StyleSheet } from 'react-native' + +import dimensions from 'modules/dimensions' +import constants from 'modules/constants' + +import OptionsItem from '../OptionsItem' + +export const styles = StyleSheet.create({ + + root: { + marginVertical: 0, + marginTop: dimensions.UNIT * 2, + }, + + divider: { + marginVertical: dimensions.UNIT * 2, + }, + +}) + +export const OptionsItemTorrent = ({ + torrent, + disabled, + download, + startDownload, + variant, + onPress, +}) => { + const isItemDisabled = React.useMemo(() => { + if (!download) { + return disabled + } + + return !(download.torrentType === torrent.type && download.quality === torrent.quality) + }, [download, disabled]) + + const itemSubLabel = React.useMemo(() => { + if (!isItemDisabled && download?.status === constants.STATUS_DOWNLOADING) { + return download.timeRemaining + } + + return `${torrent.provider} - ${torrent.sizeString}` + }, [download, isItemDisabled]) + + const subLabelLine2 = React.useMemo(() => { + if (!isItemDisabled && download?.status === constants.STATUS_DOWNLOADING) { + return `${download.progress}% / ${download.speed}` + } + + if (!isItemDisabled && download?.status !== constants.STATUS_COMPLETE) { + return download?.status + } + + return null + + }, [download, isItemDisabled]) + + const itemIcon = React.useMemo(() => { + if (!isItemDisabled && download?.status === constants.STATUS_COMPLETE) { + return 'cloud-check' + } + + if (!isItemDisabled && download?.status === constants.STATUS_FAILED) { + return 'cloud-alert' + } + + return variant === constants.TYPE_DOWNLOAD + ? 'cloud-download' + : 'play-circle-outline' + }, [download, isItemDisabled]) + + const handleOnTorrentClick = () => { + if (onPress) { + return () => onPress(torrent, download) + } + + if (download) { + return null + } + + return () => startDownload(torrent) + } + + return ( + + ) +} + +OptionsItemTorrent.defaultProps = { + variant: constants.TYPE_DOWNLOAD, +} + +export default OptionsItemTorrent diff --git a/app/mobile/components/OptionsItemTorrent/index.js b/app/mobile/components/OptionsItemTorrent/index.js new file mode 100644 index 0000000..e41d016 --- /dev/null +++ b/app/mobile/components/OptionsItemTorrent/index.js @@ -0,0 +1 @@ +export { default } from './OptionsItemTorrent' diff --git a/app/mobile/components/QualitySelector/Qualities/Qualities.js b/app/mobile/components/QualitySelector/Qualities/Qualities.js deleted file mode 100644 index 47af810..0000000 --- a/app/mobile/components/QualitySelector/Qualities/Qualities.js +++ /dev/null @@ -1,145 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { ActivityIndicator, StyleSheet, TouchableNativeFeedback, View } from 'react-native' -import * as Animatable from 'react-native-animatable' -import { useMutation } from '@apollo/client' - -import dimensions from 'modules/dimensions' -import constants from 'modules/constants' -import i18n from 'modules/i18n' -import colors from 'modules/colors' -import { SearchForBetterEpisode, SearchForBetterMovie } from 'modules/GraphQL/SearchForBetterGraphQL' - -import Typography from 'components/Typography' -import TextButton from 'components/TextButton' -import Quality from './Quality' - -const styles = StyleSheet.create({ - - container: { - position: 'absolute', - top: (dimensions.SCREEN_HEIGHT / 2) + dimensions.UNIT, - display: 'flex', - alignItems: 'center', - }, - - qualitiesContainer: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - flexDirection: 'row', - marginTop: dimensions.UNIT, - }, - - searchedTitle: { - marginTop: dimensions.UNIT * 3, - }, - - loader: { - marginTop: dimensions.UNIT * 4, - }, - - searchButtonContainer: { - position: 'absolute', - bottom: dimensions.UNIT * 10, - }, - -}) - -export const Qualities = ({ variant, item, handleQualityPress }) => { - const [searchForBetter, { loading }] = useMutation( - item.type === constants.TYPE_EPISODE - ? SearchForBetterEpisode - : SearchForBetterMovie, - { - variables: { - _id: item._id, - }, - }, - ) - - return ( - - - - {i18n.t(variant === constants.TYPE_STREAM - ? 'Watch in' - : 'Download in', - )} - - - - {item && item.torrents && item.torrents.map((torrent) => ( - - ))} - - - {loading && ( - - )} - - {!loading && item && item.searchedTorrents && item.searchedTorrents.length > 0 && ( - - - {i18n.t('Searched qualities')} - - - - {item && item.searchedTorrents && item.searchedTorrents.map((torrent) => ( - - ))} - - - )} - - - - - {i18n.t('search for qualities')} - - - - ) -} - -Qualities.propTypes = { - item: PropTypes.object.isRequired, - variant: PropTypes.oneOf([ - constants.TYPE_STREAM, - constants.TYPE_DOWNLOAD, - ]), - handleQualityPress: PropTypes.func.isRequired, -} - -export default Qualities diff --git a/app/mobile/components/QualitySelector/Qualities/Quality/Quality.js b/app/mobile/components/QualitySelector/Qualities/Quality/Quality.js deleted file mode 100644 index 62488e9..0000000 --- a/app/mobile/components/QualitySelector/Qualities/Quality/Quality.js +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { StyleSheet, TouchableNativeFeedback } from 'react-native' -import * as Animatable from 'react-native-animatable' - -import Typography from 'components/Typography' -import TextButton from 'components/TextButton' - -const styles = StyleSheet.create({ - - quality: { - textAlign: 'center', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - }, - -}) - -export const Quality = ({ torrent, handleQualityPress }) => ( - - { - handleQualityPress(torrent) - }}> - {torrent.quality} - - - - {torrent.sizeString} - - -) - -Quality.propTypes = { - torrent: PropTypes.object.isRequired, - handleQualityPress: PropTypes.func.isRequired, -} - -export default Quality diff --git a/app/mobile/components/QualitySelector/Qualities/Quality/index.js b/app/mobile/components/QualitySelector/Qualities/Quality/index.js deleted file mode 100644 index 7ea1c72..0000000 --- a/app/mobile/components/QualitySelector/Qualities/Quality/index.js +++ /dev/null @@ -1 +0,0 @@ -export {default} from './Quality' diff --git a/app/mobile/components/QualitySelector/Qualities/index.js b/app/mobile/components/QualitySelector/Qualities/index.js deleted file mode 100644 index 837cc04..0000000 --- a/app/mobile/components/QualitySelector/Qualities/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Qualities' diff --git a/app/mobile/components/QualitySelector/QualityIcon/QualityIcon.js b/app/mobile/components/QualitySelector/QualityIcon/QualityIcon.js deleted file mode 100644 index 8b56098..0000000 --- a/app/mobile/components/QualitySelector/QualityIcon/QualityIcon.js +++ /dev/null @@ -1,181 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { StyleSheet } from 'react-native' -import LottieView from 'lottie-react-native' -import * as Animatable from 'react-native-animatable' - -import dimensions from 'modules/dimensions' -import constants from 'modules/constants' -import usePollingForDownload from 'modules/GraphQL/usePollingForDownload' - -import BaseButton from 'components/BaseButton' -import IconButton from 'components/IconButton' -import Icon from 'components/Icon' -import Typography from 'components/Typography' - -export const styles = StyleSheet.create({ - - downloadStatus: { - textAlign: 'center', - }, - - lottieContainer: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - }, - -}) - -export const QualityIcon = ({ - handleOnPress, - handleRemoveDownload, - download: downloadProp, - downloadManager, - variant, - itemType, - style, -}) => { - const data = usePollingForDownload( - variant !== constants.TYPE_STREAM - ? downloadProp - : null, - downloadManager, - ) - - const download = downloadProp && !data - ? downloadProp - : downloadProp && data - ? data - : null - - const getStatusText = () => { - switch (download.status) { - case constants.STATUS_DOWNLOADING: - return `${download.progress}%` - - case constants.STATUS_COMPLETE: - return download.quality - - default: - return download.status - } - } - - if (variant === constants.TYPE_DOWNLOAD || variant === 'downloads') { - if (download && download.status !== constants.STATUS_REMOVED && (variant !== 'downloads' || download?.status === constants.STATUS_DOWNLOADING)) { - return ( - downloadManager.onPress(download)} - onLongPress={() => { - // If status is failed we retry on long press - if (download.status === constants.STATUS_FAILED) { - handleOnPress() - - } else { - handleRemoveDownload() - } - }}> - - {download.status === constants.STATUS_DOWNLOADING && ( - - )} - - {[ - constants.STATUS_QUEUED, - constants.STATUS_CONNECTING, - constants.STATUS_COMPLETE, - constants.STATUS_FAILED, - ].includes(download.status) && ( - - )} - - {download.status && ( - - {getStatusText()} - - )} - - - ) - } - - if (variant !== 'downloads') { - return ( - - ) - } - } - - return ( - - ) -} - -QualityIcon.propTypes = { - handleOnPress: PropTypes.func.isRequired, - handleRemoveDownload: PropTypes.func.isRequired, - item: PropTypes.object.isRequired, - download: PropTypes.object, - variant: PropTypes.oneOf(['stream', 'download', 'downloads']).isRequired, - itemType: PropTypes.string, - style: PropTypes.object, -} - -QualityIcon.defaultProps = { - download: null, - style: null, - itemType: null, -} - -export default QualityIcon diff --git a/app/mobile/components/QualitySelector/QualityIcon/index.js b/app/mobile/components/QualitySelector/QualityIcon/index.js deleted file mode 100644 index bb3c315..0000000 --- a/app/mobile/components/QualitySelector/QualityIcon/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './QualityIcon' diff --git a/app/mobile/components/QualitySelector/QualitySelector.js b/app/mobile/components/QualitySelector/QualitySelector.js index cfbc9c0..58593f7 100644 --- a/app/mobile/components/QualitySelector/QualitySelector.js +++ b/app/mobile/components/QualitySelector/QualitySelector.js @@ -1,292 +1,53 @@ import React from 'react' -import PropTypes from 'prop-types' -import { StyleSheet } from 'react-native' -import * as Animatable from 'react-native-animatable' -import { navigate } from 'modules/RootNavigation' -import dimensions from 'modules/dimensions' import constants from 'modules/constants' -import withDownloadManager from 'modules/DownloadManager/withDownloadManager' -import withWatchOnTvManager from 'modules/WatchOnTvManager/withWatchOnTvManager' - -import Card from 'components/Card' -import Typography from 'components/Typography' -import Modal from 'components/Modal' - -import Qualities from './Qualities' -import QualityIcon from './QualityIcon' - -const styles = StyleSheet.create({ - - root: { - flex: 1, - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: '100%', - }, - - itemContainer: { - position: 'absolute', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - width: '100%', - top: dimensions.UNIT * 9, - paddingLeft: dimensions.UNIT * 2, - paddingRight: dimensions.UNIT * 2, - }, - - title: { - marginTop: dimensions.UNIT * 3, - textAlign: 'center', - }, - -}) - -@withWatchOnTvManager -@withDownloadManager -export default class QualitySelector extends React.Component { - - static propTypes = { - style: PropTypes.object, - variant: PropTypes.oneOf([ - constants.TYPE_STREAM, - constants.TYPE_DOWNLOAD, - 'downloads', - ]), - item: PropTypes.object.isRequired, - itemType: PropTypes.string, - downloadManager: PropTypes.shape({ - startDownload: PropTypes.func.isRequired, - updateDownload: PropTypes.func.isRequired, - getDownload: PropTypes.func.isRequired, - downloadExists: PropTypes.func.isRequired, - }), - } - - static defaultProps = { - style: {}, - variant: constants.TYPE_STREAM, - itemType: null, - } - - static getDerivedStateFromProps(props, state) { - const { item } = props - - let download = state.download || null - - if (item.download && item.download.downloadStatus && !state.download && !state.removed) { - download = { - _id: item._id, - status: item.download.downloadStatus, - quality: item.download.downloadQuality, - progress: 0, - } - } - - return { - visible: state.visible, - removed: state.removed, - download, - } - } - - state = { - visible: false, - download: null, - removed: false, - } - - componentDidUpdate(prevProps, prevState, snapshot) { - const { visible: wasVisible } = prevProps - const { visible } = this.props +import { useWatchOnTvManager } from 'modules/WatchOnTvManager' +import useDownload from 'modules/hooks/useDownload' +import { navigate } from 'modules/RootNavigation' - if (wasVisible !== visible && visible) { - this.handleOnIconPress() - } - } +import ItemOptions from '../ItemOptions' - /** - * Starts playing this torrent - * - * @param torrent - */ - handlePlayTorrent = (torrent) => { - const { playItem, item, watchOnTvManager } = this.props +export const QualitySelector = ({ item, ...props }) => { + const { connected, playOnTv } = useWatchOnTvManager() + const [download] = useDownload(item) - if (playItem) { - playItem(item, torrent) + const handleOnTorrentPress = (torrent) => { + if (connected) { + playOnTv(item, torrent) } else { - // Make sure whe are closed - this.handleRequestClose() - - if (watchOnTvManager.connected) { - watchOnTvManager.playOnTv(item, torrent) - - } else { - navigate( - 'Player', - { - torrent, - item, - }, - ) - } - } - } - - handleRequestClose = () => { - const { onRequestClose } = this.props - - if (onRequestClose) { - onRequestClose() + navigate( + 'Player', + { + item, + torrent, + }, + ) } - - this.setState({ - visible: false, - }) } - handleOnIconPress = () => { - const { downloadManager, item, variant } = this.props - - // Check if download status is not null or failed - const hasDownload = ![null, 'failed'].includes(item.download.downloadStatus) - let downloadInManager = downloadManager.getDownload(item._id) - let downloadManagerHasIt = !!downloadInManager - - if (!downloadManagerHasIt || downloadInManager.status === 'failed') { - downloadManagerHasIt = false - downloadInManager = { - torrentType: null, - } - } - - // If we have download or the manager has one, play the download - if (hasDownload || downloadManagerHasIt) { - console.log(hasDownload, downloadManagerHasIt, item?.download) - - // Just to be sure, the quality selector needs to be a type stream to go - // to the player - if (variant === constants.TYPE_STREAM) { - this.handlePlayTorrent({ - quality: 'download', - type: downloadInManager.torrentType, - }) - } - - } else { - this.setState({ - visible: true, + const handleCanOpenBottomSheet = () => { + if (download) { + handleOnTorrentPress({ + quality: download.quality, + type: download.torrentType, }) - } - } - - /** - * Starts the download - * - * @param quality - * @param type - Type of torrent, default or searched - * @return {Promise} - */ - handleStartDownload = async(quality, type) => { - const { item, downloadManager } = this.props - - const download = await downloadManager.startDownload(item, quality, type) - this.setState({ - download, - visible: false, - removed: false, - }) - } - - /** - * Removes the download - * - * @return {Promise} - */ - handleRemoveDownload = async() => { - const { item, downloadManager } = this.props - - await downloadManager.removeDownload(item) - - this.setState({ - download: null, - removed: true, - }) - } - - render() { - const { itemType, variant, style, item, downloadManager } = this.props - const { visible, download } = this.state - - return ( - - - - {variant !== 'downloads' && ( - - - {item && item.title && ( - - - - - { - item.type === 'movie' - ? item.title - : `${item.show.title}: ${item.title}` - } - - - - )} - - { - if (variant === constants.TYPE_STREAM) { - this.handlePlayTorrent(torrent) + return false + } - } else { - this.handleStartDownload(torrent) - } - }} - /> - - )} - - ) + return true } + return ( + + ) } + +export default QualitySelector diff --git a/app/mobile/root.js b/app/mobile/root.js index 48a3209..ad1f6ec 100644 --- a/app/mobile/root.js +++ b/app/mobile/root.js @@ -5,6 +5,7 @@ import DownloadManager from 'modules/DownloadManager' import IpFinder from 'modules/IpFinder' import WatchOnTvManager from 'modules/WatchOnTvManager' import navigationRef from 'modules/RootNavigation' +import BottomSheetManager from 'modules/BottomSheetManager' import Portal from 'components/Portal' import ApolloLoader from 'components/ApolloLoader' @@ -22,9 +23,13 @@ export default () => ( - - - + + + + + + + diff --git a/app/mobile/screens/Item/ItemGraphQL.js b/app/mobile/screens/Item/ItemGraphQL.js index 5e931f3..a4c2ce4 100644 --- a/app/mobile/screens/Item/ItemGraphQL.js +++ b/app/mobile/screens/Item/ItemGraphQL.js @@ -1,5 +1,7 @@ import gql from 'graphql-tag' +import torrentFragment from 'modules/GraphQL/fragments/torrentFragment' + export const MovieQuery = gql` query movie($_id: String!) { item: movie(_id: $_id) { @@ -25,14 +27,10 @@ export const MovieQuery = gql` downloadQuality } torrents { - quality - sizeString - type + ...torrent } searchedTorrents { - quality - sizeString - type + ...torrent } images { backdrop { @@ -45,6 +43,8 @@ export const MovieQuery = gql` } } } + + ${torrentFragment} ` export const ShowQuery = gql` @@ -104,17 +104,15 @@ export const ShowQuery = gql` } } torrents { - quality - sizeString - type + ...torrent } searchedTorrents { - quality - sizeString - type + ...torrent } } } } } + + ${torrentFragment} ` diff --git a/app/mobile/screens/Item/ItemScreen.js b/app/mobile/screens/Item/ItemScreen.js index c001e26..5654889 100644 --- a/app/mobile/screens/Item/ItemScreen.js +++ b/app/mobile/screens/Item/ItemScreen.js @@ -1,3 +1,4 @@ +import BottomSheetManager from 'modules/BottomSheetManager/BottomSheetProvider' import React, { useEffect } from 'react' import { StyleSheet, View, InteractionManager, Linking } from 'react-native' import { useLazyQuery } from '@apollo/client' @@ -11,7 +12,7 @@ import Container from 'components/Container' import ScrollViewWithStatusBar from 'components/ScrollViewWithStatusBar' import IconButton from 'components/IconButton' import Typography from 'components/Typography' -import QualitySelector from 'mobile/components/QualitySelector' +import ItemOptions from 'mobile/components/ItemOptions' import MainCover from 'mobile/components/MainCover' import { MovieQuery, ShowQuery } from './ItemGraphQL' @@ -81,10 +82,6 @@ export const Item = ({ route: { params } }) => { const loading = itemLoading || !data const item = loading ? null : data.item - const handleToggleWatched = () => { - - } - const handleTrailer = () => { if (item && item.trailer) { Linking.openURL(item.trailer) @@ -101,17 +98,6 @@ export const Item = ({ route: { params } }) => { item={item} /> - {!loading && item.type === constants.TYPE_MOVIE && ( - - )} - {!loading && ( { emphasis={'medium'} size={dimensions.ICON_SIZE_MEDIUM} /> )} + + {!loading && item.type === constants.TYPE_MOVIE && ( + + )} - {/* /!*{!loading && item.type === constants.TYPE_MOVIE && (*!/*/} - {/* /!* *!/*/} - {/* /!* {i18n.t(item.watched.complete ? 'Mark Unwatched' : 'Mark Watched')}*!/*/} - {/* /!* *!/*/} - {/* /!*)}*!/*/} - {item && ( { )} - ) } diff --git a/app/mobile/screens/Item/SeasonsAndEpisodes/Episode/Episode.js b/app/mobile/screens/Item/SeasonsAndEpisodes/Episode/Episode.js index ac89a61..aff012d 100644 --- a/app/mobile/screens/Item/SeasonsAndEpisodes/Episode/Episode.js +++ b/app/mobile/screens/Item/SeasonsAndEpisodes/Episode/Episode.js @@ -5,6 +5,9 @@ import { StyleSheet, View } from 'react-native' import dimensions from 'modules/dimensions' import constants from 'modules/constants' import colors from 'modules/colors' +import i18n from 'modules/i18n' +import usePollingForDownload from 'modules/hooks/usePollingForDownload' +import addZeros from 'modules/utils/addZeros' import Typography from 'components/Typography' import Overlay from 'components/Overlay' @@ -13,6 +16,7 @@ import Image from 'components/Image' import Container from 'components/Container' import QualitySelector from 'mobile/components/QualitySelector' +import ItemOptions from 'mobile/components/ItemOptions' export const styles = StyleSheet.create({ @@ -59,7 +63,7 @@ export const styles = StyleSheet.create({ height: dimensions.EPISODE_CARD_HEIGHT, }, - downloadIcon: { + optionsIcon: { width: dimensions.UNIT * 8, textAlign: 'center', }, @@ -76,13 +80,14 @@ export const styles = StyleSheet.create({ export const Episode = (props) => { const [showQualitySelector, toggleSelecting] = useState(false) + const [download] = usePollingForDownload(props) const { title, synopsis, number, hasAired, images, firstAired, watched } = props const getAirsDate = () => { const airs = new Date() airs.setTime(firstAired) - return `${`0${airs.getDate()}`.slice(-2)}-${`0${(airs.getMonth() + 1)}`.slice(-2)}-${airs.getFullYear()}` + return addZeros.date(airs) } return ( @@ -103,9 +108,10 @@ export const Episode = (props) => { {hasAired && ( toggleSelecting(false)} + style={styles.optionsIcon} + visible={showQualitySelector} + onClose={() => toggleSelecting(false)} /> )} @@ -137,6 +143,32 @@ export const Episode = (props) => { {`${number}. ${title}`} + {download && ( + + {download.status === constants.STATUS_QUEUED && ( + i18n.t('Download in queue') + )} + + {download.status === constants.STATUS_CONNECTING && ( + i18n.t('Download connecting') + )} + + {download.status === constants.STATUS_DOWNLOADING && ( + i18n.t('Downloading {{quality}}, {{progress}}%', { + quality: download.quality, + progress: download.progress, + }) + )} + + {download.status === constants.STATUS_COMPLETE && ( + i18n.t('Downloaded in {{quality}}', { quality: download.quality }) + )} + + )} + @@ -145,10 +177,9 @@ export const Episode = (props) => { {hasAired && ( - )} @@ -169,13 +200,19 @@ Episode.propTypes = { number: PropTypes.number, synopsis: PropTypes.string, hasAired: PropTypes.bool, + firstAired: PropTypes.number, + watched: PropTypes.object, + download: PropTypes.object, } Episode.defaultProps = { + title: null, + number: null, + firstAired: null, + watched: null, + download: null, synopsis: null, - hasTorrents: false, hasAired: false, - images: { poster: { thumb: null, diff --git a/app/mobile/screens/Item/SeasonsAndEpisodes/SeasonsAndEpisodes.js b/app/mobile/screens/Item/SeasonsAndEpisodes/SeasonsAndEpisodes.js index ad562c2..dd095ca 100644 --- a/app/mobile/screens/Item/SeasonsAndEpisodes/SeasonsAndEpisodes.js +++ b/app/mobile/screens/Item/SeasonsAndEpisodes/SeasonsAndEpisodes.js @@ -37,180 +37,85 @@ export const styles = StyleSheet.create({ }) -// TODO:: Refactor +const today = Date.now() -export default class SeasonsAndEpisodes extends React.Component { +export const SeasonsAndEpisodes = ({ item }) => { + const [activeSeason, setActiveSeason] = React.useState(item.seasons[item.seasons.length - 1].number) - static getDerivedStateFromProps(nextProps, state) { - const { item } = nextProps - const { activeSeason } = state - - // If we retrieve more season then update to the latest one - if (!activeSeason) { - return { - activeSeason: item.seasons[item.seasons.length - 1].number, - } - } - - return null - } - - static propTypes = {} - - static defaultProps = {} - - state = { - activeSeason: null, - } - - constructor(props) { - super(props) - - this.today = Date.now() - } - - getEpisodes = () => { - const { activeSeason } = this.state - - if (!activeSeason) { - return [] - } - - const season = this.getSeasons(activeSeason) + const seasonsReverse = React.useMemo(() => [...item.seasons].reverse(), [item.seasons]) + const episodes = React.useMemo(() => { + const season = item.seasons.find(season => season.number === activeSeason) if (!season) { return [] } return season.episodes - } - - getSeasons = (seasonNr = null) => { - const { item } = this.props - - if (!item || !item.seasons || item.seasons.length === 0) { - if (seasonNr) { - return null - } - - return [] - } - - if (seasonNr) { - return item.seasons.find(season => season.number === seasonNr) - } - - return [...item.seasons].reverse() - } - - handleSeasonChange = (season) => { - this.setState({ - activeSeason: season.number, - }) - } - - renderEpisode = ({ item }) => { - const { item: show } = this.props - - return ( - 0 : false} - show={show} - {...item} /> - ) - } - - renderSeason = ({ item }) => { - const { activeSeason } = this.state - - return ( - - this.handleSeasonChange(item)} - item={item} - /> - - - {i18n.t('Season {{number}}', { number: item.number })} - + }, [activeSeason, seasonsReverse]) + + const renderSeason = React.useCallback(({ item: season }) => ( + + setActiveSeason(season.number)} + item={season} + /> + + + {i18n.t('Season {{number}}', { number: season.number })} + + + ), [activeSeason]) + + return ( + + + + {i18n.t('Seasons')} + + + } + keyExtractor={(item) => item._id} + showsVerticalScrollIndicator={false} + showsHorizontalScrollIndicator={false} + horizontal + /> + + + {episodes.map((episode) => ( + + ))} - ) - } - - render() { - const seasons = this.getSeasons() - const episodes = this.getEpisodes() - - return ( - - - - {i18n.t('Seasons')} - - - } - keyExtractor={(item, index) => item - ? item._id - : `${index}` - } - showsVerticalScrollIndicator={false} - showsHorizontalScrollIndicator={false} - horizontal - /> - - } - ItemSeparatorComponent={() => } - ListFooterComponent={() => } - keyExtractor={(item, index) => item - ? item._id - : `${index}` - } - showsVerticalScrollIndicator={false} - showsHorizontalScrollIndicator={false} - /> - - - ) - } + + ) } + +export default SeasonsAndEpisodes diff --git a/app/mobile/screens/Mode/ModeScreen.js b/app/mobile/screens/Mode/ModeScreen.js index 4407542..1836c20 100644 --- a/app/mobile/screens/Mode/ModeScreen.js +++ b/app/mobile/screens/Mode/ModeScreen.js @@ -8,7 +8,7 @@ import { getDefaultHeaderHeight } from 'react-navigation-collapsible/lib/src/uti import i18n from 'modules/i18n' import colors from 'modules/colors' import dimensions from 'modules/dimensions' -import useBackButton from 'modules/useBackButton' +import useBackButton from 'modules/hooks/useBackButton' import { MoviesModeQuery } from 'modules/GraphQL/MoviesQuery' import ShowsQuery from 'modules/GraphQL/ShowsQuery' import BookmarksQuery from 'modules/GraphQL/BookmarksQuery' diff --git a/app/mobile/screens/Settings/About/About.js b/app/mobile/screens/Settings/About/About.js index 8b81fac..ed6bee6 100644 --- a/app/mobile/screens/Settings/About/About.js +++ b/app/mobile/screens/Settings/About/About.js @@ -4,6 +4,7 @@ import { View, Linking } from 'react-native' import Updater from 'update-react-native-app' import dimensions from 'modules/dimensions' +import colors from 'modules/colors' import i18n from 'modules/i18n' import { navigate } from 'modules/RootNavigation' import withIpFinder from 'modules/IpFinder/withIpFinder' @@ -13,6 +14,8 @@ import Icon from 'components/Icon' import Typography from 'components/Typography' import TextButton from 'components/TextButton' +const DISK_BAR_HEIGHT = 8 + export const styles = { root: { @@ -42,6 +45,28 @@ export const styles = { justifyContent: 'center', margin: dimensions.UNIT, }, + + diskContainer: { + width: dimensions.SCREEN_WIDTH - dimensions.UNIT * 3 - dimensions.ICON_SIZE_DEFAULT, + }, + + diskBar: { + width: '100%', + flexDirection: 'row', + marginTop: dimensions.UNIT, + }, + + diskStats: { + flexDirection: 'row', + marginTop: dimensions.UNIT, + }, + + diskStat: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + alignContent: 'center', + }, } export const About = ({ data, ipFinder }) => ( @@ -117,6 +142,81 @@ export const About = ({ data, ipFinder }) => ( + + + + + + + + Downloads + + + + + + + + + + + + + + Size: {data?.status?.disk?.size ?? 0} + + + + + + + Used: {data?.status?.disk?.used ?? 0} + + + + + + + Free: {data?.status?.disk?.free ?? 0} + + + + + + + navigate('AppChangelog')}> Changelog diff --git a/app/mobile/screens/Settings/Downloads/Download/Download.js b/app/mobile/screens/Settings/Downloads/Download/Download.js index 88f0a38..487aece 100644 --- a/app/mobile/screens/Settings/Downloads/Download/Download.js +++ b/app/mobile/screens/Settings/Downloads/Download/Download.js @@ -2,7 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import { View } from 'react-native' -import usePollingForDownload from 'modules/GraphQL/usePollingForDownload' +import usePollingForDownload from 'modules/hooks/usePollingForDownload' import dimensions from 'modules/dimensions' import constants from 'modules/constants' @@ -30,20 +30,23 @@ export const styles = { justifyContent: 'center', margin: dimensions.UNIT, }, + + infoContainer: { + flex: 1, + marginRight: dimensions.UNIT, + }, + } -export const Download = ({ download, downloadManager, refreshScreen }) => { - const data = usePollingForDownload(download, downloadManager) +export const Download = ({ download }) => { + const [data, downloadManager] = usePollingForDownload(download) const { status, progress, speed, timeRemaining, numPeers, quality } = data || download const { movie, episode } = download const removeDownload = async() => { - await downloadManager.removeDownload({ - ...download, - title: movie?.title ?? episode?.title, - }) + await downloadManager.removeDownload(download) - refreshScreen() + // TODO:: Show snackbar } return ( @@ -59,8 +62,13 @@ export const Download = ({ download, downloadManager, refreshScreen }) => { - - + + {movie?.title ?? `${episode?.show?.title}: S${episode?.season}E${episode?.number}. ${episode?.title}`} @@ -91,11 +99,11 @@ export const Download = ({ download, downloadManager, refreshScreen }) => { } Download.propTypes = { - data: PropTypes.object, + download: PropTypes.object, } Download.defaultProps = { - data: null, + download: null, } export default Download diff --git a/app/mobile/screens/Settings/Downloads/Download/__tests__/Download.test.js b/app/mobile/screens/Settings/Downloads/Download/__tests__/Download.test.js index 58816bd..c28c660 100644 --- a/app/mobile/screens/Settings/Downloads/Download/__tests__/Download.test.js +++ b/app/mobile/screens/Settings/Downloads/Download/__tests__/Download.test.js @@ -1,7 +1,7 @@ import React from 'react' import { shallow } from 'enzyme' -import usePollingForDownload from 'modules/GraphQL/usePollingForDownload' +import usePollingForDownload from 'modules/hooks/usePollingForDownload' import Download from '../Download' diff --git a/app/mobile/screens/Settings/Downloads/Downloads.js b/app/mobile/screens/Settings/Downloads/Downloads.js index 88945a0..d2d2611 100644 --- a/app/mobile/screens/Settings/Downloads/Downloads.js +++ b/app/mobile/screens/Settings/Downloads/Downloads.js @@ -1,8 +1,7 @@ import React from 'react' -import PropTypes from 'prop-types' import { View } from 'react-native' -import withDownloadManager from 'modules/DownloadManager/withDownloadManager' +import { useDownloadManager } from 'modules/DownloadManager' import dimensions from 'modules/dimensions' import i18n from 'modules/i18n' @@ -37,55 +36,42 @@ export const styles = { } -export const Downloads = ({ executeQuery, data, downloadManager, loading }) => ( - +export const Downloads = () => { + const downloadManager = useDownloadManager() - - {i18n.t('Active Downloads')} - + const downloads = downloadManager.getActiveDownloads() - {(!data?.activeDownloads || data?.activeDownloads?.length === 0) && ( - + return ( + - - {loading && ( - - {i18n.t('Loading')} - - )} + + {i18n.t('Active Downloads')} + + + {downloads.length === 0 && ( + - {!loading && ( + {i18n.t('No active downloads')} - )} - - - )} - - {data?.activeDownloads?.map((download) => ( - - ))} - - -) - -Downloads.propTypes = { - executeQuery: PropTypes.func.isRequired, - data: PropTypes.object, -} - -Downloads.defaultProps = { - data: null, + + + )} + + {downloads?.map((download) => ( + + ))} + + + ) } -export default withDownloadManager(Downloads) +export default Downloads diff --git a/app/mobile/screens/Settings/SettingsQuery.js b/app/mobile/screens/Settings/SettingsQuery.js index d5ce30a..4cf8bda 100644 --- a/app/mobile/screens/Settings/SettingsQuery.js +++ b/app/mobile/screens/Settings/SettingsQuery.js @@ -7,7 +7,14 @@ export const AboutQuery = gql` version totalMovies totalShows - totalEpisodes + disk { + free + used + size + freePercentage + usedPercentage + sizePercentage + } } scraper { @@ -20,33 +27,3 @@ export const AboutQuery = gql` } ` - -export const ActiveDownloads = gql` - query { - - activeDownloads { - _id - type - itemType - status - quality - progress - numPeers - speed - timeRemaining - movie { - title - } - episode { - title - season - number - show { - title - } - } - __typename - } - - } -` diff --git a/app/mobile/screens/Settings/SettingsScreen.js b/app/mobile/screens/Settings/SettingsScreen.js index 363db7c..0bcad1a 100644 --- a/app/mobile/screens/Settings/SettingsScreen.js +++ b/app/mobile/screens/Settings/SettingsScreen.js @@ -6,7 +6,7 @@ import colors from 'modules/colors' import Container from 'components/Container' -import { AboutQuery, ActiveDownloads } from './SettingsQuery' +import { AboutQuery } from './SettingsQuery' import About from './About' import Downloads from './Downloads' import Subtitles from './Subtitles' @@ -24,16 +24,11 @@ export const Settings = () => { AboutQuery, ) - const [executeActiveDownloadsQuery, { data: downloadsData, loading: downloadsLoading }] = useLazyQuery( - ActiveDownloads, - ) - useEffect(() => { // Execute the query after the component is done navigation InteractionManager.runAfterInteractions(() => { // Execute the query executeAboutQuery() - executeActiveDownloadsQuery() }) }, []) @@ -43,10 +38,9 @@ export const Settings = () => { { executeAboutQuery() - executeActiveDownloadsQuery() }} colors={[colors.PRIMARY_COLOR_200]} progressBackgroundColor={colors.BACKGROUND_TABS} @@ -59,11 +53,7 @@ export const Settings = () => { - + diff --git a/app/mobile/screens/index.js b/app/mobile/screens/index.js index 4741d96..e13d4bd 100644 --- a/app/mobile/screens/index.js +++ b/app/mobile/screens/index.js @@ -18,14 +18,14 @@ export default () => ( headerShown: false, }}> - - - - - + + + + + {createCollapsibleStack( - + {(props) => } , {}, @@ -33,7 +33,7 @@ export default () => ( )} {createCollapsibleStack( - + {(props) => } , {}, @@ -41,7 +41,7 @@ export default () => ( )} {createCollapsibleStack( - + {(props) => } , {}, diff --git a/app/modules/BottomSheetManager/BottomSheetProvider.js b/app/modules/BottomSheetManager/BottomSheetProvider.js new file mode 100644 index 0000000..27c7fdc --- /dev/null +++ b/app/modules/BottomSheetManager/BottomSheetProvider.js @@ -0,0 +1,135 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { StyleSheet, View } from 'react-native' +import BottomSheet from 'reanimated-bottom-sheet' +import ReAnimated from 'react-native-reanimated' + +import useBackButton from 'modules/hooks/useBackButton' + +import Container from 'components/Container' + +export const styles = StyleSheet.create({ + + overlayContainer: { + position: 'absolute', + top: 0, + right: 0, + bottom: 0, + left: 0, + }, + + overlay: { + backgroundColor: 'black', + }, + +}) + +export const BottomSheetContext = React.createContext(null) + +export const useBottomSheet = () => React.useContext(BottomSheetContext) + +export const BottomSheetProvider = ({ children }) => { + const sheetRef = React.useRef(null) + const [fall] = React.useState(new ReAnimated.Value(1)) + const [visible, toggleVisible] = React.useState(false) + + const [bottomSheetConfig, setBottomSheetConfig] = React.useState({ + renderContent: () => null, + borderRadius: 10, + snapPoints: [400, 400, 0], + biggestSnapPoint: 400, + contentHeight: 400, + onClose: null, + }) + + const handleBottomSheetOpen = React.useCallback(() => { + toggleVisible(true) + }, []) + + const handleBottomSheetClose = React.useCallback(() => { + toggleVisible(false) + + if (bottomSheetConfig.onClose) { + bottomSheetConfig.onClose() + } + }, [bottomSheetConfig.onClose]) + + useBackButton(() => { + if (visible && sheetRef.current) { + sheetRef.current.snapTo(bottomSheetConfig.snapPoints.length - 1) + + return true + } + + return false + }) + + const updateBottomSheet = (config, force = false) => { + if (visible || force) { + setBottomSheetConfig({ + ...bottomSheetConfig, + ...config, + + biggestSnapPoint: config.contentHeight || config.snapPoints.reduce((biggest, current) => ( + current > biggest + ? current + : biggest + ), 0), + }) + } + } + + const openBottomSheet = (config) => { + updateBottomSheet(config, true) + + // if we are already visible it can be content changes + if (!visible) { + sheetRef.current.snapTo(0) + } + } + + return ( + + + {children} + + + + + + ( + + {bottomSheetConfig.renderContent()} + + )} + /> + + ) +} + +export default BottomSheetProvider diff --git a/app/modules/BottomSheetManager/index.js b/app/modules/BottomSheetManager/index.js new file mode 100644 index 0000000..53a726e --- /dev/null +++ b/app/modules/BottomSheetManager/index.js @@ -0,0 +1,2 @@ +export { default } from './BottomSheetProvider' +export { useBottomSheet } from './BottomSheetProvider' diff --git a/app/modules/DownloadManager/DownloadManager.js b/app/modules/DownloadManager/DownloadManager.js index eba7dbc..087d502 100644 --- a/app/modules/DownloadManager/DownloadManager.js +++ b/app/modules/DownloadManager/DownloadManager.js @@ -1,13 +1,20 @@ import React from 'react' import { ToastAndroid } from 'react-native' +import i18n from 'modules/i18n' import constants from 'modules/constants' -import i18n from 'modules/i18n/i18n' import withApollo from 'modules/GraphQL/withApollo' -import { DownloadQuery, RemoveDownloadMutation, StartDownloadMutation } from 'modules/GraphQL/DownloadGraphQL' +import { + DownloadsQuery, + DownloadQuery, + RemoveDownloadMutation, + StartDownloadMutation, +} from 'modules/GraphQL/DownloadGraphQL' import DownloadManagerContext from './DownloadManagerContext' +export const useDownloadManager = () => React.useContext(DownloadManagerContext) + export class DownloadManager extends React.Component { pollingDownloads = [] @@ -16,6 +23,22 @@ export class DownloadManager extends React.Component { downloads: [], } + componentDidMount() { + const { apollo } = this.props + + apollo.query({ + query: DownloadsQuery, + variables: { + // TODO:: What if we have more? + limit: 100, + }, + }).then(({ data }) => { + this.setState({ + downloads: data.downloads, + }) + }) + } + handleStartDownload = async(item, torrent) => { let download = this.handleGetDownload(item._id) @@ -68,6 +91,9 @@ export class DownloadManager extends React.Component { const { apollo } = this.props const { downloads } = this.state + // Make sure nobody is polling + await this.handleStopPollDownload(item) + await apollo.mutate({ variables: { _id: item._id, @@ -81,9 +107,6 @@ export class DownloadManager extends React.Component { this.setState({ downloads: downloads.filter(down => down._id !== item._id), }) - - // TODO:: Show snackbar instead of toast - ToastAndroid.show(i18n.t('"{{title}}" removed', { title: item.title }), ToastAndroid.SHORT) } handleGetDownload = (_id) => { @@ -92,26 +115,21 @@ export class DownloadManager extends React.Component { return downloads.find(down => down._id === _id) } - handleDownloadExists = (_id) => { - return !!this.handleGetDownload(_id) - } - - /** - * Shows the correct message for a download on press - * - * @param download - */ - handleDownloadPress = (download) => { - let message = i18n.t('Hold long to remove') - - if (download.status === constants.STATUS_FAILED) { - message = i18n.t('Hold long to retry') + handleGetActiveDownload = () => { + const { downloads } = this.state - } else if (download.status === constants.STATUS_DOWNLOADING) { - message = i18n.t('Hold long to cancel') - } + return downloads.filter(down => ( + [ + constants.STATUS_QUEUED, + constants.STATUS_CONNECTING, + constants.STATUS_DOWNLOADING, + constants.STATUS_FAILED, + ].includes(down.status) + )) + } - ToastAndroid.show(message, ToastAndroid.SHORT) + handleDownloadExists = (_id) => { + return !!this.handleGetDownload(_id) } /** @@ -119,9 +137,13 @@ export class DownloadManager extends React.Component { * * @returns {Promise} */ - handlePollDownload = (download, callback) => { + handlePollDownload = (download) => { const { apollo } = this.props + if (this.pollingDownloads[download._id]) { + return + } + this.pollingDownloads[download._id] = apollo.watchQuery({ query: DownloadQuery, pollInterval: 1000, @@ -129,7 +151,9 @@ export class DownloadManager extends React.Component { _id: download._id, }, }).subscribe(({ data }) => { - callback(data?.download ?? null) + if (data?.download) { + this.handleUpdateDownload(data?.download) + } }) } @@ -146,16 +170,35 @@ export class DownloadManager extends React.Component { delete this.pollingDownloads[download._id] } + /** + * Shows the correct message for a download on press + * + * @param download + */ + handleDownloadPress = (download) => { + let message = i18n.t('Hold long to remove') + + if (download.status === constants.STATUS_FAILED) { + message = i18n.t('Hold long to retry') + + } else if (download.status === constants.STATUS_DOWNLOADING) { + message = i18n.t('Hold long to cancel') + } + + ToastAndroid.show(message, ToastAndroid.SHORT) + } + getValue = () => { return { startDownload: this.handleStartDownload, updateDownload: this.handleUpdateDownload, removeDownload: this.handleRemoveDownload, + getActiveDownloads: this.handleGetActiveDownload, getDownload: this.handleGetDownload, downloadExists: this.handleDownloadExists, - onPress: this.handleDownloadPress, pollDownload: this.handlePollDownload, stopPollDownload: this.handleStopPollDownload, + onPress: this.handleDownloadPress, } } diff --git a/app/modules/DownloadManager/index.js b/app/modules/DownloadManager/index.js index daf941d..94e3c7e 100644 --- a/app/modules/DownloadManager/index.js +++ b/app/modules/DownloadManager/index.js @@ -1 +1,2 @@ export { default } from './DownloadManager' +export { useDownloadManager } from './DownloadManager' diff --git a/app/modules/GraphQL/Apollo.js b/app/modules/GraphQL/Apollo.js index 547b6a5..3a3b490 100644 --- a/app/modules/GraphQL/Apollo.js +++ b/app/modules/GraphQL/Apollo.js @@ -5,7 +5,7 @@ import { CachePersistor } from 'apollo-cache-persist' import { WebSocketLink } from '@apollo/client/link/ws' import { getMainDefinition } from '@apollo/client/utilities' -const SCHEMA_VERSION = '5' // Must be a string. +const SCHEMA_VERSION = '6' // Must be a string. const SCHEMA_VERSION_KEY = 'apollo-schema-version' export default async(host) => { diff --git a/app/modules/GraphQL/DownloadGraphQL.js b/app/modules/GraphQL/DownloadGraphQL.js index 3f7e0c7..60d9d24 100644 --- a/app/modules/GraphQL/DownloadGraphQL.js +++ b/app/modules/GraphQL/DownloadGraphQL.js @@ -1,95 +1,63 @@ import gql from 'graphql-tag' -export const DownloadQuery = gql` +import downloadFragment from './fragments/downloadFragment' + +export const DownloadsQuery = gql` + query downloads($limit: Float!) { + downloads(limit: $limit) { + ...download + } + } + + ${downloadFragment} +` + +export const DownloadQuery = gql` query download($_id: String!) { download(_id: $_id) { - _id - type - itemType - torrentType - status - quality - progress - numPeers - speed - timeRemaining - subtitles { - language - code - } - __typename + ...download } } + + ${downloadFragment} ` export const StartStreamMutation = gql` mutation StartStream($_id: String!, $itemType: String!, $quality: String!, $torrentType: String) { download: startStream(_id: $_id, itemType: $itemType, quality: $quality, torrentType: $torrentType) { - _id - type - itemType - torrentType - status - quality - progress - numPeers - speed - timeRemaining - __typename + ...download } } + + ${downloadFragment} ` export const StopStreamMutation = gql` mutation StopStream($_id: String!) { download: stopStream(_id: $_id) { - _id - type - itemType - torrentType - status - quality - progress - numPeers - speed - timeRemaining - __typename + ...download } } + + ${downloadFragment} ` export const StartDownloadMutation = gql` mutation startDownload($_id: String!, $itemType: String!, $quality: String!, $torrentType: String) { download: startDownload(_id: $_id, itemType: $itemType, quality: $quality, torrentType: $torrentType) { - _id - type - itemType - torrentType - status - quality - progress - numPeers - speed - timeRemaining - __typename + ...download } } + + ${downloadFragment} ` export const RemoveDownloadMutation = gql` mutation removeDownload($_id: String!) { download: removeDownload(_id: $_id) { - _id - type - itemType - torrentType - status - quality - progress - numPeers - speed - timeRemaining - __typename + ...download } } + + ${downloadFragment} ` diff --git a/app/modules/GraphQL/MoviesQuery.js b/app/modules/GraphQL/MoviesQuery.js index b721462..a2c3dfd 100644 --- a/app/modules/GraphQL/MoviesQuery.js +++ b/app/modules/GraphQL/MoviesQuery.js @@ -1,67 +1,33 @@ import gql from 'graphql-tag' +import movieFragment, { movieMinimalFragment } from './fragments/movieFragment' + export const MoviesModeQuery = gql` query movies($offset: Float!, $query: String) { movies(limit: 25, offset: $offset, query: $query) { - _id - __typename - title - type - watched { - complete - } - images { - poster { - thumb - } - } + ...movieMinimal + } + } + + ${movieMinimalFragment} +` + +export const RelatedMoviesQuery = gql` + query relatedMovies($_id: String!) { + relatedMovies(_id: $_id) { + ...movieMinimal } } + + ${movieMinimalFragment} ` export default gql` query movies($offset: Float!, $query: String) { movies(limit: 25, offset: $offset, query: $query) { - _id - __typename - title - genres - synopsis - type - bookmarked - trailer - download { - downloadStatus - downloading - downloadComplete - downloadQuality - } - rating { - percentage - } - watched { - complete - progress - } - torrents { - quality - sizeString - type - } - searchedTorrents { - quality - sizeString - type - } - images { - backdrop { - full - high - } - poster { - thumb - } - } + ...movie } } + + ${movieFragment} ` diff --git a/app/modules/GraphQL/fragments/downloadFragment.js b/app/modules/GraphQL/fragments/downloadFragment.js new file mode 100644 index 0000000..2527630 --- /dev/null +++ b/app/modules/GraphQL/fragments/downloadFragment.js @@ -0,0 +1,32 @@ +import gql from 'graphql-tag' + +export default gql` + fragment download on Download { + _id + type + itemType + torrentType + status + quality + progress + numPeers + speed + timeRemaining + subtitles { + language + code + } + movie { + title + } + episode { + title + season + number + show { + title + } + } + __typename + } +` diff --git a/app/modules/GraphQL/fragments/movieFragment.js b/app/modules/GraphQL/fragments/movieFragment.js new file mode 100644 index 0000000..2369cc8 --- /dev/null +++ b/app/modules/GraphQL/fragments/movieFragment.js @@ -0,0 +1,64 @@ +import gql from 'graphql-tag' + +export const movieMinimalFragment = gql` + fragment movieMinimal on Movie { + _id + __typename + title + type + watched { + complete + progress + } + images { + poster { + thumb + } + } + } +` + +export default gql` + fragment movie on Movie { + _id + __typename + title + genres + synopsis + type + bookmarked + trailer + download { + downloadStatus + downloading + downloadComplete + downloadQuality + } + rating { + percentage + } + watched { + complete + progress + } + torrents { + quality + sizeString + type + } + searchedTorrents { + quality + sizeString + type + } + images { + backdrop { + full + high + } + poster { + thumb + } + } + } +` diff --git a/app/modules/GraphQL/fragments/torrentFragment.js b/app/modules/GraphQL/fragments/torrentFragment.js new file mode 100644 index 0000000..afb66d1 --- /dev/null +++ b/app/modules/GraphQL/fragments/torrentFragment.js @@ -0,0 +1,12 @@ +import gql from 'graphql-tag' + +export default gql` + fragment torrent on Torrent { + quality + sizeString + type + peers + seeds + provider + } +` diff --git a/app/modules/GraphQL/usePollingForDownload.js b/app/modules/GraphQL/usePollingForDownload.js deleted file mode 100644 index 107d689..0000000 --- a/app/modules/GraphQL/usePollingForDownload.js +++ /dev/null @@ -1,31 +0,0 @@ -import React, { useState, useEffect } from 'react' - -import constants from 'modules/constants' - -/** - * Starts polling for a certain download - * - * @param download - * @param downloadManager - * @returns {unknown} - */ -export const usePollingForDownload = (download, downloadManager) => { - const [data, setPollingData] = useState(null) - - useEffect(() => { - if (download && [constants.STATUS_QUEUED, constants.STATUS_DOWNLOADING].includes(download.status)) { - downloadManager.pollDownload(download, setPollingData) - } - - return () => { - if (download) { - downloadManager.stopPollDownload(download) - } - } - }, [download], - ) - - return data -} - -export default usePollingForDownload diff --git a/app/modules/IpFinder/IpFinder.js b/app/modules/IpFinder/IpFinder.js index ab81a7a..8ed526f 100644 --- a/app/modules/IpFinder/IpFinder.js +++ b/app/modules/IpFinder/IpFinder.js @@ -146,7 +146,7 @@ export default class IpFinder extends React.Component { ip, GRAPH_PORT: IpFinder.GRAPH_PORT, - SCRAPER_PORT: IpFinder.SCRAPER_PORT + SCRAPER_PORT: IpFinder.SCRAPER_PORT, }}> {children(host)} diff --git a/app/modules/PlayerManager/PlayerManager.js b/app/modules/PlayerManager/PlayerManager.js index 1737190..6d8a299 100644 --- a/app/modules/PlayerManager/PlayerManager.js +++ b/app/modules/PlayerManager/PlayerManager.js @@ -87,7 +87,7 @@ export class PlayerManager extends React.Component { startStream = async() => { const { apollo, item, torrent } = this.props - return await apollo.mutate({ + return apollo.mutate({ mutation: StartStreamMutation, variables: { _id: item._id, diff --git a/app/modules/WatchOnTvManager/WatchOnTvManager.js b/app/modules/WatchOnTvManager/WatchOnTvManager.js index 5b27297..1bd2fb9 100644 --- a/app/modules/WatchOnTvManager/WatchOnTvManager.js +++ b/app/modules/WatchOnTvManager/WatchOnTvManager.js @@ -15,8 +15,10 @@ import { SendCommandToTv, } from './WatchOnTvQueries' +export const useWatchOnTvManager = () => React.useContext(Context) + @withApollo -export default class WatchOnTvManager extends React.Component { +export class WatchOnTvManager extends React.Component { static propTypes = { isTv: PropTypes.bool, @@ -224,3 +226,5 @@ export default class WatchOnTvManager extends React.Component { } } + +export default WatchOnTvManager diff --git a/app/modules/WatchOnTvManager/index.js b/app/modules/WatchOnTvManager/index.js index 280574d..c86d296 100644 --- a/app/modules/WatchOnTvManager/index.js +++ b/app/modules/WatchOnTvManager/index.js @@ -1 +1,2 @@ export { default } from './WatchOnTvManager' +export { useWatchOnTvManager } from './WatchOnTvManager' diff --git a/app/modules/colors.js b/app/modules/colors.js index eb6ce26..1b69e8d 100644 --- a/app/modules/colors.js +++ b/app/modules/colors.js @@ -22,6 +22,8 @@ export default { BACKGROUND_03DP, BACKGROUND_04DP, + ON_SURFACE_MEDIUM, + BACKGROUND_OVERLAY: '#000000', BACKGROUND_SNACKBAR: BACKGROUND_LIGHT, BACKGROUND_TABS: '#343538', diff --git a/app/modules/constants.js b/app/modules/constants.js index 8bf0860..56768ec 100644 --- a/app/modules/constants.js +++ b/app/modules/constants.js @@ -3,6 +3,7 @@ export default { TYPE_MOVIE: 'movie', TYPE_SHOW: 'show', TYPE_EPISODE: 'episode', + TYPE_MY_EPISODE: 'my-episode', TYPE_DOWNLOAD: 'download', TYPE_STREAM: 'stream', diff --git a/app/modules/dimensions.js b/app/modules/dimensions.js index 86b8d5d..57c9386 100644 --- a/app/modules/dimensions.js +++ b/app/modules/dimensions.js @@ -6,6 +6,7 @@ const { width: screenWidth, height: screenHeight } = Dimensions.get('window') const UNIT = 8 const SKETCH_DEFAULT_WIDTH = useCorrect(360, null, 1920) +const STATUSBAR_HEIGHT = StatusBar.currentHeight const sketchAdjuster = screenWidth / SKETCH_DEFAULT_WIDTH @@ -27,9 +28,10 @@ export default { SCREEN_WIDTH: screenWidth, SCREEN_HEIGHT: screenHeight, + SCREEN_HEIGHT_NO_STATUS_BAR: screenHeight - STATUSBAR_HEIGHT, ON_SCREEN_NAVIGATION_HEIGHT: 55, - STATUSBAR_HEIGHT: StatusBar.currentHeight, + STATUSBAR_HEIGHT, BORDER_WIDTH: 1.5, BORDER_RADIUS: 5, diff --git a/app/modules/useBackButton.js b/app/modules/hooks/useBackButton.js similarity index 100% rename from app/modules/useBackButton.js rename to app/modules/hooks/useBackButton.js diff --git a/app/modules/hooks/useDownload.js b/app/modules/hooks/useDownload.js new file mode 100644 index 0000000..a953cd1 --- /dev/null +++ b/app/modules/hooks/useDownload.js @@ -0,0 +1,17 @@ +import React from 'react' + +import { useDownloadManager } from 'modules/DownloadManager' + +/** + * Returns a download from the download manager + */ +export const useDownload = (item) => { + const downloadManager = useDownloadManager() + + return [ + downloadManager.getDownload(item._id), + downloadManager + ] +} + +export default useDownload diff --git a/app/modules/hooks/usePollingForDownload.js b/app/modules/hooks/usePollingForDownload.js new file mode 100644 index 0000000..73b8641 --- /dev/null +++ b/app/modules/hooks/usePollingForDownload.js @@ -0,0 +1,39 @@ +import React from 'react' + +import constants from 'modules/constants' +import { useDownloadManager } from 'modules/DownloadManager' + +/** + * States that are valid to pull + * @type {(string)[]} + */ +export const validPollStates = [ + constants.STATUS_QUEUED, + constants.STATUS_CONNECTING, + constants.STATUS_DOWNLOADING, +] + +/** + * Starts polling for a certain download + */ +export const usePollingForDownload = (downloadToPoll) => { + const downloadManager = useDownloadManager() + + const download = downloadManager.getDownload(downloadToPoll?._id) + + React.useEffect(() => { + if (download && validPollStates.includes(download.status)) { + downloadManager.pollDownload(download) + } + + return () => { + if (download) { + downloadManager.stopPollDownload(download) + } + } + }, [download?._id, download?.status]) + + return [download, downloadManager] +} + +export default usePollingForDownload diff --git a/app/modules/i18n/translations/en.json b/app/modules/i18n/translations/en.json index 0448834..152e54e 100644 --- a/app/modules/i18n/translations/en.json +++ b/app/modules/i18n/translations/en.json @@ -51,6 +51,8 @@ "movies": "Movies", "Downloading in {{quality}}": "Downloading in {{quality}}", "Downloaded in {{quality}}": "Downloaded in {{quality}}", + "Download connecting": "Download connecting...", + "Download in queue": "Download in queue", "Version: {{version}}": "Version: {{version}}", "Movies: {{movies}}": "Movies: {{movies}}", "Shows: {{shows}}": "Shows: {{shows}}", @@ -66,5 +68,10 @@ "Most Watched Shows": "Most Watched Shows", "Added to your list": "Added to your list", "Removed from your list":"Removed from your list", - "undo": "undo" + "undo": "undo", + "Downloading {{quality}}, {{progress}}%": "Downloading in {{quality}}, {{progress}}%", + "Remove download": "Remove download", + "Remove from queue": "Remove from queue", + "Stop downloading": "Stop downloading", + "Copy to phone": "Copy to phone" } diff --git a/app/modules/utils/addZeros.js b/app/modules/utils/addZeros.js new file mode 100644 index 0000000..2eb2a80 --- /dev/null +++ b/app/modules/utils/addZeros.js @@ -0,0 +1,12 @@ +export const date = (date) => { + return `${`0${date.getDate()}`.slice(-2)}-${`0${(date.getMonth() + 1)}`.slice(-2)}-${date.getFullYear()}` +} + +export const episode = (season, episode) => { + return `S${`0${season}`.slice(-2)}E${`0${episode}`.slice(-2)}` +} + +export default { + date, + episode +} diff --git a/babel.config.js b/babel.config.js index dc4b290..a1a7223 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,7 +8,7 @@ module.exports = { [ '@babel/plugin-proposal-decorators', { - 'legacy': true, + legacy: true, }, ], @@ -21,14 +21,14 @@ module.exports = { [ 'inline-import', { - 'extensions': ['.md', '.text', '.txt'], + extensions: ['.md', '.text', '.txt'], }, ], [ 'module-resolver', { - 'root': [ + root: [ './app', ], }, diff --git a/index.js b/index.js index b29b2a0..198341f 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ import 'react-native-gesture-handler' -import { AppRegistry, LogBox, YellowBox } from 'react-native' +import { AppRegistry, LogBox } from 'react-native' import { enableScreens } from 'react-native-screens' enableScreens() diff --git a/package.json b/package.json index 9cbe761..dd94d47 100644 --- a/package.json +++ b/package.json @@ -26,13 +26,13 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@apollo/client": "^3.1.3", + "@apollo/client": "^3.2.1", "@react-native-community/async-storage": "1.12.0", "@react-native-community/masked-view": "^0.1.10", - "@react-native-community/netinfo": "5.9.6", + "@react-native-community/netinfo": "5.9.7", "@react-native-community/slider": "3.0.3", - "@react-navigation/native": "5.7.3", - "@react-navigation/stack": "5.9.0", + "@react-navigation/native": "5.7.5", + "@react-navigation/stack": "5.9.2", "apollo-cache-persist": "^0.1.1", "graphql": "15.3.0", "graphql-tag": "2.11.0", @@ -42,59 +42,59 @@ "lottie-react-native": "3.5.0", "prop-types": "^15.7.2", "react": "16.13.1", - "react-native": "0.63.2", + "react-native": "0.63.3", "react-native-animatable": "1.3.3", - "react-native-device-info": "5.6.5", + "react-native-device-info": "6.0.4", "react-native-fs": "2.16.6", - "react-native-gesture-handler": "1.7.0", + "react-native-gesture-handler": "1.8.0", "react-native-google-cast": "github:pct-org/react-native-google-cast#7e409ca7c129d628d5c2902944790bc611b64aaa", "react-native-languages": "3.0.2", "react-native-linear-gradient": "2.5.6", "react-native-markdown-renderer": "^3.2.8", "react-native-orientation": "^3.1.3", "react-native-reanimated": "1.13.0", - "react-native-safe-area-context": "3.1.7", - "react-native-screens": "2.10.1", + "react-native-safe-area-context": "3.1.8", + "react-native-screens": "2.11.0", "react-native-splash-screen": "3.2.0", "react-native-static-server": "0.5.0", - "react-native-vector-icons": "7.0.0", + "react-native-vector-icons": "7.1.0", "react-navigation-collapsible": "5.6.4", + "reanimated-bottom-sheet": "^1.0.0-alpha.22", "redux-persist-fs-storage": "^1.3.0", "subscriptions-transport-ws": "0.9.18", - "update-react-native-app": "^1.3.1", - "use-trace-update": "^1.3.0" + "update-react-native-app": "^1.3.1" }, "devDependencies": { - "@babel/core": "7.11.4", + "@babel/core": "7.11.6", "@babel/plugin-proposal-class-properties": "7.10.4", "@babel/plugin-proposal-decorators": "7.10.5", "@babel/plugin-proposal-export-namespace-from": "7.10.4", "@babel/plugin-proposal-object-rest-spread": "7.11.0", "@babel/plugin-transform-flow-strip-types": "7.10.4", - "@babel/plugin-transform-runtime": "7.11.0", + "@babel/plugin-transform-runtime": "7.11.5", "@babel/preset-react": "7.10.4", "@babel/runtime": "7.11.2", - "@commitlint/cli": "9.1.2", - "@commitlint/config-conventional": "9.1.2", + "@commitlint/cli": "11.0.0", + "@commitlint/config-conventional": "11.0.0", "babel-eslint": "10.1.0", "babel-plugin-inline-import": "^3.0.0", "babel-plugin-module-resolver": "4.0.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "1.15.3", - "eslint": "7.7.0", + "enzyme-adapter-react-16": "1.15.5", + "eslint": "7.10.0", "eslint-config-airbnb": "18.2.0", "eslint-config-standard": "14.1.1", "eslint-config-standard-react": "9.2.0", "eslint-plugin-babel": "5.3.1", - "eslint-plugin-import": "2.22.0", - "eslint-plugin-jest": "23.20.0", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-jest": "24.0.2", "eslint-plugin-jsx-a11y": "6.3.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", - "eslint-plugin-react": "7.20.6", + "eslint-plugin-react": "7.21.2", "eslint-plugin-standard": "4.0.1", "get-dev-paths": "^0.1.1", - "husky": "4.2.5", + "husky": "4.3.0", "jest": "26.4.2", "jest-enzyme": "^7.1.2", "jest-react-native": "^18.0.0", diff --git a/yarn.lock b/yarn.lock index 65dc421..aaecf2f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,12 @@ # yarn lockfile v1 -"@apollo/client@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.1.3.tgz#4ea9c3818bd2836a3dbe26088227c3d8cb46ad2b" - integrity sha512-zXMiaj+dX0sgXIwEV5d/PI6B8SZT2bqlKNjZWcEXRY7NjESF5J3nd4v8KOsrhHe+A3YhNv63tIl35Sq7uf41Pg== +"@apollo/client@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.2.1.tgz#178dfcc1eb3a35052df8f2bd44be195b78f56e93" + integrity sha512-w1EdCf3lvSwsxG2zbn8Rm31nPh9gQrB7u61BnU1QCM5BNIfOxiuuldzGNMHi5kI9KleisFvZl/9OA7pEkVg/yw== dependencies: + "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" "@wry/context" "^0.5.2" "@wry/equality" "^0.2.0" @@ -15,7 +16,8 @@ hoist-non-react-statics "^3.3.2" optimism "^0.12.1" prop-types "^15.7.2" - symbol-observable "^1.2.0" + symbol-observable "^2.0.0" + terser "^5.2.0" ts-invariant "^0.4.4" tslib "^1.10.0" zen-observable "^0.8.14" @@ -27,19 +29,19 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/core@7.11.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.4.tgz#4301dfdfafa01eeb97f1896c5501a3f0655d4229" - integrity sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg== +"@babel/core@7.11.6": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" + integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.4" + "@babel/generator" "^7.11.6" "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.4" + "@babel/parser" "^7.11.5" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -80,12 +82,12 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.11.0", "@babel/generator@^7.11.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.4.tgz#1ec7eec00defba5d6f83e50e3ee72ae2fee482be" - integrity sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g== +"@babel/generator@^7.11.5", "@babel/generator@^7.11.6": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" + integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.11.5" jsesc "^2.5.1" source-map "^0.5.0" @@ -315,10 +317,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== -"@babel/parser@^7.11.0", "@babel/parser@^7.11.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.4.tgz#6fa1a118b8b0d80d0267b719213dc947e88cc0ca" - integrity sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA== +"@babel/parser@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== "@babel/plugin-external-helpers@^7.0.0": version "7.10.4" @@ -728,10 +730,10 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-runtime@7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" - integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== +"@babel/plugin-transform-runtime@7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc" + integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg== dependencies: "@babel/helper-module-imports" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" @@ -827,7 +829,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.11.2", "@babel/runtime@^7.9.6": +"@babel/runtime@7.11.2", "@babel/runtime@^7.11.2": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== @@ -865,17 +867,17 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== +"@babel/traverse@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" + "@babel/generator" "^7.11.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" @@ -898,6 +900,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -911,141 +922,141 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@commitlint/cli@9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-9.1.2.tgz#3773699ea2ee6192f8dc14dd09b479baaaa13cd3" - integrity sha512-ctRrrPqjZ8r4Vc4FXpPaScEpkPwfvB0Us3NK2SD2AnLwXGMxOLFTabDmNySU1Xc40ud2CmJsaV8lpavvzs8ZZA== +"@commitlint/cli@11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" + integrity sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g== dependencies: - "@babel/runtime" "^7.9.6" - "@commitlint/format" "^9.1.2" - "@commitlint/lint" "^9.1.2" - "@commitlint/load" "^9.1.2" - "@commitlint/read" "^9.1.2" + "@babel/runtime" "^7.11.2" + "@commitlint/format" "^11.0.0" + "@commitlint/lint" "^11.0.0" + "@commitlint/load" "^11.0.0" + "@commitlint/read" "^11.0.0" chalk "4.1.0" core-js "^3.6.1" - get-stdin "7.0.0" + get-stdin "8.0.0" lodash "^4.17.19" resolve-from "5.0.0" resolve-global "1.0.0" yargs "^15.1.0" -"@commitlint/config-conventional@9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-9.1.2.tgz#9920ad60a2ac64eedad01845b331c970cf854a71" - integrity sha512-2zfnsrBJuCNJEKMEmltYlCUEoQNE4anvEBI/SYEuiB1JYXYaELijobDBpqhUVjh5NEpprNTY16oMZat6ewnxOg== +"@commitlint/config-conventional@11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz#3fa300a1b639273946de3c3f15e1cda518333422" + integrity sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA== dependencies: - conventional-changelog-conventionalcommits "4.3.0" + conventional-changelog-conventionalcommits "^4.3.1" -"@commitlint/ensure@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-9.1.2.tgz#0575cb42451f560cdca7f0b775ab57cdf651ec42" - integrity sha512-hwQICwpNSTsZgj/1/SdPvYAzhwjwgCJI4vLbT879+Jc+AJ6sj2bUDGw/F89vzgKz1VnaMm4D65bNhoWhG3pdhQ== +"@commitlint/ensure@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-11.0.0.tgz#3e796b968ab5b72bc6f8a6040076406306c987fb" + integrity sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug== dependencies: - "@commitlint/types" "^9.1.2" + "@commitlint/types" "^11.0.0" lodash "^4.17.19" -"@commitlint/execute-rule@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-9.1.2.tgz#74a77eae50c8d2e5766822061ddf0df1b4f08027" - integrity sha512-NGbeo0KCVYo1yj9vVPFHv6RGFpIF6wcQxpFYUKGIzZVV9Vz1WyiKS689JXa99Dt1aN0cZlEJJLnTNDIgYls0Vg== +"@commitlint/execute-rule@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" + integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== -"@commitlint/format@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-9.1.2.tgz#14938bfed22132e00be92931bfcb96dae32dfd1c" - integrity sha512-+ZWTOSGEU6dbn3NRh1q7sY5K5QLiSs7E2uSzuYnWHXcQk8nlTvnE0ibwMCQxdKLaOTZiN57fHM/7M9Re2gsRuw== +"@commitlint/format@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-11.0.0.tgz#ac47b0b9ca46540c0082c721b290794e67bdc51b" + integrity sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg== dependencies: - "@commitlint/types" "^9.1.2" + "@commitlint/types" "^11.0.0" chalk "^4.0.0" -"@commitlint/is-ignored@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-9.1.2.tgz#ac3cb01d0432d57db717da1e8bb370a283ef75bb" - integrity sha512-423W/+Ro+Cc8cg81+t9gds1EscMZNjnGT31nKDvxVxJxXiXQsYYoFEQbU+nfUrRGQsUikEgEJ3ppVGr1linvcQ== +"@commitlint/is-ignored@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz#7b803eda56276dbe7fec51eb1510676198468f39" + integrity sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg== dependencies: - "@commitlint/types" "^9.1.2" + "@commitlint/types" "^11.0.0" semver "7.3.2" -"@commitlint/lint@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-9.1.2.tgz#fbb110df8c52c1d6e5def07fb44a47066870c838" - integrity sha512-XvggqHZ4XSTKOgzJhCzz52cWRRO57QQnEviwGj0qnD4jdwC+8h2u9LNZwoa2tGAuaNM3nSm//wNK7FRZhgiiFA== +"@commitlint/lint@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-11.0.0.tgz#01e062cd1b0e7c3d756aa2c246462e0b6a3348a4" + integrity sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ== dependencies: - "@commitlint/is-ignored" "^9.1.2" - "@commitlint/parse" "^9.1.2" - "@commitlint/rules" "^9.1.2" - "@commitlint/types" "^9.1.2" + "@commitlint/is-ignored" "^11.0.0" + "@commitlint/parse" "^11.0.0" + "@commitlint/rules" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/load@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-9.1.2.tgz#c79634e8805ab35f318c535fdbda748288bf5395" - integrity sha512-FPL82xBuF7J3EJ57kLVoligQP4BFRwrknooP+vNT787AXmQ/Fddc/iYYwHwy67pNkk5N++/51UyDl/CqiHb6nA== +"@commitlint/load@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" + integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== dependencies: - "@commitlint/execute-rule" "^9.1.2" - "@commitlint/resolve-extends" "^9.1.2" - "@commitlint/types" "^9.1.2" + "@commitlint/execute-rule" "^11.0.0" + "@commitlint/resolve-extends" "^11.0.0" + "@commitlint/types" "^11.0.0" chalk "4.1.0" - cosmiconfig "^6.0.0" + cosmiconfig "^7.0.0" lodash "^4.17.19" resolve-from "^5.0.0" -"@commitlint/message@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-9.1.2.tgz#7589f03fa5807ed51adde1851db86d84e8ff3efe" - integrity sha512-ndlx5z7bPVLG347oYJUHuQ41eTcsw+aUYT1ZwQyci0Duy2atpuoeeSw9SuM1PjufzRCpb6ExzFEgGzcCRKAJsg== +"@commitlint/message@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-11.0.0.tgz#83554c3cbbc884fd07b473593bc3e94bcaa3ee05" + integrity sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA== -"@commitlint/parse@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-9.1.2.tgz#ce0f91df846f978bc369b50c23fe894536bde664" - integrity sha512-d+/VYbkotctW+lzDpus/R6xTerOqFQkW1myH+3PwnqYSE6JU/uHT4MlZNGJBv8pX9SPlR66t6X9puFobqtezEw== +"@commitlint/parse@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-11.0.0.tgz#d18b08cf67c35d02115207d7009306a2e8e7c901" + integrity sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A== dependencies: conventional-changelog-angular "^5.0.0" conventional-commits-parser "^3.0.0" -"@commitlint/read@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-9.1.2.tgz#ad8f62c733f9438fd5b388c72f7122f9038edd14" - integrity sha512-C2sNBQOqeQXMxpWtRnXYKYB3D9yuybPtQNY/P67A6o8XH/UMHkFaUTyIx1KRgu0IG0yTTItRt46FGnsMWLotvA== +"@commitlint/read@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-11.0.0.tgz#f24240548c63587bba139fa5a364cab926077016" + integrity sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g== dependencies: - "@commitlint/top-level" "^9.1.2" - fs-extra "^8.1.0" + "@commitlint/top-level" "^11.0.0" + fs-extra "^9.0.0" git-raw-commits "^2.0.0" -"@commitlint/resolve-extends@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-9.1.2.tgz#222dcb73b139b6645cf3ce3bd55db429a98600b3" - integrity sha512-HcoL+qFGmWEu9VM4fY0HI+VzF4yHcg3x+9Hx6pYFZ+r2wLbnKs964y0v68oyMO/mS/46MVoLNXZGR8U3adpadg== +"@commitlint/resolve-extends@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" + integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== dependencies: import-fresh "^3.0.0" lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-9.1.2.tgz#8ac33264785000f3f1c1b4a61b2450b7802835f9" - integrity sha512-1vecFuzqVqjiT57ocXq1bL8V6GEF1NZs3BR0dQzObaqHftImIxBVII299gasckTkcuxNc8M+7XxZyKxUthukpQ== +"@commitlint/rules@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-11.0.0.tgz#bdb310cc6fc55c9f8d7d917a22b69055c535c375" + integrity sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA== dependencies: - "@commitlint/ensure" "^9.1.2" - "@commitlint/message" "^9.1.2" - "@commitlint/to-lines" "^9.1.2" - "@commitlint/types" "^9.1.2" + "@commitlint/ensure" "^11.0.0" + "@commitlint/message" "^11.0.0" + "@commitlint/to-lines" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/to-lines@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-9.1.2.tgz#dd8761d17f1f7b9a52e255af4bed5bf311bf773f" - integrity sha512-o4zWcMf9EnzA3MOqx01780SgrKq5hqDJmUBPk30g6an0XcDuDy3OSZHHTJFdzsg4V9FjC4OY44sFeK7GN7NaxQ== +"@commitlint/to-lines@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-11.0.0.tgz#86dea151c10eea41e39ea96fa4de07839258a7fe" + integrity sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw== -"@commitlint/top-level@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-9.1.2.tgz#fba25e30e9a014fe0426cf45908509a271990ce1" - integrity sha512-KMPP5xVePcz3B1dKqcZdU4FZBVOkT+bG3ip4RQX2TeCJoomMkTjd0utALs7rpTGLID6BXbwwXepZCZJREjR/Bw== +"@commitlint/top-level@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-11.0.0.tgz#bb2d1b6e5ed3be56874633b59e1f7de118c32783" + integrity sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA== dependencies: - find-up "^4.0.0" + find-up "^5.0.0" -"@commitlint/types@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-9.1.2.tgz#d05f66db03e3a3638a654e8badf2deb489eb220d" - integrity sha512-r3fwVbVH+M8W0qYlBBZFsUwKe6NT5qvz+EmU7sr8VeN1cQ63z+3cfXyTo7WGGEMEgKiT0jboNAK3b1FZp8k9LQ== +"@commitlint/types@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" + integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== "@egjs/hammerjs@^2.0.17": version "2.0.17" @@ -1054,6 +1065,27 @@ dependencies: "@types/hammerjs" "^2.0.36" +"@eslint/eslintrc@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" + integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@graphql-typed-document-node/core@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" + integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1360,6 +1392,27 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@react-native-community/async-storage@1.12.0": version "1.12.0" resolved "https://registry.yarnpkg.com/@react-native-community/async-storage/-/async-storage-1.12.0.tgz#d2fc65bc08aa1c3e9514bbe9fe7095eab8e8aca3" @@ -1374,12 +1427,23 @@ dependencies: serve-static "^1.13.1" -"@react-native-community/cli-platform-android@^4.7.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.11.0.tgz#0ce9b88ed8b6b0ef962af49d980eb53433c17a84" - integrity sha512-BzqocGjOCjpDW0bM/LUrHMXw4nBvOhDXnHWxaoRp3eeUVsD2oSegoRn52kZo9yhPb9cCPkZJ3b+Web71Ue4j9w== +"@react-native-community/cli-hermes@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" + integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== + dependencies: + "@react-native-community/cli-platform-android" "^4.13.0" + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" + integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== dependencies: - "@react-native-community/cli-tools" "^4.11.0" + "@react-native-community/cli-tools" "^4.13.0" chalk "^3.0.0" execa "^1.0.0" fs-extra "^8.1.0" @@ -1390,12 +1454,12 @@ slash "^3.0.0" xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@^4.7.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.11.0.tgz#5870bf5f2b3c01a0aa672a7c1f7f0fe13337c6b5" - integrity sha512-/qkjnhhJ7BGBTNkHSS8a+z8UgWUQbU6YZOTuYxjNywGUzMiTsb/wlm2cWCY1VEAvWtY97c4plAZ5OferPJHaVA== +"@react-native-community/cli-platform-ios@^4.10.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" + integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== dependencies: - "@react-native-community/cli-tools" "^4.11.0" + "@react-native-community/cli-tools" "^4.13.0" chalk "^3.0.0" glob "^7.1.3" js-yaml "^3.13.1" @@ -1403,13 +1467,13 @@ plist "^3.0.1" xcode "^2.0.0" -"@react-native-community/cli-server-api@^4.11.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.11.0.tgz#93887ab8496c9d89b53817297974670184be1191" - integrity sha512-vrRaGq7ezsxyyUsFhAboEtA1CHLDa2UpJygOWHip30LaAluM+vopAJbau2NtHVX54vgQzXo438Tx8TXiRacPhA== +"@react-native-community/cli-server-api@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.0.tgz#ef0e53fe0edc7356d62bca725ca47cb368f748a5" + integrity sha512-ER138ChLc1YYX7j9yE6fDm4DdNdsHThr+pla/B6iZoKje1r7TwymDdKaUvOsYalG7sWG9glW3bofcCq+Yh0Dvw== dependencies: "@react-native-community/cli-debugger-ui" "^4.9.0" - "@react-native-community/cli-tools" "^4.11.0" + "@react-native-community/cli-tools" "^4.13.0" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.0" @@ -1417,10 +1481,10 @@ serve-static "^1.13.1" ws "^1.1.0" -"@react-native-community/cli-tools@^4.11.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.11.0.tgz#a53a51da76468a37f89ef7db808acc1d3c5f9cea" - integrity sha512-o2dh9q/778lIYBJxgIvTXkcxi9bSozjt8lv3tpyVmLZNA/PAPmQ7CafT37jWWwdmaSgP7nWyp4DtuE/gRsrXkA== +"@react-native-community/cli-tools@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" + integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== dependencies: chalk "^3.0.0" lodash "^4.17.15" @@ -1434,15 +1498,16 @@ resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== -"@react-native-community/cli@^4.7.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.12.0.tgz#42ca3eacd4b4ba2bd5126aba6a032952e66835b5" - integrity sha512-zIrKxgHsQ5EUGjZ+oIW54+qY2XqVwDJbGV3hzsVsCFXleos2QUAQWskR0BG9zf06P1HT8kfwuDuHs/p1Ywe0rg== +"@react-native-community/cli@^4.10.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.13.0.tgz#04d5032f9b2b423c61ceef6be83b1bcc8a37db75" + integrity sha512-R+1VehIQ6VTLf+e7YOwzJk0F9tstfeSC4xy7oT6GSgB3FnXbTJGHFUp4siyO68Ae/gzGqt8SiUO145teWkP+ZA== dependencies: "@hapi/joi" "^15.0.3" "@react-native-community/cli-debugger-ui" "^4.9.0" - "@react-native-community/cli-server-api" "^4.11.0" - "@react-native-community/cli-tools" "^4.11.0" + "@react-native-community/cli-hermes" "^4.13.0" + "@react-native-community/cli-server-api" "^4.13.0" + "@react-native-community/cli-tools" "^4.13.0" "@react-native-community/cli-types" "^4.10.1" chalk "^3.0.0" command-exists "^1.2.8" @@ -1479,47 +1544,47 @@ resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.10.tgz#5dda643e19e587793bc2034dd9bf7398ad43d401" integrity sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ== -"@react-native-community/netinfo@5.9.6": - version "5.9.6" - resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-5.9.6.tgz#fab6cd78fe740f9c674b4a93abd77f6bfb90f655" - integrity sha512-cEkA1Apg8+VjnDdeDZRHI+2RqouiPKgYnewouRkvF4ettH9ZS4Cmi/nANQKIpIu2L+czboxM3fCZ44nc7IM9VQ== +"@react-native-community/netinfo@5.9.7": + version "5.9.7" + resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-5.9.7.tgz#769c6b306ea6bbaa1c4a3fffdd183d0cfc30ed7e" + integrity sha512-NAkkT68oF+M9o6El2xeUqZK7magPjG/tAcEbvCbqyhlh3yElKWnI1e1vpbVvFXzTefy67FwYFWOJqBN6U7Mnkg== "@react-native-community/slider@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@react-native-community/slider/-/slider-3.0.3.tgz#830167fd757ba70ac638747ba3169b2dbae60330" integrity sha512-8IeHfDwJ9/CTUwFs6x90VlobV3BfuPgNLjTgC6dRZovfCWigaZwVNIFFJnHBakK3pW2xErAPwhdvNR4JeNoYbw== -"@react-navigation/core@^5.12.3": - version "5.12.3" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.12.3.tgz#0484fcca290569a0dc10b70b99f00edd3f1fd93c" - integrity sha512-aEOTAw4FRRNsNu6F9ibLk3SVSs4Res8BI832NEZN6qUto5ZgtuYnQHWeWV2cZ43Nc9KvUyQC/vXvO2RScwgFwA== +"@react-navigation/core@^5.12.4": + version "5.12.4" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.12.4.tgz#1bd0c81d098895c8ffe49f8624fae60c9abc5684" + integrity sha512-vhaVIJGfSgln4dIoO4R2HeX9p3Vc7OJLa0/JpKHpXn/DZgNVn+RP7ktk1CRZ16ikUJ0k8CxzuvRxeRIg7EhA7w== dependencies: - "@react-navigation/routers" "^5.4.11" + "@react-navigation/routers" "^5.4.12" escape-string-regexp "^4.0.0" nanoid "^3.1.12" query-string "^6.13.1" react-is "^16.13.0" use-subscription "^1.4.0" -"@react-navigation/native@5.7.3": - version "5.7.3" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.7.3.tgz#3cda5ee7b0fe0d980db6d788419f0af50a64deac" - integrity sha512-bXb1g/cLpGF2DW1Vxk90Ch5vbaZTk5b/4Fn5xjQlueQODgc9ca+GPEssKZ84hCrNmS+Xg+iK1m/ArawLF5gMlw== +"@react-navigation/native@5.7.5": + version "5.7.5" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.7.5.tgz#478579435549a1c5c9901c9c6b3c1f75fa7dbf0c" + integrity sha512-HZpfxXF740XsA0HkeohGETo/zOmlMFb65XElQOk9+dPoN+36y2olZC/f7HuqpucsU925zg7jrnyUnW6tCtc3IA== dependencies: - "@react-navigation/core" "^5.12.3" + "@react-navigation/core" "^5.12.4" nanoid "^3.1.12" -"@react-navigation/routers@^5.4.11": - version "5.4.11" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.4.11.tgz#75dbec1809e282c3749068845099c5bee2c792f0" - integrity sha512-J/CsHdIjYBRe81UUiLOoz9NSrQ91uP23Oe21QPCALInRHx+rfwo2oPl6Fn8xAa7n8Dtt2oQUGyF+g5d05cB74w== +"@react-navigation/routers@^5.4.12": + version "5.4.12" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.4.12.tgz#5c3690650c94be3a54b617a1c07510d2f604c03f" + integrity sha512-IwMmxeb5e6LboljhakmhtrHBXLYFrFDr2c1GjAG538e4MjT4QGi/ZYckAxCh/NqKI0knnzqKppPl2NsOMv/NoQ== dependencies: nanoid "^3.1.12" -"@react-navigation/stack@5.9.0": - version "5.9.0" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.9.0.tgz#bf24607175bf502798cc4c832aa8a86e55f3b365" - integrity sha512-kt6M0ZLMyNKXfKi50n01bHg4/d8zp0Yh5QaQG4d1roWOqdV9ou1nFEK4l2yQ6XKH2lLSYswHElPDZUuWd+6XzA== +"@react-navigation/stack@5.9.2": + version "5.9.2" + resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.9.2.tgz#68841c9ef032177d15664b14cff62e16698f89c7" + integrity sha512-imEvTuCNsIo3ZriN6eIreGaxypuuB9ZOqdUXfxJznzMCkb7lN4OR/YVztAJW3QQzhuD4vwly+7jDvt7SxyfSuw== dependencies: color "^3.1.2" react-native-iphone-x-helper "^1.2.1" @@ -1704,29 +1769,53 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== -"@typescript-eslint/experimental-utils@^2.5.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== +"@typescript-eslint/experimental-utils@^4.0.1": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.2.0.tgz#3d0b5cd4aa61f5eb7aa1e873dea0db1410b062d2" + integrity sha512-5BBj6BjgHEndBaQQpUVzRIPERz03LBc0MCQkHwUaH044FJFL08SwWv/sQftk7gf0ShZ2xZysz0LTwCwNt4Xu3w== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/scope-manager" "4.2.0" + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/typescript-estree" "4.2.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== +"@typescript-eslint/scope-manager@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.2.0.tgz#d10e6854a65e175b22a28265d372a97c8cce4bfc" + integrity sha512-Tb402cxxObSxWIVT+PnBp5ruT2V/36yj6gG4C9AjkgRlZpxrLAzWDk3neen6ToMBGeGdxtnfFLoJRUecGz9mYQ== + dependencies: + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/visitor-keys" "4.2.0" + +"@typescript-eslint/types@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.2.0.tgz#6f6b094329e72040f173123832397c7c0b910fc8" + integrity sha512-xkv5nIsxfI/Di9eVwN+G9reWl7Me9R5jpzmZUch58uQ7g0/hHVuGUbbn4NcxcM5y/R4wuJIIEPKPDb5l4Fdmwg== + +"@typescript-eslint/typescript-estree@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.2.0.tgz#9d746240991c305bf225ad5e96cbf57e7fea0551" + integrity sha512-iWDLCB7z4MGkLipduF6EOotdHNtgxuNKnYD54nMS/oitFnsk4S3S/TE/UYXQTra550lHtlv9eGmp+dvN9pUDtA== dependencies: + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/visitor-keys" "4.2.0" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + globby "^11.0.1" is-glob "^4.0.1" lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/visitor-keys@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.2.0.tgz#ae13838e3a260b63ae51021ecaf1d0cdea8dbba5" + integrity sha512-WIf4BNOlFOH2W+YqGWa6YKLcK/EB3gEj2apCrqLw6mme1RzBy0jtJ9ewJgnrZDB640zfnv8L+/gwGH5sYp/rGw== + dependencies: + "@typescript-eslint/types" "4.2.0" + eslint-visitor-keys "^2.0.0" + "@wry/context@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.2.tgz#f2a5d5ab9227343aa74c81e06533c1ef84598ec7" @@ -1850,6 +1939,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.4: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + anser@^1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" @@ -2052,6 +2151,11 @@ array-slice@^0.2.3: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -2141,6 +2245,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -2697,7 +2806,7 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -commander@^2.19.0: +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2712,14 +2821,6 @@ commondir@^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.4" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.4.tgz#6b07c4c5e8341119baf44578085bda0f4a823516" - integrity sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q== - dependencies: - array-ify "^1.0.0" - dot-prop "^3.0.0" - compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -2801,12 +2902,12 @@ conventional-changelog-angular@^5.0.0: compare-func "^2.0.0" q "^1.5.1" -conventional-changelog-conventionalcommits@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz#c4205a659f7ca9d7881f29ee78a4e7d6aeb8b3c2" - integrity sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg== +conventional-changelog-conventionalcommits@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz#8d96687141c9bbd725a89b95c04966d364194cd4" + integrity sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" lodash "^4.17.15" q "^1.5.1" @@ -2865,16 +2966,16 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" cross-spawn@^5.1.0: version "5.1.0" @@ -3126,6 +3227,13 @@ diff-sequences@^26.3.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.3.0.tgz#62a59b1b29ab7fd27cef2a33ae52abe73042d0a2" integrity sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" @@ -3216,13 +3324,6 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -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" - dot-prop@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" @@ -3304,10 +3405,10 @@ envinfo@^7.7.2: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== -enzyme-adapter-react-16@1.15.3: - version "1.15.3" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.3.tgz#90154055be3318d70a51df61ac89cfa22e3d5f60" - integrity sha512-98rqNI4n9HZslWIPuuwy4hK1bxRuMy+XX0CU1dS8iUqcgisTxeBaap6oPp2r4MWC8OphCbbqAT8EU/xHz3zIaQ== +enzyme-adapter-react-16@1.15.5: + version "1.15.5" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.5.tgz#7a6f0093d3edd2f7025b36e7fbf290695473ee04" + integrity sha512-33yUJGT1nHFQlbVI5qdo5Pfqvu/h4qPwi1o0a6ZZsjpiqq92a3HjynDhwd1IeED+Su60HDWV8mxJqkTnLYdGkw== dependencies: enzyme-adapter-utils "^1.13.1" enzyme-shallow-equal "^1.0.4" @@ -3499,7 +3600,7 @@ eslint-config-standard@14.1.1: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== -eslint-import-resolver-node@^0.3.3: +eslint-import-resolver-node@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== @@ -3530,17 +3631,17 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== +eslint-plugin-import@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" + eslint-import-resolver-node "^0.3.4" eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" @@ -3549,12 +3650,12 @@ eslint-plugin-import@2.22.0: resolve "^1.17.0" tsconfig-paths "^3.9.0" -eslint-plugin-jest@23.20.0: - version "23.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.20.0.tgz#e1d69c75f639e99d836642453c4e75ed22da4099" - integrity sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw== +eslint-plugin-jest@24.0.2: + version "24.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.0.2.tgz#4bf0fcdc86289d702a7dacb430b4363482af773b" + integrity sha512-DSBLNpkKDOpUJQkTGSs5sVJWsu0nDyQ2rYxkr0Eh7nrkc5bMUr/dlDbtTj3l8y6UaCVsem6rryF1OZrKnz1S5g== dependencies: - "@typescript-eslint/experimental-utils" "^2.5.0" + "@typescript-eslint/experimental-utils" "^4.0.1" eslint-plugin-jsx-a11y@6.3.1: version "6.3.1" @@ -3590,10 +3691,10 @@ eslint-plugin-promise@4.2.1: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== -eslint-plugin-react@7.20.6: - version "7.20.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz#4d7845311a93c463493ccfa0a19c9c5d0fd69f60" - integrity sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg== +eslint-plugin-react@7.21.2: + version "7.21.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.2.tgz#3bd5d2c4c36d5a0428d0d6dda301ac9a84d681b2" + integrity sha512-j3XKvrK3rpBzveKFbgAeGsWb9uz6iUOrR0jixRfjwdFeGSRsXvVTFtHDQYCjsd1/6Z/xvb8Vy3LiI5Reo7fDrg== dependencies: array-includes "^3.1.1" array.prototype.flatmap "^1.2.3" @@ -3617,7 +3718,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.0.0, eslint-scope@^5.1.0: +eslint-scope@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== @@ -3625,6 +3726,14 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -3637,22 +3746,28 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@7.7.0: - version "7.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073" - integrity sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@7.10.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" + integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.3" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^1.3.0" - espree "^7.2.0" + espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -3679,7 +3794,7 @@ eslint@7.7.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.2.0: +espree@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== @@ -3707,6 +3822,13 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" @@ -3717,6 +3839,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3875,6 +4002,18 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -3885,6 +4024,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -4015,6 +4161,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-versions@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" @@ -4085,6 +4239,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4150,10 +4314,10 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== +get-stdin@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== get-stream@^4.0.0: version "4.1.0" @@ -4192,7 +4356,7 @@ git-raw-commits@^2.0.0: split2 "^2.0.0" through2 "^3.0.0" -glob-parent@^5.0.0: +glob-parent@^5.0.0, glob-parent@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== @@ -4230,6 +4394,18 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.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.2.0, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -4326,18 +4502,20 @@ hermes-engine@~0.5.0: resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== -hoist-non-react-statics@3.3.2, hoist-non-react-statics@^3.3.2: +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + +hoist-non-react-statics@3.3.2, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" -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== - hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -4406,15 +4584,15 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -husky@4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" - integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== +husky@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" + integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== dependencies: chalk "^4.0.0" ci-info "^2.0.0" compare-versions "^3.6.0" - cosmiconfig "^6.0.0" + cosmiconfig "^7.0.0" find-versions "^3.2.0" opencollective-postinstall "^2.0.2" pkg-dir "^4.2.0" @@ -4446,7 +4624,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: +ignore@^5.1.1, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -4464,7 +4642,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.1.0: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -4549,6 +4727,11 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -5555,6 +5738,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -5717,6 +5909,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash._baseisequal@^3.0.0: version "3.0.7" resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" @@ -5751,6 +5950,11 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= +lodash.frompairs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz#bc4e5207fa2757c136e573614e9664506b2b1bd2" + integrity sha1-vE5SB/onV8E25XNhTpZkUGsrG9I= + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -5774,6 +5978,11 @@ lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + lodash.istypedarray@^3.0.0: version "3.0.6" resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" @@ -5788,12 +5997,22 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + lodash.sortby@^4.7.0: version "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: +lodash.template@^4.0.2, lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== @@ -5955,6 +6174,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + metro-babel-register@0.58.0: version "0.58.0" resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.58.0.tgz#5c44786d49a044048df56cf476a2263491d4f53a" @@ -6842,6 +7066,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -6863,6 +7094,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6996,7 +7234,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -7280,10 +7518,10 @@ react-native-animatable@1.3.3: dependencies: prop-types "^15.7.2" -react-native-device-info@5.6.5: - version "5.6.5" - resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-5.6.5.tgz#3f18d7c38b21cfc475163351a9aae6e9037a43a0" - integrity sha512-l457wv7gYXSRnm38AH+NpCgKYa1zxxfN0EL8mTBxo+TnasXtk0FZ86zWDLhm4eqpcSH8xpT/+z2MQrATfqCaoA== +react-native-device-info@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-6.0.4.tgz#88ef9f19715186d0b016b37e738d08b990fcf9e3" + integrity sha512-nLwQ2yPmR0Z/msVP7vD0dZe1qzBMpzYpyY5q4/t31pPHT08bu0D5MYVr0K+MnPZMISu1UOUZpVARvfVMLZBMJg== react-native-fit-image@^1.5.2: version "1.5.5" @@ -7300,13 +7538,13 @@ react-native-fs@2.16.6, react-native-fs@^2.14.1: base-64 "^0.1.0" utf8 "^3.0.0" -react-native-gesture-handler@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-1.7.0.tgz#0ef74a5ba836832e497dc49eb1ce58baa6c617e5" - integrity sha512-1CrjJf8Z6Iz2XWzfZknYtsm2sud5Lu/pLhhokkgBIKttxqGDtetDEVFDJOTJWJyKCrUPk0X5tnWi/diSF4q++w== +react-native-gesture-handler@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-1.8.0.tgz#18f61f51da50320f938957b0ee79bc58f47449dc" + integrity sha512-E2FZa0qZ5Bi0Z8Jg4n9DaFomHvedSjwbO2DPmUUHYRy1lH2yxXUpSrqJd6yymu+Efzmjg2+JZzsjFYA2Iq8VEQ== dependencies: "@egjs/hammerjs" "^2.0.17" - hoist-non-react-statics "^2.3.1" + hoist-non-react-statics "^3.3.0" invariant "^2.2.4" prop-types "^15.7.2" @@ -7354,10 +7592,10 @@ react-native-reanimated@1.13.0: dependencies: fbjs "^1.0.0" -react-native-safe-area-context@3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-3.1.7.tgz#fc9e636dfb168f992a2172d363509ce0611a8403" - integrity sha512-qSyg/pVMwVPgAy8yCvw349Q+uEUhtRBV33eVXHHkfoou1vCChJxI7SmNR47/6M3BLdjWcyc4lcd018Kx+jhQCw== +react-native-safe-area-context@3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-3.1.8.tgz#7a9883aa0f38f9c77d4bef2b89e4e285bc1024a3" + integrity sha512-9gUlsDZ96QwT9AKzA6aVWM/NX5rlJgauZ9HgCDVzKbe29UQYT1740QJnnaI2GExmkFGp6o7ZLNhCXZW95eYVFA== react-native-safe-modules@^1.0.0: version "1.0.0" @@ -7366,10 +7604,10 @@ react-native-safe-modules@^1.0.0: dependencies: dedent "^0.6.0" -react-native-screens@2.10.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.10.1.tgz#06d22fae87ef0ce51c616c34a199726db1403b95" - integrity sha512-Z2kKSk4AwWRQNCBmTjViuBQK0/Lx0jc25TZptn/2gKYUCOuVRvCekoA26u0Tsb3BIQ8tWDsZW14OwDlFUXW1aw== +react-native-screens@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.11.0.tgz#34b30b07c2d04aa100cba984b944b303bfa43ea6" + integrity sha512-vJzJE3zI1XUtqthrX3Dh2TBQWB+xFyaGhF52KBq9FjJUN5ws4xpLZJxBWa1KbGV3DilmcSZ4jmZR5LGordwE7w== react-native-splash-screen@3.2.0: version "3.2.0" @@ -7381,24 +7619,29 @@ react-native-static-server@0.5.0: resolved "https://registry.yarnpkg.com/react-native-static-server/-/react-native-static-server-0.5.0.tgz#4b396082bfe7dfdbba6fe7d7de894de5ba4ebadb" integrity sha512-RGteckPoBZq48p9Y8V67bjZGPxLHKkEOAffLSUJiGC7hkx+H+zuekqCR+04F30NuWB7y+nb8N7Qld2RGjX5DNg== -react-native-vector-icons@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-7.0.0.tgz#5b92ed363c867645daad48c559e1f99efcfbb813" - integrity sha512-Ku8+dTUAnR9pexRPQqsUcQEZlxEpFZsIy8iOFqVL/3mrUyncZJHtqJyx2cUOmltZIC6W2GI4IkD3EYzPerXV5g== +react-native-vector-icons@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-7.1.0.tgz#145487d617b2a81d395d2cf64e6e065fcab3a454" + integrity sha512-V2a1zJ4i+kS8O4j183gIwX14St9AxxXabxwYpFBgRhvr2NDXyFcjHDEAgrOYYlt2W57e20aN1tBDU/I+wn9WtQ== dependencies: - lodash "^4.17.15" + lodash.frompairs "^4.0.1" + lodash.isequal "^4.5.0" + lodash.isstring "^4.0.1" + lodash.omit "^4.5.0" + lodash.pick "^4.4.0" + lodash.template "^4.5.0" prop-types "^15.7.2" yargs "^15.0.2" -react-native@0.63.2: - version "0.63.2" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.2.tgz#eaebf3430577b37fbd66ef228a86b3408259ef8e" - integrity sha512-MkxHeJorUDzmQwKJrTfrFYMDRLyu9GSBpsFFMDX7X+HglVnaZi3CTzW2mRv1eIcazoseBOP2eJe+bnkyLl8Y2A== +react-native@0.63.3: + version "0.63.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.3.tgz#4a7f6540e049ff41810887bbd1125abc4672f3bf" + integrity sha512-71wq13uNo5W8QVQnFlnzZ3AD+XgUBYGhpsxysQFW/hJ8GAt/J5o+Bvhy81FXichp6IBDJDh/JgfHH2gNji8dFA== dependencies: "@babel/runtime" "^7.0.0" - "@react-native-community/cli" "^4.7.0" - "@react-native-community/cli-platform-android" "^4.7.0" - "@react-native-community/cli-platform-ios" "^4.7.0" + "@react-native-community/cli" "^4.10.0" + "@react-native-community/cli-platform-android" "^4.10.0" + "@react-native-community/cli-platform-ios" "^4.10.0" abort-controller "^3.0.0" anser "^1.4.9" base64-js "^1.1.2" @@ -7536,6 +7779,11 @@ realpath-native@^1.0.2, realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +reanimated-bottom-sheet@^1.0.0-alpha.22: + version "1.0.0-alpha.22" + resolved "https://registry.yarnpkg.com/reanimated-bottom-sheet/-/reanimated-bottom-sheet-1.0.0-alpha.22.tgz#01a200946f1a461f01f1e773e5b4961c2df2e53b" + integrity sha512-NxecCn+2iA4YzkFuRK5/b86GHHS2OhZ9VRgiM4q18AC20YE/psRilqxzXCKBEvkOjP5AaAvY0yfE7EkEFBjTvw== + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -7758,6 +8006,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -7802,6 +8055,11 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -8112,7 +8370,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.6: +source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -8385,7 +8643,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -8440,11 +8698,16 @@ symbol-observable@1.0.1: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= -symbol-observable@^1.0.4, symbol-observable@^1.2.0: +symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-observable@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.1.tgz#ce66c36a04ed0f3056e7293184749a6fdd7063ea" + integrity sha512-QrfHrrEUMadQCgMijc3YpfA4ncwgqGv58Xgvdu3JZVQB7iY7cAkiqobZEZbaA863jof8AdpR01CPnZ5UWeqZBQ== + symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -8476,6 +8739,15 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terser@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.2.tgz#f4bea90eb92945b2a028ceef79181b9bb586e7af" + integrity sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -8799,6 +9071,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -8839,11 +9116,6 @@ use-subscription@^1.0.0, use-subscription@^1.4.0: dependencies: object-assign "^4.1.1" -use-trace-update@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-trace-update/-/use-trace-update-1.3.0.tgz#27c04a080d8af5df23be7a9579ab5123ea871830" - integrity sha512-VMhNnpoMUKm3Upm7zMe+Tn9uvul9wp9hF6RF+0iGeCdNeH+lt+CkSyr9QA18aNgFsDSwvDu6lxJ3Cqlqn0PYJQ== - use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -9186,7 +9458,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yaml@^1.7.2: +yaml@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==