diff --git a/apps/common-app/App.tsx b/apps/common-app/App.tsx index 2e4a95d279..e2a9cff07a 100644 --- a/apps/common-app/App.tsx +++ b/apps/common-app/App.tsx @@ -76,6 +76,10 @@ import LongPressExample from './src/simple/longPress'; import ManualExample from './src/simple/manual'; import SimpleFling from './src/simple/fling'; +import FlatListExample from './src/components/flatlist'; +import ScrollViewExample from './src/components/scrollview'; +import ButtonsExample from './src/components/buttons'; + import { Icon } from '@swmansion/icons'; interface Example { @@ -114,6 +118,14 @@ const EXAMPLES: ExamplesSection[] = [ }, ], }, + { + sectionTitle: 'Components', + data: [ + { name: 'FlatList example', component: FlatListExample }, + { name: 'ScrollView example', component: ScrollViewExample }, + { name: 'Buttons example', component: ButtonsExample }, + ], + }, { sectionTitle: 'Basic examples', data: [ diff --git a/apps/common-app/src/basic/pagerAndDrawer/index.android.tsx b/apps/common-app/src/basic/pagerAndDrawer/index.android.tsx index d7a467f834..39fa22d0e5 100644 --- a/apps/common-app/src/basic/pagerAndDrawer/index.android.tsx +++ b/apps/common-app/src/basic/pagerAndDrawer/index.android.tsx @@ -3,7 +3,7 @@ import React, { Component } from 'react'; import { StyleSheet, Text, View } from 'react-native'; import { createNativeWrapper, - DrawerLayoutAndroid, + LegacyDrawerLayoutAndroid, } from 'react-native-gesture-handler'; const WrappedViewPagerAndroid = createNativeWrapper(ViewPagerAndroid, { @@ -35,22 +35,22 @@ export default class Example extends Component { return ( - navigationView}> - + - navigationView}> - + ); diff --git a/apps/common-app/src/components/buttons/index.tsx b/apps/common-app/src/components/buttons/index.tsx new file mode 100644 index 0000000000..d64cfc4cab --- /dev/null +++ b/apps/common-app/src/components/buttons/index.tsx @@ -0,0 +1,61 @@ +import { StyleSheet, Text } from 'react-native'; +import { + BaseButton, + BorderlessButton, + GestureHandlerRootView, + RectButton, +} from 'react-native-gesture-handler'; + +type ButtonWrapperProps = { + ButtonComponent: + | typeof BaseButton + | typeof RectButton + | typeof BorderlessButton; + + color: string; +}; + +function ButtonWrapper({ ButtonComponent, color }: ButtonWrapperProps) { + return ( + console.log(`[${ButtonComponent.name}] onPress`)} + onLongPress={() => { + console.log(`[${ButtonComponent.name}] onLongPress`); + }}> + {ButtonComponent.name} + + ); +} + +export default function ButtonsExample() { + return ( + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'space-around', + }, + button: { + width: 200, + height: 50, + borderRadius: 15, + + display: 'flex', + alignItems: 'center', + justifyContent: 'space-around', + }, + + buttonText: { + color: 'white', + fontSize: 16, + }, +}); diff --git a/apps/common-app/src/components/flatlist/index.tsx b/apps/common-app/src/components/flatlist/index.tsx new file mode 100644 index 0000000000..d42e4550bd --- /dev/null +++ b/apps/common-app/src/components/flatlist/index.tsx @@ -0,0 +1,64 @@ +import React, { useRef, useState } from 'react'; +import { View, Text, StyleSheet } from 'react-native'; +import { + FlatList, + RefreshControl, + GestureHandlerRootView, + GHFlatListRef, +} from 'react-native-gesture-handler'; + +const DATA = Array.from({ length: 20 }, (_, i) => ({ + id: i.toString(), + title: `Item ${i + 1}`, +})); + +const Item = ({ title }: { title: string }) => ( + + {title} + +); + +export default function FlatListExample() { + const [refreshing, setRefreshing] = useState(false); + + const ref = useRef(null); + + const onRefresh = () => { + setRefreshing(true); + console.log(ref.current); + setTimeout(() => { + setRefreshing(false); + }, 1500); + }; + + return ( + + + } + ref={ref} + data={DATA} + keyExtractor={(item) => item.id} + renderItem={({ item }) => } + contentContainerStyle={styles.container} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { + paddingVertical: 16, + }, + item: { + backgroundColor: '#f9c2ff', + padding: 20, + marginVertical: 8, + marginHorizontal: 16, + borderRadius: 8, + }, + title: { + fontSize: 18, + }, +}); diff --git a/apps/common-app/src/components/scrollview/index.tsx b/apps/common-app/src/components/scrollview/index.tsx new file mode 100644 index 0000000000..9cb5d7ec25 --- /dev/null +++ b/apps/common-app/src/components/scrollview/index.tsx @@ -0,0 +1,61 @@ +import React, { useRef, useState } from 'react'; +import { Text, StyleSheet, View } from 'react-native'; +import { + ScrollView, + RefreshControl, + GHScrollViewRef, +} from 'react-native-gesture-handler'; + +const DATA = Array.from({ length: 20 }, (_, i) => ({ + id: i.toString(), + title: `Item ${i + 1}`, +})); + +const Item = ({ title }: { title: string }) => ( + + {title} + +); + +export default function ScrollViewExample() { + const [refreshing, setRefreshing] = useState(false); + + const ref = useRef(null); + + const onRefresh = () => { + setRefreshing(true); + console.log(ref.current); + setTimeout(() => { + setRefreshing(false); + }, 1500); + }; + + return ( + + }> + {DATA.map((item) => ( + + ))} + + ); +} + +const styles = StyleSheet.create({ + container: { + padding: 24, + }, + item: { + backgroundColor: '#f9c2ff', + padding: 20, + marginVertical: 8, + marginHorizontal: 16, + borderRadius: 8, + }, + title: { + fontSize: 18, + }, +}); diff --git a/apps/common-app/src/new_api/calculator/index.tsx b/apps/common-app/src/new_api/calculator/index.tsx index 84b48fcb4f..07c92a6282 100644 --- a/apps/common-app/src/new_api/calculator/index.tsx +++ b/apps/common-app/src/new_api/calculator/index.tsx @@ -10,7 +10,7 @@ import { import { GestureDetector, Gesture, - ScrollView, + LegacyScrollView, } from 'react-native-gesture-handler'; import Animated, { useSharedValue, @@ -60,7 +60,7 @@ interface OutputProps { function Output({ offset, expression, history }: OutputProps) { const layout = useRef({}); - const scrollView = useRef(null); + const scrollView = useRef(null); const drag = useSharedValue(0); const dragOffset = useSharedValue(0); const [opened, setOpened] = useState(false); @@ -130,8 +130,8 @@ function Output({ offset, expression, history }: OutputProps) { - { + { if (!opened) { ref?.scrollToEnd({ animated: false }); } @@ -146,7 +146,7 @@ function Output({ offset, expression, history }: OutputProps) { })} - + diff --git a/apps/common-app/src/recipes/panAndScroll/index.tsx b/apps/common-app/src/recipes/panAndScroll/index.tsx index 87dbe28caa..b31f52faeb 100644 --- a/apps/common-app/src/recipes/panAndScroll/index.tsx +++ b/apps/common-app/src/recipes/panAndScroll/index.tsx @@ -3,10 +3,10 @@ import { Animated, Dimensions, StyleSheet } from 'react-native'; import { PanGestureHandler, TapGestureHandler, - ScrollView, State, PanGestureHandlerGestureEvent, TapGestureHandlerStateChangeEvent, + LegacyScrollView, } from 'react-native-gesture-handler'; import { USE_NATIVE_DRIVER } from '../../config'; @@ -92,11 +92,11 @@ export default class Example extends Component { const tapRef = React.createRef(); const panRef = React.createRef(); return ( - + - + ); } } diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt index 9ffa77a4d3..a13a686df9 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt @@ -36,30 +36,6 @@ open class GestureHandler { // Virtual Detector to which the gesture is assigned. var hostDetectorView: RNGestureHandlerDetectorView? = null - val viewForEvents: RNGestureHandlerDetectorView - get() { - assert(usesNativeOrVirtualDetector(actionType)) { - "[react-native-gesture-handler] `viewForEvents` can only be used with NativeDetector." - } - - val detector = if (actionType == - ACTION_TYPE_VIRTUAL_DETECTOR - ) { - this.hostDetectorView - } else if (this is NativeViewGestureHandler) { - this.view?.parent - } else { - view - } - - if (detector !is RNGestureHandlerDetectorView) { - throw Error( - "[react-native-gesture-handler] Expected RNGestureHandlerDetectorView to be the target for the event.", - ) - } - - return detector - } var state = STATE_UNDETERMINED private set var x = 0f diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerDetectorView.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerDetectorView.kt index fb61aaaa69..51513097ed 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerDetectorView.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerDetectorView.kt @@ -6,6 +6,7 @@ import com.facebook.react.bridge.ReadableArray import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.UIManagerHelper import com.facebook.react.uimanager.events.Event +import com.facebook.react.views.swiperefresh.ReactSwipeRefreshLayout import com.facebook.react.views.view.ReactViewGroup import com.swmansion.gesturehandler.core.GestureHandler @@ -67,7 +68,7 @@ class RNGestureHandlerDetectorView(context: Context) : ReactViewGroup(context) { override fun addView(child: View, index: Int, params: LayoutParams?) { super.addView(child, index, params) - tryAttachNativeHandlersToChildView(child.id) + tryAttachNativeHandlersToChildView(child) } override fun removeViewAt(index: Int) { @@ -95,7 +96,7 @@ class RNGestureHandlerDetectorView(context: Context) : ReactViewGroup(context) { // attach `NativeViewGestureHandlers` here and we have to do it in `addView` method. nativeHandlers.add(tag) } else { - registry.attachHandlerToView(tag, viewTag, actionType) + registry.attachHandlerToView(tag, viewTag, actionType, this) if (actionType == GestureHandler.ACTION_TYPE_VIRTUAL_DETECTOR) { registry.getHandler(tag)?.hostDetectorView = this } @@ -114,7 +115,7 @@ class RNGestureHandlerDetectorView(context: Context) : ReactViewGroup(context) { // This covers the case where `NativeViewGestureHandlers` are attached after child views were created. if (child != null) { - tryAttachNativeHandlersToChildView(child.id) + tryAttachNativeHandlersToChildView(child) } } @@ -149,12 +150,18 @@ class RNGestureHandlerDetectorView(context: Context) : ReactViewGroup(context) { } } - private fun tryAttachNativeHandlersToChildView(childId: Int) { + private fun tryAttachNativeHandlersToChildView(child: View) { val registry = RNGestureHandlerModule.registries[moduleId] ?: throw Exception("Tried to access a non-existent registry") + val id = if (child is ReactSwipeRefreshLayout) { + child.getChildAt(0).id + } else { + child.id + } + for (tag in nativeHandlers) { - registry.attachHandlerToView(tag, childId, GestureHandler.ACTION_TYPE_NATIVE_DETECTOR) + registry.attachHandlerToView(tag, id, GestureHandler.ACTION_TYPE_NATIVE_DETECTOR, this) attachedHandlers.add(tag) } diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt index f14c5927e6..370d46154c 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt @@ -21,11 +21,17 @@ class RNGestureHandlerRegistry : GestureHandlerRegistry { fun getHandler(handlerTag: Int): GestureHandler? = handlers[handlerTag] @Synchronized - fun attachHandlerToView(handlerTag: Int, viewTag: Int, actionType: Int): Boolean { + fun attachHandlerToView( + handlerTag: Int, + viewTag: Int, + actionType: Int, + hostDetectorView: RNGestureHandlerDetectorView? = null, + ): Boolean { val handler = handlers[handlerTag] return handler?.let { detachHandlerInternal(handler) handler.actionType = actionType + handler.hostDetectorView = hostDetectorView registerHandlerForViewWithTag(viewTag, handler) true } ?: false diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEvent.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEvent.kt index 80966e6b20..c74eb51e23 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEvent.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEvent.kt @@ -21,7 +21,7 @@ class RNGestureHandlerEvent private constructor() : Event eventHandlerType: EventHandlerType, ) { val view = if (GestureHandler.usesNativeOrVirtualDetector(handler.actionType)) { - handler.viewForEvents + handler.hostDetectorView!! } else { handler.view!! } diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEventDispatcher.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEventDispatcher.kt index bcd04de546..d2fcf9797f 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEventDispatcher.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEventDispatcher.kt @@ -87,7 +87,7 @@ class RNGestureHandlerEventDispatcher(private val reactApplicationContext: React eventHandlerType, ) - handler.viewForEvents.dispatchEvent(event) + handler.hostDetectorView?.dispatchEvent(event) } } } @@ -152,7 +152,7 @@ class RNGestureHandlerEventDispatcher(private val reactApplicationContext: React eventHandlerType, ) - handler.viewForEvents.dispatchEvent(event) + handler.hostDetectorView?.dispatchEvent(event) } } } @@ -196,7 +196,7 @@ class RNGestureHandlerEventDispatcher(private val reactApplicationContext: React } val event = RNGestureHandlerTouchEvent.obtain(handler, handler.actionType, eventHandlerType) - handler.viewForEvents.dispatchEvent(event) + handler.hostDetectorView?.dispatchEvent(event) } } } diff --git a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerStateChangeEvent.kt b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerStateChangeEvent.kt index 0f7b55c09d..45e3e732e6 100644 --- a/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerStateChangeEvent.kt +++ b/packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerStateChangeEvent.kt @@ -24,7 +24,7 @@ class RNGestureHandlerStateChangeEvent private constructor() : Event init(handler: T, actionType: Int, eventHandlerType: EventHandlerType) { val view = if (GestureHandler.usesNativeOrVirtualDetector(handler.actionType)) { - handler.viewForEvents + handler.hostDetectorView!! } else { handler.view!! } diff --git a/packages/react-native-gesture-handler/src/components/GestureButtons.tsx b/packages/react-native-gesture-handler/src/components/GestureButtons.tsx index 04409f7f2c..43ed5518a6 100644 --- a/packages/react-native-gesture-handler/src/components/GestureButtons.tsx +++ b/packages/react-native-gesture-handler/src/components/GestureButtons.tsx @@ -12,14 +12,17 @@ import { import type { NativeViewGestureHandlerPayload } from '../handlers/GestureHandlerEventPayload'; import type { BaseButtonWithRefProps, - BaseButtonProps, + LegacyBaseButtonProps, RectButtonWithRefProps, - RectButtonProps, + LegacyRectButtonProps, BorderlessButtonWithRefProps, - BorderlessButtonProps, + LegacyBorderlessButtonProps, } from './GestureButtonsProps'; -export const RawButton = createNativeWrapper(GestureHandlerButton, { +/** + * @deprecated use `RawButton` instead + */ +export const LegacyRawButton = createNativeWrapper(GestureHandlerButton, { shouldCancelWhenOutside: false, shouldActivateOnStart: false, }); @@ -123,7 +126,7 @@ class InnerBaseButton extends React.Component { const { rippleColor, style, ...rest } = this.props; return ( - { const AnimatedInnerBaseButton = Animated.createAnimatedComponent(InnerBaseButton); -export const BaseButton = React.forwardRef< +/** + * @deprecated use `BaseButton` instead + */ +export const LegacyBaseButton = React.forwardRef< React.ComponentType, - Omit + Omit >((props, ref) => ); const AnimatedBaseButton = React.forwardRef< @@ -185,7 +191,7 @@ class InnerRectButton extends React.Component { const resolvedStyle = StyleSheet.flatten(style) ?? {}; return ( - { ]} /> {children} - + ); } } -export const RectButton = React.forwardRef< +/** + * @deprecated use `RectButton` instead + */ +export const LegacyRectButton = React.forwardRef< React.ComponentType, - Omit + Omit >((props, ref) => ); class InnerBorderlessButton extends React.Component { @@ -251,9 +260,12 @@ class InnerBorderlessButton extends React.Component + Omit >((props, ref) => ); -export { default as PureNativeButton } from './GestureHandlerButton'; +export { default as LegacyPureNativeButton } from './GestureHandlerButton'; diff --git a/packages/react-native-gesture-handler/src/components/GestureButtonsProps.ts b/packages/react-native-gesture-handler/src/components/GestureButtonsProps.ts index e9504bff32..fe4a97575f 100644 --- a/packages/react-native-gesture-handler/src/components/GestureButtonsProps.ts +++ b/packages/react-native-gesture-handler/src/components/GestureButtonsProps.ts @@ -8,7 +8,10 @@ import { } from 'react-native'; import type { NativeViewGestureHandlerProps } from '../handlers/NativeViewGestureHandler'; -export interface RawButtonProps +/** + * @deprecated use `RawButtonProps` with `RawButton` instead + */ +export interface LegacyRawButtonProps extends NativeViewGestureHandlerProps, AccessibilityProps { /** @@ -94,7 +97,10 @@ interface ButtonWithRefProps { innerRef?: React.ForwardedRef>; } -export interface BaseButtonProps extends RawButtonProps { +/** + * @deprecated use `BaseButtonProps` with `BaseButton` instead + */ +export interface LegacyBaseButtonProps extends LegacyRawButtonProps { /** * Called when the button gets pressed (analogous to `onPress` in * `TouchableHighlight` from RN core). @@ -123,10 +129,13 @@ export interface BaseButtonProps extends RawButtonProps { delayLongPress?: number; } export interface BaseButtonWithRefProps - extends BaseButtonProps, + extends LegacyBaseButtonProps, ButtonWithRefProps {} -export interface RectButtonProps extends BaseButtonProps { +/** + * @deprecated use `RectButtonProps` with `RectButton` instead + */ +export interface LegacyRectButtonProps extends LegacyBaseButtonProps { /** * Background color that will be dimmed when button is in active state. */ @@ -140,10 +149,14 @@ export interface RectButtonProps extends BaseButtonProps { activeOpacity?: number; } export interface RectButtonWithRefProps - extends RectButtonProps, + extends LegacyRectButtonProps, ButtonWithRefProps {} -export interface BorderlessButtonProps extends BaseButtonProps { +/** + * @deprecated use `BorderlessButtonProps` with `BorderlessButton` instead + */ + +export interface LegacyBorderlessButtonProps extends LegacyBaseButtonProps { /** * iOS only. * @@ -152,5 +165,5 @@ export interface BorderlessButtonProps extends BaseButtonProps { activeOpacity?: number; } export interface BorderlessButtonWithRefProps - extends BorderlessButtonProps, + extends LegacyBorderlessButtonProps, ButtonWithRefProps {} diff --git a/packages/react-native-gesture-handler/src/components/GestureComponents.tsx b/packages/react-native-gesture-handler/src/components/GestureComponents.tsx index 8bdf73a35d..aac075a8d0 100644 --- a/packages/react-native-gesture-handler/src/components/GestureComponents.tsx +++ b/packages/react-native-gesture-handler/src/components/GestureComponents.tsx @@ -28,12 +28,17 @@ import { import { toArray } from '../utils'; -export const RefreshControl = createNativeWrapper(RNRefreshControl, { +/** + * @deprecated use `RefreshControl` instead + */ +export const LegacyRefreshControl = createNativeWrapper(RNRefreshControl, { disallowInterruption: true, shouldCancelWhenOutside: false, }); + // eslint-disable-next-line @typescript-eslint/no-redeclare -export type RefreshControl = typeof RefreshControl & RNRefreshControl; +export type LegacyRefreshControl = typeof LegacyRefreshControl & + RNRefreshControl; const GHScrollView = createNativeWrapper>( RNScrollView, @@ -42,11 +47,15 @@ const GHScrollView = createNativeWrapper>( shouldCancelWhenOutside: false, } ); -export const ScrollView = React.forwardRef< + +/** + * @deprecated use `ScrollView` instead + */ +export const LegacyScrollView = React.forwardRef< RNScrollView, RNScrollViewProps & NativeViewGestureHandlerProps >((props, ref) => { - const refreshControlGestureRef = React.useRef(null); + const refreshControlGestureRef = React.useRef(null); const { refreshControl, waitFor, ...rest } = props; return ( @@ -67,32 +76,46 @@ export const ScrollView = React.forwardRef< /> ); }); + // Backward type compatibility with https://github.com/software-mansion/react-native-gesture-handler/blob/db78d3ca7d48e8ba57482d3fe9b0a15aa79d9932/react-native-gesture-handler.d.ts#L440-L457 // include methods of wrapped components by creating an intersection type with the RN component instead of duplicating them. // eslint-disable-next-line @typescript-eslint/no-redeclare -export type ScrollView = typeof GHScrollView & RNScrollView; +export type LegacyScrollView = typeof GHScrollView & RNScrollView; -export const Switch = createNativeWrapper(RNSwitch, { +/** + * @deprecated use `Switch` instead + */ +export const LegacySwitch = createNativeWrapper(RNSwitch, { shouldCancelWhenOutside: false, shouldActivateOnStart: true, disallowInterruption: true, }); // eslint-disable-next-line @typescript-eslint/no-redeclare -export type Switch = typeof Switch & RNSwitch; +export type LegacySwitch = typeof LegacySwitch & RNSwitch; -export const TextInput = createNativeWrapper(RNTextInput); +/** + * @deprecated use `RefreshControl` instead + */ +export const LegacyTextInput = + createNativeWrapper(RNTextInput); // eslint-disable-next-line @typescript-eslint/no-redeclare -export type TextInput = typeof TextInput & RNTextInput; +export type LegacyTextInput = typeof LegacyTextInput & RNTextInput; -export const DrawerLayoutAndroid = createNativeWrapper< +/** + * @deprecated use `DrawerLayoutAndroid` instead + */ +export const LegacyDrawerLayoutAndroid = createNativeWrapper< PropsWithChildren >(RNDrawerLayoutAndroid, { disallowInterruption: true }); // eslint-disable-next-line @typescript-eslint/no-redeclare -export type DrawerLayoutAndroid = typeof DrawerLayoutAndroid & +export type LegacyDrawerLayoutAndroid = typeof LegacyDrawerLayoutAndroid & RNDrawerLayoutAndroid; -export const FlatList = React.forwardRef((props, ref) => { - const refreshControlGestureRef = React.useRef(null); +/** + * @deprecated use `FlatList` instead + */ +export const LegacyFlatList = React.forwardRef((props, ref) => { + const refreshControlGestureRef = React.useRef(null); const { waitFor, refreshControl, ...rest } = props; @@ -117,7 +140,7 @@ export const FlatList = React.forwardRef((props, ref) => { ref={ref} {...flatListProps} renderScrollComponent={(scrollProps) => ( - { }) as ( props: PropsWithChildren< Omit, 'renderScrollComponent'> & - RefAttributes> & + RefAttributes> & NativeViewGestureHandlerProps >, - ref?: ForwardedRef> + ref?: ForwardedRef> ) => ReactElement | null; // eslint-disable-next-line @typescript-eslint/no-redeclare -export type FlatList = typeof FlatList & RNFlatList; +export type LegacyFlatList = typeof LegacyFlatList & + RNFlatList; diff --git a/packages/react-native-gesture-handler/src/components/GestureComponents.web.tsx b/packages/react-native-gesture-handler/src/components/GestureComponents.web.tsx index ccc03eaf8d..6526532342 100644 --- a/packages/react-native-gesture-handler/src/components/GestureComponents.web.tsx +++ b/packages/react-native-gesture-handler/src/components/GestureComponents.web.tsx @@ -10,32 +10,54 @@ import { import createNativeWrapper from '../handlers/createNativeWrapper'; -export const ScrollView = createNativeWrapper(RNScrollView, { +/** + * @deprecated use `ScrollView` instead + */ +export const LegacyScrollView = createNativeWrapper(RNScrollView, { disallowInterruption: false, }); -export const Switch = createNativeWrapper(RNSwitch, { +/** + * @deprecated use `Switch` instead + */ +export const LegacySwitch = createNativeWrapper(RNSwitch, { shouldCancelWhenOutside: false, shouldActivateOnStart: true, disallowInterruption: true, }); -export const TextInput = createNativeWrapper(RNTextInput); -export const DrawerLayoutAndroid = () => { + +/** + * @deprecated use `TextInput` instead + */ +export const LegacyTextInput = createNativeWrapper(RNTextInput); + +/** + * @deprecated use `DrawerLayoutAndroid` instead + */ +export const LegacyDrawerLayoutAndroid = () => { console.warn('DrawerLayoutAndroid is not supported on web!'); return ; }; +/** + * @deprecated use `RefreshControl` instead + */ // RefreshControl is implemented as a functional component, rendering a View // NativeViewGestureHandler needs to set a ref on its child, which cannot be done // on functional components -export const RefreshControl = createNativeWrapper(View); +export const LegacyRefreshControl = createNativeWrapper(View); -export const FlatList = React.forwardRef( +/** + * @deprecated use `FlatList` instead + */ +export const LegacyFlatList = React.forwardRef( (props: FlatListProps, ref: any) => ( } + renderScrollComponent={(scrollProps) => ( + + )} /> ) ); diff --git a/packages/react-native-gesture-handler/src/components/GestureHandlerButton.tsx b/packages/react-native-gesture-handler/src/components/GestureHandlerButton.tsx index b6f0c391c0..8f7ddcd1fb 100644 --- a/packages/react-native-gesture-handler/src/components/GestureHandlerButton.tsx +++ b/packages/react-native-gesture-handler/src/components/GestureHandlerButton.tsx @@ -1,5 +1,5 @@ import { HostComponent } from 'react-native'; -import type { RawButtonProps } from './GestureButtonsProps'; +import type { LegacyRawButtonProps } from './GestureButtonsProps'; import RNGestureHandlerButtonNativeComponent from '../specs/RNGestureHandlerButtonNativeComponent'; -export default RNGestureHandlerButtonNativeComponent as HostComponent; +export default RNGestureHandlerButtonNativeComponent as HostComponent; diff --git a/packages/react-native-gesture-handler/src/components/touchables/GenericTouchable.tsx b/packages/react-native-gesture-handler/src/components/touchables/GenericTouchable.tsx index 6bbb344f49..01bff2671a 100644 --- a/packages/react-native-gesture-handler/src/components/touchables/GenericTouchable.tsx +++ b/packages/react-native-gesture-handler/src/components/touchables/GenericTouchable.tsx @@ -3,7 +3,7 @@ import { Component } from 'react'; import { Animated, Platform } from 'react-native'; import { State } from '../../State'; -import { BaseButton } from '../GestureButtons'; +import { LegacyBaseButton } from '../GestureButtons'; import { GestureEvent, @@ -251,7 +251,7 @@ export default class GenericTouchable extends Component< }; return ( - {this.props.children} - + ); } } diff --git a/packages/react-native-gesture-handler/src/handlers/gestureHandlerTypesCompat.ts b/packages/react-native-gesture-handler/src/handlers/gestureHandlerTypesCompat.ts index 050208ba2f..c4e4ff2506 100644 --- a/packages/react-native-gesture-handler/src/handlers/gestureHandlerTypesCompat.ts +++ b/packages/react-native-gesture-handler/src/handlers/gestureHandlerTypesCompat.ts @@ -1,8 +1,8 @@ import type { - BaseButtonProps, - BorderlessButtonProps, - RawButtonProps, - RectButtonProps, + LegacyBaseButtonProps, + LegacyBorderlessButtonProps, + LegacyRawButtonProps, + LegacyRectButtonProps, } from '../components/GestureButtonsProps'; import { GestureEvent, @@ -94,8 +94,22 @@ export type FlingGestureHandlerProperties = FlingGestureHandlerProps; * @deprecated ForceTouch gesture is deprecated and will be removed in the future. */ export type ForceTouchGestureHandlerProperties = ForceTouchGestureHandlerProps; + // Button props -export type RawButtonProperties = RawButtonProps; -export type BaseButtonProperties = BaseButtonProps; -export type RectButtonProperties = RectButtonProps; -export type BorderlessButtonProperties = BorderlessButtonProps; + +/** + * @deprecated Use RawButtonProperties instead + */ +export type LegacyRawButtonProperties = LegacyRawButtonProps; +/** + * @deprecated Use BaseButtonProperties instead + */ +export type LegacyBaseButtonProperties = LegacyBaseButtonProps; +/** + * @deprecated Use RectButtonProperties instead + */ +export type LegacyRectButtonProperties = LegacyRectButtonProps; +/** + * @deprecated Use BorderlessButtonProperties instead + */ +export type LegacyBorderlessButtonProperties = LegacyBorderlessButtonProps; diff --git a/packages/react-native-gesture-handler/src/index.ts b/packages/react-native-gesture-handler/src/index.ts index e60e86f144..ca279623ce 100644 --- a/packages/react-native-gesture-handler/src/index.ts +++ b/packages/react-native-gesture-handler/src/index.ts @@ -71,18 +71,20 @@ export type { export type { GestureStateManagerType as GestureStateManager } from './handlers/gestures/gestureStateManager'; export { NativeViewGestureHandler } from './handlers/NativeViewGestureHandler'; export type { - RawButtonProps, - BaseButtonProps, - RectButtonProps, - BorderlessButtonProps, + LegacyRawButtonProps, + LegacyBaseButtonProps, + LegacyRectButtonProps, + LegacyBorderlessButtonProps, } from './components/GestureButtonsProps'; + export { - RawButton, - BaseButton, - RectButton, - BorderlessButton, - PureNativeButton, + LegacyRawButton, + LegacyBaseButton, + LegacyRectButton, + LegacyBorderlessButton, + LegacyPureNativeButton, } from './components/GestureButtons'; + export type { TouchableHighlightProps, TouchableOpacityProps, @@ -95,13 +97,14 @@ export { TouchableWithoutFeedback, } from './components/touchables'; export { - ScrollView, - Switch, - TextInput, - DrawerLayoutAndroid, - FlatList, - RefreshControl, + LegacyScrollView, + LegacySwitch, + LegacyTextInput, + LegacyDrawerLayoutAndroid, + LegacyFlatList, + LegacyRefreshControl, } from './components/GestureComponents'; + export { Text } from './components/Text'; export { HoverEffect } from './handlers/gestures/hoverGesture'; export type { @@ -137,10 +140,10 @@ export type { FlingGestureHandlerProperties, ForceTouchGestureHandlerProperties, // Buttons props - RawButtonProperties, - BaseButtonProperties, - RectButtonProperties, - BorderlessButtonProperties, + LegacyRawButtonProperties, + LegacyBaseButtonProperties, + LegacyRectButtonProperties, + LegacyBorderlessButtonProperties, } from './handlers/gestureHandlerTypesCompat'; export type { @@ -164,4 +167,6 @@ export type { GestureTouchEvent as SingleGestureTouchEvent } from './handlers/ge export * from './v3/hooks/gestures'; +export * from './v3/components'; + initialize(); diff --git a/packages/react-native-gesture-handler/src/v3/components/GestureButtons.tsx b/packages/react-native-gesture-handler/src/v3/components/GestureButtons.tsx new file mode 100644 index 0000000000..1dba4d5d90 --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/components/GestureButtons.tsx @@ -0,0 +1,169 @@ +import React, { useRef } from 'react'; +import { Platform, StyleSheet, Animated } from 'react-native'; +import createNativeWrapper from '../createNativeWrapper'; +import GestureHandlerButton from '../../components/GestureHandlerButton'; +import type { + BaseButtonProps, + BorderlessButtonProps, + RectButtonProps, +} from './GestureButtonsProps'; + +import type { GestureStateChangeEvent } from '../types'; +import type { NativeViewHandlerData } from '../hooks/gestures/native/useNativeGesture'; + +type CallbackEventType = GestureStateChangeEvent; + +export const RawButton = createNativeWrapper(GestureHandlerButton, { + shouldCancelWhenOutside: false, + shouldActivateOnStart: false, +}); + +export const BaseButton = (props: BaseButtonProps) => { + const longPressDetected = useRef(false); + const longPressTimeout = useRef | undefined>( + undefined + ); + + const delayLongPress = props.delayLongPress ?? 600; + + const { onLongPress, onPress, onActiveStateChange, style, ...rest } = props; + + const wrappedLongPress = () => { + longPressDetected.current = true; + onLongPress?.(); + }; + + const onBegin = (e: CallbackEventType) => { + if (Platform.OS === 'android' && e.handlerData.pointerInside) { + longPressDetected.current = false; + if (onLongPress) { + longPressTimeout.current = setTimeout(wrappedLongPress, delayLongPress); + } + } + }; + + const onStart = (e: CallbackEventType) => { + onActiveStateChange?.(true); + + if (Platform.OS !== 'android' && e.handlerData.pointerInside) { + longPressDetected.current = false; + if (onLongPress) { + longPressTimeout.current = setTimeout(wrappedLongPress, delayLongPress); + } + } + + if ( + !e.handlerData.pointerInside && + longPressTimeout.current !== undefined + ) { + clearTimeout(longPressTimeout.current); + longPressTimeout.current = undefined; + } + }; + + const onEnd = (e: CallbackEventType, success: boolean) => { + onActiveStateChange?.(false); + + if (success && !longPressDetected.current) { + onPress?.(e.handlerData.pointerInside); + } + }; + + const onFinalize = (_e: CallbackEventType) => { + if (longPressTimeout.current !== undefined) { + clearTimeout(longPressTimeout.current); + longPressTimeout.current = undefined; + } + }; + + return ( + + ); +}; + +const AnimatedBaseButton = Animated.createAnimatedComponent(BaseButton); + +const btnStyles = StyleSheet.create({ + underlay: { + position: 'absolute', + left: 0, + right: 0, + bottom: 0, + top: 0, + }, +}); + +export const RectButton = (props: RectButtonProps) => { + const activeOpacity = props.activeOpacity ?? 0.105; + const underlayColor = props.underlayColor ?? 'black'; + + const opacity = useRef(new Animated.Value(0)).current; + + const onActiveStateChange = (active: boolean) => { + if (Platform.OS !== 'android') { + opacity.setValue(active ? activeOpacity : 0); + } + + props.onActiveStateChange?.(active); + }; + + const { children, style, ...rest } = props; + + const resolvedStyle = StyleSheet.flatten(style ?? {}); + + return ( + + + {children} + + ); +}; + +export const BorderlessButton = (props: BorderlessButtonProps) => { + const activeOpacity = props.activeOpacity ?? 0.3; + const opacity = useRef(new Animated.Value(1)).current; + + const onActiveStateChange = (active: boolean) => { + if (Platform.OS === 'ios') { + opacity.setValue(active ? activeOpacity : 1); + } + + props.onActiveStateChange?.(active); + }; + + const { children, style, ...rest } = props; + + return ( + + {children} + + ); +}; + +export { default as PureNativeButton } from '../../components/GestureHandlerButton'; diff --git a/packages/react-native-gesture-handler/src/v3/components/GestureButtonsProps.ts b/packages/react-native-gesture-handler/src/v3/components/GestureButtonsProps.ts new file mode 100644 index 0000000000..0f4f282d8f --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/components/GestureButtonsProps.ts @@ -0,0 +1,155 @@ +import * as React from 'react'; +import { + AccessibilityProps, + ColorValue, + LayoutChangeEvent, + StyleProp, + ViewStyle, +} from 'react-native'; +import type { NativeViewGestureHandlerProps } from '../../handlers/NativeViewGestureHandler'; + +export interface RawButtonProps + extends NativeViewGestureHandlerProps, + AccessibilityProps { + /** + * Defines if more than one button could be pressed simultaneously. By default + * set true. + */ + exclusive?: boolean; + // TODO: we should transform props in `createNativeWrapper` + /** + * Android only. + * + * Defines color of native ripple animation used since API level 21. + */ + rippleColor?: number | ColorValue | null; + + /** + * Android only. + * + * Defines radius of native ripple animation used since API level 21. + */ + rippleRadius?: number | null; + + /** + * Android only. + * + * Set this to true if you want the ripple animation to render outside the view bounds. + */ + borderless?: boolean; + + /** + * Android only. + * + * Defines whether the ripple animation should be drawn on the foreground of the view. + */ + foreground?: boolean; + + /** + * Android only. + * + * Set this to true if you don't want the system to play sound when the button is pressed. + */ + touchSoundDisabled?: boolean; + + /** + * Style object, use it to set additional styles. + */ + style?: StyleProp; + + /** + * Invoked on mount and layout changes. + */ + onLayout?: (event: LayoutChangeEvent) => void; + + /** + * Used for testing-library compatibility, not passed to the native component. + * @deprecated test-only props are deprecated and will be removed in the future. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + testOnly_onPress?: Function | null; + + /** + * Used for testing-library compatibility, not passed to the native component. + * @deprecated test-only props are deprecated and will be removed in the future. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + testOnly_onPressIn?: Function | null; + + /** + * Used for testing-library compatibility, not passed to the native component. + * @deprecated test-only props are deprecated and will be removed in the future. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + testOnly_onPressOut?: Function | null; + + /** + * Used for testing-library compatibility, not passed to the native component. + * @deprecated test-only props are deprecated and will be removed in the future. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + testOnly_onLongPress?: Function | null; +} +interface ButtonWithRefProps { + ref?: React.RefObject; +} + +export interface BaseButtonProps extends RawButtonProps { + /** + * Called when the button gets pressed (analogous to `onPress` in + * `TouchableHighlight` from RN core). + */ + onPress?: (pointerInside: boolean) => void; + + /** + * Called when the button gets pressed and is held for `delayLongPress` + * milliseconds. + */ + onLongPress?: () => void; + + /** + * Called when button changes from inactive to active and vice versa. It + * passes active state as a boolean variable as a first parameter for that + * method. + */ + onActiveStateChange?: (active: boolean) => void; + style?: StyleProp; + + /** + * Delay, in milliseconds, after which the `onLongPress` callback gets called. + * Defaults to 600. + */ + delayLongPress?: number; +} +export interface BaseButtonWithRefProps + extends BaseButtonProps, + ButtonWithRefProps {} + +export interface RectButtonProps extends BaseButtonProps { + /** + * Background color that will be dimmed when button is in active state. + */ + underlayColor?: string; + + /** + * iOS only. + * + * Opacity applied to the underlay when button is in active state. + */ + activeOpacity?: number; +} +export interface RectButtonWithRefProps + extends RectButtonProps, + ButtonWithRefProps {} + +export interface BorderlessButtonProps extends BaseButtonProps { + /** + * iOS only. + * + * Opacity applied to the button when it is in an active state. + */ + activeOpacity?: number; +} +export interface BorderlessButtonWithRefProps + extends BorderlessButtonProps, + ButtonWithRefProps {} diff --git a/packages/react-native-gesture-handler/src/v3/components/GestureComponents.tsx b/packages/react-native-gesture-handler/src/v3/components/GestureComponents.tsx new file mode 100644 index 0000000000..a2ebffb939 --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/components/GestureComponents.tsx @@ -0,0 +1,195 @@ +import React, { + PropsWithChildren, + ReactElement, + useRef, + useImperativeHandle, + useState, + RefObject, +} from 'react'; +import { + ScrollView as RNScrollView, + ScrollViewProps as RNScrollViewProps, + Switch as RNSwitch, + SwitchProps as RNSwitchProps, + TextInput as RNTextInput, + TextInputProps as RNTextInputProps, + FlatList as RNFlatList, + FlatListProps as RNFlatListProps, + RefreshControl as RNRefreshControl, +} from 'react-native'; + +import createNativeWrapper, { + ComponentWrapperRef, +} from '../createNativeWrapper'; + +import { NativeWrapperProperties } from '../types/NativeWrapperType'; +import { NativeWrapperProps } from '../hooks/utils'; +import { DetectorType } from '../detectors'; +import { NativeGesture } from '../hooks/gestures/native/useNativeGesture'; + +export const RefreshControl = createNativeWrapper( + RNRefreshControl, + { + disallowInterruption: true, + shouldCancelWhenOutside: false, + }, + DetectorType.Virtual +); + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export type RefreshControl = typeof RefreshControl & RNRefreshControl; + +const GHScrollView = createNativeWrapper>( + RNScrollView, + { + disallowInterruption: true, + shouldCancelWhenOutside: false, + }, + DetectorType.Intercepting +); + +export type ImperativeScrollViewRef = + ComponentWrapperRef | null; + +export const ScrollView = ( + props: RNScrollViewProps & + NativeWrapperProperties & { + ref?: React.RefObject; + // This prop exists because using `ref` in `renderScrollComponent` doesn't work (it is overwritten by RN internals). + innerRef?: (node: ImperativeScrollViewRef) => void; + } +) => { + const { refreshControl, innerRef, ref, ...rest } = props; + + const [scrollGesture, setScrollGesture] = useState( + null + ); + + const wrapperRef = useRef>(null); + + useImperativeHandle( + ref, + () => wrapperRef.current + ); + + return ( + { + setScrollGesture(node?.gestureRef ?? null); + wrapperRef.current = node; + innerRef?.(node); + }} + // @ts-ignore we don't pass `refreshing` prop as we only want to override the ref + refreshControl={ + refreshControl + ? React.cloneElement( + refreshControl, + // @ts-ignore block exists (on our RefreshControl) + scrollGesture ? { block: scrollGesture } : {} + ) + : undefined + } + /> + ); +}; +// Backward type compatibility with https://github.com/software-mansion/react-native-gesture-handler/blob/db78d3ca7d48e8ba57482d3fe9b0a15aa79d9932/react-native-gesture-handler.d.ts#L440-L457 +// include methods of wrapped components by creating an intersection type with the RN component instead of duplicating them. +// eslint-disable-next-line @typescript-eslint/no-redeclare +export type ScrollView = typeof GHScrollView & RNScrollView; + +export const Switch = createNativeWrapper(RNSwitch, { + shouldCancelWhenOutside: false, + shouldActivateOnStart: true, + disallowInterruption: true, +}); +// eslint-disable-next-line @typescript-eslint/no-redeclare +export type Switch = typeof Switch & RNSwitch; + +export const TextInput = createNativeWrapper(RNTextInput); +// eslint-disable-next-line @typescript-eslint/no-redeclare +export type TextInput = typeof TextInput & RNTextInput; + +export type ImperativeFlatListRef = + | (ComponentWrapperRef & { + flatListRef: FlatList | null; + }) + | null; + +export const FlatList = ((props) => { + const { refreshControl, ref, ...rest } = props; + + const [scrollGesture, setScrollGesture] = useState( + null + ); + + const wrapperRef = useRef(null); + const flatListRef = useRef>(null); + + const flatListProps = {}; + const scrollViewProps = {}; + + for (const [propName, value] of Object.entries(rest)) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/26255 + if (NativeWrapperProps.has(propName)) { + // @ts-ignore - this function cannot have generic type so we have to ignore this error + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + scrollViewProps[propName] = value; + } else { + // @ts-ignore - this function cannot have generic type so we have to ignore this error + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + flatListProps[propName] = value; + } + } + + useImperativeHandle( + // @ts-ignore We want to override ref + ref, + () => { + return { + ...wrapperRef.current, + flatListRef: flatListRef.current, + }; + } + ); + + return ( + // @ts-ignore - this function cannot have generic type so we have to ignore this error + ( + { + setScrollGesture(node?.gestureRef ?? null); + wrapperRef.current = node; + }} + {...{ + ...scrollProps, + ...scrollViewProps, + }} + /> + )} + // @ts-ignore we don't pass `refreshing` prop as we only want to override the ref + refreshControl={ + refreshControl + ? React.cloneElement( + refreshControl, + // @ts-ignore block exists (on our RefreshControl) + scrollGesture ? { block: scrollGesture } : {} + ) + : undefined + } + /> + ); +}) as ( + props: PropsWithChildren< + Omit, 'renderScrollComponent' | 'ref'> & + NativeWrapperProperties & { + ref?: RefObject>; + } + > +) => ReactElement | null; +// eslint-disable-next-line @typescript-eslint/no-redeclare +export type FlatList = typeof FlatList & RNFlatList; diff --git a/packages/react-native-gesture-handler/src/v3/components/GestureComponents.web.tsx b/packages/react-native-gesture-handler/src/v3/components/GestureComponents.web.tsx new file mode 100644 index 0000000000..a9e69cc62d --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/components/GestureComponents.web.tsx @@ -0,0 +1,43 @@ +import * as React from 'react'; +import { + FlatList as RNFlatList, + Switch as RNSwitch, + TextInput as RNTextInput, + ScrollView as RNScrollView, + FlatListProps, + View, +} from 'react-native'; + +import createNativeWrapper from '../createNativeWrapper'; + +export const ScrollView = createNativeWrapper(RNScrollView, { + disallowInterruption: false, +}); + +export const Switch = createNativeWrapper(RNSwitch, { + shouldCancelWhenOutside: false, + shouldActivateOnStart: true, + disallowInterruption: true, +}); + +export const TextInput = createNativeWrapper(RNTextInput); + +export const DrawerLayoutAndroid = () => { + console.warn('DrawerLayoutAndroid is not supported on web!'); + return ; +}; + +// RefreshControl is implemented as a functional component, rendering a View +// NativeViewGestureHandler needs to set a ref on its child, which cannot be done +// on functional components +export const RefreshControl = createNativeWrapper(View); + +export const FlatList = React.forwardRef( + (props: FlatListProps, ref: any) => ( + } + /> + ) +); diff --git a/packages/react-native-gesture-handler/src/v3/components/index.ts b/packages/react-native-gesture-handler/src/v3/components/index.ts new file mode 100644 index 0000000000..7639586f92 --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/components/index.ts @@ -0,0 +1,27 @@ +export type { + RawButtonProps, + BaseButtonProps, + RectButtonProps, + BorderlessButtonProps, +} from './GestureButtonsProps'; + +export { + RawButton, + BaseButton, + RectButton, + BorderlessButton, + PureNativeButton, +} from './GestureButtons'; + +export { + ScrollView, + Switch, + TextInput, + FlatList, + RefreshControl, +} from './GestureComponents'; + +export type { + ImperativeScrollViewRef as GHScrollViewRef, + ImperativeFlatListRef as GHFlatListRef, +} from './GestureComponents'; diff --git a/packages/react-native-gesture-handler/src/v3/createNativeWrapper.tsx b/packages/react-native-gesture-handler/src/v3/createNativeWrapper.tsx new file mode 100644 index 0000000000..43423000a9 --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/createNativeWrapper.tsx @@ -0,0 +1,87 @@ +import React, { useImperativeHandle, useRef } from 'react'; + +import { NativeWrapperProps } from './hooks/utils'; +import { useNativeGesture } from './hooks/gestures'; +import { NativeDetector } from './detectors/NativeDetector'; +import type { NativeWrapperProperties } from './types/NativeWrapperType'; +import { NativeGesture } from './hooks/gestures/native/useNativeGesture'; +import { DetectorType, InterceptingGestureDetector } from './detectors'; +import { VirtualDetector } from './detectors/VirtualDetector/VirtualDetector'; + +export type ComponentWrapperRef

= { + componentRef?: React.ComponentType

; + gestureRef?: NativeGesture; +}; + +export default function createNativeWrapper

( + Component: React.ComponentType

, + config: Readonly = {}, + detectorType: DetectorType = DetectorType.Native +) { + const ComponentWrapper = ( + props: P & NativeWrapperProperties & { ref?: React.RefObject } + ) => { + // Filter out props that should be passed to gesture handler wrapper + const { gestureHandlerProps, childProps } = Object.keys(props).reduce( + (res, key) => { + // @ts-ignore TS being overly protective with it's types, see https://github.com/microsoft/TypeScript/issues/26255#issuecomment-458013731 for more info + if (NativeWrapperProps.has(key)) { + // @ts-ignore FIXME(TS) + res.gestureHandlerProps[key] = props[key]; + } else { + // @ts-ignore FIXME(TS) + res.childProps[key] = props[key]; + } + return res; + }, + { + gestureHandlerProps: { ...config }, // Watch out not to modify config + childProps: { + enabled: props.enabled, + hitSlop: props.hitSlop, + } as P, + } + ); + + if (gestureHandlerProps.disableReanimated === undefined) { + gestureHandlerProps.disableReanimated = true; + } + + const native = useNativeGesture(gestureHandlerProps); + + const componentRef = useRef>(null); + const gestureRef = useRef(native); + + useImperativeHandle( + props.ref, + () => + ({ + componentRef: componentRef.current, + gestureRef: gestureRef.current, + }) as ComponentWrapperRef

+ ); + + const DetectorComponent = + detectorType === DetectorType.Intercepting + ? InterceptingGestureDetector + : detectorType === DetectorType.Virtual + ? VirtualDetector + : NativeDetector; + + return ( + + + + ); + }; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + ComponentWrapper.displayName = + Component?.displayName || + // @ts-ignore if render doesn't exist it will return undefined and go further + Component?.render?.name || + (typeof Component === 'string' && Component) || + 'ComponentWrapper'; + + return ComponentWrapper; +} diff --git a/packages/react-native-gesture-handler/src/v3/detectors/index.ts b/packages/react-native-gesture-handler/src/v3/detectors/index.ts index d2abb03b09..f7498fff1d 100644 --- a/packages/react-native-gesture-handler/src/v3/detectors/index.ts +++ b/packages/react-native-gesture-handler/src/v3/detectors/index.ts @@ -2,3 +2,9 @@ export type { GestureDetectorProps } from './common'; export { GestureDetector } from './GestureDetector'; export { VirtualDetector as VirtualGestureDetector } from './VirtualDetector/VirtualDetector'; export { InterceptingGestureDetector } from './VirtualDetector/InterceptingGestureDetector'; + +export enum DetectorType { + Native, + Virtual, + Intercepting, +} diff --git a/packages/react-native-gesture-handler/src/v3/hooks/gestures/native/useNativeGesture.ts b/packages/react-native-gesture-handler/src/v3/hooks/gestures/native/useNativeGesture.ts index 76e10065ae..311397594c 100644 --- a/packages/react-native-gesture-handler/src/v3/hooks/gestures/native/useNativeGesture.ts +++ b/packages/react-native-gesture-handler/src/v3/hooks/gestures/native/useNativeGesture.ts @@ -11,7 +11,7 @@ import { useGesture } from '../../useGesture'; import { useClonedAndRemappedConfig } from '../../utils'; import { NativeGestureNativeProperties } from './NativeProperties'; -type NativeViewHandlerData = { +export type NativeViewHandlerData = { pointerInside: boolean; }; diff --git a/packages/react-native-gesture-handler/src/v3/hooks/utils/propsWhiteList.ts b/packages/react-native-gesture-handler/src/v3/hooks/utils/propsWhiteList.ts index 0667914bc3..83ed7ed32c 100644 --- a/packages/react-native-gesture-handler/src/v3/hooks/utils/propsWhiteList.ts +++ b/packages/react-native-gesture-handler/src/v3/hooks/utils/propsWhiteList.ts @@ -1,11 +1,13 @@ import { BaseGestureConfig, CommonGestureConfig, + ExternalRelations, GestureCallbacks, HandlersPropsWhiteList, InternalConfigProps, SingleGestureName, } from '../../types'; +import { NativeWrapperProperties } from '../../types/NativeWrapperType'; import { FlingNativeProperties } from '../gestures/fling/FlingProperties'; import { HoverNativeProperties } from '../gestures/hover/HoverProperties'; import { LongPressNativeProperties } from '../gestures/longPress/LongPressProperties'; @@ -13,10 +15,7 @@ import { NativeHandlerNativeProperties } from '../gestures/native/NativeProperti import { PanNativeProperties } from '../gestures/pan/PanProperties'; import { TapNativeProperties } from '../gestures/tap/TapProperties'; -export const allowedNativeProps = new Set< - keyof CommonGestureConfig | keyof InternalConfigProps ->([ - // CommonGestureConfig +const CommonConfig = new Set([ 'enabled', 'shouldCancelWhenOutside', 'hitSlop', @@ -25,6 +24,18 @@ export const allowedNativeProps = new Set< 'mouseButton', 'enableContextMenu', 'touchAction', +]); + +const ExternalRelationsConfig = new Set([ + 'simultaneousWith', + 'requireToFail', + 'block', +]); + +export const allowedNativeProps = new Set< + keyof CommonGestureConfig | keyof InternalConfigProps +>([ + ...CommonConfig, // InternalConfigProps 'dispatchesReanimatedEvents', @@ -48,6 +59,7 @@ export const HandlerCallbacks = new Set< export const PropsToFilter = new Set>([ ...HandlerCallbacks, + ...ExternalRelationsConfig, // Config props 'changeEventCalculator', @@ -55,11 +67,6 @@ export const PropsToFilter = new Set>([ 'shouldUseReanimatedDetector', 'useAnimated', 'runOnJS', - - // Relations - 'simultaneousWithExternalGesture', - 'requireExternalGestureToFail', - 'blocksExternalGesture', ]); export const PropsWhiteLists = new Map< @@ -75,3 +82,11 @@ export const PropsWhiteLists = new Map< ]); export const EMPTY_WHITE_LIST = new Set(); + +export const NativeWrapperProps = new Set([ + ...CommonConfig, + ...HandlerCallbacks, + ...NativeHandlerNativeProperties, + ...ExternalRelationsConfig, + 'disableReanimated', +]); diff --git a/packages/react-native-gesture-handler/src/v3/types/NativeWrapperType.ts b/packages/react-native-gesture-handler/src/v3/types/NativeWrapperType.ts new file mode 100644 index 0000000000..e54792bcbe --- /dev/null +++ b/packages/react-native-gesture-handler/src/v3/types/NativeWrapperType.ts @@ -0,0 +1,8 @@ +import { CommonGestureConfig, ExternalRelations, GestureCallbacks } from '.'; +import { NativeGestureNativeProperties } from '../hooks/gestures/native/NativeProperties'; +import { NativeViewHandlerData } from '../hooks/gestures/native/useNativeGesture'; + +export type NativeWrapperProperties = CommonGestureConfig & + GestureCallbacks & + NativeGestureNativeProperties & + ExternalRelations; diff --git a/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts b/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts index 50fea24b70..27fbef1636 100644 --- a/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts +++ b/packages/react-native-gesture-handler/src/web/tools/GestureHandlerWebDelegate.ts @@ -61,7 +61,7 @@ export class GestureHandlerWebDelegate this.gestureHandler.attachEventManager(manager) ); - this.addContextMenuListeners(); + this.configure(); this.isInitialized = true; } @@ -83,6 +83,12 @@ export class GestureHandlerWebDelegate this.isInitialized = false; } + configure(): void { + this.setUserSelect(); + this.setTouchAction(); + this.setContextMenu(); + } + isPointerInBounds({ x, y }: { x: number; y: number }): boolean { if (!this.view) { return false; @@ -214,9 +220,7 @@ export class GestureHandlerWebDelegate return; } - this.setUserSelect(); - this.setTouchAction(); - this.setContextMenu(); + this.configure(); this.eventManagers.forEach((manager) => { manager.setEnabled(this.gestureHandler.enabled); diff --git a/yarn.lock b/yarn.lock index 48f05491a1..1b61d6e1bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,19 +17,19 @@ __metadata: languageName: node linkType: hard -"@ark/schema@npm:0.52.0": - version: 0.52.0 - resolution: "@ark/schema@npm:0.52.0" +"@ark/schema@npm:0.55.0": + version: 0.55.0 + resolution: "@ark/schema@npm:0.55.0" dependencies: - "@ark/util": "npm:0.52.0" - checksum: 10c0/bf992d8d773f859d568523dd6194e895189596fe414548d0b5c27940a0aac60aae9fcb13bcf72763811224ea19ad39fd0516da6a4567c4c791925821d23b0570 + "@ark/util": "npm:0.55.0" + checksum: 10c0/4f431f2c4e7b0a04521b739e817c2244a04d4b54a27b6d67b79b1161b7114e2e6c11093726c435d191a6661424c4f6c1108dce43fffd8a1f0eadc0b0a567644c languageName: node linkType: hard -"@ark/util@npm:0.52.0": - version: 0.52.0 - resolution: "@ark/util@npm:0.52.0" - checksum: 10c0/032a445ccabcfe15058b0fff193c75c25cbcd2cf51120483cb70d93b20e14dbbeea2ecf34e9ddc972207a5d76f399d6083f2f4cbc897114e43ddc04858f437b9 +"@ark/util@npm:0.55.0": + version: 0.55.0 + resolution: "@ark/util@npm:0.55.0" + checksum: 10c0/bde305461432be11860995101120ce73fc7a49d0180dc34807555903450b8d7ecf5fccde3ac6ce2ada3381b54f1a4c9016a4b70598d85746610bd122348ede51 languageName: node linkType: hard @@ -1781,9 +1781,9 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:54.0.13": - version: 54.0.13 - resolution: "@expo/cli@npm:54.0.13" +"@expo/cli@npm:54.0.16": + version: 54.0.16 + resolution: "@expo/cli@npm:54.0.16" dependencies: "@0no-co/graphql.web": "npm:^1.0.8" "@expo/code-signing-certificates": "npm:^0.0.5" @@ -1793,9 +1793,9 @@ __metadata: "@expo/env": "npm:~2.0.7" "@expo/image-utils": "npm:^0.8.7" "@expo/json-file": "npm:^10.0.7" - "@expo/mcp-tunnel": "npm:~0.0.7" + "@expo/mcp-tunnel": "npm:~0.1.0" "@expo/metro": "npm:~54.1.0" - "@expo/metro-config": "npm:~54.0.7" + "@expo/metro-config": "npm:~54.0.9" "@expo/osascript": "npm:^2.3.7" "@expo/package-manager": "npm:^1.9.8" "@expo/plist": "npm:^0.4.7" @@ -1818,7 +1818,7 @@ __metadata: connect: "npm:^3.7.0" debug: "npm:^4.3.4" env-editor: "npm:^0.4.1" - expo-server: "npm:^1.0.2" + expo-server: "npm:^1.0.4" freeport-async: "npm:^2.0.0" getenv: "npm:^2.0.0" glob: "npm:^10.4.2" @@ -1860,7 +1860,7 @@ __metadata: optional: true bin: expo-internal: build/bin/cli - checksum: 10c0/89c7ec46270870bfbe2a6c180881c32813dc179fcda2464beb3c9aa1730a944bf3fb6830d976a0dbdbe0981ef3e07e534026c8ad41a9291c3eab75f5c1316b5d + checksum: 10c0/7921ecf138409dd145e0f906b320b9b2ef569426918bd3b6eadf42af2bd856013ff7ebb050212d4ccb98fa7f13272ca435318929007ceae7386874f294dc5f9b languageName: node linkType: hard @@ -1965,9 +1965,9 @@ __metadata: languageName: node linkType: hard -"@expo/fingerprint@npm:0.15.2": - version: 0.15.2 - resolution: "@expo/fingerprint@npm:0.15.2" +"@expo/fingerprint@npm:0.15.3": + version: 0.15.3 + resolution: "@expo/fingerprint@npm:0.15.3" dependencies: "@expo/spawn-async": "npm:^1.7.2" arg: "npm:^5.0.2" @@ -1982,7 +1982,7 @@ __metadata: semver: "npm:^7.6.0" bin: fingerprint: bin/cli.js - checksum: 10c0/8e15f7b0e8f2f95f42147f5d9da919cac7caa5735068f8ba88105f6172de868a0aacb260320889bfcdf6a9c8de68d305e071a93eacbc2ca2b09e7065a7872399 + checksum: 10c0/bbb3a568987f976c44053f83f29ed86f0d18d4e5e9ac649525bae4657014e86b3f184e80c6dc3baa95b017d8e37c50eafae0f926fe14f2e371243a3edc741a45 languageName: node linkType: hard @@ -2014,9 +2014,9 @@ __metadata: languageName: node linkType: hard -"@expo/mcp-tunnel@npm:~0.0.7": - version: 0.0.8 - resolution: "@expo/mcp-tunnel@npm:0.0.8" +"@expo/mcp-tunnel@npm:~0.1.0": + version: 0.1.0 + resolution: "@expo/mcp-tunnel@npm:0.1.0" dependencies: ws: "npm:^8.18.3" zod: "npm:^3.25.76" @@ -2026,13 +2026,13 @@ __metadata: peerDependenciesMeta: "@modelcontextprotocol/sdk": optional: true - checksum: 10c0/47588cd3944c21be5a5364bf8f30f994bb1a667b25ebbc863273d1895a6e1cbf5a82996d9101b487700bc7a9a9730ee81c60f8132523ed38176c542aa9b85521 + checksum: 10c0/db1241d159875c7e8bcc72c121e6b3a287794809c1bbf7781b61bd15673b3a2dd36e9fa6886893ff20d1aea399440f3abafcdf10a955ad9f410750d757ee8158 languageName: node linkType: hard -"@expo/metro-config@npm:54.0.7, @expo/metro-config@npm:~54.0.7": - version: 54.0.7 - resolution: "@expo/metro-config@npm:54.0.7" +"@expo/metro-config@npm:54.0.9, @expo/metro-config@npm:~54.0.9": + version: 54.0.9 + resolution: "@expo/metro-config@npm:54.0.9" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.20.0" @@ -2060,7 +2060,7 @@ __metadata: peerDependenciesMeta: expo: optional: true - checksum: 10c0/1fad7a5c2023131e05c91dc1129ebec08562776320ac6eb3d666f850db74f14a66054c1d81392798d237be31f74c4399a6c925efc75cb60fcab85f3a14015016 + checksum: 10c0/6833c594082a347ba6df0ad6d107c6b8f21363a06b4f5e4ffbac91bbfc14cf1d62b2fbb335bb146dddcad8bd53d7a09920fe928cc7312f9e50bd9138b2d4aacc languageName: node linkType: hard @@ -2262,6 +2262,22 @@ __metadata: languageName: node linkType: hard +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": "npm:^4.0.1" + checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2885,25 +2901,25 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" + lru-cache: "npm:^11.2.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 languageName: node linkType: hard -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" +"@npmcli/fs@npm:^5.0.0": + version: 5.0.0 + resolution: "@npmcli/fs@npm:5.0.0" dependencies: semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b languageName: node linkType: hard @@ -4687,11 +4703,11 @@ __metadata: languageName: node linkType: hard -"@react-navigation/core@npm:^7.13.0": - version: 7.13.0 - resolution: "@react-navigation/core@npm:7.13.0" +"@react-navigation/core@npm:^7.13.2": + version: 7.13.2 + resolution: "@react-navigation/core@npm:7.13.2" dependencies: - "@react-navigation/routers": "npm:^7.5.1" + "@react-navigation/routers": "npm:^7.5.2" escape-string-regexp: "npm:^4.0.0" fast-deep-equal: "npm:^3.1.3" nanoid: "npm:^3.3.11" @@ -4701,35 +4717,35 @@ __metadata: use-sync-external-store: "npm:^1.5.0" peerDependencies: react: ">= 18.2.0" - checksum: 10c0/2346858349b7ab7c3db851ab8fd074ba3b09def8ddf2ba12cb67672943fb6a144f6764ac7ee2d96e5acf1dbeafd891b74e4101aa60a3d3ee31a4229e450bf630 + checksum: 10c0/aebe7c947994caf0e06cefd45591a777912e006e53043f139250eee5ac012ad14e3eca671d775c5b0566714c26de8ba9e29b0aa20033d1d6bf44d0b11587e9df languageName: node linkType: hard -"@react-navigation/elements@npm:^2.3.8, @react-navigation/elements@npm:^2.7.1": - version: 2.7.1 - resolution: "@react-navigation/elements@npm:2.7.1" +"@react-navigation/elements@npm:^2.3.8, @react-navigation/elements@npm:^2.8.3": + version: 2.8.3 + resolution: "@react-navigation/elements@npm:2.8.3" dependencies: color: "npm:^4.2.3" use-latest-callback: "npm:^0.2.4" use-sync-external-store: "npm:^1.5.0" peerDependencies: "@react-native-masked-view/masked-view": ">= 0.2.0" - "@react-navigation/native": ^7.1.19 + "@react-navigation/native": ^7.1.21 react: ">= 18.2.0" react-native: "*" react-native-safe-area-context: ">= 4.0.0" peerDependenciesMeta: "@react-native-masked-view/masked-view": optional: true - checksum: 10c0/32f45e1bd46a723df2a164727897d451a5b7a4f8ffbd8ba919b45e203a1d604e09c42d751b40688ca5795f9429e414992314cbe16ea69ec706fc9fd98a54cbb7 + checksum: 10c0/95571aff9d6929fb62402e64cb6b3e659e338a1b9bae2e3c00191a94a43be4df8d1a7c907bf37bd1b8496c9d8bf113488a735ee3f3cd490ff2a664a987f2defb languageName: node linkType: hard "@react-navigation/native@npm:^7.1.6": - version: 7.1.19 - resolution: "@react-navigation/native@npm:7.1.19" + version: 7.1.21 + resolution: "@react-navigation/native@npm:7.1.21" dependencies: - "@react-navigation/core": "npm:^7.13.0" + "@react-navigation/core": "npm:^7.13.2" escape-string-regexp: "npm:^4.0.0" fast-deep-equal: "npm:^3.1.3" nanoid: "npm:^3.3.11" @@ -4737,33 +4753,34 @@ __metadata: peerDependencies: react: ">= 18.2.0" react-native: "*" - checksum: 10c0/11ea33d86ac4ec6d03f2af22cc1f3b8ebecccee5c570f82fbe4ac083b7a893797ff50fd4f10b463c46ad3e896c194db29b457c744e48de9403cb12d081c3bedc + checksum: 10c0/7c1d6bdc4ca322673ee617dbbe7ba226fb871c1427a398ae25901bc5eb45a2d4f8e5180cf3ad6b6eb293db5748ee9c4c24b5a534fe6c82c0919acd0c9cbb7f07 languageName: node linkType: hard -"@react-navigation/routers@npm:^7.5.1": - version: 7.5.1 - resolution: "@react-navigation/routers@npm:7.5.1" +"@react-navigation/routers@npm:^7.5.2": + version: 7.5.2 + resolution: "@react-navigation/routers@npm:7.5.2" dependencies: nanoid: "npm:^3.3.11" - checksum: 10c0/2efdbaf265e25bd1ea6d283a5a16d772eb24846e4a4554c8164091707b9289f02063a8999f8337d24ae3a33c3d2adaebabcb96bedb588aca8efb54fcab46286a + checksum: 10c0/eb22a8ce464595fc78d2f748d4397dfce5acae5f9b6afa9e0361142e69399ad8346019d1f6af7ba7a4404d54f71fc99e120ae113f5c827a4a6435bf201e349b5 languageName: node linkType: hard "@react-navigation/stack@npm:^7.2.10": - version: 7.6.0 - resolution: "@react-navigation/stack@npm:7.6.0" + version: 7.6.7 + resolution: "@react-navigation/stack@npm:7.6.7" dependencies: - "@react-navigation/elements": "npm:^2.7.1" + "@react-navigation/elements": "npm:^2.8.3" color: "npm:^4.2.3" + use-latest-callback: "npm:^0.2.4" peerDependencies: - "@react-navigation/native": ^7.1.19 + "@react-navigation/native": ^7.1.21 react: ">= 18.2.0" react-native: "*" react-native-gesture-handler: ">= 2.0.0" react-native-safe-area-context: ">= 4.0.0" react-native-screens: ">= 4.0.0" - checksum: 10c0/bb89a72fd637368e8d2804820016a061efe586d80e5424d48931022d54ee76ee905abbbbfe1eb68d71ed211365404a3c2cc8ce9f0fe1741628ef6889d9fd1bc2 + checksum: 10c0/821bbd0a587ca15fab92891426874f5dda0de9b74c6b1dd488c83fcd589c166cbddc3ce3046690441dfa02f04f5e1dc51e2651ea30b099ab097a1ebebb23ae2d languageName: node linkType: hard @@ -4992,11 +5009,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 24.9.1 - resolution: "@types/node@npm:24.9.1" + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" dependencies: undici-types: "npm:~7.16.0" - checksum: 10c0/c52f8168080ef9a7c3dc23d8ac6061fab5371aad89231a0f6f4c075869bc3de7e89b075b1f3e3171d9e5143d0dda1807c3dab8e32eac6d68f02e7480e7e78576 + checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 languageName: node linkType: hard @@ -5036,11 +5053,11 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^19.0.12, @types/react@npm:^19.1.1": - version: 19.2.2 - resolution: "@types/react@npm:19.2.2" + version: 19.2.7 + resolution: "@types/react@npm:19.2.7" dependencies: - csstype: "npm:^3.0.2" - checksum: 10c0/f830b1204aca4634ce3c6cb3477b5d3d066b80a4dd832a4ee0069acb504b6debd2416548a43a11c1407c12bc60e2dc6cf362934a18fe75fe06a69c0a98cba8ab + csstype: "npm:^3.2.2" + checksum: 10c0/a7b75f1f9fcb34badd6f84098be5e35a0aeca614bc91f93d2698664c0b2ba5ad128422bd470ada598238cebe4f9e604a752aead7dc6f5a92261d0c7f9b27cfd1 languageName: node linkType: hard @@ -5075,20 +5092,20 @@ __metadata: linkType: hard "@types/yargs@npm:^15.0.0": - version: 15.0.19 - resolution: "@types/yargs@npm:15.0.19" + version: 15.0.20 + resolution: "@types/yargs@npm:15.0.20" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10c0/9fe9b8645304a628006cbba2d1990fb015e2727274d0e3853f321a379a1242d1da2c15d2f56cff0d4313ae94f0383ccf834c3bded9fb3589608aefb3432fcf00 + checksum: 10c0/7578e333b8e3e60e96950fc3d90f75afa5f6612cbaa309813848a5bf198fd39bd6bf8d25f8fde7106c614686e24fd409403cc22166f5571c9fc1148fe147c0f5 languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.34 - resolution: "@types/yargs@npm:17.0.34" + version: 17.0.35 + resolution: "@types/yargs@npm:17.0.35" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10c0/7d4c6a6bc2b8dd4c7deaf507633fe6fd91424873add76b63c8263479223ea7a061bea86e7e0f3ed28cbe897338a934f3c04d802e8f67b7d2d3874924c94468c5 + checksum: 10c0/609557826a6b85e73ccf587923f6429850d6dc70e420b455bab4601b670bfadf684b09ae288bccedab042c48ba65f1666133cf375814204b544009f57d6eef63 languageName: node linkType: hard @@ -5141,23 +5158,23 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.36.0": - version: 8.46.2 - resolution: "@typescript-eslint/eslint-plugin@npm:8.46.2" + version: 8.47.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.47.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.46.2" - "@typescript-eslint/type-utils": "npm:8.46.2" - "@typescript-eslint/utils": "npm:8.46.2" - "@typescript-eslint/visitor-keys": "npm:8.46.2" + "@typescript-eslint/scope-manager": "npm:8.47.0" + "@typescript-eslint/type-utils": "npm:8.47.0" + "@typescript-eslint/utils": "npm:8.47.0" + "@typescript-eslint/visitor-keys": "npm:8.47.0" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.46.2 + "@typescript-eslint/parser": ^8.47.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/24d1257bd023525754dc130e99bad1404c46f997729a060e3764b7f80dd43edcc43767b60fd89244cba82157918609e3922e408d0f7be4223e2056c1447fb387 + checksum: 10c0/abd35affd21bc199e5e274b8e91e4225a127edf9cbe5047c465f859d7e393d07556ea42b40004e769ed59b18cfe25ab30942c854e23026d4f78d350eb71de03e languageName: node linkType: hard @@ -5198,31 +5215,31 @@ __metadata: linkType: hard "@typescript-eslint/parser@npm:^8.36.0": - version: 8.46.2 - resolution: "@typescript-eslint/parser@npm:8.46.2" + version: 8.47.0 + resolution: "@typescript-eslint/parser@npm:8.47.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.46.2" - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/typescript-estree": "npm:8.46.2" - "@typescript-eslint/visitor-keys": "npm:8.46.2" + "@typescript-eslint/scope-manager": "npm:8.47.0" + "@typescript-eslint/types": "npm:8.47.0" + "@typescript-eslint/typescript-estree": "npm:8.47.0" + "@typescript-eslint/visitor-keys": "npm:8.47.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/9556bf8ec039c6d1751a37cf76cf70912e80dc45337731a304509309e67472c3f5b5abe6ac5021a7ae9361ea65b2e1f66b626603cecca6506a4533152a77b28f + checksum: 10c0/8f8c9514ffe8c2fca9e2d1d3e9f9f8dd4cb55c14f0ef2f4f265a9180615ec98dc455d373893f76f86760f37e449fd0f4afda46c1211291b9736a05ba010912f2 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/project-service@npm:8.46.2" +"@typescript-eslint/project-service@npm:8.47.0": + version: 8.47.0 + resolution: "@typescript-eslint/project-service@npm:8.47.0" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.46.2" - "@typescript-eslint/types": "npm:^8.46.2" + "@typescript-eslint/tsconfig-utils": "npm:^8.47.0" + "@typescript-eslint/types": "npm:^8.47.0" debug: "npm:^4.3.4" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/03e87bcbca6af3f95bf54d4047a8b4d12434126c27d7312e804499a9459e1c847fe045f83fe8e3b22c3dc3925baad0aa2a1a5476d0d51f73a493dc5909a53dbf + checksum: 10c0/6d7ec78c63d672178727b2d79856b470bd99e90d387335decec026931caa94c6907afc4690b884ce1eaca65f2d8b8f070a5c6e70e47971dfeec34dfd022933b8 languageName: node linkType: hard @@ -5256,22 +5273,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.46.2, @typescript-eslint/scope-manager@npm:^8.43.0": - version: 8.46.2 - resolution: "@typescript-eslint/scope-manager@npm:8.46.2" +"@typescript-eslint/scope-manager@npm:8.47.0, @typescript-eslint/scope-manager@npm:^8.43.0": + version: 8.47.0 + resolution: "@typescript-eslint/scope-manager@npm:8.47.0" dependencies: - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/visitor-keys": "npm:8.46.2" - checksum: 10c0/42f52ee621a3a0ef2233e7d3384d9dbd76218f5c906a9cce3152a1f55c060a3d3614c7b8fff5270bdf48e8fcc003e732d3f003f283ea6fb204d64a2f6bb3ea9c + "@typescript-eslint/types": "npm:8.47.0" + "@typescript-eslint/visitor-keys": "npm:8.47.0" + checksum: 10c0/2faa11e30724ca3a0648cdf83e0fc0fbdfcd89168fa0598d235a89604ee20c1f51ca2b70716f2bc0f1ea843de85976c0852de4549ba4649406d6b4acaf63f9c7 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.46.2, @typescript-eslint/tsconfig-utils@npm:^8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.2" +"@typescript-eslint/tsconfig-utils@npm:8.47.0, @typescript-eslint/tsconfig-utils@npm:^8.47.0": + version: 8.47.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.47.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/23e34ad296347417e42234945138022fb045d180fde69941483884a38e85fa55d5449420d2a660c0ebf1794a445add2f13e171c8dd64e4e83f594e2c4e35bf4d + checksum: 10c0/d62b1840344912f916e590dad0cc5aa8816ce281ea9cac7485a28c4427ecbb88c52fa64b3d8cc520c7cab401ede8631e1b3176306cd3d496f756046e5d0c345f languageName: node linkType: hard @@ -5309,19 +5326,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.46.2, @typescript-eslint/type-utils@npm:^8.0.0, @typescript-eslint/type-utils@npm:^8.43.0": - version: 8.46.2 - resolution: "@typescript-eslint/type-utils@npm:8.46.2" +"@typescript-eslint/type-utils@npm:8.47.0, @typescript-eslint/type-utils@npm:^8.0.0, @typescript-eslint/type-utils@npm:^8.43.0": + version: 8.47.0 + resolution: "@typescript-eslint/type-utils@npm:8.47.0" dependencies: - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/typescript-estree": "npm:8.46.2" - "@typescript-eslint/utils": "npm:8.46.2" + "@typescript-eslint/types": "npm:8.47.0" + "@typescript-eslint/typescript-estree": "npm:8.47.0" + "@typescript-eslint/utils": "npm:8.47.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/e12fc65e4b58c1ab6fe65f5486265b7afe9a9a6730e3529aca927ddfc22e5913eb28999fc83e68ea1b49097e1edbbae1f61dd724b0bb0e7586fb24ecda1d4938 + checksum: 10c0/68311ad455ed7e6c86e5a561b1a54383b35bc6fec37a642afca1d72ddd74a944f3f5bea5aa493e161c0422f8042da442596455e451ef9204b1fce13a84b256e6 languageName: node linkType: hard @@ -5353,10 +5370,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.46.2, @typescript-eslint/types@npm:^8.43.0, @typescript-eslint/types@npm:^8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/types@npm:8.46.2" - checksum: 10c0/611716bae2369a1b8001c7f6cc03c5ecadfb956643cbbe27269defd28a61d43fe52eda008d7a09568b0be50c502e8292bf767b246366004283476e9a971b6fbc +"@typescript-eslint/types@npm:8.47.0, @typescript-eslint/types@npm:^8.43.0, @typescript-eslint/types@npm:^8.47.0": + version: 8.47.0 + resolution: "@typescript-eslint/types@npm:8.47.0" + checksum: 10c0/0d7f139b29f2581e905463c904b9aef37d8bc62f7b647cd3950d8b139a9fa6821faa5370f4975ccbbd2b2046a50629bd78729be390fb2663e6d103ecda22d794 languageName: node linkType: hard @@ -5416,14 +5433,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.46.2, @typescript-eslint/typescript-estree@npm:^8.43.0": - version: 8.46.2 - resolution: "@typescript-eslint/typescript-estree@npm:8.46.2" +"@typescript-eslint/typescript-estree@npm:8.47.0, @typescript-eslint/typescript-estree@npm:^8.43.0": + version: 8.47.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.47.0" dependencies: - "@typescript-eslint/project-service": "npm:8.46.2" - "@typescript-eslint/tsconfig-utils": "npm:8.46.2" - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/visitor-keys": "npm:8.46.2" + "@typescript-eslint/project-service": "npm:8.47.0" + "@typescript-eslint/tsconfig-utils": "npm:8.47.0" + "@typescript-eslint/types": "npm:8.47.0" + "@typescript-eslint/visitor-keys": "npm:8.47.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -5432,7 +5449,7 @@ __metadata: ts-api-utils: "npm:^2.1.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/ad7dbf352982bc6e16473ef19fc7d209fffeb147a732db8a2464e0ec33e7fbbc24ce3f23d01bdf99d503626c582a476debf4c90c527d755eeb99b863476d9f5f + checksum: 10c0/b63e72f85382f9022a52c606738400d599a3d27318ec48bad21039758aa6d74050fb2462aa61bac1de8bd5951bc24f775d1dde74140433c60e2943e045c21649 languageName: node linkType: hard @@ -5485,18 +5502,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.46.2, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.43.0": - version: 8.46.2 - resolution: "@typescript-eslint/utils@npm:8.46.2" +"@typescript-eslint/utils@npm:8.47.0, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.43.0": + version: 8.47.0 + resolution: "@typescript-eslint/utils@npm:8.47.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.46.2" - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/typescript-estree": "npm:8.46.2" + "@typescript-eslint/scope-manager": "npm:8.47.0" + "@typescript-eslint/types": "npm:8.47.0" + "@typescript-eslint/typescript-estree": "npm:8.47.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/600b70730077ed85a6e278e06771f3933cdafce242f979e4af1c1b41290bf1efb14d20823c25c38a3a792def69b18eb9410af28bb228fe86027ad7859753c62d + checksum: 10c0/8774f4e5748bdcefad32b4d06aee589208f4e78500c6c39bd6819b9602fc4212ed69fd774ccd2ad847f87a6bc0092d4db51e440668e7512d366969ab038a74f5 languageName: node linkType: hard @@ -5558,13 +5575,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/visitor-keys@npm:8.46.2" +"@typescript-eslint/visitor-keys@npm:8.47.0": + version: 8.47.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.47.0" dependencies: - "@typescript-eslint/types": "npm:8.46.2" + "@typescript-eslint/types": "npm:8.47.0" eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/2067cd9a3c90b3817242cc49b5fa77428e1b92b28e16a12f45c2b399acbba7bd17e503553e5e68924e40078477a5c247dfa12e7709c24fe11c0b17a0c8486c33 + checksum: 10c0/14aedfdb5bf9b4c310b4a64cb62af94f35515af44911bae266205138165b3a8dc2cd57db3255ec27531dfa3552ba79a700ec8d745b0d18bca220a7f9f437ad06 languageName: node linkType: hard @@ -5611,10 +5628,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^3.0.0": - version: 3.0.1 - resolution: "abbrev@npm:3.0.1" - checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5 languageName: node linkType: hard @@ -5818,23 +5835,23 @@ __metadata: languageName: node linkType: hard -"arkregex@npm:0.0.1": - version: 0.0.1 - resolution: "arkregex@npm:0.0.1" +"arkregex@npm:0.0.3": + version: 0.0.3 + resolution: "arkregex@npm:0.0.3" dependencies: - "@ark/util": "npm:0.52.0" - checksum: 10c0/3fa47fbb5b5c9fddb87a630a356b3227e43f8501ab3c3bbb9a12ff7d7af6d717564f8a70aa6ab8ede46eb89aa8599ed9092a34ea327b910d8f9360b6bbe95c0c + "@ark/util": "npm:0.55.0" + checksum: 10c0/287cc2ef50cde2cf20afd7c46dc4f05a54314638cdf1a1716fbd4362a9e05441bf85b75e52d181515c492420c78916374721a9aaa2a84d2074cc25b2b04b11a7 languageName: node linkType: hard "arktype@npm:^2.1.15": - version: 2.1.24 - resolution: "arktype@npm:2.1.24" + version: 2.1.27 + resolution: "arktype@npm:2.1.27" dependencies: - "@ark/schema": "npm:0.52.0" - "@ark/util": "npm:0.52.0" - arkregex: "npm:0.0.1" - checksum: 10c0/3a102baf69f9fb0473e684923320ffc8d7ca5b27ada24695ef66f099192bec875b34c29010829379464f6f127119b89a7d5464fd5ac945cab641a2c4d8724dd7 + "@ark/schema": "npm:0.55.0" + "@ark/util": "npm:0.55.0" + arkregex: "npm:0.0.3" + checksum: 10c0/148b8c802de8a00b28975aca903a806eae390463d046f6108b937eb98682c68c00867837ad426426a9d9c1034b2b32b2800f671d898b44fa11e36a190eb39a0c languageName: node linkType: hard @@ -6231,9 +6248,9 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~54.0.6": - version: 54.0.6 - resolution: "babel-preset-expo@npm:54.0.6" +"babel-preset-expo@npm:~54.0.7": + version: 54.0.7 + resolution: "babel-preset-expo@npm:54.0.7" dependencies: "@babel/helper-module-imports": "npm:^7.25.9" "@babel/plugin-proposal-decorators": "npm:^7.12.9" @@ -6266,7 +6283,7 @@ __metadata: optional: true expo: optional: true - checksum: 10c0/839bad8b415f79c3739eeebef99afdf506ba9dc16b1ac6fcdaa40216c534ce474621acc1775e546bedcd6049cbf5f1a5414dde68730445457bdb2d97fdd41a18 + checksum: 10c0/a4c2de6b1c2a56199e663b99ddc42b75ece556d862e15d1240441a5d06f6f09c93f725e230baf3fab29afb11ee2026569f497e037d1596432cb66a5c1c6cefdc languageName: node linkType: hard @@ -6308,12 +6325,12 @@ __metadata: languageName: node linkType: hard -"baseline-browser-mapping@npm:^2.8.19": - version: 2.8.20 - resolution: "baseline-browser-mapping@npm:2.8.20" +"baseline-browser-mapping@npm:^2.8.25": + version: 2.8.31 + resolution: "baseline-browser-mapping@npm:2.8.31" bin: baseline-browser-mapping: dist/cli.js - checksum: 10c0/6e2a5141e4a95e24bdf8539a9cb92ed4f6fb3974713ef8d8d1a7de9ec571ad1d38d7f90cd061496ad7790bdbf50cc21d9398e19647c065af4065540becd0a277 + checksum: 10c0/e0b2fcb41bf36c5e27e122a4d4cc9e5f6b9747d31cd0bd1f771aee9c490eb1e01cd11a31db32286bd4b9221139ee332b5ab7e3893c18a4dbd0ce8915a9e180ed languageName: node linkType: hard @@ -6470,18 +6487,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.0, browserslist@npm:^4.26.3": - version: 4.27.0 - resolution: "browserslist@npm:4.27.0" +"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.0, browserslist@npm:^4.28.0": + version: 4.28.0 + resolution: "browserslist@npm:4.28.0" dependencies: - baseline-browser-mapping: "npm:^2.8.19" - caniuse-lite: "npm:^1.0.30001751" - electron-to-chromium: "npm:^1.5.238" - node-releases: "npm:^2.0.26" + baseline-browser-mapping: "npm:^2.8.25" + caniuse-lite: "npm:^1.0.30001754" + electron-to-chromium: "npm:^1.5.249" + node-releases: "npm:^2.0.27" update-browserslist-db: "npm:^1.1.4" bin: browserslist: cli.js - checksum: 10c0/395611e54374da9171cdbe7e3704ab426e0f1d622751392df6d6cbf60c539bf06cf2407e9dd769bc01ee2abca6a14af6509a2e0bbb448ba75a054db6c1840643 + checksum: 10c0/4284fd568f7d40a496963083860d488cb2a89fb055b6affd316bebc59441fec938e090b3e62c0ee065eb0bc88cd1bc145f4300a16c75f3f565621c5823715ae1 languageName: node linkType: hard @@ -6518,23 +6535,22 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" +"cacache@npm:^20.0.1": + version: 20.0.3 + resolution: "cacache@npm:20.0.3" dependencies: - "@npmcli/fs": "npm:^4.0.0" + "@npmcli/fs": "npm:^5.0.0" fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" + glob: "npm:^13.0.0" + lru-cache: "npm:^11.1.0" minipass: "npm:^7.0.3" minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" p-map: "npm:^7.0.2" - ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" - unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + ssri: "npm:^13.0.0" + unique-filename: "npm:^5.0.0" + checksum: 10c0/c7da1ca694d20e8f8aedabd21dc11518f809a7d2b59aa76a1fc655db5a9e62379e465c157ddd2afe34b19230808882288effa6911b2de26a088a6d5645123462 languageName: node linkType: hard @@ -6616,10 +6632,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001751": - version: 1.0.30001751 - resolution: "caniuse-lite@npm:1.0.30001751" - checksum: 10c0/c3f2d448f3569004ace160fd9379ea0def8e7a7bc6e65611baadb57d24e1f418258647a6210e46732419f5663e2356c22aa841f92449dd3849eb6471bb7ad592 +"caniuse-lite@npm:^1.0.30001754": + version: 1.0.30001757 + resolution: "caniuse-lite@npm:1.0.30001757" + checksum: 10c0/3ccb71fa2bf1f8c96ff1bf9b918b08806fed33307e20a3ce3259155fda131eaf96cfcd88d3d309c8fd7f8285cc71d89a3b93648a1c04814da31c301f98508d42 languageName: node linkType: hard @@ -7063,11 +7079,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.43.0": - version: 3.46.0 - resolution: "core-js-compat@npm:3.46.0" + version: 3.47.0 + resolution: "core-js-compat@npm:3.47.0" dependencies: - browserslist: "npm:^4.26.3" - checksum: 10c0/d50f8870e14434477acac1f9f52929b6298fd86313386c4105be0d43978708ad10ab3b80b9b54d77b93761dbc5430e3151de0c792dabd117b58c25b551b78e20 + browserslist: "npm:^4.28.0" + checksum: 10c0/71da415899633120db7638dd7b250eee56031f63c4560dcba8eeeafd1168fae171d59b223e3fd2e0aa543a490d64bac7d946764721e2c05897056fdfb22cce33 languageName: node linkType: hard @@ -7183,10 +7199,10 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 +"csstype@npm:^3.0.2, csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce languageName: node linkType: hard @@ -7224,9 +7240,9 @@ __metadata: linkType: hard "dayjs@npm:^1.8.15": - version: 1.11.18 - resolution: "dayjs@npm:1.11.18" - checksum: 10c0/83b67f5d977e2634edf4f5abdd91d9041a696943143638063016915d2cd8c7e57e0751e40379a07ebca8be7a48dd380bef8752d22a63670f2d15970e34f96d7a + version: 1.11.19 + resolution: "dayjs@npm:1.11.19" + checksum: 10c0/7d8a6074a343f821f81ea284d700bd34ea6c7abbe8d93bce7aba818948957c1b7f56131702e5e890a5622cdfc05dcebe8aed0b8313bdc6838a594d7846b0b000 languageName: node linkType: hard @@ -7730,10 +7746,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.238": - version: 1.5.241 - resolution: "electron-to-chromium@npm:1.5.241" - checksum: 10c0/71c655ea34913e2820faa79e0ef83393c5c1d64027d6d7f9314a05d37df6aa7f70c265d727b3aa5f22c2a5cab13af9a0687deb399561d223e11a96625167b410 +"electron-to-chromium@npm:^1.5.249": + version: 1.5.259 + resolution: "electron-to-chromium@npm:1.5.259" + checksum: 10c0/a6600ff20d513e1acce29cd04af5fcb338295ebe5a13fa9802009464d9c269a4a092218c8ea8c9b85017a1efd75606fe0cdf5f36216979f7c8462af7df2f530d languageName: node linkType: hard @@ -7829,11 +7845,11 @@ __metadata: linkType: hard "envinfo@npm:^7.13.0": - version: 7.19.0 - resolution: "envinfo@npm:7.19.0" + version: 7.20.0 + resolution: "envinfo@npm:7.20.0" bin: envinfo: dist/cli.js - checksum: 10c0/4b18fa2832e7b33f3550ae88b0dc5e09ab7edd08f9ba51dd618720e896cbefccda3963a0d144137985b94e701907ac173e358e5b138cb92806b89040e7029f95 + checksum: 10c0/2afa8085f9952d3afe6893098ef9cadc991aa38ed5ed5a0fd953ddb72a7543f425fbf46e8c02c4fa0ecad3c03a93381b0a212f799c2a8db8dc8886d8d7d5dc05 languageName: node linkType: hard @@ -8235,8 +8251,8 @@ __metadata: linkType: hard "eslint-plugin-jest@npm:^29.0.1": - version: 29.0.1 - resolution: "eslint-plugin-jest@npm:29.0.1" + version: 29.2.1 + resolution: "eslint-plugin-jest@npm:29.2.1" dependencies: "@typescript-eslint/utils": "npm:^8.0.0" peerDependencies: @@ -8248,7 +8264,7 @@ __metadata: optional: true jest: optional: true - checksum: 10c0/20edc166503a50c10b45f733797d530a5107c91efa25410ef405780d12222a796b5b41ed8f6d2b939632a1af273af6cc5732233463d1f36dbe7680bbb86c4eec + checksum: 10c0/9115e35a537d458b37236c0ebba2ce357226d24cc0a2345c29fd8b14a63681343fc71ef0d4f0bbb47575f5c6a76b21da6dee183db4d8e0ccf9d8f4bfbb8c743f languageName: node linkType: hard @@ -8761,17 +8777,17 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:~12.0.9": - version: 12.0.9 - resolution: "expo-asset@npm:12.0.9" +"expo-asset@npm:~12.0.10": + version: 12.0.10 + resolution: "expo-asset@npm:12.0.10" dependencies: "@expo/image-utils": "npm:^0.8.7" - expo-constants: "npm:~18.0.9" + expo-constants: "npm:~18.0.10" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10c0/7a66523e26e9868ad7961c9d6436f188e2832a7b3168a47be10ae8468616250803d31ded11b61bcc920e2aa0f0443c69fcb220be16b0b120aa255a840a355032 + checksum: 10c0/516b382ded9c4bc517f9e9b7b43770aa9aa56f223356c71c39cd3374408897e8088b9790ffebc3dbf3b9d114893616b207716c5c7b51974c83fbeda86a98a8f1 languageName: node linkType: hard @@ -8793,8 +8809,8 @@ __metadata: linkType: hard "expo-camera@npm:~17.0.2": - version: 17.0.8 - resolution: "expo-camera@npm:17.0.8" + version: 17.0.9 + resolution: "expo-camera@npm:17.0.9" dependencies: invariant: "npm:^2.2.4" peerDependencies: @@ -8805,11 +8821,11 @@ __metadata: peerDependenciesMeta: react-native-web: optional: true - checksum: 10c0/a8832e06a48df976fbc52c042d0148925b7d0215ad031a6eb7fdabd9e6691eafda11748941541e94d6371ff1783f0babc60780b2ce0cd6d448562f90ef0a62aa + checksum: 10c0/29938feb3f28b509d9018521f3177622b20f4852b6a4cdd489485c3c631a7ab6a417c2d3d994c5caef5afec6d405cd68dbd91be42b9f2480bb24c90878bdcf47 languageName: node linkType: hard -"expo-constants@npm:~18.0.10, expo-constants@npm:~18.0.9": +"expo-constants@npm:~18.0.10": version: 18.0.10 resolution: "expo-constants@npm:18.0.10" dependencies: @@ -8856,13 +8872,13 @@ __metadata: languageName: unknown linkType: soft -"expo-file-system@npm:~19.0.17": - version: 19.0.17 - resolution: "expo-file-system@npm:19.0.17" +"expo-file-system@npm:~19.0.19": + version: 19.0.19 + resolution: "expo-file-system@npm:19.0.19" peerDependencies: expo: "*" react-native: "*" - checksum: 10c0/c0c4017429f0f43790d5a5587e56deca77015e959a8667c4ee3890a42d47a4389775ebfeb4951d0f7942ef7d416eb487928f6447f64a86cad58326181917e3c8 + checksum: 10c0/c9d038666a3f1addcc14968b2516c854370ed75b0dc31b9d31f49d57ba93f411d67c3d791bbffc586a9e4e274fec8bcb4fab0db3bfcde01c1142e7d20b6ce5df languageName: node linkType: hard @@ -8889,38 +8905,37 @@ __metadata: languageName: node linkType: hard -"expo-modules-autolinking@npm:3.0.19": - version: 3.0.19 - resolution: "expo-modules-autolinking@npm:3.0.19" +"expo-modules-autolinking@npm:3.0.22": + version: 3.0.22 + resolution: "expo-modules-autolinking@npm:3.0.22" dependencies: "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.1.0" commander: "npm:^7.2.0" - glob: "npm:^10.4.2" require-from-string: "npm:^2.0.2" resolve-from: "npm:^5.0.0" bin: expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10c0/38cdb02c24bffd9cc44700575b87a1490c351bf39a0c7f262d6382a8552c797ca6f8817e0121a0cd044243cbece76a938445c9b1ec73b77c30d6e33040f67fd5 + checksum: 10c0/fac8e8b18aa8c4e778631c5d08adc32166a38853e9e96bfa1767ae9b9b52606aa72c1b69092dfeee00c3ca02f5722a9d546e32cf65211e92bb9a55c3a3ebfb65 languageName: node linkType: hard -"expo-modules-core@npm:3.0.22": - version: 3.0.22 - resolution: "expo-modules-core@npm:3.0.22" +"expo-modules-core@npm:3.0.26": + version: 3.0.26 + resolution: "expo-modules-core@npm:3.0.26" dependencies: invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10c0/c3054c41cda15637545283581919c14e6a7d741199af14c65df3be6f26aed5d0a17e7bc47a0e855fde550bcd20a1ef98d0212428b6ff644e057e7305b6cdc833 + checksum: 10c0/74d630f9444b3baafd20d9dd46861d11d5df599a4f2bae74786d974c0e0e58e39358f86450476d617bd3a71f6be1dbf34f197567f5867c0d97ffd64a03ef79f1 languageName: node linkType: hard -"expo-server@npm:^1.0.2": - version: 1.0.2 - resolution: "expo-server@npm:1.0.2" - checksum: 10c0/4caba89c27a1c3b5e7e02449065d2ab20db697c7acb6eb8adc8687a5f0574d576ea5b279829a2e44351bec9144280da670284aa6183ffe1c93e7b1255c2aa468 +"expo-server@npm:^1.0.4": + version: 1.0.4 + resolution: "expo-server@npm:1.0.4" + checksum: 10c0/56330a10e222475126ce4a61676b170cf34951deae4a8b0965dcf8e317b03e99f71d92f908e57bb6196d2bdb0b36d5efb17fb48fd7c3b1d65f690bf2578f7975 languageName: node linkType: hard @@ -8937,27 +8952,27 @@ __metadata: linkType: hard "expo@npm:^54.0.7": - version: 54.0.20 - resolution: "expo@npm:54.0.20" + version: 54.0.25 + resolution: "expo@npm:54.0.25" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:54.0.13" + "@expo/cli": "npm:54.0.16" "@expo/config": "npm:~12.0.10" "@expo/config-plugins": "npm:~54.0.2" "@expo/devtools": "npm:0.1.7" - "@expo/fingerprint": "npm:0.15.2" + "@expo/fingerprint": "npm:0.15.3" "@expo/metro": "npm:~54.1.0" - "@expo/metro-config": "npm:54.0.7" + "@expo/metro-config": "npm:54.0.9" "@expo/vector-icons": "npm:^15.0.3" "@ungap/structured-clone": "npm:^1.3.0" - babel-preset-expo: "npm:~54.0.6" - expo-asset: "npm:~12.0.9" + babel-preset-expo: "npm:~54.0.7" + expo-asset: "npm:~12.0.10" expo-constants: "npm:~18.0.10" - expo-file-system: "npm:~19.0.17" + expo-file-system: "npm:~19.0.19" expo-font: "npm:~14.0.9" expo-keep-awake: "npm:~15.0.7" - expo-modules-autolinking: "npm:3.0.19" - expo-modules-core: "npm:3.0.22" + expo-modules-autolinking: "npm:3.0.22" + expo-modules-core: "npm:3.0.26" pretty-format: "npm:^29.7.0" react-refresh: "npm:^0.14.2" whatwg-url-without-unicode: "npm:8.0.0-3" @@ -8978,7 +8993,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10c0/13c94abc146a0d7326b9d2714297c0c2a6c3a1db8f9dc85131c265c4c6606b2a1ddb7b862f4a18c8960b29f0a5fbd7d23284f5a4a5d7c18a363919ebbc45bd4f + checksum: 10c0/5030aa9049c70865bfe4956c62df79049195b2af1ff25eb6879b99763c9b2adef93ec36ab3faf2c0e73132b7780502efd0647bd9816969621f24fc86e5e6f922 languageName: node linkType: hard @@ -9247,9 +9262,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.289.0 - resolution: "flow-parser@npm:0.289.0" - checksum: 10c0/2bfff0b48a02c73fc49ca72efc010e625ef07bc98947c5f0cdeb5a9d04669d0f69381757ad6cae0de27e328cb3f5163519afcc4f079a52750b7deefa9e334a86 + version: 0.291.0 + resolution: "flow-parser@npm:0.291.0" + checksum: 10c0/7db904503187ce26e13bb4e86ce76ce913e54f48fca94f8fc305f9521c9fd75c29d5b70b5701640bb233c4ca0f4febe603ce5e564ffa971f0ddfad5d08f030ba languageName: node linkType: hard @@ -9525,9 +9540,9 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.2": - version: 10.4.5 - resolution: "glob@npm:10.4.5" +"glob@npm:^10.3.10, glob@npm:^10.4.2": + version: 10.5.0 + resolution: "glob@npm:10.5.0" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" @@ -9537,7 +9552,18 @@ __metadata: path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 + languageName: node + linkType: hard + +"glob@npm:^13.0.0": + version: 13.0.0 + resolution: "glob@npm:13.0.0" + dependencies: + minimatch: "npm:^10.1.1" + minipass: "npm:^7.1.2" + path-scurry: "npm:^2.0.0" + checksum: 10c0/8e2f5821f3f7c312dd102e23a15b80c79e0837a9872784293ba2e15ec73b3f3749a49a42a31bfcb4e52c84820a474e92331c2eebf18819d20308f5c33876630a languageName: node linkType: hard @@ -10032,9 +10058,9 @@ __metadata: linkType: hard "ip-address@npm:^10.0.1": - version: 10.0.1 - resolution: "ip-address@npm:10.0.1" - checksum: 10c0/1634d79dae18394004775cb6d699dc46b7c23df6d2083164025a2b15240c1164fccde53d0e08bd5ee4fc53913d033ab6b5e395a809ad4b956a940c446e948843 + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 languageName: node linkType: hard @@ -11545,25 +11571,25 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" dependencies: argparse: "npm:^1.0.7" esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + checksum: 10c0/3261f25912f5dd76605e5993d0a126c2b6c346311885d3c483706cd722efe34f697ea0331f654ce27c00a42b426e524518ec89d65ed02ea47df8ad26dcc8ce69 languageName: node linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 languageName: node linkType: hard @@ -12081,6 +12107,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.2 + resolution: "lru-cache@npm:11.2.2" + checksum: 10c0/72d7831bbebc85e2bdefe01047ee5584db69d641c48d7a509e86f66f6ee111b30af7ec3bd68a967d47b69a4b1fa8bbf3872630bd06a63b6735e6f0a5f1c8e83d + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -12184,22 +12217,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" + "@npmcli/agent": "npm:^4.0.0" + cacache: "npm:^20.0.1" http-cache-semantics: "npm:^4.1.1" minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" + minipass-fetch: "npm:^5.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" + proc-log: "npm:^6.0.0" promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + ssri: "npm:^13.0.0" + checksum: 10c0/525f74915660be60b616bcbd267c4a5b59481b073ba125e45c9c3a041bb1a47a2bd0ae79d028eb6f5f95bf9851a4158423f5068539c3093621abb64027e8e461 languageName: node linkType: hard @@ -13257,6 +13290,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.1.1": + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -13309,9 +13351,9 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" +"minipass-fetch@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass-fetch@npm:5.0.0" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" @@ -13320,7 +13362,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c + checksum: 10c0/9443aab5feab190972f84b64116e54e58dd87a58e62399cae0a4a7461b80568281039b7c3a38ba96453431ebc799d1e26999e548540156216729a4967cd5ef06 languageName: node linkType: hard @@ -13536,22 +13578,22 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.5.0 - resolution: "node-gyp@npm:11.5.0" + version: 12.1.0 + resolution: "node-gyp@npm:12.1.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" + make-fetch-happen: "npm:^15.0.0" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" semver: "npm:^7.3.5" - tar: "npm:^7.4.3" + tar: "npm:^7.5.2" tinyglobby: "npm:^0.2.12" - which: "npm:^5.0.0" + which: "npm:^6.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/31ff49586991b38287bb15c3d529dd689cfc32f992eed9e6997b9d712d5d21fe818a8b1bbfe3b76a7e33765c20210c5713212f4aa329306a615b87d8a786da3a + checksum: 10c0/f43efea8aaf0beb6b2f6184e533edad779b2ae38062953e21951f46221dd104006cc574154f2ad4a135467a5aae92c49e84ef289311a82e08481c5df0e8dc495 languageName: node linkType: hard @@ -13562,10 +13604,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.26": - version: 2.0.26 - resolution: "node-releases@npm:2.0.26" - checksum: 10c0/033539b947ad329e0c996e563a97cdf295163ecbfd500edc3e5bc19d1a854d9515fcaae3967ac07243aff5378f572f18b36c5f50c3aa1fc3aac43fc9c4924e4d +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10c0/f1e6583b7833ea81880627748d28a3a7ff5703d5409328c216ae57befbced10ce2c991bea86434e8ec39003bd017f70481e2e5f8c1f7e0a7663241f81d6e00e2 languageName: node linkType: hard @@ -13594,14 +13636,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" dependencies: - abbrev: "npm:^3.0.0" + abbrev: "npm:^4.0.0" bin: nopt: bin/nopt.js - checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd languageName: node linkType: hard @@ -13949,9 +13991,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd languageName: node linkType: hard @@ -14068,6 +14110,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -14377,10 +14429,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 +"proc-log@npm:^6.0.0": + version: 6.0.0 + resolution: "proc-log@npm:6.0.0" + checksum: 10c0/40c5e2b4c55e395a3bd72e38cba9c26e58598a1f4844fa6a115716d5231a0919f46aa8e351147035d91583ad39a794593615078c948bc001fe3beb99276be776 languageName: node linkType: hard @@ -14609,8 +14661,8 @@ __metadata: linkType: hard "react-native-builder-bob@npm:^0.40.13": - version: 0.40.14 - resolution: "react-native-builder-bob@npm:0.40.14" + version: 0.40.15 + resolution: "react-native-builder-bob@npm:0.40.15" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-transform-flow-strip-types": "npm:^7.26.5" @@ -14636,7 +14688,7 @@ __metadata: yargs: "npm:^17.5.1" bin: bob: bin/bob - checksum: 10c0/b74dcdf8972e3c3904a1a5d89b16fbe20cf6ec506a45a101d1c2b709b6c9f080a7f4dd319b69d95e88d277a8c6ee0f20bf0dc557dc982afbc533b4a5b00ab427 + checksum: 10c0/93b6d1c6555a1c26cf6f1e1e2500d9b8c91b04074c181d4abeb0491094f40ecf9d404fa125f4748ec7b6ab2a79a11452e3d500149004da3b3dffda329852edcf languageName: node linkType: hard @@ -14800,8 +14852,8 @@ __metadata: linkType: hard "react-native-reanimated@npm:^3.18.0": - version: 3.19.3 - resolution: "react-native-reanimated@npm:3.19.3" + version: 3.19.4 + resolution: "react-native-reanimated@npm:3.19.4" dependencies: "@babel/plugin-transform-arrow-functions": "npm:^7.0.0-0" "@babel/plugin-transform-class-properties": "npm:^7.0.0-0" @@ -14819,13 +14871,13 @@ __metadata: "@babel/core": ^7.0.0-0 react: "*" react-native: "*" - checksum: 10c0/adf06db4961bbb9dd3acf432f6359c74ee497a71cea6350ed0380c9f231d89e19e6458ac41b298b85e31cc1caffd537f18908f9050dd3d8ae4c5dc95322fc884 + checksum: 10c0/265946c8056812685874cfd502e340ffc289128b90b897f274068608b624a757045686c987403f4557c9bf92753864b205e895dbc8111c7fc995b0943c7c5879 languageName: node linkType: hard "react-native-reanimated@npm:^4.1.3": - version: 4.1.3 - resolution: "react-native-reanimated@npm:4.1.3" + version: 4.1.5 + resolution: "react-native-reanimated@npm:4.1.5" dependencies: react-native-is-edge-to-edge: "npm:^1.2.1" semver: "npm:7.7.2" @@ -14834,7 +14886,7 @@ __metadata: react: "*" react-native: "*" react-native-worklets: ">=0.5.0" - checksum: 10c0/936bc75bacc32c41f66765ba5e46d34ba20737bd0921f472ad27ad9e9cd76abfa3cbfe1e1db5f10b592f3e4b9b3b94970fc513ab1bfcc3fa5a9ef70c54b4a32e + checksum: 10c0/af4aeb17b23089819c8d1dbf7f06ac4e7116cf86c1350a44ee6b6b1d262ce4d93ee28b1e3ffc7ec12f2fd261a8d6436ecf4b771e47127ebdb2e5b509f177a2b5 languageName: node linkType: hard @@ -14849,12 +14901,12 @@ __metadata: linkType: hard "react-native-safe-area-context@npm:^5.4.0, react-native-safe-area-context@npm:~5.6.0": - version: 5.6.1 - resolution: "react-native-safe-area-context@npm:5.6.1" + version: 5.6.2 + resolution: "react-native-safe-area-context@npm:5.6.2" peerDependencies: react: "*" react-native: "*" - checksum: 10c0/797ad7d749bd42cbec8e504d969de13e17ed48506c2fd5a639d05d78d88194c21d72b9dc4608e08a2e8edac23341802e7b4661875242dc3bdce3008cfda5bcbe + checksum: 10c0/3c8df21a1dbac83116b9c9bd5d20b7c1bb7649ecef44a111af6fb6b237241f5f4d692189eec30a69f5701b857249257da3621b9e17165460a2bb71faac7b92ae languageName: node linkType: hard @@ -15692,9 +15744,9 @@ __metadata: linkType: hard "sax@npm:>=0.6.0": - version: 1.4.1 - resolution: "sax@npm:1.4.1" - checksum: 10c0/6bf86318a254c5d898ede6bd3ded15daf68ae08a5495a2739564eb265cd13bcc64a07ab466fb204f67ce472bb534eb8612dac587435515169593f4fffa11de7c + version: 1.4.3 + resolution: "sax@npm:1.4.3" + checksum: 10c0/45bba07561d93f184a8686e1a543418ced8c844b994fbe45cc49d5cd2fc8ac7ec949dae38565e35e388ad0cca2b75997a29b6857c927bf6553da3f80ed0e4e62 languageName: node linkType: hard @@ -16138,12 +16190,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" +"ssri@npm:^13.0.0": + version: 13.0.0 + resolution: "ssri@npm:13.0.0" dependencies: minipass: "npm:^7.0.3" - checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + checksum: 10c0/405f3a531cd98b013cecb355d63555dca42fd12c7bc6671738aaa9a82882ff41cdf0ef9a2b734ca4f9a760338f114c29d01d9238a65db3ccac27929bd6e6d4b2 languageName: node linkType: hard @@ -16564,16 +16616,16 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.4.3": - version: 7.5.1 - resolution: "tar@npm:7.5.1" +"tar@npm:^7.4.3, tar@npm:^7.5.2": + version: 7.5.2 + resolution: "tar@npm:7.5.2" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/0dad0596a61586180981133b20c32cfd93c5863c5b7140d646714e6ea8ec84583b879e5dc3928a4d683be6e6109ad7ea3de1cf71986d5194f81b3a016c8858c9 + checksum: 10c0/a7d8b801139b52f93a7e34830db0de54c5aa45487c7cb551f6f3d44a112c67f1cb8ffdae856b05fd4f17b1749911f1c26f1e3a23bbe0279e17fd96077f13f467 languageName: node linkType: hard @@ -16595,8 +16647,8 @@ __metadata: linkType: hard "terser@npm:^5.15.0": - version: 5.44.0 - resolution: "terser@npm:5.44.0" + version: 5.44.1 + resolution: "terser@npm:5.44.1" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.15.0" @@ -16604,7 +16656,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/f2838dc65ac2ac6a31c7233065364080de73cc363ecb8fe723a54f663b2fa9429abf08bc3920a6bea85c5c7c29908ffcf822baf1572574f8d3859a009bbf2327 + checksum: 10c0/ee7a76692cb39b1ed22c30ff366c33ff3c977d9bb769575338ff5664676168fcba59192fb5168ef80c7cd901ef5411a1b0351261f5eaa50decf0fc71f63bde75 languageName: node linkType: hard @@ -17059,21 +17111,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" +"unique-filename@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-filename@npm:5.0.0" dependencies: - unique-slug: "npm:^5.0.0" - checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + unique-slug: "npm:^6.0.0" + checksum: 10c0/afb897e9cf4c2fb622ea716f7c2bb462001928fc5f437972213afdf1cc32101a230c0f1e9d96fc91ee5185eca0f2feb34127145874975f347be52eb91d6ccc2c languageName: node linkType: hard -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" +"unique-slug@npm:^6.0.0": + version: 6.0.0 + resolution: "unique-slug@npm:6.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + checksum: 10c0/da7ade4cb04eb33ad0499861f82fe95ce9c7c878b7139dc54d140ecfb6a6541c18a5c8dac16188b8b379fe62c0c1f1b710814baac910cde5f4fec06212126c6a languageName: node linkType: hard @@ -17356,14 +17408,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" +"which@npm:^6.0.0": + version: 6.0.0 + resolution: "which@npm:6.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + checksum: 10c0/fe9d6463fe44a76232bb6e3b3181922c87510a5b250a98f1e43a69c99c079b3f42ddeca7e03d3e5f2241bf2d334f5a7657cfa868b97c109f3870625842f4cc15 languageName: node linkType: hard @@ -17624,11 +17676,11 @@ __metadata: linkType: hard "zod-to-json-schema@npm:^3.24.6": - version: 3.24.6 - resolution: "zod-to-json-schema@npm:3.24.6" + version: 3.25.0 + resolution: "zod-to-json-schema@npm:3.25.0" peerDependencies: - zod: ^3.24.1 - checksum: 10c0/b907ab6d057100bd25a37e5545bf5f0efa5902cd84d3c3ec05c2e51541431a47bd9bf1e5e151a244273409b45f5986d55b26e5d207f98abc5200702f733eb368 + zod: ^3.25 || ^4 + checksum: 10c0/2d2cf6ca49752bf3dc5fb37bc8f275eddbbc4020e7958d9c198ea88cd197a5f527459118188a0081b889da6a6474d64c4134cd60951fa70178c125138761c680 languageName: node linkType: hard @@ -17640,8 +17692,8 @@ __metadata: linkType: hard "zod@npm:^4.1.5": - version: 4.1.12 - resolution: "zod@npm:4.1.12" - checksum: 10c0/b64c1feb19e99d77075261eaf613e0b2be4dfcd3551eff65ad8b4f2a079b61e379854d066f7d447491fcf193f45babd8095551a9d47973d30b46b6d8e2c46774 + version: 4.1.13 + resolution: "zod@npm:4.1.13" + checksum: 10c0/d7e74e82dba81a91ffc3239cd85bc034abe193a28f7087a94ab258a3e48e9a7ca4141920cac979a0d781495b48fc547777394149f26be04c3dc642f58bbc3941 languageName: node linkType: hard