From 1ad19d9326ca47067cc337fc5938105f69d1ad77 Mon Sep 17 00:00:00 2001 From: John Haupenthal Date: Sat, 12 Oct 2024 23:21:56 -0700 Subject: [PATCH] chore: update example app --- example/App.js | 1 - example/app.json | 4 +- example/app/_layout.tsx | 22 + example/app/index.tsx | 67 +++ example/app/scrollviews/horizontal.tsx | 79 +++ example/app/scrollviews/nocontext.tsx | 20 + .../scrollviews/vertical.tsx} | 22 +- example/assets/horizontal.png | Bin 0 -> 10591 bytes example/assets/lazy.png | Bin 0 -> 19400 bytes example/assets/no.png | Bin 0 -> 9161 bytes example/assets/vertical.png | Bin 0 -> 11292 bytes example/components/blocks/Blocks.tsx | 89 +++ .../components/blocks/FireOnceBlock.tsx | 45 +- .../components/blocks/ImageBlock.tsx | 62 +- .../components/blocks/NoLazyChild.tsx | 21 +- example/components/cards/Card.tsx | 101 ++++ example/components/cards/HorizontalCard.tsx | 30 + example/components/cards/NoLazyCard.tsx | 29 + example/components/cards/VerticalCard.tsx | 28 + example/constants.ts | 63 ++ example/package.json | 19 +- example/src/App.tsx | 74 --- .../components/scrollviews/BlockColumns.tsx | 52 -- .../src/components/scrollviews/NoContext.tsx | 26 - example/src/constants.ts | 36 -- example/tsconfig.json | 2 +- example/yarn.lock | 567 +++++++++++++++++- 27 files changed, 1176 insertions(+), 283 deletions(-) delete mode 100644 example/App.js create mode 100644 example/app/_layout.tsx create mode 100644 example/app/index.tsx create mode 100644 example/app/scrollviews/horizontal.tsx create mode 100644 example/app/scrollviews/nocontext.tsx rename example/{src/components/scrollviews/VerticalScrollView.tsx => app/scrollviews/vertical.tsx} (80%) create mode 100644 example/assets/horizontal.png create mode 100644 example/assets/lazy.png create mode 100644 example/assets/no.png create mode 100644 example/assets/vertical.png create mode 100644 example/components/blocks/Blocks.tsx rename example/{src => }/components/blocks/FireOnceBlock.tsx (74%) rename example/{src => }/components/blocks/ImageBlock.tsx (54%) rename example/{src => }/components/blocks/NoLazyChild.tsx (53%) create mode 100644 example/components/cards/Card.tsx create mode 100644 example/components/cards/HorizontalCard.tsx create mode 100644 example/components/cards/NoLazyCard.tsx create mode 100644 example/components/cards/VerticalCard.tsx create mode 100644 example/constants.ts delete mode 100644 example/src/App.tsx delete mode 100644 example/src/components/scrollviews/BlockColumns.tsx delete mode 100644 example/src/components/scrollviews/NoContext.tsx delete mode 100644 example/src/constants.ts diff --git a/example/App.js b/example/App.js deleted file mode 100644 index 834a527..0000000 --- a/example/App.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './src/App'; diff --git a/example/app.json b/example/app.json index 6406397..2978a79 100644 --- a/example/app.json +++ b/example/app.json @@ -1,6 +1,7 @@ { "expo": { "name": "Lazy ScrollView", + "scheme": "lazyscrollview", "slug": "example", "version": "1.0.0", "orientation": "portrait", @@ -26,6 +27,7 @@ }, "web": { "favicon": "./assets/favicon.png" - } + }, + "plugins": ["expo-router"] } } diff --git a/example/app/_layout.tsx b/example/app/_layout.tsx new file mode 100644 index 0000000..dc9bee1 --- /dev/null +++ b/example/app/_layout.tsx @@ -0,0 +1,22 @@ +import { Stack } from 'expo-router'; + +export default function Layout() { + return ( + + + + + + ); +} diff --git a/example/app/index.tsx b/example/app/index.tsx new file mode 100644 index 0000000..07e2f29 --- /dev/null +++ b/example/app/index.tsx @@ -0,0 +1,67 @@ +import { Stack } from 'expo-router'; +import { + Dimensions, + Image, + ScrollView, + StyleSheet, + Text, + View, +} from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { HorizontalCard } from '../components/cards/HorizontalCard'; +import { NoLazyCard } from '../components/cards/NoLazyCard'; +import { VerticalCard } from '../components/cards/VerticalCard'; + +export default function App() { + const { top, bottom } = useSafeAreaInsets(); + + return ( + + + + + + + Lazy ScrollView Example App + + + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#ecf0f1', + padding: 16, + }, + image: { + width: Dimensions.get('window').width * 0.3, + aspectRatio: 1, + }, + row: { + flexDirection: 'row', + justifyContent: 'space-between', + flex: 1, + alignItems: 'flex-end', + }, + textContainer: { + flex: 1, + justifyContent: 'flex-end', + alignItems: 'flex-end', + padding: 8, + }, + header: { + fontSize: 24, + fontWeight: 'bold', + lineHeight: 32, + textAlign: 'right', + }, +}); diff --git a/example/app/scrollviews/horizontal.tsx b/example/app/scrollviews/horizontal.tsx new file mode 100644 index 0000000..6df0fb7 --- /dev/null +++ b/example/app/scrollviews/horizontal.tsx @@ -0,0 +1,79 @@ +import React, { useRef } from 'react'; + +import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { + LazyScrollView, + LazyScrollViewMethods, +} from 'react-native-lazy-scrollview'; +import { PADDING_VERTICAL } from '../../constants'; +import { Blocks } from '../../components/blocks/Blocks'; + +const OFFSET = -50; + +export default function HorizontalScrollView() { + const ref = useRef(null); + + return ( + + + + + + ref.current?.scrollToStart({ animated: true })} + > + ⬅️ + + ref.current?.scrollToEnd({ animated: true })} + > + ➡️ + + + + ); +} + +const styles = StyleSheet.create({ + scrollviewContainer: { + flex: 1, + backgroundColor: '#ecf0f1', + }, + offsetBar: { + position: 'absolute', + bottom: OFFSET * -1 + PADDING_VERTICAL, + borderBottomWidth: 1, + borderBottomColor: 'black', + left: 0, + right: 0, + opacity: 0.7, + height: 50, + justifyContent: 'flex-end', + }, + offsetText: { + color: 'white', + fontSize: 18, + fontWeight: '600', + backgroundColor: '#000', + padding: 8, + alignSelf: 'flex-start', + }, + arrowsContainer: { + top: 8, + right: 8, + position: 'absolute', + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'row', + }, + arrowButton: {}, + arrow: { fontSize: 32 }, +}); diff --git a/example/app/scrollviews/nocontext.tsx b/example/app/scrollviews/nocontext.tsx new file mode 100644 index 0000000..1f590e9 --- /dev/null +++ b/example/app/scrollviews/nocontext.tsx @@ -0,0 +1,20 @@ +import { ScrollView, StyleSheet, Text } from 'react-native'; +import { Blocks } from '../../components/blocks/Blocks'; + +export default function NoContext() { + return ( + + + + ); +} + +const styles = StyleSheet.create({ + scrollviewContainer: { + flex: 1, + backgroundColor: '#ecf0f1', + }, +}); diff --git a/example/src/components/scrollviews/VerticalScrollView.tsx b/example/app/scrollviews/vertical.tsx similarity index 80% rename from example/src/components/scrollviews/VerticalScrollView.tsx rename to example/app/scrollviews/vertical.tsx index 38888b7..b41d8f9 100644 --- a/example/src/components/scrollviews/VerticalScrollView.tsx +++ b/example/app/scrollviews/vertical.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import { useRef } from 'react'; import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { @@ -6,11 +6,11 @@ import { LazyScrollViewMethods, } from 'react-native-lazy-scrollview'; import { PADDING_VERTICAL } from '../../constants'; -import { BlockColumns } from './BlockColumns'; +import { Blocks } from '../../components/blocks/Blocks'; -const OFFSET = -100; +const OFFSET = -50; -export function VerticalScrollView() { +export default function VerticalScrollView() { const ref = useRef(null); return ( @@ -20,7 +20,7 @@ export function VerticalScrollView() { offset={OFFSET} showsVerticalScrollIndicator={false} > - + ⬇️ - - {`Offset: ${OFFSET}`} - ); } @@ -47,8 +44,7 @@ export function VerticalScrollView() { const styles = StyleSheet.create({ scrollviewContainer: { flex: 1, - paddingVertical: PADDING_VERTICAL, - backgroundColor: '#2d3436', + backgroundColor: '#ecf0f1', }, offsetBar: { position: 'absolute', @@ -70,11 +66,11 @@ const styles = StyleSheet.create({ alignSelf: 'flex-start', }, arrowsContainer: { - top: 0, - bottom: 0, - right: 0, + top: 8, + right: 8, position: 'absolute', justifyContent: 'center', + flexDirection: 'row', }, arrowButton: { marginBottom: 8 }, arrow: { fontSize: 32 }, diff --git a/example/assets/horizontal.png b/example/assets/horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..2daabe1dca07606f587c37c2b48d3cafdea4c119 GIT binary patch literal 10591 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 X`mk-1&7TM+*npC}nq0Z8McDrUZRePM literal 0 HcmV?d00001 diff --git a/example/assets/lazy.png b/example/assets/lazy.png new file mode 100644 index 0000000000000000000000000000000000000000..03b1b45181d308eefc419443df4d604660cf6137 GIT binary patch literal 19400 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 ZkW4YYg?IvX^oZ;OP?S}HRLB^A`Y*km3+n&? literal 0 HcmV?d00001 diff --git a/example/components/blocks/Blocks.tsx b/example/components/blocks/Blocks.tsx new file mode 100644 index 0000000..d08838f --- /dev/null +++ b/example/components/blocks/Blocks.tsx @@ -0,0 +1,89 @@ +import { useCallback } from 'react'; + +import { chunk } from 'lodash'; +import shuffle from 'lodash/shuffle'; +import { + Dimensions, + ImageSourcePropType, + StyleSheet, + View, +} from 'react-native'; +import { ALBUMS, SQUARE_SIZE } from '../../constants'; +import { FireOnceBlock } from '../blocks/FireOnceBlock'; +import { ImageBlock } from '../blocks/ImageBlock'; +import { NoLazyChild } from '../blocks/NoLazyChild'; + +export function Blocks({ horizontal }: { horizontal?: boolean }) { + const chunks = chunk( + shuffle(ALBUMS.concat(shuffle(ALBUMS)).concat(shuffle(ALBUMS))), + 9 + ); + + const renderBlock = useCallback( + (source: ImageSourcePropType | 'no-lazy' | 'fire-once', index: number) => { + if (source === 'no-lazy') { + return ; + } + + if (source === 'fire-once') { + return ( + + ); + } + + return ( + + ); + }, + [] + ); + + const renderRow = ( + column: (ImageSourcePropType | 'no-lazy' | 'fire-once')[], + index: number + ) => { + return ( + + {column.map(renderBlock)} + + ); + }; + + return horizontal ? ( + + {chunks.map(renderRow)} + + ) : ( + + {shuffle(ALBUMS).map(renderBlock)} + + {shuffle(ALBUMS).map(renderBlock)} + + + ); +} + +const styles = StyleSheet.create({ + container: { + flexDirection: 'row', + }, + offset: { + transform: [{ translateY: -SQUARE_SIZE / 2 }], + }, + offsetHorizontal: { + transform: [{ translateX: -SQUARE_SIZE / 2 }], + }, +}); diff --git a/example/src/components/blocks/FireOnceBlock.tsx b/example/components/blocks/FireOnceBlock.tsx similarity index 74% rename from example/src/components/blocks/FireOnceBlock.tsx rename to example/components/blocks/FireOnceBlock.tsx index c902c2f..8c4cc17 100644 --- a/example/src/components/blocks/FireOnceBlock.tsx +++ b/example/components/blocks/FireOnceBlock.tsx @@ -1,4 +1,4 @@ -import React, { ComponentProps, useMemo, useState } from 'react'; +import { ComponentProps, useMemo, useState } from 'react'; import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'; import { LazyChild } from 'react-native-lazy-scrollview'; import { SQUARE_SIZE } from '../../constants'; @@ -23,22 +23,23 @@ export function FireOnceBlock( ); return ( - - - {triggered ? ( - + + + + {triggered ? ( I didn't provide exit functions so my entering callbacks fire only once, then measurement stops 🤯 - - ) : ( - - )} + ) : ( + + )} + + {!isVisible && props.percentVisibleThreshold ? ( {`${ @@ -46,8 +47,8 @@ export function FireOnceBlock( } not visible`} ) : null} - - + + ); } @@ -55,15 +56,17 @@ const styles = StyleSheet.create({ container: { justifyContent: 'center', alignItems: 'center', - overflow: 'hidden', - alignSelf: 'center', width: SQUARE_SIZE, height: SQUARE_SIZE, - padding: 16, }, - image: { - width: SQUARE_SIZE, - height: SQUARE_SIZE, + contentContainer: { + width: SQUARE_SIZE - 16, + height: SQUARE_SIZE - 16, + borderRadius: 8, + overflow: 'hidden', + justifyContent: 'center', + alignItems: 'center', + padding: 16, }, percentTextWrapper: { position: 'absolute', diff --git a/example/src/components/blocks/ImageBlock.tsx b/example/components/blocks/ImageBlock.tsx similarity index 54% rename from example/src/components/blocks/ImageBlock.tsx rename to example/components/blocks/ImageBlock.tsx index 91a4ef2..41a85a5 100644 --- a/example/src/components/blocks/ImageBlock.tsx +++ b/example/components/blocks/ImageBlock.tsx @@ -1,4 +1,4 @@ -import React, { ComponentProps, useState } from 'react'; +import { ComponentProps, useState } from 'react'; import { ActivityIndicator, Image, @@ -35,28 +35,30 @@ export function ImageBlock({ source, ...rest }: Props) { }; return ( - - - {triggered ? ( - - ) : ( - - )} - {!isVisible && rest.percentVisibleThreshold ? ( - - {`${ - rest.percentVisibleThreshold * 100 - } not visible`} - - ) : null} - - + + + + {triggered ? ( + + ) : ( + + )} + {!isVisible && rest.percentVisibleThreshold ? ( + + {`${ + rest.percentVisibleThreshold * 100 + } not visible`} + + ) : null} + + + ); } @@ -65,14 +67,22 @@ const styles = StyleSheet.create({ justifyContent: 'center', alignItems: 'center', overflow: 'hidden', - backgroundColor: '#d1d8e0', alignSelf: 'center', width: SQUARE_SIZE, height: SQUARE_SIZE, }, + contentContainer: { + width: SQUARE_SIZE - 16, + height: SQUARE_SIZE - 16, + borderRadius: 8, + overflow: 'hidden', + justifyContent: 'center', + alignItems: 'center', + }, image: { - width: SQUARE_SIZE, - height: SQUARE_SIZE, + width: SQUARE_SIZE - 16, + height: SQUARE_SIZE - 16, + borderRadius: 8, }, percentTextWrapper: { position: 'absolute', diff --git a/example/src/components/blocks/NoLazyChild.tsx b/example/components/blocks/NoLazyChild.tsx similarity index 53% rename from example/src/components/blocks/NoLazyChild.tsx rename to example/components/blocks/NoLazyChild.tsx index ebc38c3..d572f78 100644 --- a/example/src/components/blocks/NoLazyChild.tsx +++ b/example/components/blocks/NoLazyChild.tsx @@ -1,27 +1,34 @@ -import React from 'react'; import { StyleSheet, Text, View } from 'react-native'; import { SQUARE_SIZE } from '../../constants'; export function NoLazyChild() { return ( - - I'm not wrapped in LazyChild so I render right away 😉 - + + + I'm not wrapped in LazyChild so I render right away 😉 + + ); } const styles = StyleSheet.create({ container: { + justifyContent: 'center', + alignItems: 'center', width: SQUARE_SIZE, height: SQUARE_SIZE, - aspectRatio: 1, + }, + contentContainer: { + width: SQUARE_SIZE - 16, + height: SQUARE_SIZE - 16, + backgroundColor: '#ff7f50', + borderRadius: 8, + overflow: 'hidden', justifyContent: 'center', alignItems: 'center', - alignSelf: 'center', padding: 16, - backgroundColor: '#7bed9f', }, text: { fontSize: 16, diff --git a/example/components/cards/Card.tsx b/example/components/cards/Card.tsx new file mode 100644 index 0000000..269a43c --- /dev/null +++ b/example/components/cards/Card.tsx @@ -0,0 +1,101 @@ +import { useRouter } from 'expo-router'; +import { + Image, + StyleSheet, + Text, + TouchableOpacity, + View, + ViewStyle, +} from 'react-native'; +import Animated from 'react-native-reanimated'; +import { VERTICAL } from '../../constants'; + +export function Card({ + scrollView, + animatedStyle, + imageOnBottom, +}: { + scrollView: typeof VERTICAL; + animatedStyle: ViewStyle; + imageOnBottom?: boolean; +}) { + const router = useRouter(); + + const onPress = () => { + router.push(`scrollviews/${scrollView.name}`); + }; + + return ( + + {imageOnBottom ? ( + <> + + {scrollView.title} + {scrollView.description} + + + + + + + + ) : ( + <> + + + + + + + + {scrollView.title} + {scrollView.description} + + + + )} + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#ecf0f1', + padding: 16, + }, + button: { + padding: 16, + borderRadius: 16, + marginVertical: 8, + }, + buttonTitle: { + color: 'white', + fontSize: 20, + lineHeight: 28, + fontWeight: '600', + }, + buttonText: { + color: 'white', + fontSize: 14, + lineHeight: 18, + }, + icon: { + padding: 12, + borderRadius: 64, + backgroundColor: 'white', + alignSelf: 'center', + }, + image: { + width: 24, + height: 24, + }, + textContainer: { + flex: 1, + }, +}); diff --git a/example/components/cards/HorizontalCard.tsx b/example/components/cards/HorizontalCard.tsx new file mode 100644 index 0000000..682f095 --- /dev/null +++ b/example/components/cards/HorizontalCard.tsx @@ -0,0 +1,30 @@ +import { useEffect } from 'react'; +import { + interpolate, + useAnimatedStyle, + useSharedValue, + withRepeat, + withTiming, +} from 'react-native-reanimated'; +import { HORIZONTAL } from '../../constants'; +import { Card } from './Card'; + +export function HorizontalCard() { + const animation = useSharedValue(0); + + useEffect(() => { + animation.value = withRepeat(withTiming(1, { duration: 1000 }), -1, true); + }, []); + const animatedStyle = useAnimatedStyle(() => { + return { + marginTop: 16, + transform: [ + { translateX: interpolate(animation.value, [0, 1], [-50, 50]) }, + ], + }; + }); + + return ( + + ); +} diff --git a/example/components/cards/NoLazyCard.tsx b/example/components/cards/NoLazyCard.tsx new file mode 100644 index 0000000..ebcda3e --- /dev/null +++ b/example/components/cards/NoLazyCard.tsx @@ -0,0 +1,29 @@ +import { useEffect } from 'react'; +import { + interpolate, + useAnimatedStyle, + useSharedValue, + withRepeat, + withTiming, +} from 'react-native-reanimated'; +import { NO_LAZY } from '../../constants'; +import { Card } from './Card'; + +export function NoLazyCard() { + const animation = useSharedValue(0); + + useEffect(() => { + animation.value = withRepeat(withTiming(1, { duration: 2000 }), -1); + }, []); + + const animatedStyle = useAnimatedStyle(() => { + return { + marginRight: 16, + transform: [ + { rotate: `${interpolate(animation.value, [0, 1], [0, 360])}deg` }, + ], + }; + }); + + return ; +} diff --git a/example/components/cards/VerticalCard.tsx b/example/components/cards/VerticalCard.tsx new file mode 100644 index 0000000..d5d9c5d --- /dev/null +++ b/example/components/cards/VerticalCard.tsx @@ -0,0 +1,28 @@ +import { useEffect } from 'react'; +import { + interpolate, + useAnimatedStyle, + useSharedValue, + withRepeat, + withTiming, +} from 'react-native-reanimated'; +import { VERTICAL } from '../../constants'; +import { Card } from './Card'; + +export function VerticalCard() { + const animation = useSharedValue(0); + + useEffect(() => { + animation.value = withRepeat(withTiming(1, { duration: 1000 }), -1, true); + }, []); + const animatedStyle = useAnimatedStyle(() => { + return { + marginRight: 16, + transform: [ + { translateY: interpolate(animation.value, [0, 1], [-20, 20]) }, + ], + }; + }); + + return ; +} diff --git a/example/constants.ts b/example/constants.ts new file mode 100644 index 0000000..a20e505 --- /dev/null +++ b/example/constants.ts @@ -0,0 +1,63 @@ +import shuffle from 'lodash/shuffle'; +import { Dimensions } from 'react-native'; + +export const ALBUMS = [ + require('./assets/albums/american-psycho.jpg'), + require('./assets/albums/doggstyle.jpg'), + require('./assets/albums/dude-ranch.jpg'), + require('./assets/albums/in_utero.jpg'), + require('./assets/albums/is-this-it.jpg'), + require('./assets/albums/let-it-be.jpg'), + require('./assets/albums/rip-this.jpeg'), + require('./assets/albums/spilt-milk.jpg'), + require('./assets/albums/suffer.jpg'), + require('./assets/albums/t-hives.jpg'), + require('./assets/albums/trendkill.jpg'), + require('./assets/albums/wysiatwin.jpg'), + require('./assets/albums/youre-welcome.jpeg'), + 'no-lazy', + 'no-lazy', + 'fire-once', + 'fire-once', +]; + +export const SHUFFLED_ALBUMS = shuffle(ALBUMS); + +export const PADDING_VERTICAL = 64; + +export const SQUARE_SIZE = Math.floor(Dimensions.get('window').width * 0.5); + +export const BLOCK_COLORS = [ + '#f8a5c2', + '#f5cd79', + '#ff7f50', + '#7bed9f', + '#1e90ff', +]; + +export const VERTICAL = { + name: 'vertical', + title: 'Vertical Lazy ScrollView', + color: '#1e90ff', + description: + 'LazyScrollView with vertical orientation. Offset is set to -50, so threshold triggers will happen 50 points before the top and bottom edges of the scrollview container. Visibility triggers will use the top and bottom edge of the scrollview container.', + image: require('./assets/vertical.png'), +}; + +export const HORIZONTAL = { + name: 'horizontal', + title: 'Horizontal Lazy ScrollView', + color: '#7bed9f', + description: + 'LazyScrollView with horizontal orientation. Offset is set to -50, so threshold triggers will happen 50 points before the left and right edges of the scrollview container. Visibility triggers will use the left and right edge of the scrollview container.', + image: require('./assets/horizontal.png'), +}; + +export const NO_LAZY = { + name: 'nocontext', + title: 'No LazyScrollView', + color: '#ff7f50', + description: + 'Standard ScrollView with no LazyScrollView wrapping the LazyChildren. Entering callbacks fire on render and no measuring or scroll tracking occurs.', + image: require('./assets/no.png'), +}; diff --git a/example/package.json b/example/package.json index 6ea3e77..714dcb1 100644 --- a/example/package.json +++ b/example/package.json @@ -1,7 +1,7 @@ { "name": "example", "version": "1.0.0", - "main": "node_modules/expo/AppEntry.js", + "main": "expo-router/entry", "scripts": { "start": "expo start", "android": "expo start --android", @@ -10,20 +10,33 @@ }, "dependencies": { "expo": "^51.0.37", + "expo-constants": "~16.0.2", + "expo-linking": "~6.3.1", + "expo-router": "~3.5.23", "expo-status-bar": "~1.12.1", "lodash": "^4.17.21", - "react": "18.2.0", + "react": "18.1.0", "react-dom": "18.2.0", "react-native": "0.74.5", "react-native-reanimated": "~3.10.1", + "react-native-safe-area-context": "4.10.5", + "react-native-screens": "3.31.1", + "react-native-svg": "15.2.0", "react-native-web": "~0.19.10" }, "devDependencies": { "@babel/core": "^7.24.0", "@expo/webpack-config": "~19.0.1", "@types/lodash": "^4.14.194", + "@types/react": "~18.2.79", "babel-loader": "^8.1.0", "babel-plugin-module-resolver": "^4.1.0" }, - "private": true + "private": true, + "eslintConfig": { + "extends": "expo", + "rules": { + "react/react-in-jsx-scope": "off" + } + } } diff --git a/example/src/App.tsx b/example/src/App.tsx deleted file mode 100644 index e501bff..0000000 --- a/example/src/App.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React, { useState } from 'react'; - -import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; -import { NoContext } from './components/scrollviews/NoContext'; -import { VerticalScrollView } from './components/scrollviews/VerticalScrollView'; - -const demoTypes = ['vertical', 'nocontext'] as const; -type DemoType = (typeof demoTypes)[number]; - -export default function App() { - const [type, setType] = useState(); - - const renderButton = (text: DemoType) => { - const onPress = () => { - setType(text); - }; - - const active = type === text; - - return ( - - - {active ? '✅' : ''} - {text} - - - ); - }; - - return ( - - {type === 'vertical' && } - {type === 'nocontext' && } - {demoTypes.map(renderButton)} - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: '#fff', - justifyContent: 'center', - alignItems: 'center', - }, - buttonContainer: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - paddingTop: 56, - paddingHorizontal: 16, - flexDirection: 'row', - }, - button: { - backgroundColor: '#1e90ff', - padding: 8, - borderRadius: 8, - alignSelf: 'flex-start', - marginLeft: 8, - }, - buttonText: { - color: 'white', - fontSize: 16, - fontWeight: '600', - textAlign: 'center', - textTransform: 'uppercase', - }, -}); diff --git a/example/src/components/scrollviews/BlockColumns.tsx b/example/src/components/scrollviews/BlockColumns.tsx deleted file mode 100644 index c5bff85..0000000 --- a/example/src/components/scrollviews/BlockColumns.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useCallback } from 'react'; - -import shuffle from 'lodash/shuffle'; -import { ImageSourcePropType, StyleSheet, View } from 'react-native'; -import { ALBUMS, SQUARE_SIZE } from '../../constants'; -import { ImageBlock } from '../blocks/ImageBlock'; -import { NoLazyChild } from '../blocks/NoLazyChild'; -import { FireOnceBlock } from '../blocks/FireOnceBlock'; - -export function BlockColumns() { - const renderBlock = useCallback( - (source: ImageSourcePropType | 'no-lazy' | 'fire-once', index: number) => { - if (source === 'no-lazy') { - return ; - } - - if (source === 'fire-once') { - return ( - - ); - } - - return ( - - ); - }, - [] - ); - - return ( - - {shuffle(ALBUMS).map(renderBlock)} - - - {shuffle(ALBUMS).map(renderBlock)} - - - ); -} - -const styles = StyleSheet.create({ - container: { - flexDirection: 'row', - }, -}); diff --git a/example/src/components/scrollviews/NoContext.tsx b/example/src/components/scrollviews/NoContext.tsx deleted file mode 100644 index be09427..0000000 --- a/example/src/components/scrollviews/NoContext.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; - -import { ScrollView, StyleSheet, Text } from 'react-native'; -import { BlockColumns } from './BlockColumns'; - -export function NoContext() { - return ( - - - These aren't wrapped in a LazyScrollView, so all onThresholdPass and - onVisibilityEnter callbacks are fired once, on mount - - - - ); -} - -const styles = StyleSheet.create({ - noContextHeader: { - fontSize: 24, - fontWeight: '600', - textAlign: 'center', - padding: 16, - marginTop: 80, - }, -}); diff --git a/example/src/constants.ts b/example/src/constants.ts deleted file mode 100644 index 27569b0..0000000 --- a/example/src/constants.ts +++ /dev/null @@ -1,36 +0,0 @@ -import shuffle from 'lodash/shuffle'; -import { Dimensions } from 'react-native'; - -export const ALBUMS = [ - require('../assets/albums/american-psycho.jpg'), - require('../assets/albums/doggstyle.jpg'), - require('../assets/albums/dude-ranch.jpg'), - require('../assets/albums/in_utero.jpg'), - require('../assets/albums/is-this-it.jpg'), - require('../assets/albums/let-it-be.jpg'), - require('../assets/albums/rip-this.jpeg'), - require('../assets/albums/spilt-milk.jpg'), - require('../assets/albums/suffer.jpg'), - require('../assets/albums/t-hives.jpg'), - require('../assets/albums/trendkill.jpg'), - require('../assets/albums/wysiatwin.jpg'), - require('../assets/albums/youre-welcome.jpeg'), - 'no-lazy', - 'no-lazy', - 'fire-once', - 'fire-once', -]; - -export const SHUFFLED_ALBUMS = shuffle(ALBUMS); - -export const PADDING_VERTICAL = 64; - -export const SQUARE_SIZE = Math.floor(Dimensions.get('window').width * 0.5); - -export const BLOCK_COLORS = [ - '#f8a5c2', - '#f5cd79', - '#ff7f50', - '#7bed9f', - '#1e90ff', -]; diff --git a/example/tsconfig.json b/example/tsconfig.json index facc3ec..2db003a 100644 --- a/example/tsconfig.json +++ b/example/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../tsconfig", "compilerOptions": { - // Avoid expo-cli auto-generating a tsconfig + "jsx": "react-jsx" } } diff --git a/example/yarn.lock b/example/yarn.lock index bd3d32f..bf0ac1a 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -1209,6 +1209,13 @@ pirates "^4.0.5" source-map-support "^0.5.16" +"@babel/runtime@^7.13.10", "@babel/runtime@^7.20.0", "@babel/runtime@^7.25.0": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.18.6": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" @@ -1216,13 +1223,6 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.20.0", "@babel/runtime@^7.25.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" - integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== - dependencies: - regenerator-runtime "^0.14.0" - "@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" @@ -1414,7 +1414,7 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@8.0.10", "@expo/config-plugins@~8.0.8": +"@expo/config-plugins@8.0.10", "@expo/config-plugins@~8.0.0-beta.0", "@expo/config-plugins@~8.0.8": version "8.0.10" resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.10.tgz#5cda076f38bc04675cb42d8acdd23d6e460a62de" integrity sha512-KG1fnSKRmsudPU9BWkl59PyE0byrE2HTnqbOrgwr2FAhqh7tfr9nRs6A9oLS/ntpGzmFxccTEcsV0L4apsuxxg== @@ -1435,7 +1435,7 @@ xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-types@^51.0.3": +"@expo/config-types@^51.0.0-unreleased", "@expo/config-types@^51.0.3": version "51.0.3" resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.3.tgz#520bdce5fd75f9d234fd81bd0347443086419450" integrity sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA== @@ -1553,6 +1553,11 @@ postcss "~8.4.32" resolve-from "^5.0.0" +"@expo/metro-runtime@3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-3.2.3.tgz#e074c28084f30725f8d0d0eeee4fcd6074797d2d" + integrity sha512-v5ji+fAGi7B9YavrxvekuF8gXEV/5fz0+PhaED5AaFDnbGB4IJIbpaiqK9nqZV1axjGZNQSw6Q8TsnFetCR3bQ== + "@expo/osascript@^2.0.31": version "2.0.33" resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.0.33.tgz#e9dcc8da54466c11939074aa71a006024ea884b1" @@ -1588,6 +1593,23 @@ base64-js "^1.2.3" xmlbuilder "^14.0.0" +"@expo/prebuild-config@7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.6.tgz#b9c2c36ee564244da8073ce7bea22ebe57743615" + integrity sha512-Hts+iGBaG6OQ+N8IEMMgwQElzJeSTb7iUJ26xADEHkaexsucAK+V52dM8M4ceicvbZR9q8M+ebJEGj0MCNA3dQ== + dependencies: + "@expo/config" "~9.0.0-beta.0" + "@expo/config-plugins" "~8.0.0-beta.0" + "@expo/config-types" "^51.0.0-unreleased" + "@expo/image-utils" "^0.5.0" + "@expo/json-file" "^8.3.0" + "@react-native/normalize-colors" "0.74.84" + debug "^4.3.1" + fs-extra "^9.0.0" + resolve-from "^5.0.0" + semver "^7.6.0" + xml2js "0.6.0" + "@expo/prebuild-config@7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz#7abd489e18ed6514a0c9cd214eb34c0d5efda799" @@ -1623,6 +1645,16 @@ resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== +"@expo/server@^0.4.0": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@expo/server/-/server-0.4.4.tgz#f89a8e57ef93b35e9635632e217a8868f762f358" + integrity sha512-q9ADBzMN5rZ/fgQ2mz5YIJuZ8gelQlhG2CQqToD+UvBLZvbaHCNxTTSs2KI1LzJvAaW5CWgWMatGvGF6iUQ0LA== + dependencies: + "@remix-run/node" "^2.7.2" + abort-controller "^3.0.0" + debug "^4.3.4" + source-map-support "~0.5.21" + "@expo/spawn-async@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.5.0.tgz#799827edd8c10ef07eb1a2ff9dcfe081d596a395" @@ -1918,6 +1950,21 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@radix-ui/react-compose-refs@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" + integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-slot@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz#e7868c669c974d649070e9ecbec0b367ee0b4d81" + integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@react-native-community/cli-clean@13.6.9": version "13.6.9" resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz#b6754f39c2b877c9d730feb848945150e1d52209" @@ -2233,6 +2280,11 @@ hermes-parser "0.19.1" nullthrows "^1.1.1" +"@react-native/normalize-colors@0.74.84": + version "0.74.84" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.84.tgz#4764d59775c17a6ed193509cb01ae2f42dd5c045" + integrity sha512-Y5W6x8cC5RuakUcTVUFNAIhUZ/tYpuqHZlRBoAuakrTwVuoNHXfQki8lj1KsYU7rW6e3VWgdEx33AfOQpdNp6A== + "@react-native/normalize-colors@0.74.85": version "0.74.85" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz#62bcb9ab1b10b822ca0278fdfdf23d3b18e125da" @@ -2256,6 +2308,131 @@ invariant "^2.2.4" nullthrows "^1.1.1" +"@react-navigation/bottom-tabs@~6.5.7": + version "6.5.20" + resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.20.tgz#5335e75b02c527ef0569bd97d4f9185d65616e49" + integrity sha512-ow6Z06iS4VqBO8d7FP+HsGjJLWt2xTWIvuWjpoCvsM/uQXzCRDIjBv9HaKcXbF0yTW7IMir0oDAbU5PFzEDdgA== + dependencies: + "@react-navigation/elements" "^1.3.30" + color "^4.2.3" + warn-once "^0.1.0" + +"@react-navigation/core@^6.4.17": + version "6.4.17" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.17.tgz#f277a196b578c8a456efcc563d1c9bd87eb4ab04" + integrity sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg== + dependencies: + "@react-navigation/routers" "^6.1.9" + escape-string-regexp "^4.0.0" + nanoid "^3.1.23" + query-string "^7.1.3" + react-is "^16.13.0" + use-latest-callback "^0.2.1" + +"@react-navigation/elements@^1.3.30": + version "1.3.31" + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.31.tgz#28dd802a0787bb03fc0e5be296daf1804dbebbcf" + integrity sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ== + +"@react-navigation/native-stack@~6.9.12": + version "6.9.26" + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.26.tgz#90facf7783c9927f094bc9f01c613af75b6c241e" + integrity sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw== + dependencies: + "@react-navigation/elements" "^1.3.30" + warn-once "^0.1.0" + +"@react-navigation/native@~6.1.6": + version "6.1.18" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.18.tgz#338fa9afa2c89feec1d3eac41c963840d8d6f106" + integrity sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg== + dependencies: + "@react-navigation/core" "^6.4.17" + escape-string-regexp "^4.0.0" + fast-deep-equal "^3.1.3" + nanoid "^3.1.23" + +"@react-navigation/routers@^6.1.9": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-6.1.9.tgz#73f5481a15a38e36592a0afa13c3c064b9f90bed" + integrity sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA== + dependencies: + nanoid "^3.1.23" + +"@remix-run/node@^2.7.2": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-2.13.1.tgz#572f838201a11f8d9d8ef56929eb2a2c46e0f5ea" + integrity sha512-2ly7bENj2n2FNBdEN60ZEbNCs5dAOex/QJoo6EZ8RNFfUQxVKAZkMwfQ4ETV2SLWDgkRLj3Jo5n/dx7O2ZGhGw== + dependencies: + "@remix-run/server-runtime" "2.13.1" + "@remix-run/web-fetch" "^4.4.2" + "@web3-storage/multipart-parser" "^1.0.0" + cookie-signature "^1.1.0" + source-map-support "^0.5.21" + stream-slice "^0.1.2" + undici "^6.11.1" + +"@remix-run/router@1.20.0": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4" + integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg== + +"@remix-run/server-runtime@2.13.1": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-2.13.1.tgz#91cc669fee41288b7f7c287558f144cc4b5ed65a" + integrity sha512-2DfBPRcHKVzE4bCNsNkKB50BhCCKF73x+jiS836OyxSIAL+x0tguV2AEjmGXefEXc5AGGzoxkus0AUUEYa29Vg== + dependencies: + "@remix-run/router" "1.20.0" + "@types/cookie" "^0.6.0" + "@web3-storage/multipart-parser" "^1.0.0" + cookie "^0.6.0" + set-cookie-parser "^2.4.8" + source-map "^0.7.3" + turbo-stream "2.4.0" + +"@remix-run/web-blob@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-blob/-/web-blob-3.1.0.tgz#e0c669934c1eb6028960047e57a13ed38bbfb434" + integrity sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g== + dependencies: + "@remix-run/web-stream" "^1.1.0" + web-encoding "1.1.5" + +"@remix-run/web-fetch@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz#ce7aedef72cc26e15060e8cf84674029f92809b6" + integrity sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA== + dependencies: + "@remix-run/web-blob" "^3.1.0" + "@remix-run/web-file" "^3.1.0" + "@remix-run/web-form-data" "^3.1.0" + "@remix-run/web-stream" "^1.1.0" + "@web3-storage/multipart-parser" "^1.0.0" + abort-controller "^3.0.0" + data-uri-to-buffer "^3.0.1" + mrmime "^1.0.0" + +"@remix-run/web-file@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-file/-/web-file-3.1.0.tgz#07219021a2910e90231bc30ca1ce693d0e9d3825" + integrity sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ== + dependencies: + "@remix-run/web-blob" "^3.1.0" + +"@remix-run/web-form-data@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz#47f9ad8ce8bf1c39ed83eab31e53967fe8e3df6a" + integrity sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A== + dependencies: + web-encoding "1.1.5" + +"@remix-run/web-stream@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@remix-run/web-stream/-/web-stream-1.1.0.tgz#b93a8f806c2c22204930837c44d81fdedfde079f" + integrity sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA== + dependencies: + web-streams-polyfill "^3.1.1" + "@rnx-kit/chromium-edge-launcher@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz#c0df8ea00a902c7a417cd9655aab06de398b939c" @@ -2347,6 +2524,11 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + "@types/estree@^1.0.5": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" @@ -2488,6 +2670,11 @@ dependencies: undici-types "~5.26.4" +"@types/prop-types@*": + version "15.7.13" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== + "@types/qs@*": version "6.9.16" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" @@ -2498,6 +2685,14 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== +"@types/react@~18.2.79": + version "18.2.79" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" + integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" @@ -2595,6 +2790,11 @@ "@urql/core" ">=2.3.1" wonka "^4.0.14" +"@web3-storage/multipart-parser@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" + integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== + "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" @@ -2731,6 +2931,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2984,6 +3189,13 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -3303,7 +3515,7 @@ cacache@^18.0.2: tar "^6.1.11" unique-filename "^3.0.0" -call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -3532,11 +3744,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + colord@^2.9.1: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" @@ -3671,11 +3899,21 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.1.tgz#790dea2cce64638c7ae04d9fabed193bd7ccf3b4" + integrity sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw== + cookie@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + copy-webpack-plugin@^10.2.0: version "10.2.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" @@ -3801,6 +4039,17 @@ css-select@^4.1.3, css-select@^4.2.1: domutils "^2.8.0" nth-check "^2.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -3809,7 +4058,7 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -3875,11 +4124,21 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + dag-map@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-1.0.2.tgz#e8379f041000ed561fc515475c1ed2c85eece8d7" integrity sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + dayjs@^1.8.15: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" @@ -3911,6 +4170,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decode-uri-component@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -4049,7 +4313,16 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -4061,6 +4334,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -4070,6 +4350,15 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -4155,6 +4444,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-editor@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861" @@ -4331,7 +4625,7 @@ expo-asset@~10.0.10: invariant "^2.2.4" md5-file "^3.2.3" -expo-constants@~16.0.0: +expo-constants@~16.0.0, expo-constants@~16.0.2: version "16.0.2" resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-16.0.2.tgz#eb5a1bddb7308fd8cadac8fc44decaf4784cac5e" integrity sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ== @@ -4356,6 +4650,14 @@ expo-keep-awake@~13.0.2: resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-13.0.2.tgz#5ef31311a339671eec9921b934fdd90ab9652b0e" integrity sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw== +expo-linking@~6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-6.3.1.tgz#05aef8a42bd310391d0b00644be40d80ece038d9" + integrity sha512-xuZCntSBGWCD/95iZ+mTUGTwHdy8Sx+immCqbUBxdvZ2TN61P02kKg7SaLS8A4a/hLrSCwrg5tMMwu5wfKr35g== + dependencies: + expo-constants "~16.0.0" + invariant "^2.2.4" + expo-modules-autolinking@1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-1.11.3.tgz#bc64d278c04015014bb5802e3cfcd942d7c07168" @@ -4386,6 +4688,28 @@ expo-pwa@0.0.127: commander "2.20.0" update-check "1.5.3" +expo-router@~3.5.23: + version "3.5.23" + resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-3.5.23.tgz#da038e28c64cb69f19d046d7c651c389c5207a3e" + integrity sha512-Re2kYcxov67hWrcjuu0+3ovsLxYn79PuX6hgtYN20MgigY5ttX79KOIBEVGTO3F3y9dxSrGHyy5Z14BcO+usGQ== + dependencies: + "@expo/metro-runtime" "3.2.3" + "@expo/server" "^0.4.0" + "@radix-ui/react-slot" "1.0.1" + "@react-navigation/bottom-tabs" "~6.5.7" + "@react-navigation/native" "~6.1.6" + "@react-navigation/native-stack" "~6.9.12" + expo-splash-screen "0.27.5" + react-native-helmet-async "2.0.4" + schema-utils "^4.0.1" + +expo-splash-screen@0.27.5: + version "0.27.5" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.27.5.tgz#bcc1ebb4e761e19a1f2112469f3d424a36fb1e2c" + integrity sha512-9rdZuLkFCfgJBxrheUsOEOIW6Rp+9NVlpSE0hgXQwbTCLTncf00IHSE8/L2NbFyeDLNjof1yZBppaV7tXHRUzA== + dependencies: + "@expo/prebuild-config" "7.0.6" + expo-status-bar@~1.12.1: version "1.12.1" resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-1.12.1.tgz#52ce594aab5064a0511d14375364d718ab78aa66" @@ -4561,6 +4885,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -4663,6 +4992,13 @@ fontfaceobserver@^2.1.0: resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz#5fb392116e75d5024b7ec8e4f2ce92106d1488c8" integrity sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + foreground-child@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" @@ -4996,6 +5332,13 @@ has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -5291,11 +5634,24 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -5308,6 +5664,11 @@ is-buffer@~1.1.1, is-buffer@~1.1.6: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-core-module@^2.13.0: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" @@ -5352,6 +5713,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -5429,6 +5797,13 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -6369,6 +6744,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6410,7 +6790,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.7: +nanoid@^3.1.23, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -6946,6 +7326,11 @@ pngjs@^3.3.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-calc@^8.2.3: version "8.2.4" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" @@ -7322,6 +7707,16 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" +query-string@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== + dependencies: + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" @@ -7387,12 +7782,22 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-fast-compare@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-freeze@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.4.tgz#cbbea2762b0368b05cbe407ddc9d518c57c6f3ad" + integrity sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA== + "react-is@^16.12.0 || ^17.0.0 || ^18.0.0": version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-is@^16.13.1, react-is@^16.8.4: +react-is@^16.13.0, react-is@^16.13.1, react-is@^16.8.4: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -7407,6 +7812,15 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== +react-native-helmet-async@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-native-helmet-async/-/react-native-helmet-async-2.0.4.tgz#93f53a1ff22d6898039688a541653a2d6b6866bb" + integrity sha512-m3CkXWss6B1dd6mCMleLpzDCJJGGaHOLQsUzZv8kAASJmMfmVT4d2fx375iXKTRWT25ThBfae3dECuX5cq/8hg== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" + react-native-reanimated@~3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.10.1.tgz#3c37d1100bbba0065df39c96aab0c1ff1b50c0fa" @@ -7421,6 +7835,27 @@ react-native-reanimated@~3.10.1: convert-source-map "^2.0.0" invariant "^2.2.4" +react-native-safe-area-context@4.10.5: + version "4.10.5" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.10.5.tgz#a9c677a48bd273afa6876772062ce08e8af1f18d" + integrity sha512-Wyb0Nqw2XJ6oZxW/cK8k5q7/UAhg/wbEG6UVf89rQqecDZTDA5ic//P9J6VvJRVZerzGmxWQpVuM7f+PRYUM4g== + +react-native-screens@3.31.1: + version "3.31.1" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.31.1.tgz#909a890f669e32b0fb1b1410278b71ad2f8238f6" + integrity sha512-8fRW362pfZ9y4rS8KY5P3DFScrmwo/vu1RrRMMx0PNHbeC9TLq0Kw1ubD83591yz64gLNHFLTVkTJmWeWCXKtQ== + dependencies: + react-freeze "^1.0.0" + warn-once "^0.1.0" + +react-native-svg@15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.2.0.tgz#9561a6b3bd6b44689f437ba13182afee33bd5557" + integrity sha512-R0E6IhcJfVLsL0lRmnUSm72QO+mTqcAOM5Jb8FVGxJqX3NfJMlMP0YyvcajZiaRR8CqQUpEoqrY25eyZb006kw== + dependencies: + css-select "^5.1.0" + css-tree "^1.1.3" + react-native-web@~0.19.10: version "0.19.12" resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.19.12.tgz#30d1fd70bdff7886f43c0c2698629d830fade6bc" @@ -7491,10 +7926,10 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react@18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== +react@18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== dependencies: loose-envify "^1.1.0" @@ -7825,7 +8260,7 @@ schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: +schema-utils@^4.0.0, schema-utils@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -7975,6 +8410,11 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-cookie-parser@^2.4.8: + version "2.7.0" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz#ef5552b56dc01baae102acb5fc9fb8cd060c30f9" + integrity sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -8009,6 +8449,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -8072,6 +8517,13 @@ simple-plist@^1.1.0: bplist-parser "0.3.1" plist "^3.0.5" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -8134,7 +8586,7 @@ source-map-loader@^3.0.1: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-support@^0.5.16, source-map-support@~0.5.20, source-map-support@~0.5.21: +source-map-support@^0.5.16, source-map-support@^0.5.21, source-map-support@~0.5.20, source-map-support@~0.5.21: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -8180,6 +8632,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -8238,6 +8695,16 @@ stream-buffers@2.2.x, stream-buffers@~2.2.0: resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== +stream-slice@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" + integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -8600,6 +9067,11 @@ tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +turbo-stream@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/turbo-stream/-/turbo-stream-2.4.0.tgz#1e4fca6725e90fa14ac4adb782f2d3759a5695f0" + integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -8643,6 +9115,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@^6.11.1: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.20.0.tgz#3b94d967693759ea625a3b78b2097213f30405a1" + integrity sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -8750,11 +9227,27 @@ url-join@4.0.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" integrity sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA== +use-latest-callback@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.1.tgz#4d4e6a9e4817b13142834850dcfa8d24ca4569cf" + integrity sha512-QWlq8Is8BGWBf883QOEQP5HWYX/kMI+JTbJ5rdtvJLmXTIh9XoHIO3PQcmQl8BU44VKxow1kbQUHa6mQSMALDQ== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -8804,6 +9297,11 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" +warn-once@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43" + integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== + watchpack@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" @@ -8826,6 +9324,20 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-encoding@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +web-streams-polyfill@^3.1.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -8974,6 +9486,17 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.14, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"