From 033294374b91569318229ede5f18cb0b791ba91e Mon Sep 17 00:00:00 2001 From: HuyDo Date: Wed, 9 Oct 2024 09:25:31 +0700 Subject: [PATCH 1/4] feat: [FC-14] add custom audio message --- package.json | 10 +- src/addons/audio/VoiceRecorderModal.tsx | 382 ++++++++++++++++++ .../audio/components/AudioPlayerControls.tsx | 130 ++++++ src/addons/audio/components/DurationTimer.tsx | 64 +++ src/addons/audio/components/PlayAudio.tsx | 161 ++++++++ src/addons/audio/components/WaveForm.tsx | 97 +++++ src/addons/audio/index.ts | 6 + src/addons/camera/CameraView.tsx | 7 +- src/addons/index.ts | 2 + src/asset/index.ts | 2 + src/chat/ChatScreen.tsx | 31 ++ src/chat/components/bubble/CustomBubble.tsx | 25 +- .../components/bubble/CustomBubbleVoice.tsx | 161 ++++++++ src/chat/components/bubble/index.ts | 1 + src/chat/components/slider/index.tsx | 14 +- src/chat_obs/ChatProvider.tsx | 265 ------------ src/chat_obs/components/CustomMessageView.tsx | 119 ------ src/chat_obs/components/PhotoGalleryView.tsx | 72 ---- src/chat_obs/constanst.ts | 6 - src/images/delete.png | Bin 0 -> 685 bytes src/images/pause_red.png | Bin 0 -> 1847 bytes src/images/play_audio.png | Bin 0 -> 2721 bytes src/images/play_green.png | Bin 0 -> 1001 bytes src/images/replay.png | Bin 0 -> 6018 bytes src/images/send_audio.png | Bin 0 -> 1595 bytes src/index.tsx | 5 + src/interfaces/conversation.ts | 1 + src/interfaces/message.ts | 11 +- src/services/firebase/firestore.ts | 48 ++- src/services/firebase/storage.ts | 5 +- src/utilities/audio.ts | 163 ++++++++ src/utilities/index.ts | 1 + src/utilities/messageFormatter.ts | 56 ++- yarn.lock | 125 ++++++ 34 files changed, 1465 insertions(+), 505 deletions(-) create mode 100644 src/addons/audio/VoiceRecorderModal.tsx create mode 100644 src/addons/audio/components/AudioPlayerControls.tsx create mode 100644 src/addons/audio/components/DurationTimer.tsx create mode 100644 src/addons/audio/components/PlayAudio.tsx create mode 100644 src/addons/audio/components/WaveForm.tsx create mode 100644 src/addons/audio/index.ts create mode 100644 src/addons/index.ts create mode 100644 src/chat/components/bubble/CustomBubbleVoice.tsx delete mode 100644 src/chat_obs/ChatProvider.tsx delete mode 100644 src/chat_obs/components/CustomMessageView.tsx delete mode 100644 src/chat_obs/components/PhotoGalleryView.tsx delete mode 100644 src/chat_obs/constanst.ts create mode 100644 src/images/delete.png create mode 100644 src/images/pause_red.png create mode 100644 src/images/play_audio.png create mode 100644 src/images/play_green.png create mode 100644 src/images/replay.png create mode 100644 src/images/send_audio.png create mode 100644 src/index.tsx create mode 100644 src/utilities/audio.ts diff --git a/package.json b/package.json index 6c7c893..acc612a 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,14 @@ "react-native-gifted-chat": "^2.6.3", "react-native-image-picker": "^7.1.2", "react-native-reanimated": "^3.15.3", - "react-native-safe-area-context": "^4.11.0" + "react-native-safe-area-context": "^4.11.0", + "react-native-audio-recorder-player": "^3.6.11", + "react-native-fast-image": "^8.6.3", + "react-native-fs": "^2.20.0", + "react-native-svg": "^15.3.0", + "react-native-uuid": "^2.0.2", + "react-native-video": "^6.2.0", + "react-native-vision-camera": "^4.1.0", + "uuid": "^10.0.0" } } diff --git a/src/addons/audio/VoiceRecorderModal.tsx b/src/addons/audio/VoiceRecorderModal.tsx new file mode 100644 index 0000000..1b9fba6 --- /dev/null +++ b/src/addons/audio/VoiceRecorderModal.tsx @@ -0,0 +1,382 @@ +import React, { + useState, + useImperativeHandle, + forwardRef, + useCallback, + useMemo, + useEffect, +} from 'react'; +import { + Modal, + View, + Text, + TouchableOpacity, + StyleSheet, + Image, + Pressable, + Alert, +} from 'react-native'; + +import uuid from 'react-native-uuid'; + +import { + convertExtension, + getState, + subscribe, + startRecording, + stopRecording, + addRecordBackListener, + removeRecordBackListener, +} from '../../utilities'; +import { + MessageTypes, + type IUserInfo, + type MessageProps, +} from '../../interfaces'; +import { PlayAudio } from './components/PlayAudio'; +import WaveForm from './components/WaveForm'; +import { useChatContext } from 'rn-firebase-chat'; + +interface VoiceRecorderModalProps { + userInfo: IUserInfo | null; + onSend: (message: MessageProps) => void; + marginHorizontalStyle?: number; + customSlider?: ( + currentDurationSec: number, + currentPositionSec: number, + onSlideRelease: (value: number) => void, + onSlideStart: (value: number) => void, + onSlideMove: (e: any, gestureState: any) => void + ) => React.ReactNode; +} + +export interface VoiceRecorderModalRef { + show: () => void; + hide: () => void; +} + +const ImageURL = { + delete: require('../../images/delete.png'), + playAudio: require('../../images/play_audio.png'), + sendAudio: require('../../images/send_audio.png'), + replay: require('../../images/replay.png'), +}; + +export const VoiceRecorderModal = forwardRef< + VoiceRecorderModalRef, + VoiceRecorderModalProps +>((props, ref) => { + const { onSend, marginHorizontalStyle, customSlider } = props; + const { userInfo } = useChatContext(); + const [isVisible, setIsVisible] = useState(false); + const [isRecord, setIsRecord] = useState(false); + const [isReplay, setReplay] = useState(false); + const [waveform, setWaveform] = useState([]); + const [recordTime, setRecordTime] = useState(0); + + const [stateAudio, setStateAudio] = useState(getState()); + + const [uri, setUri] = useState(null); + + useImperativeHandle(ref, () => ({ + show: () => setIsVisible(true), + hide: () => setIsVisible(false), + })); + + const reset = useCallback(() => { + setIsVisible(false); + setIsRecord(false); + setReplay(false); + setUri(''); + setWaveform([]); + }, []); + + const onSendMessage = useCallback( + async (path: string) => { + try { + const extension = convertExtension(path); + const type = MessageTypes.voice; + const id = uuid.v4(); + const message = { + id: id, + _id: id, + type: type, + path: path, + extension, + duration: recordTime, + fileName: 'Audio_' + id, + } as MessageProps; + const user = { + _id: userInfo?.id || '', + ...userInfo, + }; + message.user = user; + onSend(message); + } catch (error) { + console.log('error: ', error); + } + reset(); + }, + [onSend, recordTime, reset, userInfo] + ); + + const getLevel = useMemo( + () => (metering: number) => { + if (metering > 50) { + return 10; + } else if (metering > 45 && metering <= 50) { + return 20; + } else if (metering > 40 && metering <= 45) { + return 30; + } else if (metering > 35 && metering <= 40) { + return 40; + } else if (metering > 30 && metering <= 35) { + return 45; + } else { + return 50; + } + }, + [] + ); + + const onStartRecord = useCallback(async () => { + setIsRecord(true); + startRecording(); + addRecordBackListener((e) => { + const { currentMetering } = e || {}; + const volume = getLevel(Math.abs(currentMetering || 0)); + setWaveform((prevWaveform) => [...prevWaveform, volume]); + setRecordTime(Math.floor(e.currentPosition / 1000)); + }); + }, [getLevel]); + + const onStopRecord = useCallback(async () => { + stopRecording(); + const path = stateAudio.recordingUri; + setUri(path); + setIsRecord(false); + }, [stateAudio.recordingUri]); + + const handleDelete = useCallback(() => { + reset(); + onStopRecord(); + }, [onStopRecord, reset]); + + const handleReplay = useCallback(() => { + setReplay(true); + onStopRecord(); + }, [onStopRecord]); + + const handleSendReplay = useCallback(async () => { + const path = await stopRecording(); + console.log('path: ', path); + setUri(path); + if (path) { + onSendMessage(path); + } else { + Alert.alert('Failed to send audio'); + } + setIsVisible(false); + }, [onSendMessage]); + + const handleSend = useCallback(async () => { + if (isRecord) { + handleSendReplay(); + } else { + onStartRecord(); + } + }, [handleSendReplay, isRecord, onStartRecord]); + + const handleOutsidePress = () => { + if (isRecord || isReplay) { + Alert.alert('Are you sure you want to delete this recording?', '', [ + { + text: 'Cancel', + onPress: () => {}, + style: 'cancel', + }, + { + text: 'Delete', + onPress: reset, + }, + ]); + } else { + reset(); + } + }; + + useEffect(() => { + const unsubscribe = subscribe(setStateAudio); + return () => { + unsubscribe(); + removeRecordBackListener(); + }; + }, []); + + const renderPlayRecord = () => ( + + {isRecord && ( + + )} + Press to record + + {isRecord && ( + + + + + Delete + + )} + + + + + + {isRecord && ( + + + + + Replay + + )} + + + ); + + const renderReplayRecord = (path: string) => ( + + + + + + + + + + Delete + + + + + + Send + + + + ); + + return ( + setIsVisible(false)} + style={styles.modal} + > + + {!isReplay ? renderPlayRecord() : uri && renderReplayRecord(uri)} + + ); +}); + +const styles = StyleSheet.create({ + modal: { + backgroundColor: 'transparent', + }, + overlay: { + flex: 1, + justifyContent: 'flex-end', + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + modalContainer: { + backgroundColor: 'white', + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + padding: 20, + alignItems: 'center', + height: 260, + justifyContent: 'center', + zIndex: 1, + position: 'absolute', + bottom: 0, + right: 0, + left: 0, + }, + progressBar: { + width: '90%', + height: 40, + }, + durationText: { + position: 'absolute', + right: 30, + top: 10, + color: '#000', + fontSize: 16, + }, + modeText: { + marginBottom: 30, + color: '#000', + fontSize: 16, + }, + buttonContainer: { + flexDirection: 'row', + justifyContent: 'space-around', + alignItems: 'center', + width: '100%', + }, + containerReplay: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + width: '100%', + marginTop: 20, + }, + button: { + alignItems: 'center', + marginHorizontal: 30, + }, + sendButton: { + alignItems: 'center', + }, + viewPlayAudio: { + marginBottom: 20, + }, + iconViewContainer: { + justifyContent: 'center', + alignItems: 'center', + width: 50, + height: 50, + borderRadius: 25, + backgroundColor: '#f0f0f0', + marginBottom: 5, + }, + iconText: { + fontSize: 24, + }, + sendText: { + color: 'white', + }, + icon: { + width: 25, + height: 25, + resizeMode: 'contain', + }, + iconRecord: { + width: 60, + height: 60, + resizeMode: 'contain', + }, + iconSend: { + width: 55, + height: 55, + resizeMode: 'contain', + }, +}); diff --git a/src/addons/audio/components/AudioPlayerControls.tsx b/src/addons/audio/components/AudioPlayerControls.tsx new file mode 100644 index 0000000..29fe72f --- /dev/null +++ b/src/addons/audio/components/AudioPlayerControls.tsx @@ -0,0 +1,130 @@ +import React from 'react'; +import { + View, + TouchableOpacity, + Image, + StyleSheet, + Text, + StyleProp, + ViewStyle, +} from 'react-native'; +import { formatTime } from '../../../utilities'; +import Images from '../../../asset'; +import CustomSlider from '../../../chat/components/slider'; + +interface AudioPlayerControlsProps { + isPlaying: boolean; + playPause: () => void; + currentPositionSec: number; + currentDurationSec: number; + onSlide: (value: number) => void; + style?: StyleProp; + customSlider?: ( + currentDurationSec: number, + currentPositionSec: number, + onSlideRelease: (value: number) => void, + onSlideStart: (value: number) => void, + onSlideMove: (e: any, gestureState: any) => void + ) => React.ReactNode; +} + +const ImageURL = { + playIcon: Images.playWhiteIcon, + pauseIcon: Images.pauseIcon, +}; + +export const AudioPlayerControls: React.FC = ({ + isPlaying, + playPause, + currentPositionSec, + currentDurationSec, + onSlide, + style, + customSlider, +}) => { + const onSlideStart = () => { + if (isPlaying) { + playPause(); + } + }; + + const onSlideMove = (e: any, gestureState: any) => { + // Handle movement updates, for now, we're not using it + }; + + return ( + + + + + + {customSlider ? ( + customSlider( + currentDurationSec, + currentPositionSec, + onSlide, + onSlideStart, + onSlideMove + ) + ) : ( + + )} + + {formatTime(currentPositionSec / 1000)} + + ); +}; + +const styles = StyleSheet.create({ + container: { + minWidth: 100, + minHeight: 50, + flexDirection: 'row', + alignItems: 'center', + padding: 10, + backgroundColor: '#e1ffc7', + borderRadius: 20, + overflow: 'hidden', + borderColor: '#d3d3d3', + }, + buttonPlaying: { + marginLeft: 10, + }, + icon: { + width: 25, + height: 25, + tintColor: 'black', + }, + controls: { + width: 140, + height: 40, + }, + timer: { + width: 50, + textAlign: 'center', + }, + sliderContainer: { + flex: 1, + height: 20, + justifyContent: 'center', + }, + sliderTrack: { + marginRight: 40, + marginLeft: 20, + }, + sliderThumb: { + marginLeft: 10, + }, +}); diff --git a/src/addons/audio/components/DurationTimer.tsx b/src/addons/audio/components/DurationTimer.tsx new file mode 100644 index 0000000..2a9c104 --- /dev/null +++ b/src/addons/audio/components/DurationTimer.tsx @@ -0,0 +1,64 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { View, Text, StyleSheet } from 'react-native'; +import { formatTime } from '../../../utilities'; + +interface DurationTimerProps { + getDuration: (duration: number) => void; + isRecording: boolean; + isReplay?: boolean; +} + +const DurationTimer: React.FC = ({ + getDuration, + isRecording, + isReplay, +}) => { + const [duration, setDuration] = useState(0); + const interval = useRef(); + + const stopRecordingTimer = () => { + if (interval.current) { + clearInterval(interval.current); + } + }; + + useEffect(() => { + if (isReplay) { + stopRecordingTimer(); + getDuration(duration); + } + }, [duration, getDuration, isReplay]); + + useEffect(() => { + if (isRecording) { + interval.current = setInterval(() => { + setDuration((prevDuration) => prevDuration + 1); + }, 1000); + } + }, [isRecording]); + + useEffect(() => { + return () => { + stopRecordingTimer(); + }; + }, [isRecording]); + + return ( + + {formatTime(duration)} + + ); +}; + +const styles = StyleSheet.create({ + viewDuration: { + marginLeft: 10, + }, + durationText: { + color: '#000', + fontSize: 16, + zIndex: 1, + }, +}); + +export default React.memo(DurationTimer); diff --git a/src/addons/audio/components/PlayAudio.tsx b/src/addons/audio/components/PlayAudio.tsx new file mode 100644 index 0000000..456cc19 --- /dev/null +++ b/src/addons/audio/components/PlayAudio.tsx @@ -0,0 +1,161 @@ +import React, { useState, useEffect, useCallback } from 'react'; +import { + View, + Text, + TouchableOpacity, + StyleSheet, + Image, + Alert, +} from 'react-native'; +import { + formatTime, + startPlaying, + stopPlaying, + addPlayBackListener, + seekToPlayer, + removePlayBackListener, +} from '../../../utilities'; +import Images from '../../../asset'; +import CustomSlider from '../../../chat/components/slider'; + +interface PlayAudioProps { + uri?: string; + customSlider?: ( + currentDurationSec: number, + currentPositionSec: number, + onSlideRelease: (value: number) => void, + onSlideStart: (value: number) => void, + onSlideMove: (e: any, gestureState: any) => void + ) => React.ReactNode; +} + +const ImageURL = { + playIcon: Images.playGreenIcon, + pauseIcon: Images.pauseRedIcon, +}; + +export const PlayAudio: React.FC = (props) => { + const { uri, customSlider } = props; + const [isPlaying, setIsPlaying] = useState(false); + const [currentPositionSec, setCurrentPositionSec] = useState(0); + const [currentDurationSec, setCurrentDurationSec] = useState(0); + + const playAudio = useCallback(async () => { + if (!uri) { + Alert.alert('Error', 'No audio file found'); + return; + } + startPlaying(uri); + setIsPlaying(true); + addPlayBackListener((e) => { + setCurrentPositionSec(e.currentPosition); + setCurrentDurationSec(e.duration); + if (e.currentPosition >= e.duration) { + stopPlaying(); + setIsPlaying(false); + setCurrentPositionSec(0); + } + return; + }); + }, [uri]); + + useEffect(() => { + playAudio(); + }, [playAudio, uri]); + + const playPause = async () => { + if (isPlaying) { + await stopPlaying(); + setIsPlaying(false); + } else { + playAudio(); + } + }; + + const onSlideStart = () => { + if (isPlaying) { + stopPlaying(); + } + }; + + const onSlideMove = (e: any, gestureState: any) => {}; + + const onSlideRelease = async (value: number) => { + if (uri) { + await seekToPlayer(value); + setCurrentPositionSec(value); + if (!isPlaying) { + startPlaying(uri); + setIsPlaying(true); + } + } + }; + + useEffect(() => { + return () => { + removePlayBackListener(); + }; + }, []); + + return ( + + + + + + {customSlider ? ( + customSlider( + currentDurationSec, + currentPositionSec, + onSlideRelease, + onSlideStart, + onSlideMove + ) + ) : ( + + )} + + {formatTime(currentPositionSec / 1000)} + + ); +}; + +const styles = StyleSheet.create({ + container: { + height: 50, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + backgroundColor: '#E6F3FF', + borderRadius: 25, + paddingHorizontal: 15, + paddingVertical: 5, + marginBottom: 20, + marginTop: 20, + }, + controls: { + width: 160, + height: 40, + }, + timer: { + width: 50, + textAlign: 'center', + }, + icon: { + width: 30, + height: 30, + }, + buttonPlaying: { + marginLeft: 10, + marginRight: 10, + }, +}); diff --git a/src/addons/audio/components/WaveForm.tsx b/src/addons/audio/components/WaveForm.tsx new file mode 100644 index 0000000..f2d6f47 --- /dev/null +++ b/src/addons/audio/components/WaveForm.tsx @@ -0,0 +1,97 @@ +import React, { useCallback, useState } from 'react'; +import { View, LayoutChangeEvent } from 'react-native'; +import { StyleSheet } from 'react-native'; +import DurationTimer from './DurationTimer'; +import { Rect, Svg } from 'react-native-svg'; + +interface WaveFormProps { + isRecording: boolean; + data: number[]; + marginHorizontal?: number; +} + +const WaveFormConstant = { + height: 20, + barWidth: 3, + barMargin: 2, +}; + +const WaveForm: React.FC = ({ + data, + isRecording, + marginHorizontal = 40, +}) => { + const [widthChart, setWidthChart] = useState(0); + + const height = WaveFormConstant.height; + const barWidth = WaveFormConstant.barWidth; + const barMargin = WaveFormConstant.barMargin; + const numBars = Math.floor(widthChart / (barWidth + barMargin)); + + const onLayout = useCallback( + (event: LayoutChangeEvent) => { + const { width } = event.nativeEvent.layout; + setWidthChart(width - marginHorizontal); + }, + [marginHorizontal] + ); + + const renderChart = () => ( + + + {data.slice(-numBars).map((value, index) => { + const barHeight = value * 0.5; + const x = index * (barWidth + barMargin); + const y = height - barHeight; + + return ( + + ); + })} + + + ); + + return ( + + {renderChart()} + { + console.log('number', number); + }} + /> + + ); +}; + +export default WaveForm; + +const styles = StyleSheet.create({ + waveformContainer: { + height: 40, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + backgroundColor: '#E6F3FF', + borderRadius: 25, + paddingHorizontal: 15, + paddingVertical: 5, + marginBottom: 20, + }, + viewWave: { + flex: 1, + }, + chart: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/addons/audio/index.ts b/src/addons/audio/index.ts new file mode 100644 index 0000000..850b938 --- /dev/null +++ b/src/addons/audio/index.ts @@ -0,0 +1,6 @@ +import { + VoiceRecorderModal, + VoiceRecorderModalRef, +} from './VoiceRecorderModal'; + +export { VoiceRecorderModal, VoiceRecorderModalRef }; diff --git a/src/addons/camera/CameraView.tsx b/src/addons/camera/CameraView.tsx index 2825eb4..db5c618 100644 --- a/src/addons/camera/CameraView.tsx +++ b/src/addons/camera/CameraView.tsx @@ -27,10 +27,7 @@ import type { } from './interface'; import { initialMediaState } from './constants'; import { MessageTypes, type MessageProps } from '../../interfaces'; -import { - getAbsoluteFilePath, - getMediaTypeFromExtension, -} from '../../utilities'; +import { getAbsoluteFilePath } from '../../utilities'; import Images from '../../asset'; import { useChatContext } from '../../hooks'; @@ -89,7 +86,7 @@ export const CameraView: React.FC = ({ }, []); const onSendPressed = useCallback(async () => { - const extension = getMediaTypeFromExtension(media.path); + const extension = MessageTypes.video; const id = uuidv4(); const message = { id: id, diff --git a/src/addons/index.ts b/src/addons/index.ts new file mode 100644 index 0000000..7791726 --- /dev/null +++ b/src/addons/index.ts @@ -0,0 +1,2 @@ +export * from './camera'; +export * from './audio'; diff --git a/src/asset/index.ts b/src/asset/index.ts index 1b539bb..c384bca 100644 --- a/src/asset/index.ts +++ b/src/asset/index.ts @@ -10,6 +10,8 @@ const Images = { placeHolder: require('../images/place_holder.png'), playIcon: require('../images/play.png'), pauseWhiteIcon: require('../images/pause_white.png'), + playGreenIcon: require('../images/play_green.png'), + pauseRedIcon: require('../images/pause_red.png'), }; export default Images; diff --git a/src/chat/ChatScreen.tsx b/src/chat/ChatScreen.tsx index 8cf30af..d1e70c4 100644 --- a/src/chat/ChatScreen.tsx +++ b/src/chat/ChatScreen.tsx @@ -18,6 +18,7 @@ import { GiftedChat, type GiftedChatProps, Bubble, + Message, } from 'react-native-gifted-chat'; import TypingIndicator from 'react-native-gifted-chat/lib/TypingIndicator'; import { FirestoreServices } from '../services/firebase'; @@ -101,6 +102,13 @@ export const ChatScreen: React.FC = ({ const [userUnreadMessage, setUserUnreadMessage] = useState(false); const timeoutMessageRef = useRef(null); + const [currentPlayingMessageId, setCurrentPlayingMessageId] = useState< + string | null + >(null); + const [selectedMessage, setSelectedMessage] = useState( + null + ); + const conversationRef = useRef( conversationInfo ); @@ -290,6 +298,12 @@ export const ChatScreen: React.FC = ({ [renderComposer, onSend, inputToolbarProps] ); + const handlePlayPause = (messageId: string) => { + setCurrentPlayingMessageId( + messageId === currentPlayingMessageId ? null : messageId + ); + }; + const renderBubble = (bubble: Bubble['props']) => { if (props.renderBubble) return props.renderBubble(bubble); return ( @@ -307,6 +321,10 @@ export const ChatScreen: React.FC = ({ unReadSeenMessage={props.unReadSeenMessage} customMessageStatus={props.customMessageStatus} messageStatusEnable={messageStatusEnable} + onSetCurrentId={handlePlayPause} + isCurrentlyPlaying={ + currentPlayingMessageId === bubble.currentMessage?.id + } /> ); }; @@ -323,6 +341,18 @@ export const ChatScreen: React.FC = ({ changeUserConversationTyping, typingTimeoutSeconds ); + const shouldUpdateMessage = ( + currentProps: Message['props'], + nextProps: Message['props'] + ) => { + if ( + currentProps.currentMessage?.type === 'voice' || + nextProps.currentMessage?.type === 'voice' + ) { + return true; + } + return false; + }; return ( @@ -343,6 +373,7 @@ export const ChatScreen: React.FC = ({ renderBubble={renderBubble} onInputTextChanged={handleTextChange} isTyping={isTyping} + shouldUpdateMessage={shouldUpdateMessage} {...props} /> diff --git a/src/chat/components/bubble/CustomBubble.tsx b/src/chat/components/bubble/CustomBubble.tsx index e4720a0..e6d87f3 100644 --- a/src/chat/components/bubble/CustomBubble.tsx +++ b/src/chat/components/bubble/CustomBubble.tsx @@ -7,6 +7,7 @@ import { CustomImageVideoBubbleProps, } from './CustomImageVideoBubble'; import MessageStatus from '../MessageStatus'; +import { CustomBubbleVoice } from './CustomBubbleVoice'; interface CustomBubbleProps { bubbleMessage: Bubble['props']; @@ -20,6 +21,8 @@ interface CustomBubbleProps { unReadSeenMessage?: string; messageStatusEnable: boolean; customMessageStatus?: (hasUnread: boolean) => JSX.Element; + onSetCurrentId: (id: string) => void; + isCurrentlyPlaying: boolean; } export const CustomBubble: React.FC = ({ @@ -34,6 +37,8 @@ export const CustomBubble: React.FC = ({ unReadSentMessage, messageStatusEnable, customMessageStatus, + onSetCurrentId, + isCurrentlyPlaying, }) => { const styleBuble = { left: { backgroundColor: 'transparent' }, @@ -94,6 +99,25 @@ export const CustomBubble: React.FC = ({ {ViewMessageStatus} ); + case MessageTypes.voice: + return ( + + + currentMessage && ( + + ) + } + wrapperStyle={styleBuble} + /> + + ); default: { return ( @@ -105,7 +129,6 @@ export const CustomBubble: React.FC = ({ } } }; - return ( {bubbleMessage.currentMessage && diff --git a/src/chat/components/bubble/CustomBubbleVoice.tsx b/src/chat/components/bubble/CustomBubbleVoice.tsx new file mode 100644 index 0000000..580f193 --- /dev/null +++ b/src/chat/components/bubble/CustomBubbleVoice.tsx @@ -0,0 +1,161 @@ +import React, { useState, useEffect } from 'react'; +import type { MessageProps } from '../../../interfaces'; +import { + getState, + subscribe, + startPlaying, + stopPlaying, + removeRecordBackListener, + addPlayBackListener, + seekToPlayer, + getPathDownloadAudio, +} from '../../../utilities'; +import { AudioPlayerControls } from '../../../addons/audio/components/AudioPlayerControls'; +import { StyleProp, StyleSheet, View, ViewStyle } from 'react-native'; + +interface CustomBubbleVoiceProps { + currentMessage: MessageProps; + position: 'left' | 'right'; + isCurrentlyPlaying: boolean; + onSetCurrentId: (id: string) => void; + bubbleContainerStyle?: StyleProp; + customSlider?: ( + currentDurationSec: number, + currentPositionSec: number, + onSlideRelease: (value: number) => void, + onSlideStart: (value: number) => void, + onSlideMove: (e: any, gestureState: any) => void + ) => React.ReactNode; +} + +export const CustomBubbleVoice: React.FC = (props) => { + const { + currentMessage, + isCurrentlyPlaying, + onSetCurrentId, + position, + bubbleContainerStyle, + customSlider, + } = props; + + const [stateAudio, setStateAudio] = useState(getState()); + + const [currentPositionSec, setCurrentPositionSec] = useState(0); + const [currentDurationSec, setCurrentDurationSec] = useState(0); + const [localPath, setLocalPath] = useState(null); + const [isPlayingLocal, setPlayingLocal] = useState(false); + + const downloadAudio = async (url: string) => { + const path = await getPathDownloadAudio(url); + if (path) { + setLocalPath(path); + } else { + console.error('Error downloading audio'); + } + }; + + useEffect(() => { + if ( + (!isCurrentlyPlaying && stateAudio.isPlaying) || + stateAudio.isRecording + ) { + stopPlaying(); + setPlayingLocal(false); + setCurrentPositionSec(0); + } + }, [isCurrentlyPlaying, stateAudio.isPlaying, stateAudio.isRecording]); + + const playPause = async () => { + onSetCurrentId(currentMessage.id); + + if (!localPath) return; + try { + if (isPlayingLocal) { + await stopPlaying(); + setPlayingLocal(false); + } else { + stateAudio.isPlaying && (await stopPlaying()); + setPlayingLocal(false); + setCurrentPositionSec(0); + + setPlayingLocal(true); + await startPlaying(localPath); + addPlayBackListener((e) => { + setCurrentPositionSec(e.currentPosition); + setCurrentDurationSec(e.duration); + if (e.currentPosition >= e.duration) { + stopPlaying(); + setPlayingLocal(false); + setCurrentPositionSec(0); + } + }); + } + } catch (error) { + console.log('error: ', error); + } + }; + + const onSlide = async (value: number) => { + await seekToPlayer(value); + setCurrentPositionSec(value); + }; + + useEffect(() => { + if (!currentMessage.path) return; + if (currentMessage.path?.startsWith('http')) { + downloadAudio(currentMessage.path); + } else { + setLocalPath(currentMessage.path); + } + }, [currentMessage.path]); + + useEffect(() => { + const unsubscribe = subscribe(setStateAudio); + return () => { + unsubscribe(); + removeRecordBackListener(); + }; + }, []); + + return ( + + + + ); +}; + +const styles = StyleSheet.create({ + bubble: { + maxWidth: '70%', + backgroundColor: '#e1ffc7', + borderRadius: 20, + overflow: 'hidden', + borderColor: '#d3d3d3', + borderWidth: 1, + }, + bubbleContainer: { + flexDirection: 'row', + marginVertical: 5, + }, + flexEnd: { + justifyContent: 'flex-end', + }, + flexStart: { + justifyContent: 'flex-start', + }, +}); diff --git a/src/chat/components/bubble/index.ts b/src/chat/components/bubble/index.ts index 1f52a7e..1edcb58 100644 --- a/src/chat/components/bubble/index.ts +++ b/src/chat/components/bubble/index.ts @@ -1,2 +1,3 @@ export * from './CustomBubble'; export * from './CustomImageVideoBubble'; +export * from './CustomBubbleVoice'; diff --git a/src/chat/components/slider/index.tsx b/src/chat/components/slider/index.tsx index 9e6b55a..d2489d6 100644 --- a/src/chat/components/slider/index.tsx +++ b/src/chat/components/slider/index.tsx @@ -6,6 +6,8 @@ import { StyleSheet, GestureResponderEvent, PanResponderGestureState, + StyleProp, + ViewStyle, } from 'react-native'; interface CustomSliderProps { @@ -17,6 +19,9 @@ interface CustomSliderProps { e: GestureResponderEvent, gestureState: PanResponderGestureState ) => void; + sliderContainer?: StyleProp; + sliderTrack?: StyleProp; + sliderThumb?: StyleProp; } const CustomSlider: React.FC = ({ @@ -25,6 +30,9 @@ const CustomSlider: React.FC = ({ onSlideRelease, onSlideStart, onSlideMove, + sliderContainer, + sliderTrack, + sliderThumb, }) => { const [sliderWidth, setSliderWidth] = useState(0); @@ -52,16 +60,16 @@ const CustomSlider: React.FC = ({ return ( { setSliderWidth(event.nativeEvent.layout.width - 20); }} > - + diff --git a/src/chat_obs/ChatProvider.tsx b/src/chat_obs/ChatProvider.tsx deleted file mode 100644 index 005c4c2..0000000 --- a/src/chat_obs/ChatProvider.tsx +++ /dev/null @@ -1,265 +0,0 @@ -// import React, { useCallback, useEffect, useRef, useState } from 'react'; -// import { -// KeyboardAvoidingView, -// StyleProp, -// StyleSheet, -// View, -// ViewStyle, -// } from 'react-native'; -// import { GiftedChat, GiftedChatProps } from 'react-native-gifted-chat'; -// import { FirestoreServices } from '../services/Firestore'; -// // import CustomMessageView from './Component/CustomMessageView'; -// import { formatEncryptedMessageData, formatMessageData } from '../utilities'; -// import TypingIndicator from 'react-native-gifted-chat/lib/TypingIndicator'; -// // import { PhotoGalleryView } from './Component/PhotoGalleryView'; -// import { TYPING_TIMEOUT_SECONDS } from './constanst'; -// import type { ConversationProps, MessageProps } from '../interfaces'; -// -// interface IUserInfo { -// id: string; -// name: string; -// } -// -// interface ChatScreenProps extends GiftedChatProps { -// userInfo: IUserInfo; -// conversationInfo: ConversationProps; -// memberId: string; -// style?: StyleProp; -// enableEncrypt?: boolean; -// enableTyping?: boolean; -// typingTimeoutSeconds?: number; -// } -// -// let typingTimeout: ReturnType; -// -// const FirestoreServicesInstance = FirestoreServices.getInstance(); -// -// export const ChatProvider = React.forwardRef( -// ({ -// userInfo, -// memberId, -// conversationInfo, -// style, -// renderLoadEarlier, -// renderAvatar, -// renderBubble, -// renderMessage, -// enableEncrypt, -// enableTyping, -// typingTimeoutSeconds = TYPING_TIMEOUT_SECONDS, -// renderInputToolbar, -// ...props -// }) => { -// const [messagesList, setMessagesList] = useState([]); -// // const [isShowPhotoGallery, setIsShowPhotoGallery] = -// // useState(false); -// const [loadEarlier, setLoadEarlier] = useState(false); -// const [isLoadingEarlier, setIsLoadingEarlier] = useState(false); -// const [isTyping, setIsTyping] = useState(false); -// -// const conversationRef = useRef(conversationInfo); -// const messageRef = useRef(messagesList); -// messageRef.current = messagesList; -// const totalMessages = useRef(0); -// const typingRef = useRef(isTyping); -// -// const onLoadEarlier = useCallback(() => { -// if (messagesList.length < totalMessages.current && !isLoadingEarlier) { -// setTimeout(() => { -// setIsLoadingEarlier(true); -// setLoadEarlier(false); -// -// FirestoreServicesInstance.getMoreMessage().then( -// (data: MessageProps[]) => { -// setIsLoadingEarlier(false); -// setLoadEarlier(true); -// if (data && data?.length) { -// setMessagesList((prevState) => { -// return prevState.concat(...data); -// }); -// } -// } -// ); -// }, 1000); -// } else { -// setLoadEarlier(false); -// } -// }, [isLoadingEarlier, messagesList]); -// -// const onSend = useCallback(async (messages: MessageProps) => { -// if (!conversationRef.current?.id) { -// conversationRef.current = -// (await FirestoreServicesInstance.createConversation()) as ConversationProps; -// } -// clearTimeout(typingTimeout); -// setMessagesList((previousMessages) => -// GiftedChat.append(previousMessages, [messages]) -// ); -// -// let file; -// const messageType = messages?.type; -// if (messageType) { -// switch (messageType) { -// case 'image': -// file = { -// type: 'image', -// imageUrl: messages?.imageUrl, -// extension: messages?.extension, -// }; -// break; -// default: -// file = { -// type: 'file', -// fileUrl: messages?.fileUrl, -// extension: messages?.extension, -// }; -// break; -// } -// } -// //file = { -// // type: 'image', -// // imageUrl: messages?.imageUrl, -// // // fileUrl: fileUrl, -// // // fileName: messages?.fileName, -// // // fileSize: messages?.fileSize, -// // extension: messages?.extension, -// // }; -// await FirestoreServicesInstance.sendMessage(messages.text, file); -// }, []); -// -// const changeUserConversationTyping = useCallback( -// (value: boolean, callback?: () => void) => { -// FirestoreServicesInstance.setUserConversationTyping(value).then( -// callback -// ); -// }, -// [] -// ); -// -// const onInputTextChanged = useCallback( -// (text: string) => { -// if (enableTyping) { -// if (!text) { -// changeUserConversationTyping(false); -// clearTimeout(typingTimeout); -// } else { -// clearTimeout(typingTimeout); -// changeUserConversationTyping(true, () => { -// typingTimeout = setTimeout(() => { -// changeUserConversationTyping(false, () => { -// clearTimeout(typingTimeout); -// }); -// }, typingTimeoutSeconds); -// }); -// } -// } -// }, -// [enableTyping, changeUserConversationTyping, typingTimeoutSeconds] -// ); -// -// useEffect(() => { -// if (conversationInfo?.id) { -// FirestoreServicesInstance.countAllMessages().then((total) => { -// totalMessages.current = total; -// }); -// FirestoreServicesInstance.getMessageHistory().then((res) => { -// FirestoreServicesInstance.changeReadMessage(); -// setLoadEarlier(true); -// setMessagesList(res); -// }); -// } -// }, [conversationInfo?.id, enableEncrypt]); -// -// useEffect(() => { -// let receiveMessageRef: () => void; -// let userConversation: () => void; -// receiveMessageRef = FirestoreServicesInstance.receiveMessageListener( -// (message: MessageProps) => { -// if (message.senderId !== userInfo.id) { -// if (enableEncrypt) { -// formatEncryptedMessageData(message, userInfo.name).then( -// (formattedMessages: any) => { -// setMessagesList([formattedMessages, ...messageRef.current]); -// FirestoreServicesInstance.changeReadMessage(); -// } -// ); -// } else { -// const formatMessage = formatMessageData(message, userInfo.name); -// const mergeMessageList = [ -// formatMessage, -// ...messageRef.current, -// ] as MessageProps[]; -// setMessagesList(mergeMessageList); -// FirestoreServicesInstance.changeReadMessage(); -// } -// } -// } -// ); -// // //Build for chat 1-1 -// userConversation = FirestoreServicesInstance.userConversationListener( -// (newConversation) => { -// conversationRef.current = newConversation as ConversationProps; -// typingRef.current = newConversation?.typing?.[memberId]; -// setIsTyping(typingRef.current); -// } -// ); -// -// return () => { -// if (receiveMessageRef) { -// receiveMessageRef(); -// } -// if (userConversation) { -// userConversation(); -// } -// }; -// }, [userInfo.id, loadEarlier, memberId, enableEncrypt, userInfo.name]); -// -// return ( -// -// -// onSend(messages[0] as MessageProps)} -// user={{ -// _id: userInfo.id, -// name: userInfo.name, -// avatar: -// 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/1200px-React-icon.svg.png', -// }} -// keyboardShouldPersistTaps={'always'} -// // renderCustomView={customMessageView} -// renderInputToolbar={renderInputToolbar} -// // renderBubble={renderBubble} -// // listViewProps={{ -// // scrollEventThrottle: 5000, -// // onScroll: ({nativeEvent}: any) => { -// // if (isCloseToTop(nativeEvent)) { -// // onLoadEarlier(); -// // } -// // }, -// // }} -// infiniteScroll -// loadEarlier={loadEarlier} -// onLoadEarlier={onLoadEarlier} -// isLoadingEarlier={isLoadingEarlier} -// renderLoadEarlier={renderLoadEarlier} -// renderBubble={renderBubble} -// renderAvatar={renderAvatar} -// renderMessage={renderMessage} -// onInputTextChanged={onInputTextChanged} -// isTyping={enableTyping && isTyping} -// renderChatFooter={() => } -// {...props} -// /> -// -// -// ); -// } -// ); -// -// const styles = StyleSheet.create({ -// container: { -// flex: 1, -// backgroundColor: 'white', -// }, -// }); diff --git a/src/chat_obs/components/CustomMessageView.tsx b/src/chat_obs/components/CustomMessageView.tsx deleted file mode 100644 index ba80fca..0000000 --- a/src/chat_obs/components/CustomMessageView.tsx +++ /dev/null @@ -1,119 +0,0 @@ -// import React, {useState} from 'react'; -// import { -// Text, -// View, -// StyleSheet, -// Modal, -// TouchableOpacity, -// NativeModules, -// Image, -// } from 'react-native'; -// -// const DownloadManager = NativeModules.DownloadManager; -// -// function CustomView(props) { -// const [showImage, setShowImage] = useState(false); -// let source = props.currentMessage; -// -// function downloadFile(url, fileName, mimeType) { -// DownloadManager.downloadFile(url, fileName, mimeType); -// } -// -// if (source.type?.includes('photo') || source.type?.includes('image')) -// return ( -// -// { -// setShowImage(true); -// }}> -// -// -// {}}> -// -// {/* }*/} -// {/* renderHeader={() => (*/} -// {/* setShowImage(false)}*/} -// {/* style={styles.container.buttonClose}>*/} -// {/* */} -// {/* */} -// {/* )}*/} -// {/*/>*/} -// -// -// -// ); -// else if (!!source.type && source.type !== 'text') { -// return ( -// -// { -// downloadFile(source.fileUrl, source.fileName, source.mine); -// }}> -// {/**/} -// -// -// {source.fileName} -// -// {((source.fileSize || 0) / 1024).toFixed(2)} kb -// -// -// -// ); -// } -// return null; -// } -// -// const styles = { -// left: StyleSheet.create({ -// fileName: { -// flex: 1, -// }, -// fileSize: {}, -// }), -// right: StyleSheet.create({ -// fileName: { -// flex: 1, -// }, -// fileSize: {}, -// }), -// container: StyleSheet.create({ -// buttonClose: { -// width: 40, -// height: 40, -// borderRadius: 20, -// position: 'absolute', -// right: 10, -// zIndex: 9999, -// }, -// fileContainer: { -// borderRadius: 20, -// padding: 5, -// marginRight: 10, -// width: 40, -// height: 40, -// }, -// }), -// }; -// -// export default CustomView; diff --git a/src/chat_obs/components/PhotoGalleryView.tsx b/src/chat_obs/components/PhotoGalleryView.tsx deleted file mode 100644 index f248d65..0000000 --- a/src/chat_obs/components/PhotoGalleryView.tsx +++ /dev/null @@ -1,72 +0,0 @@ -// import React, {useEffect} from 'react'; -// import { -// Dimensions, -// FlatList, -// Image, -// StyleSheet, -// TouchableOpacity, -// View, -// } from 'react-native'; -// import {PhotoIdentifier} from '@react-native-camera-roll/camera-roll/src/CameraRoll'; -// import {useCameraRoll} from '@react-native-camera-roll/camera-roll'; -// import {GiftedChatProps} from 'react-native-gifted-chat'; -// -// const {width, height} = Dimensions.get('screen'); -// -// interface IPhotoGalleryView extends GiftedChatProps { -// conversationId: string; -// onSendImage: (message: any) => void; -// } -// -// export const PhotoGalleryView: React.FC = ({ -// conversationId, -// onSendImage, -// onSend, -// }) => { -// const [photos, getPhotos] = useCameraRoll(); -// -// useEffect(() => { -// getPhotos().then(); -// }, []); -// -// return ( -// -// -// numColumns={4} -// data={photos.edges} -// renderItem={({item}) => { -// return ( -// { -// console.log('PhotoGalleryView', item); -// onSendImage({ -// imageUrl: item.node.image.uri, -// extension: `${item.node.type}/${item.node.image.extension}`, -// type: 'image', -// }); -// // uploadFileToFirebase( -// // item.node.image.uri, -// // `${item.node.type}/${item.node.image.extension}`, -// // conversationId, -// // ); -// }}> -// -// -// ); -// }} -// /> -// -// ); -// }; -// -// const styles = StyleSheet.create({ -// container: { -// height: '45%', -// }, -// }); diff --git a/src/chat_obs/constanst.ts b/src/chat_obs/constanst.ts deleted file mode 100644 index f82ca00..0000000 --- a/src/chat_obs/constanst.ts +++ /dev/null @@ -1,6 +0,0 @@ -// /** -// * Created by NL on 6/11/23. -// */ -// const TYPING_TIMEOUT_SECONDS = 3000; -// -// export { TYPING_TIMEOUT_SECONDS }; diff --git a/src/images/delete.png b/src/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..1e08cc17b763b1c3bb699377db43823c37b8f5dd GIT binary patch literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf4nJ zFx~)R#$PeZihzQWC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NHH)lX?eOh zhE&XXJA1bmv!h7c{tCwREP_W*c_%Nt(XsUx+qG?Cc0K%wOEt>Ou5mT_CnPRZ5)1p- zwji)c%=5s}*y6PEwDh(){L481%l-SDZZ=!SNc2t+qgdn0IoItOrhj`g73(Fj(yqHA}Vs*2)fyYX*ee)DY4 zKV}Q&IMqj51>Jkg^{13xex>VpYxfqmGhUOrdMsz{RrTObII&ke|If>_&uXPqr5sLW z&tJM*qkor+3Fnm$|5xT#Uya(Ux+0~;fH{YudD0Q32eKAy?`ot2ryMx(i|5B#s|_!2 zv}^Mj4zY2Q|7%$sw&;Bn(;Kcm_043ao-vl4#s1Sq;n;15Cy~q>B6SQ*7&<+`j5TZmkCOwQ zM3y(4O=?`o=;0y-V*pJ|k-Kp1sEM$^Stf^l%t^C3JJJ{vzWr~Qk;l9-ocDn1MTQFu zOPs)r0wD*Ve#edBcNz7%*c#XrM6(#6jIvsWOO+1M(uaK44$rjF6*2U FngE3T7C`_2 literal 0 HcmV?d00001 diff --git a/src/images/pause_red.png b/src/images/pause_red.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2aecbbf49efbad1c3bea9c2e2b5e2d4ccf22b6 GIT binary patch literal 1847 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 literal 0 HcmV?d00001 diff --git a/src/images/send_audio.png b/src/images/send_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..ff47ee7904f0ecc7536a7827251563324e5954ea GIT binary patch literal 1595 zcmV-B2E_S^P)K~#90?VDSORaF?r|Nk{d9m^b3yqu$98mJ(FujOqj#}YNs zupqJIoa3lq5kgN12?@PKK}Feg98HiwAycfh5ijX;5h*l5+HKAm6DOOzjm}yB9@J^h zbn+`?1-LlVzbAzE8>|&gf@eG)S1oVoRZO2d>lLM!kB*n;^(K5 z_FVvr{fFZL;h+p(_Is@`zJf?(HqzMB2z&4VKrEqj8p+HCe`czov7?UJuI&Jx@#EYT zB=*>AL)T*Wm`=}qJ$qa8=LFW+uK>;R+&5TG>t^>;*!4i0mrmXUXgvQAv$h4m6i@xa zh1u+v zSaoq^C5*Q^!mQqmA?ig(vu0E z0dTLYz(R$%CU9oC%~IJJK=FP2Uk48W!f?vIQ?5yA0pgiOAeL0=`j0C61pt>Jo?ck0 zwxj?gU#r%ofK8I-f;v*I4VRGIQmU@F0Le@}pxM5>HpfmW6>AXj7zn42uvPE~66txx zDvAnV0ACLnIi#Y;m5SE)_lz*Wx)SAiGO1KLLxaw!ez(y{~~bEf_u?<@v!#Jyy4qoJUxd7uR~k_RbxQ^ z^gfD|tMtJaGI|e;9#s=>Itzb+K;iK~~F|DACxaAD4h zImw#58NgN-PMqL-s+Yp%j4@XL!yh51-n`>(suzdI5g_+2a4UP74!~{S#M5(_Ot(-t z1|g^ivNX2Ge(hZl$!|gExWMNF3ZRg{rg|YHj^w*25WtEpB!U+p=&4==3$^5z6$pT? zp`T&+jSm9L3OT;2d*CYUkp20Eg*(CBV>&4uaPI!j8YfRe414e(xev`_3-&pMGXQ|K z_>czAIq}>NQ@t1#_M>9uC3ihcWKIH@Q;jnL&qB)dT-^E_;)GJs`eIc@X8-`mXe%ub zRp$?HgPhc#XS_GEW^1Xsvin{pG6xXEJAyDF_bD}DMXBntkHf0bMgUiw2NfPy)vZnC z8kElmG{t@s@v761LPXLl*ctt$T$_p>{Y)agJJj8w14!(#sc4^fvWhZ7_WH05fWG%1 zR!9)vS{q4L(zLRa*zPf%vTOkGlb^Uk;;g!B78l#}6r=K-;Ew18$t(g;@kfaLz|SHV zVCT5@N;`NX3`5uZU!*dna$#SBbhhQJl@F*Q};hjCDQW@uukN1he?&Igg&>#Hl$)F9oYmB zOR``Wkk~{z~ubUJ38V$u*e=VKfae(+xEd;HaLL tvBG6Qm#o-!>&Hp7=4WpQ8Dx+^_!sM0Ft=R)+z|i(002ovPDHLkV1fm)<#Yf5 literal 0 HcmV?d00001 diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..9f435ec --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,5 @@ +export * from './services/firebase'; +export * from './chat'; +export * from './reducer/action'; +export * from './interfaces/message'; +export * from './interfaces/conversation'; diff --git a/src/interfaces/conversation.ts b/src/interfaces/conversation.ts index f336982..777d9e7 100644 --- a/src/interfaces/conversation.ts +++ b/src/interfaces/conversation.ts @@ -32,6 +32,7 @@ enum MessageTypes { image = 'image', voice = 'voice', video = 'video', + document = 'document', } enum MessageStatus { diff --git a/src/interfaces/message.ts b/src/interfaces/message.ts index a8c3a4a..a2b414b 100644 --- a/src/interfaces/message.ts +++ b/src/interfaces/message.ts @@ -17,6 +17,9 @@ interface LatestMessageProps { type?: MediaType; path?: string; extension?: string; + size?: string; + fileName?: string; + duration?: number; } interface MessageProps extends BaseEntity, IMessage { @@ -29,6 +32,9 @@ interface MessageProps extends BaseEntity, IMessage { type?: MediaType; path?: string; extension?: string; + size?: string; + fileName?: string; + duration?: number; } interface SendMessageProps { @@ -42,8 +48,11 @@ interface SendMessageProps { type?: MediaType; path?: string; extension?: string; + size?: string; + fileName?: string; + duration?: number; } -type MediaType = 'image' | 'video' | 'text' | undefined; +type MediaType = 'image' | 'video' | 'text' | 'document' | 'voice' | undefined; export { MessageProps, LatestMessageProps, SendMessageProps, MediaType }; diff --git a/src/services/firebase/firestore.ts b/src/services/firebase/firestore.ts index fbf791a..2813107 100644 --- a/src/services/firebase/firestore.ts +++ b/src/services/firebase/firestore.ts @@ -12,7 +12,7 @@ import { generateBadWordsRegex, generateEncryptionKey, getCurrentTimestamp, - getMediaTypeFromExtension, + getVideoOrImageTypeFromExtension, } from '../../utilities'; import { ConversationData, @@ -223,7 +223,7 @@ export class FirestoreServices { sendMessageWithFile = async (message: SendMessageProps) => { const { path, extension, type } = message; - if (!path || !extension || this.conversationId === null) { + if (!path || !extension || this.conversationId === null || !type) { console.error('Please provide path and extension'); return; } @@ -232,7 +232,8 @@ export class FirestoreServices { const uploadResult = await uploadFileToFirebase( path, this.conversationId, - extension + extension, + type ); const imgURL = await storage() .ref(uploadResult.metadata.fullPath) @@ -249,14 +250,14 @@ export class FirestoreServices { this.memberIds?.forEach((memberId) => { this.updateUserConversation( memberId, - formatLatestMessage( - this.userId, - this.userInfo?.name || '', - '', + formatLatestMessage({ + userId: this.userId, + name: this.userInfo?.name || '', + text: '', type, path, - extension - ) + extension, + }) ); }); } catch (error) { @@ -275,14 +276,25 @@ export class FirestoreServices { ); return; } - const { text, type, path, extension } = message; + const { text, type, path, extension, fileName, size, duration } = message; let messageData; if ( message.type === MessageTypes.image || - message.type === MessageTypes.video + message.type === MessageTypes.video || + message.type === MessageTypes.document || + message.type === MessageTypes.voice ) { - messageData = formatSendMessage(this.userId, text, type, path, extension); + messageData = formatSendMessage( + this.userId, + text, + type, + path, + extension, + fileName, + size, + duration + ); this.sendMessageWithFile(messageData); } else { /** Format message */ @@ -305,11 +317,11 @@ export class FirestoreServices { .add(messageData); /** Format latest message data */ - const latestMessageData = formatLatestMessage( - this.userId, - this.userInfo?.name || '', - messageData.text - ); + const latestMessageData = formatLatestMessage({ + userId: this.userId, + name: this.userInfo?.name || '', + text: messageData.text, + }); this.memberIds?.forEach((memberId) => { this.updateUserConversation(memberId, latestMessageData); }); @@ -670,7 +682,7 @@ export class FirestoreServices { return { id: id || getCurrentTimestamp().toString(), path: filePath, - type: getMediaTypeFromExtension(fileRef.name), + type: getVideoOrImageTypeFromExtension(fileRef.name), }; }); const fileURLs: MediaFile[] = await Promise.all(filePromises); diff --git a/src/services/firebase/storage.ts b/src/services/firebase/storage.ts index bd3bae2..5970a5e 100644 --- a/src/services/firebase/storage.ts +++ b/src/services/firebase/storage.ts @@ -3,9 +3,10 @@ import storage from '@react-native-firebase/storage'; const uploadFileToFirebase = ( path: string, conversation: string, - extension: string + extension: string, + type: string ) => { - const fileName = `${conversation}/${new Date().getTime()}.${extension}`; + const fileName = `${conversation}/${type}/${new Date().getTime()}.${extension}`; let storageRef = storage().ref(fileName); return storageRef.putFile(path); }; diff --git a/src/utilities/audio.ts b/src/utilities/audio.ts new file mode 100644 index 0000000..2d2dcc8 --- /dev/null +++ b/src/utilities/audio.ts @@ -0,0 +1,163 @@ +import { Platform } from 'react-native'; +import RNFS from 'react-native-fs'; + +import AudioRecorderPlayer, { + AVEncoderAudioQualityIOSType, + AVEncodingOption, + AVModeIOSOption, + AudioEncoderAndroidType, + AudioSourceAndroidType, + type AudioSet, +} from 'react-native-audio-recorder-player'; + +type State = { + isRecording: boolean; + isPlaying: boolean; + recordingUri: string | null; + playingUri: string | null; +}; + +const state: State = { + isRecording: false, + isPlaying: false, + recordingUri: null, + playingUri: null, +}; + +const audioSet: AudioSet = { + AudioEncoderAndroid: AudioEncoderAndroidType.AAC, + AudioSourceAndroid: AudioSourceAndroidType.MIC, + AVModeIOS: AVModeIOSOption.measurement, + AVEncoderAudioQualityKeyIOS: AVEncoderAudioQualityIOSType.high, + AVNumberOfChannelsKeyIOS: 2, + AVFormatIDKeyIOS: AVEncodingOption.aac, +}; + +type Listener = (state: State) => void; + +const listeners = new Set(); + +const audioRecorderPlayer = new AudioRecorderPlayer(); + +const getState = (): State => state; + +const subscribe = (listener: Listener): (() => void) => { + listeners.add(listener); + return () => listeners.delete(listener); +}; + +const notify = () => { + listeners.forEach((listener) => listener(state)); +}; + +const setRecordingState = (isRecording: boolean, uri: string | null = null) => { + state.isRecording = isRecording; + state.recordingUri = uri; + notify(); +}; + +const setPlayingState = (isPlaying: boolean, uri: string | null = null) => { + state.isPlaying = isPlaying; + state.playingUri = uri; + notify(); +}; + +const startRecording = async (): Promise => { + const uri = await audioRecorderPlayer.startRecorder( + undefined, + audioSet, + true + ); + setRecordingState(true, uri); +}; + +const stopRecording = async (): Promise => { + const filePath = await audioRecorderPlayer.stopRecorder(); + setRecordingState(false); + return filePath; +}; + +const startPlaying = async (uri: string): Promise => { + await audioRecorderPlayer.startPlayer(uri); + setPlayingState(true, uri); +}; + +const stopPlaying = async (): Promise => { + await audioRecorderPlayer.stopPlayer(); + setPlayingState(false); +}; + +const addRecordBackListener = (callback: (event: any) => void): void => { + audioRecorderPlayer.addRecordBackListener(callback); +}; + +const removeRecordBackListener = (): void => { + state.isPlaying && stopPlaying(); + audioRecorderPlayer.removeRecordBackListener(); +}; + +const addPlayBackListener = (callback: (event: any) => void): void => { + audioRecorderPlayer.addPlayBackListener(callback); +}; + +const removePlayBackListener = (): void => { + state.isPlaying && stopPlaying(); + audioRecorderPlayer.removePlayBackListener(); +}; + +const seekToPlayer = async (value: number): Promise => { + await audioRecorderPlayer.seekToPlayer(value); +}; + +const getPathDownloadAudio = async ( + url: string +): Promise => { + try { + const fileName = url.split('/').pop()?.split('?')[0]; + const fileExt = fileName?.split('.').pop(); + const baseName = fileName?.split('.').shift(); + + if (!fileExt || !baseName) { + console.error('Invalid file name or extension'); + return; + } + + const path = Platform.select({ + ios: `file://${RNFS.DocumentDirectoryPath}/${baseName}.m4a`, + android: `${RNFS.DocumentDirectoryPath}/${baseName}.mp4`, + }); + + if (!path) { + console.error('Path could not be generated'); + return; + } + + const exists = await RNFS.exists(path); + if (!exists) { + console.log('Downloading file'); + await RNFS.downloadFile({ fromUrl: url, toFile: path }).promise; + } else { + console.log('File already exists:', path); + } + + return path; + } catch (error) { + console.error('Error downloading audio:', error); + return undefined; + } +}; + +export { + getState, + subscribe, + startRecording, + stopRecording, + startPlaying, + stopPlaying, + addRecordBackListener, + removeRecordBackListener, + addPlayBackListener, + removePlayBackListener, + seekToPlayer, + getPathDownloadAudio, +}; diff --git a/src/utilities/index.ts b/src/utilities/index.ts index e1edf61..b0aea86 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -4,3 +4,4 @@ export * from './color'; export * from './messageFormatter'; export * from './blacklist'; export * from './misc'; +export * from './audio'; diff --git a/src/utilities/messageFormatter.ts b/src/utilities/messageFormatter.ts index f1bf00f..1d0b9b5 100644 --- a/src/utilities/messageFormatter.ts +++ b/src/utilities/messageFormatter.ts @@ -78,12 +78,27 @@ const formatdecryptedMessageData = async ( return await decryptedMessageData(text, conversationId); }; +interface FormatLatestMessageParams { + userId: string; + name: string; + text: string; + type?: MediaType; + path?: string; + extension?: string; + fileName?: string; + size?: string; + duration?: number; +} + const formatSendMessage = ( userId: string, text: string, type?: MediaType, path?: string, - extension?: string + extension?: string, + fileName?: string, + size?: string, + duration?: number ): SendMessageProps => ({ readBy: { [userId]: true, @@ -95,28 +110,37 @@ const formatSendMessage = ( type: type ?? MessageTypes.text, path: path ?? '', extension: extension ?? '', + fileName: fileName ?? '', + size: size ?? '', + duration: duration ?? 0, }); -const formatLatestMessage = ( - userId: string, - name: string, - message: string, - type?: MediaType, - path?: string, - extension?: string -): LatestMessageProps => ({ - text: message ?? '', - senderId: userId, +const formatLatestMessage = ({ + userId, + name, + text, + type, + path, + extension, + fileName, + size, + duration, +}: FormatLatestMessageParams): LatestMessageProps => ({ + text: text ?? '', name: name, + senderId: userId, readBy: { [userId]: true, }, type: type ?? MessageTypes.text, path: path ?? '', extension: extension ?? '', + fileName: fileName ?? '', + size: size ?? '', + duration: duration ?? 0, }); -export const getMediaTypeFromExtension = (path: string): MediaType => { +export const getVideoOrImageTypeFromExtension = (path: string): MediaType => { const photoExtensions = ['jpg', 'jpeg', 'png', 'gif']; const videoExtensions = ['mp4', 'mov', 'avi', 'wmv']; const extension = path.split('.').pop(); @@ -133,6 +157,14 @@ export const getAbsoluteFilePath = (path: string) => { return path?.startsWith?.('file:/') ? path : `file://${path}`; }; +export const convertExtension = (path: string | undefined): string => { + if (!path) { + return 'jpg'; + } + const extension = path.split('.').pop(); + return extension ? extension : 'jpg'; +}; + export { formatMessageData, formatdecryptedMessageData, diff --git a/yarn.lock b/yarn.lock index b07aafa..4ca523c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3007,6 +3007,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== + base64-js@^1.1.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3045,6 +3050,11 @@ bl@^5.0.0: inherits "^2.0.4" readable-stream "^3.4.0" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + boxen@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" @@ -3800,6 +3810,30 @@ crypto-random-string@^4.0.0: dependencies: type-fest "^1.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -4085,6 +4119,41 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dooboolab-welcome@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dooboolab-welcome/-/dooboolab-welcome-1.3.2.tgz#4928595312f0429b4ea1b485ba8767bae6acdab7" + integrity sha512-2NbMaIIURElxEf/UAoVUFlXrO+7n/FRhLCiQlk4fkbGRh9cJ3/f8VEMPveR9m4Ug2l2Zey+UCXjd6EcBqHJ5bw== + dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -4146,6 +4215,11 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + envinfo@^7.7.2: version "7.14.0" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" @@ -6896,6 +6970,11 @@ map-obj@^4.0.0, map-obj@^4.1.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + memoize-one@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" @@ -7584,6 +7663,13 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" @@ -8250,6 +8336,13 @@ react-native-aes-crypto@^2.1.1: resolved "https://registry.yarnpkg.com/react-native-aes-crypto/-/react-native-aes-crypto-2.1.1.tgz#371100ad322195f2792e2b365923620599d8abc2" integrity sha512-huAt7k43myFiY0bPnvoaCP0oBjTMw4VsL2mjkmCPzzDA56Sm3ps5xXIejPo5Z9qfnei9iijHzATV8eRNMEPtbQ== +react-native-audio-recorder-player@^3.6.11: + version "3.6.11" + resolved "https://registry.yarnpkg.com/react-native-audio-recorder-player/-/react-native-audio-recorder-player-3.6.11.tgz#5f533e5197e3c33b721dfc0c0e250825103b6a97" + integrity sha512-IHr0PWbwDKCPnTuzlXSAZhejFdtoAV6gyhRxli7aHH1tDT+9akIAToCzVdZxdmbg+vN5vFp4PNYJ30hg3pFV1w== + dependencies: + dooboolab-welcome "^1.3.2" + react-native-builder-bob@^0.20.0: version "0.20.4" resolved "https://registry.yarnpkg.com/react-native-builder-bob/-/react-native-builder-bob-0.20.4.tgz#02df01b8dc02f1bb2d566f820e33c5d42bfb9c99" @@ -8297,6 +8390,14 @@ react-native-fast-image@^8.6.3: resolved "https://registry.yarnpkg.com/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz#6edc3f9190092a909d636d93eecbcc54a8822255" integrity sha512-Sdw4ESidXCXOmQ9EcYguNY2swyoWmx53kym2zRsvi+VeFCHEdkO+WG1DK+6W81juot40bbfLNhkc63QnWtesNg== +react-native-fs@^2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.20.0.tgz#05a9362b473bfc0910772c0acbb73a78dbc810f6" + integrity sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ== + dependencies: + base-64 "^0.1.0" + utf8 "^3.0.0" + react-native-get-random-values@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.11.0.tgz#1ca70d1271f4b08af92958803b89dccbda78728d" @@ -8369,6 +8470,20 @@ react-native-safe-area-context@^4.11.0: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.11.0.tgz#d45271363672dc1923ddb0ce5a6ad588e210c85d" integrity sha512-Bg7bozxEB+ZS+H3tVYs5yY1cvxNXgR6nRQwpSMkYR9IN5CbxohLnSprrOPG/ostTCd4F6iCk0c51pExEhifSKQ== +react-native-svg@^15.3.0: + version "15.7.1" + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.7.1.tgz#299bf5ff21fb355a0f4bedd4cb8f9f520725c4fe" + integrity sha512-Xc11L4t6/DtmUwrQqHR7S45Qy3cIWpcfGlmEatVeZ9c1N8eAK79heJmGRgCOVrXESrrLEHfP/AYGf0BGyrvV6A== + dependencies: + css-select "^5.1.0" + css-tree "^1.1.3" + warn-once "0.1.1" + +react-native-uuid@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/react-native-uuid/-/react-native-uuid-2.0.2.tgz#3da192e342ef35ee95a7def676ab41c1256dfd66" + integrity sha512-5ypj/hV58P+6VREdjkW0EudSibsH3WdqDERoHKnD9syFWjF+NfRWWrJb2sa3LIwI5zpzMvUiabs+DX40WHpEMw== + react-native-video@^6.2.0: version "6.6.3" resolved "https://registry.yarnpkg.com/react-native-video/-/react-native-video-6.6.3.tgz#d602c0ded79a54101f9c86c007d57243d89f71e2" @@ -9852,6 +9967,11 @@ use-sync-external-store@^1.0.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -9914,6 +10034,11 @@ walker@^1.0.7, walker@^1.0.8: dependencies: makeerror "1.0.12" +warn-once@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43" + integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" From 754ccc3b64d2becb3dd9023229ea513fbce5447e Mon Sep 17 00:00:00 2001 From: HuyDo Date: Wed, 9 Oct 2024 09:29:30 +0700 Subject: [PATCH 2/4] fix: move library to devDepencies --- package.json | 11 +- yarn.lock | 1511 +++++++++++++++++++++++++------------------------- 2 files changed, 763 insertions(+), 759 deletions(-) diff --git a/package.json b/package.json index acc612a..a8c1f83 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,16 @@ "react-native-vision-camera": "^4.1.0", "release-it": "^15.0.0", "typescript": "^4.5.2", - "uuid": "^10.0.0" + "uuid": "^10.0.0", + "react-native-audio-recorder-player": "^3.6.11", + "react-native-fs": "^2.20.0", + "react-native-get-random-values": "^1.11.0", + "react-native-gifted-chat": "2.4.0", + "react-native-image-picker": "^7.1.2", + "react-native-reanimated": "^3.15.4", + "react-native-safe-area-context": "^4.11.0", + "react-native-svg": "^15.3.0", + "react-native-uuid": "^2.0.2" }, "resolutions": { "@types/react-native": "0.71.8", diff --git a/yarn.lock b/yarn.lock index 4ca523c..f9bea5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,34 +10,34 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" + integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/highlight" "^7.25.7" picocolors "^1.0.0" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" - integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.7.tgz#b8479fe0018ef0ac87b6b7a5c6916fcd67ae2c9c" + integrity sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.18.5", "@babel/core@^7.20.0": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.7.tgz#1b3d144157575daf132a3bc80b2b18e6e3ca6ece" + integrity sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" + "@babel/code-frame" "^7.25.7" + "@babel/generator" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helpers" "^7.25.7" + "@babel/parser" "^7.25.7" + "@babel/template" "^7.25.7" + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -45,70 +45,70 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" - integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.7.tgz#27b43de786c83cbabbcb328efbb4f099ae85415e" + integrity sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.20.0", "@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" - integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== +"@babel/generator@^7.20.0", "@babel/generator@^7.25.7", "@babel/generator@^7.7.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" + integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== dependencies: - "@babel/types" "^7.25.6" + "@babel/types" "^7.25.7" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" - integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== +"@babel/helper-annotate-as-pure@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972" + integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA== dependencies: - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" - integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622" + integrity sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" - integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4" + integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A== dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" + "@babel/compat-data" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0", "@babel/helper-create-class-features-plugin@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" - integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/traverse" "^7.25.4" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b" + integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-member-expression-to-functions" "^7.25.7" + "@babel/helper-optimise-call-expression" "^7.25.7" + "@babel/helper-replace-supers" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/traverse" "^7.25.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" - integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e" + integrity sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - regexpu-core "^5.3.1" + "@babel/helper-annotate-as-pure" "^7.25.7" + regexpu-core "^6.1.1" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.2": @@ -129,165 +129,165 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" - integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== - dependencies: - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.8" - -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" - integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.2" - -"@babel/helper-optimise-call-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" - integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" - integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== - -"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" - integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-wrap-function" "^7.25.0" - "@babel/traverse" "^7.25.0" - -"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" - integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/traverse" "^7.25.0" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" - integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helper-wrap-function@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" - integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== - dependencies: - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/helpers@^7.25.0": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" - integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== - dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.6" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" +"@babel/helper-member-expression-to-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574" + integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-module-imports@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" + integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-module-transforms@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" + integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== + dependencies: + "@babel/helper-module-imports" "^7.25.7" + "@babel/helper-simple-access" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/helper-optimise-call-expression@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a" + integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng== + dependencies: + "@babel/types" "^7.25.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" + integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021" + integrity sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-wrap-function" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/helper-replace-supers@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5" + integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.7" + "@babel/helper-optimise-call-expression" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/helper-simple-access@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" + integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c" + integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-string-parser@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" + integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== + +"@babel/helper-validator-identifier@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" + integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== + +"@babel/helper-validator-option@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" + integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== + +"@babel/helper-wrap-function@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7" + integrity sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg== + dependencies: + "@babel/template" "^7.25.7" + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helpers@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2" + integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA== + dependencies: + "@babel/template" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/highlight@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" + integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" - integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.7.tgz#99b927720f4ddbfeb8cd195a363ed4532f87c590" + integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw== dependencies: - "@babel/types" "^7.25.6" + "@babel/types" "^7.25.7" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" - integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64" + integrity sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.3" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/traverse" "^7.25.7" -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" - integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046" + integrity sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" - integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4" + integrity sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" - integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a" + integrity sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/plugin-transform-optional-chaining" "^7.25.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" - integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5" + integrity sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.0" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/traverse" "^7.25.7" "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" @@ -308,12 +308,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6" - integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.7.tgz#7ed72dbdc834bc841953858664008ad30a6653d3" + integrity sha512-Egdiuy7pLTyaPkIr6rItNyFVbblTmx3VgqY+72KiS9BzcA+SMyrS9zSumQeSANo8uE3Kax0ZUMkpNh0Q+mbNwg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-default-from" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/plugin-syntax-export-default-from" "^7.25.7" "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.18.6" @@ -391,12 +391,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac" - integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw== +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.7.tgz#3e05205c62303fe088f6b7073e5c143a669c26f4" + integrity sha512-LRUCsC0YucSjabsmxx6yly8+Q/5mxKdp9gemlpR9ro3bfpcOQOXx/CHivs7QCbjgygd6uQ2GcRfHu1FVax/hgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -405,26 +405,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" - integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.7.tgz#7d1255201b55d7644c57e0eb354aaf9f8b8d2d02" + integrity sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" - integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== +"@babel/plugin-syntax-import-assertions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz#8ce248f9f4ed4b7ed4cb2e0eb4ed9efd9f52921f" + integrity sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" - integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f" + integrity sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -440,12 +440,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" - integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165" + integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -503,12 +503,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" - integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== +"@babel/plugin-syntax-typescript@^7.25.7", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b" + integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -518,499 +518,499 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" - integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz#1b9ed22e6890a0e9ff470371c73b8c749bcec386" + integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-async-generator-functions@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" - integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== +"@babel/plugin-transform-async-generator-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz#af61a02b30d7bff5108c63bd39ac7938403426d7" + integrity sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-remap-async-to-generator" "^7.25.7" "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/traverse" "^7.25.4" + "@babel/traverse" "^7.25.7" -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" - integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52" + integrity sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-module-imports" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-remap-async-to-generator" "^7.25.7" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" - integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c" + integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" - integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a" + integrity sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-class-properties@^7.0.0-0", "@babel/plugin-transform-class-properties@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" - integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== +"@babel/plugin-transform-class-properties@^7.0.0-0", "@babel/plugin-transform-class-properties@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523" + integrity sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.4" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-class-static-block@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" - integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== +"@babel/plugin-transform-class-static-block@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz#d2cf3c812e3b3162d56aadf4566f45c30538cb2c" + integrity sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" - integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb" + integrity sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/traverse" "^7.25.4" + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-replace-supers" "^7.25.7" + "@babel/traverse" "^7.25.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" - integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65" + integrity sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/template" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/template" "^7.25.7" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" - integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560" + integrity sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-dotall-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" - integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== +"@babel/plugin-transform-dotall-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02" + integrity sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-duplicate-keys@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" - integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== +"@babel/plugin-transform-duplicate-keys@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93" + integrity sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" - integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141" + integrity sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-dynamic-import@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" - integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== +"@babel/plugin-transform-dynamic-import@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz#31905ab2cfa94dcf1b1f8ce66096720b2908e518" + integrity sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" - integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== +"@babel/plugin-transform-exponentiation-operator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f" + integrity sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-export-namespace-from@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" - integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== +"@babel/plugin-transform-export-namespace-from@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz#beb2679db6fd3bdfe6ad6de2c8cac84a86ef2da1" + integrity sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.24.7": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz#b3aa251db44959b7a7c82abcd6b4225dec7d2258" - integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz#32be871a80e10bbe6d8b1c8a7eeedbbc896d5e80" + integrity sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-flow" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/plugin-syntax-flow" "^7.25.7" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" - integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669" + integrity sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.25.1": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" - integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd" + integrity sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ== dependencies: - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.1" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/traverse" "^7.25.7" -"@babel/plugin-transform-json-strings@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" - integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== +"@babel/plugin-transform-json-strings@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz#6626433554aff4bd6f76a2c621a1f40e802dfb0a" + integrity sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" - integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3" + integrity sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-logical-assignment-operators@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" - integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== +"@babel/plugin-transform-logical-assignment-operators@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz#93847feb513a1f191c5f5d903d991a0ee24fe99b" + integrity sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" - integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5" + integrity sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-modules-amd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" - integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== +"@babel/plugin-transform-modules-amd@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d" + integrity sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" - integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd" + integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg== dependencies: - "@babel/helper-module-transforms" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-simple-access" "^7.25.7" -"@babel/plugin-transform-modules-systemjs@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" - integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== +"@babel/plugin-transform-modules-systemjs@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b" + integrity sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g== dependencies: - "@babel/helper-module-transforms" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.0" + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" + "@babel/traverse" "^7.25.7" -"@babel/plugin-transform-modules-umd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" - integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== +"@babel/plugin-transform-modules-umd@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367" + integrity sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" - integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d" + integrity sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-new-target@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" - integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== +"@babel/plugin-transform-new-target@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9" + integrity sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" - integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz#0af84b86d4332654c43cf028dbdcf878b00ac168" + integrity sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" - integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== +"@babel/plugin-transform-numeric-separator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz#a516b78f894d1c08283f39d809b2048fd2f29448" + integrity sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" - integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== +"@babel/plugin-transform-object-rest-spread@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz#fa0916521be96fd434e2db59780b24b308c6d169" + integrity sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-parameters" "^7.25.7" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" - integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661" + integrity sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-replace-supers" "^7.25.7" -"@babel/plugin-transform-optional-catch-binding@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" - integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== +"@babel/plugin-transform-optional-catch-binding@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz#400e2d891f9288f5231694234696aa67164e4913" + integrity sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.0.0-0", "@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" - integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== +"@babel/plugin-transform-optional-chaining@^7.0.0-0", "@babel/plugin-transform-optional-chaining@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz#b7f7c9321aa1d8414e67799c28d87c23682e4d68" + integrity sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" - integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7" + integrity sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-private-methods@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" - integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== +"@babel/plugin-transform-private-methods@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80" + integrity sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.4" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-private-property-in-object@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" - integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== +"@babel/plugin-transform-private-property-in-object@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz#aff877efd05b57c4ad04611d8de97bf155a53369" + integrity sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" - integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d" + integrity sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" - integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz#2753e875a1b702fb1d806c4f5d4c194d64cadd88" + integrity sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-react-jsx-development@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" - integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== +"@babel/plugin-transform-react-jsx-development@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz#2fbd77887b8fa2942d7cb61edf1029ea1b048554" + integrity sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg== dependencies: - "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.25.7" "@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" - integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz#3d11df143131fd8f5486a1f7d3839890f88f8c85" + integrity sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" - integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz#a0d8372310d5ea5b0447dfa03a8485f960eff7be" + integrity sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.24.7": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" - integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz#f5e2af6020a562fe048dd343e571c4428e6c5632" + integrity sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.25.2" + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-module-imports" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/plugin-syntax-jsx" "^7.25.7" + "@babel/types" "^7.25.7" -"@babel/plugin-transform-react-pure-annotations@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" - integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== +"@babel/plugin-transform-react-pure-annotations@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz#6d0b8dadb2d3c5cbb8ade68c5efd49470b0d65f7" + integrity sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-regenerator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" - integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== +"@babel/plugin-transform-regenerator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e" + integrity sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" - integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== +"@babel/plugin-transform-reserved-words@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995" + integrity sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-transform-runtime@^7.0.0": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz#96e4ad7bfbbe0b4a7b7e6f2a533ca326cf204963" - integrity sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz#435a4fab67273f00047dc806e05069c9c6344e12" + integrity sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-module-imports" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" - integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f" + integrity sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" - integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998" + integrity sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" - integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17" + integrity sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.0.0-0", "@babel/plugin-transform-template-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" - integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.0.0-0", "@babel/plugin-transform-template-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b" + integrity sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-typeof-symbol@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" - integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== +"@babel/plugin-transform-typeof-symbol@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb" + integrity sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-typescript@^7.24.7", "@babel/plugin-transform-typescript@^7.5.0": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" - integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== +"@babel/plugin-transform-typescript@^7.25.7", "@babel/plugin-transform-typescript@^7.5.0": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe" + integrity sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-typescript" "^7.24.7" + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/plugin-syntax-typescript" "^7.25.7" -"@babel/plugin-transform-unicode-escapes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" - integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== +"@babel/plugin-transform-unicode-escapes@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81" + integrity sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-unicode-property-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" - integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== +"@babel/plugin-transform-unicode-property-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e" + integrity sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.0.0-0", "@babel/plugin-transform-unicode-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" - integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.0.0-0", "@babel/plugin-transform-unicode-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809" + integrity sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" -"@babel/plugin-transform-unicode-sets-regex@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" - integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== +"@babel/plugin-transform-unicode-sets-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c" + integrity sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" "@babel/preset-env@^7.18.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" - integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== - dependencies: - "@babel/compat-data" "^7.25.4" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-option" "^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.7.tgz#fc1b092152db4b58377b85dc05c890081c1157e0" + integrity sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g== + dependencies: + "@babel/compat-data" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.7" - "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-assertions" "^7.25.7" + "@babel/plugin-syntax-import-attributes" "^7.25.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1022,70 +1022,70 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.25.4" - "@babel/plugin-transform-async-to-generator" "^7.24.7" - "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.25.0" - "@babel/plugin-transform-class-properties" "^7.25.4" - "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.25.4" - "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.8" - "@babel/plugin-transform-dotall-regex" "^7.24.7" - "@babel/plugin-transform-duplicate-keys" "^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" - "@babel/plugin-transform-dynamic-import" "^7.24.7" - "@babel/plugin-transform-exponentiation-operator" "^7.24.7" - "@babel/plugin-transform-export-namespace-from" "^7.24.7" - "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.25.1" - "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.25.2" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" - "@babel/plugin-transform-member-expression-literals" "^7.24.7" - "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.8" - "@babel/plugin-transform-modules-systemjs" "^7.25.0" - "@babel/plugin-transform-modules-umd" "^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" - "@babel/plugin-transform-new-target" "^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" - "@babel/plugin-transform-numeric-separator" "^7.24.7" - "@babel/plugin-transform-object-rest-spread" "^7.24.7" - "@babel/plugin-transform-object-super" "^7.24.7" - "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.8" - "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.25.4" - "@babel/plugin-transform-private-property-in-object" "^7.24.7" - "@babel/plugin-transform-property-literals" "^7.24.7" - "@babel/plugin-transform-regenerator" "^7.24.7" - "@babel/plugin-transform-reserved-words" "^7.24.7" - "@babel/plugin-transform-shorthand-properties" "^7.24.7" - "@babel/plugin-transform-spread" "^7.24.7" - "@babel/plugin-transform-sticky-regex" "^7.24.7" - "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.8" - "@babel/plugin-transform-unicode-escapes" "^7.24.7" - "@babel/plugin-transform-unicode-property-regex" "^7.24.7" - "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.4" + "@babel/plugin-transform-arrow-functions" "^7.25.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.7" + "@babel/plugin-transform-async-to-generator" "^7.25.7" + "@babel/plugin-transform-block-scoped-functions" "^7.25.7" + "@babel/plugin-transform-block-scoping" "^7.25.7" + "@babel/plugin-transform-class-properties" "^7.25.7" + "@babel/plugin-transform-class-static-block" "^7.25.7" + "@babel/plugin-transform-classes" "^7.25.7" + "@babel/plugin-transform-computed-properties" "^7.25.7" + "@babel/plugin-transform-destructuring" "^7.25.7" + "@babel/plugin-transform-dotall-regex" "^7.25.7" + "@babel/plugin-transform-duplicate-keys" "^7.25.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.7" + "@babel/plugin-transform-dynamic-import" "^7.25.7" + "@babel/plugin-transform-exponentiation-operator" "^7.25.7" + "@babel/plugin-transform-export-namespace-from" "^7.25.7" + "@babel/plugin-transform-for-of" "^7.25.7" + "@babel/plugin-transform-function-name" "^7.25.7" + "@babel/plugin-transform-json-strings" "^7.25.7" + "@babel/plugin-transform-literals" "^7.25.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.7" + "@babel/plugin-transform-member-expression-literals" "^7.25.7" + "@babel/plugin-transform-modules-amd" "^7.25.7" + "@babel/plugin-transform-modules-commonjs" "^7.25.7" + "@babel/plugin-transform-modules-systemjs" "^7.25.7" + "@babel/plugin-transform-modules-umd" "^7.25.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.7" + "@babel/plugin-transform-new-target" "^7.25.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.7" + "@babel/plugin-transform-numeric-separator" "^7.25.7" + "@babel/plugin-transform-object-rest-spread" "^7.25.7" + "@babel/plugin-transform-object-super" "^7.25.7" + "@babel/plugin-transform-optional-catch-binding" "^7.25.7" + "@babel/plugin-transform-optional-chaining" "^7.25.7" + "@babel/plugin-transform-parameters" "^7.25.7" + "@babel/plugin-transform-private-methods" "^7.25.7" + "@babel/plugin-transform-private-property-in-object" "^7.25.7" + "@babel/plugin-transform-property-literals" "^7.25.7" + "@babel/plugin-transform-regenerator" "^7.25.7" + "@babel/plugin-transform-reserved-words" "^7.25.7" + "@babel/plugin-transform-shorthand-properties" "^7.25.7" + "@babel/plugin-transform-spread" "^7.25.7" + "@babel/plugin-transform-sticky-regex" "^7.25.7" + "@babel/plugin-transform-template-literals" "^7.25.7" + "@babel/plugin-transform-typeof-symbol" "^7.25.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.7" + "@babel/plugin-transform-unicode-property-regex" "^7.25.7" + "@babel/plugin-transform-unicode-regex" "^7.25.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.7" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.37.1" + core-js-compat "^3.38.1" semver "^6.3.1" "@babel/preset-flow@^7.13.13", "@babel/preset-flow@^7.17.12": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.7.tgz#eef5cb8e05e97a448fc50c16826f5612fe512c06" - integrity sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.7.tgz#a9460677c182c2e105c32567a036d360c86668a9" + integrity sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-transform-flow-strip-types" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-transform-flow-strip-types" "^7.25.7" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" @@ -1097,32 +1097,32 @@ esutils "^2.0.2" "@babel/preset-react@^7.17.12": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" - integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.7.tgz#081cbe1dea363b732764d06a0fdda67ffa17735d" + integrity sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-transform-react-display-name" "^7.24.7" - "@babel/plugin-transform-react-jsx" "^7.24.7" - "@babel/plugin-transform-react-jsx-development" "^7.24.7" - "@babel/plugin-transform-react-pure-annotations" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-transform-react-display-name" "^7.25.7" + "@babel/plugin-transform-react-jsx" "^7.25.7" + "@babel/plugin-transform-react-jsx-development" "^7.25.7" + "@babel/plugin-transform-react-pure-annotations" "^7.25.7" "@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.17.12": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" - integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz#43c5b68eccb856ae5b52274b77b1c3c413cde1b7" + integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-typescript" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-syntax-jsx" "^7.25.7" + "@babel/plugin-transform-modules-commonjs" "^7.25.7" + "@babel/plugin-transform-typescript" "^7.25.7" "@babel/register@^7.13.16": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.24.6.tgz#59e21dcc79e1d04eed5377633b0f88029a6bef9e" - integrity sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.7.tgz#75ec0d3a8f843d344c51bf2f18fcc03f3a4c9117" + integrity sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1130,47 +1130,42 @@ pirates "^4.0.6" source-map-support "^0.5.16" -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - "@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" - integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.0.0", "@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@^7.20.0", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4", "@babel/traverse@^7.7.2": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" - integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.6" - "@babel/parser" "^7.25.6" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.6" +"@babel/template@^7.0.0", "@babel/template@^7.25.7", "@babel/template@^7.3.3": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" + integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== + dependencies: + "@babel/code-frame" "^7.25.7" + "@babel/parser" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/traverse@^7.20.0", "@babel/traverse@^7.25.7", "@babel/traverse@^7.7.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" + integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== + dependencies: + "@babel/code-frame" "^7.25.7" + "@babel/generator" "^7.25.7" + "@babel/parser" "^7.25.7" + "@babel/template" "^7.25.7" + "@babel/types" "^7.25.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.25.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" - integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== +"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.7.tgz#1b7725c1d3a59f328cb700ce704c46371e6eef9b" + integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ== dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" + "@babel/helper-string-parser" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1379,9 +1374,9 @@ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@evilmartians/lefthook@^1.2.2": - version "1.7.17" - resolved "https://registry.yarnpkg.com/@evilmartians/lefthook/-/lefthook-1.7.17.tgz#000b560dcc21fb17a68ab913dba67512652f7e86" - integrity sha512-Al1Enc/AXzp66zzIQ9WonXAaWXutVPJCePqnTFBiaYMKErNAgYYvuFGyNh9zlmirD6TTp3gCdT21BBePLAHl9A== + version "1.7.18" + resolved "https://registry.yarnpkg.com/@evilmartians/lefthook/-/lefthook-1.7.18.tgz#f8712965f6d39e60332d191da832a2c5c8e3980d" + integrity sha512-BIJBQtC7xKOedxESlB0wVG6M32ftjK+5vnID9I5CjRDE/6KcCpcK366AyG0eHGdPK1TVty81QalxZqSTxWRXPw== "@expo/react-native-action-sheet@^4.1.0": version "4.1.0" @@ -2338,9 +2333,9 @@ "@types/lodash" "*" "@types/lodash@*": - version "4.17.9" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.9.tgz#0dc4902c229f6b8e2ac5456522104d7b1a230290" - integrity sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w== + version "4.17.10" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.10.tgz#64f3edf656af2fe59e7278b73d3e62404144a6e6" + integrity sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ== "@types/minimist@^1.2.0", "@types/minimist@^1.2.2": version "1.2.5" @@ -2348,9 +2343,9 @@ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*": - version "22.7.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" - integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== dependencies: undici-types "~6.19.2" @@ -3098,7 +3093,7 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -browserslist@^4.20.4, browserslist@^4.23.1, browserslist@^4.23.3: +browserslist@^4.20.4, browserslist@^4.23.3, browserslist@^4.24.0: version "4.24.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== @@ -3236,9 +3231,9 @@ camelcase@^7.0.1: integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== caniuse-lite@^1.0.30001663: - version "1.0.30001664" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" - integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== + version "1.0.30001667" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz#99fc5ea0d9c6e96897a104a8352604378377f949" + integrity sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw== chalk@5.2.0: version "5.2.0" @@ -3720,7 +3715,7 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js-compat@^3.37.1, core-js-compat@^3.38.0: +core-js-compat@^3.38.0, core-js-compat@^3.38.1: version "3.38.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== @@ -4179,9 +4174,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.28: - version "1.5.29" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" - integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== + version "1.5.33" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz#8f64698661240e70fdbc4b032e6085e391f05e09" + integrity sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA== emittery@^0.10.2: version "0.10.2" @@ -4483,9 +4478,9 @@ eslint-plugin-react-native@^4.0.0: eslint-plugin-react-native-globals "^0.1.1" eslint-plugin-react@^7.30.1: - version "7.37.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz#c21f64a32fc34df1eaeca571ec8f70bdc40dd20a" - integrity sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA== + version "7.37.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" + integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -6053,9 +6048,9 @@ iterate-value@^1.0.2: iterate-iterator "^1.0.1" iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== dependencies: define-properties "^1.2.1" get-intrinsic "^1.2.1" @@ -6596,15 +6591,10 @@ jscodeshift@^0.14.0: temp "^0.8.4" write-file-atomic "^2.3.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@^3.0.2, jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -8485,9 +8475,9 @@ react-native-uuid@^2.0.2: integrity sha512-5ypj/hV58P+6VREdjkW0EudSibsH3WdqDERoHKnD9syFWjF+NfRWWrJb2sa3LIwI5zpzMvUiabs+DX40WHpEMw== react-native-video@^6.2.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/react-native-video/-/react-native-video-6.6.3.tgz#d602c0ded79a54101f9c86c007d57243d89f71e2" - integrity sha512-Exu9Taaj1QibEQLAI8P8ax+KTZQ8UKQ6dsp1qMVnG35tR477hT0pKgXceo7tUmC6PibI8D7MTZzNRzXf88+TDA== + version "6.6.4" + resolved "https://registry.yarnpkg.com/react-native-video/-/react-native-video-6.6.4.tgz#77630a7b20b93a12ebc83244e9171ea5f0da52fd" + integrity sha512-YBaStWAhWZMDaRG7Q9u173Si7ho7I3xwrS1SCKnProeXfdaS7vZNbt84ueFwufa4YxZ0JZoyOypH0tA0JZK3GQ== react-native-vision-camera@^4.1.0: version "4.5.3" @@ -8682,7 +8672,7 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" -regenerate-unicode-properties@^10.1.0: +regenerate-unicode-properties@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== @@ -8712,24 +8702,24 @@ regenerator-transform@^0.15.2: "@babel/runtime" "^7.8.4" regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + set-function-name "^2.0.2" -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== +regexpu-core@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" + integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== dependencies: - "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.11.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -8747,12 +8737,17 @@ registry-url@^6.0.0: dependencies: rc "1.2.8" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149" + integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ== dependencies: - jsesc "~0.5.0" + jsesc "~3.0.2" release-it@^15.0.0: version "15.11.0" @@ -9830,9 +9825,9 @@ typescript@^4.5.2: integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== "typescript@^4.6.4 || ^5.2.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" - integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== uglify-es@^3.1.9: version "3.3.9" From 3c6f8e531336d3683cacecc8c06b5a5dd81a5b65 Mon Sep 17 00:00:00 2001 From: HuyDo Date: Thu, 17 Oct 2024 14:07:59 +0700 Subject: [PATCH 3/4] feat: add package json and example --- README.md | 22 ++++++++++++++++++++-- package.json | 11 +---------- yarn.lock | 12 ++++++------ 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index eb6c22b..ea13cf1 100644 --- a/README.md +++ b/README.md @@ -112,12 +112,22 @@ Then using our Addons component in ChatScreen ```javascript import React from 'react' import {ChatScreen as BaseChatScreen} from 'rn-firebase-chat' -import {CameraView, useCamera} from 'rn-firebase-chat/src/addons/camera' +import { + CameraView, + useCamera, + VoiceRecorderModalRef, + VoiceRecorderModal, +} from 'rn-firebase-chat/src/addons'; ... export const ChatScreen: React.FC = () => { const {onPressCamera, onPressGallery} = useCamera() + const fileAttachmentRef = useRef(null); + + const onPressAudio = useCallback(() => { + fileAttachmentRef.current?.show(); + }, []); return ( { hasGallery: true, onPressCamera, onPressGallery, + renderLeftCustomView: () => ( +