From ac9fc73f4e256b69a280caa89014f1ac13758b8d Mon Sep 17 00:00:00 2001 From: karatashsyn <81769362+karatashsyn@users.noreply.github.com> Date: Tue, 29 Oct 2024 19:41:15 +0300 Subject: [PATCH 01/10] env: Upload eas.js file --- mobile/tradeverse/eas.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 mobile/tradeverse/eas.json diff --git a/mobile/tradeverse/eas.json b/mobile/tradeverse/eas.json new file mode 100644 index 00000000..6d2b1ea0 --- /dev/null +++ b/mobile/tradeverse/eas.json @@ -0,0 +1,21 @@ +{ + "build": { + "preview": { + "android": { + "buildType": "apk" + } + }, + "preview2": { + "android": { + "gradleCommand": ":app:assembleRelease" + } + }, + "preview3": { + "developmentClient": true + }, + "preview4": { + "distribution": "internal" + }, + "production": {} + } + } \ No newline at end of file From 12a35ea7c3ed8547a1d3ecee3772db0c396153fa Mon Sep 17 00:00:00 2001 From: karatashsyn <81769362+karatashsyn@users.noreply.github.com> Date: Tue, 29 Oct 2024 19:42:43 +0300 Subject: [PATCH 02/10] refactor: Refactor Auth Logic and UI --- mobile/tradeverse/app.json | 11 +++++- .../tradeverse/auth/context/auth-provider.jsx | 38 +++++++++---------- .../components/ui/global-screen.jsx | 29 ++++++++++---- mobile/tradeverse/mock-data/all-tags.js | 12 ++++++ mobile/tradeverse/mock-services/assets.js | 3 +- .../screens/explore-search-results/index.jsx | 5 ++- mobile/tradeverse/screens/portfolio/index.jsx | 17 ++++++--- .../tradeverse/screens/post-detail/index.jsx | 3 -- 8 files changed, 79 insertions(+), 39 deletions(-) diff --git a/mobile/tradeverse/app.json b/mobile/tradeverse/app.json index bda2f019..94a8c65f 100644 --- a/mobile/tradeverse/app.json +++ b/mobile/tradeverse/app.json @@ -19,7 +19,8 @@ "adaptiveIcon": { "foregroundImage": "./assets/images/adaptive-icon.png", "backgroundColor": "#ffffff" - } + }, + "package": "com.huseyin.karatas.tradeverse" }, "web": { "bundler": "metro", @@ -31,6 +32,14 @@ ], "experiments": { "typedRoutes": true + }, + "extra": { + "router": { + "origin": false + }, + "eas": { + "projectId": "afbaffdd-20ea-4bb5-85ee-988716e97ea4" + } } } } diff --git a/mobile/tradeverse/auth/context/auth-provider.jsx b/mobile/tradeverse/auth/context/auth-provider.jsx index 6ce94ba4..35710be0 100644 --- a/mobile/tradeverse/auth/context/auth-provider.jsx +++ b/mobile/tradeverse/auth/context/auth-provider.jsx @@ -17,32 +17,31 @@ export default function AuthProvider({ children }) { isAuthenticated(); }, [isAuthenticated]); - useEffect(()=>{ - console.log('===================================='); - console.log('isTagSelected',isTagSelected); - console.log('===================================='); - if(isAuthenticated){ - if(isTagSelected){ - router.replace('(tabs)'); - } - else{ - router.replace('splash'); - } - } - else{ - router.replace('auth'); - } - },[isTagSelected,isAuthenticated]); + // useEffect(()=>{ + // console.log('isTagSelected',isTagSelected); + // console.log('isAuthenticated',isLoggedin); + + + // if(isLoggedin){ + // if(isTagSelected){ + // router.replace('(tabs)'); + // } + // else{ + // router.replace('splash'); + // } + // } + // else{ + // router.replace('auth'); + // } + // },[isTagSelected, isAuthenticated]); const signIn = useCallback(async ({ username, password }) => { try { - // setLoading(true); const res = await login({ username, password }); if (res.status === 200) { await AsyncStorage.setItem('authToken', res.data?.token); await AsyncStorage.setItem('username', username); const userProfile = await getUserByUsername({ username }); - setUser(userProfile); setIsLoggedIn(true); router.replace('(tabs)'); @@ -72,7 +71,8 @@ export default function AuthProvider({ children }) { setUser(userProfile); setIsLoggedIn(true); - router.replace('(tabs)'); + // router.replace('(tabs)'); + router.replace('splash'); // setUser(res.data?.user); } } catch (error) { diff --git a/mobile/tradeverse/components/ui/global-screen.jsx b/mobile/tradeverse/components/ui/global-screen.jsx index 3c1e5fcb..d640ffa2 100644 --- a/mobile/tradeverse/components/ui/global-screen.jsx +++ b/mobile/tradeverse/components/ui/global-screen.jsx @@ -1,12 +1,25 @@ -import React from 'react'; -import { SafeAreaView, StyleSheet } from 'react-native'; -import PaddedContainer from './padded-container'; -import { COLORS } from '../../constants/theme'; +import React from "react"; +import { Platform, SafeAreaView, StyleSheet } from "react-native"; +import PaddedContainer from "./padded-container"; +import { COLORS } from "../../constants/theme"; -export default function GlobalScreen({ children, style, paddingTop=28, containerStyle }) { +export default function GlobalScreen({ + children, + style, + paddingTop = 28, + containerStyle, +}) { + const platform = Platform.OS; return ( - - {children} + + + {children} + ); } @@ -15,5 +28,5 @@ const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: COLORS.white, - } + }, }); diff --git a/mobile/tradeverse/mock-data/all-tags.js b/mobile/tradeverse/mock-data/all-tags.js index eb47c469..c523f57b 100644 --- a/mobile/tradeverse/mock-data/all-tags.js +++ b/mobile/tradeverse/mock-data/all-tags.js @@ -299,4 +299,16 @@ export const allTags = [ posts: 6541, people: 267, }, + { + id: 51, + label: "MicroEconomy", + posts: 4321, + people: 189, + }, + { + id: 52, + label: "CryptoEconomy", + posts: 5432, + people: 198, + }, ]; diff --git a/mobile/tradeverse/mock-services/assets.js b/mobile/tradeverse/mock-services/assets.js index fa9cb7f2..b70c5115 100644 --- a/mobile/tradeverse/mock-services/assets.js +++ b/mobile/tradeverse/mock-services/assets.js @@ -4,7 +4,8 @@ export const searchAssets = (searchTerm) => { return allAssets; } return allAssets.filter((asset) => - asset.label.toLowerCase().includes(searchTerm.toLowerCase()) + asset.label.toLowerCase().includes(searchTerm.toLowerCase()) || + asset.abbreviation.toLowerCase().includes(searchTerm.toLowerCase()) ); }; diff --git a/mobile/tradeverse/screens/explore-search-results/index.jsx b/mobile/tradeverse/screens/explore-search-results/index.jsx index 108946e7..93bd1659 100644 --- a/mobile/tradeverse/screens/explore-search-results/index.jsx +++ b/mobile/tradeverse/screens/explore-search-results/index.jsx @@ -31,9 +31,12 @@ export default function ExploreRootScreen() { const { searchKey } = useLocalSearchParams(); + useEffect(()=>{ + setUpdatedSearchKey(searchKey) + },[searchKey]) + useEffect(() => { const data = searchOnExplore(updatedSearchKey ?? searchKey); - setData({ popular: data.popular, assets: data.assets, diff --git a/mobile/tradeverse/screens/portfolio/index.jsx b/mobile/tradeverse/screens/portfolio/index.jsx index 1ef8cdc7..5737d8a0 100644 --- a/mobile/tradeverse/screens/portfolio/index.jsx +++ b/mobile/tradeverse/screens/portfolio/index.jsx @@ -8,7 +8,7 @@ import { } from "react-native"; import FullScrollView from "../../components/ui/full-scroll-view"; import GlobalScreen from "../../components/ui/global-screen"; -import { SIZE_CONSTANT } from "../../constants/theme"; +import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT } from "../../constants/theme"; import { router, Stack } from "expo-router"; import paths from "../../config/screen-paths"; import { searchAssets } from "../../mock-services/assets"; @@ -87,10 +87,10 @@ const styles = StyleSheet.create({ title: { fontSize: 24, fontWeight: "bold", - color: "#4A148C", // Dark purple + color: COLORS.primary800, }, addButton: { - backgroundColor: "#7B1FA2", // Medium purple + backgroundColor:COLORS.primary500, width: 48, height: 48, display: "flex", @@ -101,6 +101,7 @@ const styles = StyleSheet.create({ addButtonText: { fontSize: SIZE_CONSTANT * 2, + fontWeight: FONT_WEIGHTS.medium, color: "#FFFFFF", // White text }, scrollViewContent: { @@ -112,7 +113,9 @@ const styles = StyleSheet.create({ justifyContent: "space-between", }, assetBlock: { - backgroundColor: "#D1C4E9", // Lighter purple + borderColor: COLORS.primary50, // Light purple + borderWidth: .5, + backgroundColor: COLORS.primary100, // Lighter purple width: "48%", height: 100, borderRadius: 10, @@ -120,14 +123,16 @@ const styles = StyleSheet.create({ justifyContent: "space-between", marginBottom: 20, }, + assetName: { fontSize: 18, fontWeight: "bold", - color: "#4A148C", // Dark purple for text + color:COLORS.primary700, }, + assetValue: { fontSize: 16, - color: "#7B1FA2", // Medium purple for value + color:COLORS.primary800, alignSelf: "flex-end", }, }); diff --git a/mobile/tradeverse/screens/post-detail/index.jsx b/mobile/tradeverse/screens/post-detail/index.jsx index af62e2fa..cbd23576 100644 --- a/mobile/tradeverse/screens/post-detail/index.jsx +++ b/mobile/tradeverse/screens/post-detail/index.jsx @@ -46,9 +46,6 @@ const PostScreen = () => { const [data, setData] = useState(null); useEffect(() => { - console.log('===================================='); - console.log('Post ID:', postId); - console.log('===================================='); const postDetail = getPostById(postId); setData(postDetail); }, [postId]); From 0e8a15b754d8c458a9e5513152e476a2ca36a9b2 Mon Sep 17 00:00:00 2001 From: karatashsyn <81769362+karatashsyn@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:21:49 +0300 Subject: [PATCH 03/10] feat: Create Custom Bar --- mobile/tradeverse/app/(tabs)/_layout.jsx | 3 +- .../tradeverse/auth/context/auth-provider.jsx | 14 ++- .../tradeverse/components/ui/tabbar/index.jsx | 118 ++++++++++++++++++ .../components/ui/tabbar/tabbar-button.jsx | 88 +++++++++++++ mobile/tradeverse/config/navigation.js | 38 ++++-- 5 files changed, 244 insertions(+), 17 deletions(-) create mode 100644 mobile/tradeverse/components/ui/tabbar/index.jsx create mode 100644 mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx diff --git a/mobile/tradeverse/app/(tabs)/_layout.jsx b/mobile/tradeverse/app/(tabs)/_layout.jsx index 9cba63f6..602bdc85 100644 --- a/mobile/tradeverse/app/(tabs)/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/_layout.jsx @@ -3,11 +3,12 @@ import { Tabs } from "expo-router"; import { COLORS } from "../../constants/theme"; import { NAV_OPTIONS } from "../../config/navigation"; import AuthGuard from "../../auth/context/auth-guard"; +import CustomTabBar from "../../components/ui/tabbar/index"; export default function Layout() { return ( - + } initialRouteName="home"> {NAV_OPTIONS.map((option) => ( { - isAuthenticated(); - }, [isAuthenticated]); - // useEffect(()=>{ // console.log('isTagSelected',isTagSelected); // console.log('isAuthenticated',isLoggedin); @@ -146,6 +142,10 @@ export default function AuthProvider({ children }) { return result; }, []); + useEffect(() => { + isAuthenticated(); + }, [isAuthenticated]); + const contextValue = useMemo( () => ({ user, @@ -158,7 +158,7 @@ export default function AuthProvider({ children }) { signUp, isTagSelected, userProfile: user?.profile, - isAuthenticated, + // isAuthenticated, logout, setUser }), @@ -173,10 +173,12 @@ export default function AuthProvider({ children }) { setIsTagSelected, signUp, logout, - isAuthenticated + // isAuthenticated ] ); + + return ( {children} ); diff --git a/mobile/tradeverse/components/ui/tabbar/index.jsx b/mobile/tradeverse/components/ui/tabbar/index.jsx new file mode 100644 index 00000000..e9f9c5e4 --- /dev/null +++ b/mobile/tradeverse/components/ui/tabbar/index.jsx @@ -0,0 +1,118 @@ +/* eslint-disable no-nested-ternary */ +import { useEffect, useState } from 'react'; +import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated'; + +import { View, StyleSheet, Platform } from 'react-native'; +import TabBarButton from './tabbar-button'; +import { NAV_OPTIONS } from '../../../config/navigation'; +import { COLORS } from '@/constants/theme'; + +export default function CustomTabBar({ state, descriptors, navigation }) { + const [tabBarDimensions, setTabBarDimensions] = useState({ + width: 0, + height: 0 + }); + + const buttonWidth = tabBarDimensions.width / state.routes.length; + + const onLayoutChange = (e) => { + setTabBarDimensions({ + width: e.nativeEvent.layout.width, + height: e.nativeEvent.layout.height + }); + }; + + const buttonPositionX = useSharedValue(0); + + useEffect(() => { + buttonPositionX.value = withSpring( buttonWidth * state.index ,{duration: 1220,reduceMotion:true}); + }, [buttonWidth, state.index, buttonPositionX]); + + const animatedStyle = useAnimatedStyle(() => { + return { + transform: [ + { + translateX: buttonPositionX.value + } + ] + }; + }); + + return ( + + + + + {state.routes.map((route, index) => { + const { options } = descriptors[route.key]; + const label = + options.tabBarLabel !== undefined + ? options.tabBarLabel + : options.title !== undefined + ? options.title + : route.name; + + const isFocused = state.index === index; + + const onPress = () => { + const event = navigation.emit({ + type: 'tabPress', + target: route.key, + canPreventDefault: true + }); + + if (!isFocused && !event.defaultPrevented) { + navigation.navigate(route.name, route.params); + } + }; + + + return ( + + ); + })} + + ); +} + +const styles = StyleSheet.create({ + tabBar: { + flexDirection: 'row', + backgroundColor: 'white', + height: 68, + justifyContent: 'space-between', + alignItems: 'center', + position: 'absolute', + borderRadius: 32, + bottom: 32, + left: 12, + right: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 10 }, + shadowRadius: 10, + shadowOpacity: 0.1, + elevation: 12, + }, + focusCircle: { + width: 50, + height: 50, + borderRadius: 30, + backgroundColor: COLORS.primary500, + }, + focusCircleContainer:{ + position: 'absolute', + display: 'flex', + top: 0, + left: 0, + bottom: 0, + justifyContent: 'center', + alignItems: 'center' + } +}); + diff --git a/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx b/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx new file mode 100644 index 00000000..96082ab9 --- /dev/null +++ b/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx @@ -0,0 +1,88 @@ +import { View, Text, StyleSheet, Pressable } from 'react-native'; +import Animated, { + interpolate, + useAnimatedStyle, + useSharedValue, + withSpring +} from 'react-native-reanimated'; +import React, { useEffect } from 'react'; +import { COLORS, SIZE_CONSTANT, SIZES } from '../../../constants/theme'; + +export default function TabBarButton({ + key, + onPress, + isFocused = false, + icons, + label +}) { + const scale = useSharedValue(1); + + useEffect(() => { + scale.value = withSpring(isFocused ? 1 : 0, { + duration: 350 + }); + }, [scale, isFocused]); + + const animatedTextStyle = useAnimatedStyle(() => { + const opacity = interpolate(scale.value, [0, 1], [1, 0]); + + return { + opacity + }; + }); + + const animatedIconStyle = useAnimatedStyle(() => { + const scaleValue = interpolate(scale.value, [0, 1], [0.8, 1]); + const topValue = interpolate(scale.value, [0, 1], [0, 7]); + return { + transform: [{ + scale: scaleValue + }], + top: topValue + }; + }); + + return ( + + + {isFocused + ? icons.active(styles.activeIcon) + : icons.inactive(styles.inactiveIcon)} + + + {label} + + + ); +} + +const styles = StyleSheet.create({ + tabBarItem: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + zIndex:90 + }, + tabBarItemText: { + fontSize: SIZES.xxSmall, + color: COLORS.graytext, + fontWeight: 'light' + }, + inactiveIcon: { + strokeWidth: 1.8, + size: SIZE_CONSTANT * 2.8, + color: COLORS.primary500 + }, + activeIcon: { + strokeWidth: 2, + size: SIZE_CONSTANT * 2.8, + color: '#fff', + } +}); diff --git a/mobile/tradeverse/config/navigation.js b/mobile/tradeverse/config/navigation.js index 9c9f3186..44b93877 100644 --- a/mobile/tradeverse/config/navigation.js +++ b/mobile/tradeverse/config/navigation.js @@ -36,9 +36,11 @@ const roots = { export const NAV_OPTIONS = [ { - icon: , + icons :{ + active:(style)=> , + inactive : (style) => + }, label: 'Home', - activeIcon: , path: paths.HOME.ROOT, name: 'home', routeValue: 'home/index', @@ -48,8 +50,12 @@ const roots = { }, { - icon: , - activeIcon: , + // icon: , + // activeIcon: , + icons :{ + active:(style)=> , + inactive : (style) => + }, label: 'Explore', path: paths.EXPLORE.ROOT, name:'explore', @@ -60,8 +66,12 @@ const roots = { } , { - icon:, - activeIcon:, + // icon:, + // activeIcon:, + icons :{ + active:(style)=> , + inactive : (style) => + }, label:'Add', path: paths.CREATE.ROOT, name:'create', @@ -71,8 +81,12 @@ const roots = { } }, { - icon:, - activeIcon:, + // icon:, + // activeIcon:, + icons :{ + active:(style)=> , + inactive : (style) => + }, label:'Portfolio', name:'portfolio', routeValue:'portfolio/index', @@ -81,8 +95,12 @@ const roots = { } }, { - icon:, - activeIcon:, + // icon:, + // activeIcon:, + icons :{ + active:(style)=> , + inactive : (style) => + }, label:'Account', name:'account', routeValue:'account/index', From 8468a08e52f56df4ceebbb257941dd1581bf5f4c Mon Sep 17 00:00:00 2001 From: karatashsyn <81769362+karatashsyn@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:35:59 +0300 Subject: [PATCH 04/10] refactor: Refactor color of the tabbar --- .../tradeverse/components/ui/tabbar/index.jsx | 13 ++++++------ .../components/ui/tabbar/tabbar-button.jsx | 21 ++++++++++--------- .../_components/top-profile-info.jsx | 5 ----- .../tradeverse/screens/asset-detail/index.jsx | 4 ---- .../screens/subforum-detail/index.jsx | 4 ---- mobile/tradeverse/services/user.js | 9 ++------ 6 files changed, 20 insertions(+), 36 deletions(-) diff --git a/mobile/tradeverse/components/ui/tabbar/index.jsx b/mobile/tradeverse/components/ui/tabbar/index.jsx index e9f9c5e4..93b0daf8 100644 --- a/mobile/tradeverse/components/ui/tabbar/index.jsx +++ b/mobile/tradeverse/components/ui/tabbar/index.jsx @@ -5,7 +5,7 @@ import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-na import { View, StyleSheet, Platform } from 'react-native'; import TabBarButton from './tabbar-button'; import { NAV_OPTIONS } from '../../../config/navigation'; -import { COLORS } from '@/constants/theme'; +import { COLORS, SIZE_CONSTANT } from '@/constants/theme'; export default function CustomTabBar({ state, descriptors, navigation }) { const [tabBarDimensions, setTabBarDimensions] = useState({ @@ -84,8 +84,8 @@ export default function CustomTabBar({ state, descriptors, navigation }) { const styles = StyleSheet.create({ tabBar: { flexDirection: 'row', - backgroundColor: 'white', - height: 68, + backgroundColor: COLORS.primary500, + height: SIZE_CONSTANT * 5.2, justifyContent: 'space-between', alignItems: 'center', position: 'absolute', @@ -100,10 +100,11 @@ const styles = StyleSheet.create({ elevation: 12, }, focusCircle: { - width: 50, - height: 50, + width: 42, + height: 42, borderRadius: 30, - backgroundColor: COLORS.primary500, + // backgroundColor: COLORS.primary500, + backgroundColor:COLORS.white, }, focusCircleContainer:{ position: 'absolute', diff --git a/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx b/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx index 96082ab9..5cab5f78 100644 --- a/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx +++ b/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx @@ -32,8 +32,8 @@ export default function TabBarButton({ }); const animatedIconStyle = useAnimatedStyle(() => { - const scaleValue = interpolate(scale.value, [0, 1], [0.8, 1]); - const topValue = interpolate(scale.value, [0, 1], [0, 7]); + const scaleValue = interpolate(scale.value, [0, 1], [0.8, .92]); + const topValue = interpolate(scale.value, [0, 1], [0, 0]); return { transform: [{ scale: scaleValue @@ -56,9 +56,9 @@ export default function TabBarButton({ ? icons.active(styles.activeIcon) : icons.inactive(styles.inactiveIcon)} - + {/* {label} - + */} ); } @@ -72,17 +72,18 @@ const styles = StyleSheet.create({ }, tabBarItemText: { fontSize: SIZES.xxSmall, - color: COLORS.graytext, + color: COLORS.white, fontWeight: 'light' }, inactiveIcon: { - strokeWidth: 1.8, - size: SIZE_CONSTANT * 2.8, - color: COLORS.primary500 + strokeWidth: 1.5, + size: SIZE_CONSTANT * 3, + // color: COLORS.primary500 + color:COLORS.white }, activeIcon: { strokeWidth: 2, - size: SIZE_CONSTANT * 2.8, - color: '#fff', + size: SIZE_CONSTANT * 3, + color: COLORS.primary500, } }); diff --git a/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx b/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx index d91e7181..177e7fa7 100644 --- a/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx +++ b/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx @@ -16,11 +16,6 @@ export default function ProfileInfo() { const {user} = useContext(AuthContext); - useEffect(()=>{ - console.log('===================================='); - console.log(user); - console.log('===================================='); - },[user]); return ( { const { assetId } = useLocalSearchParams(); useEffect(() => { - console.log('===================================='); - console.log('===================================='); const res = getAssetById(assetId); - console.log('===================================='); - console.log('===================================='); setAsset({...res,value: Math.floor(Math.random() * 10000)}); }, [assetId]); diff --git a/mobile/tradeverse/screens/subforum-detail/index.jsx b/mobile/tradeverse/screens/subforum-detail/index.jsx index 7117cdf4..2458f645 100644 --- a/mobile/tradeverse/screens/subforum-detail/index.jsx +++ b/mobile/tradeverse/screens/subforum-detail/index.jsx @@ -12,11 +12,7 @@ const SubforumScreen = () => { const { subforumId } = useLocalSearchParams(); useEffect(() => { - console.log('===================================='); - console.log('subforumId', subforumId); - console.log('===================================='); const res = getSubForumById(subforumId); - console.log(res.title); setData(res); }, [subforumId]); diff --git a/mobile/tradeverse/services/user.js b/mobile/tradeverse/services/user.js index 50186ca6..358387cc 100644 --- a/mobile/tradeverse/services/user.js +++ b/mobile/tradeverse/services/user.js @@ -1,9 +1,7 @@ import api from "./_axios"; export async function getUserByUsername({ username }) { - console.log("===================================="); - console.log("params", { username }); - console.log("===================================="); +ƒ try { const response = await api({ url: "/auth/get-user-details", @@ -13,10 +11,7 @@ export async function getUserByUsername({ username }) { }, data: { username }, }); - console.log("===================================="); - console.log("get user by username"); - console.log(response.data); - console.log("===================================="); + return response.data; } catch (error) { console.error("Get user by username failed", error); From 553adb15bfa4d8a3970a45ea3ed30370c8781812 Mon Sep 17 00:00:00 2001 From: karatashsyn <81769362+karatashsyn@users.noreply.github.com> Date: Wed, 30 Oct 2024 05:19:47 +0300 Subject: [PATCH 05/10] env: Set up Eslint & Prettier and Apply rules --- mobile/tradeverse/.eslintignore | 1 + mobile/tradeverse/.eslintrc | 23 + mobile/tradeverse/.prettierrc | 5 + mobile/tradeverse/app.json | 4 +- mobile/tradeverse/app/(tabs)/_layout.jsx | 19 +- .../tradeverse/app/(tabs)/account/_layout.jsx | 8 +- .../app/(tabs)/account/followed-topics.jsx | 6 +- .../app/(tabs)/account/followed-users.jsx | 6 +- .../tradeverse/app/(tabs)/account/index.jsx | 8 +- .../app/(tabs)/account/portfolio.jsx | 6 +- .../tradeverse/app/(tabs)/account/profile.jsx | 6 +- .../tradeverse/app/(tabs)/create/_layout.jsx | 9 +- .../tradeverse/app/(tabs)/create/add-post.jsx | 6 +- .../app/(tabs)/create/add-subforum.jsx | 6 +- mobile/tradeverse/app/(tabs)/create/index.jsx | 8 +- .../tradeverse/app/(tabs)/explore/_layout.jsx | 8 +- .../tradeverse/app/(tabs)/explore/index.jsx | 10 +- .../app/(tabs)/explore/post-detail.jsx | 7 +- .../(tabs)/explore/search/asset-detail.jsx | 9 +- .../app/(tabs)/explore/search/index.jsx | 14 +- .../app/(tabs)/explore/search/post-detail.jsx | 7 +- .../(tabs)/explore/search/subforum-detail.jsx | 8 +- .../(tabs)/explore/search/user-profile.jsx | 6 +- .../app/(tabs)/explore/subforum-detail.jsx | 8 +- .../app/(tabs)/explore/user-profile.jsx | 6 +- mobile/tradeverse/app/(tabs)/home/_layout.jsx | 8 +- mobile/tradeverse/app/(tabs)/home/index.jsx | 10 +- .../app/(tabs)/home/post-detail.jsx | 7 +- .../app/(tabs)/home/subforum-detail.jsx | 8 +- .../app/(tabs)/home/user-profile.jsx | 6 +- .../app/(tabs)/portfolio/_layout.jsx | 8 +- .../app/(tabs)/portfolio/add-asset.jsx | 12 +- .../app/(tabs)/portfolio/asset-detail.jsx | 6 +- .../tradeverse/app/(tabs)/portfolio/index.jsx | 10 +- mobile/tradeverse/app/[...unmatched].jsx | 4 +- mobile/tradeverse/app/_layout.jsx | 12 +- mobile/tradeverse/app/auth.jsx | 6 +- mobile/tradeverse/app/splash.jsx | 8 +- .../tradeverse/auth/context/auth-context.jsx | 6 +- mobile/tradeverse/auth/context/auth-guard.jsx | 30 +- .../tradeverse/auth/context/auth-provider.jsx | 194 +- mobile/tradeverse/auth/context/index.jsx | 4 +- .../tradeverse/auth/screens/login/index.jsx | 160 +- mobile/tradeverse/auth/ui/AuthLoader.js | 22 +- mobile/tradeverse/babel.config.js | 19 +- .../components/buttons/main-button.jsx | 50 +- .../components/images/content-image.jsx | 15 +- .../components/images/profile-image.jsx | 32 +- .../components/inputs/RHFTextArea.jsx | 14 +- .../components/inputs/RHFTextField.jsx | 51 +- .../components/inputs/TextField.jsx | 18 +- ...TextField.style.js => TextField.style.jsx} | 40 +- .../components/links/asset-link.jsx | 12 +- .../tradeverse/components/links/post-link.jsx | 14 +- .../components/links/subforum-link.jsx | 12 +- .../tradeverse/components/links/user-link.jsx | 14 +- .../components/ui/full-scroll-view.jsx | 17 +- .../components/ui/global-screen.jsx | 16 +- .../components/ui/padded-container.jsx | 12 +- .../tradeverse/components/ui/tabbar/index.jsx | 91 +- .../components/ui/tabbar/tabbar-button.jsx | 58 +- mobile/tradeverse/config/navigation.js | 113 - mobile/tradeverse/config/navigation.jsx | 87 + mobile/tradeverse/config/screen-paths.js | 95 +- mobile/tradeverse/constants/images.jsx | 9 +- mobile/tradeverse/constants/theme.jsx | 91 +- mobile/tradeverse/eas.json | 40 +- mobile/tradeverse/mock-data/HomeData.js | 76 +- mobile/tradeverse/mock-data/Portfolio.js | 54 +- mobile/tradeverse/mock-data/all-assets.js | 296 +- mobile/tradeverse/mock-data/all-subforums.js | 370 +- mobile/tradeverse/mock-data/all-tags.js | 110 +- mobile/tradeverse/mock-data/all-users.js | 49 +- mobile/tradeverse/mock-services/assets.js | 21 +- mobile/tradeverse/mock-services/explore.js | 22 +- mobile/tradeverse/mock-services/home.js | 16 +- mobile/tradeverse/mock-services/post.js | 39 +- mobile/tradeverse/mock-services/subforums.js | 14 +- mobile/tradeverse/mock-services/tags.js | 10 +- mobile/tradeverse/mock-services/users.js | 26 +- mobile/tradeverse/package-lock.json | 5206 ++++++++++------- mobile/tradeverse/package.json | 11 + .../screens/account-profile/index.jsx | 128 +- .../_components/account-option.jsx | 36 +- .../_components/top-profile-info.jsx | 54 +- .../tradeverse/screens/account-root/index.jsx | 26 +- .../screens/account-root/profile-config.js | 52 +- mobile/tradeverse/screens/add-asset/index.jsx | 66 +- .../tradeverse/screens/asset-detail/index.jsx | 80 +- mobile/tradeverse/screens/auth/login.jsx | 79 +- mobile/tradeverse/screens/auth/register.jsx | 101 +- .../tradeverse/screens/create-post/index.jsx | 85 +- .../tradeverse/screens/create-root/index.jsx | 60 +- .../screens/create-subforum/index.jsx | 74 +- .../explore-root/_components/post-card.jsx | 272 +- .../explore-root/_components/search-bar.jsx | 32 +- .../screens/explore-root/_components/tabs.jsx | 93 +- .../tradeverse/screens/explore-root/index.jsx | 38 +- .../explore-root/views/popular-view.jsx | 10 +- .../explore-root/views/recent-view.jsx | 8 +- .../_components/result-cards/asset-result.jsx | 28 +- .../_components/result-cards/post-result.jsx | 259 +- .../result-cards/sub-forum-result.jsx | 127 +- .../_components/result-cards/tag-result.jsx | 62 +- .../_components/result-cards/user-result.jsx | 26 +- .../_components/search-bar.jsx | 38 +- .../_components/tabs.jsx | 54 +- .../screens/explore-search-results/index.jsx | 84 +- .../views/asset-view.jsx | 12 +- .../views/popular-view.jsx | 8 +- .../views/posts-view.jsx | 8 +- .../views/subforums-view.jsx | 8 +- .../views/tags-view.jsx | 10 +- .../views/users-view.jsx | 8 +- .../screens/followed-topics/index.jsx | 104 +- .../followed-users/_components/UserCard.jsx | 22 +- .../screens/followed-users/index.jsx | 77 +- .../home-root/_components/post-card.jsx | 273 +- .../screens/home-root/_components/tabs.jsx | 106 +- mobile/tradeverse/screens/home-root/index.jsx | 43 +- .../home-root/views/followed-people-view.jsx | 8 +- .../home-root/views/followed-topics-view.jsx | 8 +- .../screens/home-root/views/for-you-view.jsx | 8 +- mobile/tradeverse/screens/portfolio/index.jsx | 80 +- .../post-detail/_components/post-header.jsx | 280 +- .../tradeverse/screens/post-detail/index.jsx | 101 +- mobile/tradeverse/screens/profile/index.jsx | 104 +- .../screens/subforum-detail/index.jsx | 83 +- mobile/tradeverse/screens/welcoming/index.jsx | 301 +- mobile/tradeverse/services/_axios.js | 30 +- mobile/tradeverse/services/auth.js | 72 +- mobile/tradeverse/services/user.js | 17 +- mobile/tradeverse/tsconfig.json | 12 +- mobile/tradeverse/util/format-number.js | 27 +- 134 files changed, 6362 insertions(+), 5385 deletions(-) create mode 100644 mobile/tradeverse/.eslintignore create mode 100644 mobile/tradeverse/.eslintrc create mode 100644 mobile/tradeverse/.prettierrc rename mobile/tradeverse/components/inputs/{TextField.style.js => TextField.style.jsx} (76%) delete mode 100644 mobile/tradeverse/config/navigation.js create mode 100644 mobile/tradeverse/config/navigation.jsx diff --git a/mobile/tradeverse/.eslintignore b/mobile/tradeverse/.eslintignore new file mode 100644 index 00000000..6c7fc15b --- /dev/null +++ b/mobile/tradeverse/.eslintignore @@ -0,0 +1 @@ +babel.config.js \ No newline at end of file diff --git a/mobile/tradeverse/.eslintrc b/mobile/tradeverse/.eslintrc new file mode 100644 index 00000000..6ffeea08 --- /dev/null +++ b/mobile/tradeverse/.eslintrc @@ -0,0 +1,23 @@ +{ + "extends": [ + "airbnb-base", + "prettier", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + ], + "plugins": ["prettier", "react", "react-hooks"], + "rules": { + "prettier/prettier": ["error"], + "eqeqeq": "off", + "comma-dangle": "off", + "no-underscore-dangle": "off", + }, + "settings": { + "import/resolver": { + "node": { + "extensions": [".js", ".jsx", ".ts", ".tsx"], + }, + "babel-module": {}, + }, + }, +} diff --git a/mobile/tradeverse/.prettierrc b/mobile/tradeverse/.prettierrc new file mode 100644 index 00000000..36301bc5 --- /dev/null +++ b/mobile/tradeverse/.prettierrc @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/mobile/tradeverse/app.json b/mobile/tradeverse/app.json index 94a8c65f..fbb507a3 100644 --- a/mobile/tradeverse/app.json +++ b/mobile/tradeverse/app.json @@ -27,9 +27,7 @@ "output": "static", "favicon": "./assets/images/favicon.png" }, - "plugins": [ - "expo-router" - ], + "plugins": ["expo-router"], "experiments": { "typedRoutes": true }, diff --git a/mobile/tradeverse/app/(tabs)/_layout.jsx b/mobile/tradeverse/app/(tabs)/_layout.jsx index 602bdc85..241f61f0 100644 --- a/mobile/tradeverse/app/(tabs)/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/_layout.jsx @@ -1,14 +1,17 @@ /* eslint-disable react/self-closing-comp */ -import { Tabs } from "expo-router"; -import { COLORS } from "../../constants/theme"; -import { NAV_OPTIONS } from "../../config/navigation"; -import AuthGuard from "../../auth/context/auth-guard"; -import CustomTabBar from "../../components/ui/tabbar/index"; +import { Tabs } from 'expo-router' +import { COLORS } from '../../constants/theme' +import { NAV_OPTIONS } from '../../config/navigation' +import AuthGuard from '../../auth/context/auth-guard' +import CustomTabBar from '../../components/ui/tabbar/index' export default function Layout() { return ( - } initialRouteName="home"> + } + initialRouteName="home" + > {NAV_OPTIONS.map((option) => ( { - return opt.focused ? option.activeIcon : option.icon; + return opt.focused ? option.activeIcon : option.icon }, tabBarActiveTintColor: COLORS.primary, }} @@ -25,5 +28,5 @@ export default function Layout() { ))} - ); + ) } diff --git a/mobile/tradeverse/app/(tabs)/account/_layout.jsx b/mobile/tradeverse/app/(tabs)/account/_layout.jsx index f645a49e..27011f71 100644 --- a/mobile/tradeverse/app/(tabs)/account/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/account/_layout.jsx @@ -1,10 +1,10 @@ -import { Stack } from 'expo-router'; -import React from 'react'; +import { Stack } from 'expo-router' +import React from 'react' export default function StackLayout() { return ( - + - ); + ) } diff --git a/mobile/tradeverse/app/(tabs)/account/followed-topics.jsx b/mobile/tradeverse/app/(tabs)/account/followed-topics.jsx index e9a049a1..b09e3c74 100644 --- a/mobile/tradeverse/app/(tabs)/account/followed-topics.jsx +++ b/mobile/tradeverse/app/(tabs)/account/followed-topics.jsx @@ -3,7 +3,5 @@ import React from 'react' import FollowedTopicsScreen from '../../../screens/followed-topics' export default function FollowedTopics() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/account/followed-users.jsx b/mobile/tradeverse/app/(tabs)/account/followed-users.jsx index 0ada008c..c912e39d 100644 --- a/mobile/tradeverse/app/(tabs)/account/followed-users.jsx +++ b/mobile/tradeverse/app/(tabs)/account/followed-users.jsx @@ -4,7 +4,5 @@ import AssetDetailScreen from '../../../screens/asset-detail' import FollowedUsersScreen from '../../../screens/followed-users' export default function AssetDetail() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/account/index.jsx b/mobile/tradeverse/app/(tabs)/account/index.jsx index c62097ae..8a9d1e12 100644 --- a/mobile/tradeverse/app/(tabs)/account/index.jsx +++ b/mobile/tradeverse/app/(tabs)/account/index.jsx @@ -1,8 +1,6 @@ -import React from 'react'; -import AccountRootScreen from '../../../screens/account-root'; +import React from 'react' +import AccountRootScreen from '../../../screens/account-root' export default function Account() { - return ( - - ); + return } diff --git a/mobile/tradeverse/app/(tabs)/account/portfolio.jsx b/mobile/tradeverse/app/(tabs)/account/portfolio.jsx index 1ade5eb3..13180247 100644 --- a/mobile/tradeverse/app/(tabs)/account/portfolio.jsx +++ b/mobile/tradeverse/app/(tabs)/account/portfolio.jsx @@ -3,7 +3,5 @@ import React from 'react' import PortfolioScreen from '../../../screens/portfolio' export default function Profile() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/account/profile.jsx b/mobile/tradeverse/app/(tabs)/account/profile.jsx index 90c88a82..34110bea 100644 --- a/mobile/tradeverse/app/(tabs)/account/profile.jsx +++ b/mobile/tradeverse/app/(tabs)/account/profile.jsx @@ -3,7 +3,5 @@ import React from 'react' import AccountProfileScreen from '../../../screens/account-profile' export default function Profile() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/create/_layout.jsx b/mobile/tradeverse/app/(tabs)/create/_layout.jsx index 41abe3ab..27011f71 100644 --- a/mobile/tradeverse/app/(tabs)/create/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/create/_layout.jsx @@ -1,11 +1,10 @@ -import { Stack } from 'expo-router'; -import React from 'react'; +import { Stack } from 'expo-router' +import React from 'react' export default function StackLayout() { return ( - + - ); + ) } - diff --git a/mobile/tradeverse/app/(tabs)/create/add-post.jsx b/mobile/tradeverse/app/(tabs)/create/add-post.jsx index 0395db53..a2ccd827 100644 --- a/mobile/tradeverse/app/(tabs)/create/add-post.jsx +++ b/mobile/tradeverse/app/(tabs)/create/add-post.jsx @@ -3,7 +3,5 @@ import React from 'react' import CreatePostScreen from '../../../screens/create-post' export default function post() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/create/add-subforum.jsx b/mobile/tradeverse/app/(tabs)/create/add-subforum.jsx index 6152c05c..f37d05b6 100644 --- a/mobile/tradeverse/app/(tabs)/create/add-subforum.jsx +++ b/mobile/tradeverse/app/(tabs)/create/add-subforum.jsx @@ -1,6 +1,6 @@ -import React from "react"; -import CreateSubForumScreen from "../../../screens/create-subforum"; +import React from 'react' +import CreateSubForumScreen from '../../../screens/create-subforum' export default function post() { - return ; + return } diff --git a/mobile/tradeverse/app/(tabs)/create/index.jsx b/mobile/tradeverse/app/(tabs)/create/index.jsx index ef5c8bf6..40c002ef 100644 --- a/mobile/tradeverse/app/(tabs)/create/index.jsx +++ b/mobile/tradeverse/app/(tabs)/create/index.jsx @@ -1,8 +1,6 @@ -import React from 'react'; -import CreateRootScreen from '../../../screens/create-root'; +import React from 'react' +import CreateRootScreen from '../../../screens/create-root' export default function Create() { - return ( - - ); + return } diff --git a/mobile/tradeverse/app/(tabs)/explore/_layout.jsx b/mobile/tradeverse/app/(tabs)/explore/_layout.jsx index f645a49e..27011f71 100644 --- a/mobile/tradeverse/app/(tabs)/explore/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/_layout.jsx @@ -1,10 +1,10 @@ -import { Stack } from 'expo-router'; -import React from 'react'; +import { Stack } from 'expo-router' +import React from 'react' export default function StackLayout() { return ( - + - ); + ) } diff --git a/mobile/tradeverse/app/(tabs)/explore/index.jsx b/mobile/tradeverse/app/(tabs)/explore/index.jsx index b0cdcbaf..07a80f9f 100644 --- a/mobile/tradeverse/app/(tabs)/explore/index.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/index.jsx @@ -1,9 +1,7 @@ -import React from 'react'; -import { Text } from 'react-native'; -import ExploreRootScreen from '../../../screens/explore-root'; +import React from 'react' +import { Text } from 'react-native' +import ExploreRootScreen from '../../../screens/explore-root' export default function Explore() { - return ( - - ); + return } diff --git a/mobile/tradeverse/app/(tabs)/explore/post-detail.jsx b/mobile/tradeverse/app/(tabs)/explore/post-detail.jsx index c5aa66dc..d607bcaf 100644 --- a/mobile/tradeverse/app/(tabs)/explore/post-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/post-detail.jsx @@ -1,8 +1,7 @@ import { View, Text } from 'react-native' import React from 'react' import PostDetailScreen from '../../../screens/post-detail' + export default function PostDetail() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/explore/search/asset-detail.jsx b/mobile/tradeverse/app/(tabs)/explore/search/asset-detail.jsx index aa6a8c0e..21095bfa 100644 --- a/mobile/tradeverse/app/(tabs)/explore/search/asset-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/search/asset-detail.jsx @@ -1,6 +1,7 @@ -import { View, Text } from "react-native"; -import React from "react"; -import AssetDetailScreen from "../../../../screens/asset-detail"; +import { View, Text } from 'react-native' +import React from 'react' +import AssetDetailScreen from '../../../../screens/asset-detail' + export default function AssetDetail() { - return ; + return } diff --git a/mobile/tradeverse/app/(tabs)/explore/search/index.jsx b/mobile/tradeverse/app/(tabs)/explore/search/index.jsx index d80b5d99..5029d7e9 100644 --- a/mobile/tradeverse/app/(tabs)/explore/search/index.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/search/index.jsx @@ -1,8 +1,6 @@ -import React from 'react'; -import SearchResultsScreen from '../../../../screens/explore-search-results'; - -export default function SearchItem() { - return ( - - ); -} +import React from 'react' +import SearchResultsScreen from '../../../../screens/explore-search-results' + +export default function SearchItem() { + return +} diff --git a/mobile/tradeverse/app/(tabs)/explore/search/post-detail.jsx b/mobile/tradeverse/app/(tabs)/explore/search/post-detail.jsx index 455430f2..2c27c69d 100644 --- a/mobile/tradeverse/app/(tabs)/explore/search/post-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/search/post-detail.jsx @@ -1,8 +1,7 @@ import { View, Text } from 'react-native' import React from 'react' import PostDetailScreen from '../../../../screens/post-detail' + export default function PostDetail() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/explore/search/subforum-detail.jsx b/mobile/tradeverse/app/(tabs)/explore/search/subforum-detail.jsx index 0731423f..9f565d71 100644 --- a/mobile/tradeverse/app/(tabs)/explore/search/subforum-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/search/subforum-detail.jsx @@ -1,9 +1,7 @@ import { View, Text } from 'react-native' import React from 'react' import SubForumDetailScreen from '../../../../screens/subforum-detail' -export default function SubForumDetail() { - return ( - - ) -} \ No newline at end of file +export default function SubForumDetail() { + return +} diff --git a/mobile/tradeverse/app/(tabs)/explore/search/user-profile.jsx b/mobile/tradeverse/app/(tabs)/explore/search/user-profile.jsx index c6f0a6ad..81aceca6 100644 --- a/mobile/tradeverse/app/(tabs)/explore/search/user-profile.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/search/user-profile.jsx @@ -3,7 +3,5 @@ import React from 'react' import UserProfileScreen from '../../../../screens/profile' export default function UserProfile() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/explore/subforum-detail.jsx b/mobile/tradeverse/app/(tabs)/explore/subforum-detail.jsx index b10aa235..0ab9ee69 100644 --- a/mobile/tradeverse/app/(tabs)/explore/subforum-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/subforum-detail.jsx @@ -1,9 +1,7 @@ import { View, Text } from 'react-native' import React from 'react' import SubForumDetailScreen from '../../../screens/subforum-detail' -export default function SubForumDetail() { - return ( - - ) -} \ No newline at end of file +export default function SubForumDetail() { + return +} diff --git a/mobile/tradeverse/app/(tabs)/explore/user-profile.jsx b/mobile/tradeverse/app/(tabs)/explore/user-profile.jsx index 8140e5a3..e17b456e 100644 --- a/mobile/tradeverse/app/(tabs)/explore/user-profile.jsx +++ b/mobile/tradeverse/app/(tabs)/explore/user-profile.jsx @@ -3,7 +3,5 @@ import React from 'react' import UserProfileScreen from '../../../screens/profile' export default function UserProfile() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/home/_layout.jsx b/mobile/tradeverse/app/(tabs)/home/_layout.jsx index f645a49e..27011f71 100644 --- a/mobile/tradeverse/app/(tabs)/home/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/home/_layout.jsx @@ -1,10 +1,10 @@ -import { Stack } from 'expo-router'; -import React from 'react'; +import { Stack } from 'expo-router' +import React from 'react' export default function StackLayout() { return ( - + - ); + ) } diff --git a/mobile/tradeverse/app/(tabs)/home/index.jsx b/mobile/tradeverse/app/(tabs)/home/index.jsx index e384a213..4b72fd99 100644 --- a/mobile/tradeverse/app/(tabs)/home/index.jsx +++ b/mobile/tradeverse/app/(tabs)/home/index.jsx @@ -1,9 +1,7 @@ -import React from "react"; -import { Text } from "react-native"; -import HomeRootScreen from "../../../screens/home-root"; +import React from 'react' +import { Text } from 'react-native' +import HomeRootScreen from '../../../screens/home-root' export default function Home() { - return ( - - ); + return } diff --git a/mobile/tradeverse/app/(tabs)/home/post-detail.jsx b/mobile/tradeverse/app/(tabs)/home/post-detail.jsx index c5aa66dc..d607bcaf 100644 --- a/mobile/tradeverse/app/(tabs)/home/post-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/home/post-detail.jsx @@ -1,8 +1,7 @@ import { View, Text } from 'react-native' import React from 'react' import PostDetailScreen from '../../../screens/post-detail' + export default function PostDetail() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/home/subforum-detail.jsx b/mobile/tradeverse/app/(tabs)/home/subforum-detail.jsx index b10aa235..0ab9ee69 100644 --- a/mobile/tradeverse/app/(tabs)/home/subforum-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/home/subforum-detail.jsx @@ -1,9 +1,7 @@ import { View, Text } from 'react-native' import React from 'react' import SubForumDetailScreen from '../../../screens/subforum-detail' -export default function SubForumDetail() { - return ( - - ) -} \ No newline at end of file +export default function SubForumDetail() { + return +} diff --git a/mobile/tradeverse/app/(tabs)/home/user-profile.jsx b/mobile/tradeverse/app/(tabs)/home/user-profile.jsx index 8140e5a3..e17b456e 100644 --- a/mobile/tradeverse/app/(tabs)/home/user-profile.jsx +++ b/mobile/tradeverse/app/(tabs)/home/user-profile.jsx @@ -3,7 +3,5 @@ import React from 'react' import UserProfileScreen from '../../../screens/profile' export default function UserProfile() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/portfolio/_layout.jsx b/mobile/tradeverse/app/(tabs)/portfolio/_layout.jsx index f645a49e..27011f71 100644 --- a/mobile/tradeverse/app/(tabs)/portfolio/_layout.jsx +++ b/mobile/tradeverse/app/(tabs)/portfolio/_layout.jsx @@ -1,10 +1,10 @@ -import { Stack } from 'expo-router'; -import React from 'react'; +import { Stack } from 'expo-router' +import React from 'react' export default function StackLayout() { return ( - + - ); + ) } diff --git a/mobile/tradeverse/app/(tabs)/portfolio/add-asset.jsx b/mobile/tradeverse/app/(tabs)/portfolio/add-asset.jsx index 85a495b4..fb0aecb3 100644 --- a/mobile/tradeverse/app/(tabs)/portfolio/add-asset.jsx +++ b/mobile/tradeverse/app/(tabs)/portfolio/add-asset.jsx @@ -1,10 +1,8 @@ -import React from 'react'; -import { Text } from 'react-native'; -import PortfolioScreen from '../../../screens/portfolio'; -import AddAssetScreen from '../../../screens/add-asset'; +import React from 'react' +import { Text } from 'react-native' +import PortfolioScreen from '../../../screens/portfolio' +import AddAssetScreen from '../../../screens/add-asset' export default function AddAsset() { - return ( - - ); + return } diff --git a/mobile/tradeverse/app/(tabs)/portfolio/asset-detail.jsx b/mobile/tradeverse/app/(tabs)/portfolio/asset-detail.jsx index f8cff29c..b5970b99 100644 --- a/mobile/tradeverse/app/(tabs)/portfolio/asset-detail.jsx +++ b/mobile/tradeverse/app/(tabs)/portfolio/asset-detail.jsx @@ -3,7 +3,5 @@ import React from 'react' import AssetDetailScreen from '../../../screens/asset-detail' export default function AssetDetail() { - return ( - - ) -} \ No newline at end of file + return +} diff --git a/mobile/tradeverse/app/(tabs)/portfolio/index.jsx b/mobile/tradeverse/app/(tabs)/portfolio/index.jsx index 5c89836c..3fd7562f 100644 --- a/mobile/tradeverse/app/(tabs)/portfolio/index.jsx +++ b/mobile/tradeverse/app/(tabs)/portfolio/index.jsx @@ -1,9 +1,7 @@ -import React from 'react'; -import { Text } from 'react-native'; -import PortfolioScreen from '../../../screens/portfolio'; +import React from 'react' +import { Text } from 'react-native' +import PortfolioScreen from '../../../screens/portfolio' export default function Portfolio() { - return ( - - ); + return } diff --git a/mobile/tradeverse/app/[...unmatched].jsx b/mobile/tradeverse/app/[...unmatched].jsx index 00ba22f8..304a4119 100644 --- a/mobile/tradeverse/app/[...unmatched].jsx +++ b/mobile/tradeverse/app/[...unmatched].jsx @@ -1,5 +1,5 @@ -import { Redirect } from 'expo-router'; +import { Redirect } from 'expo-router' export default function Unmatched() { - return ; + return } diff --git a/mobile/tradeverse/app/_layout.jsx b/mobile/tradeverse/app/_layout.jsx index 9b5682a7..c46e244a 100644 --- a/mobile/tradeverse/app/_layout.jsx +++ b/mobile/tradeverse/app/_layout.jsx @@ -1,9 +1,9 @@ -import { Stack } from "expo-router"; -import * as SplashScreen from "expo-splash-screen"; -import "react-native-reanimated"; -import AuthProvider from "../auth/context/auth-provider"; +import { Stack } from 'expo-router' +import * as SplashScreen from 'expo-splash-screen' +import 'react-native-reanimated' +import AuthProvider from '../auth/context/auth-provider' // Prevent the splash screen from auto-hiding before asset loading is complete. -SplashScreen.preventAutoHideAsync(); +SplashScreen.preventAutoHideAsync() export default function RootLayout() { return ( @@ -14,5 +14,5 @@ export default function RootLayout() { - ); + ) } diff --git a/mobile/tradeverse/app/auth.jsx b/mobile/tradeverse/app/auth.jsx index dee02851..ac40ed95 100644 --- a/mobile/tradeverse/app/auth.jsx +++ b/mobile/tradeverse/app/auth.jsx @@ -1,6 +1,6 @@ -import React from 'react'; -import LoginScreen from '../auth/screens/login'; +import React from 'react' +import LoginScreen from '../auth/screens/login' export default function AuthScreen() { - return ; + return } diff --git a/mobile/tradeverse/app/splash.jsx b/mobile/tradeverse/app/splash.jsx index 738fd9d4..bc907802 100644 --- a/mobile/tradeverse/app/splash.jsx +++ b/mobile/tradeverse/app/splash.jsx @@ -1,7 +1,7 @@ -import { View, Text } from "react-native"; -import React from "react"; -import WelcomingScreen from "../screens/welcoming"; +import { View, Text } from 'react-native' +import React from 'react' +import WelcomingScreen from '../screens/welcoming' export default function SplashScreen() { - return ; + return } diff --git a/mobile/tradeverse/auth/context/auth-context.jsx b/mobile/tradeverse/auth/context/auth-context.jsx index 24614c32..13e4a40d 100644 --- a/mobile/tradeverse/auth/context/auth-context.jsx +++ b/mobile/tradeverse/auth/context/auth-context.jsx @@ -1,5 +1,5 @@ -import { createContext } from "react"; +import { createContext } from 'react' -const AuthContext = createContext(); +const AuthContext = createContext() -export default AuthContext; +export default AuthContext diff --git a/mobile/tradeverse/auth/context/auth-guard.jsx b/mobile/tradeverse/auth/context/auth-guard.jsx index 22230cb8..339780e5 100644 --- a/mobile/tradeverse/auth/context/auth-guard.jsx +++ b/mobile/tradeverse/auth/context/auth-guard.jsx @@ -1,30 +1,30 @@ -import React, { useContext } from 'react'; -import { Redirect, useRouter } from 'expo-router'; -import { useRoute } from '@react-navigation/native'; -import { AuthContext } from '.'; -import Loader from '../ui/AuthLoader'; +import React, { useContext } from 'react' +import { Redirect, useRouter } from 'expo-router' +import { useRoute } from '@react-navigation/native' +import { AuthContext } from '.' +import Loader from '../ui/AuthLoader' export default function AuthGuard({ children }) { - const router = useRouter(); - const route = useRoute(); - const { isLoggedin, loading } = useContext(AuthContext); + const router = useRouter() + const route = useRoute() + const { isLoggedin, loading } = useContext(AuthContext) const handleNavigate = (opt) => { - if (opt.name === route.name) return; + if (opt.name === route.name) return if (route.name === '/') { - router.navigate(opt.path); + router.navigate(opt.path) } else { - router.replace(opt.path); + router.replace(opt.path) } - }; + } if (!isLoggedin && !loading) { - return ; + return } if (loading) { - return ; + return } - return children; + return children } diff --git a/mobile/tradeverse/auth/context/auth-provider.jsx b/mobile/tradeverse/auth/context/auth-provider.jsx index 29bb6cfa..bc7776a7 100644 --- a/mobile/tradeverse/auth/context/auth-provider.jsx +++ b/mobile/tradeverse/auth/context/auth-provider.jsx @@ -1,23 +1,22 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { router } from 'expo-router'; -import api from '../../services/_axios'; -import AuthContext from './auth-context'; -import { getMe, register, login } from '../../services/auth'; -import { getUserByUsername } from '../../services/user'; +import React, { useCallback, useEffect, useMemo, useState } from 'react' +import AsyncStorage from '@react-native-async-storage/async-storage' +import { router } from 'expo-router' +import api from '../../services/_axios' +import AuthContext from './auth-context' +import { getMe, register, login } from '../../services/auth' +import { getUserByUsername } from '../../services/user' export default function AuthProvider({ children }) { - const [loading, setLoading] = useState(false); - const [user, setUser] = useState(null); - const [isLoggedin, setIsLoggedIn] = useState(false); + const [loading, setLoading] = useState(false) + const [user, setUser] = useState(null) + const [isLoggedin, setIsLoggedIn] = useState(false) - const [isTagSelected, setIsTagSelected] = useState(false); + const [isTagSelected, setIsTagSelected] = useState(false) // useEffect(()=>{ // console.log('isTagSelected',isTagSelected); // console.log('isAuthenticated',isLoggedin); - - + // if(isLoggedin){ // if(isTagSelected){ // router.replace('(tabs)'); @@ -33,118 +32,121 @@ export default function AuthProvider({ children }) { const signIn = useCallback(async ({ username, password }) => { try { - const res = await login({ username, password }); + const res = await login({ username, password }) if (res.status === 200) { - await AsyncStorage.setItem('authToken', res.data?.token); - await AsyncStorage.setItem('username', username); - const userProfile = await getUserByUsername({ username }); - setUser(userProfile); - setIsLoggedIn(true); - router.replace('(tabs)'); + await AsyncStorage.setItem('authToken', res.data?.token) + await AsyncStorage.setItem('username', username) + const userProfile = await getUserByUsername({ username }) + setUser(userProfile) + setIsLoggedIn(true) + router.replace('(tabs)') } } catch (error) { - throw new Error(error.message); + throw new Error(error.message) } finally { // setLoading(false); } - }, []); - - const signUp = useCallback(async ({ email, password, name, tag=0,profilePhoto, username }) => { - try { - // setLoading(true); - const res = await register({ - email, - password, - name, - tag, - profilePhoto, - username - }); - if (res.status === 200) { - await AsyncStorage.setItem('authToken', res.data?.token); - await AsyncStorage.setItem('username', username); - const userProfile = await getUserByUsername({ username }); - - setUser(userProfile); - setIsLoggedIn(true); - // router.replace('(tabs)'); - router.replace('splash'); - // setUser(res.data?.user); + }, []) + + const signUp = useCallback( + async ({ email, password, name, tag = 0, profilePhoto, username }) => { + try { + // setLoading(true); + const res = await register({ + email, + password, + name, + tag, + profilePhoto, + username, + }) + if (res.status === 200) { + await AsyncStorage.setItem('authToken', res.data?.token) + await AsyncStorage.setItem('username', username) + const userProfile = await getUserByUsername({ username }) + + setUser(userProfile) + setIsLoggedIn(true) + // router.replace('(tabs)'); + router.replace('splash') + // setUser(res.data?.user); + } + } catch (error) { + throw new Error(error.message ?? 'Giriş başarısız') + } finally { + // setLoading(false); } - } catch (error) { - throw new Error(error.message ?? 'Giriş başarısız'); - } finally { - // setLoading(false); - } - }, []); + }, + [], + ) const logout = useCallback(async () => { - setLoading(true); - setIsLoggedIn(false); - setUser(null); - router.replace('auth'); - await AsyncStorage.removeItem('authToken'); - await AsyncStorage.removeItem('username'); - setLoading(false); - }, []); + setLoading(true) + setIsLoggedIn(false) + setUser(null) + router.replace('auth') + await AsyncStorage.removeItem('authToken') + await AsyncStorage.removeItem('username') + setLoading(false) + }, []) const refetchUser = useCallback(async () => { - setLoading(true); + setLoading(true) - const token = await AsyncStorage.getItem('authToken'); - const username = await AsyncStorage.getItem('username'); + const token = await AsyncStorage.getItem('authToken') + const username = await AsyncStorage.getItem('username') - api.defaults.headers.common.Authorization = `Bearer ${token}`; + api.defaults.headers.common.Authorization = `Bearer ${token}` - const loggedinUser = await getMe({ authToken: token,username }); + const loggedinUser = await getMe({ authToken: token, username }) if (loggedinUser) { - setIsLoggedIn(true); - setUser(loggedinUser); + setIsLoggedIn(true) + setUser(loggedinUser) } else { - setUser(null); + setUser(null) } - setLoading(false); - }, []); + setLoading(false) + }, []) const setUserProfile = useCallback((profile) => { - setUser((prevUser) => ({ ...prevUser, profile })); - }, []); + setUser((prevUser) => ({ ...prevUser, profile })) + }, []) const isAuthenticated = useCallback(async () => { - let result = false; + let result = false - setLoading(true); + setLoading(true) - const token = await AsyncStorage.getItem('authToken'); - const username = await AsyncStorage.getItem('username'); + const token = await AsyncStorage.getItem('authToken') + const username = await AsyncStorage.getItem('username') - api.defaults.headers.common.Authorization = `Bearer ${token}`; + api.defaults.headers.common.Authorization = `Bearer ${token}` if (token || username) { - const loggedinUser = await getMe({ authToken: token, username }); + const loggedinUser = await getMe({ authToken: token, username }) if (loggedinUser) { - setIsLoggedIn(true); - setUser(loggedinUser); - result = true; + setIsLoggedIn(true) + setUser(loggedinUser) + result = true } else { - await AsyncStorage.removeItem('authToken'); - setIsLoggedIn(false); - setUser(null); - result = false; + await AsyncStorage.removeItem('authToken') + setIsLoggedIn(false) + setUser(null) + result = false } } else { - setUser(null); - setIsLoggedIn(false); - result = false; + setUser(null) + setIsLoggedIn(false) + result = false } - setLoading(false); - return result; - }, []); + setLoading(false) + return result + }, []) useEffect(() => { - isAuthenticated(); - }, [isAuthenticated]); + isAuthenticated() + }, [isAuthenticated]) const contextValue = useMemo( () => ({ @@ -160,7 +162,7 @@ export default function AuthProvider({ children }) { userProfile: user?.profile, // isAuthenticated, logout, - setUser + setUser, }), [ user, @@ -174,12 +176,10 @@ export default function AuthProvider({ children }) { signUp, logout, // isAuthenticated - ] - ); - - + ], + ) return ( {children} - ); + ) } diff --git a/mobile/tradeverse/auth/context/index.jsx b/mobile/tradeverse/auth/context/index.jsx index 52f586b6..2fcb53cd 100644 --- a/mobile/tradeverse/auth/context/index.jsx +++ b/mobile/tradeverse/auth/context/index.jsx @@ -1,2 +1,2 @@ -export { default as AuthProvider } from "./auth-provider"; -export { default as AuthContext } from "./auth-context"; +export { default as AuthProvider } from './auth-provider' +export { default as AuthContext } from './auth-context' diff --git a/mobile/tradeverse/auth/screens/login/index.jsx b/mobile/tradeverse/auth/screens/login/index.jsx index 5170e6c5..001e78ab 100644 --- a/mobile/tradeverse/auth/screens/login/index.jsx +++ b/mobile/tradeverse/auth/screens/login/index.jsx @@ -1,4 +1,4 @@ -import React, { useState, useContext, useEffect } from "react"; +import React, { useState, useContext, useEffect } from 'react' import { View, StyleSheet, @@ -6,21 +6,21 @@ import { Text, Image, TouchableOpacity, -} from "react-native"; -import { Stack } from "expo-router"; +} from 'react-native' +import { Stack } from 'expo-router' -import { Controller, useForm } from "react-hook-form"; -import { z } from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; +import { Controller, useForm } from 'react-hook-form' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' -import { AuthContext } from "../../context"; -import PaddedContainer from "../../../components/ui/padded-container"; -import MainButton from "../../../components/buttons/main-button"; -import { COLORS, SIZE_CONSTANT, SIZES } from "../../../constants/theme"; -import TextField from "../../../components/inputs/TextField"; +import { AuthContext } from '../../context' +import PaddedContainer from '../../../components/ui/padded-container' +import MainButton from '../../../components/buttons/main-button' +import { COLORS, SIZE_CONSTANT, SIZES } from '../../../constants/theme' +import TextField from '../../../components/inputs/TextField' function ErrorMessage({ message }) { - return {message}; + return {message} } function ErrorBox({ message }) { @@ -28,38 +28,38 @@ function ErrorBox({ message }) { {message} - ); + ) } export default function LoginScreen() { - const [mode, setMode] = useState(1); // 1:signIn, 2:signUp - const { signIn, signUp } = useContext(AuthContext); + const [mode, setMode] = useState(1) // 1:signIn, 2:signUp + const { signIn, signUp } = useContext(AuthContext) const loginSchema = z.object({ - username: z.string().min({ message: "Username is required." }), - password: z.string().min(1, { message: "Password is required." }), - }); + username: z.string().min({ message: 'Username is required.' }), + password: z.string().min(1, { message: 'Password is required.' }), + }) useEffect(() => { - clearErrors(); - }, [mode, clearErrors]); + clearErrors() + }, [mode, clearErrors]) const registerSchema = z.object({ - email: z.string().email({ message: "Please enter a valid email." }), + email: z.string().email({ message: 'Please enter a valid email.' }), password: z .string() - .min(1, { message: "Password cannot be empty." }) + .min(1, { message: 'Password cannot be empty.' }) .max(50, { - message: "Max 50 characters allowed for password.", + message: 'Max 50 characters allowed for password.', }), name: z .string() - .min(2, { message: "At least 2 characters required." }) + .min(2, { message: 'At least 2 characters required.' }) .max(50, { - message: "Max 50 characters allowed for name.", + message: 'Max 50 characters allowed for name.', }), - username: z.string().min(1, { message: "Username is required" }), - }); + username: z.string().min(1, { message: 'Username is required' }), + }) const { control, @@ -69,26 +69,26 @@ export default function LoginScreen() { clearErrors, } = useForm({ defaultValues: { - email: "", - password: "", - name: "", - username: "", - profilePhoto: "", + email: '', + password: '', + name: '', + username: '', + profilePhoto: '', tag: 0, }, resolver: zodResolver(mode === 1 ? loginSchema : registerSchema), - }); + }) const handleLogin = async (data) => { try { - await signIn({ username: data.username, password: data.password }); + await signIn({ username: data.username, password: data.password }) } catch (error) { - setError("root", { - type: "value", - message: error.message ?? "Login failed.", - }); + setError('root', { + type: 'value', + message: error.message ?? 'Login failed.', + }) } - }; + } const handleRegister = async (data) => { try { await signUp({ @@ -96,14 +96,14 @@ export default function LoginScreen() { password: data.password, name: data.name, username: data.username, - }); + }) } catch (error) { - setError("root", { - type: "value", - message: error.message ?? "Register failed.", - }); + setError('root', { + type: 'value', + message: error.message ?? 'Register failed.', + }) } - }; + } return ( @@ -119,7 +119,7 @@ export default function LoginScreen() { style={{ fontSize: 24, color: COLORS.primary900, - fontWeight: "bold", + fontWeight: 'bold', letterSpacing: -0.4, }} > @@ -227,45 +227,45 @@ export default function LoginScreen() { : handleSubmit(handleRegister) } loading={isSubmitting} - textStyle={{ fontWeight: "bold" }} - text={mode === 2 ? "Kayıt Ol" : "Giriş Yap"} + textStyle={{ fontWeight: 'bold' }} + text={mode === 2 ? 'Kayıt Ol' : 'Giriş Yap'} /> { - setMode(mode === 1 ? 2 : 1); + setMode(mode === 1 ? 2 : 1) }} variant="secondary" - text={mode === 1 ? "Kayıt Ol" : "Giriş Yap"} + text={mode === 1 ? 'Kayıt Ol' : 'Giriş Yap'} /> - ); + ) } const styles = StyleSheet.create({ screenContainer: { backgroundColor: COLORS.white, - height: "100%", + height: '100%', }, container: { paddingHorizontal: SIZE_CONSTANT * 2, - display: "flex", - marginVertical: "auto", + display: 'flex', + marginVertical: 'auto', backgroundColor: COLORS.white, }, logoContainer: { - display: "flex", - flexDirection: "row", - justifyContent: "center", + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', marginBottom: SIZE_CONSTANT * 5.6, }, inputsContainer: { - display: "flex", - flexDirection: "column", + display: 'flex', + flexDirection: 'column', gap: SIZE_CONSTANT * 1, }, buttonsContainer: { @@ -273,57 +273,57 @@ const styles = StyleSheet.create({ gap: SIZE_CONSTANT * 1, }, seperatorContainer: { - display: "flex", - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', marginTop: SIZE_CONSTANT * 5, }, seperatorLine: { - width: "42%", + width: '42%', height: 1, - backgroundColor: "#eee", + backgroundColor: '#eee', }, seperatorText: { - minWidth: "auto", + minWidth: 'auto', fontSize: SIZES.xSmall, - color: "#eee", + color: '#eee', }, oAuthButton: { - flexBasis: "100%", + flexBasis: '100%', flexShrink: 1, height: SIZE_CONSTANT * 4.4, borderWidth: 1.3, - borderColor: "#f2f2f2", - display: "flex", + borderColor: '#f2f2f2', + display: 'flex', paddingVertical: SIZE_CONSTANT * 0.6, - alignItems: "center", + alignItems: 'center', borderRadius: SIZE_CONSTANT * 0.6, }, oAuthIcon: { - maxWidth: "20%", - maxHeight: "100%", - resizeMode: "contain", + maxWidth: '20%', + maxHeight: '100%', + resizeMode: 'contain', }, oAuthButtonsContainer: { marginTop: SIZE_CONSTANT * 5, - display: "flex", - justifyContent: "center", - flexDirection: "row", + display: 'flex', + justifyContent: 'center', + flexDirection: 'row', gap: SIZE_CONSTANT * 1, }, errorMessage: { - textAlign: "left", + textAlign: 'left', fontSize: SIZES.xSmall, color: COLORS.error, marginLeft: SIZE_CONSTANT * 0.5, }, errorBoxContainer: { - backgroundColor: "#FFF6F6", + backgroundColor: '#FFF6F6', padding: SIZE_CONSTANT * 1, borderRadius: SIZE_CONSTANT * 0.5, }, -}); +}) diff --git a/mobile/tradeverse/auth/ui/AuthLoader.js b/mobile/tradeverse/auth/ui/AuthLoader.js index 0c25351b..957fe5c0 100644 --- a/mobile/tradeverse/auth/ui/AuthLoader.js +++ b/mobile/tradeverse/auth/ui/AuthLoader.js @@ -1,22 +1,22 @@ -import { COLORS } from "@/constants/theme"; -import React from "react"; -import { ActivityIndicator, Text, View } from "react-native"; +import React from 'react' +import { ActivityIndicator, Text, View } from 'react-native' +import { COLORS } from '@/constants/theme' export default function AuthLoader() { return ( @@ -24,7 +24,7 @@ export default function AuthLoader() { style={{ fontSize: 24, color: COLORS.blackContent, - fontWeight: "bold", + fontWeight: 'bold', transform: [{ translateY: -24 }], }} @@ -33,5 +33,5 @@ export default function AuthLoader() { - ); + ) } diff --git a/mobile/tradeverse/babel.config.js b/mobile/tradeverse/babel.config.js index 33acf985..ba63e4f9 100644 --- a/mobile/tradeverse/babel.config.js +++ b/mobile/tradeverse/babel.config.js @@ -1,6 +1,17 @@ module.exports = function (api) { - api.cache(true); + api.cache(true) return { - presets: ['babel-preset-expo'] - }; -}; + presets: ['babel-preset-expo'], + plugins: [ + [ + 'module-resolver', + { + root: ['./'], + alias: { + '@': './', + }, + }, + ], + ], + } +} diff --git a/mobile/tradeverse/components/buttons/main-button.jsx b/mobile/tradeverse/components/buttons/main-button.jsx index 8364b579..85e46e4c 100644 --- a/mobile/tradeverse/components/buttons/main-button.jsx +++ b/mobile/tradeverse/components/buttons/main-button.jsx @@ -1,33 +1,41 @@ -import React from 'react'; -import { ActivityIndicator, Alert, Pressable, StyleSheet, Text } from 'react-native'; -import { COLORS, SIZE_CONSTANT } from '../../constants/theme'; +import React from 'react' +import { + ActivityIndicator, + Alert, + Pressable, + StyleSheet, + Text, +} from 'react-native' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' export default function MainButton({ - onPress=()=>{Alert.alert("Not Implemented")}, + onPress = () => { + Alert.alert('Not Implemented') + }, loading, disabled, style, textStyle, variant = 'primary', - text = 'Press' + text = 'Press', }) { - const selectedStyle = styles[variant]; + const selectedStyle = styles[variant] return ( { - e.preventDefault(); - onPress(); + e.preventDefault() + onPress() }} - role='button' + role="button" disabled={disabled} style={[ selectedStyle.container, style, { opacity: disabled ? 0.5 : 1, - pointerEvents: disabled ? 'none' : 'auto' - } + pointerEvents: disabled ? 'none' : 'auto', + }, ]} > {loading ? ( @@ -36,7 +44,7 @@ export default function MainButton({ {text} )} - ); + ) } const primaryStyle = StyleSheet.create({ @@ -48,14 +56,14 @@ const primaryStyle = StyleSheet.create({ display: 'flex', justifyContent: 'center', alignItems: 'center', - borderRadius: 6 + borderRadius: 6, }, text: { color: COLORS.white, fontSize: SIZE_CONSTANT * 1.4, fontWeight: '600', - } -}); + }, +}) const secondaryStyle = StyleSheet.create({ container: { @@ -68,16 +76,16 @@ const secondaryStyle = StyleSheet.create({ alignItems: 'center', borderRadius: 6, borderColor: '#F2F2F2', - borderWidth: 1 + borderWidth: 1, }, text: { color: COLORS.primary950, fontSize: 14, - fontWeight: 'regular' - } -}); + fontWeight: 'regular', + }, +}) const styles = { primary: primaryStyle, - secondary: secondaryStyle -}; \ No newline at end of file + secondary: secondaryStyle, +} diff --git a/mobile/tradeverse/components/images/content-image.jsx b/mobile/tradeverse/components/images/content-image.jsx index 08dfc0b6..f90318ba 100644 --- a/mobile/tradeverse/components/images/content-image.jsx +++ b/mobile/tradeverse/components/images/content-image.jsx @@ -1,21 +1,20 @@ -import React from 'react'; -import { Image, StyleSheet } from 'react-native'; -import IMAGES from '../../constants/images'; +import React from 'react' +import { Image, StyleSheet } from 'react-native' +import IMAGES from '../../constants/images' export default function ContentImage({ src, style }) { return ( - ); + ) } const styles = StyleSheet.create({ image: { width: '100%', height: '100%', - resizeMode: 'cover' - } -}); + resizeMode: 'cover', + }, +}) diff --git a/mobile/tradeverse/components/images/profile-image.jsx b/mobile/tradeverse/components/images/profile-image.jsx index d5965b36..3689cb88 100644 --- a/mobile/tradeverse/components/images/profile-image.jsx +++ b/mobile/tradeverse/components/images/profile-image.jsx @@ -1,14 +1,28 @@ -import React from 'react'; -import { Image, StyleSheet } from 'react-native'; -import IMAGES from '../../constants/images'; +import React from 'react' +import { Image, StyleSheet } from 'react-native' +import IMAGES from '../../constants/images' -export default function ProfileImage({ src='', style, deviceReference=false }) { - if(deviceReference) { - return ; +export default function ProfileImage({ + src = '', + style, + deviceReference = false, +}) { + if (deviceReference) { + return ( + + ) } - return ; + return ( + + ) } const styles = StyleSheet.create({ - image: {} -}); + image: {}, +}) diff --git a/mobile/tradeverse/components/inputs/RHFTextArea.jsx b/mobile/tradeverse/components/inputs/RHFTextArea.jsx index 9beb4a1e..4a658ee8 100644 --- a/mobile/tradeverse/components/inputs/RHFTextArea.jsx +++ b/mobile/tradeverse/components/inputs/RHFTextArea.jsx @@ -1,7 +1,7 @@ -import React from 'react'; -import { Controller, useFormContext } from 'react-hook-form'; -import styles from './TextField.style'; -import TextField from './TextField'; +import React from 'react' +import { Controller, useFormContext } from 'react-hook-form' +import styles from './TextField.style' +import TextField from './TextField' export default function RHFTextArea({ placeholder, @@ -14,8 +14,8 @@ export default function RHFTextArea({ defaultValue, showErrorMessage, }) { - const selectedStyle = styles[variant]; - const formContext = useFormContext(); + const selectedStyle = styles[variant] + const formContext = useFormContext() return ( )} /> - ); + ) } diff --git a/mobile/tradeverse/components/inputs/RHFTextField.jsx b/mobile/tradeverse/components/inputs/RHFTextField.jsx index 37f89d46..98d246f9 100644 --- a/mobile/tradeverse/components/inputs/RHFTextField.jsx +++ b/mobile/tradeverse/components/inputs/RHFTextField.jsx @@ -1,7 +1,7 @@ -import React from 'react'; -import { Controller, useFormContext } from 'react-hook-form'; -import styles from './TextField.style'; -import TextField from './TextField'; +import React from 'react' +import { Controller, useFormContext } from 'react-hook-form' +import styles from './TextField.style' +import TextField from './TextField' export default function RHFTextField({ placeholder, @@ -14,28 +14,31 @@ export default function RHFTextField({ defaultValue, showErrorMessage, }) { - const selectedStyle = styles[variant]; - const formContext = useFormContext(); + const selectedStyle = styles[variant] + const formContext = useFormContext() return ( - ( )} + render={({ field: { onChange, value } }) => ( + + )} /> - - ); + ) } diff --git a/mobile/tradeverse/components/inputs/TextField.jsx b/mobile/tradeverse/components/inputs/TextField.jsx index af2ffa82..d62f10bb 100644 --- a/mobile/tradeverse/components/inputs/TextField.jsx +++ b/mobile/tradeverse/components/inputs/TextField.jsx @@ -1,7 +1,7 @@ -import { View, Text, TextInput } from 'react-native'; -import React from 'react'; -import styles from './TextField.style'; -import { COLORS } from '../../constants/theme'; +import { View, Text, TextInput } from 'react-native' +import React from 'react' +import styles from './TextField.style' +import { COLORS } from '../../constants/theme' export default function TextField({ onChangeText = () => {}, @@ -17,16 +17,16 @@ export default function TextField({ multiline = false, defaultValue = '', error = '', - showErrorMessage = false // helperText | container. + showErrorMessage = false, // helperText | container. }) { - const selectedStyle = styles[variant]; + const selectedStyle = styles[variant] return ( {label && ( {label} @@ -41,7 +41,7 @@ export default function TextField({ onBlur={onBlur} name={name} defaultValue={defaultValue} - placeholderTextColor='#3C3B3B' + placeholderTextColor="#3C3B3B" value={value} placeholder={placeholder} autoCapitalize={autoCapitalize} @@ -50,5 +50,5 @@ export default function TextField({ style={[selectedStyle, style, error && styles[variant].error.container]} /> - ); + ) } diff --git a/mobile/tradeverse/components/inputs/TextField.style.js b/mobile/tradeverse/components/inputs/TextField.style.jsx similarity index 76% rename from mobile/tradeverse/components/inputs/TextField.style.js rename to mobile/tradeverse/components/inputs/TextField.style.jsx index e41a1f05..81c0358b 100644 --- a/mobile/tradeverse/components/inputs/TextField.style.js +++ b/mobile/tradeverse/components/inputs/TextField.style.jsx @@ -1,9 +1,9 @@ -import { StyleSheet } from 'react-native'; -import { SIZES, SIZE_CONSTANT } from '../../constants/theme'; +import { SIZE_CONSTANT, SIZES } from '@/constants/theme' +import { StyleSheet } from 'react-native' const outlinedStyle = StyleSheet.create({ - width: '100%' -}); + width: '100%', +}) const filledStyle = StyleSheet.create({ width: '100%', @@ -23,21 +23,21 @@ const filledStyle = StyleSheet.create({ fontSize: SIZES.small, fontWeight: 'regular', marginBottom: SIZE_CONSTANT * 0.4, - paddingLeft: SIZE_CONSTANT * 0.4 + paddingLeft: SIZE_CONSTANT * 0.4, }, error: { - label:{ + label: { color: '#D63A3A', }, container: { backgroundColor: '#FEF6F6', - borderColor: "transparent", + borderColor: 'transparent', }, helperText: { - color: '#D63A3A' - } - } -}); + color: '#D63A3A', + }, + }, +}) const borderedStyle = StyleSheet.create({ width: '100%', @@ -56,25 +56,25 @@ const borderedStyle = StyleSheet.create({ fontSize: SIZES.small, fontWeight: 'regular', marginBottom: SIZE_CONSTANT * 0.4, - paddingLeft: SIZE_CONSTANT * 0.4 + paddingLeft: SIZE_CONSTANT * 0.4, }, error: { - label:{ + label: { color: '#D63A3A', }, container: { borderColor: '#D63A3A', }, helperText: { - color: '#D63A3A' - } - } -}); + color: '#D63A3A', + }, + }, +}) const styles = { outlined: outlinedStyle, filled: filledStyle, - bordered: borderedStyle -}; + bordered: borderedStyle, +} -export default styles; +export default styles diff --git a/mobile/tradeverse/components/links/asset-link.jsx b/mobile/tradeverse/components/links/asset-link.jsx index 0af0e521..3ad053e0 100644 --- a/mobile/tradeverse/components/links/asset-link.jsx +++ b/mobile/tradeverse/components/links/asset-link.jsx @@ -1,7 +1,7 @@ -import React from "react"; -import { Pressable } from "react-native"; -import paths from "../../config/screen-paths"; -import { router } from "expo-router"; +import React from 'react' +import { Pressable } from 'react-native' +import paths from '../../config/screen-paths' +import { router } from 'expo-router' export default function AssetLink({ children, @@ -11,10 +11,10 @@ export default function AssetLink({ return ( { - router.push(`${target}?assetId=${asset?.id}`); + router.push(`${target}?assetId=${asset?.id}`) }} > {children} - ); + ) } diff --git a/mobile/tradeverse/components/links/post-link.jsx b/mobile/tradeverse/components/links/post-link.jsx index 49e817f3..3673a0de 100644 --- a/mobile/tradeverse/components/links/post-link.jsx +++ b/mobile/tradeverse/components/links/post-link.jsx @@ -1,20 +1,20 @@ -import React from "react"; -import { Pressable } from "react-native"; -import paths from "../../config/screen-paths"; -import { router } from "expo-router"; +import React from 'react' +import { Pressable } from 'react-native' +import paths from '../../config/screen-paths' +import { router } from 'expo-router' export default function PostLink({ children, target = paths.EXPLORE.POST_DETAIL, - post + post, }) { return ( { - router.push(`${target}?postId=${post?.id}`); + router.push(`${target}?postId=${post?.id}`) }} > {children} - ); + ) } diff --git a/mobile/tradeverse/components/links/subforum-link.jsx b/mobile/tradeverse/components/links/subforum-link.jsx index a0f4bf31..a82a5da8 100644 --- a/mobile/tradeverse/components/links/subforum-link.jsx +++ b/mobile/tradeverse/components/links/subforum-link.jsx @@ -1,7 +1,7 @@ -import React from "react"; -import { Pressable } from "react-native"; -import paths from "../../config/screen-paths"; -import { router } from "expo-router"; +import React from 'react' +import { Pressable } from 'react-native' +import paths from '../../config/screen-paths' +import { router } from 'expo-router' export default function SubforumLink({ children, @@ -11,10 +11,10 @@ export default function SubforumLink({ return ( { - router.push(`${target}?subforumId=${subForum?.id}`); + router.push(`${target}?subforumId=${subForum?.id}`) }} > {children} - ); + ) } diff --git a/mobile/tradeverse/components/links/user-link.jsx b/mobile/tradeverse/components/links/user-link.jsx index d51af61f..49b61b7b 100644 --- a/mobile/tradeverse/components/links/user-link.jsx +++ b/mobile/tradeverse/components/links/user-link.jsx @@ -1,20 +1,20 @@ -import { View, Text, Pressable } from "react-native"; -import React from "react"; -import { router } from "expo-router"; -import paths from "../../config/screen-paths"; +import { View, Text, Pressable } from 'react-native' +import React from 'react' +import { router } from 'expo-router' +import paths from '../../config/screen-paths' export default function UserLink({ children, target = paths.EXPLORE.USER_PROFILE, - user + user, }) { return ( { - router.push(`${target}?username=${user?.username}`); + router.push(`${target}?username=${user?.username}`) }} > {children} - ); + ) } diff --git a/mobile/tradeverse/components/ui/full-scroll-view.jsx b/mobile/tradeverse/components/ui/full-scroll-view.jsx index 50de84d0..27cbc4a4 100644 --- a/mobile/tradeverse/components/ui/full-scroll-view.jsx +++ b/mobile/tradeverse/components/ui/full-scroll-view.jsx @@ -1,16 +1,19 @@ import React from 'react' import { ScrollView, StyleSheet } from 'react-native' -export default function FullScrollView({children,style}) { +export default function FullScrollView({ children, style }) { return ( - - {children} + + {children} ) } const styles = StyleSheet.create({ - container: { - minHeight: '100%', - } -}) \ No newline at end of file + container: { + minHeight: '100%', + }, +}) diff --git a/mobile/tradeverse/components/ui/global-screen.jsx b/mobile/tradeverse/components/ui/global-screen.jsx index d640ffa2..92197976 100644 --- a/mobile/tradeverse/components/ui/global-screen.jsx +++ b/mobile/tradeverse/components/ui/global-screen.jsx @@ -1,7 +1,7 @@ -import React from "react"; -import { Platform, SafeAreaView, StyleSheet } from "react-native"; -import PaddedContainer from "./padded-container"; -import { COLORS } from "../../constants/theme"; +import React from 'react' +import { Platform, SafeAreaView, StyleSheet } from 'react-native' +import PaddedContainer from './padded-container' +import { COLORS } from '../../constants/theme' export default function GlobalScreen({ children, @@ -9,19 +9,19 @@ export default function GlobalScreen({ paddingTop = 28, containerStyle, }) { - const platform = Platform.OS; + const platform = Platform.OS return ( {children} - ); + ) } const styles = StyleSheet.create({ @@ -29,4 +29,4 @@ const styles = StyleSheet.create({ flex: 1, backgroundColor: COLORS.white, }, -}); +}) diff --git a/mobile/tradeverse/components/ui/padded-container.jsx b/mobile/tradeverse/components/ui/padded-container.jsx index 9edebcb6..b4ef3402 100644 --- a/mobile/tradeverse/components/ui/padded-container.jsx +++ b/mobile/tradeverse/components/ui/padded-container.jsx @@ -1,14 +1,14 @@ -import { View, StyleSheet } from 'react-native'; -import React from 'react'; -import { SIZE_CONSTANT } from '../../constants/theme'; +import { View, StyleSheet } from 'react-native' +import React from 'react' +import { SIZE_CONSTANT } from '../../constants/theme' export default function PaddedContainer({ style, children }) { - return {children}; + return {children} } const styles = StyleSheet.create({ container: { width: '100%', paddingHorizontal: SIZE_CONSTANT * 2, - } -}); + }, +}) diff --git a/mobile/tradeverse/components/ui/tabbar/index.jsx b/mobile/tradeverse/components/ui/tabbar/index.jsx index 93b0daf8..9e224d59 100644 --- a/mobile/tradeverse/components/ui/tabbar/index.jsx +++ b/mobile/tradeverse/components/ui/tabbar/index.jsx @@ -1,71 +1,81 @@ /* eslint-disable no-nested-ternary */ -import { useEffect, useState } from 'react'; -import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated'; +import { useEffect, useState } from 'react' +import Animated, { + useAnimatedStyle, + useSharedValue, + withSpring, +} from 'react-native-reanimated' -import { View, StyleSheet, Platform } from 'react-native'; -import TabBarButton from './tabbar-button'; -import { NAV_OPTIONS } from '../../../config/navigation'; -import { COLORS, SIZE_CONSTANT } from '@/constants/theme'; +import { View, StyleSheet, Platform } from 'react-native' +import TabBarButton from './tabbar-button' +import { NAV_OPTIONS } from '../../../config/navigation' +import { COLORS, SIZE_CONSTANT } from '@/constants/theme' export default function CustomTabBar({ state, descriptors, navigation }) { const [tabBarDimensions, setTabBarDimensions] = useState({ width: 0, - height: 0 - }); + height: 0, + }) - const buttonWidth = tabBarDimensions.width / state.routes.length; + const buttonWidth = tabBarDimensions.width / state.routes.length const onLayoutChange = (e) => { setTabBarDimensions({ width: e.nativeEvent.layout.width, - height: e.nativeEvent.layout.height - }); - }; + height: e.nativeEvent.layout.height, + }) + } - const buttonPositionX = useSharedValue(0); + const buttonPositionX = useSharedValue(0) useEffect(() => { - buttonPositionX.value = withSpring( buttonWidth * state.index ,{duration: 1220,reduceMotion:true}); - }, [buttonWidth, state.index, buttonPositionX]); + buttonPositionX.value = withSpring(buttonWidth * state.index, { + duration: 1220, + reduceMotion: true, + }) + }, [buttonWidth, state.index, buttonPositionX]) - const animatedStyle = useAnimatedStyle(() => { - return { - transform: [ - { - translateX: buttonPositionX.value - } - ] - }; - }); + const animatedStyle = useAnimatedStyle(() => ({ + transform: [ + { + translateX: buttonPositionX.value, + }, + ], + })) return ( - + {state.routes.map((route, index) => { - const { options } = descriptors[route.key]; + const { options } = descriptors[route.key] const label = options.tabBarLabel !== undefined ? options.tabBarLabel : options.title !== undefined ? options.title - : route.name; + : route.name - const isFocused = state.index === index; + const isFocused = state.index === index const onPress = () => { const event = navigation.emit({ type: 'tabPress', target: route.key, - canPreventDefault: true - }); + canPreventDefault: true, + }) if (!isFocused && !event.defaultPrevented) { - navigation.navigate(route.name, route.params); + navigation.navigate(route.name, route.params) } - }; - + } return ( - ); + ) })} - ); + ) } const styles = StyleSheet.create({ @@ -104,16 +114,15 @@ const styles = StyleSheet.create({ height: 42, borderRadius: 30, // backgroundColor: COLORS.primary500, - backgroundColor:COLORS.white, + backgroundColor: COLORS.white, }, - focusCircleContainer:{ + focusCircleContainer: { position: 'absolute', display: 'flex', top: 0, left: 0, bottom: 0, justifyContent: 'center', - alignItems: 'center' - } -}); - + alignItems: 'center', + }, +}) diff --git a/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx b/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx index 5cab5f78..182ea911 100644 --- a/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx +++ b/mobile/tradeverse/components/ui/tabbar/tabbar-button.jsx @@ -1,46 +1,48 @@ -import { View, Text, StyleSheet, Pressable } from 'react-native'; +import { View, Text, StyleSheet, Pressable } from 'react-native' import Animated, { interpolate, useAnimatedStyle, useSharedValue, - withSpring -} from 'react-native-reanimated'; -import React, { useEffect } from 'react'; -import { COLORS, SIZE_CONSTANT, SIZES } from '../../../constants/theme'; + withSpring, +} from 'react-native-reanimated' +import React, { useEffect } from 'react' +import { COLORS, SIZE_CONSTANT, SIZES } from '../../../constants/theme' export default function TabBarButton({ key, onPress, isFocused = false, icons, - label + label, }) { - const scale = useSharedValue(1); + const scale = useSharedValue(1) useEffect(() => { scale.value = withSpring(isFocused ? 1 : 0, { - duration: 350 - }); - }, [scale, isFocused]); + duration: 350, + }) + }, [scale, isFocused]) const animatedTextStyle = useAnimatedStyle(() => { - const opacity = interpolate(scale.value, [0, 1], [1, 0]); + const opacity = interpolate(scale.value, [0, 1], [1, 0]) return { - opacity - }; - }); + opacity, + } + }) const animatedIconStyle = useAnimatedStyle(() => { - const scaleValue = interpolate(scale.value, [0, 1], [0.8, .92]); - const topValue = interpolate(scale.value, [0, 1], [0, 0]); + const scaleValue = interpolate(scale.value, [0, 1], [0.8, 0.92]) + const topValue = interpolate(scale.value, [0, 1], [0, 0]) return { - transform: [{ - scale: scaleValue - }], - top: topValue - }; - }); + transform: [ + { + scale: scaleValue, + }, + ], + top: topValue, + } + }) return ( */} - ); + ) } const styles = StyleSheet.create({ @@ -68,22 +70,22 @@ const styles = StyleSheet.create({ flex: 1, justifyContent: 'center', alignItems: 'center', - zIndex:90 + zIndex: 90, }, tabBarItemText: { fontSize: SIZES.xxSmall, color: COLORS.white, - fontWeight: 'light' + fontWeight: 'light', }, inactiveIcon: { strokeWidth: 1.5, size: SIZE_CONSTANT * 3, // color: COLORS.primary500 - color:COLORS.white + color: COLORS.white, }, activeIcon: { strokeWidth: 2, size: SIZE_CONSTANT * 3, color: COLORS.primary500, - } -}); + }, +}) diff --git a/mobile/tradeverse/config/navigation.js b/mobile/tradeverse/config/navigation.js deleted file mode 100644 index 44b93877..00000000 --- a/mobile/tradeverse/config/navigation.js +++ /dev/null @@ -1,113 +0,0 @@ -/* eslint-disable react/jsx-props-no-spreading */ -/* eslint-disable import/prefer-default-export */ -import { - IconHome, - IconHomeFilled, - IconLabelFilled, - IconLayout, - IconLayoutFilled, - IconPlus, - IconSearch, - IconUser, - IconUserFilled, - } from '@tabler/icons-react-native'; -import { SIZE_CONSTANT,COLORS } from '@/constants/theme'; -import paths from '@/config/screen-paths'; - -const roots = { - HOME: 'home', - EXPLORE:'explore', - ADD:'add', - PORTFOLIO:'portfolio', - ACCOUNT:'account', - }; - - const DefaultIconStyle = { - strokeWidth: 1.8, - size: SIZE_CONSTANT * 2.8, - color: COLORS.primary500 - }; - - const DefaultFilledIconStyle = { - strokeWidth: 0, - size: SIZE_CONSTANT * 2.8, - fill: COLORS.primary500 - }; - - export const NAV_OPTIONS = [ - { - icons :{ - active:(style)=> , - inactive : (style) => - }, - label: 'Home', - path: paths.HOME.ROOT, - name: 'home', - routeValue: 'home/index', - headerOptions:{ - headerShown:false - } - }, - - { - // icon: , - // activeIcon: , - icons :{ - active:(style)=> , - inactive : (style) => - }, - label: 'Explore', - path: paths.EXPLORE.ROOT, - name:'explore', - routeValue: 'explore/index', - headerOptions:{ - headerShown:false - } - } -, - { - // icon:, - // activeIcon:, - icons :{ - active:(style)=> , - inactive : (style) => - }, - label:'Add', - path: paths.CREATE.ROOT, - name:'create', - routeValue:'create/index', - headerOptions:{ - headerShown:false - } - }, - { - // icon:, - // activeIcon:, - icons :{ - active:(style)=> , - inactive : (style) => - }, - label:'Portfolio', - name:'portfolio', - routeValue:'portfolio/index', - headerOptions:{ - headerShown:false - } - }, - { - // icon:, - // activeIcon:, - icons :{ - active:(style)=> , - inactive : (style) => - }, - label:'Account', - name:'account', - routeValue:'account/index', - headerOptions:{ - headerShown:false - } - } - - ]; - \ No newline at end of file diff --git a/mobile/tradeverse/config/navigation.jsx b/mobile/tradeverse/config/navigation.jsx new file mode 100644 index 00000000..b04b72f0 --- /dev/null +++ b/mobile/tradeverse/config/navigation.jsx @@ -0,0 +1,87 @@ +/* eslint-disable react/jsx-props-no-spreading */ +/* eslint-disable import/prefer-default-export */ +import React from 'react' +import { + IconHome, + IconLayout, + IconPlus, + IconSearch, + IconUser, +} from '@tabler/icons-react-native' + +import paths from './screen-paths' + +export const NAV_OPTIONS = [ + { + icons: { + active: (style) => , + inactive: (style) => , + }, + label: 'Home', + path: paths.HOME.ROOT, + name: 'home', + routeValue: 'home/index', + headerOptions: { + headerShown: false, + }, + }, + + { + // icon: , + // activeIcon: , + icons: { + active: (style) => , + inactive: (style) => , + }, + label: 'Explore', + path: paths.EXPLORE.ROOT, + name: 'explore', + routeValue: 'explore/index', + headerOptions: { + headerShown: false, + }, + }, + { + // icon:, + // activeIcon:, + icons: { + active: (style) => , + inactive: (style) => , + }, + label: 'Add', + path: paths.CREATE.ROOT, + name: 'create', + routeValue: 'create/index', + headerOptions: { + headerShown: false, + }, + }, + { + // icon:, + // activeIcon:, + icons: { + active: (style) => , + inactive: (style) => , + }, + label: 'Portfolio', + name: 'portfolio', + routeValue: 'portfolio/index', + headerOptions: { + headerShown: false, + }, + }, + { + // icon:, + // activeIcon:, + icons: { + active: (style) => , + inactive: (style) => , + }, + label: 'Account', + name: 'account', + routeValue: 'account/index', + headerOptions: { + headerShown: false, + }, + }, +] diff --git a/mobile/tradeverse/config/screen-paths.js b/mobile/tradeverse/config/screen-paths.js index 71cc37f9..5f7c01ce 100644 --- a/mobile/tradeverse/config/screen-paths.js +++ b/mobile/tradeverse/config/screen-paths.js @@ -1,50 +1,49 @@ const roots = { - HOME: 'home', - EXPLORE:'explore', - CREATE:'create', - PORTFOLIO:'portfolio', - ACCOUNT:'account', - }; - - const paths = { - HOME: { - ROOT: roots.HOME, - USER_PROFILE: `${roots.HOME}/user-profile`, - SUBFORUM_DETAIL: `${roots.HOME}/subforum-detail`, - POST_DETAIL: `${roots.HOME}/post-detail`, + HOME: 'home', + EXPLORE: 'explore', + CREATE: 'create', + PORTFOLIO: 'portfolio', + ACCOUNT: 'account', +} + +const paths = { + HOME: { + ROOT: roots.HOME, + USER_PROFILE: `${roots.HOME}/user-profile`, + SUBFORUM_DETAIL: `${roots.HOME}/subforum-detail`, + POST_DETAIL: `${roots.HOME}/post-detail`, + }, + EXPLORE: { + ROOT: roots.EXPLORE, + SEARCH: `${roots.EXPLORE}/search`, + SEARCH_RESULTS: { + ASSET_DETAIL: `${roots.EXPLORE}/search/asset-detail`, + POST_DETAIL: `${roots.EXPLORE}/search/post-detail`, + USER_PROFILE: `${roots.EXPLORE}/search/user-profile`, + SUBFORUM_DETAIL: `${roots.EXPLORE}/search/subforum-detail`, }, - EXPLORE: { - ROOT: roots.EXPLORE, - SEARCH: `${roots.EXPLORE}/search`, - SEARCH_RESULTS:{ - ASSET_DETAIL: `${roots.EXPLORE}/search/asset-detail`, - POST_DETAIL: `${roots.EXPLORE}/search/post-detail`, - USER_PROFILE: `${roots.EXPLORE}/search/user-profile`, - SUBFORUM_DETAIL: `${roots.EXPLORE}/search/subforum-detail`, - }, - USER_PROFILE: `${roots.EXPLORE}/user-profile`, - SUBFORUM_DETAIL: `${roots.EXPLORE}/subforum-detail`, - POST_DETAIL: `${roots.EXPLORE}/post-detail`, - ASSET_DETAIL: `${roots.EXPLORE}/asset-detail`, - TAG_DETAIL: `${roots.EXPLORE}/tag-detail`, - }, - CREATE: { - ROOT: roots.CREATE, - ADD_POST: `${roots.CREATE}/add-post`, - ADD_SUBFORUM: `${roots.CREATE}/add-subforum`, - }, - PORTFOLIO: { - ROOT: roots.PORTFOLIO, - ADD_ASSET: `${roots.PORTFOLIO}/add-asset`, - ASSET_DETAIL: `${roots.PORTFOLIO}/asset-detail`, - }, - ACCOUNT: { - ROOT: roots.ACCOUNT, - PROFILE: `${roots.ACCOUNT}/profile`, - PORTFOLIO: `${roots.ACCOUNT}/portfolio`, - FOLLOWED_TOPICS: `${roots.ACCOUNT}/followed-topics`, - FOLLOWED_USERS: `${roots.ACCOUNT}/followed-users`, - }, - }; - export default paths; - \ No newline at end of file + USER_PROFILE: `${roots.EXPLORE}/user-profile`, + SUBFORUM_DETAIL: `${roots.EXPLORE}/subforum-detail`, + POST_DETAIL: `${roots.EXPLORE}/post-detail`, + ASSET_DETAIL: `${roots.EXPLORE}/asset-detail`, + TAG_DETAIL: `${roots.EXPLORE}/tag-detail`, + }, + CREATE: { + ROOT: roots.CREATE, + ADD_POST: `${roots.CREATE}/add-post`, + ADD_SUBFORUM: `${roots.CREATE}/add-subforum`, + }, + PORTFOLIO: { + ROOT: roots.PORTFOLIO, + ADD_ASSET: `${roots.PORTFOLIO}/add-asset`, + ASSET_DETAIL: `${roots.PORTFOLIO}/asset-detail`, + }, + ACCOUNT: { + ROOT: roots.ACCOUNT, + PROFILE: `${roots.ACCOUNT}/profile`, + PORTFOLIO: `${roots.ACCOUNT}/portfolio`, + FOLLOWED_TOPICS: `${roots.ACCOUNT}/followed-topics`, + FOLLOWED_USERS: `${roots.ACCOUNT}/followed-users`, + }, +} +export default paths diff --git a/mobile/tradeverse/constants/images.jsx b/mobile/tradeverse/constants/images.jsx index 2fe642b5..a0082270 100644 --- a/mobile/tradeverse/constants/images.jsx +++ b/mobile/tradeverse/constants/images.jsx @@ -1,6 +1,7 @@ -import NO_PROFILE_IMG from '../assets/images/profile.png'; -import NO_CONTENT_IMG from '../assets/images/no-content.png'; +import NO_PROFILE_IMG from '../assets/images/profile.png' +import NO_CONTENT_IMG from '../assets/images/no-content.png' + export default { NO_PROFILE_IMG, - NO_CONTENT_IMG -}; + NO_CONTENT_IMG, +} diff --git a/mobile/tradeverse/constants/theme.jsx b/mobile/tradeverse/constants/theme.jsx index 511b4ca4..3abc6adc 100644 --- a/mobile/tradeverse/constants/theme.jsx +++ b/mobile/tradeverse/constants/theme.jsx @@ -1,56 +1,49 @@ export const COLORS = { - black: '#000000', - white: '#FFFFFF', - - graytext: '#A0A0A0', - - primary50: '#EEF2FF', - primary100: '#E0E7FF', - primary200: '#C7D2FE', - primary300: '#A6B4FB', - primary400: '#828CF7', - primary500: '#5D5FEF', - primary600: '#5147E4', - primary700: '#4539C9', - primary800: '#3931A2', - primary900: '#332F80', - primary950: '#1E1B4B', - - error: '#E83939', - errorDark: '#840F0F', - }; - - - export const FONT = { - regular: 'DMRegular', - medium: 'DMMedium', - bold: 'DMBold' - }; - - export const SIZE_CONSTANT = 11; - + black: '#000000', + white: '#FFFFFF', + + graytext: '#A0A0A0', + + primary50: '#EEF2FF', + primary100: '#E0E7FF', + primary200: '#C7D2FE', + primary300: '#A6B4FB', + primary400: '#828CF7', + primary500: '#5D5FEF', + primary600: '#5147E4', + primary700: '#4539C9', + primary800: '#3931A2', + primary900: '#332F80', + primary950: '#1E1B4B', + + error: '#E83939', + errorDark: '#840F0F', +} - export const SIZES = { - xxSmall: SIZE_CONSTANT * 1, - xSmall: SIZE_CONSTANT * 1.2, - small: SIZE_CONSTANT * 1.4, - medium: SIZE_CONSTANT * 1.6, - large: SIZE_CONSTANT * 2, - xLarge: SIZE_CONSTANT * 2.4, - xxLarge: SIZE_CONSTANT * 3.2 - }; +export const FONT = { + regular: 'DMRegular', + medium: 'DMMedium', + bold: 'DMBold', +} +export const SIZE_CONSTANT = 11 +export const SIZES = { + xxSmall: SIZE_CONSTANT * 1, + xSmall: SIZE_CONSTANT * 1.2, + small: SIZE_CONSTANT * 1.4, + medium: SIZE_CONSTANT * 1.6, + large: SIZE_CONSTANT * 2, + xLarge: SIZE_CONSTANT * 2.4, + xxLarge: SIZE_CONSTANT * 3.2, +} export const FONT_WEIGHTS = { - thin: '100', - light: '200', - regular: '400', - medium: '500', - semibold: '600', - bold: '700', - black: '900' + thin: '100', + light: '200', + regular: '400', + medium: '500', + semibold: '600', + bold: '700', + black: '900', } - - - \ No newline at end of file diff --git a/mobile/tradeverse/eas.json b/mobile/tradeverse/eas.json index 6d2b1ea0..0c52c5d7 100644 --- a/mobile/tradeverse/eas.json +++ b/mobile/tradeverse/eas.json @@ -1,21 +1,21 @@ { - "build": { - "preview": { - "android": { - "buildType": "apk" - } - }, - "preview2": { - "android": { - "gradleCommand": ":app:assembleRelease" - } - }, - "preview3": { - "developmentClient": true - }, - "preview4": { - "distribution": "internal" - }, - "production": {} - } - } \ No newline at end of file + "build": { + "preview": { + "android": { + "buildType": "apk" + } + }, + "preview2": { + "android": { + "gradleCommand": ":app:assembleRelease" + } + }, + "preview3": { + "developmentClient": true + }, + "preview4": { + "distribution": "internal" + }, + "production": {} + } +} diff --git a/mobile/tradeverse/mock-data/HomeData.js b/mobile/tradeverse/mock-data/HomeData.js index b9a35379..5b1253b7 100644 --- a/mobile/tradeverse/mock-data/HomeData.js +++ b/mobile/tradeverse/mock-data/HomeData.js @@ -1,40 +1,36 @@ -import { allSubforums } from "./all-subforums"; - -const allPosts = allSubforums.reduce((acc, subforum) => { - return acc.concat(subforum.posts); -}, []); - -export const HomeData = { - ForYouPosts: [ - { - title: "How to pass bruh to moment here.", - content: [ - { - type: "text", - value: "Rising inflation impacts everyone’s wallet...", - }, - { type: "tag", value: "investments" }, - { type: "text", value: "and tracking key economic indicators." }, - { type: "tag", value: "Inflation" }, - { type: "tag", value: "FinanceTips" }, - ], - date: "2021-01-01", - likes: 10, - dislikes: 2, - comments: 5, - views: 1200, - subforum: { - name: "Future Investment", - id: 1, - }, - author: { - name: "Daron", - surname: "Acemoglu", - username: "daronacemoglu", - avatar: - "https://img.kitapyurdu.com/v1/getImage/fn:10642557/wi:200/wh:526d5c04e", - id: 1, - }, - }, - ], -}; +const HomeData = { + ForYouPosts: [ + { + title: 'How to pass bruh to moment here.', + content: [ + { + type: 'text', + value: 'Rising inflation impacts everyone’s wallet...', + }, + { type: 'tag', value: 'investments' }, + { type: 'text', value: 'and tracking key economic indicators.' }, + { type: 'tag', value: 'Inflation' }, + { type: 'tag', value: 'FinanceTips' }, + ], + date: '2021-01-01', + likes: 10, + dislikes: 2, + comments: 5, + views: 1200, + subforum: { + name: 'Future Investment', + id: 1, + }, + author: { + name: 'Daron', + surname: 'Acemoglu', + username: 'daronacemoglu', + avatar: + 'https://img.kitapyurdu.com/v1/getImage/fn:10642557/wi:200/wh:526d5c04e', + id: 1, + }, + }, + ], +} + +export default HomeData diff --git a/mobile/tradeverse/mock-data/Portfolio.js b/mobile/tradeverse/mock-data/Portfolio.js index 6c137d69..754625c0 100644 --- a/mobile/tradeverse/mock-data/Portfolio.js +++ b/mobile/tradeverse/mock-data/Portfolio.js @@ -1,26 +1,28 @@ -export const Portfolio = [ - { - symbol: "BTC", - name: "Bitcoin", - value: "0.005", - logo: "https://s2.coinmarketcap.com/static/img/coins/64x64/1.png", - }, - { - symbol: "USD", - name: "US Dollar", - value: "$31.82", - logo: "https://s2.coinmarketcap.com/static/img/coins/64x64/2781.png", - }, - { - symbol: "EUR", - name: "Euro", - value: "€52.96", - logo: "https://s2.coinmarketcap.com/static/img/coins/64x64/2790.png", - }, - { - symbol: "JPY", - name: "Japanese Yen", - value: "¥4000.50", - logo: "https://s2.coinmarketcap.com/static/img/coins/64x64/2793.png", - }, -]; +const Portfolio = [ + { + symbol: 'BTC', + name: 'Bitcoin', + value: '0.005', + logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/1.png', + }, + { + symbol: 'USD', + name: 'US Dollar', + value: '$31.82', + logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/2781.png', + }, + { + symbol: 'EUR', + name: 'Euro', + value: '€52.96', + logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/2790.png', + }, + { + symbol: 'JPY', + name: 'Japanese Yen', + value: '¥4000.50', + logo: 'https://s2.coinmarketcap.com/static/img/coins/64x64/2793.png', + }, +] + +export default Portfolio diff --git a/mobile/tradeverse/mock-data/all-assets.js b/mobile/tradeverse/mock-data/all-assets.js index 0a9368b3..750f7b23 100644 --- a/mobile/tradeverse/mock-data/all-assets.js +++ b/mobile/tradeverse/mock-data/all-assets.js @@ -1,243 +1,243 @@ // -export const allAssets = [ +const allAssets = [ { - abbreviation: "BTC", - label: "Bitcoin", - image: "https://example.com/btc.png", + abbreviation: 'BTC', + label: 'Bitcoin', + image: 'https://example.com/btc.png', }, { - abbreviation: "ETH", - label: "Ethereum", - image: "https://example.com/eth.png", + abbreviation: 'ETH', + label: 'Ethereum', + image: 'https://example.com/eth.png', }, { - abbreviation: "LTC", - label: "Litecoin", - image: "https://example.com/ltc.png", + abbreviation: 'LTC', + label: 'Litecoin', + image: 'https://example.com/ltc.png', }, { - abbreviation: "AAPL", - label: "Apple Inc.", - image: "https://example.com/aapl.png", + abbreviation: 'AAPL', + label: 'Apple Inc.', + image: 'https://example.com/aapl.png', }, { - abbreviation: "GOOGL", - label: "Alphabet Inc.", - image: "https://example.com/googl.png", + abbreviation: 'GOOGL', + label: 'Alphabet Inc.', + image: 'https://example.com/googl.png', }, { - abbreviation: "AMZN", - label: "Amazon.com Inc.", - image: "https://example.com/amzn.png", + abbreviation: 'AMZN', + label: 'Amazon.com Inc.', + image: 'https://example.com/amzn.png', }, { - abbreviation: "TSLA", - label: "Tesla Inc.", - image: "https://example.com/tsla.png", + abbreviation: 'TSLA', + label: 'Tesla Inc.', + image: 'https://example.com/tsla.png', }, { - abbreviation: "XAU", - label: "Gold", - image: "https://example.com/xau.png", + abbreviation: 'XAU', + label: 'Gold', + image: 'https://example.com/xau.png', }, { - abbreviation: "XAG", - label: "Silver", - image: "https://example.com/xag.png", + abbreviation: 'XAG', + label: 'Silver', + image: 'https://example.com/xag.png', }, { - abbreviation: "EURUSD", - label: "Euro/US Dollar", - image: "https://example.com/eurusd.png", + abbreviation: 'EURUSD', + label: 'Euro/US Dollar', + image: 'https://example.com/eurusd.png', }, { - abbreviation: "GBPUSD", - label: "British Pound/US Dollar", - image: "https://example.com/gbpusd.png", + abbreviation: 'GBPUSD', + label: 'British Pound/US Dollar', + image: 'https://example.com/gbpusd.png', }, { - abbreviation: "USDJPY", - label: "US Dollar/Japanese Yen", - image: "https://example.com/usdjpy.png", + abbreviation: 'USDJPY', + label: 'US Dollar/Japanese Yen', + image: 'https://example.com/usdjpy.png', }, { - abbreviation: "USDCAD", - label: "US Dollar/Canadian Dollar", - image: "https://example.com/usdcad.png", + abbreviation: 'USDCAD', + label: 'US Dollar/Canadian Dollar', + image: 'https://example.com/usdcad.png', }, { - abbreviation: "WTI", - label: "West Texas Intermediate (Crude Oil)", - image: "https://example.com/wti.png", + abbreviation: 'WTI', + label: 'West Texas Intermediate (Crude Oil)', + image: 'https://example.com/wti.png', }, { - abbreviation: "BRN", - label: "Brent Crude Oil", - image: "https://example.com/brn.png", + abbreviation: 'BRN', + label: 'Brent Crude Oil', + image: 'https://example.com/brn.png', }, { - abbreviation: "SP500", - label: "S&P 500 Index", - image: "https://example.com/sp500.png", + abbreviation: 'SP500', + label: 'S&P 500 Index', + image: 'https://example.com/sp500.png', }, { - abbreviation: "DJIA", - label: "Dow Jones Industrial Average", - image: "https://example.com/djia.png", + abbreviation: 'DJIA', + label: 'Dow Jones Industrial Average', + image: 'https://example.com/djia.png', }, { - abbreviation: "NDAQ", - label: "NASDAQ 100 Index", - image: "https://example.com/ndaq.png", + abbreviation: 'NDAQ', + label: 'NASDAQ 100 Index', + image: 'https://example.com/ndaq.png', }, { - abbreviation: "BABA", - label: "Alibaba Group", - image: "https://example.com/baba.png", + abbreviation: 'BABA', + label: 'Alibaba Group', + image: 'https://example.com/baba.png', }, { - abbreviation: "NFLX", - label: "Netflix Inc.", - image: "https://example.com/nflx.png", + abbreviation: 'NFLX', + label: 'Netflix Inc.', + image: 'https://example.com/nflx.png', }, { - abbreviation: "MSFT", - label: "Microsoft Corporation", - image: "https://example.com/msft.png", + abbreviation: 'MSFT', + label: 'Microsoft Corporation', + image: 'https://example.com/msft.png', }, { - abbreviation: "V", - label: "Visa Inc.", - image: "https://example.com/visa.png", + abbreviation: 'V', + label: 'Visa Inc.', + image: 'https://example.com/visa.png', }, { - abbreviation: "JPM", - label: "JPMorgan Chase & Co.", - image: "https://example.com/jpm.png", + abbreviation: 'JPM', + label: 'JPMorgan Chase & Co.', + image: 'https://example.com/jpm.png', }, { - abbreviation: "FB", - label: "Meta Platforms (Facebook)", - image: "https://example.com/fb.png", + abbreviation: 'FB', + label: 'Meta Platforms (Facebook)', + image: 'https://example.com/fb.png', }, { - abbreviation: "BA", - label: "The Boeing Company", - image: "https://example.com/ba.png", + abbreviation: 'BA', + label: 'The Boeing Company', + image: 'https://example.com/ba.png', }, { - abbreviation: "NVDA", - label: "NVIDIA Corporation", - image: "https://example.com/nvda.png", + abbreviation: 'NVDA', + label: 'NVIDIA Corporation', + image: 'https://example.com/nvda.png', }, { - abbreviation: "EUR", - label: "Euro", - image: "https://example.com/eur.png", + abbreviation: 'EUR', + label: 'Euro', + image: 'https://example.com/eur.png', }, { - abbreviation: "USD", - label: "US Dollar", - image: "https://example.com/usd.png", + abbreviation: 'USD', + label: 'US Dollar', + image: 'https://example.com/usd.png', }, { - abbreviation: "GBP", - label: "British Pound", - image: "https://example.com/gbp.png", + abbreviation: 'GBP', + label: 'British Pound', + image: 'https://example.com/gbp.png', }, { - abbreviation: "JPY", - label: "Japanese Yen", - image: "https://example.com/jpy.png", + abbreviation: 'JPY', + label: 'Japanese Yen', + image: 'https://example.com/jpy.png', }, { - abbreviation: "CAD", - label: "Canadian Dollar", - image: "https://example.com/cad.png", + abbreviation: 'CAD', + label: 'Canadian Dollar', + image: 'https://example.com/cad.png', }, { - abbreviation: "AUD", - label: "Australian Dollar", - image: "https://example.com/aud.png", + abbreviation: 'AUD', + label: 'Australian Dollar', + image: 'https://example.com/aud.png', }, { - abbreviation: "CHF", - label: "Swiss Franc", - image: "https://example.com/chf.png", + abbreviation: 'CHF', + label: 'Swiss Franc', + image: 'https://example.com/chf.png', }, { - abbreviation: "CNY", - label: "Chinese Yuan", - image: "https://example.com/cny.png", + abbreviation: 'CNY', + label: 'Chinese Yuan', + image: 'https://example.com/cny.png', }, { - abbreviation: "MXN", - label: "Mexican Peso", - image: "https://example.com/mxn.png", + abbreviation: 'MXN', + label: 'Mexican Peso', + image: 'https://example.com/mxn.png', }, { - abbreviation: "SGD", - label: "Singapore Dollar", - image: "https://example.com/sgd.png", + abbreviation: 'SGD', + label: 'Singapore Dollar', + image: 'https://example.com/sgd.png', }, { - abbreviation: "KRW", - label: "South Korean Won", - image: "https://example.com/krw.png", + abbreviation: 'KRW', + label: 'South Korean Won', + image: 'https://example.com/krw.png', }, { - abbreviation: "RUB", - label: "Russian Ruble", - image: "https://example.com/rub.png", + abbreviation: 'RUB', + label: 'Russian Ruble', + image: 'https://example.com/rub.png', }, { - abbreviation: "ZAR", - label: "South African Rand", - image: "https://example.com/zar.png", + abbreviation: 'ZAR', + label: 'South African Rand', + image: 'https://example.com/zar.png', }, { - abbreviation: "TRY", - label: "Turkish Lira", - image: "https://example.com/try.png", + abbreviation: 'TRY', + label: 'Turkish Lira', + image: 'https://example.com/try.png', }, { - abbreviation: "HKD", - label: "Hong Kong Dollar", - image: "https://example.com/hkd.png", + abbreviation: 'HKD', + label: 'Hong Kong Dollar', + image: 'https://example.com/hkd.png', }, { - abbreviation: "INR", - label: "Indian Rupee", - image: "https://example.com/inr.png", + abbreviation: 'INR', + label: 'Indian Rupee', + image: 'https://example.com/inr.png', }, { - abbreviation: "BRL", - label: "Brazilian Real", - image: "https://example.com/brl.png", + abbreviation: 'BRL', + label: 'Brazilian Real', + image: 'https://example.com/brl.png', }, { - abbreviation: "ARS", - label: "Argentine Peso", - image: "https://example.com/ars.png", + abbreviation: 'ARS', + label: 'Argentine Peso', + image: 'https://example.com/ars.png', }, { - abbreviation: "CLP", - label: "Chilean Peso", - image: "https://example.com/clp.png", + abbreviation: 'CLP', + label: 'Chilean Peso', + image: 'https://example.com/clp.png', }, { - abbreviation: "NZD", - label: "New Zealand Dollar", - image: "https://example.com/nzd.png", + abbreviation: 'NZD', + label: 'New Zealand Dollar', + image: 'https://example.com/nzd.png', }, { - abbreviation: "COP", - label: "Colombian Peso", - image: "https://example.com/cop.png", + abbreviation: 'COP', + label: 'Colombian Peso', + image: 'https://example.com/cop.png', }, -].map((asset, index) => { - return { - ...asset, - id: index + 1, - }; -}); +].map((asset, index) => ({ + ...asset, + id: index + 1, +})) + +export default allAssets diff --git a/mobile/tradeverse/mock-data/all-subforums.js b/mobile/tradeverse/mock-data/all-subforums.js index 0f17974b..d95c7e2c 100644 --- a/mobile/tradeverse/mock-data/all-subforums.js +++ b/mobile/tradeverse/mock-data/all-subforums.js @@ -1,422 +1,440 @@ -export const allSubforums = [ +const allSubforums = [ { id: 1, - title: "Behavioral Economics", - totalPosts:4, - totalFollowers:103231, - totalPeople:123000, + title: 'Behavioral Economics', + totalPosts: 4, + totalFollowers: 103231, + totalPeople: 123000, posts: [ { id: 1, - title: "Understanding Behavioral Economics", + title: 'Understanding Behavioral Economics', content: [ { - type: "text", + type: 'text', value: - "Behavioral economics offers insights into why people make irrational financial decisions.", + 'Behavioral economics offers insights into why people make irrational financial decisions.', }, - { type: "tag", value: "BehavioralEconomics" }, - { type: "tag", value: "DecisionMaking" }, + { type: 'tag', value: 'BehavioralEconomics' }, + { type: 'tag', value: 'DecisionMaking' }, ], - date: "2023-03-21", + date: '2023-03-21', likes: 90, dislikes: 1, comments: 30, views: 2300, author: { - name: "Gulsen", - surname: "Sabak", - username: "gulsensabak", - avatar: "https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs", + name: 'Gulsen', + surname: 'Sabak', + username: 'gulsensabak', + avatar: + 'https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs', }, }, { id: 2, - title: "The Role of Gender in Economic Participation", + title: 'The Role of Gender in Economic Participation', content: [ { - type: "text", + type: 'text', value: - "Women’s participation in the workforce is critical for economic development.", + 'Women’s participation in the workforce is critical for economic development.', }, - { type: "tag", value: "BehavioralEconomics" }, - { type: "tag", value: "Workforce" }, + { type: 'tag', value: 'BehavioralEconomics' }, + { type: 'tag', value: 'Workforce' }, ], - date: "2023-05-11", + date: '2023-05-11', likes: 110, dislikes: 3, comments: 25, views: 3100, author: { - name: "Gulsen", - surname: "Sabak", - username: "gulsensabak", - avatar: "https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs", + name: 'Gulsen', + surname: 'Sabak', + username: 'gulsensabak', + avatar: + 'https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs', }, }, { id: 3, - title: "How to Analyze Company Fundamentals", + title: 'How to Analyze Company Fundamentals', content: [ { - type: "text", + type: 'text', value: "Fundamental analysis is critical when evaluating a company's long-term potential.", }, - { type: "tag", value: "BehavioralEconomics" }, - { type: "tag", value: "CompanyAnalysis" }, + { type: 'tag', value: 'BehavioralEconomics' }, + { type: 'tag', value: 'CompanyAnalysis' }, ], - date: "2023-05-03", + date: '2023-05-03', likes: 185, dislikes: 6, comments: 85, views: 6700, author: { - name: "Warren", - surname: "Buffet", - username: "warrenbuffet", - avatar: "https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg", + name: 'Warren', + surname: 'Buffet', + username: 'warrenbuffet', + avatar: + 'https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg', }, }, { id: 4, - title: "Inflation trends in emerging markets", + title: 'Inflation trends in emerging markets', content: [ { - type: "text", + type: 'text', value: - "Emerging markets face volatile inflation rates due to various factors like commodity prices and currency fluctuations.", + 'Emerging markets face volatile inflation rates due to various factors like commodity prices and currency fluctuations.', }, - { type: "tag", value: "BehavioralEconomics" }, - { type: "tag", value: "EmergingMarkets" }, + { type: 'tag', value: 'BehavioralEconomics' }, + { type: 'tag', value: 'EmergingMarkets' }, ], - date: "2023-07-15", + date: '2023-07-15', likes: 120, dislikes: 5, comments: 60, views: 5000, author: { - name: "Daron", - surname: "Acemoglu", - avatar: "https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd", - username: "daronnacemoglu", + name: 'Daron', + surname: 'Acemoglu', + avatar: + 'https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd', + username: 'daronnacemoglu', }, }, ], }, { id: 2, - totalPosts:4, - totalFollowers:103231, - totalPeople:123000, + totalPosts: 4, + totalFollowers: 103231, + totalPeople: 123000, - title: "Economic Growth", + title: 'Economic Growth', posts: [ { id: 5, - title: "The impact of technology on economic growth", + title: 'The impact of technology on economic growth', content: [ { - type: "text", - value: "Technological progress drives economies forward.", + type: 'text', + value: 'Technological progress drives economies forward.', }, - { type: "tag", value: "EconomicGrowth" }, - { type: "tag", value: "TechImpact" }, + { type: 'tag', value: 'EconomicGrowth' }, + { type: 'tag', value: 'TechImpact' }, ], - date: "2023-06-01", + date: '2023-06-01', likes: 85, dislikes: 2, comments: 45, views: 3200, author: { - name: "Daron", - surname: "Acemoglu", - avatar: "https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd", - username: "daronnacemoglu", + name: 'Daron', + surname: 'Acemoglu', + avatar: + 'https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd', + username: 'daronnacemoglu', }, }, { id: 6, - title: "The Role of Institutions in Economic Development", + title: 'The Role of Institutions in Economic Development', content: [ { - type: "text", + type: 'text', value: - "Strong institutions are key to sustainable economic growth.", + 'Strong institutions are key to sustainable economic growth.', }, - { type: "tag", value: "Institutions" }, - { type: "tag", value: "EconomicDevelopment" }, + { type: 'tag', value: 'Institutions' }, + { type: 'tag', value: 'EconomicDevelopment' }, ], - date: "2023-04-04", + date: '2023-04-04', likes: 80, dislikes: 2, comments: 25, views: 2200, author: { - name: "Kıvanç", - surname: "Karaman", - username: "kivanc_karaman", - avatar: "https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg", + name: 'Kıvanç', + surname: 'Karaman', + username: 'kivanc_karaman', + avatar: + 'https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg', }, }, { id: 7, - title: "The Importance of Education in Economic Growth", + title: 'The Importance of Education in Economic Growth', content: [ { - type: "text", + type: 'text', value: - "A well-educated population is the foundation for economic success.", + 'A well-educated population is the foundation for economic success.', }, - { type: "tag", value: "Education" }, - { type: "tag", value: "EconomicGrowth" }, + { type: 'tag', value: 'Education' }, + { type: 'tag', value: 'EconomicGrowth' }, ], - date: "2023-08-29", + date: '2023-08-29', likes: 150, dislikes: 8, comments: 70, views: 5800, author: { - name: "Kıvanç", - surname: "Karaman", - username: "kivanc_karaman", - avatar: "https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg", + name: 'Kıvanç', + surname: 'Karaman', + username: 'kivanc_karaman', + avatar: + 'https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg', }, }, { id: 8, - title: "Why Financial Literacy Matters", + title: 'Why Financial Literacy Matters', content: [ { - type: "text", + type: 'text', value: - "Improving financial literacy leads to better decision-making and long-term financial health.", + 'Improving financial literacy leads to better decision-making and long-term financial health.', }, - { type: "tag", value: "FinancialLiteracy" }, - { type: "tag", value: "EconomicGrowth" }, + { type: 'tag', value: 'FinancialLiteracy' }, + { type: 'tag', value: 'EconomicGrowth' }, ], - date: "2023-07-02", + date: '2023-07-02', likes: 140, dislikes: 5, comments: 65, views: 4600, author: { - name: "Warren", - surname: "Buffet", - username: "warrenbuffet", - avatar: "https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg", + name: 'Warren', + surname: 'Buffet', + username: 'warrenbuffet', + avatar: + 'https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg', }, }, ], }, { id: 3, - title: "Investing Market", - totalPosts:4, - totalFollowers:103231, - totalPeople:123000, + title: 'Investing Market', + totalPosts: 4, + totalFollowers: 103231, + totalPeople: 123000, posts: [ { id: 9, - title: "Cryptocurrency adoption in global markets", + title: 'Cryptocurrency adoption in global markets', content: [ { - type: "text", + type: 'text', value: - "Cryptocurrency is becoming an increasingly accepted form of payment and investment in various countries.", + 'Cryptocurrency is becoming an increasingly accepted form of payment and investment in various countries.', }, - { type: "tag", value: "Cryptocurrency" }, - { type: "tag", value: "GlobalMarkets" }, + { type: 'tag', value: 'Cryptocurrency' }, + { type: 'tag', value: 'GlobalMarkets' }, ], - date: "2023-08-10", + date: '2023-08-10', likes: 200, dislikes: 10, comments: 80, views: 7500, author: { - name: "Daron", - surname: "Acemoglu", - avatar: "https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd", - username: "daronnacemoglu", + name: 'Daron', + surname: 'Acemoglu', + avatar: + 'https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd', + username: 'daronnacemoglu', }, }, { id: 10, - title: "How Globalization Impacts Emerging Markets", + title: 'How Globalization Impacts Emerging Markets', content: [ { - type: "text", + type: 'text', value: - "Globalization presents both opportunities and challenges for emerging economies.", + 'Globalization presents both opportunities and challenges for emerging economies.', }, - { type: "tag", value: "Globalization" }, - { type: "tag", value: "EmergingMarkets" }, + { type: 'tag', value: 'Globalization' }, + { type: 'tag', value: 'EmergingMarkets' }, ], - date: "2023-06-18", + date: '2023-06-18', likes: 115, dislikes: 3, comments: 40, views: 4000, author: { - name: "Kıvanç", - surname: "Karaman", - username: "kivanc_karaman", - avatar: "https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg", + name: 'Kıvanç', + surname: 'Karaman', + username: 'kivanc_karaman', + avatar: + 'https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg', }, }, { id: 11, - title: "Diversification: Reducing Risk in Your Portfolio", + title: 'Diversification: Reducing Risk in Your Portfolio', content: [ { - type: "text", + type: 'text', value: - "Diversification is the cornerstone of risk management in investing.", + 'Diversification is the cornerstone of risk management in investing.', }, - { type: "tag", value: "Diversification" }, - { type: "tag", value: "Investing" }, + { type: 'tag', value: 'Diversification' }, + { type: 'tag', value: 'Investing' }, ], - date: "2023-08-17", + date: '2023-08-17', likes: 250, dislikes: 9, comments: 100, views: 9400, author: { - name: "Warren", - surname: "Buffet", - username: "warrenbuffet", - avatar: "https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg", + name: 'Warren', + surname: 'Buffet', + username: 'warrenbuffet', + avatar: + 'https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg', }, }, { id: 12, - title: "Why Value Investing Always Wins", + title: 'Why Value Investing Always Wins', content: [ { - type: "text", + type: 'text', value: "Value investing outperforms because it focuses on companies' intrinsic worth.", }, - { type: "tag", value: "ValueInvesting" }, - { type: "tag", value: "Markets" }, + { type: 'tag', value: 'ValueInvesting' }, + { type: 'tag', value: 'Markets' }, ], - date: "2023-09-30", + date: '2023-09-30', likes: 300, dislikes: 12, comments: 150, views: 12000, author: { - name: "Warren", - surname: "Buffet", - username: "warrenbuffet", - avatar: "https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg", + name: 'Warren', + surname: 'Buffet', + username: 'warrenbuffet', + avatar: + 'https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg', }, }, ], }, { id: 4, - title: "Sustainability And Green Finance", - totalPosts:4, - totalFollowers:103231, - totalPeople:123000, + title: 'Sustainability And Green Finance', + totalPosts: 4, + totalFollowers: 103231, + totalPeople: 123000, posts: [ { id: 13, - title: "The future of renewable energy investments", + title: 'The future of renewable energy investments', content: [ { - type: "text", + type: 'text', value: - "Investing in renewable energy sources is seen as a key driver for sustainable economic growth in the coming decades.", + 'Investing in renewable energy sources is seen as a key driver for sustainable economic growth in the coming decades.', }, - { type: "tag", value: "RenewableEnergy" }, - { type: "tag", value: "Investments" }, + { type: 'tag', value: 'RenewableEnergy' }, + { type: 'tag', value: 'Investments' }, ], - date: "2023-09-22", + date: '2023-09-22', likes: 95, dislikes: 3, comments: 55, views: 4100, author: { - name: "Daron", - surname: "Acemoglu", - avatar: "https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd", - username: "daronnacemoglu", + name: 'Daron', + surname: 'Acemoglu', + avatar: + 'https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd', + username: 'daronnacemoglu', }, }, { id: 14, - title: "The Rise of Green Finance", + title: 'The Rise of Green Finance', content: [ { - type: "text", + type: 'text', value: - "Green finance is transforming how we approach investments, focusing on sustainability.", + 'Green finance is transforming how we approach investments, focusing on sustainability.', }, - { type: "tag", value: "GreenFinance" }, - { type: "tag", value: "Sustainability" }, + { type: 'tag', value: 'GreenFinance' }, + { type: 'tag', value: 'Sustainability' }, ], - date: "2023-09-14", + date: '2023-09-14', likes: 75, dislikes: 2, comments: 40, views: 2500, author: { - name: "Gulsen", - surname: "Sabak", - username: "gulsensabak", - avatar: "https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs", + name: 'Gulsen', + surname: 'Sabak', + username: 'gulsensabak', + avatar: + 'https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs', }, }, { id: 15, - title: "The Power of Long-Term Investment", + title: 'The Power of Long-Term Investment', content: [ { - type: "text", + type: 'text', value: - "Successful investing requires patience and a long-term view. This is especially true for sustainable projects.", + 'Successful investing requires patience and a long-term view. This is especially true for sustainable projects.', }, - { type: "tag", value: "Sustainability" }, - { type: "tag", value: "LongTermInvestment" }, + { type: 'tag', value: 'Sustainability' }, + { type: 'tag', value: 'LongTermInvestment' }, ], - date: "2023-01-20", + date: '2023-01-20', likes: 210, dislikes: 3, comments: 120, views: 8000, author: { - name: "Warren", - surname: "Buffet", - username: "warrenbuffet", - avatar: "https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg", + name: 'Warren', + surname: 'Buffet', + username: 'warrenbuffet', + avatar: + 'https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg', }, }, { id: 16, - title: "Income Inequality: A Threat to Economic Stability", + title: 'Income Inequality: A Threat to Economic Stability', content: [ { - type: "text", + type: 'text', value: - "Rising income inequality can destabilize economies and hinder sustainable development.", + 'Rising income inequality can destabilize economies and hinder sustainable development.', }, - { type: "tag", value: "Sustainability" }, - { type: "tag", value: "IncomeInequality" }, + { type: 'tag', value: 'Sustainability' }, + { type: 'tag', value: 'IncomeInequality' }, ], - date: "2023-10-05", + date: '2023-10-05', likes: 95, dislikes: 5, comments: 50, views: 3300, author: { - name: "Kıvanç", - surname: "Karaman", - username: "kivanc_karaman", - avatar: "https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg", + name: 'Kıvanç', + surname: 'Karaman', + username: 'kivanc_karaman', + avatar: + 'https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg', }, }, ], }, -]; +] + +export default allSubforums diff --git a/mobile/tradeverse/mock-data/all-tags.js b/mobile/tradeverse/mock-data/all-tags.js index c523f57b..ccc2eb21 100644 --- a/mobile/tradeverse/mock-data/all-tags.js +++ b/mobile/tradeverse/mock-data/all-tags.js @@ -1,314 +1,316 @@ -export const allTags = [ +const allTags = [ { id: 1, - label: "Investments", + label: 'Investments', posts: 3213, people: 134, }, { id: 2, - label: "Cryptocurrency", + label: 'Cryptocurrency', posts: 5871, people: 257, }, { id: 3, - label: "RealEstate", + label: 'RealEstate', posts: 2459, people: 98, }, { id: 4, - label: "Stocks", + label: 'Stocks', posts: 7654, people: 312, }, { id: 5, - label: "Bonds", + label: 'Bonds', posts: 1492, people: 58, }, { id: 6, - label: "Commodities", + label: 'Commodities', posts: 1893, people: 76, }, { id: 7, - label: "Gold&Silver", + label: 'Gold&Silver', posts: 1324, people: 43, }, { id: 8, - label: "PensionPlans", + label: 'PensionPlans', posts: 1021, people: 56, }, { id: 9, - label: "PersonalFinance", + label: 'PersonalFinance', posts: 9847, people: 431, }, { id: 10, - label: "Budgeting", + label: 'Budgeting', posts: 4035, people: 187, }, { id: 11, - label: "Savings", + label: 'Savings', posts: 6578, people: 224, }, { id: 12, - label: "DebtManagement", + label: 'DebtManagement', posts: 3121, people: 143, }, { id: 13, - label: "Taxes", + label: 'Taxes', posts: 2754, people: 97, }, { id: 14, - label: "Retirement", + label: 'Retirement', posts: 3541, people: 126, }, { id: 15, - label: "Insurance", + label: 'Insurance', posts: 1932, people: 81, }, { id: 16, - label: "FinancialPlanning", + label: 'FinancialPlanning', posts: 4345, people: 212, }, { id: 17, - label: "WealthManagement", + label: 'WealthManagement', posts: 2871, people: 109, }, { id: 18, - label: "InvestmentStrategies", + label: 'InvestmentStrategies', posts: 5128, people: 183, }, { id: 19, - label: "TaxOptimization", + label: 'TaxOptimization', posts: 1832, people: 63, }, { id: 20, - label: "StockMarket", + label: 'StockMarket', posts: 9125, people: 378, }, { id: 21, - label: "ETF", + label: 'ETF', posts: 2741, people: 89, }, { id: 22, - label: "MutualFunds", + label: 'MutualFunds', posts: 3524, people: 123, }, { id: 23, - label: "HedgeFunds", + label: 'HedgeFunds', posts: 1987, people: 72, }, { id: 24, - label: "IndexFunds", + label: 'IndexFunds', posts: 2473, people: 84, }, { id: 25, - label: "ForexTrading", + label: 'ForexTrading', posts: 5648, people: 275, }, { id: 26, - label: "OptionsTrading", + label: 'OptionsTrading', posts: 2349, people: 110, }, { id: 27, - label: "FuturesTrading", + label: 'FuturesTrading', posts: 1287, people: 58, }, { id: 28, - label: "RealEstateInvestmentTrusts(REITs)", + label: 'RealEstateInvestmentTrusts(REITs)', posts: 1348, people: 49, }, { id: 29, - label: "DividendInvesting", + label: 'DividendInvesting', posts: 4523, people: 198, }, { id: 30, - label: "ValueInvesting", + label: 'ValueInvesting', posts: 3256, people: 139, }, { id: 31, - label: "GrowthInvesting", + label: 'GrowthInvesting', posts: 4129, people: 162, }, { id: 32, - label: "VentureCapital", + label: 'VentureCapital', posts: 1578, people: 61, }, { id: 33, - label: "AngelInvesting", + label: 'AngelInvesting', posts: 1432, people: 54, }, { id: 34, - label: "Crowdfunding", + label: 'Crowdfunding', posts: 1945, people: 72, }, { id: 35, - label: "Peer-to-PeerLending", + label: 'Peer-to-PeerLending', posts: 2187, people: 80, }, { id: 36, - label: "SavingsAccounts", + label: 'SavingsAccounts', posts: 1679, people: 67, }, { id: 37, - label: "CreditCards", + label: 'CreditCards', posts: 2983, people: 109, }, { id: 38, - label: "Loans", + label: 'Loans', posts: 3211, people: 118, }, { id: 39, - label: "Mortgage", + label: 'Mortgage', posts: 2746, people: 105, }, { id: 40, - label: "AutoLoans", + label: 'AutoLoans', posts: 1847, people: 69, }, { id: 41, - label: "StudentLoans", + label: 'StudentLoans', posts: 2412, people: 88, }, { id: 42, - label: "EmergencyFunds", + label: 'EmergencyFunds', posts: 1564, people: 58, }, { id: 43, - label: "FinancialIndependence", + label: 'FinancialIndependence', posts: 3724, people: 135, }, { id: 44, - label: "EarlyRetirement", + label: 'EarlyRetirement', posts: 2941, people: 116, }, { id: 45, - label: "FIREMovement", + label: 'FIREMovement', posts: 2132, people: 77, }, { id: 46, - label: "SideHustles", + label: 'SideHustles', posts: 4357, people: 196, }, { id: 47, - label: "Freelancing", + label: 'Freelancing', posts: 4892, people: 221, }, { id: 48, - label: "PassiveIncome", + label: 'PassiveIncome', posts: 5764, people: 243, }, { id: 49, - label: "SmallBusiness", + label: 'SmallBusiness', posts: 3921, people: 184, }, { id: 50, - label: "Entrepreneurship", + label: 'Entrepreneurship', posts: 6541, people: 267, }, { id: 51, - label: "MicroEconomy", + label: 'MicroEconomy', posts: 4321, people: 189, }, { id: 52, - label: "CryptoEconomy", + label: 'CryptoEconomy', posts: 5432, people: 198, }, -]; +] + +export default allTags diff --git a/mobile/tradeverse/mock-data/all-users.js b/mobile/tradeverse/mock-data/all-users.js index b82bb577..90015fe0 100644 --- a/mobile/tradeverse/mock-data/all-users.js +++ b/mobile/tradeverse/mock-data/all-users.js @@ -1,44 +1,49 @@ -export const allUsers = [ +const allUsers = [ { - name: "Daron", - surname: "Acemoglu", - username: "daronnacemoglu", + name: 'Daron', + surname: 'Acemoglu', + username: 'daronnacemoglu', avatar: - "https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd", + 'https://mitsloan.mit.edu/sites/default/files/styles/profile_detail_headshot/public/profile-images/2024/06/19/profile-image-61349.jpeg?h=fbf7a813&itok=Iwywgvzd', followers: 150000, posts: 205, postList: [4, 5, 9, 13], - followedUsers: ["warrenbuffet", "gulsensabak"], + followedUsers: ['warrenbuffet', 'gulsensabak'], }, { - name: "Gulsen", - surname: "Sabak", - username: "gulsensabak", - avatar: "https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs", + name: 'Gulsen', + surname: 'Sabak', + username: 'gulsensabak', + avatar: + 'https://media.licdn.com/dms/image/v2/D4D03AQGTfgK0m3eIFw/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1724777725675?e=1735171200&v=beta&t=tS9Smt7QoMB-GsvxoruAiPItiRKgJrQo8-xSdgWrYfs', followers: 85000, posts: 178, postList: [1, 2, 14], - followedUsers: ["daronnacemoglu", "warrenbuffet"], + followedUsers: ['daronnacemoglu', 'warrenbuffet'], }, { - name: "Kivanc", - surname: "Karaman", - username: "kivanc_karaman", - avatar: "https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg", + name: 'Kivanc', + surname: 'Karaman', + username: 'kivanc_karaman', + avatar: + 'https://pbs.twimg.com/profile_images/1495045642472861698/HUMUox6W_400x400.jpg', followers: 60000, posts: 124, postList: [6, 7, 10, 16], - followedUsers: ["daronnacemoglu", "gulsensabak"], + followedUsers: ['daronnacemoglu', 'gulsensabak'], }, { - name: "Warren", - surname: "Buffet", - username: "warrenbuffet", - avatar: "https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg", + name: 'Warren', + surname: 'Buffet', + username: 'warrenbuffet', + avatar: + 'https://i.gazeteoksijen.com/storage/files/images/2024/06/29/warren-buffett-vasiyetini-acikladi-gates-vakfina-para-yok-j4wu.jpg', followers: 450000, posts: 310, postList: [11, 3, 15, 12, 8], - followedUsers: ["daronnacemoglu", "kivanc_karaman"], + followedUsers: ['daronnacemoglu', 'kivanc_karaman'], }, -]; +] + +export default allUsers diff --git a/mobile/tradeverse/mock-services/assets.js b/mobile/tradeverse/mock-services/assets.js index b70c5115..28dab736 100644 --- a/mobile/tradeverse/mock-services/assets.js +++ b/mobile/tradeverse/mock-services/assets.js @@ -1,14 +1,15 @@ -import { allAssets } from "../mock-data/all-assets"; +import allAssets from '../mock-data/all-assets' + export const searchAssets = (searchTerm) => { if (!searchTerm) { - return allAssets; + return allAssets } - return allAssets.filter((asset) => - asset.label.toLowerCase().includes(searchTerm.toLowerCase()) || - asset.abbreviation.toLowerCase().includes(searchTerm.toLowerCase()) - ); -}; - -export const getAssetById = (assetId) => { - return allAssets.find((asset) => asset.id == assetId); + return allAssets.filter( + (asset) => + asset.label.toLowerCase().includes(searchTerm.toLowerCase()) || + asset.abbreviation.toLowerCase().includes(searchTerm.toLowerCase()) + ) } + +export const getAssetById = (assetId) => + allAssets.find((asset) => asset.id == assetId) diff --git a/mobile/tradeverse/mock-services/explore.js b/mobile/tradeverse/mock-services/explore.js index da09f222..9acba7bc 100644 --- a/mobile/tradeverse/mock-services/explore.js +++ b/mobile/tradeverse/mock-services/explore.js @@ -1,19 +1,19 @@ -import { searchAssets } from "./assets"; -import { searchPosts } from "./post"; -import { searchSubforums } from "./subforums"; -import { searchTags } from "./tags"; -import { searchUsers } from "./users"; +import { searchAssets } from './assets' +import { searchPosts } from './post' +import { searchSubforums } from './subforums' +import searchTags from './tags' +import { searchUsers } from './users' export const getExploreFeed = () => { - const allPosts = searchPosts(""); + const allPosts = searchPosts('') return { popular: allPosts.slice(0, 8), recent: allPosts.slice(8, 16), - }; -}; + } +} export const searchOnExplore = (searchTerm) => { - const allPosts = searchPosts(searchTerm); + const allPosts = searchPosts(searchTerm) return { popular: allPosts.slice(0, 12), assets: searchAssets(searchTerm), @@ -21,5 +21,5 @@ export const searchOnExplore = (searchTerm) => { subforums: searchSubforums(searchTerm), posts: searchPosts(searchTerm), users: searchUsers(searchTerm), - }; -}; + } +} diff --git a/mobile/tradeverse/mock-services/home.js b/mobile/tradeverse/mock-services/home.js index fea52a54..8613b58c 100644 --- a/mobile/tradeverse/mock-services/home.js +++ b/mobile/tradeverse/mock-services/home.js @@ -1,15 +1,15 @@ -import { searchPosts } from "./post"; +import { searchPosts } from './post' -export const getHomeFeed = () => { - const allPosts = searchPosts(""); +export default function getHomeFeed() { + const allPosts = searchPosts('') - const forYouPosts = allPosts.slice(0, 4); - const followedTopicsPosts = allPosts.slice(4, 7); - const followedPeoplePosts = allPosts.slice(7, 15); + const forYouPosts = allPosts.slice(0, 4) + const followedTopicsPosts = allPosts.slice(4, 7) + const followedPeoplePosts = allPosts.slice(7, 15) return { forYouPosts, followedTopicsPosts, followedPeoplePosts, - }; -}; + } +} diff --git a/mobile/tradeverse/mock-services/post.js b/mobile/tradeverse/mock-services/post.js index 7f924f72..ae0b2f45 100644 --- a/mobile/tradeverse/mock-services/post.js +++ b/mobile/tradeverse/mock-services/post.js @@ -1,29 +1,28 @@ -import { allSubforums } from "../mock-data/all-subforums"; +import allSubforums from '../mock-data/all-subforums' -const _getAllPosts = () => { - return allSubforums.reduce((acc, sforum) => { - return acc.concat( - sforum.posts.map((post) => ({ - ...post, - subforum: { id: sforum.id, title: sforum.title }, - })) - ); - }, []); -}; +const _getAllPosts = () => + allSubforums.reduce( + (acc, sforum) => + acc.concat( + sforum.posts.map((post) => ({ + ...post, + subforum: { id: sforum.id, title: sforum.title }, + })) + ), + [] + ) -export const getPostById = (postId) => { - return _getAllPosts().find((post) => post.id == postId); -}; +export const getPostById = (postId) => + _getAllPosts().find((post) => post.id == postId) export const searchPosts = (searchTerm) => { if (!searchTerm) { - return _getAllPosts(); + return _getAllPosts() } return _getAllPosts().filter((post) => post.title.toLowerCase().includes(searchTerm.toLowerCase()) - ); -}; + ) +} -export const getPostsByUser = (uName) => { - return _getAllPosts().filter((post) => post.author.username === uName); -}; +export const getPostsByUser = (uName) => + _getAllPosts().filter((post) => post.author.username === uName) diff --git a/mobile/tradeverse/mock-services/subforums.js b/mobile/tradeverse/mock-services/subforums.js index 11b59929..06247396 100644 --- a/mobile/tradeverse/mock-services/subforums.js +++ b/mobile/tradeverse/mock-services/subforums.js @@ -1,13 +1,13 @@ -import { allSubforums } from "../mock-data/all-subforums"; +import allSubforums from '../mock-data/all-subforums' + export const searchSubforums = (searchTerm) => { if (!searchTerm) { - return allSubforums; + return allSubforums } return allSubforums.filter((subforum) => subforum.title.toLowerCase().includes(searchTerm.toLowerCase()) - ); -}; + ) +} -export const getSubForumById = (subforumId) => { - return allSubforums.find((subforum) => subforum.id == subforumId); -}; +export const getSubForumById = (subforumId) => + allSubforums.find((subforum) => subforum.id == subforumId) diff --git a/mobile/tradeverse/mock-services/tags.js b/mobile/tradeverse/mock-services/tags.js index b5712ad0..1dda3124 100644 --- a/mobile/tradeverse/mock-services/tags.js +++ b/mobile/tradeverse/mock-services/tags.js @@ -1,11 +1,11 @@ -import { allTags } from "../mock-data/all-tags"; +import allTags from '../mock-data/all-tags' -export const searchTags = (searchKey) => { +export default function searchTags(searchKey) { if (!searchKey) { - return allTags; + return allTags } return allTags.filter((tag) => tag.label.toLowerCase().includes(searchKey.toLowerCase()) - ); -}; + ) +} diff --git a/mobile/tradeverse/mock-services/users.js b/mobile/tradeverse/mock-services/users.js index c29179c0..a4d5a9a5 100644 --- a/mobile/tradeverse/mock-services/users.js +++ b/mobile/tradeverse/mock-services/users.js @@ -1,25 +1,21 @@ -import { allSubforums } from "../mock-data/all-subforums"; -import { getAllPosts, getPostsByUser } from "./post"; -import { allUsers } from "../mock-data/all-users"; +import { getPostsByUser } from './post' +import allUsers from '../mock-data/all-users' -export const getAllUsers = () => { - return allUsers; -}; +export const getAllUsers = () => allUsers -export const getUserByUsername = (uName='') => { - if(!uName) return null; - const user = allUsers.find((user) => user.username == uName); +export const getUserByUsername = (uName = '') => { + if (!uName) return null + const user = allUsers.find((u) => u.username == uName) return { ...user, posts: getPostsByUser(uName), - }; -}; + } +} -export const searchUsers = (searchTerm) => { - return allUsers.filter( +export const searchUsers = (searchTerm) => + allUsers.filter( (user) => user.username.toLowerCase().includes(searchTerm.toLowerCase()) || user.name.toLowerCase().includes(searchTerm.toLowerCase()) || user.surname.toLowerCase().includes(searchTerm.toLowerCase()) - ); -}; + ) diff --git a/mobile/tradeverse/package-lock.json b/mobile/tradeverse/package-lock.json index ef083c7b..ee325a39 100644 --- a/mobile/tradeverse/package-lock.json +++ b/mobile/tradeverse/package-lock.json @@ -15,6 +15,9 @@ "@react-navigation/native": "^6.0.2", "@tabler/icons-react-native": "^3.19.0", "axios": "^1.7.7", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-react-hooks": "^5.0.0", "expo": "~51.0.28", "expo-font": "~12.0.9", "expo-image-picker": "^15.0.7", @@ -38,8 +41,16 @@ "devDependencies": { "@babel/core": "^7.20.0", "@types/react": "~18.2.45", + "babel-plugin-module-resolver": "^5.0.2", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-import-resolver-babel-module": "^5.3.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", "jest": "^29.2.1", "jest-expo": "~51.0.3", + "prettier": "^3.3.3", "react-test-renderer": "18.2.0", "typescript": "~5.3.3" } @@ -130,19 +141,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", - "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", @@ -413,85 +411,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", - "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", - "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", - "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", - "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", - "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", @@ -656,18 +575,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "peer": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -771,25 +678,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", - "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -948,22 +841,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", @@ -978,23 +855,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", - "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", @@ -1011,21 +871,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", - "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", @@ -1040,38 +885,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", - "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", - "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-transform-classes": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", @@ -1120,13 +933,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", - "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", - "peer": true, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { @@ -1136,13 +947,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", - "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz", + "integrity": "sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-flow": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1151,27 +962,26 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "node_modules/@babel/plugin-transform-function-name": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", - "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", - "peer": true, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1182,14 +992,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { + "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", - "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1198,27 +1008,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", - "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz", - "integrity": "sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-flow": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1227,14 +1037,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", - "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", - "peer": true, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dependencies": { + "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1243,14 +1053,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", - "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1259,11 +1068,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", - "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", - "peer": true, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1274,11 +1082,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { + "node_modules/@babel/plugin-transform-private-methods": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", - "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { @@ -1288,12 +1097,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", - "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { @@ -1303,11 +1113,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { + "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", - "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", + "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1318,14 +1127,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { + "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", - "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@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" }, "engines": { "node": ">=6.9.0" @@ -1334,32 +1145,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { + "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", - "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", + "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", - "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", - "peer": true, - "dependencies": { - "@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-react-jsx": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1368,13 +1159,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", - "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", + "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { @@ -1384,27 +1173,26 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", + "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { + "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", - "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", + "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { @@ -1414,12 +1202,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", - "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", + "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@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" }, "engines": { "node": ">=6.9.0" @@ -1428,11 +1221,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", - "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", - "peer": true, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1443,14 +1235,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", - "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-transform-parameters": "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1459,14 +1250,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { + "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", - "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1475,11 +1264,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", - "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", - "peer": true, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1490,13 +1278,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", - "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", "dependencies": { + "@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/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1505,11 +1296,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { + "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", - "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { @@ -1519,13 +1311,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-methods": { + "node_modules/@babel/preset-flow": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", - "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.7.tgz", + "integrity": "sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-transform-flow-strip-types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1534,14 +1327,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", - "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", + "node_modules/@babel/preset-react": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.7.tgz", + "integrity": "sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==", "dependencies": { - "@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-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" }, "engines": { "node": ">=6.9.0" @@ -1550,13 +1346,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { + "node_modules/@babel/preset-typescript": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", - "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.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" }, "engines": { "node": ">=6.9.0" @@ -1565,12 +1364,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { + "node_modules/@babel/register": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", - "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.7.tgz", + "integrity": "sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" }, "engines": { "node": ">=6.9.0" @@ -1579,629 +1382,679 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", - "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dependencies": { - "@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" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/runtime": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", - "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.7" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { + "node_modules/@babel/template": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", - "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { + "node_modules/@babel/traverse": { "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", - "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@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" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", - "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", + "node_modules/@babel/types": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", - "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", - "peer": true, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "regenerator-transform": "^0.15.2" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", - "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", - "peer": true, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", - "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "@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" - }, - "engines": { - "node": ">=6.9.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", - "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", - "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", - "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "argparse": "^2.0.1" }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", - "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", - "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", - "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", + "node_modules/@expo/bunyan": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", + "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", "dependencies": { - "@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" + "uuid": "^8.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", - "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", - "peer": true, + "node_modules/@expo/cli": { + "version": "0.18.30", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.30.tgz", + "integrity": "sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/runtime": "^7.20.0", + "@expo/code-signing-certificates": "0.0.5", + "@expo/config": "~9.0.0-beta.0", + "@expo/config-plugins": "~8.0.8", + "@expo/devcert": "^1.0.0", + "@expo/env": "~0.3.0", + "@expo/image-utils": "^0.5.0", + "@expo/json-file": "^8.3.0", + "@expo/metro-config": "0.18.11", + "@expo/osascript": "^2.0.31", + "@expo/package-manager": "^1.5.0", + "@expo/plist": "^0.1.0", + "@expo/prebuild-config": "7.0.9", + "@expo/rudder-sdk-node": "1.1.1", + "@expo/spawn-async": "^1.7.2", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.74.85", + "@urql/core": "2.3.6", + "@urql/exchange-retry": "0.3.0", + "accepts": "^1.3.8", + "arg": "5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.0.7", + "bplist-parser": "^0.3.1", + "cacache": "^18.0.2", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "fast-glob": "^3.3.2", + "find-yarn-workspace-root": "~2.0.0", + "form-data": "^3.0.1", + "freeport-async": "2.0.0", + "fs-extra": "~8.1.0", + "getenv": "^1.0.0", + "glob": "^7.1.7", + "graphql": "15.8.0", + "graphql-tag": "^2.10.1", + "https-proxy-agent": "^5.0.1", + "internal-ip": "4.3.0", + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1", + "js-yaml": "^3.13.1", + "json-schema-deref-sync": "^0.13.0", + "lodash.debounce": "^4.0.8", + "md5hex": "^1.0.0", + "minimatch": "^3.0.4", + "node-fetch": "^2.6.7", + "node-forge": "^1.3.1", + "npm-package-arg": "^7.0.0", + "open": "^8.3.0", + "ora": "3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "5.6.0", + "progress": "2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.2", + "semver": "^7.6.0", + "send": "^0.18.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^6.0.5", + "temp-dir": "^2.0.0", + "tempy": "^0.7.1", + "terminal-link": "^2.1.1", + "text-table": "^0.2.0", + "url-join": "4.0.0", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "expo-internal": "build/bin/cli" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", - "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", - "peer": true, + "node_modules/@expo/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", - "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", + "node_modules/@expo/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", - "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", - "peer": true, + "node_modules/@expo/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=7.0.0" } }, - "node_modules/@babel/preset-env": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", - "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.25.8", - "@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-import-assertions": "^7.25.7", - "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.8", - "@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.8", - "@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.8", - "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.8", - "@babel/plugin-transform-for-of": "^7.25.7", - "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.8", - "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", - "@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.8", - "@babel/plugin-transform-numeric-separator": "^7.25.8", - "@babel/plugin-transform-object-rest-spread": "^7.25.8", - "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.8", - "@babel/plugin-transform-optional-chaining": "^7.25.8", - "@babel/plugin-transform-parameters": "^7.25.7", - "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.8", - "@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.38.1", - "semver": "^6.3.1" - }, + "node_modules/@expo/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@expo/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=6.9.0" + "node": ">=8" + } + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "node_modules/@babel/preset-flow": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.7.tgz", - "integrity": "sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==", + "node_modules/@expo/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-transform-flow-strip-types": "^7.25.7" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "peer": true, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" } }, - "node_modules/@babel/preset-react": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.7.tgz", - "integrity": "sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==", + "node_modules/@expo/config": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.4.tgz", + "integrity": "sha512-g5ns5u1JSKudHYhjo1zaSfkJ/iZIcWmUmIQptMJZ6ag1C0ShL2sj8qdfU8MmAMuKLOgcIfSaiWlQnm4X3VJVkg==", "dependencies": { - "@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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~8.0.8", + "@expo/config-types": "^51.0.3", + "@expo/json-file": "^8.3.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "3.34.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", - "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", + "node_modules/@expo/config-plugins": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.10.tgz", + "integrity": "sha512-KG1fnSKRmsudPU9BWkl59PyE0byrE2HTnqbOrgwr2FAhqh7tfr9nRs6A9oLS/ntpGzmFxccTEcsV0L4apsuxxg==", "dependencies": { - "@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" + "@expo/config-types": "^51.0.3", + "@expo/json-file": "~8.3.0", + "@expo/plist": "^0.1.0", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.1", + "find-up": "~5.0.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/register": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.7.tgz", - "integrity": "sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==", + "node_modules/@expo/config-plugins/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/@expo/config-plugins/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } + "node_modules/@expo/config-plugins/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "node_modules/@expo/config-plugins/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { - "regenerator-runtime": "^0.14.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" - }, + "node_modules/@expo/config-plugins/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "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" + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "node_modules/@expo/config-plugins/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "node_modules/@expo/config-types": { + "version": "51.0.3", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", + "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==" }, - "node_modules/@expo/bunyan": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", - "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", - "dependencies": { - "uuid": "^8.0.0" + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/cli": { - "version": "0.18.30", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.30.tgz", - "integrity": "sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg==", + "node_modules/@expo/config/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/devcert": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.4.tgz", + "integrity": "sha512-fqBODr8c72+gBSX5Ty3SIzaY4bXainlpab78+vEYEKL3fXmsOswMLf0+KE36mUEAa36BYabX7K3EiXOXX5OPMw==", "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/code-signing-certificates": "0.0.5", - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.8", - "@expo/devcert": "^1.0.0", - "@expo/env": "~0.3.0", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@expo/metro-config": "0.18.11", - "@expo/osascript": "^2.0.31", - "@expo/package-manager": "^1.5.0", - "@expo/plist": "^0.1.0", - "@expo/prebuild-config": "7.0.9", - "@expo/rudder-sdk-node": "1.1.1", - "@expo/spawn-async": "^1.7.2", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.74.85", - "@urql/core": "2.3.6", - "@urql/exchange-retry": "0.3.0", - "accepts": "^1.3.8", - "arg": "5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.0.7", - "bplist-parser": "^0.3.1", - "cacache": "^18.0.2", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "fast-glob": "^3.3.2", - "find-yarn-workspace-root": "~2.0.0", - "form-data": "^3.0.1", - "freeport-async": "2.0.0", - "fs-extra": "~8.1.0", - "getenv": "^1.0.0", - "glob": "^7.1.7", - "graphql": "15.8.0", - "graphql-tag": "^2.10.1", - "https-proxy-agent": "^5.0.1", - "internal-ip": "4.3.0", - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1", - "js-yaml": "^3.13.1", - "json-schema-deref-sync": "^0.13.0", - "lodash.debounce": "^4.0.8", - "md5hex": "^1.0.0", - "minimatch": "^3.0.4", - "node-fetch": "^2.6.7", - "node-forge": "^1.3.1", - "npm-package-arg": "^7.0.0", - "open": "^8.3.0", - "ora": "3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "5.6.0", - "progress": "2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.2", - "semver": "^7.6.0", - "send": "^0.18.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^6.0.5", - "temp-dir": "^2.0.0", - "tempy": "^0.7.1", - "terminal-link": "^2.1.1", - "text-table": "^0.2.0", - "url-join": "4.0.0", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" + "application-config-path": "^0.1.0", + "command-exists": "^1.2.4", + "debug": "^3.1.0", + "eol": "^0.9.1", + "get-port": "^3.2.0", + "glob": "^10.4.2", + "lodash": "^4.17.21", + "mkdirp": "^0.5.1", + "password-prompt": "^1.0.4", + "sudo-prompt": "^8.2.0", + "tmp": "^0.0.33", + "tslib": "^2.4.0" + } + }, + "node_modules/@expo/devcert/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/devcert/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { - "expo-internal": "build/bin/cli" + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/cli/node_modules/ansi-styles": { + "node_modules/@expo/devcert/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/env": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.3.0.tgz", + "integrity": "sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^1.0.0" + } + }, + "node_modules/@expo/env/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2215,7 +2068,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/cli/node_modules/chalk": { + "node_modules/@expo/env/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2230,7 +2083,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/cli/node_modules/color-convert": { + "node_modules/@expo/env/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2241,12 +2094,12 @@ "node": ">=7.0.0" } }, - "node_modules/@expo/cli/node_modules/color-name": { + "node_modules/@expo/env/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@expo/cli/node_modules/has-flag": { + "node_modules/@expo/env/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2254,18 +2107,7 @@ "node": ">=8" } }, - "node_modules/@expo/cli/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/cli/node_modules/supports-color": { + "node_modules/@expo/env/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2276,56 +2118,24 @@ "node": ">=8" } }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", - "dependencies": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" - } - }, - "node_modules/@expo/config": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.4.tgz", - "integrity": "sha512-g5ns5u1JSKudHYhjo1zaSfkJ/iZIcWmUmIQptMJZ6ag1C0ShL2sj8qdfU8MmAMuKLOgcIfSaiWlQnm4X3VJVkg==", + "node_modules/@expo/image-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz", + "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==", "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~8.0.8", - "@expo/config-types": "^51.0.3", - "@expo/json-file": "^8.3.0", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "fs-extra": "9.0.0", "getenv": "^1.0.0", - "glob": "7.1.6", - "require-from-string": "^2.0.2", + "jimp-compact": "0.16.1", + "node-fetch": "^2.6.0", + "parse-png": "^2.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.34.0" + "tempy": "0.3.0" } }, - "node_modules/@expo/config-plugins": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.10.tgz", - "integrity": "sha512-KG1fnSKRmsudPU9BWkl59PyE0byrE2HTnqbOrgwr2FAhqh7tfr9nRs6A9oLS/ntpGzmFxccTEcsV0L4apsuxxg==", - "dependencies": { - "@expo/config-types": "^51.0.3", - "@expo/json-file": "~8.3.0", - "@expo/plist": "^0.1.0", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.1", - "find-up": "~5.0.0", - "getenv": "^1.0.0", - "glob": "7.1.6", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/config-plugins/node_modules/ansi-styles": { + "node_modules/@expo/image-utils/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2339,7 +2149,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/config-plugins/node_modules/chalk": { + "node_modules/@expo/image-utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2354,7 +2164,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/config-plugins/node_modules/color-convert": { + "node_modules/@expo/image-utils/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2365,32 +2175,34 @@ "node": ">=7.0.0" } }, - "node_modules/@expo/config-plugins/node_modules/color-name": { + "node_modules/@expo/image-utils/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@expo/config-plugins/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/@expo/image-utils/node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/@expo/config-plugins/node_modules/has-flag": { + "node_modules/@expo/image-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2398,7 +2210,26 @@ "node": ">=8" } }, - "node_modules/@expo/config-plugins/node_modules/semver": { + "node_modules/@expo/image-utils/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/image-utils/node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -2409,7 +2240,7 @@ "node": ">=10" } }, - "node_modules/@expo/config-plugins/node_modules/supports-color": { + "node_modules/@expo/image-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2420,131 +2251,98 @@ "node": ">=8" } }, - "node_modules/@expo/config-types": { - "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==" - }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dependencies": { - "@babel/highlight": "^7.10.4" + "node_modules/@expo/image-utils/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "engines": { + "node": ">=4" } }, - "node_modules/@expo/config/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/@expo/image-utils/node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/@expo/config/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@expo/image-utils/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/devcert": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.4.tgz", - "integrity": "sha512-fqBODr8c72+gBSX5Ty3SIzaY4bXainlpab78+vEYEKL3fXmsOswMLf0+KE36mUEAa36BYabX7K3EiXOXX5OPMw==", - "dependencies": { - "application-config-path": "^0.1.0", - "command-exists": "^1.2.4", - "debug": "^3.1.0", - "eol": "^0.9.1", - "get-port": "^3.2.0", - "glob": "^10.4.2", - "lodash": "^4.17.21", - "mkdirp": "^0.5.1", - "password-prompt": "^1.0.4", - "sudo-prompt": "^8.2.0", - "tmp": "^0.0.33", - "tslib": "^2.4.0" + "node": ">=6" } }, - "node_modules/@expo/devcert/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@expo/image-utils/node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", "dependencies": { - "balanced-match": "^1.0.0" + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node_modules/@expo/image-utils/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@expo/devcert/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@expo/json-file": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz", + "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.2", + "write-file-atomic": "^2.3.0" } }, - "node_modules/@expo/devcert/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@babel/highlight": "^7.10.4" } }, - "node_modules/@expo/env": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.3.0.tgz", - "integrity": "sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==", + "node_modules/@expo/metro-config": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.11.tgz", + "integrity": "sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==", "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^1.0.0" + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "@expo/config": "~9.0.0-beta.0", + "@expo/env": "~0.3.0", + "@expo/json-file": "~8.3.0", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "find-yarn-workspace-root": "~2.0.0", + "fs-extra": "^9.1.0", + "getenv": "^1.0.0", + "glob": "^7.2.3", + "jsc-safe-url": "^0.2.4", + "lightningcss": "~1.19.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" } }, - "node_modules/@expo/env/node_modules/ansi-styles": { + "node_modules/@expo/metro-config/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2558,7 +2356,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/env/node_modules/chalk": { + "node_modules/@expo/metro-config/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2573,7 +2371,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/env/node_modules/color-convert": { + "node_modules/@expo/metro-config/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2584,12 +2382,26 @@ "node": ">=7.0.0" } }, - "node_modules/@expo/env/node_modules/color-name": { + "node_modules/@expo/metro-config/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@expo/env/node_modules/has-flag": { + "node_modules/@expo/metro-config/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/metro-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2597,7 +2409,18 @@ "node": ">=8" } }, - "node_modules/@expo/env/node_modules/supports-color": { + "node_modules/@expo/metro-config/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/metro-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2608,24 +2431,54 @@ "node": ">=8" } }, - "node_modules/@expo/image-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz", - "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==", + "node_modules/@expo/metro-config/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/metro-runtime": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-3.2.3.tgz", + "integrity": "sha512-v5ji+fAGi7B9YavrxvekuF8gXEV/5fz0+PhaED5AaFDnbGB4IJIbpaiqK9nqZV1axjGZNQSw6Q8TsnFetCR3bQ==", + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/@expo/osascript": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", + "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.5.2.tgz", + "integrity": "sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==", "dependencies": { + "@expo/json-file": "^8.3.0", "@expo/spawn-async": "^1.7.2", + "ansi-regex": "^5.0.0", "chalk": "^4.0.0", - "fs-extra": "9.0.0", - "getenv": "^1.0.0", - "jimp-compact": "0.16.1", - "node-fetch": "^2.6.0", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "tempy": "0.3.0" + "find-up": "^5.0.0", + "find-yarn-workspace-root": "~2.0.0", + "js-yaml": "^3.13.1", + "micromatch": "^4.0.2", + "npm-package-arg": "^7.0.0", + "ora": "^3.4.0", + "split": "^1.0.1", + "sudo-prompt": "9.1.1" } }, - "node_modules/@expo/image-utils/node_modules/ansi-styles": { + "node_modules/@expo/package-manager/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2639,7 +2492,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/image-utils/node_modules/chalk": { + "node_modules/@expo/package-manager/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2654,7 +2507,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/image-utils/node_modules/color-convert": { + "node_modules/@expo/package-manager/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2665,42 +2518,81 @@ "node": ">=7.0.0" } }, - "node_modules/@expo/image-utils/node_modules/color-name": { + "node_modules/@expo/package-manager/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@expo/image-utils/node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "node_modules/@expo/package-manager/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@expo/image-utils/node_modules/fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "node_modules/@expo/package-manager/node_modules/sudo-prompt": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" + }, + "node_modules/@expo/package-manager/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/plist": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz", + "integrity": "sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz", + "integrity": "sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag==", + "dependencies": { + "@expo/config": "~9.0.0-beta.0", + "@expo/config-plugins": "~8.0.8", + "@expo/config-types": "^51.0.3", + "@expo/image-utils": "^0.5.0", + "@expo/json-file": "^8.3.0", + "@react-native/normalize-colors": "0.74.85", + "debug": "^4.3.1", + "fs-extra": "^9.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo-modules-autolinking": ">=0.8.1" + } + }, + "node_modules/@expo/prebuild-config/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@expo/image-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/image-utils/node_modules/jsonfile": { + "node_modules/@expo/prebuild-config/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", @@ -2711,15 +2603,7 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@expo/image-utils/node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@expo/image-utils/node_modules/semver": { + "node_modules/@expo/prebuild-config/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -2730,76 +2614,81 @@ "node": ">=10" } }, - "node_modules/@expo/image-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@expo/prebuild-config/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/rudder-sdk-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", + "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", "dependencies": { - "has-flag": "^4.0.0" + "@expo/bunyan": "^4.0.0", + "@segment/loosely-validate-event": "^2.0.0", + "fetch-retry": "^4.1.1", + "md5": "^2.2.1", + "node-fetch": "^2.6.1", + "remove-trailing-slash": "^0.1.0", + "uuid": "^8.3.2" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@expo/image-utils/node_modules/temp-dir": { + "node_modules/@expo/sdk-runtime-versions": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "engines": { - "node": ">=4" - } + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==" }, - "node_modules/@expo/image-utils/node_modules/tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "node_modules/@expo/server": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@expo/server/-/server-0.4.4.tgz", + "integrity": "sha512-q9ADBzMN5rZ/fgQ2mz5YIJuZ8gelQlhG2CQqToD+UvBLZvbaHCNxTTSs2KI1LzJvAaW5CWgWMatGvGF6iUQ0LA==", "dependencies": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" - }, - "engines": { - "node": ">=8" + "@remix-run/node": "^2.7.2", + "abort-controller": "^3.0.0", + "debug": "^4.3.4", + "source-map-support": "~0.5.21" } }, - "node_modules/@expo/image-utils/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "dependencies": { + "cross-spawn": "^7.0.3" + }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@expo/image-utils/node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "node_modules/@expo/vector-icons": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.0.4.tgz", + "integrity": "sha512-+yKshcbpDfbV4zoXOgHxCwh7lkE9VVTT5T03OUlBsqfze1PLy6Hi4jp1vSb1GVbY6eskvMIivGVc9SKzIv0oEQ==", "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" + "prop-types": "^15.8.1" } }, - "node_modules/@expo/image-utils/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@expo/json-file": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz", - "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==", + "node_modules/@expo/xcpretty": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.1.tgz", + "integrity": "sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==", "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.2", - "write-file-atomic": "^2.3.0" + "@babel/code-frame": "7.10.4", + "chalk": "^4.1.0", + "find-up": "^5.0.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" } }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", @@ -2807,32 +2696,7 @@ "@babel/highlight": "^7.10.4" } }, - "node_modules/@expo/metro-config": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.11.tgz", - "integrity": "sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "@expo/config": "~9.0.0-beta.0", - "@expo/env": "~0.3.0", - "@expo/json-file": "~8.3.0", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "find-yarn-workspace-root": "~2.0.0", - "fs-extra": "^9.1.0", - "getenv": "^1.0.0", - "glob": "^7.2.3", - "jsc-safe-url": "^0.2.4", - "lightningcss": "~1.19.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - } - }, - "node_modules/@expo/metro-config/node_modules/ansi-styles": { + "node_modules/@expo/xcpretty/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -2846,7 +2710,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/metro-config/node_modules/chalk": { + "node_modules/@expo/xcpretty/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@expo/xcpretty/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -2861,7 +2730,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/metro-config/node_modules/color-convert": { + "node_modules/@expo/xcpretty/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -2872,26 +2741,12 @@ "node": ">=7.0.0" } }, - "node_modules/@expo/metro-config/node_modules/color-name": { + "node_modules/@expo/xcpretty/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@expo/metro-config/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/metro-config/node_modules/has-flag": { + "node_modules/@expo/xcpretty/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -2899,18 +2754,18 @@ "node": ">=8" } }, - "node_modules/@expo/metro-config/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@expo/xcpretty/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "universalify": "^2.0.0" + "argparse": "^2.0.1" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@expo/metro-config/node_modules/supports-color": { + "node_modules/@expo/xcpretty/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -2921,275 +2776,266 @@ "node": ">=8" } }, - "node_modules/@expo/metro-config/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@expo/metro-runtime": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-3.2.3.tgz", - "integrity": "sha512-v5ji+fAGi7B9YavrxvekuF8gXEV/5fz0+PhaED5AaFDnbGB4IJIbpaiqK9nqZV1axjGZNQSw6Q8TsnFetCR3bQ==", + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", "peerDependencies": { - "react-native": "*" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@expo/osascript": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", - "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dependencies": { - "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" - }, - "engines": { - "node": ">=12" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@expo/package-manager": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.5.2.tgz", - "integrity": "sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==", - "dependencies": { - "@expo/json-file": "^8.3.0", - "@expo/spawn-async": "^1.7.2", - "ansi-regex": "^5.0.0", - "chalk": "^4.0.0", - "find-up": "^5.0.0", - "find-yarn-workspace-root": "~2.0.0", - "js-yaml": "^3.13.1", - "micromatch": "^4.0.2", - "npm-package-arg": "^7.0.0", - "ora": "^3.4.0", - "split": "^1.0.1", - "sudo-prompt": "9.1.1" + "node_modules/@hookform/resolvers": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", + "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==", + "peerDependencies": { + "react-hook-form": "^7.0.0" } }, - "node_modules/@expo/package-manager/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=10.10.0" } }, - "node_modules/@expo/package-manager/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=12.22" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@expo/package-manager/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "color-name": "~1.1.4" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/@expo/package-manager/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/@expo/package-manager/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/package-manager/node_modules/sudo-prompt": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", - "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/@expo/package-manager/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "has-flag": "^4.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@expo/plist": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz", - "integrity": "sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==", - "dependencies": { - "@xmldom/xmldom": "~0.7.7", - "base64-js": "^1.2.3", - "xmlbuilder": "^14.0.0" - } - }, - "node_modules/@expo/prebuild-config": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz", - "integrity": "sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.8", - "@expo/config-types": "^51.0.3", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@react-native/normalize-colors": "0.74.85", - "debug": "^4.3.1", - "fs-extra": "^9.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" + "ansi-regex": "^6.0.1" }, - "peerDependencies": { - "expo-modules-autolinking": ">=0.8.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@expo/prebuild-config/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/prebuild-config/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" + "node": ">=12" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@expo/prebuild-config/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@expo/prebuild-config/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=8" } }, - "node_modules/@expo/rudder-sdk-node": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", - "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "@expo/bunyan": "^4.0.0", - "@segment/loosely-validate-event": "^2.0.0", - "fetch-retry": "^4.1.1", - "md5": "^2.2.1", - "node-fetch": "^2.6.1", - "remove-trailing-slash": "^0.1.0", - "uuid": "^8.3.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==" - }, - "node_modules/@expo/server": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@expo/server/-/server-0.4.4.tgz", - "integrity": "sha512-q9ADBzMN5rZ/fgQ2mz5YIJuZ8gelQlhG2CQqToD+UvBLZvbaHCNxTTSs2KI1LzJvAaW5CWgWMatGvGF6iUQ0LA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "@remix-run/node": "^2.7.2", - "abort-controller": "^3.0.0", - "debug": "^4.3.4", - "source-map-support": "~0.5.21" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@expo/spawn-async": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.3" + "p-try": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@expo/vector-icons": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.0.4.tgz", - "integrity": "sha512-+yKshcbpDfbV4zoXOgHxCwh7lkE9VVTT5T03OUlBsqfze1PLy6Hi4jp1vSb1GVbY6eskvMIivGVc9SKzIv0oEQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "prop-types": "^15.8.1" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@expo/xcpretty": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.1.tgz", - "integrity": "sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==", - "dependencies": { - "@babel/code-frame": "7.10.4", - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "js-yaml": "^4.1.0" - }, - "bin": { - "excpretty": "build/cli.js" + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@expo/xcpretty/node_modules/ansi-styles": { + "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3200,15 +3046,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/xcpretty/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@expo/xcpretty/node_modules/chalk": { + "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3220,10 +3062,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/xcpretty/node_modules/color-convert": { + "node_modules/@jest/console/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3231,34 +3074,26 @@ "node": ">=7.0.0" } }, - "node_modules/@expo/xcpretty/node_modules/color-name": { + "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@expo/xcpretty/node_modules/has-flag": { + "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@expo/xcpretty/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@expo/xcpretty/node_modules/supports-color": { + "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3266,227 +3101,54 @@ "node": ">=8" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", - "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { + "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", - "slash": "^3.0.0" + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/console/node_modules/ansi-styles": { + "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -3501,7 +3163,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/console/node_modules/chalk": { + "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -3517,7 +3179,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/console/node_modules/color-convert": { + "node_modules/@jest/core/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -3529,13 +3191,13 @@ "node": ">=7.0.0" } }, - "node_modules/@jest/console/node_modules/color-name": { + "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/console/node_modules/has-flag": { + "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -3544,135 +3206,18 @@ "node": ">=8" } }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { @@ -4258,6 +3803,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", @@ -6556,6 +6113,12 @@ "node": ">=10" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", @@ -6729,6 +6292,12 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/node": { "version": "18.19.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.55.tgz", @@ -6749,13 +6318,13 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "devOptional": true + "dev": true }, "node_modules/@types/react": { "version": "18.2.79", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", - "devOptional": true, + "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6785,6 +6354,12 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@urql/core": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", @@ -6859,9 +6434,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -6879,6 +6454,15 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", @@ -7089,6 +6673,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -7097,6 +6701,98 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", @@ -7343,41 +7039,105 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "node_modules/babel-plugin-module-resolver": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz", + "integrity": "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==", + "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "find-babel-config": "^2.1.1", + "glob": "^9.3.3", + "pkg-up": "^3.1.0", + "reselect": "^4.1.7", + "resolve": "^1.22.8" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "node_modules/babel-plugin-module-resolver/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "node_modules/babel-plugin-module-resolver/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } }, "node_modules/babel-plugin-react-compiler": { "version": "0.0.0-experimental-592953e-20240517", @@ -8222,6 +7982,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -8523,7 +8288,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "dev": true }, "node_modules/dag-map": { "version": "1.0.2", @@ -8665,6 +8430,12 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -8709,9 +8480,488 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8720,456 +8970,555 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, "engines": { - "node": ">= 0.8" + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "bin": { - "detect-libc": "bin/detect-libc.js" + "eslint-config-prettier": "bin/cli.js" }, - "engines": { - "node": ">=0.10" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/eslint-import-resolver-babel-module": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-5.3.2.tgz", + "integrity": "sha512-K7D8n0O6p/JJncPote8yiuB7chJfu26Yn/Q3gzT53cNzJNS0NUCkI0iuimj4/vWVRHVQvPnYWeq07V8RvKjz/A==", "dev": true, + "dependencies": { + "pkg-up": "^3.1.0", + "resolve": "^1.20.0" + }, "engines": { - "node": ">=8" + "node": ">=10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "babel-plugin-module-resolver": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "ms": "^2.1.1" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "debug": "^3.2.7" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true } - ] + } }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "ms": "^2.1.1" } }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, "dependencies": { - "domelementtype": "^2.3.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">= 4" + "node": ">=4" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "ms": "^2.1.1" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" }, - "funding": { - "url": "https://dotenvx.com" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, "dependencies": { - "dotenv": "^16.4.4" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=12" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.36", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", - "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", + "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "once": "^1.4.0" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", - "bin": { - "envinfo": "dist/cli.js" + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "stackframe": "^1.3.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" + "node": ">=7.0.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { - "es-errors": "^1.3.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10.13.0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -9177,35 +9526,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=6.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -9220,6 +9555,30 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -9233,6 +9592,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9817,6 +10177,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -9838,6 +10204,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fast-loops": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.4.tgz", @@ -9917,6 +10289,18 @@ "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==" }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -9966,6 +10350,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/find-babel-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.2.tgz", + "integrity": "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==", + "dev": true, + "dependencies": { + "json5": "^2.2.3" + } + }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -10089,6 +10482,26 @@ "micromatch": "^4.0.2" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, "node_modules/flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", @@ -10439,6 +10852,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -10887,6 +11306,21 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -11001,6 +11435,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -11081,6 +11527,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -11170,6 +11628,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -11256,6 +11726,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -11267,6 +11749,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -11404,6 +11902,22 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -13851,6 +14365,12 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -13895,6 +14415,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -13914,6 +14440,30 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -13938,6 +14488,19 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lighthouse-logger": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", @@ -14166,6 +14729,12 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -15338,23 +15907,85 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15417,6 +16048,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", @@ -15541,6 +16189,18 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -15752,6 +16412,79 @@ "node": ">=8" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -15829,6 +16562,42 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -16537,6 +17306,27 @@ "node": ">=0.10.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -16558,15 +17348,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", @@ -16669,6 +17450,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -17487,6 +18274,42 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -17721,6 +18544,22 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -18056,6 +18895,39 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", @@ -18066,6 +18938,18 @@ "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -18177,7 +19061,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "devOptional": true, + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18352,6 +19236,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/url-join": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", @@ -18598,6 +19491,56 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -18626,6 +19569,15 @@ "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==" }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/mobile/tradeverse/package.json b/mobile/tradeverse/package.json index 9d4269dc..b1718c23 100644 --- a/mobile/tradeverse/package.json +++ b/mobile/tradeverse/package.json @@ -20,6 +20,9 @@ "@react-navigation/native": "^6.0.2", "@tabler/icons-react-native": "^3.19.0", "axios": "^1.7.7", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-react-hooks": "^5.0.0", "expo": "~51.0.28", "expo-font": "~12.0.9", "expo-image-picker": "^15.0.7", @@ -43,8 +46,16 @@ "devDependencies": { "@babel/core": "^7.20.0", "@types/react": "~18.2.45", + "babel-plugin-module-resolver": "^5.0.2", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-import-resolver-babel-module": "^5.3.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", "jest": "^29.2.1", "jest-expo": "~51.0.3", + "prettier": "^3.3.3", "react-test-renderer": "18.2.0", "typescript": "~5.3.3" }, diff --git a/mobile/tradeverse/screens/account-profile/index.jsx b/mobile/tradeverse/screens/account-profile/index.jsx index f3ae48ce..8482b117 100644 --- a/mobile/tradeverse/screens/account-profile/index.jsx +++ b/mobile/tradeverse/screens/account-profile/index.jsx @@ -1,53 +1,54 @@ -import { View, Text } from "react-native"; -import React from "react"; -import GlobalScreen from "../../components/ui/global-screen"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import RHFTextArea from "../../components/inputs/RHFTextArea"; -import RHFTextField from "../../components/inputs/RHFTextField"; -import { FormProvider, useForm } from "react-hook-form"; -import { z } from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; -import ProfileImage from "../../components/images/profile-image"; -import { IconPencil } from "@tabler/icons-react-native"; -import { Stack } from "expo-router"; -import { useContext } from "react"; -import { AuthContext } from "../../auth/context"; +import { View, Text } from 'react-native' +import React from 'react' +import GlobalScreen from '../../components/ui/global-screen' +import FullScrollView from '../../components/ui/full-scroll-view' +import RHFTextArea from '../../components/inputs/RHFTextArea' +import RHFTextField from '../../components/inputs/RHFTextField' +import { FormProvider, useForm } from 'react-hook-form' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import ProfileImage from '../../components/images/profile-image' +import { IconPencil } from '@tabler/icons-react-native' +import { Stack } from 'expo-router' +import { useContext } from 'react' +import { AuthContext } from '../../auth/context' export default function AccountProfileScreen() { const validationSchema = z.object({ - name: z.string().min(1, { message: "Bu alan gerekli." }), - description: z.string().min(1, { message: "Bu alan gerekli." }), - }); + name: z.string().min(1, { message: 'Bu alan gerekli.' }), + description: z.string().min(1, { message: 'Bu alan gerekli.' }), + }) const form = useForm({ defaultValues: { - name: "", - surname: "", - tag: "", - description: "", + name: '', + surname: '', + tag: '', + description: '', }, resolver: zodResolver(validationSchema), - }); + }) - const {user} = useContext(AuthContext); - + const { user } = useContext(AuthContext) return ( - + headerTitle: 'Profile Settings', + }} + /> - - - @{user?.username??'username'} + }} + > + + @{user?.username ?? 'username'} - - - + + + - ); + ) } diff --git a/mobile/tradeverse/screens/account-root/_components/account-option.jsx b/mobile/tradeverse/screens/account-root/_components/account-option.jsx index a5e32727..9853a3e2 100644 --- a/mobile/tradeverse/screens/account-root/_components/account-option.jsx +++ b/mobile/tradeverse/screens/account-root/_components/account-option.jsx @@ -1,7 +1,7 @@ -import React from "react"; -import { useRouter } from "expo-router"; -import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; -import { COLORS, SIZES } from "../../../constants/theme"; +import React from 'react' +import { useRouter } from 'expo-router' +import { StyleSheet, Text, TouchableOpacity, View } from 'react-native' +import { COLORS, SIZES } from '../../../constants/theme' export default function ProfileOption({ icon = () => null, @@ -11,17 +11,17 @@ export default function ProfileOption({ disabled = false, isLastOption = false, }) { - const router = useRouter(); + const router = useRouter() const handlePress = () => { - if (action) action(); - else router.push(route); - }; + if (action) action() + else router.push(route) + } return ( - ); + ) } const styles = StyleSheet.create({ container: { - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', gap: SIZES.xxSmall, }, leftContainer: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', }, rightContainer: { - flexBasis: "100%", + flexBasis: '100%', borderBottomWidth: 1, - borderBottomColor: "#EEEEEE", + borderBottomColor: '#EEEEEE', paddingVertical: SIZES.medium, }, optionText: { fontSize: SIZES.small, - color: "#000", + color: '#000', }, -}); +}) diff --git a/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx b/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx index 177e7fa7..7104a901 100644 --- a/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx +++ b/mobile/tradeverse/screens/account-root/_components/top-profile-info.jsx @@ -1,59 +1,63 @@ -import { router } from "expo-router"; -import React, { useContext, useEffect } from "react"; -import { IconChevronRight } from "@tabler/icons-react-native"; -import { Alert, Pressable, StyleSheet, Text, TouchableOpacity, View } from "react-native"; +import { router } from 'expo-router' +import React, { useContext, useEffect } from 'react' +import { IconChevronRight } from '@tabler/icons-react-native' +import { + Alert, + Pressable, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native' import { SIZES, COLORS, SIZE_CONSTANT, FONT_WEIGHTS, -} from "../../../constants/theme"; -import ProfileImage from "../../../components/images/profile-image"; -import paths from "../../../config/screen-paths"; -import { AuthContext } from "../../../auth/context"; +} from '../../../constants/theme' +import ProfileImage from '../../../components/images/profile-image' +import paths from '../../../config/screen-paths' +import { AuthContext } from '../../../auth/context' export default function ProfileInfo() { - - const {user} = useContext(AuthContext); + const { user } = useContext(AuthContext) return ( { - router.navigate(paths.ACCOUNT.PROFILE); + router.navigate(paths.ACCOUNT.PROFILE) }} > - + - - {user?.name} - + {user?.name} @{user?.username} - ); + ) } const styles = StyleSheet.create({ container: { - flexDirection: "row", + flexDirection: 'row', gap: SIZES.xSmall, marginBottom: SIZE_CONSTANT * 6, }, chevronContainer: { flex: 1, - alignItems: "flex-end", - justifyContent: "center", + alignItems: 'flex-end', + justifyContent: 'center', }, leftContainer: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', }, avatar: { width: SIZE_CONSTANT * 3.6, @@ -61,9 +65,9 @@ const styles = StyleSheet.create({ borderRadius: SIZE_CONSTANT * 4, }, rightContainer: { - display: "flex", - flexDirection: "column", - justifyContent: "center", + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', }, nameText: { fontSize: SIZES.medium, @@ -74,4 +78,4 @@ const styles = StyleSheet.create({ fontSize: SIZES.xSmall, color: COLORS.graytext, }, -}); +}) diff --git a/mobile/tradeverse/screens/account-root/index.jsx b/mobile/tradeverse/screens/account-root/index.jsx index 0b640cdb..996a482e 100644 --- a/mobile/tradeverse/screens/account-root/index.jsx +++ b/mobile/tradeverse/screens/account-root/index.jsx @@ -1,15 +1,15 @@ -import React, { useContext } from "react"; -import { StyleSheet, Text, View } from "react-native"; -import ProfileOption from "./_components/account-option"; -import ProfileConfig from "./profile-config"; -import ProfileInfo from "./_components/top-profile-info"; -import GlobalScreen from "../../components/ui/global-screen"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import { AuthContext } from "../../auth/context"; +import React, { useContext } from 'react' +import { StyleSheet, Text, View } from 'react-native' +import ProfileOption from './_components/account-option' +import ProfileConfig from './profile-config' +import ProfileInfo from './_components/top-profile-info' +import GlobalScreen from '../../components/ui/global-screen' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import FullScrollView from '../../components/ui/full-scroll-view' +import { AuthContext } from '../../auth/context' export default function AccountRootScreen() { - const { logout } = useContext(AuthContext); + const { logout } = useContext(AuthContext) return ( @@ -25,14 +25,14 @@ export default function AccountRootScreen() { text={option.title} icon={option.icon} route={option.href} - action={option.value === "logout" ? logout : option.action} + action={option.value === 'logout' ? logout : option.action} /> ))} ))} - ); + ) } const styles = StyleSheet.create({ @@ -43,4 +43,4 @@ const styles = StyleSheet.create({ fontSize: SIZE_CONSTANT * 1, color: COLORS.graytext, }, -}); +}) diff --git a/mobile/tradeverse/screens/account-root/profile-config.js b/mobile/tradeverse/screens/account-root/profile-config.js index 9c7d2bfd..057846ac 100644 --- a/mobile/tradeverse/screens/account-root/profile-config.js +++ b/mobile/tradeverse/screens/account-root/profile-config.js @@ -1,4 +1,5 @@ /* eslint-disable react/jsx-props-no-spreading */ +import React from 'react' import { IconBookmark, IconCoins, @@ -7,17 +8,16 @@ import { IconTextCaption, IconUser, IconUserDown, - IconUserUp -} from '@tabler/icons-react-native'; -import { COLORS } from '../../constants/theme'; -import { SIZE_CONSTANT } from '../../constants/theme'; -import paths from '../../config/screen-paths'; + IconUserUp, +} from '@tabler/icons-react-native' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import paths from '../../config/screen-paths' const defaultIconProps = { strokeWidth: 1, color: COLORS.primary600, - size: SIZE_CONSTANT * 2.2 -}; + size: SIZE_CONSTANT * 2.2, +} const ProfileConfig = { sections: { @@ -28,28 +28,28 @@ const ProfileConfig = { value: 'my_profile', title: 'My Profile', icon: , - href: paths.ACCOUNT.PROFILE + href: paths.ACCOUNT.PROFILE, }, { - value:'portfolio', + value: 'portfolio', title: 'Portfolio', icon: , - href: paths.ACCOUNT.PORTFOLIO + href: paths.ACCOUNT.PORTFOLIO, }, { value: 'followed_topics', title: 'Followed Topics', icon: , - href: paths.ACCOUNT.FOLLOWED_TOPICS + href: paths.ACCOUNT.FOLLOWED_TOPICS, }, { value: 'my_posts', title: 'My Posts', icon: , href: '#', - disabled: true - } - ] + disabled: true, + }, + ], }, social: { title: 'Social', @@ -59,17 +59,17 @@ const ProfileConfig = { title: 'Followers', icon: , href: '#', - disabled: true + disabled: true, }, { value: 'my_following', title: 'Followings', icon: , href: paths.ACCOUNT.FOLLOWED_USERS, - } - ] + }, + ], }, - + settings: { title: 'Settings', options: [ @@ -78,17 +78,17 @@ const ProfileConfig = { title: 'Change Password', icon: , href: '#', - disabled: true + disabled: true, }, { value: 'logout', title: 'Log Out', icon: , - action: () => {} - } - ] - } - } -}; + action: () => {}, + }, + ], + }, + }, +} -export default ProfileConfig; +export default ProfileConfig diff --git a/mobile/tradeverse/screens/add-asset/index.jsx b/mobile/tradeverse/screens/add-asset/index.jsx index 31089e9d..531623b0 100644 --- a/mobile/tradeverse/screens/add-asset/index.jsx +++ b/mobile/tradeverse/screens/add-asset/index.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState } from 'react' import { View, TextInput, @@ -8,58 +8,56 @@ import { StyleSheet, Alert, Platform, -} from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import { Stack } from "expo-router"; +} from 'react-native' +import { Stack } from 'expo-router' +import GlobalScreen from '../../components/ui/global-screen' export default function AddAssetScreen() { // Sample list of assets - const assets = ["BTC", "ETH", "BNB", "ADA", "SOL", "XRP", "BCH"]; + const assets = ['BTC', 'ETH', 'BNB', 'ADA', 'SOL', 'XRP', 'BCH'] - const [input, setInput] = useState(""); - const [amount, setAmount] = useState(""); - const [filteredAssets, setFilteredAssets] = useState([]); + const [input, setInput] = useState('') + const [amount, setAmount] = useState('') + const [filteredAssets, setFilteredAssets] = useState([]) // Handle input change and filter suggestions const handleInputChange = (text) => { - setInput(text); + setInput(text) if (text) { const filtered = assets.filter((asset) => asset.toLowerCase().startsWith(text.toLowerCase()) - ); - setFilteredAssets(filtered); + ) + setFilteredAssets(filtered) } else { - setFilteredAssets([]); + setFilteredAssets([]) } - }; + } // Handle asset selection const handleSelectAsset = (asset) => { - setInput(asset); - setFilteredAssets([]); // Hide suggestions once selected - }; + setInput(asset) + setFilteredAssets([]) // Hide suggestions once selected + } // Handle Add to Portfolio with platform-specific alert const handleAddToPortfolio = () => { - - const alertFunction = Platform.OS === "web" ? window.alert : Alert.alert; + const alertFunction = Platform.OS === 'web' ? window.alert : Alert.alert if (!amount || isNaN(amount)) { // Popup alert when amount is not entered or is invalid alertFunction( - "You cannot add without entering a valid amount.", - "You cannot add without entering a valid amount." - ); - return; + 'You cannot add without entering a valid amount.', + 'You cannot add without entering a valid amount.' + ) } - }; + } return ( @@ -104,15 +102,15 @@ export default function AddAssetScreen() { - ); + ) } const styles = StyleSheet.create({ container: {}, title: { fontSize: 20, - fontWeight: "bold", - textAlign: "center", + fontWeight: 'bold', + textAlign: 'center', marginBottom: 20, }, label: { @@ -121,7 +119,7 @@ const styles = StyleSheet.create({ }, input: { height: 40, - borderColor: "#ccc", + borderColor: '#ccc', borderWidth: 1, paddingHorizontal: 10, marginBottom: 10, @@ -129,18 +127,18 @@ const styles = StyleSheet.create({ suggestion: { padding: 10, borderBottomWidth: 1, - borderBottomColor: "#ddd", - backgroundColor: "#ffffff", // Light background color for suggestion + borderBottomColor: '#ddd', + backgroundColor: '#ffffff', // Light background color for suggestion }, button: { - backgroundColor: "#7b61ff", + backgroundColor: '#7b61ff', padding: 15, - alignItems: "center", + alignItems: 'center', borderRadius: 5, marginTop: 20, }, buttonText: { - color: "#fff", + color: '#fff', fontSize: 16, }, -}); +}) diff --git a/mobile/tradeverse/screens/asset-detail/index.jsx b/mobile/tradeverse/screens/asset-detail/index.jsx index 30878f79..8849e5c1 100644 --- a/mobile/tradeverse/screens/asset-detail/index.jsx +++ b/mobile/tradeverse/screens/asset-detail/index.jsx @@ -1,37 +1,37 @@ -import React, { useEffect, useState } from "react"; -import { View, Text, StyleSheet, Image } from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import { IconCaretDown, IconCaretDownFilled } from "@tabler/icons-react-native"; -import { COLORS, SIZE_CONSTANT, SIZES } from "../../constants/theme"; -import { Stack, useLocalSearchParams } from "expo-router"; -import { getAssetById } from "../../mock-services/assets"; -import ContentImage from "../../components/images/content-image"; +import React, { useEffect, useState } from 'react' +import { View, Text, StyleSheet, Image } from 'react-native' +import { IconCaretDown, IconCaretDownFilled } from '@tabler/icons-react-native' +import { Stack, useLocalSearchParams } from 'expo-router' +import GlobalScreen from '../../components/ui/global-screen' +import { COLORS, SIZE_CONSTANT, SIZES } from '../../constants/theme' +import { getAssetById } from '../../mock-services/assets' +import ContentImage from '../../components/images/content-image' const AssetDisplay = () => { // State to store selected currency - const [selectedCurrency, setSelectedCurrency] = useState("USD"); + const [selectedCurrency, setSelectedCurrency] = useState('USD') - const [asset, setAsset] = useState(null); + const [asset, setAsset] = useState(null) // Currency conversion (for simplicity, using static values) const currencyRates = { USD: 1, EUR: 0.85, GBP: 0.74, - }; + } - const { assetId } = useLocalSearchParams(); + const { assetId } = useLocalSearchParams() useEffect(() => { - const res = getAssetById(assetId); - setAsset({...res,value: Math.floor(Math.random() * 10000)}); - }, [assetId]); + const res = getAssetById(assetId) + setAsset({ ...res, value: Math.floor(Math.random() * 10000) }) + }, [assetId]) return ( @@ -54,7 +54,7 @@ const AssetDisplay = () => { { )} - ); -}; + ) +} const styles = StyleSheet.create({ container: { - backgroundColor: "#fff", - justifyContent: "center", + backgroundColor: '#fff', + justifyContent: 'center', }, row: { - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", - backgroundColor: "#fff", + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + backgroundColor: '#fff', padding: 10, borderRadius: 10, marginBottom: 20, @@ -88,42 +88,42 @@ const styles = StyleSheet.create({ borderRadius: 20, }, assetText: { - fontSize:SIZE_CONSTANT * 2.4, + fontSize: SIZE_CONSTANT * 2.4, }, assetInfo: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', flexGrow: 1, - justifyContent: "flex-end", + justifyContent: 'flex-end', }, valueText: { fontSize: 24, marginRight: 10, - fontWeight: "bold", // Make text bold - color: "purple", // Change text color to purple + fontWeight: 'bold', // Make text bold + color: 'purple', // Change text color to purple }, pickerContainer: { - backgroundColor: "#000000", // Updated to a consistent green color - borderColor: "#ccc", + backgroundColor: '#000000', // Updated to a consistent green color + borderColor: '#ccc', borderWidth: 1, borderRadius: 5, height: 40, width: 40, // Adjusted the width to provide more space for currency options - justifyContent: "center", + justifyContent: 'center', }, picker: { height: 40, - width: "100%", - color: "#000", // Text color white for contrast on green background + width: '100%', + color: '#000', // Text color white for contrast on green background }, imageContainer: { - alignItems: "center", + alignItems: 'center', marginTop: 20, }, graphImage: { - width: "100%", + width: '100%', height: 300, }, -}); +}) -export default AssetDisplay; +export default AssetDisplay diff --git a/mobile/tradeverse/screens/auth/login.jsx b/mobile/tradeverse/screens/auth/login.jsx index 5f3542ee..bb12ef20 100644 --- a/mobile/tradeverse/screens/auth/login.jsx +++ b/mobile/tradeverse/screens/auth/login.jsx @@ -1,44 +1,49 @@ -import React from 'react'; -import { View, Text, TextInput, TouchableOpacity, StyleSheet, Image } from 'react-native'; +import React from 'react' +import { + View, + Text, + TextInput, + TouchableOpacity, + StyleSheet, + Image, +} from 'react-native' -const LoginScreen = () => { - return ( - - {/* Logo */} - Tradeverse +const LoginScreen = () => ( + + {/* Logo */} + Tradeverse - {/* Email Input */} - + {/* Email Input */} + - {/* Password Input */} - + {/* Password Input */} + - {/* Login Button */} - - Login - + {/* Login Button */} + + Login + - {/* Register Link */} - - Register - + {/* Register Link */} + + Register + - {/* Forgot Password Section - replacing OR */} - - Forget Password? - - - ); -}; + {/* Forgot Password Section - replacing OR */} + + Forget Password? + + +) const styles = StyleSheet.create({ container: { @@ -90,6 +95,6 @@ const styles = StyleSheet.create({ fontSize: 16, fontWeight: 'bold', }, -}); +}) -export default LoginScreen; +export default LoginScreen diff --git a/mobile/tradeverse/screens/auth/register.jsx b/mobile/tradeverse/screens/auth/register.jsx index 3535248a..25eda0ed 100644 --- a/mobile/tradeverse/screens/auth/register.jsx +++ b/mobile/tradeverse/screens/auth/register.jsx @@ -1,58 +1,59 @@ -import React from 'react'; -import { View, Text, TextInput, TouchableOpacity, StyleSheet } from 'react-native'; +import React from 'react' +import { + View, + Text, + TextInput, + TouchableOpacity, + StyleSheet, +} from 'react-native' -const RegisterScreen = () => { - return ( - - {/* Logo */} - Tradeverse +const RegisterScreen = () => ( + + {/* Logo */} + Tradeverse - {/* Email Input */} - + {/* Email Input */} + + {/* Name Input */} + + {/* Surname Input */} + - {/* Name Input */} - + {/* Password Input */} + - {/* Surname Input */} - + {/* Sign-up Button */} + + Sign Up + - - {/* Password Input */} - - - {/* Sign-up Button */} - - Sign Up - - - {/* Already have an account - Sign In */} - - - Already have an account? Sign In - - - - ); -}; + {/* Already have an account - Sign In */} + + + Already have an account? Sign In + + + +) const styles = StyleSheet.create({ container: { @@ -99,6 +100,6 @@ const styles = StyleSheet.create({ signInLink: { fontWeight: 'bold', }, -}); +}) -export default RegisterScreen; +export default RegisterScreen diff --git a/mobile/tradeverse/screens/create-post/index.jsx b/mobile/tradeverse/screens/create-post/index.jsx index 57a03bcf..5988e590 100644 --- a/mobile/tradeverse/screens/create-post/index.jsx +++ b/mobile/tradeverse/screens/create-post/index.jsx @@ -1,42 +1,42 @@ -import { View, Text } from "react-native"; -import React from "react"; -import GlobalScreen from "../../components/ui/global-screen"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import RHFTextArea from "../../components/inputs/RHFTextArea"; -import RHFTextField from "../../components/inputs/RHFTextField"; -import { FormProvider, useForm } from "react-hook-form"; -import { z } from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { - COLORS, - FONT_WEIGHTS, - SIZE_CONSTANT, - SIZES, -} from "../../constants/theme"; -import { Stack } from "expo-router"; +import { View, Text } from 'react-native' +import React from 'react' +import { FormProvider, useForm } from 'react-hook-form' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { Stack } from 'expo-router' import { IconCaretDown, IconCaretDownFilled, IconImageInPicture, IconPaperclip, IconPhotoPlus, -} from "@tabler/icons-react-native"; -import MainButton from "../../components/buttons/main-button"; -import TextField from "../../components/inputs/TextField"; +} from '@tabler/icons-react-native' +import GlobalScreen from '../../components/ui/global-screen' +import FullScrollView from '../../components/ui/full-scroll-view' +import RHFTextArea from '../../components/inputs/RHFTextArea' +import RHFTextField from '../../components/inputs/RHFTextField' +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../constants/theme' +import MainButton from '../../components/buttons/main-button' +import TextField from '../../components/inputs/TextField' export default function CreatePostScreen() { const validationSchema = z.object({ - title: z.string().min(1, { message: "Bu alan gerekli." }), - content: z.string().min(1, { message: "Bu alan gerekli." }), - }); + title: z.string().min(1, { message: 'Bu alan gerekli.' }), + content: z.string().min(1, { message: 'Bu alan gerekli.' }), + }) const form = useForm({ defaultValues: { - title: "", - content: "", + title: '', + content: '', }, resolver: zodResolver(validationSchema), - }); + }) return ( @@ -44,13 +44,13 @@ export default function CreatePostScreen() { @@ -58,9 +58,9 @@ export default function CreatePostScreen() { @@ -71,7 +71,7 @@ export default function CreatePostScreen() { fontWeight: FONT_WEIGHTS.medium, }} > - Stock Market Trends & Future{" "} + Stock Market Trends & Future{' '} @@ -83,15 +83,14 @@ export default function CreatePostScreen() { > @@ -106,14 +105,14 @@ export default function CreatePostScreen() { /> - ); + ) } diff --git a/mobile/tradeverse/screens/create-root/index.jsx b/mobile/tradeverse/screens/create-root/index.jsx index d15d6185..ab6d3fa2 100644 --- a/mobile/tradeverse/screens/create-root/index.jsx +++ b/mobile/tradeverse/screens/create-root/index.jsx @@ -1,15 +1,15 @@ -import React from "react"; -import { StyleSheet, Text, View, TouchableOpacity } from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; -import FullScrollView from "../../components/ui/full-scroll-view"; +import React from 'react' +import { StyleSheet, Text, View, TouchableOpacity } from 'react-native' import { IconMessage, IconTextCaption, IconArrowRight, -} from "@tabler/icons-react-native"; -import { router } from "expo-router"; -import paths from "../../config/screen-paths"; +} from '@tabler/icons-react-native' +import { router } from 'expo-router' +import GlobalScreen from '../../components/ui/global-screen' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import FullScrollView from '../../components/ui/full-scroll-view' +import paths from '../../config/screen-paths' export default function CreateRootScreen() { return ( @@ -21,7 +21,7 @@ export default function CreateRootScreen() { { - router.push(paths.CREATE.ADD_POST); + router.push(paths.CREATE.ADD_POST) }} style={styles.button} > @@ -32,7 +32,7 @@ export default function CreateRootScreen() { { - router.push(paths.CREATE.ADD_SUBFORUM); + router.push(paths.CREATE.ADD_SUBFORUM) }} style={styles.button} > @@ -44,14 +44,14 @@ export default function CreateRootScreen() { - ); + ) } const styles = StyleSheet.create({ container: { flex: 1, - justifyContent: "space-between", - backgroundColor: "#fff", + justifyContent: 'space-between', + backgroundColor: '#fff', }, mainContent: { flex: 1, @@ -59,44 +59,44 @@ const styles = StyleSheet.create({ }, title: { fontSize: 22, - fontWeight: "bold", + fontWeight: 'bold', marginBottom: 20, - color: "#333", + color: '#333', }, button: { - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', paddingVertical: 15, paddingHorizontal: 10, borderWidth: 1, - borderColor: "#EAEAEA", + borderColor: '#EAEAEA', borderRadius: 10, marginBottom: 15, }, buttonText: { fontSize: 16, - color: "#333", + color: '#333', flex: 1, marginLeft: 10, }, bottomNav: { - flexDirection: "row", - justifyContent: "space-around", - alignItems: "center", - backgroundColor: "#4B49F5", + flexDirection: 'row', + justifyContent: 'space-around', + alignItems: 'center', + backgroundColor: '#4B49F5', height: 60, }, navButton: { - justifyContent: "center", - alignItems: "center", + justifyContent: 'center', + alignItems: 'center', }, activeButton: { width: 50, height: 50, borderRadius: 25, - backgroundColor: "#624BF6", - justifyContent: "center", - alignItems: "center", + backgroundColor: '#624BF6', + justifyContent: 'center', + alignItems: 'center', }, -}); +}) diff --git a/mobile/tradeverse/screens/create-subforum/index.jsx b/mobile/tradeverse/screens/create-subforum/index.jsx index f8cdb98f..ed8cb342 100644 --- a/mobile/tradeverse/screens/create-subforum/index.jsx +++ b/mobile/tradeverse/screens/create-subforum/index.jsx @@ -1,57 +1,58 @@ -import { View, Text } from "react-native"; -import React from "react"; -import GlobalScreen from "../../components/ui/global-screen"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import RHFTextArea from "../../components/inputs/RHFTextArea"; -import RHFTextField from "../../components/inputs/RHFTextField"; -import { FormProvider, useForm } from "react-hook-form"; -import { z } from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { - COLORS, - FONT_WEIGHTS, - SIZE_CONSTANT, - SIZES, -} from "../../constants/theme"; -import { Stack } from "expo-router"; +import { View, Text } from 'react-native' +import React from 'react' +import { FormProvider, useForm } from 'react-hook-form' +import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { Stack } from 'expo-router' import { IconCaretDown, IconCaretDownFilled, IconImageInPicture, IconPaperclip, IconPhotoPlus, -} from "@tabler/icons-react-native"; -import MainButton from "../../components/buttons/main-button"; -import TextField from "../../components/inputs/TextField"; +} from '@tabler/icons-react-native' +import GlobalScreen from '../../components/ui/global-screen' +import FullScrollView from '../../components/ui/full-scroll-view' +import RHFTextArea from '../../components/inputs/RHFTextArea' +import RHFTextField from '../../components/inputs/RHFTextField' +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../constants/theme' +import MainButton from '../../components/buttons/main-button' +import TextField from '../../components/inputs/TextField' export default function CreateSubForumScreen() { const validationSchema = z.object({ - title: z.string().min(1, { message: "Bu alan gerekli." }), - content: z.string().min(1, { message: "Bu alan gerekli." }), - }); + title: z.string().min(1, { message: 'Bu alan gerekli.' }), + content: z.string().min(1, { message: 'Bu alan gerekli.' }), + }) const form = useForm({ defaultValues: { - title: "", - content: "", + title: '', + content: '', }, resolver: zodResolver(validationSchema), - }); + }) return ( @@ -74,15 +75,14 @@ export default function CreateSubForumScreen() { > @@ -128,5 +128,5 @@ export default function CreateSubForumScreen() { - ); + ) } diff --git a/mobile/tradeverse/screens/explore-root/_components/post-card.jsx b/mobile/tradeverse/screens/explore-root/_components/post-card.jsx index 8183b656..f18c96e6 100644 --- a/mobile/tradeverse/screens/explore-root/_components/post-card.jsx +++ b/mobile/tradeverse/screens/explore-root/_components/post-card.jsx @@ -1,158 +1,146 @@ -import { View, Text } from "react-native"; -import React from "react"; -import { - COLORS, - FONT_WEIGHTS, - SIZE_CONSTANT, - SIZES, -} from "../../../constants/theme"; -import ProfileImage from "../../../components/images/profile-image"; +import { View, Text } from 'react-native' +import React from 'react' import { IconEye, IconMessageCircle2, IconThumbDown, IconThumbUp, -} from "@tabler/icons-react-native"; -import UserLink from "../../../components/links/user-link"; -import SubforumLink from "../../../components/links/subforum-link"; -import PostLink from "../../../components/links/post-link"; -import paths from "../../../config/screen-paths"; +} from '@tabler/icons-react-native' +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../../constants/theme' +import ProfileImage from '../../../components/images/profile-image' +import UserLink from '../../../components/links/user-link' +import SubforumLink from '../../../components/links/subforum-link' +import PostLink from '../../../components/links/post-link' +import paths from '../../../config/screen-paths' -const AuthorInfo = ({ author }) => { - return ( - - - - - - ( + + + + - - {author.name} {author.surname} - - - @{author.username} - - + src={author.avatar} + /> - - ); -}; - -const SubforumInfo = ({ subforum }) => { - return ( - - {subforum.title} + {author.name} {author.surname} - - - ); -}; - -const TagText = ({ tag, index = 0, isLast = false }) => { - return ( - - {index === 0 ? "" : " "}@{tag.value} - - ); -}; - -const DefaultText = ({ text, index = 0 }) => { - return ( - - {index === 0 ? "" : " "} - {text.value} - - ); -}; - -const InteractionInfo = ({ icon = () => {}, value }) => { - return ( - - {icon({ prop: { color: "#444" } })} - - {value} + @{author.username} - ); -}; + +) + +const SubforumInfo = ({ subforum }) => ( + + + + {subforum.title} + + + +) + +const TagText = ({ tag, index = 0, isLast = false }) => ( + + {index === 0 ? '' : ' '}@{tag.value} + +) + +const DefaultText = ({ text, index = 0 }) => ( + + {index === 0 ? '' : ' '} + {text.value} + +) + +const InteractionInfo = ({ icon = () => {}, value }) => ( + + {icon({ prop: { color: '#444' } })} + + + {value} + + + +) export default function PostCard({ style, post }) { return ( @@ -163,15 +151,15 @@ export default function PostCard({ style, post }) { paddingTop: SIZE_CONSTANT * 1.2, paddingBottom: SIZE_CONSTANT * 1.4, borderBottomWidth: 0.5, - borderBottomColor: "#E5E5E5", + borderBottomColor: '#E5E5E5', }} > @@ -195,11 +183,11 @@ export default function PostCard({ style, post }) { {post.content.map((content, index) => { - if (content.type === "text") { - return ; + if (content.type === 'text') { + return } - if (content.type === "tag") { - return ; + if (content.type === 'tag') { + return } })} @@ -207,9 +195,9 @@ export default function PostCard({ style, post }) { @@ -220,8 +208,8 @@ export default function PostCard({ style, post }) { @@ -241,5 +229,5 @@ export default function PostCard({ style, post }) { - ); + ) } diff --git a/mobile/tradeverse/screens/explore-root/_components/search-bar.jsx b/mobile/tradeverse/screens/explore-root/_components/search-bar.jsx index 44e6a913..a3538b48 100644 --- a/mobile/tradeverse/screens/explore-root/_components/search-bar.jsx +++ b/mobile/tradeverse/screens/explore-root/_components/search-bar.jsx @@ -1,12 +1,12 @@ -import React, { useState } from 'react'; -import { IconSearch } from '@tabler/icons-react-native'; -import { View, TextInput, StyleSheet } from 'react-native'; -import { router } from 'expo-router'; -import { COLORS, SIZE_CONSTANT } from '../../../constants/theme'; -import paths from '../../../config/screen-paths'; +import React, { useState } from 'react' +import { IconSearch } from '@tabler/icons-react-native' +import { View, TextInput, StyleSheet } from 'react-native' +import { router } from 'expo-router' +import { COLORS, SIZE_CONSTANT } from '../../../constants/theme' +import paths from '../../../config/screen-paths' export default function SearchBar() { - const [searchKey, setSearchKey] = useState(''); + const [searchKey, setSearchKey] = useState('') return ( @@ -15,26 +15,26 @@ export default function SearchBar() { placeholder="Search for anything.." placeholderTextColor="#A8ADD9" onChangeText={(e) => { - setSearchKey(e); + setSearchKey(e) }} onSubmitEditing={() => { - router.push(`/${paths.EXPLORE.SEARCH}?searchKey=${searchKey}`); + router.push(`/${paths.EXPLORE.SEARCH}?searchKey=${searchKey}`) }} /> - ); + ) } const styles = StyleSheet.create({ container: { - width: '100%' + width: '100%', }, searchContainer: { - flexDirection: 'row' + flexDirection: 'row', }, - searchInput:{ + searchInput: { width: '80%', color: COLORS.primary950, }, @@ -46,6 +46,6 @@ const styles = StyleSheet.create({ borderRadius: SIZE_CONSTANT * 1, paddingVertical: 10, backgroundColor: `${COLORS.primary50}80`, - paddingHorizontal: 16 - } -}); + paddingHorizontal: 16, + }, +}) diff --git a/mobile/tradeverse/screens/explore-root/_components/tabs.jsx b/mobile/tradeverse/screens/explore-root/_components/tabs.jsx index ecf23b26..e6836587 100644 --- a/mobile/tradeverse/screens/explore-root/_components/tabs.jsx +++ b/mobile/tradeverse/screens/explore-root/_components/tabs.jsx @@ -1,24 +1,27 @@ import React from 'react' import { Pressable, View, Text } from 'react-native' -import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES } from '../../../constants/theme' - -export default function Tabs({selectedTab, setSelectedTab}) { - - - const TABS = [ - { - label: 'Popular', - value: 'popular', - }, - { - label: 'Recent', - value: 'recent', - } - ] +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../../constants/theme' +export default function Tabs({ selectedTab, setSelectedTab }) { + const TABS = [ + { + label: 'Popular', + value: 'popular', + }, + { + label: 'Recent', + value: 'recent', + }, + ] return ( - - {TABS.map((tab, index) => ( - setSelectedTab(tab.value)} - style={{ - flex: 1, - justifyContent: 'center', - alignItems: 'center', - paddingVertical: SIZE_CONSTANT * 1.4, - borderBottomWidth: selectedTab === tab.value ? SIZE_CONSTANT*0.3 : 0, - borderBottomColor: selectedTab === tab.value ? COLORS.primary500 : 'transparent' - }} - > - {tab.label} - - ))} - + borderBottomColor: '#f1f1f1', + }} + > + {TABS.map((tab, index) => ( + setSelectedTab(tab.value)} + style={{ + flex: 1, + justifyContent: 'center', + alignItems: 'center', + paddingVertical: SIZE_CONSTANT * 1.4, + borderBottomWidth: + selectedTab === tab.value ? SIZE_CONSTANT * 0.3 : 0, + borderBottomColor: + selectedTab === tab.value ? COLORS.primary500 : 'transparent', + }} + > + + {tab.label} + + + ))} ) } diff --git a/mobile/tradeverse/screens/explore-root/index.jsx b/mobile/tradeverse/screens/explore-root/index.jsx index 6e2c257e..57473da4 100644 --- a/mobile/tradeverse/screens/explore-root/index.jsx +++ b/mobile/tradeverse/screens/explore-root/index.jsx @@ -1,26 +1,26 @@ -import React, { useEffect, useState } from "react"; -import { StyleSheet, Text, View } from "react-native"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; -import SearchBar from "./_components/search-bar"; -import GlobalScreen from "../../components/ui/global-screen"; -import Tabs from "./_components/tabs"; -import PaddedContainer from "../../components/ui/padded-container"; -import PopularView from "./views/popular-view"; -import { getExploreFeed } from "../../mock-services/explore"; +import React, { useEffect, useState } from 'react' +import { StyleSheet, Text, View } from 'react-native' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import SearchBar from './_components/search-bar' +import GlobalScreen from '../../components/ui/global-screen' +import Tabs from './_components/tabs' +import PaddedContainer from '../../components/ui/padded-container' +import PopularView from './views/popular-view' +import { getExploreFeed } from '../../mock-services/explore' export default function ExploreRootScreen() { - const [selectedTab, setSelectedTab] = useState("popular"); + const [selectedTab, setSelectedTab] = useState('popular') const [data, setData] = useState({ popularPosts: [], recentPosts: [], - }); + }) useEffect(() => { - const result = getExploreFeed(); + const result = getExploreFeed() setData({ popularPosts: result.popular, recentPosts: result.recent, - }); - }, []); + }) + }, []) return ( {data && ( <> - {selectedTab === "popular" && ( + {selectedTab === 'popular' && ( )} - {selectedTab === "recent" && ( - - )} + {selectedTab === 'recent' && } )} - ); + ) } const styles = StyleSheet.create({ @@ -53,4 +51,4 @@ const styles = StyleSheet.create({ fontSize: SIZE_CONSTANT * 1, color: COLORS.graytext, }, -}); +}) diff --git a/mobile/tradeverse/screens/explore-root/views/popular-view.jsx b/mobile/tradeverse/screens/explore-root/views/popular-view.jsx index c923e0b9..4c38280b 100644 --- a/mobile/tradeverse/screens/explore-root/views/popular-view.jsx +++ b/mobile/tradeverse/screens/explore-root/views/popular-view.jsx @@ -1,7 +1,7 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import PostCard from "../_components/post-card"; -import PostLink from "../../../components/links/post-link"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import PostCard from '../_components/post-card' +import PostLink from '../../../components/links/post-link' export default function PopularView({ data }) { return ( @@ -12,5 +12,5 @@ export default function PopularView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/explore-root/views/recent-view.jsx b/mobile/tradeverse/screens/explore-root/views/recent-view.jsx index 9702b7d6..7c709121 100644 --- a/mobile/tradeverse/screens/explore-root/views/recent-view.jsx +++ b/mobile/tradeverse/screens/explore-root/views/recent-view.jsx @@ -1,6 +1,6 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import PostCard from "../_components/post-card"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import PostCard from '../_components/post-card' export default function RecentView({ data }) { return ( @@ -9,5 +9,5 @@ export default function RecentView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/asset-result.jsx b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/asset-result.jsx index ebe997d3..018fa740 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/asset-result.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/asset-result.jsx @@ -1,14 +1,14 @@ -import { Text, View } from "react-native"; -import React from "react"; +import { Text, View } from 'react-native' +import React from 'react' import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES, -} from "../../../../constants/theme"; -import ContentImage from "../../../../components/images/content-image"; -import AssetLink from "../../../../components/links/asset-link"; -import paths from "../../../../config/screen-paths"; +} from '../../../../constants/theme' +import ContentImage from '../../../../components/images/content-image' +import AssetLink from '../../../../components/links/asset-link' +import paths from '../../../../config/screen-paths' export default function AssetResult({ style, asset }) { return ( @@ -19,11 +19,11 @@ export default function AssetResult({ style, asset }) { paddingTop: SIZE_CONSTANT * 1.2, paddingBottom: SIZE_CONSTANT * 1.4, borderBottomWidth: 0.5, - borderBottomColor: "#E5E5E5", - display: "flex", - flexDirection: "row", + borderBottomColor: '#E5E5E5', + display: 'flex', + flexDirection: 'row', gap: SIZE_CONSTANT * 1.2, - alignItems: "center", + alignItems: 'center', }} > - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/post-result.jsx b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/post-result.jsx index 6e11f816..5455bfa8 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/post-result.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/post-result.jsx @@ -1,22 +1,22 @@ -import { View, Text } from "react-native"; -import React from "react"; -import { - COLORS, - FONT_WEIGHTS, - SIZE_CONSTANT, - SIZES, -} from "../../../../constants/theme"; -import ProfileImage from "../../../../components/images/profile-image"; +import { View, Text } from 'react-native' +import React from 'react' import { IconEye, IconMessageCircle2, IconThumbDown, IconThumbUp, -} from "@tabler/icons-react-native"; -import UserLink from "../../../../components/links/user-link"; -import paths from "../../../../config/screen-paths"; -import SubforumLink from "../../../../components/links/subforum-link"; -import PostLink from "../../../../components/links/post-link"; +} from '@tabler/icons-react-native' +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../../../constants/theme' +import ProfileImage from '../../../../components/images/profile-image' +import UserLink from '../../../../components/links/user-link' +import paths from '../../../../config/screen-paths' +import SubforumLink from '../../../../components/links/subforum-link' +import PostLink from '../../../../components/links/post-link' // { // title: 'Title', @@ -39,141 +39,132 @@ import PostLink from "../../../../components/links/post-link"; // }, // } -const AuthorInfo = ({ author }) => { - return ( - +const AuthorInfo = ({ author }) => ( + + - - - {author.name} {author.surname} - - - @{author.username} - - - - - - - - ); -}; - -const SubforumInfo = ({ subforum }) => { - return ( - - + {author.name} {author.surname} + - {subforum.title} + @{author.username} - - ); -}; + + + + + +) -const TagText = ({ tag, index = 0, isLast = false }) => { - return ( - ( + + - {index === 0 ? "" : " "}@{tag.value} - - ); -}; + + {subforum.title} + + + +) -const DefaultText = ({ text, index = 0 }) => { - return ( - - {index === 0 ? "" : " "} - {text.value} - - ); -}; +const TagText = ({ tag, index = 0, isLast = false }) => ( + + {index === 0 ? '' : ' '}@{tag.value} + +) -const InteractionInfo = ({ icon = () => {}, value }) => { - return ( - - {icon({ prop: { color: "#444" } })} - - - {value} - - +const DefaultText = ({ text, index = 0 }) => ( + + {index === 0 ? '' : ' '} + {text.value} + +) + +const InteractionInfo = ({ icon = () => {}, value }) => ( + + {icon({ prop: { color: '#444' } })} + + + {value} + - ); -}; + +) export default function PostResult({ style, post }) { return ( @@ -184,7 +175,7 @@ export default function PostResult({ style, post }) { paddingTop: SIZE_CONSTANT * 1.2, paddingBottom: SIZE_CONSTANT * 1.4, borderBottomWidth: 0.5, - borderBottomColor: "#E5E5E5", + borderBottomColor: '#E5E5E5', }} > @@ -203,10 +194,10 @@ export default function PostResult({ style, post }) { @@ -214,5 +205,5 @@ export default function PostResult({ style, post }) { - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/sub-forum-result.jsx b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/sub-forum-result.jsx index bf551741..7b7663d3 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/sub-forum-result.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/sub-forum-result.jsx @@ -1,81 +1,84 @@ -import { View, Text } from "react-native"; -import React from "react"; -import { COLORS, SIZE_CONSTANT, SIZES,FONT_WEIGHTS } from "../../../../constants/theme"; -import formatInteractionNumber from "../../../../util/format-number"; -import SubforumLink from "../../../../components/links/subforum-link"; -import paths from "../../../../config/screen-paths"; +import { View, Text } from 'react-native' +import React from 'react' +import { + COLORS, + SIZE_CONSTANT, + SIZES, + FONT_WEIGHTS, +} from '../../../../constants/theme' +import formatInteractionNumber from '../../../../util/format-number' +import SubforumLink from '../../../../components/links/subforum-link' +import paths from '../../../../config/screen-paths' export default function SubForumResult({ style, subForum }) { - const InteractionInfo = ({ icon, value }) => { - return ( - - {icon()} - - {formatInteractionNumber(value)} - - - ); - }; - return ( - - - + const InteractionInfo = ({ icon, value }) => ( + {icon()} - {subForum.title} + {formatInteractionNumber(value)} + + ) + return ( + - ✍️} - value={subForum.totalPosts} - /> - } - value={subForum.totalFollowers} - /> - 👤} - value={subForum.totalPeople} - /> + + {subForum.title} + + + ✍️} + value={subForum.totalPosts} + /> + } + value={subForum.totalFollowers} + /> + 👤} + value={subForum.totalPeople} + /> + - - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/tag-result.jsx b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/tag-result.jsx index 93c56446..f28942bb 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/tag-result.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/tag-result.jsx @@ -1,38 +1,40 @@ -import { View, Text } from "react-native"; -import React from "react"; -import { COLORS, SIZE_CONSTANT, SIZES,FONT_WEIGHTS } from "../../../../constants/theme"; -import formatInteractionNumber from "../../../../util/format-number"; +import { View, Text } from 'react-native' +import React from 'react' +import { + COLORS, + SIZE_CONSTANT, + SIZES, + FONT_WEIGHTS, +} from '../../../../constants/theme' +import formatInteractionNumber from '../../../../util/format-number' export default function TagResult({ style, tag }) { - const InteractionInfo = ({ icon, value }) => { - return ( - ( + + {icon()} + - {icon()} - - {formatInteractionNumber(value)} - - - ); - }; + {formatInteractionNumber(value)} + + + ) return ( @@ -67,5 +69,5 @@ export default function TagResult({ style, tag }) { /> - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/user-result.jsx b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/user-result.jsx index a392d9d8..8750e173 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/result-cards/user-result.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/result-cards/user-result.jsx @@ -1,28 +1,28 @@ -import { View, Text } from "react-native"; -import React from "react"; -import ProfileImage from "../../../../components/images/profile-image"; +import { View, Text } from 'react-native' +import React from 'react' +import ProfileImage from '../../../../components/images/profile-image' import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES, -} from "../../../../constants/theme"; -import UserLink from "../../../../components/links/user-link"; -import paths from "../../../../config/screen-paths"; +} from '../../../../constants/theme' +import UserLink from '../../../../components/links/user-link' +import paths from '../../../../config/screen-paths' export default function UserResult({ user }) { return ( @@ -37,8 +37,8 @@ export default function UserResult({ user }) { @@ -56,7 +56,7 @@ export default function UserResult({ user }) { - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/_components/search-bar.jsx b/mobile/tradeverse/screens/explore-search-results/_components/search-bar.jsx index 154d9021..0cbf0103 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/search-bar.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/search-bar.jsx @@ -1,16 +1,16 @@ -import React, { useEffect, useState } from "react"; -import { IconSearch } from "@tabler/icons-react-native"; -import { View, TextInput, StyleSheet } from "react-native"; -import { COLORS, SIZE_CONSTANT } from "../../../constants/theme"; +import React, { useEffect, useState } from 'react' +import { IconSearch } from '@tabler/icons-react-native' +import { View, TextInput, StyleSheet } from 'react-native' +import { COLORS, SIZE_CONSTANT } from '../../../constants/theme' export default function SearchBar({ value, onChange }) { - const [searchKey, setSearchKey] = useState(""); + const [searchKey, setSearchKey] = useState('') useEffect(() => { if (value) { - setSearchKey(value); + setSearchKey(value) } - }, [value]); + }, [value]) return ( @@ -20,8 +20,8 @@ export default function SearchBar({ value, onChange }) { placeholder="Search for anything.." placeholderTextColor="#A8ADD9" onChangeText={(e) => { - setSearchKey(e); - onChange(e); + setSearchKey(e) + onChange(e) }} onSubmitEditing={() => { // router.push(`/${paths.EXPLORE.SEARCH}?searchKey=${searchKey}`); @@ -30,30 +30,30 @@ export default function SearchBar({ value, onChange }) { - ); + ) } const styles = StyleSheet.create({ container: { - width: "100%", + width: '100%', }, searchContainer: { // width: "80%", - flex:1, - flexDirection: "row", + flex: 1, + flexDirection: 'row', }, searchInput: { - width: "80%", + width: '80%', color: COLORS.primary950, }, searchWrapper: { - width: "100%", - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", + width: '100%', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', borderRadius: SIZE_CONSTANT * 1, paddingVertical: 10, backgroundColor: `${COLORS.primary50}80`, paddingHorizontal: 16, }, -}); +}) diff --git a/mobile/tradeverse/screens/explore-search-results/_components/tabs.jsx b/mobile/tradeverse/screens/explore-search-results/_components/tabs.jsx index 3b7c49e4..db30e47f 100644 --- a/mobile/tradeverse/screens/explore-search-results/_components/tabs.jsx +++ b/mobile/tradeverse/screens/explore-search-results/_components/tabs.jsx @@ -1,59 +1,59 @@ -import React from "react"; -import { Pressable, View, Text, ScrollView } from "react-native"; +import React from 'react' +import { Pressable, View, Text, ScrollView } from 'react-native' import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES, -} from "../../../constants/theme"; +} from '../../../constants/theme' export default function Tabs({ selectedTab, setSelectedTab }) { const TABS = [ { - label: "Popular", - value: "popular", + label: 'Popular', + value: 'popular', }, { - label: "Assets", - value: "assets", + label: 'Assets', + value: 'assets', }, { - label: "Tags", - value: "tags", + label: 'Tags', + value: 'tags', }, { - label: "Sub Forums", - value: "sub_forums", + label: 'Sub Forums', + value: 'sub_forums', }, { - label: "Posts", - value: "posts", + label: 'Posts', + value: 'posts', }, { - label: "People", - value: "people", + label: 'People', + value: 'people', }, - ]; + ] return ( {TABS.map((tab, index) => ( @@ -63,13 +63,13 @@ export default function Tabs({ selectedTab, setSelectedTab }) { style={{ flex: 1, minWidth: 72, - justifyContent: "center", - alignItems: "center", + justifyContent: 'center', + alignItems: 'center', paddingVertical: SIZE_CONSTANT * 1.4, borderBottomWidth: selectedTab === tab.value ? SIZE_CONSTANT * 0.3 : 0, borderBottomColor: - selectedTab === tab.value ? COLORS.primary500 : "transparent", + selectedTab === tab.value ? COLORS.primary500 : 'transparent', }} > - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/index.jsx b/mobile/tradeverse/screens/explore-search-results/index.jsx index 93bd1659..2f52cb59 100644 --- a/mobile/tradeverse/screens/explore-search-results/index.jsx +++ b/mobile/tradeverse/screens/explore-search-results/index.jsx @@ -1,24 +1,24 @@ -import React, { useEffect, useMemo, useState } from "react"; -import { Pressable, StyleSheet, Text, View } from "react-native"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; -import GlobalScreen from "../../components/ui/global-screen"; -import Tabs from "./_components/tabs"; -import PaddedContainer from "../../components/ui/padded-container"; -import PopularView from "./views/popular-view"; -import { Stack, useLocalSearchParams } from "expo-router"; -import SearchBar from "./_components/search-bar"; -import { IconAdjustments } from "@tabler/icons-react-native"; -import SubForumsView from "./views/subforums-view"; -import TagsView from "./views/tags-view"; -import PostsView from "./views/posts-view"; -import UsersView from "./views/users-view"; -import AssetsView from "./views/asset-view"; -import { searchOnExplore } from "../../mock-services/explore"; +import React, { useEffect, useMemo, useState } from 'react' +import { Pressable, StyleSheet, Text, View } from 'react-native' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import GlobalScreen from '../../components/ui/global-screen' +import Tabs from './_components/tabs' +import PaddedContainer from '../../components/ui/padded-container' +import PopularView from './views/popular-view' +import { Stack, useLocalSearchParams } from 'expo-router' +import SearchBar from './_components/search-bar' +import { IconAdjustments } from '@tabler/icons-react-native' +import SubForumsView from './views/subforums-view' +import TagsView from './views/tags-view' +import PostsView from './views/posts-view' +import UsersView from './views/users-view' +import AssetsView from './views/asset-view' +import { searchOnExplore } from '../../mock-services/explore' export default function ExploreRootScreen() { - const [selectedTab, setSelectedTab] = useState("popular"); + const [selectedTab, setSelectedTab] = useState('popular') - const [updatedSearchKey, setUpdatedSearchKey] = useState(""); + const [updatedSearchKey, setUpdatedSearchKey] = useState('') const [data, setData] = useState({ popular: [], @@ -27,16 +27,16 @@ export default function ExploreRootScreen() { sub_forums: [], posts: [], people: [], - }); + }) - const { searchKey } = useLocalSearchParams(); + const { searchKey } = useLocalSearchParams() - useEffect(()=>{ + useEffect(() => { setUpdatedSearchKey(searchKey) - },[searchKey]) + }, [searchKey]) useEffect(() => { - const data = searchOnExplore(updatedSearchKey ?? searchKey); + const data = searchOnExplore(updatedSearchKey ?? searchKey) setData({ popular: data.popular, assets: data.assets, @@ -44,8 +44,8 @@ export default function ExploreRootScreen() { sub_forums: data.subforums, posts: data.posts, people: data.users, - }); - }, [searchKey, updatedSearchKey]); + }) + }, [searchKey, updatedSearchKey]) return ( { - setUpdatedSearchKey(val); + setUpdatedSearchKey(val) }} value={searchKey} /> {data && ( <> - {selectedTab === "popular" && } - {selectedTab === "assets" && } - {selectedTab === "tags" && } - {selectedTab === "sub_forums" && ( + {selectedTab === 'popular' && } + {selectedTab === 'assets' && } + {selectedTab === 'tags' && } + {selectedTab === 'sub_forums' && ( )} - {selectedTab === "posts" && } - {selectedTab === "people" && } + {selectedTab === 'posts' && } + {selectedTab === 'people' && } )} - ); + ) } const styles = StyleSheet.create({ @@ -113,4 +113,4 @@ const styles = StyleSheet.create({ fontSize: SIZE_CONSTANT * 1, color: COLORS.graytext, }, -}); +}) diff --git a/mobile/tradeverse/screens/explore-search-results/views/asset-view.jsx b/mobile/tradeverse/screens/explore-search-results/views/asset-view.jsx index 74b5c337..956ba8a1 100644 --- a/mobile/tradeverse/screens/explore-search-results/views/asset-view.jsx +++ b/mobile/tradeverse/screens/explore-search-results/views/asset-view.jsx @@ -1,7 +1,7 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import PostCard from "../_components/result-cards/post-result"; -import AssetResult from "../_components/result-cards/asset-result"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import PostCard from '../_components/result-cards/post-result' +import AssetResult from '../_components/result-cards/asset-result' export default function AssetsView({ data }) { return ( @@ -10,5 +10,5 @@ export default function AssetsView({ data }) { ))} - ); -} \ No newline at end of file + ) +} diff --git a/mobile/tradeverse/screens/explore-search-results/views/popular-view.jsx b/mobile/tradeverse/screens/explore-search-results/views/popular-view.jsx index edb4abd8..71378602 100644 --- a/mobile/tradeverse/screens/explore-search-results/views/popular-view.jsx +++ b/mobile/tradeverse/screens/explore-search-results/views/popular-view.jsx @@ -1,6 +1,6 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import PostCard from "../_components/result-cards/post-result"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import PostCard from '../_components/result-cards/post-result' export default function PopularView({ data }) { return ( @@ -9,5 +9,5 @@ export default function PopularView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/views/posts-view.jsx b/mobile/tradeverse/screens/explore-search-results/views/posts-view.jsx index a25732b8..7826333f 100644 --- a/mobile/tradeverse/screens/explore-search-results/views/posts-view.jsx +++ b/mobile/tradeverse/screens/explore-search-results/views/posts-view.jsx @@ -1,6 +1,6 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import PostResult from "../_components/result-cards/post-result"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import PostResult from '../_components/result-cards/post-result' export default function PostsView({ data }) { return ( @@ -9,5 +9,5 @@ export default function PostsView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/views/subforums-view.jsx b/mobile/tradeverse/screens/explore-search-results/views/subforums-view.jsx index ad88f44a..dbe6e0a7 100644 --- a/mobile/tradeverse/screens/explore-search-results/views/subforums-view.jsx +++ b/mobile/tradeverse/screens/explore-search-results/views/subforums-view.jsx @@ -1,6 +1,6 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import SubForumResult from "../_components/result-cards/sub-forum-result"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import SubForumResult from '../_components/result-cards/sub-forum-result' export default function SubForumsView({ data }) { return ( @@ -9,5 +9,5 @@ export default function SubForumsView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/views/tags-view.jsx b/mobile/tradeverse/screens/explore-search-results/views/tags-view.jsx index 741bac5b..1e0afd59 100644 --- a/mobile/tradeverse/screens/explore-search-results/views/tags-view.jsx +++ b/mobile/tradeverse/screens/explore-search-results/views/tags-view.jsx @@ -1,7 +1,7 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import SubForumResult from "../_components/result-cards/sub-forum-result"; -import TagResult from "../_components/result-cards/tag-result"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import SubForumResult from '../_components/result-cards/sub-forum-result' +import TagResult from '../_components/result-cards/tag-result' export default function TagsView({ data }) { return ( @@ -10,5 +10,5 @@ export default function TagsView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/explore-search-results/views/users-view.jsx b/mobile/tradeverse/screens/explore-search-results/views/users-view.jsx index 8044d67c..c0d7249a 100644 --- a/mobile/tradeverse/screens/explore-search-results/views/users-view.jsx +++ b/mobile/tradeverse/screens/explore-search-results/views/users-view.jsx @@ -1,6 +1,6 @@ -import { View, Text, ScrollView } from "react-native"; -import React from "react"; -import UserResult from "../_components/result-cards/user-result"; +import { View, Text, ScrollView } from 'react-native' +import React from 'react' +import UserResult from '../_components/result-cards/user-result' export default function UsersView({ data }) { return ( @@ -9,5 +9,5 @@ export default function UsersView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/followed-topics/index.jsx b/mobile/tradeverse/screens/followed-topics/index.jsx index 48aa01a6..af35167a 100644 --- a/mobile/tradeverse/screens/followed-topics/index.jsx +++ b/mobile/tradeverse/screens/followed-topics/index.jsx @@ -10,48 +10,48 @@ // ); // } -import React from "react"; +import React from 'react' import { View, Text, TouchableOpacity, StyleSheet, FlatList, -} from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import { Stack } from "expo-router"; +} from 'react-native' +import { Stack } from 'expo-router' +import GlobalScreen from '../../components/ui/global-screen' +import FullScrollView from '../../components/ui/full-scroll-view' const FollowedTagsScreen = () => { const followedTags = [ - { id: "1", name: "Investing", followers: 1500 }, - { id: "2", name: "Stock Market", followers: 2000 }, - { id: "3", name: "Personal Finance", followers: 1200 }, - { id: "4", name: "Cryptocurrency", followers: 1800 }, - { id: "5", name: "Financial Literacy", followers: 800 }, - { id: "6", name: "Budgeting", followers: 1600 }, - { id: "7", name: "Retirement Planning", followers: 900 }, - { id: "8", name: "Wealth Management", followers: 1300 }, - { id: "9", name: "Real Estate Investing", followers: 1700 }, - { id: "10", name: "Debt Management", followers: 1100 }, - { id: "11", name: "Passive Income", followers: 1400 }, - { id: "12", name: "Credit Score", followers: 700 }, - { id: "13", name: "Tax Planning", followers: 1000 }, - { id: "14", name: "Financial Independence", followers: 850 }, - { id: "15", name: "Investment Strategies", followers: 950 }, - { id: "16", name: "Mutual Funds", followers: 750 }, - { id: "17", name: "Forex Trading", followers: 1300 }, - { id: "18", name: "Insurance", followers: 600 }, - { id: "19", name: "Expense Tracking", followers: 1100 }, - { id: "20", name: "Economic Trends", followers: 1200 }, - ]; + { id: '1', name: 'Investing', followers: 1500 }, + { id: '2', name: 'Stock Market', followers: 2000 }, + { id: '3', name: 'Personal Finance', followers: 1200 }, + { id: '4', name: 'Cryptocurrency', followers: 1800 }, + { id: '5', name: 'Financial Literacy', followers: 800 }, + { id: '6', name: 'Budgeting', followers: 1600 }, + { id: '7', name: 'Retirement Planning', followers: 900 }, + { id: '8', name: 'Wealth Management', followers: 1300 }, + { id: '9', name: 'Real Estate Investing', followers: 1700 }, + { id: '10', name: 'Debt Management', followers: 1100 }, + { id: '11', name: 'Passive Income', followers: 1400 }, + { id: '12', name: 'Credit Score', followers: 700 }, + { id: '13', name: 'Tax Planning', followers: 1000 }, + { id: '14', name: 'Financial Independence', followers: 850 }, + { id: '15', name: 'Investment Strategies', followers: 950 }, + { id: '16', name: 'Mutual Funds', followers: 750 }, + { id: '17', name: 'Forex Trading', followers: 1300 }, + { id: '18', name: 'Insurance', followers: 600 }, + { id: '19', name: 'Expense Tracking', followers: 1100 }, + { id: '20', name: 'Economic Trends', followers: 1200 }, + ] const renderTagItem = ({ item }) => ( {item.name} {item.followers} Followers - ); + ) return ( @@ -59,7 +59,7 @@ const FollowedTagsScreen = () => { @@ -77,68 +77,68 @@ const FollowedTagsScreen = () => { - ); -}; + ) +} const styles = StyleSheet.create({ container: { flex: 1, paddingTop: 40, - backgroundColor: "#fff", + backgroundColor: '#fff', }, header: { fontSize: 18, - fontWeight: "bold", + fontWeight: 'bold', marginBottom: 20, - textAlign: "center", + textAlign: 'center', }, tagList: { paddingBottom: 60, // Extra padding for the bottom nav bar }, tagBox: { - backgroundColor: "#FFF", + backgroundColor: '#FFF', padding: 15, marginVertical: 10, borderRadius: 10, elevation: 2, // Adds shadow effect - alignItems: "center", + alignItems: 'center', borderWidth: 1, // Add a border around the box - borderColor: "#EAEAEA", // Border color + borderColor: '#EAEAEA', // Border color }, tagName: { fontSize: 16, - fontWeight: "bold", - color: "#333", + fontWeight: 'bold', + color: '#333', }, tagFollowers: { fontSize: 14, - color: "#777", + color: '#777', }, bottomNav: { - position: "absolute", // Position at the bottom of the screen + position: 'absolute', // Position at the bottom of the screen bottom: 0, left: 0, right: 0, - flexDirection: "row", - justifyContent: "space-around", - alignItems: "center", - backgroundColor: "#4B49F5", // Main background color of the nav bar + flexDirection: 'row', + justifyContent: 'space-around', + alignItems: 'center', + backgroundColor: '#4B49F5', // Main background color of the nav bar height: 60, // Height of the navigation bar borderTopWidth: 1, - borderTopColor: "#EAEAEA", // Adds a border on top of the nav bar for separation + borderTopColor: '#EAEAEA', // Adds a border on top of the nav bar for separation }, navButton: { - justifyContent: "center", - alignItems: "center", + justifyContent: 'center', + alignItems: 'center', }, activeButton: { width: 50, height: 50, borderRadius: 25, // Rounded button - backgroundColor: "#624BF6", // Different color for the active button - justifyContent: "center", - alignItems: "center", + backgroundColor: '#624BF6', // Different color for the active button + justifyContent: 'center', + alignItems: 'center', }, -}); +}) -export default FollowedTagsScreen; +export default FollowedTagsScreen diff --git a/mobile/tradeverse/screens/followed-users/_components/UserCard.jsx b/mobile/tradeverse/screens/followed-users/_components/UserCard.jsx index 0452dd88..e3f76455 100644 --- a/mobile/tradeverse/screens/followed-users/_components/UserCard.jsx +++ b/mobile/tradeverse/screens/followed-users/_components/UserCard.jsx @@ -1,25 +1,25 @@ -import { View, Text } from "react-native"; -import React from "react"; -import ProfileImage from "../../../components/images/profile-image"; +import { View, Text } from 'react-native' +import React from 'react' +import ProfileImage from '../../../components/images/profile-image' import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES, -} from "../../../constants/theme"; +} from '../../../constants/theme' export default function UserCard({ user }) { return ( @@ -34,8 +34,8 @@ export default function UserCard({ user }) { @@ -53,7 +53,7 @@ export default function UserCard({ user }) { - ); + ) } diff --git a/mobile/tradeverse/screens/followed-users/index.jsx b/mobile/tradeverse/screens/followed-users/index.jsx index 599893c5..4b01fbab 100644 --- a/mobile/tradeverse/screens/followed-users/index.jsx +++ b/mobile/tradeverse/screens/followed-users/index.jsx @@ -1,5 +1,5 @@ // Import necessary components and libraries -import React from "react"; +import React from 'react' import { View, Text, @@ -8,12 +8,12 @@ import { FlatList, StyleSheet, SafeAreaView, -} from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import ProfileImage from "../../components/images/profile-image"; -import UserCard from "./_components/UserCard"; -import { Stack } from "expo-router"; +} from 'react-native' +import { Stack } from 'expo-router' +import GlobalScreen from '../../components/ui/global-screen' +import FullScrollView from '../../components/ui/full-scroll-view' +import ProfileImage from '../../components/images/profile-image' +import UserCard from './_components/UserCard' // Mock data: 14 users with username, followers, and profile picture const mockUsers = Array.from({ length: 14 }, (_, i) => ({ @@ -22,30 +22,29 @@ const mockUsers = Array.from({ length: 14 }, (_, i) => ({ name: `Name ${i + 1}`, surname: `Surname ${i + 1}`, followers: Math.floor(Math.random() * 500), - profilePic: "https://via.placeholder.com/50", // Placeholder image for avatar -})); + profilePic: 'https://via.placeholder.com/50', // Placeholder image for avatar +})) // Main screen component -const FollowedUsersScreen = () => { - - return ( - - - - - {mockUsers.map((item) => ( - - - - ))} - - - - ); -}; +const FollowedUsersScreen = () => ( + + + + + {mockUsers.map((item) => ( + + + + ))} + + + +) // Styles for the screen const styles = StyleSheet.create({ @@ -55,34 +54,34 @@ const styles = StyleSheet.create({ topBlock: { flex: 1, paddingTop: 20, // Adds space to prevent title from colliding with the notification bar - backgroundColor: "#fff", + backgroundColor: '#fff', }, title: { fontSize: 24, - fontWeight: "bold", - color: "#6a0dad", + fontWeight: 'bold', + color: '#6a0dad', marginBottom: 10, - textAlign: "center", // Center aligns the title + textAlign: 'center', // Center aligns the title }, profilePic: { width: 50, height: 50, borderRadius: 25, // Makes the avatar circular marginRight: 15, - backgroundColor: "#d3d3d3", // Adds a background color to indicate where the profile picture is + backgroundColor: '#d3d3d3', // Adds a background color to indicate where the profile picture is }, userInfo: { flex: 1, }, username: { fontSize: 18, - fontWeight: "600", - color: "#4b0082", + fontWeight: '600', + color: '#4b0082', }, followers: { fontSize: 14, - color: "#6a0dad", + color: '#6a0dad', }, -}); +}) -export default FollowedUsersScreen; +export default FollowedUsersScreen diff --git a/mobile/tradeverse/screens/home-root/_components/post-card.jsx b/mobile/tradeverse/screens/home-root/_components/post-card.jsx index 177da7b8..d617f52c 100644 --- a/mobile/tradeverse/screens/home-root/_components/post-card.jsx +++ b/mobile/tradeverse/screens/home-root/_components/post-card.jsx @@ -1,23 +1,23 @@ -import { View, Text } from "react-native"; -import React from "react"; -import { - COLORS, - FONT_WEIGHTS, - SIZE_CONSTANT, - SIZES, -} from "../../../constants/theme"; -import ProfileImage from "../../../components/images/profile-image"; +import { View, Text } from 'react-native' +import React from 'react' import { IconEye, IconMessage, IconMessageCircle2, IconThumbDown, IconThumbUp, -} from "@tabler/icons-react-native"; -import UserLink from "../../../components/links/user-link"; -import paths from "../../../config/screen-paths"; -import PostLink from "../../../components/links/post-link"; -import SubforumLink from "../../../components/links/subforum-link"; +} from '@tabler/icons-react-native' +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../../constants/theme' +import ProfileImage from '../../../components/images/profile-image' +import UserLink from '../../../components/links/user-link' +import paths from '../../../config/screen-paths' +import PostLink from '../../../components/links/post-link' +import SubforumLink from '../../../components/links/subforum-link' // { // title: 'Title', @@ -40,144 +40,131 @@ import SubforumLink from "../../../components/links/subforum-link"; // }, // } -const AuthorInfo = ({ author }) => { - return ( - - - - - - ( + + + + - - {author.name} {author.surname} - - - @{author.username} - - + src={author.avatar} + /> - - ); -}; - -const SubforumInfo = ({ subforum }) => { - return ( - - {subforum.title} + {author.name} {author.surname} - - - ); -}; - -const TagText = ({ tag, index = 0, isLast = false }) => { - return ( - - {index === 0 ? "" : " "}@{tag.value} - - ); -}; - -const DefaultText = ({ text, index = 0 }) => { - return ( - - {index === 0 ? "" : " "} - {text.value} - - ); -}; - -const InteractionInfo = ({ icon = () => {}, value }) => { - return ( - - {icon({ prop: { color: "#444" } })} - - {value} + @{author.username} - ); -}; + +) + +const SubforumInfo = ({ subforum }) => ( + + + + {subforum.title} + + + +) + +const TagText = ({ tag, index = 0, isLast = false }) => ( + + {index === 0 ? '' : ' '}@{tag.value} + +) + +const DefaultText = ({ text, index = 0 }) => ( + + {index === 0 ? '' : ' '} + {text.value} + +) + +const InteractionInfo = ({ icon = () => {}, value }) => ( + + {icon({ prop: { color: '#444' } })} + + + {value} + + + +) export default function PostCard({ style, post }) { - return ( @@ -218,11 +205,11 @@ export default function PostCard({ style, post }) { {post.content.map((content, index) => { - if (content.type === "text") { - return ; + if (content.type === 'text') { + return } - if (content.type === "tag") { - return ; + if (content.type === 'tag') { + return } })} @@ -230,9 +217,9 @@ export default function PostCard({ style, post }) { @@ -243,8 +230,8 @@ export default function PostCard({ style, post }) { @@ -264,5 +251,5 @@ export default function PostCard({ style, post }) { - ); + ) } diff --git a/mobile/tradeverse/screens/home-root/_components/tabs.jsx b/mobile/tradeverse/screens/home-root/_components/tabs.jsx index b207d7a7..5264adbc 100644 --- a/mobile/tradeverse/screens/home-root/_components/tabs.jsx +++ b/mobile/tradeverse/screens/home-root/_components/tabs.jsx @@ -1,28 +1,31 @@ import React from 'react' import { Pressable, View, Text } from 'react-native' -import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES } from '../../../constants/theme' - -export default function Tabs({selectedTab, setSelectedTab}) { - - - const TABS = [ - { - label: 'For You', - value: 'for_you', - }, - { - label: 'Followed Topics', - value: 'followed_topics', - }, - { - label: 'Followed People', - value: 'followed_people', - } - ] +import { + COLORS, + FONT_WEIGHTS, + SIZE_CONSTANT, + SIZES, +} from '../../../constants/theme' +export default function Tabs({ selectedTab, setSelectedTab }) { + const TABS = [ + { + label: 'For You', + value: 'for_you', + }, + { + label: 'Followed Topics', + value: 'followed_topics', + }, + { + label: 'Followed People', + value: 'followed_people', + }, + ] return ( - - {TABS.map((tab, index) => ( - setSelectedTab(tab.value)} - style={{ - flex: 1, - justifyContent: 'center', - alignItems: 'center', - paddingVertical: 10, - backgroundColor:selectedTab === tab.value ? `${COLORS.primary50}80` : 'transparent', - borderBottomWidth: selectedTab === tab.value ? SIZE_CONSTANT*0.3 : 0, - borderBottomColor: selectedTab === tab.value ? COLORS.primary500 : 'transparent' - }} - > - {tab.label} - - ))} - + borderBottomColor: '#f1f1f1', + }} + > + {TABS.map((tab, index) => ( + setSelectedTab(tab.value)} + style={{ + flex: 1, + justifyContent: 'center', + alignItems: 'center', + paddingVertical: 10, + backgroundColor: + selectedTab === tab.value + ? `${COLORS.primary50}80` + : 'transparent', + borderBottomWidth: + selectedTab === tab.value ? SIZE_CONSTANT * 0.3 : 0, + borderBottomColor: + selectedTab === tab.value ? COLORS.primary500 : 'transparent', + }} + > + + {tab.label} + + + ))} ) } diff --git a/mobile/tradeverse/screens/home-root/index.jsx b/mobile/tradeverse/screens/home-root/index.jsx index 82854170..0c445601 100644 --- a/mobile/tradeverse/screens/home-root/index.jsx +++ b/mobile/tradeverse/screens/home-root/index.jsx @@ -1,31 +1,30 @@ -import React, { useEffect, useState } from "react"; -import { StyleSheet, Text, View } from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import ForYouView from "./views/for-you-view"; -import Tabs from "./_components/tabs"; -import FollowedTopicsView from "./views/followed-topics-view"; -import FollowedPeopleView from "./views/followed-people-view"; -import { getHomeFeed } from "../../mock-services/home"; -export default function HomeRootScreen() { - +import React, { useEffect, useState } from 'react' +import { StyleSheet, Text, View } from 'react-native' +import GlobalScreen from '../../components/ui/global-screen' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' +import FullScrollView from '../../components/ui/full-scroll-view' +import ForYouView from './views/for-you-view' +import Tabs from './_components/tabs' +import FollowedTopicsView from './views/followed-topics-view' +import FollowedPeopleView from './views/followed-people-view' +import { getHomeFeed } from '../../mock-services/home' - const [selectedTab, setSelectedTab] = useState("for_you"); // for_you, followed_topics, followed_people +export default function HomeRootScreen() { + const [selectedTab, setSelectedTab] = useState('for_you') // for_you, followed_topics, followed_people const [data, setData] = useState({ forYouPosts: [], followedTopicsPosts: [], followedPeoplePosts: [], - }); + }) useEffect(() => { - const data = getHomeFeed(); + const data = getHomeFeed() setData({ forYouPosts: data.forYouPosts, followedTopicsPosts: data.followedTopicsPosts, followedPeoplePosts: data.followedPeoplePosts, - }); - }, []); + }) + }, []) return ( {data && ( - {selectedTab === "for_you" && } - {selectedTab === "followed_topics" && ( + {selectedTab === 'for_you' && } + {selectedTab === 'followed_topics' && ( )} - {selectedTab === "followed_people" && ( + {selectedTab === 'followed_people' && ( )} )} - ); + ) } const styles = StyleSheet.create({ @@ -57,4 +56,4 @@ const styles = StyleSheet.create({ fontSize: SIZE_CONSTANT * 1, color: COLORS.graytext, }, -}); +}) diff --git a/mobile/tradeverse/screens/home-root/views/followed-people-view.jsx b/mobile/tradeverse/screens/home-root/views/followed-people-view.jsx index 8220854a..d4a5722d 100644 --- a/mobile/tradeverse/screens/home-root/views/followed-people-view.jsx +++ b/mobile/tradeverse/screens/home-root/views/followed-people-view.jsx @@ -1,6 +1,6 @@ -import { View, Text } from "react-native"; -import React from "react"; -import PostCard from "../_components/post-card"; +import { View, Text } from 'react-native' +import React from 'react' +import PostCard from '../_components/post-card' export default function FollowedPeopleView({ data }) { return ( @@ -9,5 +9,5 @@ export default function FollowedPeopleView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/home-root/views/followed-topics-view.jsx b/mobile/tradeverse/screens/home-root/views/followed-topics-view.jsx index b2a69737..b830d52d 100644 --- a/mobile/tradeverse/screens/home-root/views/followed-topics-view.jsx +++ b/mobile/tradeverse/screens/home-root/views/followed-topics-view.jsx @@ -1,6 +1,6 @@ -import { View, Text } from "react-native"; -import React from "react"; -import PostCard from "../_components/post-card"; +import { View, Text } from 'react-native' +import React from 'react' +import PostCard from '../_components/post-card' export default function FollowedTopicsView({ data }) { return ( @@ -9,5 +9,5 @@ export default function FollowedTopicsView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/home-root/views/for-you-view.jsx b/mobile/tradeverse/screens/home-root/views/for-you-view.jsx index 8cd3fb0d..e07e7113 100644 --- a/mobile/tradeverse/screens/home-root/views/for-you-view.jsx +++ b/mobile/tradeverse/screens/home-root/views/for-you-view.jsx @@ -1,6 +1,6 @@ -import { View, Text } from "react-native"; -import React from "react"; -import PostCard from "../_components/post-card"; +import { View, Text } from 'react-native' +import React from 'react' +import PostCard from '../_components/post-card' export default function ForYouView({ data }) { return ( @@ -9,5 +9,5 @@ export default function ForYouView({ data }) { ))} - ); + ) } diff --git a/mobile/tradeverse/screens/portfolio/index.jsx b/mobile/tradeverse/screens/portfolio/index.jsx index 5737d8a0..bbb7cf3c 100644 --- a/mobile/tradeverse/screens/portfolio/index.jsx +++ b/mobile/tradeverse/screens/portfolio/index.jsx @@ -1,28 +1,28 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState } from 'react' import { View, Text, ScrollView, StyleSheet, TouchableOpacity, -} from "react-native"; -import FullScrollView from "../../components/ui/full-scroll-view"; -import GlobalScreen from "../../components/ui/global-screen"; -import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT } from "../../constants/theme"; -import { router, Stack } from "expo-router"; -import paths from "../../config/screen-paths"; -import { searchAssets } from "../../mock-services/assets"; +} from 'react-native' +import { router, Stack } from 'expo-router' +import FullScrollView from '../../components/ui/full-scroll-view' +import GlobalScreen from '../../components/ui/global-screen' +import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT } from '../../constants/theme' +import paths from '../../config/screen-paths' +import { searchAssets } from '../../mock-services/assets' // Mock Data const PortfolioScreen = () => { - const [data, setData] = useState([]); + const [data, setData] = useState([]) useEffect(() => { - const data = searchAssets("") + const data = searchAssets('') .slice(0, 5) - .map((a) => ({ ...a, value: Math.floor(Math.random() * 10000) })); - setData(data); - }, []); + .map((a) => ({ ...a, value: Math.floor(Math.random() * 10000) })) + setData(data) + }, []) return ( @@ -30,7 +30,7 @@ const PortfolioScreen = () => { @@ -38,7 +38,7 @@ const PortfolioScreen = () => { My Portfolio { - router.push(paths.PORTFOLIO.ADD_ASSET); + router.push(paths.PORTFOLIO.ADD_ASSET) }} style={styles.addButton} > @@ -54,8 +54,8 @@ const PortfolioScreen = () => { { router.push( - paths.PORTFOLIO.ASSET_DETAIL + `?assetId=${asset.id}` - ); + `${paths.PORTFOLIO.ASSET_DETAIL}?assetId=${asset.id}` + ) }} key={index} style={styles.assetBlock} @@ -70,8 +70,8 @@ const PortfolioScreen = () => { - ); -}; + ) +} // Styles const styles = StyleSheet.create({ @@ -79,62 +79,62 @@ const styles = StyleSheet.create({ flex: 1, }, titleBlock: { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', marginBottom: 20, }, title: { fontSize: 24, - fontWeight: "bold", + fontWeight: 'bold', color: COLORS.primary800, }, addButton: { - backgroundColor:COLORS.primary500, + backgroundColor: COLORS.primary500, width: 48, height: 48, - display: "flex", - alignItems: "center", - justifyContent: "center", + display: 'flex', + alignItems: 'center', + justifyContent: 'center', borderRadius: 25, }, addButtonText: { fontSize: SIZE_CONSTANT * 2, fontWeight: FONT_WEIGHTS.medium, - color: "#FFFFFF", // White text + color: '#FFFFFF', // White text }, scrollViewContent: { paddingBottom: 30, }, portfolioBlock: { - flexDirection: "row", - flexWrap: "wrap", - justifyContent: "space-between", + flexDirection: 'row', + flexWrap: 'wrap', + justifyContent: 'space-between', }, assetBlock: { borderColor: COLORS.primary50, // Light purple - borderWidth: .5, + borderWidth: 0.5, backgroundColor: COLORS.primary100, // Lighter purple - width: "48%", + width: '48%', height: 100, borderRadius: 10, padding: 10, - justifyContent: "space-between", + justifyContent: 'space-between', marginBottom: 20, }, assetName: { fontSize: 18, - fontWeight: "bold", - color:COLORS.primary700, + fontWeight: 'bold', + color: COLORS.primary700, }, assetValue: { fontSize: 16, - color:COLORS.primary800, - alignSelf: "flex-end", + color: COLORS.primary800, + alignSelf: 'flex-end', }, -}); +}) -export default PortfolioScreen; +export default PortfolioScreen diff --git a/mobile/tradeverse/screens/post-detail/_components/post-header.jsx b/mobile/tradeverse/screens/post-detail/_components/post-header.jsx index 3142ab3e..68d8372c 100644 --- a/mobile/tradeverse/screens/post-detail/_components/post-header.jsx +++ b/mobile/tradeverse/screens/post-detail/_components/post-header.jsx @@ -1,21 +1,18 @@ -import { View, Text } from "react-native"; -import React from "react"; -import { - COLORS, - FONT_WEIGHTS, -} from "../../../constants/theme"; -import ProfileImage from "../../../components/images/profile-image"; +import { View, Text } from 'react-native' +import React from 'react' import { IconEye, IconMessage, IconMessageCircle2, IconThumbDown, IconThumbUp, -} from "@tabler/icons-react-native"; -import UserLink from "../../../components/links/user-link"; -import paths from "../../../config/screen-paths"; -import PostLink from "../../../components/links/post-link"; -import SubforumLink from "../../../components/links/subforum-link"; +} from '@tabler/icons-react-native' +import { COLORS, FONT_WEIGHTS } from '../../../constants/theme' +import ProfileImage from '../../../components/images/profile-image' +import UserLink from '../../../components/links/user-link' +import paths from '../../../config/screen-paths' +import PostLink from '../../../components/links/post-link' +import SubforumLink from '../../../components/links/subforum-link' // { // title: 'Title', @@ -37,152 +34,139 @@ import SubforumLink from "../../../components/links/subforum-link"; // id: 1, // }, // } -const SIZE_CONSTANT = 14; +const SIZE_CONSTANT = 14 const SIZES = { - xxSmall: SIZE_CONSTANT * 1, - xSmall: SIZE_CONSTANT * 1.2, - small: SIZE_CONSTANT * 1.4, - medium: SIZE_CONSTANT * 1.6, - large: SIZE_CONSTANT * 1.8, - xLarge: SIZE_CONSTANT * 2, - + xxSmall: SIZE_CONSTANT * 1, + xSmall: SIZE_CONSTANT * 1.2, + small: SIZE_CONSTANT * 1.4, + medium: SIZE_CONSTANT * 1.6, + large: SIZE_CONSTANT * 1.8, + xLarge: SIZE_CONSTANT * 2, } -const AuthorInfo = ({ author }) => { - return ( - - - - - - ( + + + + - - {author.name} {author.surname} - - - @{author.username} - - + src={author.avatar} + /> - - ); -}; - -const SubforumInfo = ({ subforum }) => { - return ( - - {subforum.title} + {author.name} {author.surname} - - - ); -}; - -const TagText = ({ tag, index = 0, isLast = false }) => { - return ( - - {index === 0 ? "" : " "}@{tag.value} - - ); -}; - -const DefaultText = ({ text, index = 0 }) => { - return ( - - {index === 0 ? "" : " "} - {text.value} - - ); -}; - -const InteractionInfo = ({ icon = () => {}, value }) => { - return ( - - {icon({ prop: { color: "#444" } })} - - {value} + @{author.username} - ); -}; + +) + +const SubforumInfo = ({ subforum }) => ( + + + + {subforum.title} + + + +) + +const TagText = ({ tag, index = 0, isLast = false }) => ( + + {index === 0 ? '' : ' '}@{tag.value} + +) + +const DefaultText = ({ text, index = 0 }) => ( + + {index === 0 ? '' : ' '} + {text.value} + +) + +const InteractionInfo = ({ icon = () => {}, value }) => ( + + {icon({ prop: { color: '#444' } })} + + + {value} + + + +) export default function PostHeader({ style, post }) { return ( @@ -193,15 +177,15 @@ export default function PostHeader({ style, post }) { paddingTop: SIZE_CONSTANT * 1.2, paddingBottom: SIZE_CONSTANT * 1.4, borderBottomWidth: 0.5, - borderBottomColor: "#E5E5E5", + borderBottomColor: '#E5E5E5', }} > @@ -225,11 +209,11 @@ export default function PostHeader({ style, post }) { {post.content.map((content, index) => { - if (content.type === "text") { - return ; + if (content.type === 'text') { + return } - if (content.type === "tag") { - return ; + if (content.type === 'tag') { + return } })} @@ -237,9 +221,9 @@ export default function PostHeader({ style, post }) { @@ -250,8 +234,8 @@ export default function PostHeader({ style, post }) { @@ -271,5 +255,5 @@ export default function PostHeader({ style, post }) { - ); + ) } diff --git a/mobile/tradeverse/screens/post-detail/index.jsx b/mobile/tradeverse/screens/post-detail/index.jsx index cbd23576..f0f3f751 100644 --- a/mobile/tradeverse/screens/post-detail/index.jsx +++ b/mobile/tradeverse/screens/post-detail/index.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState } from 'react' import { View, Text, @@ -7,54 +7,54 @@ import { Image, TouchableOpacity, Dimensions, -} from "react-native"; -import { Ionicons } from "@expo/vector-icons"; // Icon library -import { useLocalSearchParams } from "expo-router"; -import { getPostById } from "../../mock-services/post"; -import PostCard from "../home-root/_components/post-card"; -import PostHeader from "./_components/post-header"; -import GlobalScreen from "../../components/ui/global-screen"; +} from 'react-native' +import { Ionicons } from '@expo/vector-icons' // Icon library +import { useLocalSearchParams } from 'expo-router' +import { getPostById } from '../../mock-services/post' +import PostCard from '../home-root/_components/post-card' +import PostHeader from './_components/post-header' +import GlobalScreen from '../../components/ui/global-screen' -const { width } = Dimensions.get("window"); // Get screen width +const { width } = Dimensions.get('window') // Get screen width // Expanded mock comments to test scrolling const mockComments = Array.from({ length: 20 }).map((_, index) => ({ id: String(index + 1), name: `User ${index + 1}`, username: `@user${index + 1}`, - text: "This is a sample comment.", + text: 'This is a sample comment.', image: null, -})); +})) const post = { - user: { name: "Daron Acemoğlu", username: "@godofinvestment", image: null }, - forum: "Stock Market Trends & Day Trading Discussions", - title: "How to pass into profitable area in stock marketing.", - text: "Economic downturns can be challenging, but they also offer opportunities for strategic investments. 💡 In uncertain times, those who adapt and stay informed can turn risk into reward.", - hashtags: ["#Stocks", "#Investing", "#MarketTrends"], + user: { name: 'Daron Acemoğlu', username: '@godofinvestment', image: null }, + forum: 'Stock Market Trends & Day Trading Discussions', + title: 'How to pass into profitable area in stock marketing.', + text: 'Economic downturns can be challenging, but they also offer opportunities for strategic investments. 💡 In uncertain times, those who adapt and stay informed can turn risk into reward.', + hashtags: ['#Stocks', '#Investing', '#MarketTrends'], stats: { views: 12300, comments: 132, likes: 132, dislikes: 132 }, -}; +} const PostScreen = () => { - const [likeStatus, setLikeStatus] = useState(null); + const [likeStatus, setLikeStatus] = useState(null) const handlePress = (type) => { - setLikeStatus((prev) => (prev === type ? null : type)); - }; + setLikeStatus((prev) => (prev === type ? null : type)) + } - const { postId } = useLocalSearchParams(); - const [data, setData] = useState(null); + const { postId } = useLocalSearchParams() + const [data, setData] = useState(null) useEffect(() => { - const postDetail = getPostById(postId); - setData(postDetail); - }, [postId]); + const postDetail = getPostById(postId) + setData(postDetail) + }, [postId]) const renderComment = ({ item }) => ( @@ -64,12 +64,14 @@ const PostScreen = () => { {item.text} - ); + ) if (data) { return ( - + { contentContainerStyle={{ paddingBottom: 20 }} /> - ); - } else { - return <>; + ) } -}; + return <> +} const styles = StyleSheet.create({ - container: { flex: 1, backgroundColor: "white" }, - postBlock: { padding: 15, backgroundColor: "#f3e5f5", marginBottom: 10 }, + container: { flex: 1, backgroundColor: 'white' }, + postBlock: { padding: 15, backgroundColor: '#f3e5f5', marginBottom: 10 }, postHeader: { - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', marginBottom: 10, }, - userInfo: { flexDirection: "row", alignItems: "center" }, + userInfo: { flexDirection: 'row', alignItems: 'center' }, avatar: { width: 40, height: 40, borderRadius: 20, marginRight: 10 }, - username: { fontWeight: "bold", fontSize: 16 }, - handle: { color: "gray" }, - forum: { color: "purple", fontSize: 14, marginLeft: 10 }, + username: { fontWeight: 'bold', fontSize: 16 }, + handle: { color: 'gray' }, + forum: { color: 'purple', fontSize: 14, marginLeft: 10 }, postContent: { marginTop: 10 }, - title: { fontSize: 18, fontWeight: "bold", marginBottom: 5 }, + title: { fontSize: 18, fontWeight: 'bold', marginBottom: 5 }, postImage: { width: width - 30, height: 200, marginVertical: 10 }, postText: { fontSize: 16, marginBottom: 5 }, - hashtags: { flexDirection: "row", flexWrap: "wrap" }, - hashtag: { color: "purple", marginRight: 10 }, + hashtags: { flexDirection: 'row', flexWrap: 'wrap' }, + hashtag: { color: 'purple', marginRight: 10 }, postFooter: { - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', marginTop: 10, }, - stat: { flexDirection: "row", alignItems: "center", marginRight: 15 }, + stat: { flexDirection: 'row', alignItems: 'center', marginRight: 15 }, commentBlock: { marginBottom: 10, paddingHorizontal: 15 }, commentText: { marginLeft: 50, fontSize: 16 }, -}); +}) -export default PostScreen; +export default PostScreen diff --git a/mobile/tradeverse/screens/profile/index.jsx b/mobile/tradeverse/screens/profile/index.jsx index 65fbc1f5..f6b60f9f 100644 --- a/mobile/tradeverse/screens/profile/index.jsx +++ b/mobile/tradeverse/screens/profile/index.jsx @@ -1,31 +1,31 @@ -import React, { useEffect, useState } from "react"; -import { View, Text, StyleSheet, Image, TouchableOpacity } from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import { Stack, useLocalSearchParams } from "expo-router"; -import PostCard from "../home-root/_components/post-card"; -import PaddedContainer from "../../components/ui/padded-container"; -import { getUserByUsername } from "../../mock-services/users"; -import { getPostsByUser } from "../../mock-services/post"; -import formatInteractionNumber from "../../util/format-number"; -import ProfileImage from "../../components/images/profile-image"; +import React, { useEffect, useState } from 'react' +import { View, Text, StyleSheet, Image, TouchableOpacity } from 'react-native' +import GlobalScreen from '../../components/ui/global-screen' +import { Stack, useLocalSearchParams } from 'expo-router' +import PostCard from '../home-root/_components/post-card' +import PaddedContainer from '../../components/ui/padded-container' +import { getUserByUsername } from '../../mock-services/users' +import { getPostsByUser } from '../../mock-services/post' +import formatInteractionNumber from '../../util/format-number' +import ProfileImage from '../../components/images/profile-image' const ProfileHeader = () => { - const [activeTab, setActiveTab] = useState("Recent"); // State for tab selection - const [postsData, setPostsData] = useState([]); - const [profile, setProfile] = useState({}); + const [activeTab, setActiveTab] = useState('Recent') // State for tab selection + const [postsData, setPostsData] = useState([]) + const [profile, setProfile] = useState({}) - const { username } = useLocalSearchParams(); + const { username } = useLocalSearchParams() useEffect(() => { - const profileResult = getUserByUsername(username); - const postsResult = getPostsByUser(username); + const profileResult = getUserByUsername(username) + const postsResult = getPostsByUser(username) - setPostsData(postsResult); - setProfile(profileResult); - }, [username]); + setPostsData(postsResult) + setProfile(profileResult) + }, [username]) if (!profile || !postsData) { - return ; + return } return ( @@ -37,7 +37,7 @@ const ProfileHeader = () => { @@ -76,16 +76,16 @@ const ProfileHeader = () => { - setActiveTab("Recent")}> + setActiveTab('Recent')}> Recent - setActiveTab("Popular")}> + setActiveTab('Popular')}> Popular @@ -96,18 +96,18 @@ const ProfileHeader = () => { ))} - ); -}; + ) +} const styles = StyleSheet.create({ upperBar: { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', }, profileInfo: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', }, profileImage: { width: 70, @@ -119,62 +119,62 @@ const styles = StyleSheet.create({ }, name: { fontSize: 20, - fontWeight: "bold", + fontWeight: 'bold', }, username: { fontSize: 16, - color: "gray", + color: 'gray', }, threeDots: { paddingHorizontal: 10, }, dotsText: { fontSize: 24, - color: "gray", + color: 'gray', }, middleBar: { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', marginVertical: 20, }, stat: { - alignItems: "center", + alignItems: 'center', }, statNumber: { fontSize: 18, - fontWeight: "bold", + fontWeight: 'bold', }, statLabel: { fontSize: 14, - color: "gray", + color: 'gray', }, followButton: { - backgroundColor: "#6C63FF", + backgroundColor: '#6C63FF', paddingHorizontal: 20, paddingVertical: 8, borderRadius: 5, }, followButtonText: { - color: "white", + color: 'white', fontSize: 16, - fontWeight: "bold", + fontWeight: 'bold', }, tabSection: { - flexDirection: "row", - justifyContent: "space-around", + flexDirection: 'row', + justifyContent: 'space-around', borderTopWidth: 1, - borderTopColor: "#eee", + borderTopColor: '#eee', paddingTop: 10, }, tab: { fontSize: 16, - fontWeight: "bold", - color: "#6C63FF", + fontWeight: 'bold', + color: '#6C63FF', }, activeTab: { - textDecorationLine: "underline", + textDecorationLine: 'underline', }, -}); +}) -export default ProfileHeader; +export default ProfileHeader diff --git a/mobile/tradeverse/screens/subforum-detail/index.jsx b/mobile/tradeverse/screens/subforum-detail/index.jsx index 2458f645..36c93911 100644 --- a/mobile/tradeverse/screens/subforum-detail/index.jsx +++ b/mobile/tradeverse/screens/subforum-detail/index.jsx @@ -1,20 +1,20 @@ -import React, { useEffect, useState } from "react"; -import { View, Text, ScrollView, StyleSheet } from "react-native"; -import GlobalScreen from "../../components/ui/global-screen"; -import { useLocalSearchParams } from "expo-router"; -import { getSubForumById } from "../../mock-services/subforums"; -import PostCard from "../home-root/_components/post-card"; -import { COLORS, SIZE_CONSTANT } from "../../constants/theme"; +import React, { useEffect, useState } from 'react' +import { View, Text, ScrollView, StyleSheet } from 'react-native' +import GlobalScreen from '../../components/ui/global-screen' +import { useLocalSearchParams } from 'expo-router' +import { getSubForumById } from '../../mock-services/subforums' +import PostCard from '../home-root/_components/post-card' +import { COLORS, SIZE_CONSTANT } from '../../constants/theme' const SubforumScreen = () => { - const [data, setData] = useState(null); + const [data, setData] = useState(null) - const { subforumId } = useLocalSearchParams(); + const { subforumId } = useLocalSearchParams() useEffect(() => { - const res = getSubForumById(subforumId); - setData(res); - }, [subforumId]); + const res = getSubForumById(subforumId) + setData(res) + }, [subforumId]) return ( { {data && ( - {data?.title} - - - - - {`✍️ ${data?.posts?.length}`} - - + {data?.title} + {`✍️ ${data?.posts?.length}`} {data?.posts.map((post) => ( - + ))} )} - ); -}; + ) +} // Styles const styles = StyleSheet.create({ - titleBlock: { marginLeft: SIZE_CONSTANT * 1, marginBottom: 20, }, title: { fontSize: 24, - fontWeight: "bold", - color:COLORS.primary950, + fontWeight: 'bold', + color: COLORS.primary950, }, scrollViewContent: { paddingBottom: 30, }, postContainer: { - backgroundColor: "#F3E5F5", // Lightest purple + backgroundColor: '#F3E5F5', // Lightest purple borderRadius: 10, padding: 15, marginBottom: 20, }, userInfo: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', marginBottom: 10, }, profilePhoto: { @@ -79,43 +72,43 @@ const styles = StyleSheet.create({ }, userName: { fontSize: 16, - fontWeight: "bold", - color: "#4A148C", + fontWeight: 'bold', + color: '#4A148C', }, userHandle: { fontSize: 14, - color: "#7B1FA2", + color: '#7B1FA2', }, postTitle: { fontSize: 18, - fontWeight: "bold", - color: "#4A148C", + fontWeight: 'bold', + color: '#4A148C', marginBottom: 10, }, postActions: { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', }, viewCount: { fontSize: 14, - color: "#7B1FA2", + color: '#7B1FA2', }, interactionButtons: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', }, actionButton: { marginLeft: 15, fontSize: 14, - color: "#7B1FA2", + color: '#7B1FA2', }, likedButton: { - color: "#E91E63", // Red for liked + color: '#E91E63', // Red for liked }, dislikedButton: { - color: "#D32F2F", // Dark red for disliked + color: '#D32F2F', // Dark red for disliked }, -}); +}) -export default SubforumScreen; +export default SubforumScreen diff --git a/mobile/tradeverse/screens/welcoming/index.jsx b/mobile/tradeverse/screens/welcoming/index.jsx index fb4de51c..04112c5e 100644 --- a/mobile/tradeverse/screens/welcoming/index.jsx +++ b/mobile/tradeverse/screens/welcoming/index.jsx @@ -1,194 +1,187 @@ -import React, { useContext, useState } from "react"; +import React, { useContext, useState } from 'react' import { Text, StyleSheet, TouchableOpacity, View, Pressable, -} from "react-native"; +} from 'react-native' +import { launchImageLibraryAsync } from 'expo-image-picker' import { COLORS, FONT_WEIGHTS, SIZE_CONSTANT, SIZES, -} from "../../constants/theme"; -import GlobalScreen from "../../components/ui/global-screen"; -import MainButton from "../../components/buttons/main-button"; -import ProfileImage from "../../components/images/profile-image"; -import { launchImageLibraryAsync } from "expo-image-picker"; -import { AuthContext } from "../../auth/context"; +} from '../../constants/theme' +import GlobalScreen from '../../components/ui/global-screen' +import MainButton from '../../components/buttons/main-button' +import ProfileImage from '../../components/images/profile-image' +import { AuthContext } from '../../auth/context' export default function WelcomingScreen() { - const [currentStep, setCurrentStep] = useState("profile"); // user_tag, profile - const [selectedImage, setSelectedImage] = useState(null); - const [selectedUserTag, setSelectedUserTag] = useState(null); + const [currentStep, setCurrentStep] = useState('profile') // user_tag, profile + const [selectedImage, setSelectedImage] = useState(null) + const [selectedUserTag, setSelectedUserTag] = useState(null) - const { setIsTagSelected } = useContext(AuthContext); + const { setIsTagSelected } = useContext(AuthContext) const openImageGallery = async () => { const result = await launchImageLibraryAsync({ - mediaTypes: "Images", + mediaTypes: 'Images', allowsEditing: true, aspect: [4, 3], quality: 1, - }); + }) if (!result.canceled) { - setSelectedImage(result.assets[0]); + setSelectedImage(result.assets[0]) } - }; - - + } const options = [ - { label: "Beginner", icon: "🏁", value: "beginner" }, - { label: "Day Trader", icon: "📊", value: "day_trader" }, - { label: "Investor", icon: "💼", value: "investor" }, - { label: "Finance Enthusiast", icon: "💸", value: "finance_enthusiast" }, - { label: "Financial Analyst", icon: "📈", value: "finance_analyst" }, - ]; + { label: 'Beginner', icon: '🏁', value: 'beginner' }, + { label: 'Day Trader', icon: '📊', value: 'day_trader' }, + { label: 'Investor', icon: '💼', value: 'investor' }, + { label: 'Finance Enthusiast', icon: '💸', value: 'finance_enthusiast' }, + { label: 'Financial Analyst', icon: '📈', value: 'finance_analyst' }, + ] const handleNext = () => { - if (currentStep === "profile") { - setCurrentStep("user_tag"); + if (currentStep === 'profile') { + setCurrentStep('user_tag') } else { - setIsTagSelected(true); + setIsTagSelected(true) } - }; - - const ProfileView = () => { - return ( - - ( + + + Set a profile picture + + + - Set a profile picture - - + + + + + + - - - - - + Skip for now + + + {selectedImage && ( - - - - Skip for now - - - {selectedImage && ( - - )} - - - ); - }; - - const UserTagView = () => { - return ( - - - What is your experience with finance ? - - - {options.map((option, index) => ( - setSelectedUserTag(option.value)} - key={index} - style={styles.optionButton(option.value === selectedUserTag)} - > - - {option.label} - - {option.icon} - - ))} - - + )} - ); - }; + + ) + + const UserTagView = () => ( + + + What is your experience with finance ? + + + {options.map((option, index) => ( + setSelectedUserTag(option.value)} + key={index} + style={styles.optionButton(option.value === selectedUserTag)} + > + + {option.label} + + {option.icon} + + ))} + + + + ) return ( Welcome Huseyin ! - {currentStep === "user_tag" && } - {currentStep === "profile" && } + {currentStep === 'user_tag' && } + {currentStep === 'profile' && } - ); + ) } const styles = StyleSheet.create({ container: { flex: 1, - backgroundColor: "#FFFFFF", + backgroundColor: '#FFFFFF', padding: 20, }, gradientText: { - alignSelf: "stretch", + alignSelf: 'stretch', marginTop: 40, marginBottom: 40, }, welcomeText: { fontSize: SIZE_CONSTANT * 2.4, fontWeight: FONT_WEIGHTS.bold, - textAlign: "center", + textAlign: 'center', color: COLORS.primary700, marginBottom: SIZE_CONSTANT * 8, letterSpacing: -0.03, @@ -196,37 +189,33 @@ const styles = StyleSheet.create({ questionText: { fontSize: SIZE_CONSTANT * 1.6, - color: "#1D1B4B", + color: '#1D1B4B', marginBottom: 20, fontWeight: FONT_WEIGHTS.medium, letterSpacing: -0.3, }, - optionButton: (isSelected = false) => { - return { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", - backgroundColor: isSelected ? COLORS.primary500 : "#EEF2FF", - padding: 15, - paddingHorizontal: SIZE_CONSTANT * 2, - borderRadius: SIZE_CONSTANT * 0.6, - marginBottom: SIZE_CONSTANT * 1.2, - height: SIZE_CONSTANT * 6, - }; - }, - optionText: (isSelected = false) => { - return { - fontSize: SIZES.medium, - color: isSelected ? COLORS.white : COLORS.primary800, - fontWeight: FONT_WEIGHTS.medium, - }; - }, + optionButton: (isSelected = false) => ({ + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + backgroundColor: isSelected ? COLORS.primary500 : '#EEF2FF', + padding: 15, + paddingHorizontal: SIZE_CONSTANT * 2, + borderRadius: SIZE_CONSTANT * 0.6, + marginBottom: SIZE_CONSTANT * 1.2, + height: SIZE_CONSTANT * 6, + }), + optionText: (isSelected = false) => ({ + fontSize: SIZES.medium, + color: isSelected ? COLORS.white : COLORS.primary800, + fontWeight: FONT_WEIGHTS.medium, + }), continueButton: { - flexDirection: "row", - justifyContent: "center", - alignItems: "center", + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', backgroundColor: COLORS.primary500, padding: 15, height: SIZE_CONSTANT * 4.4, @@ -239,4 +228,4 @@ const styles = StyleSheet.create({ fontWeight: FONT_WEIGHTS.medium, color: COLORS.white, }, -}); +}) diff --git a/mobile/tradeverse/services/_axios.js b/mobile/tradeverse/services/_axios.js index 960dd577..66490de8 100644 --- a/mobile/tradeverse/services/_axios.js +++ b/mobile/tradeverse/services/_axios.js @@ -1,27 +1,23 @@ /* eslint-disable no-param-reassign */ -import AsyncStorage from '@react-native-async-storage/async-storage'; -import axios from 'axios'; -import { Platform } from 'react-native'; +import AsyncStorage from '@react-native-async-storage/async-storage' +import axios from 'axios' const api = axios.create({ -baseURL: 'http://35.246.188.121:8080/api', + baseURL: 'http://35.246.188.121:8080/api', headers: { - 'content-type': 'application/json' - } -}); - + 'content-type': 'application/json', + }, +}) api.interceptors.request.use( - async config => { - const token = await AsyncStorage.getItem('authToken'); + async (config) => { + const token = await AsyncStorage.getItem('authToken') if (token) { - config.headers.Authorization = `Bearer ${token}`; + config.headers.Authorization = `Bearer ${token}` } - return config; + return config }, - error => { - return Promise.reject(error); - } -); + (error) => Promise.reject(error) +) -export default api; +export default api diff --git a/mobile/tradeverse/services/auth.js b/mobile/tradeverse/services/auth.js index a8a1469e..0a2b5645 100644 --- a/mobile/tradeverse/services/auth.js +++ b/mobile/tradeverse/services/auth.js @@ -1,64 +1,60 @@ -import AsyncStorage from "@react-native-async-storage/async-storage"; -import api from "./_axios"; +import AsyncStorage from '@react-native-async-storage/async-storage' +import api from './_axios' -export async function getMe({ authToken = "", username = "" }) { +export async function getMe({ authToken = '', username = '' }) { try { const response = await api({ - url: "/auth/get-user-details", - method: "POST", - // method: "GET", // In future + url: '/auth/get-user-details', + method: 'POST', + // method: "GET", // In future headers: { Authorization: authToken ? `Bearer ${authToken}` : null, }, - data: username ? { username } : {}, //TODO:/ Delete later - }); - return response.data; + // TODO:/ Delete later + data: username ? { username } : {}, + }) + + return response.data } catch (error) { - console.error("Get me failed", error); + throw new Error(error.message || 'Kullanıcı bilgileri alınamadı') } - return null; } export async function login({ username, password }) { - console.log(username, password); - try { - await AsyncStorage.removeItem("authToken"); + await AsyncStorage.removeItem('authToken') const response = await api({ - url: "/auth/login", - method: "POST", + url: '/auth/login', + method: 'POST', headers: { Authorization: undefined, }, data: { username, password }, - }); - await AsyncStorage.removeItem("authToken"); - console.log(response.data); + }) + await AsyncStorage.removeItem('authToken') - api.defaults.headers.common.Authorization = `Bearer ${response.data.token}`; - AsyncStorage.setItem("authToken", response.data.token); - return response; + api.defaults.headers.common.Authorization = `Bearer ${response.data.token}` + AsyncStorage.setItem('authToken', response.data.token) + return response } catch (error) { - throw new Error(error.message ?? "Giriş başarısız"); + throw new Error(error.message || 'Giriş başarısız') } } export async function register({ email, password, - name = "", + name = '', username, tag = 0, - profilePhoto = "", + profilePhoto = '', }) { try { - console.log(email, password, name, username, tag, profilePhoto); - - await AsyncStorage.removeItem("authToken"); + await AsyncStorage.removeItem('authToken') const response = await api({ - url: "/auth/register", - method: "POST", + url: '/auth/register', + method: 'POST', data: { email, password, @@ -70,17 +66,13 @@ export async function register({ headers: { Authorization: undefined, }, - }); - await AsyncStorage.removeItem("authToken"); - console.log(response.data); + }) + await AsyncStorage.removeItem('authToken') - api.defaults.headers.common.Authorization = `Bearer ${response.data.token}`; - AsyncStorage.setItem("authToken", response.data.token); - return response; + api.defaults.headers.common.Authorization = `Bearer ${response.data.token}` + AsyncStorage.setItem('authToken', response.data.token) + return response } catch (error) { - console.log("basarisiz"); - console.log(error); - - throw new Error(error.message ?? "Kayıt başarısız"); + throw new Error(error.message || 'Kayıt başarısız') } } diff --git a/mobile/tradeverse/services/user.js b/mobile/tradeverse/services/user.js index 358387cc..adc16a3c 100644 --- a/mobile/tradeverse/services/user.js +++ b/mobile/tradeverse/services/user.js @@ -1,20 +1,19 @@ -import api from "./_axios"; +import api from './_axios' -export async function getUserByUsername({ username }) { -ƒ +export default async function getUserByUsername({ username }) { try { const response = await api({ - url: "/auth/get-user-details", - method: "POST", + url: '/auth/get-user-details', + method: 'POST', headers: { Authorization: undefined, }, data: { username }, - }); + }) - return response.data; + return response.data } catch (error) { - console.error("Get user by username failed", error); + // console.error('Get user by username failed', error) } - return null; + return null } diff --git a/mobile/tradeverse/tsconfig.json b/mobile/tradeverse/tsconfig.json index b78065bb..0c7d5c9d 100644 --- a/mobile/tradeverse/tsconfig.json +++ b/mobile/tradeverse/tsconfig.json @@ -3,15 +3,17 @@ "compilerOptions": { "strict": true, "paths": { - "@/*": [ - "./*" - ] + "@/*": ["./*"] } }, "include": [ "**/*.ts", + "**/*.js", "**/*.tsx", ".expo/types/**/*.ts", - "expo-env.d.ts" -, "app/(tabs)/_layout.jsx", "app/_layout.jsx" ] + "expo-env.d.ts", + "app/(tabs)/_layout.jsx", + "app/_layout.jsx", + "components/inputs/TextField.style.jsx" + ] } diff --git a/mobile/tradeverse/util/format-number.js b/mobile/tradeverse/util/format-number.js index 641c89b2..0cf54c11 100644 --- a/mobile/tradeverse/util/format-number.js +++ b/mobile/tradeverse/util/format-number.js @@ -1,16 +1,17 @@ function formatInteractionNumber(num) { - if(num === undefined || num === null) { - return "0"; - } - if (num >= 1000000000) { - return (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'B'; - } else if (num >= 1000000) { - return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; - } else if (num >= 1000) { - return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; - } else { - return num.toString(); - } + if (num === undefined || num === null) { + return '0' + } + if (num >= 1000000000) { + return `${(num / 1000000000).toFixed(1).replace(/\.0$/, '')}B` + } + if (num >= 1000000) { + return `${(num / 1000000).toFixed(1).replace(/\.0$/, '')}M` + } + if (num >= 1000) { + return `${(num / 1000).toFixed(1).replace(/\.0$/, '')}k` + } + return num.toString() } -export default formatInteractionNumber; \ No newline at end of file +export default formatInteractionNumber From fedf0cb4c1fa556e816f999ff0540a130e8b03db Mon Sep 17 00:00:00 2001 From: OguzTNCR <100152836+OguzTNCR@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:00:26 +0300 Subject: [PATCH 06/10] Change the logo color --- web/tradeverse/public/logo_new.png | Bin 0 -> 110365 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 web/tradeverse/public/logo_new.png diff --git a/web/tradeverse/public/logo_new.png b/web/tradeverse/public/logo_new.png new file mode 100644 index 0000000000000000000000000000000000000000..a73c63d15ea632e134a5088fdf864f8e333f5524 GIT binary patch literal 110365 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 W)KOjs@u!LI1rce(75k5_e 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 t Date: Tue, 12 Nov 2024 16:00:34 +0300 Subject: [PATCH 07/10] Change button colors --- web/tradeverse/src/App.css | 2 +- web/tradeverse/src/components/structure/RenderNavigation.js | 2 +- web/tradeverse/src/components/styles/feed.css | 2 +- web/tradeverse/src/pages/styles/Login.css | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/tradeverse/src/App.css b/web/tradeverse/src/App.css index 56fb0111..35491104 100644 --- a/web/tradeverse/src/App.css +++ b/web/tradeverse/src/App.css @@ -79,7 +79,7 @@ /* Register button specific styles */ .registerButton { - background-color: #F48023; + background-color: #5D5FEF; color: white; } diff --git a/web/tradeverse/src/components/structure/RenderNavigation.js b/web/tradeverse/src/components/structure/RenderNavigation.js index a03a5099..6612f115 100644 --- a/web/tradeverse/src/components/structure/RenderNavigation.js +++ b/web/tradeverse/src/components/structure/RenderNavigation.js @@ -82,7 +82,7 @@ export const RenderMenu = () => {
- Tradeverse Logo + Tradeverse Logo
diff --git a/web/tradeverse/src/components/styles/feed.css b/web/tradeverse/src/components/styles/feed.css index 382f0355..a3ee3e6c 100644 --- a/web/tradeverse/src/components/styles/feed.css +++ b/web/tradeverse/src/components/styles/feed.css @@ -38,7 +38,7 @@ } .sortButton.active { - background-color: darkorange; + background-color: #5D5FEF; color: white; } diff --git a/web/tradeverse/src/pages/styles/Login.css b/web/tradeverse/src/pages/styles/Login.css index 282d543f..3ffda493 100644 --- a/web/tradeverse/src/pages/styles/Login.css +++ b/web/tradeverse/src/pages/styles/Login.css @@ -42,7 +42,7 @@ height: 38px; margin-top: 10px; padding: 0 ; - background-color: #F48023; + background-color: #5D5FEF; color: white; font-size: 16px; font-weight: bold; From 7028fb6b98fe4a1fa47677538e0938f6e436d2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yasin=20Atl=C4=B1?= Date: Tue, 12 Nov 2024 16:09:37 +0300 Subject: [PATCH 08/10] search page navigation added --- web/tradeverse/src/components/structure/navigation.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/tradeverse/src/components/structure/navigation.js b/web/tradeverse/src/components/structure/navigation.js index dc7f42b3..19a250e8 100644 --- a/web/tradeverse/src/components/structure/navigation.js +++ b/web/tradeverse/src/components/structure/navigation.js @@ -2,7 +2,7 @@ import Home from "../../pages/Home" import About from "../../pages/About" import Login from "../../pages/Login" import SignUp from "../../pages/SignUp" - +import Search from "../../pages/Search" export const nav = [ { path: "/", name: "Home", element: , isMenu: false, isPrivate: false , isAdmin:false}, @@ -13,5 +13,6 @@ export const nav = [ { path: "/notfound", name: "Not Found", element: , isMenu: false, isPrivate: false , isAdmin:false}, { path: "/notauthorized", name: "Not Authorized", element: , isMenu: false, isPrivate: false , isAdmin:false}, { path: "/adduser", name: "Add User", element: , isMenu: false, isPrivate: false, isAdmin: false }, + { path: "/search", name: "Search", element: , isMenu: false, isPrivate: false, isAdmin: false }, ] \ No newline at end of file From 638be35c1ade624fb86f4b5fbb5845f48eaa4266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yasin=20Atl=C4=B1?= Date: Tue, 12 Nov 2024 16:09:52 +0300 Subject: [PATCH 09/10] seacrh bar icon added to the header --- .../src/components/structure/RenderNavigation.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/tradeverse/src/components/structure/RenderNavigation.js b/web/tradeverse/src/components/structure/RenderNavigation.js index 6612f115..b4560709 100644 --- a/web/tradeverse/src/components/structure/RenderNavigation.js +++ b/web/tradeverse/src/components/structure/RenderNavigation.js @@ -87,6 +87,11 @@ export const RenderMenu = () => {
+
+ + + +
{user.isAuthenticated ? (
@@ -112,7 +117,7 @@ export const RenderMenu = () => { )}
- +
); } \ No newline at end of file From e4fb828c837960dc597677ec2f0c3c07d8c36960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yasin=20Atl=C4=B1?= Date: Tue, 12 Nov 2024 16:10:15 +0300 Subject: [PATCH 10/10] search page component craeted with the functionality --- web/tradeverse/src/pages/Search.js | 53 ++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 web/tradeverse/src/pages/Search.js diff --git a/web/tradeverse/src/pages/Search.js b/web/tradeverse/src/pages/Search.js new file mode 100644 index 00000000..5a8aa7b9 --- /dev/null +++ b/web/tradeverse/src/pages/Search.js @@ -0,0 +1,53 @@ +import React, { useState } from 'react'; +import Feed from "../components/structure/feed"; +import mockData from "../data/mockData"; + +const Search = () => { + const [searchTerm, setSearchTerm] = useState(''); + const [filteredSubforums, setFilteredSubforums] = useState(mockData.subforums); + + // Filter function to find matching subforums + const handleSearch = (event) => { + const term = event.target.value.toLowerCase(); + setSearchTerm(term); + + // Filter posts within each subforum based on the search term in name, description, or tags + const newFilteredSubforums = mockData.subforums.map((subforum) => { + const filteredPosts = subforum.posts.filter((post) => + (post.name && post.name.toLowerCase().includes(term)) || + (post.description && post.description.toLowerCase().includes(term)) || + (post.tags && post.tags.some(tag => tag && tag.toLowerCase().includes(term))) + ); + + // Return subforums only if they have matching posts + return { ...subforum, posts: filteredPosts }; + }).filter(subforum => subforum.posts.length > 0); + + setFilteredSubforums(newFilteredSubforums); + }; + + + return ( +
+ + + {/* Render Feed component for each filtered subforum */} + {filteredSubforums.map((subforum) => ( + + ))} + + {/* If no results, show a message */} + {filteredSubforums.length === 0 && ( +

No results found for "{searchTerm}"

+ )} +
+ ); +}; + +export default Search;