diff --git a/.cspell-wordlist.txt b/.cspell-wordlist.txt index 2e5092801..f9ee818fb 100644 --- a/.cspell-wordlist.txt +++ b/.cspell-wordlist.txt @@ -95,6 +95,7 @@ Português codegen cstdint ocurred +RNFS libfbjni libc gradlew @@ -104,3 +105,4 @@ POTTEDPLANT TVMONITOR sublist TTFT +worklet \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7989ebb5d..dd9585bc2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: run: yarn lint - name: Typecheck files - run: yarn typecheck + run: yarn workspaces foreach --all --topological-dev run prepare && yarn typecheck build-library: runs-on: ubuntu-latest @@ -35,7 +35,5 @@ jobs: - name: Setup uses: ./.github/actions/setup - - name: Build package - run: | - cd packages/react-native-executorch - yarn prepare + - name: Build all packages + run: yarn workspaces foreach --all --topological-dev run prepare diff --git a/.nvmrc b/.nvmrc index 9a2a0e219..53d1c14db 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20 +v22 diff --git a/apps/computer-vision/app.json b/apps/computer-vision/app.json index 4d68c039b..65b8d1081 100644 --- a/apps/computer-vision/app.json +++ b/apps/computer-vision/app.json @@ -18,7 +18,8 @@ "bundleIdentifier": "com.anonymous.computervision", "infoPlist": { "NSCameraUsageDescription": "Process photo from camera" - } + }, + "appleTeamId": "B357MU264T" }, "android": { "adaptiveIcon": { @@ -30,6 +31,17 @@ "web": { "favicon": "./assets/icons/favicon.png" }, - "plugins": ["expo-font", "expo-router"] + "plugins": [ + "expo-font", + "expo-router", + [ + "expo-build-properties", + { + "android": { + "minSdkVersion": 26 + } + } + ] + ] } } diff --git a/apps/computer-vision/app/_layout.tsx b/apps/computer-vision/app/_layout.tsx index 5914d2fe8..35fba7fb1 100644 --- a/apps/computer-vision/app/_layout.tsx +++ b/apps/computer-vision/app/_layout.tsx @@ -1,4 +1,7 @@ import { Drawer } from 'expo-router/drawer'; +import { initExecutorch } from 'react-native-executorch'; +import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher'; + import ColorPalette from '../colors'; import React, { useState } from 'react'; import { Text, StyleSheet, View } from 'react-native'; @@ -10,6 +13,10 @@ import { } from '@react-navigation/drawer'; import { GeneratingContext } from '../context'; +initExecutorch({ + resourceFetcher: ExpoResourceFetcher, +}); + interface CustomDrawerProps extends DrawerContentComponentProps { isGenerating: boolean; } diff --git a/apps/computer-vision/app/camera_object_detection/index.tsx b/apps/computer-vision/app/camera_object_detection/index.tsx new file mode 100644 index 000000000..74947bc80 --- /dev/null +++ b/apps/computer-vision/app/camera_object_detection/index.tsx @@ -0,0 +1,265 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { + View, + StyleSheet, + Text, + ActivityIndicator, + TouchableOpacity, +} from 'react-native'; +import { + Camera, + useCameraDevices, + getCameraFormat, + Templates, + useFrameProcessor, + useCameraPermission, + type Frame, +} from 'react-native-vision-camera'; +import { useResizePlugin } from 'vision-camera-resize-plugin'; +import { + ObjectDetectionModule, + SSDLITE_320_MOBILENET_V3_LARGE, +} from 'react-native-executorch'; +import ScreenWrapper from '../../ScreenWrapper'; +import ColorPalette from '../../colors'; + +export default function CameraObjectDetectionScreen() { + // Model state + const detectionModel = useMemo(() => new ObjectDetectionModule(), []); + const [isModelReady, setIsModelReady] = useState(false); + + // Screen dimensions + + // Camera setup - V5 API + const devices = useCameraDevices(); + const device = devices.find((d) => d.position === 'back') ?? devices[0]; + + const format = useMemo(() => { + if (device == null) return undefined; + return getCameraFormat(device, Templates.Video); + }, [device]); + + const { hasPermission, requestPermission } = useCameraPermission(); + + // Resize plugin for efficient frame scaling + const { resize } = useResizePlugin(); + + // Load model + useEffect(() => { + (async () => { + try { + await detectionModel.load(SSDLITE_320_MOBILENET_V3_LARGE); + setIsModelReady(true); + } catch (error) { + console.error('Failed to load model:', error); + } + })(); + + return () => { + detectionModel.delete(); + }; + }, [detectionModel]); + + // Frame processing with Vision Camera v4 + const frameProcessor = useFrameProcessor( + (frame: Frame) => { + 'worklet'; + + if (!isModelReady) { + return; + } + + try { + // Use VisionCamera's resize plugin for better performance + const resized = resize(frame, { + scale: { + width: 640, + height: 640, + }, + pixelFormat: 'rgb', + dataType: 'uint8', + }); + + // Prepare frame data for model + const frameData = { + data: resized.buffer, + width: 640, + height: 640, + }; + + // Run inference - generateFromFrame is JSI-bound for worklet compatibility + const result = detectionModel.generateFromFrame(frameData, 0.5); + console.log(result); + } catch (error: any) { + console.log( + 'Frame processing error:', + error?.message || 'Unknown error' + ); + } + }, + [isModelReady, detectionModel, resize] + ); + + // Loading state + if (!isModelReady) { + return ( + + + + Loading model... + + + ); + } + + // Permission request + if (!hasPermission) { + return ( + + + + Camera permission is required + + + Grant Permission + + + + ); + } + + // No camera device + if (device == null) { + return ( + + + No camera device found + + + ); + } + + return ( + + + {/* Camera View */} + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + statsContainer: { + position: 'absolute', + top: 20, + right: 20, + flexDirection: 'row', + gap: 12, + }, + statBox: { + backgroundColor: 'rgba(0, 0, 0, 0.7)', + paddingHorizontal: 16, + paddingVertical: 8, + borderRadius: 12, + alignItems: 'center', + minWidth: 70, + }, + statLabel: { + color: '#888', + fontSize: 11, + fontWeight: '600', + textTransform: 'uppercase', + }, + statValue: { + color: '#fff', + fontSize: 24, + fontWeight: 'bold', + marginTop: 2, + }, + detectionList: { + position: 'absolute', + bottom: 20, + left: 20, + right: 20, + gap: 8, + }, + detectionItem: { + backgroundColor: 'rgba(0, 0, 0, 0.8)', + paddingHorizontal: 16, + paddingVertical: 12, + borderRadius: 12, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + borderLeftWidth: 4, + }, + detectionLabel: { + color: 'white', + fontSize: 16, + fontWeight: '600', + textTransform: 'capitalize', + }, + detectionScore: { + color: '#4ECDC4', + fontSize: 16, + fontWeight: 'bold', + }, + loadingContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + loadingText: { + marginTop: 16, + fontSize: 16, + color: ColorPalette.strongPrimary, + }, + errorContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + padding: 20, + }, + errorText: { + fontSize: 16, + color: '#d32f2f', + textAlign: 'center', + }, + permissionContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + padding: 20, + }, + permissionText: { + fontSize: 18, + color: ColorPalette.strongPrimary, + marginBottom: 20, + textAlign: 'center', + }, + permissionButton: { + backgroundColor: ColorPalette.strongPrimary, + paddingHorizontal: 24, + paddingVertical: 12, + borderRadius: 8, + }, + permissionButtonText: { + color: 'white', + fontSize: 16, + fontWeight: 'bold', + }, +}); diff --git a/apps/computer-vision/app/index.tsx b/apps/computer-vision/app/index.tsx index 38a77fc27..e35f0ef48 100644 --- a/apps/computer-vision/app/index.tsx +++ b/apps/computer-vision/app/index.tsx @@ -53,6 +53,12 @@ export default function Home() { > Image Generation + router.navigate('camera_object_detection/')} + > + 🎥 Camera Object Detection + ); @@ -92,6 +98,12 @@ const styles = StyleSheet.create({ alignItems: 'center', marginBottom: 10, }, + cameraButton: { + backgroundColor: '#2563eb', + }, + testButton: { + backgroundColor: '#10b981', + }, buttonText: { color: 'white', fontSize: fontSizes.md, diff --git a/apps/computer-vision/app/object_detection/index.tsx b/apps/computer-vision/app/object_detection/index.tsx index 6a43dd920..9e60589fb 100644 --- a/apps/computer-vision/app/object_detection/index.tsx +++ b/apps/computer-vision/app/object_detection/index.tsx @@ -1,16 +1,66 @@ import Spinner from '../../components/Spinner'; -import { BottomBar } from '../../components/BottomBar'; import { getImage } from '../../utils'; import { Detection, useObjectDetection, SSDLITE_320_MOBILENET_V3_LARGE, } from 'react-native-executorch'; -import { View, StyleSheet, Image } from 'react-native'; +import { View, StyleSheet, Image, TouchableOpacity, Text } from 'react-native'; import ImageWithBboxes from '../../components/ImageWithBboxes'; import React, { useContext, useEffect, useState } from 'react'; import { GeneratingContext } from '../../context'; import ScreenWrapper from '../../ScreenWrapper'; +import ColorPalette from '../../colors'; +import { Images } from 'react-native-nitro-image'; + +// Helper function to convert image URI to raw pixel data using NitroImage +async function imageUriToPixelData( + uri: string, + targetWidth: number, + targetHeight: number +): Promise<{ + data: ArrayBuffer; + width: number; + height: number; + channels: number; +}> { + try { + // Load image and resize to target dimensions + const image = await Images.loadFromFileAsync(uri); + const resized = image.resize(targetWidth, targetHeight); + + // Get pixel data as ArrayBuffer (RGBA format) + const pixelData = resized.toRawPixelData(); + const buffer = + pixelData instanceof ArrayBuffer ? pixelData : pixelData.buffer; + + // Calculate actual buffer dimensions (accounts for device pixel ratio) + const bufferSize = buffer?.byteLength || 0; + const totalPixels = bufferSize / 4; // RGBA = 4 bytes per pixel + const aspectRatio = targetWidth / targetHeight; + const actualHeight = Math.sqrt(totalPixels / aspectRatio); + const actualWidth = totalPixels / actualHeight; + + console.log('Requested:', targetWidth, 'x', targetHeight); + console.log('Buffer size:', bufferSize); + console.log( + 'Actual dimensions:', + Math.round(actualWidth), + 'x', + Math.round(actualHeight) + ); + + return { + data: buffer, + width: Math.round(actualWidth), + height: Math.round(actualHeight), + channels: 4, // RGBA + }; + } catch (error) { + console.error('Error loading image with NitroImage:', error); + throw error; + } +} export default function ObjectDetectionScreen() { const [imageUri, setImageUri] = useState(''); @@ -42,10 +92,41 @@ export default function ObjectDetectionScreen() { const runForward = async () => { if (imageUri) { try { - const output = await ssdLite.forward(imageUri); + console.log('Running forward with string URI...'); + const output = await ssdLite.forward(imageUri, 0.5); + console.log('String URI result:', output.length, 'detections'); setResults(output); } catch (e) { - console.error(e); + console.error('Error in runForward:', e); + } + } + }; + + const runForwardPixels = async () => { + if (imageUri && imageDimensions) { + try { + console.log('Converting image to pixel data...'); + // Resize to 640x640 to avoid memory issues + const intermediateSize = 640; + const pixelData = await imageUriToPixelData( + imageUri, + intermediateSize, + intermediateSize + ); + + console.log('Running forward with pixel data...', { + width: pixelData.width, + height: pixelData.height, + channels: pixelData.channels, + dataSize: pixelData.data.byteLength, + }); + + // Run inference using unified forward() API + const output = await ssdLite.forward(pixelData, 0.5); + console.log('Pixel data result:', output.length, 'detections'); + setResults(output); + } catch (e) { + console.error('Error in runForwardPixels:', e); } } }; @@ -81,10 +162,41 @@ export default function ObjectDetectionScreen() { )} - + + {/* Custom bottom bar with two buttons */} + + + handleCameraPress(false)}> + 📷 Gallery + + + + + + Run (String) + + + + Run (Pixels) + + + ); } @@ -129,4 +241,43 @@ const styles = StyleSheet.create({ width: '100%', height: '100%', }, + bottomContainer: { + width: '100%', + gap: 15, + alignItems: 'center', + padding: 16, + flex: 1, + }, + bottomIconsContainer: { + flexDirection: 'row', + justifyContent: 'center', + width: '100%', + }, + iconText: { + fontSize: 16, + color: ColorPalette.primary, + }, + buttonsRow: { + flexDirection: 'row', + width: '100%', + gap: 10, + }, + button: { + height: 50, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: ColorPalette.primary, + color: '#fff', + borderRadius: 8, + }, + halfButton: { + flex: 1, + }, + buttonDisabled: { + opacity: 0.5, + }, + buttonText: { + color: '#fff', + fontSize: 16, + }, }); diff --git a/apps/computer-vision/package.json b/apps/computer-vision/package.json index 63885109a..6fe0ffe97 100644 --- a/apps/computer-vision/package.json +++ b/apps/computer-vision/package.json @@ -11,17 +11,19 @@ "lint": "eslint . --ext .ts,.tsx --fix" }, "dependencies": { - "@react-native/metro-config": "^0.76.3", + "@react-native-executorch/expo-resource-fetcher": "workspace:*", + "@react-native/metro-config": "^0.81.5", "@react-navigation/drawer": "^7.3.9", "@react-navigation/native": "^7.1.6", "@shopify/react-native-skia": "2.2.12", "expo": "^54.0.27", + "expo-build-properties": "~1.0.10", "expo-constants": "~18.0.11", "expo-font": "~14.0.10", "expo-linking": "~8.0.10", "expo-router": "~6.0.17", "expo-status-bar": "~3.0.9", - "metro-config": "^0.81.0", + "metro-config": "^0.81.5", "react": "19.1.0", "react-native": "0.81.5", "react-native-device-info": "^14.0.4", @@ -29,17 +31,20 @@ "react-native-gesture-handler": "~2.28.0", "react-native-image-picker": "^7.2.2", "react-native-loading-spinner-overlay": "^3.0.1", - "react-native-reanimated": "~4.1.1", + "react-native-reanimated": "~4.2.1", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", "react-native-svg": "15.12.1", "react-native-svg-transformer": "^1.5.0", - "react-native-worklets": "0.5.1" + "react-native-vision-camera": "4.7.3", + "react-native-worklets": "^0.7.2", + "react-native-worklets-core": "^1.6.2", + "vision-camera-resize-plugin": "^3.2.0" }, "devDependencies": { "@babel/core": "^7.25.2", "@types/pngjs": "^6.0.5", - "@types/react": "~19.1.10" + "@types/react": "~19.2.0" }, "private": true } diff --git a/apps/computer-vision/tsconfig.json b/apps/computer-vision/tsconfig.json index 47026ce43..a08f2140a 100644 --- a/apps/computer-vision/tsconfig.json +++ b/apps/computer-vision/tsconfig.json @@ -9,7 +9,10 @@ "customConditions": ["react-native"], "noEmit": true, "paths": { - "react-native-executorch": ["../../packages/react-native-executorch/src"] + "react-native-executorch": ["../../packages/react-native-executorch/src"], + "@react-native-executorch/expo-resource-fetcher": [ + "../../packages/expo-resource-fetcher/src" + ] } } } diff --git a/apps/llm/app/_layout.tsx b/apps/llm/app/_layout.tsx index 68c715a80..5ece80f1f 100644 --- a/apps/llm/app/_layout.tsx +++ b/apps/llm/app/_layout.tsx @@ -1,8 +1,9 @@ import { Drawer } from 'expo-router/drawer'; +import { initExecutorch } from 'react-native-executorch'; +import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher'; import ColorPalette from '../colors'; import React, { useState } from 'react'; import { Text, StyleSheet, View } from 'react-native'; - import { DrawerContentComponentProps, DrawerContentScrollView, @@ -10,6 +11,10 @@ import { } from '@react-navigation/drawer'; import { GeneratingContext } from '../context'; +initExecutorch({ + resourceFetcher: ExpoResourceFetcher, +}); + interface CustomDrawerProps extends DrawerContentComponentProps { isGenerating: boolean; } diff --git a/apps/llm/package.json b/apps/llm/package.json index de046a299..04597d963 100644 --- a/apps/llm/package.json +++ b/apps/llm/package.json @@ -11,7 +11,8 @@ "lint": "eslint . --ext .ts,.tsx --fix" }, "dependencies": { - "@react-native/metro-config": "^0.76.3", + "@react-native-executorch/expo-resource-fetcher": "workspace:*", + "@react-native/metro-config": "^0.81.5", "@react-navigation/drawer": "^7.3.9", "@react-navigation/native": "^7.1.6", "expo": "^54.0.27", @@ -22,7 +23,7 @@ "expo-linking": "~8.0.10", "expo-router": "~6.0.17", "expo-status-bar": "~3.0.9", - "metro-config": "^0.81.0", + "metro-config": "^0.81.5", "react": "19.1.0", "react-native": "0.81.5", "react-native-audio-api": "^0.8.2", diff --git a/apps/llm/tsconfig.json b/apps/llm/tsconfig.json index 47026ce43..a08f2140a 100644 --- a/apps/llm/tsconfig.json +++ b/apps/llm/tsconfig.json @@ -9,7 +9,10 @@ "customConditions": ["react-native"], "noEmit": true, "paths": { - "react-native-executorch": ["../../packages/react-native-executorch/src"] + "react-native-executorch": ["../../packages/react-native-executorch/src"], + "@react-native-executorch/expo-resource-fetcher": [ + "../../packages/expo-resource-fetcher/src" + ] } } } diff --git a/apps/speech/App.tsx b/apps/speech/App.tsx index af0598b59..ab036678e 100644 --- a/apps/speech/App.tsx +++ b/apps/speech/App.tsx @@ -5,6 +5,12 @@ import { SpeechToTextScreen } from './screens/SpeechToTextScreen'; import ColorPalette from './colors'; import ExecutorchLogo from './assets/executorch.svg'; import { Quiz } from './screens/Quiz'; +import { initExecutorch } from 'react-native-executorch'; +import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher'; + +initExecutorch({ + resourceFetcher: ExpoResourceFetcher, +}); export default function App() { const [currentScreen, setCurrentScreen] = useState< diff --git a/apps/speech/package.json b/apps/speech/package.json index 094fa2b78..e6047a385 100644 --- a/apps/speech/package.json +++ b/apps/speech/package.json @@ -11,12 +11,13 @@ "lint": "eslint . --ext .ts,.tsx --fix" }, "dependencies": { - "@react-native/metro-config": "^0.76.3", + "@react-native-executorch/expo-resource-fetcher": "workspace:*", + "@react-native/metro-config": "^0.81.5", "buffer": "^6.0.3", "expo": "^54.0.27", "expo-font": "~14.0.10", "expo-status-bar": "~3.0.9", - "metro-config": "^0.81.0", + "metro-config": "^0.81.5", "react": "19.1.0", "react-native": "0.81.5", "react-native-audio-api": "0.6.5", diff --git a/apps/speech/tsconfig.json b/apps/speech/tsconfig.json index 47026ce43..a08f2140a 100644 --- a/apps/speech/tsconfig.json +++ b/apps/speech/tsconfig.json @@ -9,7 +9,10 @@ "customConditions": ["react-native"], "noEmit": true, "paths": { - "react-native-executorch": ["../../packages/react-native-executorch/src"] + "react-native-executorch": ["../../packages/react-native-executorch/src"], + "@react-native-executorch/expo-resource-fetcher": [ + "../../packages/expo-resource-fetcher/src" + ] } } } diff --git a/apps/text-embeddings/app/_layout.tsx b/apps/text-embeddings/app/_layout.tsx index 16bf0e87a..c0633a993 100644 --- a/apps/text-embeddings/app/_layout.tsx +++ b/apps/text-embeddings/app/_layout.tsx @@ -1,4 +1,6 @@ import { Drawer } from 'expo-router/drawer'; +import { initExecutorch } from 'react-native-executorch'; +import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher'; import ColorPalette from '../colors'; import React, { useState } from 'react'; import { Text, StyleSheet, View } from 'react-native'; @@ -10,6 +12,10 @@ import { } from '@react-navigation/drawer'; import { GeneratingContext } from '../context'; +initExecutorch({ + resourceFetcher: ExpoResourceFetcher, +}); + interface CustomDrawerProps extends DrawerContentComponentProps { isGenerating: boolean; } diff --git a/apps/text-embeddings/package.json b/apps/text-embeddings/package.json index cbf0da96c..64093b919 100644 --- a/apps/text-embeddings/package.json +++ b/apps/text-embeddings/package.json @@ -14,6 +14,7 @@ "@react-navigation/native": "*" }, "dependencies": { + "@react-native-executorch/expo-resource-fetcher": "workspace:*", "@react-navigation/drawer": "^7.3.9", "expo": "^54.0.27", "expo-constants": "~18.0.11", diff --git a/apps/text-embeddings/tsconfig.json b/apps/text-embeddings/tsconfig.json index 47026ce43..a08f2140a 100644 --- a/apps/text-embeddings/tsconfig.json +++ b/apps/text-embeddings/tsconfig.json @@ -9,7 +9,10 @@ "customConditions": ["react-native"], "noEmit": true, "paths": { - "react-native-executorch": ["../../packages/react-native-executorch/src"] + "react-native-executorch": ["../../packages/react-native-executorch/src"], + "@react-native-executorch/expo-resource-fetcher": [ + "../../packages/expo-resource-fetcher/src" + ] } } } diff --git a/docs/docs/06-api-reference/index.md b/docs/docs/06-api-reference/index.md index 1415421de..debc55540 100644 --- a/docs/docs/06-api-reference/index.md +++ b/docs/docs/06-api-reference/index.md @@ -20,159 +20,159 @@ ## Models - Classification -- [EFFICIENTNET\_V2\_S](variables/EFFICIENTNET_V2_S.md) +- [EFFICIENTNET_V2_S](variables/EFFICIENTNET_V2_S.md) ## Models - Image Embeddings -- [CLIP\_VIT\_BASE\_PATCH32\_IMAGE](variables/CLIP_VIT_BASE_PATCH32_IMAGE.md) +- [CLIP_VIT_BASE_PATCH32_IMAGE](variables/CLIP_VIT_BASE_PATCH32_IMAGE.md) ## Models - Image Generation -- [BK\_SDM\_TINY\_VPRED\_256](variables/BK_SDM_TINY_VPRED_256.md) -- [BK\_SDM\_TINY\_VPRED\_512](variables/BK_SDM_TINY_VPRED_512.md) +- [BK_SDM_TINY_VPRED_256](variables/BK_SDM_TINY_VPRED_256.md) +- [BK_SDM_TINY_VPRED_512](variables/BK_SDM_TINY_VPRED_512.md) ## Models - Image Segmentation -- [DEEPLAB\_V3\_RESNET50](variables/DEEPLAB_V3_RESNET50.md) +- [DEEPLAB_V3_RESNET50](variables/DEEPLAB_V3_RESNET50.md) ## Models - LMM -- [HAMMER2\_1\_0\_5B](variables/HAMMER2_1_0_5B.md) -- [HAMMER2\_1\_0\_5B\_QUANTIZED](variables/HAMMER2_1_0_5B_QUANTIZED.md) -- [HAMMER2\_1\_1\_5B](variables/HAMMER2_1_1_5B.md) -- [HAMMER2\_1\_1\_5B\_QUANTIZED](variables/HAMMER2_1_1_5B_QUANTIZED.md) -- [HAMMER2\_1\_3B](variables/HAMMER2_1_3B.md) -- [HAMMER2\_1\_3B\_QUANTIZED](variables/HAMMER2_1_3B_QUANTIZED.md) -- [LLAMA3\_2\_1B](variables/LLAMA3_2_1B.md) -- [LLAMA3\_2\_1B\_QLORA](variables/LLAMA3_2_1B_QLORA.md) -- [LLAMA3\_2\_1B\_SPINQUANT](variables/LLAMA3_2_1B_SPINQUANT.md) -- [LLAMA3\_2\_3B](variables/LLAMA3_2_3B.md) -- [LLAMA3\_2\_3B\_QLORA](variables/LLAMA3_2_3B_QLORA.md) -- [LLAMA3\_2\_3B\_SPINQUANT](variables/LLAMA3_2_3B_SPINQUANT.md) -- [PHI\_4\_MINI\_4B](variables/PHI_4_MINI_4B.md) -- [PHI\_4\_MINI\_4B\_QUANTIZED](variables/PHI_4_MINI_4B_QUANTIZED.md) -- [QWEN2\_5\_0\_5B](variables/QWEN2_5_0_5B.md) -- [QWEN2\_5\_0\_5B\_QUANTIZED](variables/QWEN2_5_0_5B_QUANTIZED.md) -- [QWEN2\_5\_1\_5B](variables/QWEN2_5_1_5B.md) -- [QWEN2\_5\_1\_5B\_QUANTIZED](variables/QWEN2_5_1_5B_QUANTIZED.md) -- [QWEN2\_5\_3B](variables/QWEN2_5_3B.md) -- [QWEN2\_5\_3B\_QUANTIZED](variables/QWEN2_5_3B_QUANTIZED.md) -- [QWEN3\_0\_6B](variables/QWEN3_0_6B.md) -- [QWEN3\_0\_6B\_QUANTIZED](variables/QWEN3_0_6B_QUANTIZED.md) -- [QWEN3\_1\_7B](variables/QWEN3_1_7B.md) -- [QWEN3\_1\_7B\_QUANTIZED](variables/QWEN3_1_7B_QUANTIZED.md) -- [QWEN3\_4B](variables/QWEN3_4B.md) -- [QWEN3\_4B\_QUANTIZED](variables/QWEN3_4B_QUANTIZED.md) -- [SMOLLM2\_1\_1\_7B](variables/SMOLLM2_1_1_7B.md) -- [SMOLLM2\_1\_1\_7B\_QUANTIZED](variables/SMOLLM2_1_1_7B_QUANTIZED.md) -- [SMOLLM2\_1\_135M](variables/SMOLLM2_1_135M.md) -- [SMOLLM2\_1\_135M\_QUANTIZED](variables/SMOLLM2_1_135M_QUANTIZED.md) -- [SMOLLM2\_1\_360M](variables/SMOLLM2_1_360M.md) -- [SMOLLM2\_1\_360M\_QUANTIZED](variables/SMOLLM2_1_360M_QUANTIZED.md) +- [HAMMER2_1_0_5B](variables/HAMMER2_1_0_5B.md) +- [HAMMER2_1_0_5B_QUANTIZED](variables/HAMMER2_1_0_5B_QUANTIZED.md) +- [HAMMER2_1_1_5B](variables/HAMMER2_1_1_5B.md) +- [HAMMER2_1_1_5B_QUANTIZED](variables/HAMMER2_1_1_5B_QUANTIZED.md) +- [HAMMER2_1_3B](variables/HAMMER2_1_3B.md) +- [HAMMER2_1_3B_QUANTIZED](variables/HAMMER2_1_3B_QUANTIZED.md) +- [LLAMA3_2_1B](variables/LLAMA3_2_1B.md) +- [LLAMA3_2_1B_QLORA](variables/LLAMA3_2_1B_QLORA.md) +- [LLAMA3_2_1B_SPINQUANT](variables/LLAMA3_2_1B_SPINQUANT.md) +- [LLAMA3_2_3B](variables/LLAMA3_2_3B.md) +- [LLAMA3_2_3B_QLORA](variables/LLAMA3_2_3B_QLORA.md) +- [LLAMA3_2_3B_SPINQUANT](variables/LLAMA3_2_3B_SPINQUANT.md) +- [PHI_4_MINI_4B](variables/PHI_4_MINI_4B.md) +- [PHI_4_MINI_4B_QUANTIZED](variables/PHI_4_MINI_4B_QUANTIZED.md) +- [QWEN2_5_0_5B](variables/QWEN2_5_0_5B.md) +- [QWEN2_5_0_5B_QUANTIZED](variables/QWEN2_5_0_5B_QUANTIZED.md) +- [QWEN2_5_1_5B](variables/QWEN2_5_1_5B.md) +- [QWEN2_5_1_5B_QUANTIZED](variables/QWEN2_5_1_5B_QUANTIZED.md) +- [QWEN2_5_3B](variables/QWEN2_5_3B.md) +- [QWEN2_5_3B_QUANTIZED](variables/QWEN2_5_3B_QUANTIZED.md) +- [QWEN3_0_6B](variables/QWEN3_0_6B.md) +- [QWEN3_0_6B_QUANTIZED](variables/QWEN3_0_6B_QUANTIZED.md) +- [QWEN3_1_7B](variables/QWEN3_1_7B.md) +- [QWEN3_1_7B_QUANTIZED](variables/QWEN3_1_7B_QUANTIZED.md) +- [QWEN3_4B](variables/QWEN3_4B.md) +- [QWEN3_4B_QUANTIZED](variables/QWEN3_4B_QUANTIZED.md) +- [SMOLLM2_1_1_7B](variables/SMOLLM2_1_1_7B.md) +- [SMOLLM2_1_1_7B_QUANTIZED](variables/SMOLLM2_1_1_7B_QUANTIZED.md) +- [SMOLLM2_1_135M](variables/SMOLLM2_1_135M.md) +- [SMOLLM2_1_135M_QUANTIZED](variables/SMOLLM2_1_135M_QUANTIZED.md) +- [SMOLLM2_1_360M](variables/SMOLLM2_1_360M.md) +- [SMOLLM2_1_360M_QUANTIZED](variables/SMOLLM2_1_360M_QUANTIZED.md) ## Models - Object Detection -- [SSDLITE\_320\_MOBILENET\_V3\_LARGE](variables/SSDLITE_320_MOBILENET_V3_LARGE.md) +- [SSDLITE_320_MOBILENET_V3_LARGE](variables/SSDLITE_320_MOBILENET_V3_LARGE.md) ## Models - Speech To Text -- [WHISPER\_BASE](variables/WHISPER_BASE.md) -- [WHISPER\_BASE\_EN](variables/WHISPER_BASE_EN.md) -- [WHISPER\_SMALL](variables/WHISPER_SMALL.md) -- [WHISPER\_SMALL\_EN](variables/WHISPER_SMALL_EN.md) -- [WHISPER\_TINY](variables/WHISPER_TINY.md) -- [WHISPER\_TINY\_EN](variables/WHISPER_TINY_EN.md) -- [WHISPER\_TINY\_EN\_QUANTIZED](variables/WHISPER_TINY_EN_QUANTIZED.md) +- [WHISPER_BASE](variables/WHISPER_BASE.md) +- [WHISPER_BASE_EN](variables/WHISPER_BASE_EN.md) +- [WHISPER_SMALL](variables/WHISPER_SMALL.md) +- [WHISPER_SMALL_EN](variables/WHISPER_SMALL_EN.md) +- [WHISPER_TINY](variables/WHISPER_TINY.md) +- [WHISPER_TINY_EN](variables/WHISPER_TINY_EN.md) +- [WHISPER_TINY_EN_QUANTIZED](variables/WHISPER_TINY_EN_QUANTIZED.md) ## Models - Style Transfer -- [STYLE\_TRANSFER\_CANDY](variables/STYLE_TRANSFER_CANDY.md) -- [STYLE\_TRANSFER\_MOSAIC](variables/STYLE_TRANSFER_MOSAIC.md) -- [STYLE\_TRANSFER\_RAIN\_PRINCESS](variables/STYLE_TRANSFER_RAIN_PRINCESS.md) -- [STYLE\_TRANSFER\_UDNIE](variables/STYLE_TRANSFER_UDNIE.md) +- [STYLE_TRANSFER_CANDY](variables/STYLE_TRANSFER_CANDY.md) +- [STYLE_TRANSFER_MOSAIC](variables/STYLE_TRANSFER_MOSAIC.md) +- [STYLE_TRANSFER_RAIN_PRINCESS](variables/STYLE_TRANSFER_RAIN_PRINCESS.md) +- [STYLE_TRANSFER_UDNIE](variables/STYLE_TRANSFER_UDNIE.md) ## Models - Text Embeddings -- [ALL\_MINILM\_L6\_V2](variables/ALL_MINILM_L6_V2.md) -- [ALL\_MPNET\_BASE\_V2](variables/ALL_MPNET_BASE_V2.md) -- [CLIP\_VIT\_BASE\_PATCH32\_TEXT](variables/CLIP_VIT_BASE_PATCH32_TEXT.md) -- [MULTI\_QA\_MINILM\_L6\_COS\_V1](variables/MULTI_QA_MINILM_L6_COS_V1.md) -- [MULTI\_QA\_MPNET\_BASE\_DOT\_V1](variables/MULTI_QA_MPNET_BASE_DOT_V1.md) +- [ALL_MINILM_L6_V2](variables/ALL_MINILM_L6_V2.md) +- [ALL_MPNET_BASE_V2](variables/ALL_MPNET_BASE_V2.md) +- [CLIP_VIT_BASE_PATCH32_TEXT](variables/CLIP_VIT_BASE_PATCH32_TEXT.md) +- [MULTI_QA_MINILM_L6_COS_V1](variables/MULTI_QA_MINILM_L6_COS_V1.md) +- [MULTI_QA_MPNET_BASE_DOT_V1](variables/MULTI_QA_MPNET_BASE_DOT_V1.md) ## Models - Text to Speech -- [KOKORO\_MEDIUM](variables/KOKORO_MEDIUM.md) -- [KOKORO\_SMALL](variables/KOKORO_SMALL.md) +- [KOKORO_MEDIUM](variables/KOKORO_MEDIUM.md) +- [KOKORO_SMALL](variables/KOKORO_SMALL.md) ## Models - Voice Activity Detection -- [FSMN\_VAD](variables/FSMN_VAD.md) +- [FSMN_VAD](variables/FSMN_VAD.md) ## OCR Supported Alphabets -- [OCR\_ABAZA](variables/OCR_ABAZA.md) -- [OCR\_ADYGHE](variables/OCR_ADYGHE.md) -- [OCR\_AFRIKAANS](variables/OCR_AFRIKAANS.md) -- [OCR\_ALBANIAN](variables/OCR_ALBANIAN.md) -- [OCR\_AVAR](variables/OCR_AVAR.md) -- [OCR\_AZERBAIJANI](variables/OCR_AZERBAIJANI.md) -- [OCR\_BELARUSIAN](variables/OCR_BELARUSIAN.md) -- [OCR\_BOSNIAN](variables/OCR_BOSNIAN.md) -- [OCR\_BULGARIAN](variables/OCR_BULGARIAN.md) -- [OCR\_CHECHEN](variables/OCR_CHECHEN.md) -- [OCR\_CROATIAN](variables/OCR_CROATIAN.md) -- [OCR\_CZECH](variables/OCR_CZECH.md) -- [OCR\_DANISH](variables/OCR_DANISH.md) -- [OCR\_DARGWA](variables/OCR_DARGWA.md) -- [OCR\_DUTCH](variables/OCR_DUTCH.md) -- [OCR\_ENGLISH](variables/OCR_ENGLISH.md) -- [OCR\_ESTONIAN](variables/OCR_ESTONIAN.md) -- [OCR\_FRENCH](variables/OCR_FRENCH.md) -- [OCR\_GERMAN](variables/OCR_GERMAN.md) -- [OCR\_HUNGARIAN](variables/OCR_HUNGARIAN.md) -- [OCR\_ICELANDIC](variables/OCR_ICELANDIC.md) -- [OCR\_INDONESIAN](variables/OCR_INDONESIAN.md) -- [OCR\_INGUSH](variables/OCR_INGUSH.md) -- [OCR\_IRISH](variables/OCR_IRISH.md) -- [OCR\_ITALIAN](variables/OCR_ITALIAN.md) -- [OCR\_JAPANESE](variables/OCR_JAPANESE.md) -- [OCR\_KANNADA](variables/OCR_KANNADA.md) -- [OCR\_KARBADIAN](variables/OCR_KARBADIAN.md) -- [OCR\_KOREAN](variables/OCR_KOREAN.md) -- [OCR\_KURDISH](variables/OCR_KURDISH.md) -- [OCR\_LAK](variables/OCR_LAK.md) -- [OCR\_LATIN](variables/OCR_LATIN.md) -- [OCR\_LATVIAN](variables/OCR_LATVIAN.md) -- [OCR\_LEZGHIAN](variables/OCR_LEZGHIAN.md) -- [OCR\_LITHUANIAN](variables/OCR_LITHUANIAN.md) -- [OCR\_MALAY](variables/OCR_MALAY.md) -- [OCR\_MALTESE](variables/OCR_MALTESE.md) -- [OCR\_MAORI](variables/OCR_MAORI.md) -- [OCR\_MONGOLIAN](variables/OCR_MONGOLIAN.md) -- [OCR\_NORWEGIAN](variables/OCR_NORWEGIAN.md) -- [OCR\_OCCITAN](variables/OCR_OCCITAN.md) -- [OCR\_PALI](variables/OCR_PALI.md) -- [OCR\_POLISH](variables/OCR_POLISH.md) -- [OCR\_PORTUGUESE](variables/OCR_PORTUGUESE.md) -- [OCR\_ROMANIAN](variables/OCR_ROMANIAN.md) -- [OCR\_RUSSIAN](variables/OCR_RUSSIAN.md) -- [OCR\_SERBIAN\_CYRILLIC](variables/OCR_SERBIAN_CYRILLIC.md) -- [OCR\_SERBIAN\_LATIN](variables/OCR_SERBIAN_LATIN.md) -- [OCR\_SIMPLIFIED\_CHINESE](variables/OCR_SIMPLIFIED_CHINESE.md) -- [OCR\_SLOVAK](variables/OCR_SLOVAK.md) -- [OCR\_SLOVENIAN](variables/OCR_SLOVENIAN.md) -- [OCR\_SPANISH](variables/OCR_SPANISH.md) -- [OCR\_SWAHILI](variables/OCR_SWAHILI.md) -- [OCR\_SWEDISH](variables/OCR_SWEDISH.md) -- [OCR\_TABASSARAN](variables/OCR_TABASSARAN.md) -- [OCR\_TAGALOG](variables/OCR_TAGALOG.md) -- [OCR\_TAJIK](variables/OCR_TAJIK.md) -- [OCR\_TELUGU](variables/OCR_TELUGU.md) -- [OCR\_TURKISH](variables/OCR_TURKISH.md) -- [OCR\_UKRAINIAN](variables/OCR_UKRAINIAN.md) -- [OCR\_UZBEK](variables/OCR_UZBEK.md) -- [OCR\_VIETNAMESE](variables/OCR_VIETNAMESE.md) -- [OCR\_WELSH](variables/OCR_WELSH.md) +- [OCR_ABAZA](variables/OCR_ABAZA.md) +- [OCR_ADYGHE](variables/OCR_ADYGHE.md) +- [OCR_AFRIKAANS](variables/OCR_AFRIKAANS.md) +- [OCR_ALBANIAN](variables/OCR_ALBANIAN.md) +- [OCR_AVAR](variables/OCR_AVAR.md) +- [OCR_AZERBAIJANI](variables/OCR_AZERBAIJANI.md) +- [OCR_BELARUSIAN](variables/OCR_BELARUSIAN.md) +- [OCR_BOSNIAN](variables/OCR_BOSNIAN.md) +- [OCR_BULGARIAN](variables/OCR_BULGARIAN.md) +- [OCR_CHECHEN](variables/OCR_CHECHEN.md) +- [OCR_CROATIAN](variables/OCR_CROATIAN.md) +- [OCR_CZECH](variables/OCR_CZECH.md) +- [OCR_DANISH](variables/OCR_DANISH.md) +- [OCR_DARGWA](variables/OCR_DARGWA.md) +- [OCR_DUTCH](variables/OCR_DUTCH.md) +- [OCR_ENGLISH](variables/OCR_ENGLISH.md) +- [OCR_ESTONIAN](variables/OCR_ESTONIAN.md) +- [OCR_FRENCH](variables/OCR_FRENCH.md) +- [OCR_GERMAN](variables/OCR_GERMAN.md) +- [OCR_HUNGARIAN](variables/OCR_HUNGARIAN.md) +- [OCR_ICELANDIC](variables/OCR_ICELANDIC.md) +- [OCR_INDONESIAN](variables/OCR_INDONESIAN.md) +- [OCR_INGUSH](variables/OCR_INGUSH.md) +- [OCR_IRISH](variables/OCR_IRISH.md) +- [OCR_ITALIAN](variables/OCR_ITALIAN.md) +- [OCR_JAPANESE](variables/OCR_JAPANESE.md) +- [OCR_KANNADA](variables/OCR_KANNADA.md) +- [OCR_KARBADIAN](variables/OCR_KARBADIAN.md) +- [OCR_KOREAN](variables/OCR_KOREAN.md) +- [OCR_KURDISH](variables/OCR_KURDISH.md) +- [OCR_LAK](variables/OCR_LAK.md) +- [OCR_LATIN](variables/OCR_LATIN.md) +- [OCR_LATVIAN](variables/OCR_LATVIAN.md) +- [OCR_LEZGHIAN](variables/OCR_LEZGHIAN.md) +- [OCR_LITHUANIAN](variables/OCR_LITHUANIAN.md) +- [OCR_MALAY](variables/OCR_MALAY.md) +- [OCR_MALTESE](variables/OCR_MALTESE.md) +- [OCR_MAORI](variables/OCR_MAORI.md) +- [OCR_MONGOLIAN](variables/OCR_MONGOLIAN.md) +- [OCR_NORWEGIAN](variables/OCR_NORWEGIAN.md) +- [OCR_OCCITAN](variables/OCR_OCCITAN.md) +- [OCR_PALI](variables/OCR_PALI.md) +- [OCR_POLISH](variables/OCR_POLISH.md) +- [OCR_PORTUGUESE](variables/OCR_PORTUGUESE.md) +- [OCR_ROMANIAN](variables/OCR_ROMANIAN.md) +- [OCR_RUSSIAN](variables/OCR_RUSSIAN.md) +- [OCR_SERBIAN_CYRILLIC](variables/OCR_SERBIAN_CYRILLIC.md) +- [OCR_SERBIAN_LATIN](variables/OCR_SERBIAN_LATIN.md) +- [OCR_SIMPLIFIED_CHINESE](variables/OCR_SIMPLIFIED_CHINESE.md) +- [OCR_SLOVAK](variables/OCR_SLOVAK.md) +- [OCR_SLOVENIAN](variables/OCR_SLOVENIAN.md) +- [OCR_SPANISH](variables/OCR_SPANISH.md) +- [OCR_SWAHILI](variables/OCR_SWAHILI.md) +- [OCR_SWEDISH](variables/OCR_SWEDISH.md) +- [OCR_TABASSARAN](variables/OCR_TABASSARAN.md) +- [OCR_TAGALOG](variables/OCR_TAGALOG.md) +- [OCR_TAJIK](variables/OCR_TAJIK.md) +- [OCR_TELUGU](variables/OCR_TELUGU.md) +- [OCR_TURKISH](variables/OCR_TURKISH.md) +- [OCR_UKRAINIAN](variables/OCR_UKRAINIAN.md) +- [OCR_UZBEK](variables/OCR_UZBEK.md) +- [OCR_VIETNAMESE](variables/OCR_VIETNAMESE.md) +- [OCR_WELSH](variables/OCR_WELSH.md) ## Other @@ -181,14 +181,14 @@ ## TTS Supported Voices -- [KOKORO\_VOICE\_AF\_HEART](variables/KOKORO_VOICE_AF_HEART.md) -- [KOKORO\_VOICE\_AF\_RIVER](variables/KOKORO_VOICE_AF_RIVER.md) -- [KOKORO\_VOICE\_AF\_SARAH](variables/KOKORO_VOICE_AF_SARAH.md) -- [KOKORO\_VOICE\_AM\_ADAM](variables/KOKORO_VOICE_AM_ADAM.md) -- [KOKORO\_VOICE\_AM\_MICHAEL](variables/KOKORO_VOICE_AM_MICHAEL.md) -- [KOKORO\_VOICE\_AM\_SANTA](variables/KOKORO_VOICE_AM_SANTA.md) -- [KOKORO\_VOICE\_BF\_EMMA](variables/KOKORO_VOICE_BF_EMMA.md) -- [KOKORO\_VOICE\_BM\_DANIEL](variables/KOKORO_VOICE_BM_DANIEL.md) +- [KOKORO_VOICE_AF_HEART](variables/KOKORO_VOICE_AF_HEART.md) +- [KOKORO_VOICE_AF_RIVER](variables/KOKORO_VOICE_AF_RIVER.md) +- [KOKORO_VOICE_AF_SARAH](variables/KOKORO_VOICE_AF_SARAH.md) +- [KOKORO_VOICE_AM_ADAM](variables/KOKORO_VOICE_AM_ADAM.md) +- [KOKORO_VOICE_AM_MICHAEL](variables/KOKORO_VOICE_AM_MICHAEL.md) +- [KOKORO_VOICE_AM_SANTA](variables/KOKORO_VOICE_AM_SANTA.md) +- [KOKORO_VOICE_BF_EMMA](variables/KOKORO_VOICE_BF_EMMA.md) +- [KOKORO_VOICE_BM_DANIEL](variables/KOKORO_VOICE_BM_DANIEL.md) ## Types @@ -251,7 +251,7 @@ - [SpeechToTextLanguage](type-aliases/SpeechToTextLanguage.md) - [TensorBuffer](type-aliases/TensorBuffer.md) - [TextToSpeechLanguage](type-aliases/TextToSpeechLanguage.md) -- [SPECIAL\_TOKENS](variables/SPECIAL_TOKENS.md) +- [SPECIAL_TOKENS](variables/SPECIAL_TOKENS.md) ## Typescript API @@ -277,11 +277,11 @@ ## Utilities - LLM -- [DEFAULT\_CHAT\_CONFIG](variables/DEFAULT_CHAT_CONFIG.md) -- [DEFAULT\_CONTEXT\_WINDOW\_LENGTH](variables/DEFAULT_CONTEXT_WINDOW_LENGTH.md) -- [DEFAULT\_MESSAGE\_HISTORY](variables/DEFAULT_MESSAGE_HISTORY.md) -- [DEFAULT\_SYSTEM\_PROMPT](variables/DEFAULT_SYSTEM_PROMPT.md) +- [DEFAULT_CHAT_CONFIG](variables/DEFAULT_CHAT_CONFIG.md) +- [DEFAULT_CONTEXT_WINDOW_LENGTH](variables/DEFAULT_CONTEXT_WINDOW_LENGTH.md) +- [DEFAULT_MESSAGE_HISTORY](variables/DEFAULT_MESSAGE_HISTORY.md) +- [DEFAULT_SYSTEM_PROMPT](variables/DEFAULT_SYSTEM_PROMPT.md) - [parseToolCall](variables/parseToolCall.md) -- [DEFAULT\_STRUCTURED\_OUTPUT\_PROMPT](functions/DEFAULT_STRUCTURED_OUTPUT_PROMPT.md) +- [DEFAULT_STRUCTURED_OUTPUT_PROMPT](functions/DEFAULT_STRUCTURED_OUTPUT_PROMPT.md) - [fixAndValidateStructuredOutput](functions/fixAndValidateStructuredOutput.md) - [getStructuredOutputPrompt](functions/getStructuredOutputPrompt.md) diff --git a/docs/src/theme/SearchBar.tsx b/docs/src/theme/SearchBar.tsx index 7536c3716..8dd05bdab 100644 --- a/docs/src/theme/SearchBar.tsx +++ b/docs/src/theme/SearchBar.tsx @@ -2,4 +2,4 @@ import React from 'react'; export default function SearchBar() { return
; -} \ No newline at end of file +} diff --git a/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useOCR.md b/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useOCR.md index 0c804e1a0..d491ed65b 100644 --- a/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useOCR.md +++ b/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useOCR.md @@ -309,7 +309,7 @@ You need to make sure the recognizer models you pass in `recognizerSources` matc | ![Alt text](../../../../static/img/harvard.png) | ![Alt text](../../../../static/img/harvard-boxes.png) | | ----------------------------------------------- | ----------------------------------------------------- | -| Original Image | Image with detected Text Boxes | +| Original Image | Image with detected Text Boxes | :::warning Times presented in the tables are measured as consecutive runs of the model. Initial run times may be up to 2x longer due to model loading and initialization. diff --git a/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useTextToImage.md b/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useTextToImage.md index 1d35d7a3a..476f8d95d 100644 --- a/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useTextToImage.md +++ b/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useTextToImage.md @@ -94,7 +94,7 @@ function App() { | ![Castle 256x256](../../../../static/img/castle256.png) | ![Castle 512x512](../../../../static/img/castle512.png) | | ------------------------------------------------------- | ------------------------------------------------------- | -| Image of size 256×256 | Image of size 512×512 | +| Image of size 256×256 | Image of size 512×512 | ## Supported models diff --git a/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useVerticalOCR.md b/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useVerticalOCR.md index 33f4d935f..88934fd2e 100644 --- a/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useVerticalOCR.md +++ b/docs/versioned_docs/version-0.6.x/02-hooks/02-computer-vision/useVerticalOCR.md @@ -324,7 +324,7 @@ You need to make sure the recognizer models you pass in `recognizerSources` matc | ![Alt text](../../../../static/img/sales-vertical.jpeg) | ![Alt text](../../../../static/img/sales-vertical-boxes.png) | | ------------------------------------------------------- | ------------------------------------------------------------ | -| Original Image | Image with detected Text Boxes | +| Original Image | Image with detected Text Boxes | :::warning Times presented in the tables are measured as consecutive runs of the model. Initial run times may be up to 2x longer due to model loading and initialization. diff --git a/package.json b/package.json index e4ee020b2..85ecd0d76 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "packageManager": "yarn@4.1.1", "workspaces": { "packages": [ - "packages/react-native-executorch", + "packages/*", "apps/*" ] }, @@ -15,6 +15,7 @@ }, "private": true, "devDependencies": { + "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@cspell/eslint-plugin": "^8.19.0", "@evilmartians/lefthook": "^1.5.0", "@react-native/eslint-config": "^0.79.0", diff --git a/packages/bare-resource-fetcher/README.md b/packages/bare-resource-fetcher/README.md new file mode 100644 index 000000000..9b1493f1d --- /dev/null +++ b/packages/bare-resource-fetcher/README.md @@ -0,0 +1,37 @@ +# @react-native-executorch/bare-resource-fetcher + +Bare React Native adapter for `react-native-executorch` that provides resource fetching capabilities using native filesystem libraries. + +## Installation + +```bash +yarn add @react-native-executorch/bare-resource-fetcher +yarn add @dr.pogodin/react-native-fs @kesha-antonov/react-native-background-downloader +``` + +### Native Dependencies Setup + +After installing, follow the setup guides for the native dependencies: + +- **[@dr.pogodin/react-native-fs](https://github.com/birdofpreyru/react-native-fs#getting-started)** - Filesystem operations +- **[@kesha-antonov/react-native-background-downloader](https://github.com/kesha-antonov/react-native-background-downloader#bare-react-native-projects)** - Background download support + +> **Note**: Make sure to complete the native setup (iOS/Android configuration) for both dependencies before using this adapter. + +## Usage + +```typescript +import { initExecutorch } from 'react-native-executorch'; +import { BareResourceFetcher } from '@react-native-executorch/bare-resource-fetcher'; + +initExecutorch({ + resourceFetcher: BareResourceFetcher, +}); +``` + +## When to Use + +Use this adapter if you're working with: +- Bare React Native projects (created with `npx @react-native-community/cli@latest init`) +- Projects that need true background downloads +- Projects requiring direct native filesystem access diff --git a/packages/bare-resource-fetcher/package.json b/packages/bare-resource-fetcher/package.json new file mode 100644 index 000000000..b5533ac48 --- /dev/null +++ b/packages/bare-resource-fetcher/package.json @@ -0,0 +1,43 @@ +{ + "name": "@react-native-executorch/bare-resource-fetcher", + "version": "0.1.0", + "description": "Bare React Native resource fetcher for react-native-executorch", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "exports": { + ".": { + "import": "./lib/index.js", + "types": "./lib/index.d.ts" + } + }, + "files": [ + "lib" + ], + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/software-mansion/react-native-executorch.git", + "directory": "packages/bare-resource-fetcher" + }, + "scripts": { + "prepare": "tsc", + "typecheck": "tsc --noEmit", + "lint": "eslint \"**/*.{js,ts,tsx}\"", + "clean": "del-cli lib" + }, + "peerDependencies": { + "@dr.pogodin/react-native-fs": "^2.0.0", + "@kesha-antonov/react-native-background-downloader": "^4.0.0", + "react-native": "*", + "react-native-executorch": "*" + }, + "devDependencies": { + "@dr.pogodin/react-native-fs": "^2.36.2", + "@kesha-antonov/react-native-background-downloader": "^4.4.5", + "@types/react": "~19.1.10", + "react": "19.1.0", + "react-native": "0.81.5", + "react-native-executorch": "workspace:*", + "typescript": "~5.9.2" + } +} diff --git a/packages/bare-resource-fetcher/src/ResourceFetcher.ts b/packages/bare-resource-fetcher/src/ResourceFetcher.ts new file mode 100644 index 000000000..bc7d45a51 --- /dev/null +++ b/packages/bare-resource-fetcher/src/ResourceFetcher.ts @@ -0,0 +1,476 @@ +import { + createDownloadTask, + completeHandler, + DownloadTask, + BeginHandlerParams, + ProgressHandlerParams, +} from '@kesha-antonov/react-native-background-downloader'; +import * as RNFS from '@dr.pogodin/react-native-fs'; +import { Image } from 'react-native'; +import { RNEDirectory } from './constants/directories'; +import { + ResourceSource, + ResourceFetcherAdapter, + RnExecutorchErrorCode, + RnExecutorchError, +} from 'react-native-executorch'; +import { + ResourceFetcherUtils, + DownloadStatus, + SourceType, + ResourceSourceExtended, +} from './ResourceFetcherUtils'; + +interface DownloadResource { + task: DownloadTask; + status: DownloadStatus; + extendedInfo: ResourceSourceExtended; +} + +interface BareResourceFetcherInterface extends ResourceFetcherAdapter { + downloads: Map; + singleFetch(sourceExtended: ResourceSourceExtended): Promise; + returnOrStartNext( + sourceExtended: ResourceSourceExtended, + result: string | string[] + ): string[] | Promise; + completeDownload( + extendedInfo: ResourceSourceExtended, + source: ResourceSource + ): Promise; + pause(source: ResourceSource): Promise; + resume(source: ResourceSource): Promise; + cancel(source: ResourceSource): Promise; + findActive(sources: ResourceSource[]): ResourceSource; + pauseFetching(...sources: ResourceSource[]): Promise; + resumeFetching(...sources: ResourceSource[]): Promise; + cancelFetching(...sources: ResourceSource[]): Promise; + listDownloadedFiles(): Promise; + listDownloadedModels(): Promise; + deleteResources(...sources: ResourceSource[]): Promise; + getFilesTotalSize(...sources: ResourceSource[]): Promise; + handleObject(source: ResourceSource): Promise; + handleLocalFile(source: ResourceSource): string; + handleReleaseModeFile( + sourceExtended: ResourceSourceExtended + ): Promise; + handleDevModeFile( + sourceExtended: ResourceSourceExtended + ): Promise; + handleRemoteFile( + sourceExtended: ResourceSourceExtended + ): Promise; +} + +export const BareResourceFetcher: BareResourceFetcherInterface = { + downloads: new Map(), //map of currently downloading (or paused) files, if the download was started by .fetch() method. + + async fetch( + callback: (downloadProgress: number) => void = () => {}, + ...sources: ResourceSource[] + ) { + if (sources.length === 0) { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidUserInput, + 'Empty list given as an argument' + ); + } + const { results: info, totalLength } = + await ResourceFetcherUtils.getFilesSizes(sources); + const head: ResourceSourceExtended = { + source: info[0]!.source, + sourceType: info[0]!.type, + callback: + info[0]!.type === SourceType.REMOTE_FILE + ? ResourceFetcherUtils.calculateDownloadProgress( + totalLength, + info[0]!.previousFilesTotalLength, + info[0]!.length, + callback + ) + : () => {}, + results: [], + }; + + let node = head; + for (let idx = 1; idx < sources.length; idx++) { + node.next = { + source: info[idx]!.source, + sourceType: info[idx]!.type, + callback: + info[idx]!.type === SourceType.REMOTE_FILE + ? ResourceFetcherUtils.calculateDownloadProgress( + totalLength, + info[idx]!.previousFilesTotalLength, + info[idx]!.length, + callback + ) + : () => {}, + results: [], + }; + node = node.next; + } + return this.singleFetch(head); + }, + + async singleFetch( + sourceExtended: ResourceSourceExtended + ): Promise { + const source = sourceExtended.source; + switch (sourceExtended.sourceType) { + case SourceType.OBJECT: { + return this.returnOrStartNext( + sourceExtended, + await this.handleObject(source) + ); + } + case SourceType.LOCAL_FILE: { + return this.returnOrStartNext( + sourceExtended, + this.handleLocalFile(source) + ); + } + case SourceType.RELEASE_MODE_FILE: { + return this.returnOrStartNext( + sourceExtended, + await this.handleReleaseModeFile(sourceExtended) + ); + } + case SourceType.DEV_MODE_FILE: { + const result = await this.handleDevModeFile(sourceExtended); + if (result !== null) { + return this.returnOrStartNext(sourceExtended, result); + } + return null; + } + default: { + //case SourceType.REMOTE_FILE + const result = await this.handleRemoteFile(sourceExtended); + if (result !== null) { + return this.returnOrStartNext(sourceExtended, result); + } + return null; + } + } + }, + + //if any download ends successfully this function is called - it checks whether it should trigger next download or return list of paths. + returnOrStartNext(sourceExtended: ResourceSourceExtended, result: string) { + sourceExtended.results.push(result); + + if (sourceExtended.next) { + const nextSource = sourceExtended.next; + nextSource.results.push(...sourceExtended.results); + return this.singleFetch(nextSource); + } + sourceExtended.callback!(1); + return sourceExtended.results; + }, + + async pause(source: ResourceSource) { + const resource = this.downloads.get(source); + if (!resource) { + throw new RnExecutorchError( + RnExecutorchErrorCode.NotFound, + 'No active download found for the given source' + ); + } + switch (resource.status) { + case DownloadStatus.PAUSED: + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherAlreadyPaused, + "The file download is currently paused. Can't pause the download of the same file twice." + ); + default: { + resource.status = DownloadStatus.PAUSED; + resource.task.pause(); + } + } + }, + + async resume(source: ResourceSource) { + const resource = this.downloads.get(source)!; + if ( + !resource.extendedInfo.fileUri || + !resource.extendedInfo.cacheFileUri || + !resource.extendedInfo.uri + ) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherMissingUri, + 'Something went wrong. File uri info is not specified' + ); + } + switch (resource.status) { + case DownloadStatus.ONGOING: + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherAlreadyOngoing, + "The file download is currently ongoing. Can't resume the ongoing download." + ); + default: { + resource.status = DownloadStatus.ONGOING; + resource.task.resume(); + + return new Promise((resolve, reject) => { + resource.task + .done(async () => { + const result = await this.completeDownload( + resource.extendedInfo, + source + ); + resolve(result); + }) + .error((e) => { + reject(e); + }); + }); + } + } + }, + + async cancel(source: ResourceSource) { + const resource = this.downloads.get(source); + if (!resource) { + throw new RnExecutorchError( + RnExecutorchErrorCode.NotFound, + 'No active download found for the given source' + ); + } + resource.task.stop(); + this.downloads.delete(source); + }, + + async completeDownload( + extendedInfo: ResourceSourceExtended, + source: ResourceSource + ): Promise { + // Check if download was cancelled or paused + if ( + !this.downloads.has(source) || + this.downloads.get(source)!.status === DownloadStatus.PAUSED + ) { + return null; + } + + await RNFS.moveFile(extendedInfo.cacheFileUri!, extendedInfo.fileUri!); + this.downloads.delete(source); + ResourceFetcherUtils.triggerHuggingFaceDownloadCounter(extendedInfo.uri!); + + const filename = extendedInfo.fileUri!.split('/').pop(); + if (filename) { + await completeHandler(filename); + } + + const result = this.returnOrStartNext( + extendedInfo, + ResourceFetcherUtils.removeFilePrefix(extendedInfo.fileUri!) + ); + return result instanceof Promise ? await result : result; + }, + + async pauseFetching(...sources: ResourceSource[]) { + const source = this.findActive(sources); + await this.pause(source); + }, + + async resumeFetching(...sources: ResourceSource[]) { + const source = this.findActive(sources); + await this.resume(source); + }, + + async cancelFetching(...sources: ResourceSource[]) { + const source = this.findActive(sources); + await this.cancel(source); + }, + + findActive(sources: ResourceSource[]) { + for (const source of sources) { + if (this.downloads.has(source)) { + return source; + } + } + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherNotActive, + 'None of given sources are currently during downloading process.' + ); + }, + + async listDownloadedFiles() { + const files = await RNFS.readDir(RNEDirectory); + return files.map((file) => file.path); + }, + + async listDownloadedModels() { + const files = await this.listDownloadedFiles(); + return files.filter((file: string) => file.endsWith('.pte')); + }, + + async deleteResources(...sources: ResourceSource[]) { + for (const source of sources) { + const filename = ResourceFetcherUtils.getFilenameFromUri( + source as string + ); + const fileUri = `${RNEDirectory}${filename}`; + if (await ResourceFetcherUtils.checkFileExists(fileUri)) { + await RNFS.unlink(fileUri); + } + } + }, + + async getFilesTotalSize(...sources: ResourceSource[]) { + return (await ResourceFetcherUtils.getFilesSizes(sources)).totalLength; + }, + + async handleObject(source: ResourceSource) { + if (typeof source !== 'object') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be object' + ); + } + const jsonString = JSON.stringify(source); + const digest = ResourceFetcherUtils.hashObject(jsonString); + const filename = `${digest}.json`; + const path = `${RNEDirectory}${filename}`; + + if (await ResourceFetcherUtils.checkFileExists(path)) { + return ResourceFetcherUtils.removeFilePrefix(path); + } + + await ResourceFetcherUtils.createDirectoryIfNoExists(); + await RNFS.writeFile(path, jsonString, 'utf8'); + + return ResourceFetcherUtils.removeFilePrefix(path); + }, + + handleLocalFile(source: ResourceSource) { + if (typeof source !== 'string') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be string' + ); + } + return ResourceFetcherUtils.removeFilePrefix(source); + }, + + async handleReleaseModeFile(sourceExtended: ResourceSourceExtended) { + const source = sourceExtended.source; + if (typeof source !== 'number') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be number' + ); + } + const assetSource = Image.resolveAssetSource(source); + const uri = assetSource.uri; + const filename = ResourceFetcherUtils.getFilenameFromUri(uri); + const fileUri = `${RNEDirectory}${filename}`; + + if (await ResourceFetcherUtils.checkFileExists(fileUri)) { + return ResourceFetcherUtils.removeFilePrefix(fileUri); + } + await ResourceFetcherUtils.createDirectoryIfNoExists(); + + if (uri.startsWith('http') || uri.startsWith('file')) { + await RNFS.copyFile(uri, fileUri); + } + return ResourceFetcherUtils.removeFilePrefix(fileUri); + }, + + async handleDevModeFile(sourceExtended: ResourceSourceExtended) { + const source = sourceExtended.source; + if (typeof source !== 'number') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be a number' + ); + } + sourceExtended.uri = Image.resolveAssetSource(source).uri; + return await this.handleRemoteFile(sourceExtended); + }, + + async handleRemoteFile(sourceExtended: ResourceSourceExtended) { + const source = sourceExtended.source; + if (typeof source === 'object') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be a string or a number' + ); + } + if (this.downloads.has(source)) { + const resource = this.downloads.get(source)!; + if (resource.status === DownloadStatus.PAUSED) { + // if the download is paused, `fetch` is treated like `resume` + return this.resume(source); + } + // if the download is ongoing, throw error. + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherDownloadInProgress, + 'Already downloading this file' + ); + } + if (typeof source === 'number' && !sourceExtended.uri) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherMissingUri, + 'Source Uri is expected to be available here' + ); + } + if (typeof source === 'string') { + sourceExtended.uri = source; + } + const uri = sourceExtended.uri!; + const filename = ResourceFetcherUtils.getFilenameFromUri(uri); + sourceExtended.fileUri = `${RNEDirectory}${filename}`; + sourceExtended.cacheFileUri = `${RNFS.CachesDirectoryPath}/${filename}`; + + if (await ResourceFetcherUtils.checkFileExists(sourceExtended.fileUri)) { + return ResourceFetcherUtils.removeFilePrefix(sourceExtended.fileUri); + } + await ResourceFetcherUtils.createDirectoryIfNoExists(); + + return new Promise((resolve, reject) => { + const task = createDownloadTask({ + id: filename, + url: uri, + destination: sourceExtended.cacheFileUri!, + }) + .begin((_: BeginHandlerParams) => { + sourceExtended.callback!(0); + }) + .progress((progress: ProgressHandlerParams) => { + sourceExtended.callback!( + progress.bytesDownloaded / progress.bytesTotal + ); + }) + .done(async () => { + const nextResult = await this.completeDownload( + sourceExtended, + source + ); + resolve(nextResult); + }) + .error((error) => { + this.downloads.delete(source); + reject( + new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherDownloadFailed, + `Failed to fetch resource from '${source}', context: ${error}` + ) + ); + }); + + // Start the download task + task.start(); + + const downloadResource: DownloadResource = { + task: task, + status: DownloadStatus.ONGOING, + extendedInfo: sourceExtended, + }; + this.downloads.set(source, downloadResource); + }); + }, + + async readAsString(path: string) { + return await RNFS.readFile(path, 'utf8'); + }, +}; diff --git a/packages/bare-resource-fetcher/src/ResourceFetcherUtils.ts b/packages/bare-resource-fetcher/src/ResourceFetcherUtils.ts new file mode 100644 index 000000000..681c6e3b4 --- /dev/null +++ b/packages/bare-resource-fetcher/src/ResourceFetcherUtils.ts @@ -0,0 +1,102 @@ +import { RNEDirectory } from './constants/directories'; +import { + ResourceSource, + Logger, + ResourceFetcherUtils as CoreUtils, + HTTP_CODE, + DownloadStatus, + SourceType, + ResourceSourceExtended, + RnExecutorchError, + RnExecutorchErrorCode, +} from 'react-native-executorch'; +import { Image } from 'react-native'; +import * as RNFS from '@dr.pogodin/react-native-fs'; + +export { HTTP_CODE, DownloadStatus, SourceType }; +export type { ResourceSourceExtended }; + +export namespace ResourceFetcherUtils { + export const removeFilePrefix = CoreUtils.removeFilePrefix; + export const hashObject = CoreUtils.hashObject; + export const calculateDownloadProgress = CoreUtils.calculateDownloadProgress; + export const triggerHuggingFaceDownloadCounter = + CoreUtils.triggerHuggingFaceDownloadCounter; + export const getFilenameFromUri = CoreUtils.getFilenameFromUri; + + export function getType(source: ResourceSource): SourceType { + if (typeof source === 'object') { + return SourceType.OBJECT; + } else if (typeof source === 'number') { + const uri = Image.resolveAssetSource(source).uri; + if (uri.startsWith('http')) { + return SourceType.DEV_MODE_FILE; + } + return SourceType.RELEASE_MODE_FILE; + } + // typeof source == 'string' + if (source.startsWith('file://')) { + return SourceType.LOCAL_FILE; + } + return SourceType.REMOTE_FILE; + } + + export async function getFilesSizes(sources: ResourceSource[]) { + const results: Array<{ + source: ResourceSource; + type: SourceType; + length: number; + previousFilesTotalLength: number; + }> = []; + let totalLength = 0; + let previousFilesTotalLength = 0; + for (const source of sources) { + const type = ResourceFetcherUtils.getType(source); + let length = 0; + try { + if (type === SourceType.REMOTE_FILE && typeof source === 'string') { + const response = await fetch(source, { method: 'HEAD' }); + if (!response.ok) { + Logger.warn( + `Failed to fetch HEAD for ${source}: ${response.status}` + ); + continue; + } + + const contentLength = response.headers.get('content-length'); + if (!contentLength) { + Logger.warn(`No content-length header for ${source}`); + } + + length = contentLength ? parseInt(contentLength, 10) : 0; + previousFilesTotalLength = totalLength; + totalLength += length; + } + } catch (error) { + Logger.warn(`Error fetching HEAD for ${source}:`, error); + continue; + } finally { + results.push({ source, type, length, previousFilesTotalLength }); + } + } + return { results, totalLength }; + } + + export async function createDirectoryIfNoExists() { + if (!(await checkFileExists(RNEDirectory))) { + try { + await RNFS.mkdir(RNEDirectory); + } catch (error) { + throw new RnExecutorchError( + RnExecutorchErrorCode.AccessFailed, + `Failed to create directory at ${RNEDirectory}`, + error + ); + } + } + } + + export async function checkFileExists(fileUri: string) { + return await RNFS.exists(fileUri); + } +} diff --git a/packages/bare-resource-fetcher/src/constants/directories.ts b/packages/bare-resource-fetcher/src/constants/directories.ts new file mode 100644 index 000000000..4ba8b8401 --- /dev/null +++ b/packages/bare-resource-fetcher/src/constants/directories.ts @@ -0,0 +1,3 @@ +import { directories } from '@kesha-antonov/react-native-background-downloader'; + +export const RNEDirectory = `${directories.documents}/react-native-executorch/`; diff --git a/packages/bare-resource-fetcher/src/index.ts b/packages/bare-resource-fetcher/src/index.ts new file mode 100644 index 000000000..c0ec4024f --- /dev/null +++ b/packages/bare-resource-fetcher/src/index.ts @@ -0,0 +1 @@ +export * from './ResourceFetcher'; diff --git a/packages/bare-resource-fetcher/tsconfig.json b/packages/bare-resource-fetcher/tsconfig.json new file mode 100644 index 000000000..cadd2509a --- /dev/null +++ b/packages/bare-resource-fetcher/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "declaration": true, + "declarationMap": true, + "tsBuildInfoFile": "./lib/typescript/tsconfig.tsbuildinfo", + "composite": true, + "allowJs": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noStrictGenericChecks": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noUncheckedIndexedAccess": true, + "strict": true, + "types": ["react", "node"] + }, + "include": ["src"], + "exclude": ["node_modules", "lib"] +} diff --git a/packages/expo-resource-fetcher/README.md b/packages/expo-resource-fetcher/README.md new file mode 100644 index 000000000..279853434 --- /dev/null +++ b/packages/expo-resource-fetcher/README.md @@ -0,0 +1,30 @@ +# @react-native-executorch/expo-resource-fetcher + +Expo adapter for `react-native-executorch` that provides resource fetching capabilities using Expo's filesystem APIs. + +## Installation + +```bash +yarn add @react-native-executorch/expo-resource-fetcher +yarn add expo-file-system expo-asset +``` + +## Usage + +```typescript +import { initExecutorch } from 'react-native-executorch'; +import { ExpoResourceFetcher } from '@react-native-executorch/expo-resource-fetcher'; + +initExecutorch({ + resourceFetcher: ExpoResourceFetcher, +}); +``` + +## When to Use + +Use this adapter if you're working with: +- Expo projects +- Expo Router projects +- Projects using Expo managed workflow + +This adapter leverages `expo-file-system` and `expo-asset` to handle file operations and downloads. diff --git a/packages/expo-resource-fetcher/package.json b/packages/expo-resource-fetcher/package.json new file mode 100644 index 000000000..7cf89487f --- /dev/null +++ b/packages/expo-resource-fetcher/package.json @@ -0,0 +1,45 @@ +{ + "name": "@react-native-executorch/expo-resource-fetcher", + "version": "0.1.0", + "description": "Expo resource fetcher for react-native-executorch", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "exports": { + ".": { + "import": "./lib/index.js", + "types": "./lib/index.d.ts" + } + }, + "files": [ + "lib" + ], + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/software-mansion/react-native-executorch.git", + "directory": "packages/expo-resource-fetcher" + }, + "scripts": { + "prepare": "tsc", + "typecheck": "tsc --noEmit", + "lint": "eslint \"**/*.{js,ts,tsx}\"", + "clean": "del-cli lib" + }, + "peerDependencies": { + "expo": ">=54.0.0", + "expo-asset": "^12.0.0", + "expo-file-system": "^19.0.0", + "react-native": "*", + "react-native-executorch": "*" + }, + "devDependencies": { + "@types/react": "~19.1.10", + "expo": "^54.0.0", + "expo-asset": "12.0.11", + "expo-file-system": "^19.0.20", + "react": "19.1.0", + "react-native": "0.81.5", + "react-native-executorch": "workspace:*", + "typescript": "~5.9.2" + } +} diff --git a/packages/expo-resource-fetcher/src/ResourceFetcher.ts b/packages/expo-resource-fetcher/src/ResourceFetcher.ts new file mode 100644 index 000000000..28baa87fc --- /dev/null +++ b/packages/expo-resource-fetcher/src/ResourceFetcher.ts @@ -0,0 +1,462 @@ +import { + cacheDirectory, + copyAsync, + createDownloadResumable, + moveAsync, + FileSystemSessionType, + writeAsStringAsync, + EncodingType, + deleteAsync, + readDirectoryAsync, + readAsStringAsync, +} from 'expo-file-system/legacy'; +import { Asset } from 'expo-asset'; +import { Platform } from 'react-native'; +import { RNEDirectory } from './constants/directories'; +import { + ResourceSource, + ResourceFetcherAdapter, + RnExecutorchErrorCode, + RnExecutorchError, +} from 'react-native-executorch'; +import { + ResourceFetcherUtils, + HTTP_CODE, + DownloadStatus, + SourceType, + ResourceSourceExtended, + DownloadResource, +} from './ResourceFetcherUtils'; + +interface ExpoResourceFetcherInterface extends ResourceFetcherAdapter { + downloads: Map; + singleFetch(sourceExtended: ResourceSourceExtended): Promise; + returnOrStartNext( + sourceExtended: ResourceSourceExtended, + result: string | string[] + ): string[] | Promise; + pause(source: ResourceSource): Promise; + resume(source: ResourceSource): Promise; + cancel(source: ResourceSource): Promise; + findActive(sources: ResourceSource[]): ResourceSource; + pauseFetching(...sources: ResourceSource[]): Promise; + resumeFetching(...sources: ResourceSource[]): Promise; + cancelFetching(...sources: ResourceSource[]): Promise; + listDownloadedFiles(): Promise; + listDownloadedModels(): Promise; + deleteResources(...sources: ResourceSource[]): Promise; + getFilesTotalSize(...sources: ResourceSource[]): Promise; + handleObject(source: ResourceSource): Promise; + handleLocalFile(source: ResourceSource): string; + handleReleaseModeFile( + sourceExtended: ResourceSourceExtended + ): Promise; + handleDevModeFile( + sourceExtended: ResourceSourceExtended + ): Promise; + handleRemoteFile( + sourceExtended: ResourceSourceExtended + ): Promise; +} + +export const ExpoResourceFetcher: ExpoResourceFetcherInterface = { + downloads: new Map(), //map of currently downloading (or paused) files, if the download was started by .fetch() method. + + async fetch( + callback: (downloadProgress: number) => void = () => {}, + ...sources: ResourceSource[] + ) { + if (sources.length === 0) { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidUserInput, + 'Empty list given as an argument' + ); + } + const { results: info, totalLength } = + await ResourceFetcherUtils.getFilesSizes(sources); + const head: ResourceSourceExtended = { + source: info[0]!.source, + sourceType: info[0]!.type, + callback: + info[0]!.type === SourceType.REMOTE_FILE + ? ResourceFetcherUtils.calculateDownloadProgress( + totalLength, + info[0]!.previousFilesTotalLength, + info[0]!.length, + callback + ) + : () => {}, + results: [], + }; + + let node = head; + for (let idx = 1; idx < sources.length; idx++) { + node.next = { + source: info[idx]!.source, + sourceType: info[idx]!.type, + callback: + info[idx]!.type === SourceType.REMOTE_FILE + ? ResourceFetcherUtils.calculateDownloadProgress( + totalLength, + info[idx]!.previousFilesTotalLength, + info[idx]!.length, + callback + ) + : () => {}, + results: [], + }; + node = node.next; + } + return this.singleFetch(head); + }, + + async singleFetch( + sourceExtended: ResourceSourceExtended + ): Promise { + const source = sourceExtended.source; + switch (sourceExtended.sourceType) { + case SourceType.OBJECT: { + return this.returnOrStartNext( + sourceExtended, + await this.handleObject(source) + ); + } + case SourceType.LOCAL_FILE: { + return this.returnOrStartNext( + sourceExtended, + this.handleLocalFile(source) + ); + } + case SourceType.RELEASE_MODE_FILE: { + return this.returnOrStartNext( + sourceExtended, + await this.handleReleaseModeFile(sourceExtended) + ); + } + case SourceType.DEV_MODE_FILE: { + const result = await this.handleDevModeFile(sourceExtended); + if (result !== null) { + return this.returnOrStartNext(sourceExtended, result); + } + return null; + } + default: { + //case SourceType.REMOTE_FILE + const result = await this.handleRemoteFile(sourceExtended); + if (result !== null) { + return this.returnOrStartNext(sourceExtended, result); + } + return null; + } + } + }, + + //if any download ends successfully this function is called - it checks whether it should trigger next download or return list of paths. + returnOrStartNext(sourceExtended: ResourceSourceExtended, result: string) { + sourceExtended.results.push(result); + + if (sourceExtended.next) { + const nextSource = sourceExtended.next; + nextSource.results.push(...sourceExtended.results); + return this.singleFetch(nextSource); + } + sourceExtended.callback!(1); + return sourceExtended.results; + }, + + async pause(source: ResourceSource) { + const resource = this.downloads.get(source)!; + switch (resource.status) { + case DownloadStatus.PAUSED: + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherAlreadyPaused, + "The file download is currently paused. Can't pause the download of the same file twice." + ); + default: { + resource.status = DownloadStatus.PAUSED; + await resource.downloadResumable.pauseAsync(); + } + } + }, + + async resume(source: ResourceSource) { + const resource = this.downloads.get(source)!; + if ( + !resource.extendedInfo.fileUri || + !resource.extendedInfo.cacheFileUri || + !resource.extendedInfo.uri + ) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherMissingUri, + 'Something went wrong. File uri info is not specified' + ); + } + switch (resource.status) { + case DownloadStatus.ONGOING: + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherAlreadyOngoing, + "The file download is currently ongoing. Can't resume the ongoing download." + ); + default: { + resource.status = DownloadStatus.ONGOING; + const result = await resource.downloadResumable.resumeAsync(); + if ( + !this.downloads.has(source) || + this.downloads.get(source)!.status === DownloadStatus.PAUSED + ) { + //if canceled or paused after earlier resuming. + return null; + } + if ( + !result || + (result.status !== HTTP_CODE.OK && + result.status !== HTTP_CODE.PARTIAL_CONTENT) + ) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherDownloadFailed, + `Failed to fetch resource from '${resource.extendedInfo.uri}, context: ${result}'` + ); + } + await moveAsync({ + from: resource.extendedInfo.cacheFileUri, + to: resource.extendedInfo.fileUri, + }); + this.downloads.delete(source); + ResourceFetcherUtils.triggerHuggingFaceDownloadCounter( + resource.extendedInfo.uri + ); + + return this.returnOrStartNext( + resource.extendedInfo, + ResourceFetcherUtils.removeFilePrefix(resource.extendedInfo.fileUri) + ); + } + } + }, + + async cancel(source: ResourceSource) { + const resource = this.downloads.get(source)!; + await resource.downloadResumable.cancelAsync(); + this.downloads.delete(source); + }, + + async pauseFetching(...sources: ResourceSource[]) { + const source = this.findActive(sources); + await this.pause(source); + }, + + async resumeFetching(...sources: ResourceSource[]) { + const source = this.findActive(sources); + await this.resume(source); + }, + + async cancelFetching(...sources: ResourceSource[]) { + const source = this.findActive(sources); + await this.cancel(source); + }, + + findActive(sources: ResourceSource[]) { + for (const source of sources) { + if (this.downloads.has(source)) { + return source; + } + } + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherNotActive, + 'None of given sources are currently during downloading process.' + ); + }, + + async listDownloadedFiles() { + const files = await readDirectoryAsync(RNEDirectory); + return files.map((file: string) => `${RNEDirectory}${file}`); + }, + + async listDownloadedModels() { + const files = await this.listDownloadedFiles(); + return files.filter((file: string) => file.endsWith('.pte')); + }, + + async deleteResources(...sources: ResourceSource[]) { + for (const source of sources) { + const filename = ResourceFetcherUtils.getFilenameFromUri( + source as string + ); + const fileUri = `${RNEDirectory}${filename}`; + if (await ResourceFetcherUtils.checkFileExists(fileUri)) { + await deleteAsync(fileUri); + } + } + }, + + async getFilesTotalSize(...sources: ResourceSource[]) { + return (await ResourceFetcherUtils.getFilesSizes(sources)).totalLength; + }, + + async handleObject(source: ResourceSource) { + if (typeof source !== 'object') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be number' + ); + } + const jsonString = JSON.stringify(source); + const digest = ResourceFetcherUtils.hashObject(jsonString); + const filename = `${digest}.json`; + const path = `${RNEDirectory}${filename}`; + + if (await ResourceFetcherUtils.checkFileExists(path)) { + return ResourceFetcherUtils.removeFilePrefix(path); + } + + await ResourceFetcherUtils.createDirectoryIfNoExists(); + await writeAsStringAsync(path, jsonString, { + encoding: EncodingType.UTF8, + }); + + return ResourceFetcherUtils.removeFilePrefix(path); + }, + + handleLocalFile(source: ResourceSource) { + if (typeof source !== 'string') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be string' + ); + } + return ResourceFetcherUtils.removeFilePrefix(source); + }, + + async handleReleaseModeFile(sourceExtended: ResourceSourceExtended) { + const source = sourceExtended.source; + if (typeof source !== 'number') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be number' + ); + } + const asset = Asset.fromModule(source); + const uri = asset.uri; + const filename = ResourceFetcherUtils.getFilenameFromUri(uri); + const fileUri = `${RNEDirectory}${filename}`; + // On Android, file uri does not contain file extension, so we add it manually + const fileUriWithType = + Platform.OS === 'android' ? `${fileUri}.${asset.type}` : fileUri; + if (await ResourceFetcherUtils.checkFileExists(fileUri)) { + return ResourceFetcherUtils.removeFilePrefix(fileUri); + } + await ResourceFetcherUtils.createDirectoryIfNoExists(); + await copyAsync({ + from: asset.uri, + to: fileUriWithType, + }); + return ResourceFetcherUtils.removeFilePrefix(fileUriWithType); + }, + + async handleDevModeFile(sourceExtended: ResourceSourceExtended) { + const source = sourceExtended.source; + if (typeof source !== 'number') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be a number' + ); + } + sourceExtended.uri = Asset.fromModule(source).uri; + return await this.handleRemoteFile(sourceExtended); + }, + + async handleRemoteFile(sourceExtended: ResourceSourceExtended) { + const source = sourceExtended.source; + if (typeof source === 'object') { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidModelSource, + 'Source is expected to be a string or a number' + ); + } + if (this.downloads.has(source)) { + const resource = this.downloads.get(source)!; + if (resource.status === DownloadStatus.PAUSED) { + // if the download is paused, `fetch` is treated like `resume` + this.resume(source); + } + // if the download is ongoing, throw error. + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherDownloadInProgress, + 'Already downloading this file' + ); + } + if (typeof source === 'number' && !sourceExtended.uri) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherMissingUri, + 'Source Uri is expected to be available here' + ); + } + if (typeof source === 'string') { + sourceExtended.uri = source; + } + const uri = sourceExtended.uri!; + const filename = ResourceFetcherUtils.getFilenameFromUri(uri); + sourceExtended.fileUri = `${RNEDirectory}${filename}`; + sourceExtended.cacheFileUri = `${cacheDirectory}${filename}`; + + if (await ResourceFetcherUtils.checkFileExists(sourceExtended.fileUri)) { + return ResourceFetcherUtils.removeFilePrefix(sourceExtended.fileUri); + } + await ResourceFetcherUtils.createDirectoryIfNoExists(); + + const downloadResumable = createDownloadResumable( + uri, + sourceExtended.cacheFileUri, + { sessionType: FileSystemSessionType.BACKGROUND }, + ({ + totalBytesWritten, + totalBytesExpectedToWrite, + }: { + totalBytesWritten: number; + totalBytesExpectedToWrite: number; + }) => { + if (totalBytesExpectedToWrite === -1) { + // If totalBytesExpectedToWrite is -1, it means the server does not provide content length. + sourceExtended.callback!(0); + return; + } + sourceExtended.callback!(totalBytesWritten / totalBytesExpectedToWrite); + } + ); + //create value for the this.download Map + const downloadResource: DownloadResource = { + downloadResumable: downloadResumable, + status: DownloadStatus.ONGOING, + extendedInfo: sourceExtended, + }; + //add key-value pair to map + this.downloads.set(source, downloadResource); + const result = await downloadResumable.downloadAsync(); + if ( + !this.downloads.has(source) || + this.downloads.get(source)!.status === DownloadStatus.PAUSED + ) { + // if canceled or paused during the download + return null; + } + if (!result || result.status !== HTTP_CODE.OK) { + throw new RnExecutorchError( + RnExecutorchErrorCode.ResourceFetcherDownloadFailed, + `Failed to fetch resource from '${source}, context: ${result}'` + ); + } + await moveAsync({ + from: sourceExtended.cacheFileUri, + to: sourceExtended.fileUri, + }); + this.downloads.delete(source); + ResourceFetcherUtils.triggerHuggingFaceDownloadCounter(uri); + return ResourceFetcherUtils.removeFilePrefix(sourceExtended.fileUri); + }, + + async readAsString(path: string) { + // Expo needs URI + const uri = path.startsWith('file://') ? path : `file://${path}`; + return await readAsStringAsync(uri); + }, +}; diff --git a/packages/expo-resource-fetcher/src/ResourceFetcherUtils.ts b/packages/expo-resource-fetcher/src/ResourceFetcherUtils.ts new file mode 100644 index 000000000..1ff7c0e1b --- /dev/null +++ b/packages/expo-resource-fetcher/src/ResourceFetcherUtils.ts @@ -0,0 +1,116 @@ +import { RNEDirectory } from './constants/directories'; +import { + ResourceSource, + Logger, + ResourceFetcherUtils as CoreUtils, + HTTP_CODE, + DownloadStatus, + SourceType, + ResourceSourceExtended, + RnExecutorchError, + RnExecutorchErrorCode, +} from 'react-native-executorch'; +import { Asset } from 'expo-asset'; + +/** + * @internal + */ +import { + getInfoAsync, + makeDirectoryAsync, + type DownloadResumable, +} from 'expo-file-system/legacy'; + +export { HTTP_CODE, DownloadStatus, SourceType, ResourceSourceExtended }; + +export interface DownloadResource { + downloadResumable: DownloadResumable; + status: DownloadStatus; + extendedInfo: ResourceSourceExtended; +} + +export namespace ResourceFetcherUtils { + export const removeFilePrefix = CoreUtils.removeFilePrefix; + export const hashObject = CoreUtils.hashObject; + export const calculateDownloadProgress = CoreUtils.calculateDownloadProgress; + export const triggerHuggingFaceDownloadCounter = + CoreUtils.triggerHuggingFaceDownloadCounter; + export const getFilenameFromUri = CoreUtils.getFilenameFromUri; + + export function getType(source: ResourceSource): SourceType { + if (typeof source === 'object') { + return SourceType.OBJECT; + } else if (typeof source === 'number') { + const uri = Asset.fromModule(source).uri; + if (uri.startsWith('http')) { + return SourceType.DEV_MODE_FILE; + } + return SourceType.RELEASE_MODE_FILE; + } + // typeof source == 'string' + if (source.startsWith('file://')) { + return SourceType.LOCAL_FILE; + } + return SourceType.REMOTE_FILE; + } + + export async function getFilesSizes(sources: ResourceSource[]) { + const results: Array<{ + source: ResourceSource; + type: SourceType; + length: number; + previousFilesTotalLength: number; + }> = []; + let totalLength = 0; + let previousFilesTotalLength = 0; + for (const source of sources) { + const type = ResourceFetcherUtils.getType(source); + let length = 0; + try { + if (type === SourceType.REMOTE_FILE && typeof source === 'string') { + const response = await fetch(source, { method: 'HEAD' }); + if (!response.ok) { + Logger.warn( + `Failed to fetch HEAD for ${source}: ${response.status}` + ); + continue; + } + + const contentLength = response.headers.get('content-length'); + if (!contentLength) { + Logger.warn(`No content-length header for ${source}`); + } + + length = contentLength ? parseInt(contentLength, 10) : 0; + previousFilesTotalLength = totalLength; + totalLength += length; + } + } catch (error) { + Logger.warn(`Error fetching HEAD for ${source}:`, error); + continue; + } finally { + results.push({ source, type, length, previousFilesTotalLength }); + } + } + return { results, totalLength }; + } + + export async function createDirectoryIfNoExists() { + if (!(await checkFileExists(RNEDirectory))) { + try { + await makeDirectoryAsync(RNEDirectory, { intermediates: true }); + } catch (error) { + throw new RnExecutorchError( + RnExecutorchErrorCode.AccessFailed, + `Failed to create directory at ${RNEDirectory}`, + error + ); + } + } + } + + export async function checkFileExists(fileUri: string) { + const fileInfo = await getInfoAsync(fileUri); + return fileInfo.exists; + } +} diff --git a/packages/react-native-executorch/src/constants/directories.ts b/packages/expo-resource-fetcher/src/constants/directories.ts similarity index 100% rename from packages/react-native-executorch/src/constants/directories.ts rename to packages/expo-resource-fetcher/src/constants/directories.ts diff --git a/packages/expo-resource-fetcher/src/index.ts b/packages/expo-resource-fetcher/src/index.ts new file mode 100644 index 000000000..c0ec4024f --- /dev/null +++ b/packages/expo-resource-fetcher/src/index.ts @@ -0,0 +1 @@ +export * from './ResourceFetcher'; diff --git a/packages/expo-resource-fetcher/tsconfig.json b/packages/expo-resource-fetcher/tsconfig.json new file mode 100644 index 000000000..cadd2509a --- /dev/null +++ b/packages/expo-resource-fetcher/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "declaration": true, + "declarationMap": true, + "tsBuildInfoFile": "./lib/typescript/tsconfig.tsbuildinfo", + "composite": true, + "allowJs": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noStrictGenericChecks": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noUncheckedIndexedAccess": true, + "strict": true, + "types": ["react", "node"] + }, + "include": ["src"], + "exclude": ["node_modules", "lib"] +} diff --git a/packages/react-native-executorch/android/gradle.properties b/packages/react-native-executorch/android/gradle.properties index b30a8b11d..97cdd1854 100644 --- a/packages/react-native-executorch/android/gradle.properties +++ b/packages/react-native-executorch/android/gradle.properties @@ -1,5 +1,5 @@ RnExecutorch_kotlinVersion=1.7.0 -RnExecutorch_minSdkVersion=21 +RnExecutorch_minSdkVersion=26 RnExecutorch_targetSdkVersion=31 RnExecutorch_compileSdkVersion=31 -RnExecutorch_ndkversion=21.4.7075529 +RnExecutorch_ndkversion=21.4.7075529 \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h b/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h index 6ca7b8581..67748d716 100644 --- a/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h +++ b/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h @@ -9,27 +9,33 @@ namespace rnexecutorch { enum class RnExecutorchErrorCode : int32_t { /** - * An umbrella-error that is thrown usually when something unexpected happens, for example a 3rd-party library error. + * An umbrella-error that is thrown usually when something unexpected happens, + * for example a 3rd-party library error. */ UnknownError = 101, /** - * Thrown when a user tries to run a model that is not yet downloaded or loaded into memory. + * Thrown when a user tries to run a model that is not yet downloaded or + * loaded into memory. */ ModuleNotLoaded = 102, /** - * An error ocurred when saving a file. This could be, for instance a result image from an image model. + * An error ocurred when saving a file. This could be, for instance a result + * image from an image model. */ FileWriteFailed = 103, /** - * Thrown when a user tries to run a model that is currently processing. It is only allowed to run a single model prediction at a time. + * Thrown when a user tries to run a model that is currently processing. It is + * only allowed to run a single model prediction at a time. */ ModelGenerating = 104, /** - * Thrown when a language is passed to a multi-language model that is not supported. For example OCR or Speech To Text. + * Thrown when a language is passed to a multi-language model that is not + * supported. For example OCR or Speech To Text. */ LanguageNotSupported = 105, /** - * Thrown when config parameters passed to a model are invalid. For example, when LLM's topp is outside of range [0, 1]. + * Thrown when config parameters passed to a model are invalid. For example, + * when LLM's topp is outside of range [0, 1]. */ InvalidConfig = 112, /** @@ -37,7 +43,8 @@ enum class RnExecutorchErrorCode : int32_t { */ InvalidModelSource = 255, /** - * Thrown when the number of passed inputs to the model is different than the model metadata specifies. + * Thrown when the number of passed inputs to the model is different than the + * model metadata specifies. */ UnexpectedNumInputs = 97, /** @@ -45,7 +52,8 @@ enum class RnExecutorchErrorCode : int32_t { */ ThreadPoolError = 113, /** - * Thrown when a file read operation failed. This could be invalid image url passed to image models, or unsupported format. + * Thrown when a file read operation failed. This could be invalid image url + * passed to image models, or unsupported format. */ FileReadFailed = 114, /** @@ -53,7 +61,8 @@ enum class RnExecutorchErrorCode : int32_t { */ InvalidModelOutput = 115, /** - * Thrown when the dimensions of input tensors don't match the model's expected dimensions. + * Thrown when the dimensions of input tensors don't match the model's + * expected dimensions. */ WrongDimensions = 116, /** @@ -62,7 +71,8 @@ enum class RnExecutorchErrorCode : int32_t { */ InvalidUserInput = 117, /** - * Thrown when the number of downloaded files is unexpected, due to download interruptions. + * Thrown when the number of downloaded files is unexpected, due to download + * interruptions. */ DownloadInterrupted = 118, /** @@ -75,19 +85,23 @@ enum class RnExecutorchErrorCode : int32_t { */ MultilingualConfiguration = 160, /** - * Thrown when streaming transcription is attempted but audio data chunk is missing. + * Thrown when streaming transcription is attempted but audio data chunk is + * missing. */ MissingDataChunk = 161, /** - * Thrown when trying to stop or insert data into a stream that hasn't been started. + * Thrown when trying to stop or insert data into a stream that hasn't been + * started. */ StreamingNotStarted = 162, /** - * Thrown when trying to start a new streaming session while another is already in progress. + * Thrown when trying to start a new streaming session while another is + * already in progress. */ StreamingInProgress = 163, /** - * Thrown when a resource fails to download. This could be due to invalid URL, or for example a network problem. + * Thrown when a resource fails to download. This could be due to invalid URL, + * or for example a network problem. */ ResourceFetcherDownloadFailed = 180, /** @@ -103,7 +117,8 @@ enum class RnExecutorchErrorCode : int32_t { */ ResourceFetcherAlreadyOngoing = 183, /** - * Thrown when trying to pause, resume, or cancel a download that is not active. + * Thrown when trying to pause, resume, or cancel a download that is not + * active. */ ResourceFetcherNotActive = 184, /** diff --git a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.cpp b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.cpp index 7a4426e06..8f9fbb041 100644 --- a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -10,9 +11,9 @@ #include #include #include -#include #include #include +#include #include #include #include diff --git a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h index d5c98763d..d299e34d1 100644 --- a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h +++ b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h @@ -40,7 +40,7 @@ class RnExecutorchInstaller { const jsi::Value *args, size_t count) -> jsi::Value { constexpr std::size_t expectedCount = std::tuple_size_v< typename meta::ConstructorTraits::arg_types>; - // count doesn't account for the JSCallInvoker + if (count != expectedCount - 1) { char errorMessage[100]; std::snprintf( @@ -54,8 +54,16 @@ class RnExecutorchInstaller { meta::createConstructorArgsWithCallInvoker( args, runtime, jsCallInvoker); - auto modelImplementationPtr = std::make_shared( - std::make_from_tuple(constructorArgs)); + // This unpacks the tuple and calls the constructor directly inside + // make_shared. It avoids creating a temporary object, so no + // move/copy is required. + auto modelImplementationPtr = std::apply( + [](auto &&...unpackedArgs) { + return std::make_shared( + std::forward(unpackedArgs)...); + }, + std::move(constructorArgs)); + auto modelHostObject = std::make_shared>( modelImplementationPtr, jsCallInvoker); diff --git a/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h b/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h index 2baf922db..59e598d11 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -24,7 +25,9 @@ namespace rnexecutorch::jsi_conversion { using namespace facebook; -// Conversion from jsi to C++ types -------------------------------------------- +// ========================================================================= +// Conversion from jsi to C++ types (Input) +// ========================================================================= template T getValue(const jsi::Value &val, jsi::Runtime &runtime); @@ -50,7 +53,6 @@ inline std::u32string getValue(const jsi::Value &val, jsi::Runtime &runtime) { std::string utf8 = getValue(val, runtime); std::wstring_convert, char32_t> conv; - return conv.from_bytes(utf8); } @@ -118,8 +120,7 @@ inline JSTensorViewIn getValue(const jsi::Value &val, return tensorView; } -// C++ set from JS array. Set with heterogenerous look-up (adding std::less<> -// enables querying with std::string_view). +// C++ set from JS array template <> inline std::set> getValue>>(const jsi::Value &val, @@ -218,6 +219,7 @@ getValue>(const jsi::Value &val, jsi::Runtime &runtime) { return getArrayAsVector(val, runtime); } +// ✅ Fix: Add support for uint64_t vectors (fixes Undefined Symbol error) template <> inline std::vector getValue>(const jsi::Value &val, jsi::Runtime &runtime) { @@ -279,17 +281,16 @@ inline std::span getValue>(const jsi::Value &val, return getTypedArrayAsSpan(val, runtime); } +// ✅ Fix: Add support for uint64_t spans (fixes Undefined Symbol error) template <> inline std::span getValue>(const jsi::Value &val, jsi::Runtime &runtime) { return getTypedArrayAsSpan(val, runtime); } -// Conversion from C++ types to jsi -------------------------------------------- - -// Implementation functions might return any type, but in a promise we can only -// return jsi::Value or jsi::Object. For each type being returned -// we add a function here. +// ========================================================================= +// Conversion from C++ types to jsi (Output) +// ========================================================================= inline jsi::Value getJsiValue(std::shared_ptr valuePtr, jsi::Runtime &runtime) { @@ -305,16 +306,16 @@ inline jsi::Value getJsiValue(const std::vector &vec, return {runtime, array}; } -inline jsi::Value getJsiValue(const std::vector &vec, +inline jsi::Value getJsiValue(const std::vector &vec, jsi::Runtime &runtime) { jsi::Array array(runtime, vec.size()); for (size_t i = 0; i < vec.size(); i++) { - array.setValueAtIndex(runtime, i, jsi::Value(static_cast(vec[i]))); + array.setValueAtIndex(runtime, i, jsi::Value(vec[i])); } return {runtime, array}; } -inline jsi::Value getJsiValue(const std::vector &vec, +inline jsi::Value getJsiValue(const std::vector &vec, jsi::Runtime &runtime) { jsi::Array array(runtime, vec.size()); for (size_t i = 0; i < vec.size(); i++) { @@ -323,47 +324,32 @@ inline jsi::Value getJsiValue(const std::vector &vec, return {runtime, array}; } -inline jsi::Value getJsiValue(const std::vector &vec, +// ✅ Fix: Add support for uint64_t (unsigned long long) vectors +// This fixes the error in TokenizerModule::encode/decode +inline jsi::Value getJsiValue(const std::vector &vec, jsi::Runtime &runtime) { jsi::Array array(runtime, vec.size()); for (size_t i = 0; i < vec.size(); i++) { - array.setValueAtIndex(runtime, i, - jsi::String::createFromUtf8(runtime, vec[i])); + // JS numbers are doubles. Large uint64s > 2^53 will lose precision. + array.setValueAtIndex(runtime, i, jsi::Value(static_cast(vec[i]))); } return {runtime, array}; } -inline jsi::Value getJsiValue(const std::vector &vec, +// ✅ Fix: Add support for int64_t vectors +inline jsi::Value getJsiValue(const std::vector &vec, jsi::Runtime &runtime) { jsi::Array array(runtime, vec.size()); for (size_t i = 0; i < vec.size(); i++) { - array.setValueAtIndex(runtime, i, jsi::Value(vec[i])); + array.setValueAtIndex(runtime, i, jsi::Value(static_cast(vec[i]))); } return {runtime, array}; } -// Conditional as on android, size_t and uint64_t reduce to the same type, -// introducing ambiguity -template && - !std::is_same_v>> -inline jsi::Value getJsiValue(T val, jsi::Runtime &runtime) { - return jsi::Value(static_cast(val)); -} - -inline jsi::Value getJsiValue(uint64_t val, jsi::Runtime &runtime) { - jsi::BigInt bigInt = jsi::BigInt::fromUint64(runtime, val); - return {runtime, bigInt}; -} - inline jsi::Value getJsiValue(int val, jsi::Runtime &runtime) { return {runtime, val}; } -inline jsi::Value getJsiValue(bool val, jsi::Runtime &runtime) { - return jsi::Value(val); -} - inline jsi::Value getJsiValue(const std::shared_ptr &buf, jsi::Runtime &runtime) { jsi::ArrayBuffer arrayBuffer(runtime, buf); @@ -401,7 +387,7 @@ inline jsi::Value getJsiValue(const std::vector &vec, } inline jsi::Value getJsiValue(const std::string &str, jsi::Runtime &runtime) { - return jsi::String::createFromUtf8(runtime, str); + return jsi::String::createFromAscii(runtime, str); } inline jsi::Value @@ -483,4 +469,39 @@ getJsiValue(const std::vector return jsiSegments; } +// ✅ Fix: Use 'const &' to match template expansion rules +inline jsi::Value +getJsiValue(const models::image_segmentation::types::SegmentationResult &result, + jsi::Runtime &runtime) { + + // Handle empty result (e.g. dropped frame) + if (!result.argmax || !result.buffers) { + return jsi::Value::undefined(); + } + + jsi::Object dict(runtime); + + // 1. Create Argmax + auto argmaxBuf = jsi::ArrayBuffer(runtime, result.argmax); + auto int32Ctor = + runtime.global().getPropertyAsFunction(runtime, "Int32Array"); + auto int32Arr = + int32Ctor.callAsConstructor(runtime, argmaxBuf).getObject(runtime); + dict.setProperty(runtime, "ARGMAX", int32Arr); + + // 2. Create Class Arrays + for (auto &[label, buffer] : *result.buffers) { + auto floatBuf = jsi::ArrayBuffer(runtime, buffer); + auto floatCtor = + runtime.global().getPropertyAsFunction(runtime, "Float32Array"); + auto floatArr = + floatCtor.callAsConstructor(runtime, floatBuf).getObject(runtime); + + dict.setProperty( + runtime, jsi::String::createFromAscii(runtime, label.data()), floatArr); + } + + return jsi::Value(std::move(dict)); +} + } // namespace rnexecutorch::jsi_conversion diff --git a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h index a1ce8e8e8..e2f3e50a5 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -17,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -45,10 +47,11 @@ template class ModelHostObject : public JsiHostObject { "getInputShape")); } - if constexpr (meta::HasGenerate) { - addFunctions(JSI_EXPORT_FUNCTION(ModelHostObject, - promiseHostFunction<&Model::generate>, - "generate")); + if constexpr (meta::HasGenerateFromString) { + addFunctions( + JSI_EXPORT_FUNCTION(ModelHostObject, + promiseHostFunction<&Model::generateFromString>, + "generateFromString")); } if constexpr (meta::HasEncode) { @@ -107,11 +110,6 @@ template class ModelHostObject : public JsiHostObject { synchronousHostFunction<&Model::getGeneratedTokenCount>, "getGeneratedTokenCount")); - addFunctions(JSI_EXPORT_FUNCTION( - ModelHostObject, - synchronousHostFunction<&Model::getPromptTokenCount>, - "getPromptTokenCount")); - addFunctions( JSI_EXPORT_FUNCTION(ModelHostObject, synchronousHostFunction<&Model::setCountInterval>, @@ -155,14 +153,29 @@ template class ModelHostObject : public JsiHostObject { addFunctions(JSI_EXPORT_FUNCTION(ModelHostObject, promiseHostFunction<&Model::stream>, "stream")); + // addFunctions(JSI_EXPORT_FUNCTION( + // ModelHostObject, promiseHostFunction<&Model::setFixedModel>, + // "setFixedModel")); + } + + // Register generateFromFrame for all VisionModel subclasses + if constexpr (meta::DerivedFromOrSameAs) { addFunctions(JSI_EXPORT_FUNCTION( - ModelHostObject, synchronousHostFunction<&Model::streamStop>, - "streamStop")); + ModelHostObject, visionHostFunction<&Model::generateFromFrame>, + "generateFromFrame")); + } + + // Register generateFromPixels for models that support it + if constexpr (meta::HasGenerateFromPixels) { + addFunctions( + JSI_EXPORT_FUNCTION(ModelHostObject, + visionHostFunction<&Model::generateFromPixels>, + "generateFromPixels")); } } - // A generic host function that runs synchronously, works analogously to the - // generic promise host function. + // A generic host function that runs synchronously, works analogously to + // the generic promise host function. template JSI_HOST_FUNCTION(synchronousHostFunction) { constexpr std::size_t functionArgCount = meta::getArgumentCount(FnPtr); if (functionArgCount != count) { @@ -208,9 +221,70 @@ template class ModelHostObject : public JsiHostObject { } } + template JSI_HOST_FUNCTION(visionHostFunction) { + // 1. Check Argument Count + // (We rely on our new FunctionTraits) + constexpr std::size_t cppArgCount = + meta::FunctionTraits::arity; + + // We expect JS args = (Total C++ Args) - (2 injected args: Runtime + Value) + constexpr std::size_t expectedJsArgs = cppArgCount - 1; + log(LOG_LEVEL::Debug, cppArgCount, count); + if (count != expectedJsArgs) { + throw jsi::JSError(runtime, "Argument count mismatch in vision function"); + } + + try { + // 2. The Magic Trick 🪄 + // We get a pointer to a dummy function: void dummy(Rest...) {} + // This function has exactly the signature of the arguments we want to + // parse. + auto dummyFuncPtr = &meta::TailSignature::dummy; + + // 3. Let existing helpers do the work + // We pass the dummy pointer. The helper inspects its arguments (Rest...) + // and converts args[0]...args[N] accordingly. + // Note: We pass (args + 1) because JS args[0] is the PixelData, which we + // handle manually. Note: We use expectedJsArgs - 1 because we skipped one + // JS arg. + auto tailArgsTuple = + meta::createArgsTupleFromJsi(dummyFuncPtr, args + 1, runtime); + + // 4. Invoke + using ReturnType = + typename meta::FunctionTraits::return_type; + + if constexpr (std::is_void_v) { + std::apply( + [&](auto &&...tailArgs) { + (model.get()->*FnPtr)( + runtime, + args[0], // 1. PixelData (Manually passed) + std::forward( + tailArgs)...); // 2. The rest (Auto parsed) + }, + std::move(tailArgsTuple)); + return jsi::Value::undefined(); + } else { + auto result = std::apply( + [&](auto &&...tailArgs) { + return (model.get()->*FnPtr)( + runtime, args[0], + std::forward(tailArgs)...); + }, + std::move(tailArgsTuple)); + + return jsi_conversion::getJsiValue(std::move(result), runtime); + } + } catch (const std::exception &e) { + throw jsi::JSError(runtime, e.what()); + } + } + // A generic host function that resolves a promise with a result of a - // function. JSI arguments are converted to the types provided in the function - // signature, and the return value is converted back to JSI before resolving. + // function. JSI arguments are converted to the types provided in the + // function signature, and the return value is converted back to JSI + // before resolving. template JSI_HOST_FUNCTION(promiseHostFunction) { auto promise = Promise::createPromise( runtime, callInvoker, @@ -231,8 +305,8 @@ template class ModelHostObject : public JsiHostObject { meta::createArgsTupleFromJsi(FnPtr, args, runtime); // We need to dispatch a thread if we want the function to be - // asynchronous. In this thread all accesses to jsi::Runtime need to - // be done via the callInvoker. + // asynchronous. In this thread all accesses to jsi::Runtime + // need to be done via the callInvoker. threads::GlobalThreadPool::detach([this, promise, argsConverted = std::move(argsConverted)]() { @@ -240,16 +314,16 @@ template class ModelHostObject : public JsiHostObject { if constexpr (std::is_void_v) { - // For void functions, just call the function and resolve - // with undefined + // For void functions, just call the function and + // resolve with undefined std::apply(std::bind_front(FnPtr, model), std::move(argsConverted)); callInvoker->invokeAsync([promise](jsi::Runtime &runtime) { promise->resolve(jsi::Value::undefined()); }); } else { - // For non-void functions, capture the result and convert - // it + // For non-void functions, capture the result and + // convert it auto result = std::apply(std::bind_front(FnPtr, model), std::move(argsConverted)); // The result is copied. It should either be quickly @@ -277,8 +351,8 @@ template class ModelHostObject : public JsiHostObject { // This catch should be merged with the next two // (std::runtime_error and jsi::JSError inherits from // std::exception) HOWEVER react native has broken RTTI - // which breaks proper exception type checking. Remove when - // the following change is present in our version: + // which breaks proper exception type checking. Remove + // when the following change is present in our version: // https://github.com/facebook/react-native/commit/3132cc88dd46f95898a756456bebeeb6c248f20e callInvoker->invokeAsync([e = std::move(e), promise]() { promise->reject(std::string(e.what())); @@ -339,5 +413,4 @@ template class ModelHostObject : public JsiHostObject { std::shared_ptr model; std::shared_ptr callInvoker; }; - } // namespace rnexecutorch diff --git a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h index 8290a810b..29ed41d9d 100644 --- a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h +++ b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h @@ -3,12 +3,39 @@ #include #include #include +#include #include namespace rnexecutorch::meta { using namespace facebook; +// ========================================================================= +// 1. Function Traits (Extracts Arity, Return Type, Args) +// ========================================================================= + +template struct FunctionTraits; + +// Specialization for Member Functions +template +struct FunctionTraits { + static constexpr std::size_t arity = sizeof...(Args); + using return_type = R; + using args_tuple = std::tuple; +}; + +// Specialization for const Member Functions +template +struct FunctionTraits { + static constexpr std::size_t arity = sizeof...(Args); + using return_type = R; + using args_tuple = std::tuple; +}; + +// ========================================================================= +// 2. Argument Counting Helpers +// ========================================================================= + template constexpr std::size_t getArgumentCount(R (Model::*f)(Types...)) { return sizeof...(Types); @@ -19,6 +46,10 @@ constexpr std::size_t getArgumentCount(R (Model::*f)(Types...) const) { return sizeof...(Types); } +// ========================================================================= +// 3. JSI -> Tuple Conversion Logic +// ========================================================================= + template std::tuple fillTupleFromArgs(std::index_sequence, const jsi::Value *args, @@ -31,7 +62,6 @@ std::tuple fillTupleFromArgs(std::index_sequence, * arguments for method supplied with a pointer. The types in the tuple are * inferred from the method pointer. */ - template std::tuple createArgsTupleFromJsi(R (Model::*f)(Types...), const jsi::Value *args, @@ -47,4 +77,37 @@ std::tuple createArgsTupleFromJsi(R (Model::*f)(Types...) const, return fillTupleFromArgs(std::index_sequence_for{}, args, runtime); } + +// Overload for free functions (used by TailSignature dummy) +template +std::tuple createArgsTupleFromJsi(void (*f)(Types...), + const jsi::Value *args, + jsi::Runtime &runtime) { + return fillTupleFromArgs(std::index_sequence_for{}, args, + runtime); +} + +// ========================================================================= +// 4. Tail Signature Helper (Crucial for Vision Functions) +// ========================================================================= + +// Extracts the "Tail" arguments of a function signature, skipping the first +// two arguments (Runtime and FrameValue). +template struct TailSignature; + +// Non-const member function specialization +template +struct TailSignature { + // A dummy function that has the signature of just the "Rest" arguments. + static void dummy(Rest...) {} +}; + +// Const member function specialization +template +struct TailSignature { + static void dummy(Rest...) {} +}; + } // namespace rnexecutorch::meta \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h index 85a3db449..8100a471b 100644 --- a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h +++ b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h @@ -12,8 +12,13 @@ template concept SameAs = std::is_same_v; template -concept HasGenerate = requires(T t) { - { &T::generate }; +concept HasGenerateFromString = requires(T t) { + { &T::generateFromString }; +}; + +template +concept HasGenerateFromPixels = requires(T t) { + { &T::generateFromPixels }; }; template diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp new file mode 100644 index 000000000..54c0adfd2 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -0,0 +1,63 @@ +#include "VisionModel.h" +#include + +namespace rnexecutorch { +namespace models { + +using namespace facebook; + +cv::Mat VisionModel::extractFromFrame(jsi::Runtime &runtime, + const jsi::Value &frameData) const { + // Extract frame using FrameProcessor utility + auto frameObj = frameData.asObject(runtime); + cv::Mat frame = utils::FrameProcessor::extractFrame(runtime, frameObj); + + // Apply model-specific preprocessing + return preprocessFrame(frame); +} + +cv::Mat VisionModel::extractFromPixels(jsi::Runtime &runtime, + const jsi::Object &pixelData) const { + // Extract width, height, and channels + if (!pixelData.hasProperty(runtime, "width") || + !pixelData.hasProperty(runtime, "height") || + !pixelData.hasProperty(runtime, "channels") || + !pixelData.hasProperty(runtime, "data")) { + throw std::runtime_error( + "Invalid pixel data: must contain width, height, channels, and data"); + } + + int width = pixelData.getProperty(runtime, "width").asNumber(); + int height = pixelData.getProperty(runtime, "height").asNumber(); + int channels = pixelData.getProperty(runtime, "channels").asNumber(); + + // Get the ArrayBuffer + auto dataValue = pixelData.getProperty(runtime, "data"); + if (!dataValue.isObject() || + !dataValue.asObject(runtime).isArrayBuffer(runtime)) { + throw std::runtime_error( + "pixel data 'data' property must be an ArrayBuffer"); + } + + auto arrayBuffer = dataValue.asObject(runtime).getArrayBuffer(runtime); + size_t expectedSize = width * height * channels; + + if (arrayBuffer.size(runtime) != expectedSize) { + throw std::runtime_error( + "ArrayBuffer size does not match width * height * channels"); + } + + // Create cv::Mat and copy the data + // OpenCV uses BGR/BGRA format internally, but we'll create as-is and let + // preprocessFrame handle conversion + int cvType = (channels == 3) ? CV_8UC3 : CV_8UC4; + cv::Mat image(height, width, cvType); + + // Copy data from ArrayBuffer to cv::Mat + std::memcpy(image.data, arrayBuffer.data(runtime), expectedSize); + + return image; +} + +} // namespace models +} // namespace rnexecutorch diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h new file mode 100644 index 000000000..9ba5cf7e4 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h @@ -0,0 +1,175 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace rnexecutorch { +namespace models { + +/** + * @brief Base class for computer vision models that support real-time camera + * input + * + * VisionModel extends BaseModel with thread-safe inference and automatic frame + * extraction from VisionCamera. This class is designed for models that need to + * process camera frames in real-time (e.g., at 30fps). + * + * Thread Safety: + * - All inference operations are protected by a mutex + * - generateFromFrame() uses try_lock() to skip frames when the model is busy + * - This prevents blocking the camera thread and maintains smooth frame rates + * + * Usage: + * Subclasses should: + * 1. Inherit from VisionModel instead of BaseModel + * 2. Implement preprocessFrame() with model-specific preprocessing + * 3. Use inference_mutex_ when calling forward() in custom generate methods + * 4. Use lock_guard for blocking operations (JS API) + * 5. Use try_lock() for non-blocking operations (camera API) + * + * Example: + * @code + * class Classification : public VisionModel { + * public: + * std::unordered_map + * generateFromFrame(jsi::Runtime& runtime, const jsi::Value& frameValue) { + * // try_lock is handled automatically + * auto frameObject = frameValue.asObject(runtime); + * cv::Mat frame = FrameExtractor::extractFrame(runtime, frameObject); + * + * // Lock before inference + * if (!inference_mutex_.try_lock()) { + * return {}; // Skip frame if busy + * } + * std::lock_guard lock(inference_mutex_, std::adopt_lock); + * + * auto preprocessed = preprocessFrame(frame); + * // ... run inference + * } + * }; + * @endcode + */ +class VisionModel : public BaseModel { +public: + /** + * @brief Construct a VisionModel with the same parameters as BaseModel + * + * VisionModel uses the same construction pattern as BaseModel, just adding + * thread-safety on top. + */ + VisionModel(const std::string &modelSource, + std::shared_ptr callInvoker) + : BaseModel(modelSource, callInvoker) {} + + /** + * @brief Virtual destructor for proper cleanup in derived classes + */ + virtual ~VisionModel() = default; + +protected: + /** + * @brief Mutex to ensure thread-safe inference + * + * This mutex protects against race conditions when: + * - generateFromFrame() is called from VisionCamera worklet thread (30fps) + * - generate() is called from JavaScript thread simultaneously + * + * Usage guidelines: + * - Use std::lock_guard for blocking operations (JS API can wait) + * - Use try_lock() for non-blocking operations (camera should skip frames) + * + * @note Marked mutable to allow locking in const methods if needed + */ + mutable std::mutex inference_mutex_; + + /** + * @brief Preprocess a camera frame for model input + * + * This method should implement model-specific preprocessing such as: + * - Resizing to the model's expected input size + * - Color space conversion (e.g., BGR to RGB) + * - Normalization + * - Any other model-specific transformations + * + * @param frame Input frame from camera (already extracted and rotated by + * FrameExtractor) + * @return Preprocessed cv::Mat ready for tensor conversion + * + * @note The input frame is already in RGB format and rotated 90° clockwise + * @note This method is called under mutex protection in generateFromFrame() + */ + virtual cv::Mat preprocessFrame(const cv::Mat &frame) const = 0; + + /** + * @brief Extract and preprocess frame from VisionCamera in one call + * + * This is a convenience method that combines frame extraction and + * preprocessing. It handles both nativeBuffer (zero-copy) and ArrayBuffer + * paths automatically. + * + * @param runtime JSI runtime + * @param frameData JSI value containing frame data from VisionCamera + * + * @return Preprocessed cv::Mat ready for tensor conversion + * + * @throws std::runtime_error if frame extraction fails + * + * @note This method does NOT acquire the inference mutex - caller is + * responsible + * @note Typical usage: + * @code + * cv::Mat preprocessed = extractFromFrame(runtime, frameData); + * auto tensor = image_processing::getTensorFromMatrix(dims, preprocessed); + * @endcode + */ + cv::Mat extractFromFrame(jsi::Runtime &runtime, + const jsi::Value &frameData) const; + + /** + * @brief Extract cv::Mat from raw pixel data (ArrayBuffer) sent from + * JavaScript + * + * This method enables users to run inference on raw pixel data without file + * I/O. Useful for processing images already in memory (e.g., from canvas, + * image library). + * + * @param runtime JSI runtime + * @param pixelData JSI object containing: + * - data: ArrayBuffer with raw pixel values + * - width: number - image width + * - height: number - image height + * - channels: number - number of channels (3 for RGB, 4 for + * RGBA) + * + * @return cv::Mat containing the pixel data + * + * @throws std::runtime_error if pixelData format is invalid + * + * @note The returned cv::Mat owns a copy of the data + * @note Expected pixel format: RGB or RGBA, row-major order + * @note Typical usage from JS: + * @code + * const pixels = new Uint8Array([...]); // Raw pixel data + * const result = model.generateFromPixels({ + * data: pixels.buffer, + * width: 640, + * height: 480, + * channels: 3 + * }, 0.5); + * @endcode + */ + cv::Mat extractFromPixels(jsi::Runtime &runtime, + const jsi::Object &pixelData) const; +}; + +} // namespace models +// Register VisionModel constructor traits +// Even though VisionModel is abstract, the metaprogramming system needs to know +// its constructor signature for derived classes +REGISTER_CONSTRUCTOR(models::VisionModel, std::string, + std::shared_ptr); + +} // namespace rnexecutorch diff --git a/packages/react-native-executorch/common/rnexecutorch/models/classification/Classification.cpp b/packages/react-native-executorch/common/rnexecutorch/models/classification/Classification.cpp index 0fba07108..b9fad1b88 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/classification/Classification.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/classification/Classification.cpp @@ -73,4 +73,4 @@ Classification::postprocess(const Tensor &tensor) { return probs; } -} // namespace rnexecutorch::models::classification +} // namespace rnexecutorch::models::classification \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.cpp b/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.cpp index ec3129e76..bb3b5ffbc 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.cpp @@ -48,4 +48,4 @@ ImageEmbeddings::generate(std::string imageSource) { return BaseEmbeddings::postprocess(forwardResult); } -} // namespace rnexecutorch::models::embeddings +} // namespace rnexecutorch::models::embeddings \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.h b/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.h index 7e114e939..9a1d6429b 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/embeddings/image/ImageEmbeddings.h @@ -27,4 +27,4 @@ class ImageEmbeddings final : public BaseEmbeddings { REGISTER_CONSTRUCTOR(models::embeddings::ImageEmbeddings, std::string, std::shared_ptr); -} // namespace rnexecutorch +} // namespace rnexecutorch \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.cpp b/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.cpp index a2c1ae865..08f2a4683 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.cpp @@ -167,4 +167,4 @@ std::shared_ptr ImageSegmentation::populateDictionary( return dictPtr; } -} // namespace rnexecutorch::models::image_segmentation +} // namespace rnexecutorch::models::image_segmentation \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.h b/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.h index 301833ce8..ba154898f 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/ImageSegmentation.h @@ -45,4 +45,4 @@ class ImageSegmentation : public BaseModel { REGISTER_CONSTRUCTOR(models::image_segmentation::ImageSegmentation, std::string, std::shared_ptr); -} // namespace rnexecutorch +} // namespace rnexecutorch \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/Types.h b/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/Types.h new file mode 100644 index 000000000..7606c464b --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/models/image_segmentation/Types.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include +#include + +namespace rnexecutorch::models::image_segmentation::types { + +// 1. Define the Result Struct (Public) +struct SegmentationResult { + std::shared_ptr argmax; + std::shared_ptr< + std::unordered_map>> + buffers; +}; + +} // namespace rnexecutorch::models::image_segmentation::types \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.cpp b/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.cpp index 8b5bc022f..969f85cc3 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.cpp @@ -2,14 +2,16 @@ #include #include +#include #include +#include namespace rnexecutorch::models::object_detection { ObjectDetection::ObjectDetection( const std::string &modelSource, std::shared_ptr callInvoker) - : BaseModel(modelSource, callInvoker) { + : VisionModel(modelSource, callInvoker) { auto inputTensors = getAllInputShapes(); if (inputTensors.size() == 0) { throw RnExecutorchError(RnExecutorchErrorCode::UnexpectedNumInputs, @@ -32,11 +34,6 @@ ObjectDetection::ObjectDetection( std::vector ObjectDetection::postprocess(const std::vector &tensors, cv::Size originalSize, double detectionThreshold) { - if (detectionThreshold <= 0 || detectionThreshold > 1) { - throw RnExecutorchError(RnExecutorchErrorCode::InvalidConfig, - "Detection threshold must be greater than 0 " - "and less than or equal to 1."); - } float widthRatio = static_cast(originalSize.width) / modelImageSize.width; float heightRatio = @@ -75,7 +72,10 @@ ObjectDetection::postprocess(const std::vector &tensors, } std::vector -ObjectDetection::generate(std::string imageSource, double detectionThreshold) { +ObjectDetection::generateFromString(std::string imageSource, + double detectionThreshold) { + std::lock_guard lock(inference_mutex_); + auto [inputTensor, originalSize] = image_processing::readImageToTensor(imageSource, getAllInputShapes()[0]); @@ -88,4 +88,98 @@ ObjectDetection::generate(std::string imageSource, double detectionThreshold) { return postprocess(forwardResult.get(), originalSize, detectionThreshold); } + +std::vector +ObjectDetection::runInference(cv::Mat image, double detectionThreshold) { + std::lock_guard lock(inference_mutex_); + + // Store original size for postprocessing + cv::Size originalSize = image.size(); + + // Preprocess the image using model-specific preprocessing + cv::Mat preprocessed = preprocessFrame(image); + + // Create tensor and run inference + const std::vector tensorDims = getAllInputShapes()[0]; + auto inputTensor = + image_processing::getTensorFromMatrix(tensorDims, preprocessed); + + auto forwardResult = BaseModel::forward(inputTensor); + if (!forwardResult.ok()) { + throw RnExecutorchError(forwardResult.error(), + "The model's forward function did not succeed. " + "Ensure the model input is correct."); + } + + return postprocess(forwardResult.get(), originalSize, detectionThreshold); +} + +std::vector +ObjectDetection::generateFromFrame(jsi::Runtime &runtime, + const jsi::Value &frameData, + double detectionThreshold) { + // Try-lock: skip frame if model is busy (non-blocking for camera) + if (!inference_mutex_.try_lock()) { + return {}; // Return empty vector, don't block camera thread + } + std::lock_guard lock(inference_mutex_, std::adopt_lock); + + // Extract frame using FrameProcessor utility + auto frameObj = frameData.asObject(runtime); + cv::Mat frame = + rnexecutorch::utils::FrameProcessor::extractFrame(runtime, frameObj); + + // Release the lock before calling runInference (which will re-acquire it) + lock.~lock_guard(); + inference_mutex_.unlock(); + + // Use the internal helper - it handles preprocessing and inference + return runInference(frame, detectionThreshold); +} + +std::vector +ObjectDetection::generateFromPixels(jsi::Runtime &runtime, + const jsi::Value &pixelData, + double detectionThreshold) { + // Extract raw pixel data from JavaScript + auto pixelObj = pixelData.asObject(runtime); + cv::Mat image = extractFromPixels(runtime, pixelObj); + + // Use the internal helper - it handles locking, preprocessing, and inference + return runInference(image, detectionThreshold); +} + +cv::Mat ObjectDetection::preprocessFrame(const cv::Mat &frame) const { + // Get target size from model input shape + const std::vector tensorDims = getAllInputShapes()[0]; + cv::Size tensorSize = cv::Size(tensorDims[tensorDims.size() - 1], + tensorDims[tensorDims.size() - 2]); + + cv::Mat processed; + + // Convert RGBA/BGRA to RGB if needed + if (frame.channels() == 4) { + cv::Mat rgb; + +// Platform-specific color conversion: +// iOS uses BGRA format, Android uses RGBA format +#ifdef __APPLE__ + // iOS: BGRA → RGB + cv::cvtColor(frame, rgb, cv::COLOR_BGRA2RGB); +#else + // Android: RGBA → RGB + cv::cvtColor(frame, rgb, cv::COLOR_RGBA2RGB); +#endif + + cv::resize(rgb, processed, tensorSize); + } else if (frame.channels() == 3) { + // Already RGB, just resize + cv::resize(frame, processed, tensorSize); + } else { + throw std::runtime_error("Unsupported frame format: " + + std::to_string(frame.channels()) + " channels"); + } + + return processed; +} } // namespace rnexecutorch::models::object_detection diff --git a/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.h b/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.h index bba09a6d8..fc554003b 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/object_detection/ObjectDetection.h @@ -8,7 +8,7 @@ #include "Types.h" #include "rnexecutorch/metaprogramming/ConstructorHelpers.h" -#include +#include #include namespace rnexecutorch { @@ -16,12 +16,24 @@ namespace models::object_detection { using executorch::extension::TensorPtr; using executorch::runtime::EValue; -class ObjectDetection : public BaseModel { +class ObjectDetection : public VisionModel { public: ObjectDetection(const std::string &modelSource, std::shared_ptr callInvoker); [[nodiscard("Registered non-void function")]] std::vector - generate(std::string imageSource, double detectionThreshold); + generateFromString(std::string imageSource, double detectionThreshold); + [[nodiscard("Registered non-void function")]] std::vector + generateFromFrame(jsi::Runtime &runtime, const jsi::Value &frameData, + double detectionThreshold); + [[nodiscard("Registered non-void function")]] std::vector + generateFromPixels(jsi::Runtime &runtime, const jsi::Value &pixelData, + double detectionThreshold); + +protected: + // Internal helper for shared preprocessing and inference logic + std::vector runInference(cv::Mat image, + double detectionThreshold); + cv::Mat preprocessFrame(const cv::Mat &frame) const override; private: std::vector postprocess(const std::vector &tensors, diff --git a/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.cpp b/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.cpp index 3b9c0187b..2d04ea208 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.cpp @@ -55,4 +55,4 @@ std::string StyleTransfer::generate(std::string imageSource) { return postprocess(forwardResult->at(0).toTensor(), originalSize); } -} // namespace rnexecutorch::models::style_transfer +} // namespace rnexecutorch::models::style_transfer \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.h b/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.h index 73744c4d8..8eed3c888 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/style_transfer/StyleTransfer.h @@ -33,4 +33,4 @@ class StyleTransfer : public BaseModel { REGISTER_CONSTRUCTOR(models::style_transfer::StyleTransfer, std::string, std::shared_ptr); -} // namespace rnexecutorch +} // namespace rnexecutorch \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/tests/integration/ObjectDetectionTest.cpp b/packages/react-native-executorch/common/rnexecutorch/tests/integration/ObjectDetectionTest.cpp index ae80208a6..074ee0751 100644 --- a/packages/react-native-executorch/common/rnexecutorch/tests/integration/ObjectDetectionTest.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/tests/integration/ObjectDetectionTest.cpp @@ -29,7 +29,7 @@ template <> struct ModelTraits { } static void callGenerate(ModelType &model) { - (void)model.generate(kValidTestImagePath, 0.5); + (void)model.generateFromString(kValidTestImagePath, 0.5); } }; } // namespace model_tests @@ -43,49 +43,50 @@ INSTANTIATE_TYPED_TEST_SUITE_P(ObjectDetection, CommonModelTest, // ============================================================================ TEST(ObjectDetectionGenerateTests, InvalidImagePathThrows) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - EXPECT_THROW((void)model.generate("nonexistent_image.jpg", 0.5), + EXPECT_THROW((void)model.generateFromString("nonexistent_image.jpg", 0.5), RnExecutorchError); } TEST(ObjectDetectionGenerateTests, EmptyImagePathThrows) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - EXPECT_THROW((void)model.generate("", 0.5), RnExecutorchError); + EXPECT_THROW((void)model.generateFromString("", 0.5), RnExecutorchError); } TEST(ObjectDetectionGenerateTests, MalformedURIThrows) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - EXPECT_THROW((void)model.generate("not_a_valid_uri://bad", 0.5), + EXPECT_THROW((void)model.generateFromString("not_a_valid_uri://bad", 0.5), RnExecutorchError); } TEST(ObjectDetectionGenerateTests, NegativeThresholdThrows) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - EXPECT_THROW((void)model.generate(kValidTestImagePath, -0.1), + EXPECT_THROW((void)model.generateFromString(kValidTestImagePath, -0.1), RnExecutorchError); } TEST(ObjectDetectionGenerateTests, ThresholdAboveOneThrows) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - EXPECT_THROW((void)model.generate(kValidTestImagePath, 1.1), + EXPECT_THROW((void)model.generateFromString(kValidTestImagePath, 1.1), RnExecutorchError); } TEST(ObjectDetectionGenerateTests, ValidImageReturnsResults) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - auto results = model.generate(kValidTestImagePath, 0.3); + auto results = model.generateFromString(kValidTestImagePath, 0.3); EXPECT_GE(results.size(), 0u); } TEST(ObjectDetectionGenerateTests, HighThresholdReturnsFewerResults) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - auto lowThresholdResults = model.generate(kValidTestImagePath, 0.1); - auto highThresholdResults = model.generate(kValidTestImagePath, 0.9); + auto lowThresholdResults = model.generateFromString(kValidTestImagePath, 0.1); + auto highThresholdResults = + model.generateFromString(kValidTestImagePath, 0.9); EXPECT_GE(lowThresholdResults.size(), highThresholdResults.size()); } TEST(ObjectDetectionGenerateTests, DetectionsHaveValidBoundingBoxes) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - auto results = model.generate(kValidTestImagePath, 0.3); + auto results = model.generateFromString(kValidTestImagePath, 0.3); for (const auto &detection : results) { EXPECT_LE(detection.x1, detection.x2); @@ -97,7 +98,7 @@ TEST(ObjectDetectionGenerateTests, DetectionsHaveValidBoundingBoxes) { TEST(ObjectDetectionGenerateTests, DetectionsHaveValidScores) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - auto results = model.generate(kValidTestImagePath, 0.3); + auto results = model.generateFromString(kValidTestImagePath, 0.3); for (const auto &detection : results) { EXPECT_GE(detection.score, 0.0f); @@ -107,7 +108,7 @@ TEST(ObjectDetectionGenerateTests, DetectionsHaveValidScores) { TEST(ObjectDetectionGenerateTests, DetectionsHaveValidLabels) { ObjectDetection model(kValidObjectDetectionModelPath, nullptr); - auto results = model.generate(kValidTestImagePath, 0.3); + auto results = model.generateFromString(kValidTestImagePath, 0.3); for (const auto &detection : results) { EXPECT_GE(detection.label, 0); diff --git a/packages/react-native-executorch/common/rnexecutorch/tests/unit/FileUtilsTest.cpp b/packages/react-native-executorch/common/rnexecutorch/tests/unit/FileUtilsTest.cpp index ed9d80236..c25f2c197 100644 --- a/packages/react-native-executorch/common/rnexecutorch/tests/unit/FileUtilsTest.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/tests/unit/FileUtilsTest.cpp @@ -26,7 +26,7 @@ TEST_F(FileIOTest, LoadBytesFromFileSuccessfully) { } TEST_F(FileIOTest, LoadBytesFromFileFailOnNonExistentFile) { - EXPECT_THROW( - { loadBytesFromFile("non_existent_file.txt"); }, RnExecutorchError); + EXPECT_THROW({ loadBytesFromFile("non_existent_file.txt"); }, + RnExecutorchError); } } // namespace rnexecutorch::file_utils diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp new file mode 100644 index 000000000..f64855131 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp @@ -0,0 +1,151 @@ +#include "FrameExtractor.h" +#include + +#ifdef __APPLE__ +#import +#endif + +#ifdef __ANDROID__ +#if __ANDROID_API__ >= 26 +#include +#endif +#endif + +namespace rnexecutorch { +namespace utils { + +cv::Mat FrameExtractor::extractFromNativeBuffer(uint64_t bufferPtr) { +#ifdef __APPLE__ + return extractFromCVPixelBuffer(reinterpret_cast(bufferPtr)); +#elif defined(__ANDROID__) + return extractFromAHardwareBuffer(reinterpret_cast(bufferPtr)); +#else + throw std::runtime_error("NativeBuffer not supported on this platform"); +#endif +} + +#ifdef __APPLE__ +cv::Mat FrameExtractor::extractFromCVPixelBuffer(void *pixelBuffer) { + CVPixelBufferRef buffer = static_cast(pixelBuffer); + + // Get buffer properties + size_t width = CVPixelBufferGetWidth(buffer); + size_t height = CVPixelBufferGetHeight(buffer); + size_t bytesPerRow = CVPixelBufferGetBytesPerRow(buffer); + OSType pixelFormat = CVPixelBufferGetPixelFormatType(buffer); + + // Lock the buffer (Vision Camera should have already locked it, but ensure) + CVPixelBufferLockBaseAddress(buffer, kCVPixelBufferLock_ReadOnly); + void *baseAddress = CVPixelBufferGetBaseAddress(buffer); + + cv::Mat mat; + + // Log pixel format once for debugging + static bool loggedPixelFormat = false; + if (!loggedPixelFormat) { + log(LOG_LEVEL::Debug, "CVPixelBuffer format code: ", pixelFormat); + loggedPixelFormat = true; + } + + if (pixelFormat == kCVPixelFormatType_32BGRA) { + // BGRA format (most common on iOS when using pixelFormat: 'rgb') + if (!loggedPixelFormat) { + log(LOG_LEVEL::Debug, "Extracting from CVPixelBuffer: BGRA format, ", + width, "x", height, ", stride: ", bytesPerRow); + } + mat = cv::Mat(static_cast(height), static_cast(width), CV_8UC4, + baseAddress, bytesPerRow); + } else if (pixelFormat == kCVPixelFormatType_32RGBA) { + // RGBA format + if (!loggedPixelFormat) { + log(LOG_LEVEL::Debug, "Extracting from CVPixelBuffer: RGBA format, ", + width, "x", height, ", stride: ", bytesPerRow); + } + mat = cv::Mat(static_cast(height), static_cast(width), CV_8UC4, + baseAddress, bytesPerRow); + } else if (pixelFormat == kCVPixelFormatType_24RGB) { + // RGB format + if (!loggedPixelFormat) { + log(LOG_LEVEL::Debug, "Extracting from CVPixelBuffer: RGB format, ", + width, "x", height, ", stride: ", bytesPerRow); + } + mat = cv::Mat(static_cast(height), static_cast(width), CV_8UC3, + baseAddress, bytesPerRow); + } else { + CVPixelBufferUnlockBaseAddress(buffer, kCVPixelBufferLock_ReadOnly); + throw std::runtime_error("Unsupported CVPixelBuffer format: " + + std::to_string(pixelFormat)); + } + + // Note: We don't unlock here - Vision Camera manages the lifecycle + // When frame.dispose() is called, Vision Camera will unlock and release + + return mat; +} +#endif + +#ifdef __ANDROID__ +cv::Mat FrameExtractor::extractFromAHardwareBuffer(void *hardwareBuffer) { +#if __ANDROID_API__ >= 26 + AHardwareBuffer *buffer = static_cast(hardwareBuffer); + + // Get buffer description + AHardwareBuffer_Desc desc; + AHardwareBuffer_describe(buffer, &desc); + + // Lock the buffer for CPU read access + void *data = nullptr; + int lockResult = AHardwareBuffer_lock( + buffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr, &data); + + if (lockResult != 0) { + throw std::runtime_error("Failed to lock AHardwareBuffer"); + } + + cv::Mat mat; + + // Log format once for debugging + static bool loggedFormat = false; + if (!loggedFormat) { + log(LOG_LEVEL::Debug, "AHardwareBuffer format code: ", desc.format); + loggedFormat = true; + } + + if (desc.format == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) { + // RGBA format (expected when using pixelFormat: 'rgb' on Android) + if (!loggedFormat) { + log(LOG_LEVEL::Debug, "Extracting from AHardwareBuffer: RGBA format, ", + desc.width, "x", desc.height, ", stride: ", desc.stride * 4); + } + mat = cv::Mat(desc.height, desc.width, CV_8UC4, data, desc.stride * 4); + } else if (desc.format == AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM) { + // RGBX format (treated as RGBA) + if (!loggedFormat) { + log(LOG_LEVEL::Debug, "Extracting from AHardwareBuffer: RGBX format, ", + desc.width, "x", desc.height, ", stride: ", desc.stride * 4); + } + mat = cv::Mat(desc.height, desc.width, CV_8UC4, data, desc.stride * 4); + } else if (desc.format == AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM) { + // RGB format (less common) + if (!loggedFormat) { + log(LOG_LEVEL::Debug, "Extracting from AHardwareBuffer: RGB format, ", + desc.width, "x", desc.height, ", stride: ", desc.stride * 3); + } + mat = cv::Mat(desc.height, desc.width, CV_8UC3, data, desc.stride * 3); + } else { + AHardwareBuffer_unlock(buffer, nullptr); + throw std::runtime_error("Unsupported AHardwareBuffer format: " + + std::to_string(desc.format)); + } + + // Note: We don't unlock here - Vision Camera manages the lifecycle + + return mat; +#else + throw std::runtime_error("AHardwareBuffer requires Android API 26+"); +#endif // __ANDROID_API__ >= 26 +} +#endif // __ANDROID__ + +} // namespace utils +} // namespace rnexecutorch diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h new file mode 100644 index 000000000..a90e6ad23 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include + +namespace rnexecutorch { +namespace utils { + +/** + * @brief Utility class for extracting cv::Mat from native platform buffers + * + * Provides zero-copy extraction of frames from: + * - iOS: CVPixelBufferRef + * - Android: AHardwareBuffer + */ +class FrameExtractor { +public: + /** + * @brief Extract cv::Mat from a native buffer pointer + * + * @param bufferPtr Platform-specific buffer pointer (uint64_t) + * - iOS: CVPixelBufferRef + * - Android: AHardwareBuffer* + * @return cv::Mat wrapping the buffer data (zero-copy) + * + * @note The returned cv::Mat does not own the data. + * The caller must ensure the buffer remains valid. + * @note The buffer must be locked before calling and unlocked after use. + */ + static cv::Mat extractFromNativeBuffer(uint64_t bufferPtr); + +#ifdef __APPLE__ + /** + * @brief Extract cv::Mat from CVPixelBuffer (iOS) + * + * @param pixelBuffer CVPixelBufferRef pointer + * @return cv::Mat wrapping the pixel buffer data + * + * @note Assumes buffer is already locked by Vision Camera + * @note Supports kCVPixelFormatType_32BGRA and kCVPixelFormatType_24RGB + */ + static cv::Mat extractFromCVPixelBuffer(void *pixelBuffer); +#endif + +#ifdef __ANDROID__ + /** + * @brief Extract cv::Mat from AHardwareBuffer (Android) + * + * @param hardwareBuffer AHardwareBuffer* pointer + * @return cv::Mat wrapping the hardware buffer data + * + * @note Assumes buffer is already locked by Vision Camera + * @note Supports AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM and R8G8B8_UNORM + */ + static cv::Mat extractFromAHardwareBuffer(void *hardwareBuffer); +#endif +}; + +} // namespace utils +} // namespace rnexecutorch diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp new file mode 100644 index 000000000..02faa072d --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp @@ -0,0 +1,142 @@ +#include "FrameProcessor.h" +#include "FrameExtractor.h" +#include +#include + +namespace rnexecutorch { +namespace utils { + +cv::Mat FrameProcessor::extractFrame(jsi::Runtime &runtime, + const jsi::Object &frameData) { + // Get frame dimensions + int width = + static_cast(frameData.getProperty(runtime, "width").asNumber()); + int height = + static_cast(frameData.getProperty(runtime, "height").asNumber()); + + // Try zero-copy path first (nativeBuffer) + if (hasNativeBuffer(runtime, frameData)) { + static bool loggedPath = false; + if (!loggedPath) { + log(LOG_LEVEL::Debug, "FrameProcessor: Using zero-copy nativeBuffer"); + loggedPath = true; + } + + try { + return extractFromNativeBuffer(runtime, frameData, width, height); + } catch (const std::exception &e) { + log(LOG_LEVEL::Debug, + "FrameProcessor: nativeBuffer extraction failed: ", e.what()); + log(LOG_LEVEL::Debug, "FrameProcessor: Falling back to ArrayBuffer"); + } + } + + // Fallback to ArrayBuffer path (with copy) + if (frameData.hasProperty(runtime, "data")) { + static bool loggedPath = false; + if (!loggedPath) { + log(LOG_LEVEL::Debug, "FrameProcessor: Using ArrayBuffer (with copy)"); + loggedPath = true; + } + + return extractFromArrayBuffer(runtime, frameData, width, height); + } + + // No valid frame data source + throw std::runtime_error( + "FrameProcessor: No valid frame data (neither nativeBuffer nor data " + "property found)"); +} + +cv::Size FrameProcessor::getFrameSize(jsi::Runtime &runtime, + const jsi::Object &frameData) { + if (!frameData.hasProperty(runtime, "width") || + !frameData.hasProperty(runtime, "height")) { + throw std::runtime_error("FrameProcessor: Frame data missing width or " + "height property"); + } + + int width = + static_cast(frameData.getProperty(runtime, "width").asNumber()); + int height = + static_cast(frameData.getProperty(runtime, "height").asNumber()); + + return cv::Size(width, height); +} + +bool FrameProcessor::hasNativeBuffer(jsi::Runtime &runtime, + const jsi::Object &frameData) { + return frameData.hasProperty(runtime, "nativeBuffer"); +} + +cv::Mat FrameProcessor::extractFromNativeBuffer(jsi::Runtime &runtime, + const jsi::Object &frameData, + int width, int height) { + auto nativeBufferValue = frameData.getProperty(runtime, "nativeBuffer"); + + // Handle bigint pointer value from JavaScript + uint64_t bufferPtr = static_cast( + nativeBufferValue.asBigInt(runtime).asUint64(runtime)); + + // Use FrameExtractor to get cv::Mat from platform-specific buffer + cv::Mat frame = FrameExtractor::extractFromNativeBuffer(bufferPtr); + + // Validate extracted frame dimensions match expected + if (frame.cols != width || frame.rows != height) { + log(LOG_LEVEL::Debug, "FrameProcessor: Dimension mismatch - expected ", + width, "x", height, " but got ", frame.cols, "x", frame.rows); + } + + return frame; +} + +cv::Mat FrameProcessor::extractFromArrayBuffer(jsi::Runtime &runtime, + const jsi::Object &frameData, + int width, int height) { + auto pixelData = frameData.getProperty(runtime, "data"); + auto arrayBuffer = pixelData.asObject(runtime).getArrayBuffer(runtime); + uint8_t *data = arrayBuffer.data(runtime); + size_t bufferSize = arrayBuffer.size(runtime); + + // Determine format based on buffer size + size_t stride = bufferSize / height; + size_t expectedRGBAStride = width * 4; + size_t expectedRGBStride = width * 3; + + cv::Mat frame; + + if (stride == expectedRGBAStride || bufferSize >= width * height * 4) { + // RGBA format with potential padding + frame = cv::Mat(height, width, CV_8UC4, data, stride); + + static bool loggedFormat = false; + if (!loggedFormat) { + log(LOG_LEVEL::Debug, + "FrameProcessor: ArrayBuffer format is RGBA, " + "stride: ", + stride); + loggedFormat = true; + } + } else if (stride >= expectedRGBStride) { + // RGB format + frame = cv::Mat(height, width, CV_8UC3, data, stride); + + static bool loggedFormat = false; + if (!loggedFormat) { + log(LOG_LEVEL::Debug, + "FrameProcessor: ArrayBuffer format is RGB, stride: ", stride); + loggedFormat = true; + } + } else { + throw std::runtime_error( + "FrameProcessor: Unexpected buffer size - expected " + + std::to_string(expectedRGBStride) + " or " + + std::to_string(expectedRGBAStride) + " bytes per row, got " + + std::to_string(stride)); + } + + return frame; +} + +} // namespace utils +} // namespace rnexecutorch diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h new file mode 100644 index 000000000..e37b5bfd6 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h @@ -0,0 +1,109 @@ +#pragma once + +#include +#include + +namespace rnexecutorch { +namespace utils { + +using namespace facebook; + +/** + * @brief Utility class for processing camera frames from VisionCamera + * + * Provides high-level helpers for extracting and working with frames from + * react-native-vision-camera in a consistent way across all vision models. + * + * This class abstracts away the complexity of: + * - Handling both nativeBuffer (zero-copy) and ArrayBuffer (with copy) paths + * - Platform-specific buffer formats (CVPixelBuffer on iOS, AHardwareBuffer + * on Android) + * - JSI object property access and type conversions + * + * Usage: + * @code + * auto frameObj = frameData.asObject(runtime); + * cv::Mat frame = FrameProcessor::extractFrame(runtime, frameObj); + * cv::Size size = FrameProcessor::getFrameSize(runtime, frameObj); + * @endcode + */ +class FrameProcessor { +public: + /** + * @brief Extract cv::Mat from VisionCamera frame data + * + * Handles both zero-copy (nativeBuffer) and copy-based (ArrayBuffer) paths + * automatically. Prefers nativeBuffer when available for best performance. + * + * @param runtime JSI runtime + * @param frameData JSI object containing frame data from VisionCamera + * Expected properties: + * - nativeBuffer (optional): BigInt pointer to native buffer + * - data (optional): ArrayBuffer with pixel data + * - width: number + * - height: number + * + * @return cv::Mat wrapping or containing the frame data + * + * @throws std::runtime_error if neither nativeBuffer nor data is available + * @throws std::runtime_error if nativeBuffer extraction fails + * + * @note The returned cv::Mat may not own the data (zero-copy path). + * Caller must ensure the source frame remains valid during use. + */ + static cv::Mat extractFrame(jsi::Runtime &runtime, + const jsi::Object &frameData); + + /** + * @brief Get frame dimensions from VisionCamera frame data + * + * @param runtime JSI runtime + * @param frameData JSI object containing frame data + * + * @return cv::Size with frame width and height + * + * @throws std::runtime_error if width or height properties are missing + */ + static cv::Size getFrameSize(jsi::Runtime &runtime, + const jsi::Object &frameData); + + /** + * @brief Check if frame data has nativeBuffer (zero-copy path available) + * + * @param runtime JSI runtime + * @param frameData JSI object containing frame data + * @return true if nativeBuffer is available, false otherwise + */ + static bool hasNativeBuffer(jsi::Runtime &runtime, + const jsi::Object &frameData); + +private: + /** + * @brief Extract frame from nativeBuffer pointer (zero-copy) + * + * @param runtime JSI runtime + * @param frameData JSI object with nativeBuffer property + * @param width Frame width + * @param height Frame height + * @return cv::Mat wrapping the native buffer data + */ + static cv::Mat extractFromNativeBuffer(jsi::Runtime &runtime, + const jsi::Object &frameData, + int width, int height); + + /** + * @brief Extract frame from ArrayBuffer (with copy) + * + * @param runtime JSI runtime + * @param frameData JSI object with data property + * @param width Frame width + * @param height Frame height + * @return cv::Mat containing or wrapping the array buffer data + */ + static cv::Mat extractFromArrayBuffer(jsi::Runtime &runtime, + const jsi::Object &frameData, int width, + int height); +}; + +} // namespace utils +} // namespace rnexecutorch diff --git a/packages/react-native-executorch/package.json b/packages/react-native-executorch/package.json index c03826e35..9ccff9608 100644 --- a/packages/react-native-executorch/package.json +++ b/packages/react-native-executorch/package.json @@ -65,9 +65,6 @@ "registry": "https://registry.npmjs.org/" }, "peerDependencies": { - "expo": ">=54.0.0", - "expo-asset": "^12.0.0", - "expo-file-system": "^19.0.0", "react": "*", "react-native": "*" }, @@ -75,9 +72,6 @@ "@react-native-community/cli": "latest", "@types/jest": "^29.5.5", "@types/react": "~19.1.10", - "expo": "^54.0.0", - "expo-asset": "12.0.11", - "expo-file-system": "^19.0.20", "jest": "^29.7.0", "metro-react-native-babel-preset": "^0.77.0", "react": "19.1.0", diff --git a/packages/react-native-executorch/src/controllers/LLMController.ts b/packages/react-native-executorch/src/controllers/LLMController.ts index 62b438fab..92bb2e7e0 100644 --- a/packages/react-native-executorch/src/controllers/LLMController.ts +++ b/packages/react-native-executorch/src/controllers/LLMController.ts @@ -12,7 +12,6 @@ import { } from '../types/llm'; import { parseToolCall } from '../utils/llm'; import { Logger } from '../common/Logger'; -import { readAsStringAsync } from 'expo-file-system/legacy'; import { RnExecutorchError, parseUnknownError } from '../errors/errorUtils'; import { RnExecutorchErrorCode } from '../errors/ErrorCodes'; @@ -117,7 +116,7 @@ export class LLMController { } this.tokenizerConfig = JSON.parse( - await readAsStringAsync('file://' + tokenizerConfigPath!) + await ResourceFetcher.fs.readAsString(tokenizerConfigPath!) ); this.nativeModule = global.loadLLM(modelPath, tokenizerPath); this.isReadyCallback(true); diff --git a/packages/react-native-executorch/src/hooks/computer_vision/useObjectDetection.ts b/packages/react-native-executorch/src/hooks/computer_vision/useObjectDetection.ts index 2d52eb706..845f1aa23 100644 --- a/packages/react-native-executorch/src/hooks/computer_vision/useObjectDetection.ts +++ b/packages/react-native-executorch/src/hooks/computer_vision/useObjectDetection.ts @@ -15,9 +15,10 @@ import { export const useObjectDetection = ({ model, preventLoad = false, -}: ObjectDetectionProps): ObjectDetectionType => - useModule({ +}: ObjectDetectionProps): ObjectDetectionType => { + return useModule({ module: ObjectDetectionModule, model, preventLoad: preventLoad, - }); + }) as ObjectDetectionType; +}; diff --git a/packages/react-native-executorch/src/hooks/useModule.ts b/packages/react-native-executorch/src/hooks/useModule.ts index 39b10249b..2e6f0ce49 100644 --- a/packages/react-native-executorch/src/hooks/useModule.ts +++ b/packages/react-native-executorch/src/hooks/useModule.ts @@ -6,6 +6,7 @@ interface Module { load: (...args: any[]) => Promise; forward: (...args: any[]) => Promise; delete: () => void; + nativeModule?: any; // JSI host object with native methods } interface ModuleConstructor { @@ -31,6 +32,7 @@ export const useModule = < const [isGenerating, setIsGenerating] = useState(false); const [downloadProgress, setDownloadProgress] = useState(0); const [moduleInstance] = useState(() => new module()); + const [runOnFrame, setRunOnFrame] = useState(null); useEffect(() => { if (preventLoad) return; @@ -42,6 +44,15 @@ export const useModule = < setIsReady(false); await moduleInstance.load(model, setDownloadProgress); setIsReady(true); + + // Extract runOnFrame worklet from VisionModule if available + // Use "state trick" to make the worklet serializable for VisionCamera + if ('runOnFrame' in moduleInstance) { + const worklet = moduleInstance.runOnFrame; + if (worklet) { + setRunOnFrame(() => worklet); + } + } } catch (err) { setError(parseUnknownError(err)); } @@ -94,5 +105,32 @@ export const useModule = < */ downloadProgress, forward, + + /** + * Synchronous worklet function for real-time VisionCamera frame processing. + * Automatically handles native buffer extraction and cleanup. + * + * Only available for Computer Vision modules that support real-time frame processing + * (e.g., ObjectDetection, Classification, ImageSegmentation). + * Returns `null` if the module doesn't implement frame processing. + * + * **Use this for VisionCamera frame processing in worklets.** + * For async processing, use `forward()` instead. + * + * @example + * ```typescript + * const { runOnFrame } = useObjectDetection({ model: MODEL }); + * + * const frameOutput = useFrameOutput({ + * onFrame(frame) { + * 'worklet'; + * if (!runOnFrame) return; + * const detections = runOnFrame(frame, 0.5); + * frame.dispose(); + * } + * }); + * ``` + */ + runOnFrame, }; }; diff --git a/packages/react-native-executorch/src/index.ts b/packages/react-native-executorch/src/index.ts index a42881f45..72859fde5 100644 --- a/packages/react-native-executorch/src/index.ts +++ b/packages/react-native-executorch/src/index.ts @@ -1,4 +1,20 @@ import { ETInstallerNativeModule } from './native/RnExecutorchModules'; +import { + ResourceFetcher, + ResourceFetcherAdapter, +} from './utils/ResourceFetcher'; + +export interface ExecutorchConfig { + resourceFetcher: ResourceFetcherAdapter; +} + +export function initExecutorch(config: ExecutorchConfig) { + ResourceFetcher.setAdapter(config.resourceFetcher); +} + +export function cleanupExecutorch() { + ResourceFetcher.resetAdapter(); +} // eslint-disable no-var declare global { @@ -113,7 +129,9 @@ export * from './modules/general/ExecutorchModule'; // utils export * from './utils/ResourceFetcher'; +export * from './utils/ResourceFetcherUtils'; export * from './utils/llm'; +export * from './common/Logger'; // types export * from './types/objectDetection'; diff --git a/packages/react-native-executorch/src/modules/BaseModule.ts b/packages/react-native-executorch/src/modules/BaseModule.ts index 6aefc8b2a..4a25a8792 100644 --- a/packages/react-native-executorch/src/modules/BaseModule.ts +++ b/packages/react-native-executorch/src/modules/BaseModule.ts @@ -1,12 +1,67 @@ -import { ResourceSource } from '../types/common'; +import { ResourceSource, FrameData } from '../types/common'; import { TensorPtr } from '../types/common'; +/** + * Base class for all React Native Executorch modules. + * + * Provides core functionality for loading models, running inference, + * and managing native resources. + * + * @category Base Classes + */ export abstract class BaseModule { /** - * Native module instance + * Native module instance (JSI Host Object) + * @internal */ nativeModule: any = null; + /** + * Process a camera frame directly for real-time inference. + * + * This method is bound to a native JSI function after calling `load()`, + * making it worklet-compatible and safe to call from VisionCamera's + * frame processor thread. + * + * **Performance characteristics:** + * - **Zero-copy path**: When using `frame.getNativeBuffer()` from VisionCamera v5, + * frame data is accessed directly without copying (fastest, recommended). + * - **Copy path**: When using `frame.toArrayBuffer()`, pixel data is copied + * from native to JS, then accessed from native code (slower, fallback). + * + * **Usage with VisionCamera:** + * ```typescript + * const frameOutput = useFrameOutput({ + * pixelFormat: 'rgb', + * onFrame(frame) { + * 'worklet'; + * // Zero-copy approach (recommended) + * const nativeBuffer = frame.getNativeBuffer(); + * const result = model.generateFromFrame( + * { nativeBuffer: nativeBuffer.pointer, width: frame.width, height: frame.height }, + * ...args + * ); + * nativeBuffer.release(); + * frame.dispose(); + * } + * }); + * ``` + * + * @param frameData Frame data object with either nativeBuffer (zero-copy) or data (ArrayBuffer) + * @param args Additional model-specific arguments (e.g., threshold, options) + * @returns Model-specific output (e.g., detections, classifications, embeddings) + * + * @see {@link FrameData} for frame data format details + */ + public generateFromFrame!: (frameData: FrameData, ...args: any[]) => any; + + /** + * Load the model and prepare it for inference. + * + * @param modelSource - Resource location of the model binary + * @param onDownloadProgressCallback - Optional callback to monitor download progress (0-1) + * @param args - Additional model-specific loading arguments + */ abstract load( modelSource: ResourceSource, onDownloadProgressCallback: (_: number) => void, @@ -19,6 +74,7 @@ export abstract class BaseModule { * * @param inputTensor - Array of input tensors. * @returns Array of output tensors. + * @internal */ protected async forwardET(inputTensor: TensorPtr[]): Promise { return await this.nativeModule.forward(inputTensor); @@ -36,7 +92,9 @@ export abstract class BaseModule { } /** - * Unloads the model from memory. + * Unloads the model from memory and releases native resources. + * + * Always call this method when you're done with a model to prevent memory leaks. */ delete() { if (this.nativeModule !== null) { diff --git a/packages/react-native-executorch/src/modules/computer_vision/OCRModule.ts b/packages/react-native-executorch/src/modules/computer_vision/OCRModule.ts index c40273640..5c7add5c2 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/OCRModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/OCRModule.ts @@ -1,7 +1,6 @@ import { OCRController } from '../../controllers/OCRController'; import { ResourceSource } from '../../types/common'; import { OCRDetection, OCRLanguage } from '../../types/ocr'; - /** * Module for Optical Character Recognition (OCR) tasks. * diff --git a/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts b/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts index 8175a4e49..b557f81fc 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts @@ -3,14 +3,14 @@ import { ResourceSource } from '../../types/common'; import { Detection } from '../../types/objectDetection'; import { RnExecutorchErrorCode } from '../../errors/ErrorCodes'; import { RnExecutorchError } from '../../errors/errorUtils'; -import { BaseModule } from '../BaseModule'; +import { VisionModule } from './VisionModule'; /** * Module for object detection tasks. * * @category Typescript API */ -export class ObjectDetectionModule extends BaseModule { +export class ObjectDetectionModule extends VisionModule { /** * Loads the model, where `modelSource` is a string that specifies the location of the model binary. * To track the download progress, supply a callback function `onDownloadProgressCallback`. @@ -34,24 +34,4 @@ export class ObjectDetectionModule extends BaseModule { } this.nativeModule = global.loadObjectDetection(paths[0] || ''); } - - /** - * Executes the model's forward pass, where `imageSource` can be a fetchable resource or a Base64-encoded string. - * `detectionThreshold` can be supplied to alter the sensitivity of the detection. - * - * @param imageSource - The image source to be processed. - * @param detectionThreshold - The threshold for detection sensitivity. Default is 0.7. - * @returns An array of Detection objects representing detected items in the image. - */ - async forward( - imageSource: string, - detectionThreshold: number = 0.7 - ): Promise { - if (this.nativeModule == null) - throw new RnExecutorchError( - RnExecutorchErrorCode.ModuleNotLoaded, - 'The model is currently not loaded. Please load the model before calling forward().' - ); - return await this.nativeModule.generate(imageSource, detectionThreshold); - } } diff --git a/packages/react-native-executorch/src/modules/computer_vision/VerticalOCRModule.ts b/packages/react-native-executorch/src/modules/computer_vision/VerticalOCRModule.ts index 3eecc2a03..90956fd4c 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/VerticalOCRModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/VerticalOCRModule.ts @@ -1,6 +1,6 @@ import { VerticalOCRController } from '../../controllers/VerticalOCRController'; -import { ResourceSource } from '../../types/common'; import { OCRDetection, OCRLanguage } from '../../types/ocr'; +import { ResourceSource } from '../../types/common'; /** * Module for Vertical Optical Character Recognition (Vertical OCR) tasks. diff --git a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts new file mode 100644 index 000000000..06acf6654 --- /dev/null +++ b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts @@ -0,0 +1,154 @@ +import { BaseModule } from '../BaseModule'; +import { RnExecutorchErrorCode } from '../../errors/ErrorCodes'; +import { RnExecutorchError } from '../../errors/errorUtils'; + +/** + * Raw pixel data for vision model inference. + */ +export type PixelData = { + data: ArrayBuffer; + width: number; + height: number; + channels: number; +}; + +/** + * VisionCamera Frame object for real-time processing. + */ +export type Frame = { + getNativeBuffer(): { pointer: number; release(): void }; + width: number; + height: number; +}; + +/** + * Base class for computer vision models that support multiple input types. + * + * VisionModule extends BaseModule with: + * - Unified `forward()` API accepting string paths or raw pixel data + * - `runOnFrame` getter for real-time VisionCamera frame processing + * - Shared frame processor creation logic + * + * Subclasses should only implement model-specific loading logic. + * + * @category Typescript API + */ +export abstract class VisionModule extends BaseModule { + /** + * Synchronous worklet function for real-time VisionCamera frame processing. + * + * Only available after the model is loaded. Returns null if not loaded. + * + * **Use this for VisionCamera frame processing in worklets.** + * For async processing, use `forward()` instead. + * + * @example + * ```typescript + * const model = new ClassificationModule(); + * await model.load({ modelSource: MODEL }); + * + * const frameOutput = useFrameOutput({ + * onFrame(frame) { + * 'worklet'; + * if (!model.runOnFrame) return; + * const result = model.runOnFrame(frame); + * frame.dispose(); + * } + * }); + * ``` + */ + get runOnFrame(): ((frame: Frame, ...args: any[]) => TOutput) | null { + if (!this.nativeModule?.generateFromFrame) { + return null; + } + + // Extract pure JSI function reference (runs on JS thread) + const nativeGenerateFromFrame = this.nativeModule.generateFromFrame; + + // Return worklet that captures ONLY the JSI function + return (frame: any, ...args: any[]): TOutput => { + 'worklet'; + + let nativeBuffer: any = null; + try { + nativeBuffer = frame.getNativeBuffer(); + const frameData = { + nativeBuffer: nativeBuffer.pointer, + width: frame.width, + height: frame.height, + }; + return nativeGenerateFromFrame(frameData, ...args); + } finally { + if (nativeBuffer?.release) { + nativeBuffer.release(); + } + } + }; + } + + /** + * Executes the model's forward pass with automatic input type detection. + * + * Supports two input types: + * 1. **String path/URI**: File path, URL, or Base64-encoded string + * 2. **PixelData**: Raw pixel data from image libraries (e.g., NitroImage) + * + * **Note**: For VisionCamera frame processing, use `forwardSync` instead. + * This method is async and cannot be called in worklet context. + * + * @param input - Image source (string path or PixelData object) + * @param args - Additional model-specific arguments + * @returns A Promise that resolves to the model output. + * + * @example + * ```typescript + * // String path (async) + * const result1 = await model.forward('file:///path/to/image.jpg'); + * + * // Pixel data (async) + * const result2 = await model.forward({ + * data: pixelBuffer, + * width: 640, + * height: 480, + * channels: 3 + * }); + * + * // For VisionCamera frames, use runOnFrame in worklet: + * const frameOutput = useFrameOutput({ + * onFrame(frame) { + * 'worklet'; + * if (!model.runOnFrame) return; + * const result = model.runOnFrame(frame); + * } + * }); + * ``` + */ + async forward(input: string | PixelData, ...args: any[]): Promise { + if (this.nativeModule == null) + throw new RnExecutorchError( + RnExecutorchErrorCode.ModuleNotLoaded, + 'The model is currently not loaded. Please load the model before calling forward().' + ); + + // Type detection and routing + if (typeof input === 'string') { + // String path → generateFromString() + return await this.nativeModule.generateFromString(input, ...args); + } else if ( + typeof input === 'object' && + 'data' in input && + input.data instanceof ArrayBuffer && + typeof input.width === 'number' && + typeof input.height === 'number' && + typeof input.channels === 'number' + ) { + // Pixel data → generateFromPixels() + return await this.nativeModule.generateFromPixels(input, ...args); + } else { + throw new RnExecutorchError( + RnExecutorchErrorCode.InvalidArgument, + 'Invalid input: expected string path or PixelData object. For VisionCamera frames, use runOnFrame instead.' + ); + } + } +} diff --git a/packages/react-native-executorch/src/types/common.ts b/packages/react-native-executorch/src/types/common.ts index 7b87f31b6..c8ace7f52 100644 --- a/packages/react-native-executorch/src/types/common.ts +++ b/packages/react-native-executorch/src/types/common.ts @@ -136,3 +136,36 @@ export interface TensorPtr { sizes: number[]; scalarType: ScalarType; } + +/** + * Frame data for vision model processing. + * Supports two modes: + * 1. ArrayBuffer mode (with memory copy) - Compatible with all platforms + * 2. NativeBuffer mode (zero-copy) - Better performance with Vision Camera v5 + */ +export interface FrameData { + /** + * Raw pixel data as ArrayBuffer (requires memory copy). + * Use this for compatibility or when getNativeBuffer is not available. + */ + data?: ArrayBuffer | ArrayBufferLike; + + /** + * Pointer to native platform buffer (zero-copy, best performance). + * - On iOS: CVPixelBufferRef pointer + * - On Android: AHardwareBuffer* pointer + * + * Obtain from Vision Camera v5: `frame.getNativeBuffer().pointer` + */ + nativeBuffer?: bigint; + + /** + * Frame width in pixels + */ + width: number; + + /** + * Frame height in pixels + */ + height: number; +} diff --git a/packages/react-native-executorch/src/types/objectDetection.ts b/packages/react-native-executorch/src/types/objectDetection.ts index 94f7cf5c0..2dddaad64 100644 --- a/packages/react-native-executorch/src/types/objectDetection.ts +++ b/packages/react-native-executorch/src/types/objectDetection.ts @@ -170,14 +170,77 @@ export interface ObjectDetectionType { downloadProgress: number; /** - * Executes the model's forward pass to detect objects within the provided image. - * @param imageSource - A string representing the image source (e.g., a file path, URI, or base64 string) to be processed. - * @param detectionThreshold - An optional number between 0 and 1 representing the minimum confidence score required for an object to be included in the results. Default is 0.7. - * @returns A Promise that resolves to an array of `Detection` objects, where each object typically contains bounding box coordinates, a class label, and a confidence score. + * Executes the model's forward pass with automatic input type detection. + * + * Supports two input types: + * 1. **String path/URI**: File path, URL, or Base64-encoded string + * 2. **PixelData**: Raw pixel data from image libraries (e.g., NitroImage) + * + * **Note**: For VisionCamera frame processing, use `processFrame` instead. + * + * @param input - Image source (string or PixelData object) + * @param detectionThreshold - An optional number between 0 and 1 representing the minimum confidence score. Default is 0.7. + * @returns A Promise that resolves to an array of `Detection` objects. * @throws {RnExecutorchError} If the model is not loaded or is currently processing another image. + * + * @example + * ```typescript + * // String path + * const detections1 = await model.forward('file:///path/to/image.jpg'); + * + * // Pixel data + * const detections2 = await model.forward({ + * data: pixelBuffer, + * width: 640, + * height: 480, + * channels: 3 + * }); + * ``` */ forward: ( - imageSource: string, + input: + | string + | { + data: ArrayBuffer; + width: number; + height: number; + channels: number; + }, detectionThreshold?: number ) => Promise; + + /** + * Synchronous worklet function for real-time VisionCamera frame processing. + * Automatically handles native buffer extraction and cleanup. + * + * **Use this for VisionCamera frame processing in worklets.** + * For async processing, use `forward()` instead. + * + * Available after model is loaded (`isReady: true`). + * + * @example + * ```typescript + * const { runOnFrame, isReady } = useObjectDetection({ model: MODEL }); + * + * const frameOutput = useFrameOutput({ + * onFrame(frame) { + * 'worklet'; + * if (!runOnFrame) return; + * const detections = runOnFrame(frame, 0.5); + * frame.dispose(); + * } + * }); + * ``` + * + * @param frame - VisionCamera Frame object + * @param detectionThreshold - The threshold for detection sensitivity. Default is 0.7. + * @returns Array of Detection objects representing detected items in the frame. + */ + runOnFrame: ((frame: any, detectionThreshold?: number) => Detection[]) | null; + + /** + * Direct reference to the module instance for advanced use cases. + * Most users should use `forward()` for async processing or `runOnFrame` for real-time frame processing. + */ + moduleInstance: any; } diff --git a/packages/react-native-executorch/src/utils/ResourceFetcher.ts b/packages/react-native-executorch/src/utils/ResourceFetcher.ts index f17e14ae0..4437772ad 100644 --- a/packages/react-native-executorch/src/utils/ResourceFetcher.ts +++ b/packages/react-native-executorch/src/utils/ResourceFetcher.ts @@ -1,509 +1,91 @@ -/** - * Resource Fetcher - * - * Provides an interface for downloading files (via `ResourceFetcher.fetch()`) - * - * Key functionality: - * - Download control: pause, resume, and cancel operations through: - * - Single file: `.pauseFetching()`, `.resumeFetching()`, `.cancelFetching()` - * - Downloaded file management: - * - `.getFilesTotalSize()`, `.listDownloadedFiles()`, `.listDownloadedModels()`, `.deleteResources()` - * - * Remark: The pausing/resuming/canceling works only for fetching remote resources. - * - * Most exported functions accept: - * - Multiple `ResourceSource` arguments, (union type of string, number or object) - * - * Method `.fetch()` takes argument as callback that reports download progress. - * Method`.fetch()` returns array of paths to successfully saved files or null if the download was paused or cancelled (then resume functions can return paths). - * - * Technical Implementation: - * - Maintains a `downloads` Map instance that tracks: - * - Currently downloading resources - * - Paused downloads - * - Successful downloads are automatically removed from the `downloads` Map - * - Uses the `ResourceSourceExtended` interface to enable pause/resume functionality: - * - Wraps user-provided `ResourceSource` elements - * - Implements linked list behavior via the `.next` attribute - * - Automatically processes subsequent downloads when `.next` contains a valid resource - */ - -import { - cacheDirectory, - copyAsync, - createDownloadResumable, - moveAsync, - FileSystemSessionType, - writeAsStringAsync, - EncodingType, - deleteAsync, - readDirectoryAsync, -} from 'expo-file-system/legacy'; -import { Asset } from 'expo-asset'; -import { Platform } from 'react-native'; -import { RNEDirectory } from '../constants/directories'; import { ResourceSource } from '../types/common'; -import { - ResourceFetcherUtils, - HTTP_CODE, - DownloadStatus, - SourceType, - ResourceSourceExtended, - DownloadResource, -} from './ResourceFetcherUtils'; -import { RnExecutorchErrorCode } from '../errors/ErrorCodes'; import { RnExecutorchError } from '../errors/errorUtils'; +import { RnExecutorchErrorCode } from '../errors/ErrorCodes'; /** - * This module provides functions to download and work with downloaded files stored in the application's document directory inside the `react-native-executorch/` directory. - * These utilities can help you manage your storage and clean up the downloaded files when they are no longer needed. + * Adapter interface for resource fetching operations. * - * @category Utilities - General + * **Required Methods:** + * - {@link fetch}: Download resources to local storage (used by all modules) + * - {@link readAsString}: Read file contents as string (used for config files) + * + * @remarks + * This interface is intentionally minimal. Custom fetchers only need to implement + * these two methods for the library to function correctly. */ -export class ResourceFetcher { - static downloads = new Map(); //map of currently downloading (or paused) files, if the download was started by .fetch() method. - +export interface ResourceFetcherAdapter { /** - * Fetches resources (remote URLs, local files or embedded assets), downloads or stores them locally for use by React Native ExecuTorch. + * Download resources to local storage. * - * @param callback - Optional callback to track progress of all downloads, reported between 0 and 1. - * @param sources - Multiple resources that can be strings, asset references, or objects. - * @returns If the fetch was successful, it returns a promise which resolves to an array of local file paths for the downloaded/stored resources (without file:// prefix). - * If the fetch was interrupted by `pauseFetching` or `cancelFetching`, it returns a promise which resolves to `null`. - */ - static async fetch( - callback: (downloadProgress: number) => void = () => {}, - ...sources: ResourceSource[] - ) { - if (sources.length === 0) { - throw new RnExecutorchError( - RnExecutorchErrorCode.InvalidUserInput, - 'Empty list given as an argument' - ); - } - const { results: info, totalLength } = - await ResourceFetcherUtils.getFilesSizes(sources); - const head: ResourceSourceExtended = { - source: info[0]!.source, - sourceType: info[0]!.type, - callback: - info[0]!.type === SourceType.REMOTE_FILE - ? ResourceFetcherUtils.calculateDownloadProgress( - totalLength, - info[0]!.previousFilesTotalLength, - info[0]!.length, - callback - ) - : () => {}, - results: [], - }; - - let node = head; - for (let idx = 1; idx < sources.length; idx++) { - node.next = { - source: info[idx]!.source, - sourceType: info[idx]!.type, - callback: - info[idx]!.type === SourceType.REMOTE_FILE - ? ResourceFetcherUtils.calculateDownloadProgress( - totalLength, - info[idx]!.previousFilesTotalLength, - info[idx]!.length, - callback - ) - : () => {}, - results: [], - }; - node = node.next; - } - return this.singleFetch(head); - } - - private static async singleFetch( - sourceExtended: ResourceSourceExtended - ): Promise { - const source = sourceExtended.source; - switch (sourceExtended.sourceType) { - case SourceType.OBJECT: { - return this.returnOrStartNext( - sourceExtended, - await this.handleObject(source) - ); - } - case SourceType.LOCAL_FILE: { - return this.returnOrStartNext( - sourceExtended, - this.handleLocalFile(source) - ); - } - case SourceType.RELEASE_MODE_FILE: { - return this.returnOrStartNext( - sourceExtended, - await this.handleReleaseModeFile(sourceExtended) - ); - } - case SourceType.DEV_MODE_FILE: { - const result = await this.handleDevModeFile(sourceExtended); - if (result !== null) { - return this.returnOrStartNext(sourceExtended, result); - } - return null; - } - default: { - //case SourceType.REMOTE_FILE - const result = await this.handleRemoteFile(sourceExtended); - if (result !== null) { - return this.returnOrStartNext(sourceExtended, result); - } - return null; - } - } - } - - //if any download ends successfully this function is called - it checks whether it should trigger next download or return list of paths. - private static returnOrStartNext( - sourceExtended: ResourceSourceExtended, - result: string - ) { - sourceExtended.results.push(result); - - if (sourceExtended.next) { - const nextSource = sourceExtended.next; - nextSource.results.push(...sourceExtended.results); - return this.singleFetch(nextSource); - } - sourceExtended.callback!(1); - return sourceExtended.results; - } - - private static async pause(source: ResourceSource) { - const resource = this.downloads.get(source)!; - switch (resource.status) { - case DownloadStatus.PAUSED: - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherAlreadyPaused, - "The file download is currently paused. Can't pause the download of the same file twice." - ); - default: { - resource.status = DownloadStatus.PAUSED; - await resource.downloadResumable.pauseAsync(); - } - } - } - - private static async resume(source: ResourceSource) { - const resource = this.downloads.get(source)!; - if ( - !resource.extendedInfo.fileUri || - !resource.extendedInfo.cacheFileUri || - !resource.extendedInfo.uri - ) { - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherMissingUri, - 'Something went wrong. File uri info is not specified' - ); - } - switch (resource.status) { - case DownloadStatus.ONGOING: - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherAlreadyOngoing, - "The file download is currently ongoing. Can't resume the ongoing download." - ); - default: { - resource.status = DownloadStatus.ONGOING; - const result = await resource.downloadResumable.resumeAsync(); - if ( - !this.downloads.has(source) || - this.downloads.get(source)!.status === DownloadStatus.PAUSED - ) { - //if canceled or paused after earlier resuming. - return null; - } - if ( - !result || - (result.status !== HTTP_CODE.OK && - result.status !== HTTP_CODE.PARTIAL_CONTENT) - ) { - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherDownloadFailed, - `Failed to fetch resource from '${resource.extendedInfo.uri}, context: ${result}'` - ); - } - await moveAsync({ - from: resource.extendedInfo.cacheFileUri, - to: resource.extendedInfo.fileUri, - }); - this.downloads.delete(source); - ResourceFetcherUtils.triggerHuggingFaceDownloadCounter( - resource.extendedInfo.uri - ); - - return this.returnOrStartNext( - resource.extendedInfo, - ResourceFetcherUtils.removeFilePrefix(resource.extendedInfo.fileUri) - ); - } - } - } - - private static async cancel(source: ResourceSource) { - const resource = this.downloads.get(source)!; - await resource.downloadResumable.cancelAsync(); - this.downloads.delete(source); - } - - /** - * Pauses an ongoing download of files. + * @param callback - Progress callback (0-100) + * @param sources - One or more resources to download + * @returns Array of local file paths, or null if download was interrupted * - * @param sources - The resource identifiers used when calling `fetch`. - * @returns A promise that resolves once the download is paused. + * @remarks + * **REQUIRED**: Used by all library modules for downloading models and resources. */ - static async pauseFetching(...sources: ResourceSource[]) { - const source = this.findActive(sources); - await this.pause(source); - } + fetch( + callback: (downloadProgress: number) => void, + ...sources: ResourceSource[] + ): Promise; /** - * Resumes a paused download of files. + * Read file contents as a string. * - * @param sources - The resource identifiers used when calling fetch. - * @returns If the fetch was successful, it returns a promise which resolves to an array of local file paths for the downloaded resources (without file:// prefix). - * If the fetch was again interrupted by `pauseFetching` or `cancelFetching`, it returns a promise which resolves to `null`. - */ - static async resumeFetching(...sources: ResourceSource[]) { - const source = this.findActive(sources); - await this.resume(source); - } - - /** - * Cancels an ongoing/paused download of files. + * @param path - Absolute file path + * @returns File contents as string * - * @param sources - The resource identifiers used when calling `fetch()`. - * @returns A promise that resolves once the download is canceled. + * @remarks + * **REQUIRED**: Used internally for reading configuration files (e.g., tokenizer configs). */ - static async cancelFetching(...sources: ResourceSource[]) { - const source = this.findActive(sources); - await this.cancel(source); - } + readAsString(path: string): Promise; +} - private static findActive(sources: ResourceSource[]) { - for (const source of sources) { - if (this.downloads.has(source)) { - return source; - } - } - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherNotActive, - 'None of given sources are currently during downloading process.' - ); - } +/** + * This module provides functions to download and work with downloaded files stored in the application's document directory inside the `react-native-executorch/` directory. + * These utilities can help you manage your storage and clean up the downloaded files when they are no longer needed. + * + * @category Utilities - General + */ +export class ResourceFetcher { + private static adapter: ResourceFetcherAdapter | null = null; - /** - * Lists all the downloaded files used by React Native ExecuTorch. - * - * @returns A promise, which resolves to an array of URIs for all the downloaded files. - */ - static async listDownloadedFiles() { - const files = await readDirectoryAsync(RNEDirectory); - return files.map((file) => `${RNEDirectory}${file}`); + static setAdapter(adapter: ResourceFetcherAdapter) { + this.adapter = adapter; } - /** - * Lists all the downloaded models used by React Native ExecuTorch. - * - * @returns A promise, which resolves to an array of URIs for all the downloaded models. - */ - static async listDownloadedModels() { - const files = await this.listDownloadedFiles(); - return files.filter((file) => file.endsWith('.pte')); + static resetAdapter() { + this.adapter = null; } - /** - * Deletes downloaded resources from the local filesystem. - * - * @param sources - The resource identifiers used when calling `fetch`. - * @returns A promise that resolves once all specified resources have been removed. - */ - static async deleteResources(...sources: ResourceSource[]) { - for (const source of sources) { - const filename = ResourceFetcherUtils.getFilenameFromUri( - source as string + static getAdapter(): ResourceFetcherAdapter { + if (!this.adapter) { + throw new RnExecutorchError( + RnExecutorchErrorCode.NotImplemented, + 'ResourceFetcher adapter is not initialized. Please call initExecutorch({ resourceFetcher: ... }) with a valid adapter, e.g., from @react-native-executorch/expo-resource-fetcher or @react-native-executorch/bare-resource-fetcher.' ); - const fileUri = `${RNEDirectory}${filename}`; - if (await ResourceFetcherUtils.checkFileExists(fileUri)) { - await deleteAsync(fileUri); - } } + return this.adapter; } /** - * Fetches the info about files size. Works only for remote files. + * Fetches resources (remote URLs, local files or embedded assets), downloads or stores them locally for use by React Native ExecuTorch. * - * @param sources - The resource identifiers (URLs). - * @returns A promise that resolves to combined size of files in bytes. + * @param callback - Optional callback to track progress of all downloads, reported between 0 and 1. + * @param sources - Multiple resources that can be strings, asset references, or objects. + * @returns If the fetch was successful, it returns a promise which resolves to an array of local file paths for the downloaded/stored resources (without file:// prefix). + * If the fetch was interrupted by `pauseFetching` or `cancelFetching`, it returns a promise which resolves to `null`. */ - static async getFilesTotalSize(...sources: ResourceSource[]) { - return (await ResourceFetcherUtils.getFilesSizes(sources)).totalLength; - } - - private static async handleObject(source: ResourceSource) { - if (typeof source !== 'object') { - throw new RnExecutorchError( - RnExecutorchErrorCode.InvalidModelSource, - 'Source is expected to be object' - ); - } - const jsonString = JSON.stringify(source); - const digest = ResourceFetcherUtils.hashObject(jsonString); - const filename = `${digest}.json`; - const path = `${RNEDirectory}${filename}`; - - if (await ResourceFetcherUtils.checkFileExists(path)) { - return ResourceFetcherUtils.removeFilePrefix(path); - } - - await ResourceFetcherUtils.createDirectoryIfNoExists(); - await writeAsStringAsync(path, jsonString, { - encoding: EncodingType.UTF8, - }); - - return ResourceFetcherUtils.removeFilePrefix(path); - } - - private static handleLocalFile(source: ResourceSource) { - if (typeof source !== 'string') { - throw new RnExecutorchError( - RnExecutorchErrorCode.InvalidModelSource, - 'Source is expected to be string' - ); - } - return ResourceFetcherUtils.removeFilePrefix(source); - } - - private static async handleReleaseModeFile( - sourceExtended: ResourceSourceExtended - ) { - const source = sourceExtended.source; - if (typeof source !== 'number') { - throw new RnExecutorchError( - RnExecutorchErrorCode.InvalidModelSource, - 'Source is expected to be number' - ); - } - const asset = Asset.fromModule(source); - const uri = asset.uri; - const filename = ResourceFetcherUtils.getFilenameFromUri(uri); - const fileUri = `${RNEDirectory}${filename}`; - // On Android, file uri does not contain file extension, so we add it manually - const fileUriWithType = - Platform.OS === 'android' ? `${fileUri}.${asset.type}` : fileUri; - if (await ResourceFetcherUtils.checkFileExists(fileUri)) { - return ResourceFetcherUtils.removeFilePrefix(fileUri); - } - await ResourceFetcherUtils.createDirectoryIfNoExists(); - await copyAsync({ - from: asset.uri, - to: fileUriWithType, - }); - return ResourceFetcherUtils.removeFilePrefix(fileUriWithType); - } - - private static async handleDevModeFile( - sourceExtended: ResourceSourceExtended + static async fetch( + callback: (downloadProgress: number) => void = () => {}, + ...sources: ResourceSource[] ) { - const source = sourceExtended.source; - if (typeof source !== 'number') { - throw new RnExecutorchError( - RnExecutorchErrorCode.InvalidModelSource, - 'Source is expected to be a number' - ); - } - sourceExtended.uri = Asset.fromModule(source).uri; - return await this.handleRemoteFile(sourceExtended); + return this.getAdapter().fetch(callback, ...sources); } - private static async handleRemoteFile( - sourceExtended: ResourceSourceExtended - ) { - const source = sourceExtended.source; - if (typeof source === 'object') { - throw new RnExecutorchError( - RnExecutorchErrorCode.InvalidModelSource, - 'Source is expected to be a string or a number' - ); - } - if (this.downloads.has(source)) { - const resource = this.downloads.get(source)!; - if (resource.status === DownloadStatus.PAUSED) { - // if the download is paused, `fetch` is treated like `resume` - this.resume(source); - } - // if the download is ongoing, throw error. - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherDownloadInProgress, - 'Already downloading this file' - ); - } - if (typeof source === 'number' && !sourceExtended.uri) { - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherMissingUri, - 'Source Uri is expected to be available here' - ); - } - if (typeof source === 'string') { - sourceExtended.uri = source; - } - const uri = sourceExtended.uri!; - const filename = ResourceFetcherUtils.getFilenameFromUri(uri); - sourceExtended.fileUri = `${RNEDirectory}${filename}`; - sourceExtended.cacheFileUri = `${cacheDirectory}${filename}`; - - if (await ResourceFetcherUtils.checkFileExists(sourceExtended.fileUri)) { - return ResourceFetcherUtils.removeFilePrefix(sourceExtended.fileUri); - } - await ResourceFetcherUtils.createDirectoryIfNoExists(); - - const downloadResumable = createDownloadResumable( - uri, - sourceExtended.cacheFileUri, - { sessionType: FileSystemSessionType.BACKGROUND }, - ({ totalBytesWritten, totalBytesExpectedToWrite }) => { - if (totalBytesExpectedToWrite === -1) { - // If totalBytesExpectedToWrite is -1, it means the server does not provide content length. - sourceExtended.callback!(0); - return; - } - sourceExtended.callback!(totalBytesWritten / totalBytesExpectedToWrite); - } - ); - //create value for the this.download Map - const downloadResource: DownloadResource = { - downloadResumable: downloadResumable, - status: DownloadStatus.ONGOING, - extendedInfo: sourceExtended, - }; - //add key-value pair to map - this.downloads.set(source, downloadResource); - const result = await downloadResumable.downloadAsync(); - if ( - !this.downloads.has(source) || - this.downloads.get(source)!.status === DownloadStatus.PAUSED - ) { - // if canceled or paused during the download - return null; - } - if (!result || result.status !== HTTP_CODE.OK) { - throw new RnExecutorchError( - RnExecutorchErrorCode.ResourceFetcherDownloadFailed, - `Failed to fetch resource from '${source}, context: ${result}'` - ); - } - await moveAsync({ - from: sourceExtended.cacheFileUri, - to: sourceExtended.fileUri, - }); - this.downloads.delete(source); - ResourceFetcherUtils.triggerHuggingFaceDownloadCounter(uri); - return ResourceFetcherUtils.removeFilePrefix(sourceExtended.fileUri); - } + static fs = { + readAsString: async (path: string) => { + return this.getAdapter().readAsString(path); + }, + }; } diff --git a/packages/react-native-executorch/src/utils/ResourceFetcherUtils.ts b/packages/react-native-executorch/src/utils/ResourceFetcherUtils.ts index 207adce9e..ae60b4ab0 100644 --- a/packages/react-native-executorch/src/utils/ResourceFetcherUtils.ts +++ b/packages/react-native-executorch/src/utils/ResourceFetcherUtils.ts @@ -1,28 +1,16 @@ -import { RNEDirectory } from '../constants/directories'; -import { ResourceSource } from '../types/common'; -import { Asset } from 'expo-asset'; -import { Logger } from '../common/Logger'; +import { ResourceSource } from '..'; -/** - * @internal - */ -import { - getInfoAsync, - makeDirectoryAsync, - type DownloadResumable, -} from 'expo-file-system/legacy'; - -export const enum HTTP_CODE { +export enum HTTP_CODE { OK = 200, PARTIAL_CONTENT = 206, } -export const enum DownloadStatus { +export enum DownloadStatus { ONGOING, PAUSED, } -export const enum SourceType { +export enum SourceType { OBJECT, LOCAL_FILE, RELEASE_MODE_FILE, @@ -41,71 +29,7 @@ export interface ResourceSourceExtended { next?: ResourceSourceExtended; } -export interface DownloadResource { - downloadResumable: DownloadResumable; - status: DownloadStatus; - extendedInfo: ResourceSourceExtended; -} - export namespace ResourceFetcherUtils { - export function getType(source: ResourceSource): SourceType { - if (typeof source === 'object') { - return SourceType.OBJECT; - } else if (typeof source === 'number') { - const uri = Asset.fromModule(source).uri; - if (uri.startsWith('http')) { - return SourceType.DEV_MODE_FILE; - } - return SourceType.RELEASE_MODE_FILE; - } - // typeof source == 'string' - if (source.startsWith('file://')) { - return SourceType.LOCAL_FILE; - } - return SourceType.REMOTE_FILE; - } - - export async function getFilesSizes(sources: ResourceSource[]) { - const results: Array<{ - source: ResourceSource; - type: SourceType; - length: number; - previousFilesTotalLength: number; - }> = []; - let totalLength = 0; - let previousFilesTotalLength = 0; - for (const source of sources) { - const type = ResourceFetcherUtils.getType(source); - let length = 0; - try { - if (type === SourceType.REMOTE_FILE && typeof source === 'string') { - const response = await fetch(source, { method: 'HEAD' }); - if (!response.ok) { - Logger.warn( - `Failed to fetch HEAD for ${source}: ${response.status}` - ); - continue; - } - - const contentLength = response.headers.get('content-length'); - if (!contentLength) { - Logger.warn(`No content-length header for ${source}`); - } - - length = contentLength ? parseInt(contentLength, 10) : 0; - previousFilesTotalLength = totalLength; - totalLength += length; - } - } catch (error) { - Logger.warn(`Error fetching HEAD for ${source}:`, error); - continue; - } finally { - results.push({ source, type, length, previousFilesTotalLength }); - } - } - return { results, totalLength }; - } - export function removeFilePrefix(uri: string) { return uri.startsWith('file://') ? uri.slice(7) : uri; } @@ -165,17 +89,6 @@ export namespace ResourceFetcherUtils { } } - export async function createDirectoryIfNoExists() { - if (!(await checkFileExists(RNEDirectory))) { - await makeDirectoryAsync(RNEDirectory, { intermediates: true }); - } - } - - export async function checkFileExists(fileUri: string) { - const fileInfo = await getInfoAsync(fileUri); - return fileInfo.exists; - } - export function getFilenameFromUri(uri: string) { let cleanUri = uri.replace(/^https?:\/\//, ''); cleanUri = cleanUri.split('#')?.[0] ?? cleanUri; diff --git a/packages/react-native-executorch/third-party/include/absl/base/config.h b/packages/react-native-executorch/third-party/include/absl/base/config.h index d1bb2606d..64a30c743 100644 --- a/packages/react-native-executorch/third-party/include/absl/base/config.h +++ b/packages/react-native-executorch/third-party/include/absl/base/config.h @@ -976,7 +976,7 @@ static_assert(ABSL_INTERNAL_INLINE_NAMESPACE_STR[0] != 'h' || #error __EMSCRIPTEN_tiny__ is too big to fit in ABSL_INTERNAL_EMSCRIPTEN_VERSION #endif #define ABSL_INTERNAL_EMSCRIPTEN_VERSION \ - ((__EMSCRIPTEN_major__) * 1000000 + (__EMSCRIPTEN_minor__) * 1000 + \ + ((__EMSCRIPTEN_major__)*1000000 + (__EMSCRIPTEN_minor__)*1000 + \ (__EMSCRIPTEN_tiny__)) #endif #endif diff --git a/packages/react-native-executorch/third-party/include/absl/base/internal/raw_logging.h b/packages/react-native-executorch/third-party/include/absl/base/internal/raw_logging.h index 8abe8e0d4..140f58bd8 100644 --- a/packages/react-native-executorch/third-party/include/absl/base/internal/raw_logging.h +++ b/packages/react-native-executorch/third-party/include/absl/base/internal/raw_logging.h @@ -199,8 +199,8 @@ using InternalLogFunction = void (*)(absl::LogSeverity severity, const std::string &message); ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES - ABSL_DLL extern base_internal::AtomicHook - internal_log_function; +ABSL_DLL extern base_internal::AtomicHook + internal_log_function; // Registers hooks of the above types. Only a single hook of each type may be // registered. It is an error to call these functions multiple times with diff --git a/packages/react-native-executorch/third-party/include/absl/types/internal/optional.h b/packages/react-native-executorch/third-party/include/absl/types/internal/optional.h index c2dc8a258..6136db0f7 100644 --- a/packages/react-native-executorch/third-party/include/absl/types/internal/optional.h +++ b/packages/react-native-executorch/third-party/include/absl/types/internal/optional.h @@ -139,10 +139,9 @@ class optional_data_base : public optional_data_dtor_base { // Also, we should be checking is_trivially_copyable here, which is not // supported now, so we use is_trivially_* traits instead. template ::value && - absl::is_trivially_copy_assignable< - typename std::remove_cv::type>::value && - std::is_trivially_destructible::value> + bool unused = absl::is_trivially_copy_constructible::value + &&absl::is_trivially_copy_assignable::type>::value &&std::is_trivially_destructible::value> class optional_data; // Trivially copyable types @@ -184,8 +183,8 @@ class optional_data : public optional_data_base { } optional_data &operator=(optional_data &&rhs) noexcept( - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_constructible::value) { + std::is_nothrow_move_assignable::value + &&std::is_nothrow_move_constructible::value) { if (rhs.engaged_) { this->assign(std::move(rhs.data_)); } else { diff --git a/packages/react-native-executorch/third-party/include/absl/types/optional.h b/packages/react-native-executorch/third-party/include/absl/types/optional.h index 4f4b19507..aeedec99f 100644 --- a/packages/react-native-executorch/third-party/include/absl/types/optional.h +++ b/packages/react-native-executorch/third-party/include/absl/types/optional.h @@ -388,8 +388,8 @@ class optional : private optional_internal::optional_data, // Swap, standard semantics void swap(optional &rhs) noexcept( - std::is_nothrow_move_constructible::value && - type_traits_internal::IsNothrowSwappable::value) { + std::is_nothrow_move_constructible::value + &&type_traits_internal::IsNothrowSwappable::value) { if (*this) { if (rhs) { type_traits_internal::Swap(**this, *rhs); diff --git a/packages/react-native-executorch/third-party/include/executorch/extension/llm/tokenizers/include/pytorch/tokenizers/pcre2_regex.h b/packages/react-native-executorch/third-party/include/executorch/extension/llm/tokenizers/include/pytorch/tokenizers/pcre2_regex.h index 87a4fb8a9..fee30475d 100644 --- a/packages/react-native-executorch/third-party/include/executorch/extension/llm/tokenizers/include/pytorch/tokenizers/pcre2_regex.h +++ b/packages/react-native-executorch/third-party/include/executorch/extension/llm/tokenizers/include/pytorch/tokenizers/pcre2_regex.h @@ -27,7 +27,7 @@ class Pcre2Regex : public IRegex { /** * @brief Construct a PCRE2 regex. */ - explicit Pcre2Regex() {}; + explicit Pcre2Regex(){}; /** * @brief Compile the given regex pattern. diff --git a/packages/react-native-executorch/third-party/include/nlohmann/detail/hash.hpp b/packages/react-native-executorch/third-party/include/nlohmann/detail/hash.hpp index 1fad2a0aa..1f5501faf 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/detail/hash.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/detail/hash.hpp @@ -106,10 +106,11 @@ template std::size_t hash(const BasicJsonType &j) { return seed; } - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE - return 0; // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE } } diff --git a/packages/react-native-executorch/third-party/include/nlohmann/detail/input/binary_reader.hpp b/packages/react-native-executorch/third-party/include/nlohmann/detail/input/binary_reader.hpp index 634e5a164..862f26250 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/detail/input/binary_reader.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/detail/input/binary_reader.hpp @@ -132,8 +132,9 @@ class binary_reader { case input_format_t::json: // LCOV_EXCL_LINE default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } // strict mode: next byte must be EOF @@ -347,11 +348,10 @@ class binary_reader { default: // anything else not supported (yet) { std::array cr{{}}; - static_cast(( - std:: - snprintf)(cr.data(), cr.size(), "%.2hhX", - static_cast( - element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)( + cr.data(), cr.size(), "%.2hhX", + static_cast( + element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) const std::string cr_str{cr.data()}; return sax->parse_error( element_type_parse_position, cr_str, @@ -852,9 +852,10 @@ class binary_reader { return get_cbor_binary(b) && sax->binary(b); } - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE return false; // LCOV_EXCL_LINE } } @@ -2071,8 +2072,9 @@ class binary_reader { "count in an optimized container must be positive", "size"), nullptr)); } - result = static_cast(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): - // number is not a char + result = static_cast( + number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): + // number is not a char return true; } @@ -2987,11 +2989,10 @@ class binary_reader { */ std::string get_token_string() const { std::array cr{{}}; - static_cast(( - std:: - snprintf)(cr.data(), cr.size(), "%.2hhX", - static_cast( - current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)( + cr.data(), cr.size(), "%.2hhX", + static_cast( + current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) return std::string{cr.data()}; } @@ -3029,8 +3030,9 @@ class binary_reader { case input_format_t::json: // LCOV_EXCL_LINE default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } return concat(error_msg, ' ', context, ": ", detail); diff --git a/packages/react-native-executorch/third-party/include/nlohmann/detail/input/lexer.hpp b/packages/react-native-executorch/third-party/include/nlohmann/detail/input/lexer.hpp index 30712a6a5..47cb47ad3 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/detail/input/lexer.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/detail/input/lexer.hpp @@ -966,9 +966,10 @@ class lexer : public lexer_base { } // all other characters are rejected outside scan_number() - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } scan_number_minus: @@ -1369,11 +1370,10 @@ class lexer : public lexer_base { if (static_cast(c) <= '\x1F') { // escape control characters std::array cs{{}}; - static_cast(( - std:: - snprintf)(cs.data(), cs.size(), "", - static_cast( - c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)( + cs.data(), cs.size(), "", + static_cast( + c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) result += cs.data(); } else { // add character as is diff --git a/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/iteration_proxy.hpp b/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/iteration_proxy.hpp index b89f00bef..2a0570c2e 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/iteration_proxy.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/iteration_proxy.hpp @@ -58,8 +58,9 @@ template class iteration_proxy_value { explicit iteration_proxy_value( IteratorType it, std::size_t array_index_ = - 0) noexcept(std::is_nothrow_move_constructible::value && - std::is_nothrow_default_constructible::value) + 0) noexcept(std::is_nothrow_move_constructible::value + &&std::is_nothrow_default_constructible< + string_type>::value) : anchor(std::move(it)), array_index(array_index_) {} iteration_proxy_value(iteration_proxy_value const &) = default; @@ -67,12 +68,12 @@ template class iteration_proxy_value { // older GCCs are a bit fussy and require explicit noexcept specifiers on // defaulted functions iteration_proxy_value(iteration_proxy_value &&) noexcept( - std::is_nothrow_move_constructible::value && - std::is_nothrow_move_constructible::value) = + std::is_nothrow_move_constructible::value + &&std::is_nothrow_move_constructible::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations) iteration_proxy_value &operator=(iteration_proxy_value &&) noexcept( - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_assignable::value) = + std::is_nothrow_move_assignable::value + &&std::is_nothrow_move_assignable::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations) ~iteration_proxy_value() = default; diff --git a/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/primitive_iterator.hpp b/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/primitive_iterator.hpp index 32531bd5a..4ad1fad35 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/primitive_iterator.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/detail/iterators/primitive_iterator.hpp @@ -76,7 +76,7 @@ class primitive_iterator_t { return *this; } - primitive_iterator_t operator++(int) & noexcept // NOLINT(cert-dcl21-cpp) + primitive_iterator_t operator++(int) &noexcept // NOLINT(cert-dcl21-cpp) { auto result = *this; ++m_it; @@ -88,7 +88,7 @@ class primitive_iterator_t { return *this; } - primitive_iterator_t operator--(int) & noexcept // NOLINT(cert-dcl21-cpp) + primitive_iterator_t operator--(int) &noexcept // NOLINT(cert-dcl21-cpp) { auto result = *this; --m_it; diff --git a/packages/react-native-executorch/third-party/include/nlohmann/detail/output/serializer.hpp b/packages/react-native-executorch/third-party/include/nlohmann/detail/output/serializer.hpp index 1d50048f9..f1a49b201 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/detail/output/serializer.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/detail/output/serializer.hpp @@ -326,9 +326,10 @@ template class serializer { return; } - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } } @@ -425,13 +426,10 @@ template class serializer { bytes += 6; } else { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) - static_cast( - (std::snprintf)(string_buffer.data() + bytes, 13, - "\\u%04x\\u%04x", - static_cast( - 0xD7C0u + (codepoint >> 10u)), - static_cast( - 0xDC00u + (codepoint & 0x3FFu)))); + static_cast((std::snprintf)( + string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", + static_cast(0xD7C0u + (codepoint >> 10u)), + static_cast(0xDC00u + (codepoint & 0x3FFu)))); bytes += 12; } } else { @@ -521,9 +519,10 @@ template class serializer { break; } - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } break; } @@ -575,9 +574,10 @@ template class serializer { break; } - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } } } @@ -905,9 +905,10 @@ template class serializer { * Must never be called. */ number_unsigned_t remove_sign(number_unsigned_t x) { - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE - return x; // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE + return x; // LCOV_EXCL_LINE } /* diff --git a/packages/react-native-executorch/third-party/include/nlohmann/json.hpp b/packages/react-native-executorch/third-party/include/nlohmann/json.hpp index 44a41de92..a9bc9125a 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/json.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/json.hpp @@ -732,8 +732,8 @@ class // been invalidated; see https://github.com/nlohmann/json/issues/2962 #ifdef JSON_HEDLEY_MSVC_VERSION #pragma warning(push) -#pragma warning(disable \ - : 4127) // ignore warning to replace if with if constexpr +#pragma warning( \ + disable : 4127) // ignore warning to replace if with if constexpr #endif if (detail::is_ordered_map::value) { set_parents(); @@ -858,9 +858,10 @@ class case value_t::discarded: m_data.m_type = value_t::discarded; break; - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } JSON_ASSERT(m_data.m_type == val.type()); set_parents(); @@ -1179,11 +1180,11 @@ class /// @brief copy assignment /// @sa https://json.nlohmann.me/api/basic_json/operator=/ basic_json &operator=(basic_json other) noexcept( - std::is_nothrow_move_constructible::value && - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_constructible::value && - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_assignable::value) { + std::is_nothrow_move_constructible< + value_t>::value &&std::is_nothrow_move_assignable::value + &&std::is_nothrow_move_constructible::value + &&std::is_nothrow_move_assignable::value + &&std::is_nothrow_move_assignable::value) { // check that passed value is valid other.assert_invariant(); @@ -1673,7 +1674,8 @@ class #if defined(JSON_HAS_CPP_14) constexpr #endif - auto get() const noexcept(noexcept( + auto + get() const noexcept(noexcept( std::declval().template get_impl( detail::priority_tag<4>{}))) -> decltype(std::declval() @@ -3382,11 +3384,11 @@ class /// @brief exchanges the values /// @sa https://json.nlohmann.me/api/basic_json/swap/ void swap(reference other) noexcept( - std::is_nothrow_move_constructible::value && - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_constructible:: - value && // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap) - std::is_nothrow_move_assignable::value) { + std::is_nothrow_move_constructible< + value_t>::value &&std::is_nothrow_move_assignable::value + &&std::is_nothrow_move_constructible::value + && // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + std::is_nothrow_move_assignable::value) { std::swap(m_data.m_type, other.m_data.m_type); std::swap(m_data.m_value, other.m_data.m_value); @@ -3398,11 +3400,11 @@ class /// @brief exchanges the values /// @sa https://json.nlohmann.me/api/basic_json/swap/ friend void swap(reference left, reference right) noexcept( - std::is_nothrow_move_constructible::value && - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_constructible:: - value && // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap) - std::is_nothrow_move_assignable::value) { + std::is_nothrow_move_constructible< + value_t>::value &&std::is_nothrow_move_assignable::value + &&std::is_nothrow_move_constructible::value + && // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + std::is_nothrow_move_assignable::value) { left.swap(right); } @@ -3581,8 +3583,9 @@ class // - any operand is discarded // in legacy mode, discarded values are considered ordered if // an operation is computed as an odd number of inverses of others - static bool compares_unordered(const_reference lhs, const_reference rhs, - bool inverse = false) noexcept { + static bool + compares_unordered(const_reference lhs, const_reference rhs, + bool inverse = false) noexcept { if ((lhs.is_number_float() && std::isnan(lhs.m_data.m_value.number_float) && rhs.is_number()) || (rhs.is_number_float() && std::isnan(rhs.m_data.m_value.number_float) && @@ -3622,8 +3625,8 @@ class /// @brief comparison: equal /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ template - requires std::is_scalar_v - bool operator==(ScalarType rhs) const noexcept { + requires std::is_scalar_v bool + operator==(ScalarType rhs) const noexcept { return *this == basic_json(rhs); } @@ -3677,8 +3680,8 @@ class /// @brief comparison: less than or equal /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ template - requires std::is_scalar_v - bool operator<=(ScalarType rhs) const noexcept { + requires std::is_scalar_v bool + operator<=(ScalarType rhs) const noexcept { return *this <= basic_json(rhs); } @@ -3696,8 +3699,8 @@ class /// @brief comparison: greater than or equal /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ template - requires std::is_scalar_v - bool operator>=(ScalarType rhs) const noexcept { + requires std::is_scalar_v bool + operator>=(ScalarType rhs) const noexcept { return *this >= basic_json(rhs); } #endif @@ -4522,7 +4525,8 @@ class 3.11.0, basic_json::json_pointer or nlohmann::json_pointer< basic_json::string_t>) // NOLINT(readability/alt_tokens) - reference operator[](const ::nlohmann::json_pointer &ptr) { + reference + operator[](const ::nlohmann::json_pointer &ptr) { return ptr.get_unchecked(this); } @@ -4696,8 +4700,9 @@ class case value_t::binary: // LCOV_EXCL_LINE case value_t::discarded: // LCOV_EXCL_LINE default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) - // LCOV_EXCL_LINE + JSON_ASSERT( + false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + // LCOV_EXCL_LINE } }; @@ -5088,13 +5093,15 @@ struct less< /// @brief exchanges the values of two JSON objects /// @sa https://json.nlohmann.me/api/basic_json/std_swap/ NLOHMANN_BASIC_JSON_TPL_DECLARATION -inline void -swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, - nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, - // cert-dcl58-cpp) - is_nothrow_move_constructible:: - value && // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) - is_nothrow_move_assignable::value) { +inline void swap( + nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, + nlohmann::NLOHMANN_BASIC_JSON_TPL & + j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, + // cert-dcl58-cpp) + is_nothrow_move_constructible::value + && // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + is_nothrow_move_assignable< + nlohmann::NLOHMANN_BASIC_JSON_TPL>::value) { j1.swap(j2); } diff --git a/packages/react-native-executorch/third-party/include/nlohmann/thirdparty/hedley/hedley.hpp b/packages/react-native-executorch/third-party/include/nlohmann/thirdparty/hedley/hedley.hpp index ba0d4ef88..9599f7d88 100644 --- a/packages/react-native-executorch/third-party/include/nlohmann/thirdparty/hedley/hedley.hpp +++ b/packages/react-native-executorch/third-party/include/nlohmann/thirdparty/hedley/hedley.hpp @@ -53,7 +53,7 @@ #undef JSON_HEDLEY_VERSION_ENCODE #endif #define JSON_HEDLEY_VERSION_ENCODE(major, minor, revision) \ - (((major) * 1000000) + ((minor) * 1000) + (revision)) + (((major)*1000000) + ((minor)*1000) + (revision)) #if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) #undef JSON_HEDLEY_VERSION_DECODE_MAJOR @@ -199,7 +199,7 @@ #elif defined(__SUNPRO_C) #define JSON_HEDLEY_SUNPRO_VERSION \ JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, \ - (__SUNPRO_C) & 0xf) + (__SUNPRO_C)&0xf) #elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) #define JSON_HEDLEY_SUNPRO_VERSION \ JSON_HEDLEY_VERSION_ENCODE( \ @@ -209,7 +209,7 @@ #elif defined(__SUNPRO_CC) #define JSON_HEDLEY_SUNPRO_VERSION \ JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, \ - (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) + (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC)&0xf) #endif #if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) @@ -1975,13 +1975,13 @@ JSON_HEDLEY_DIAGNOSTIC_POP #if defined(__INTPTR_TYPE__) #define JSON_HEDLEY_IS_CONSTEXPR_(expr) \ __builtin_types_compatible_p( \ - __typeof__((1 ? (void *)((__INTPTR_TYPE__)((expr) * 0)) : (int *)0)), \ + __typeof__((1 ? (void *)((__INTPTR_TYPE__)((expr)*0)) : (int *)0)), \ int *) #else #include #define JSON_HEDLEY_IS_CONSTEXPR_(expr) \ __builtin_types_compatible_p( \ - __typeof__((1 ? (void *)((intptr_t)((expr) * 0)) : (int *)0)), int *) + __typeof__((1 ? (void *)((intptr_t)((expr)*0)) : (int *)0)), int *) #endif #elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ @@ -1995,13 +1995,12 @@ JSON_HEDLEY_DIAGNOSTIC_POP JSON_HEDLEY_ARM_VERSION_CHECK(5, 3, 0) #if defined(__INTPTR_TYPE__) #define JSON_HEDLEY_IS_CONSTEXPR_(expr) \ - _Generic((1 ? (void *)((__INTPTR_TYPE__)((expr) * 0)) : (int *)0), \ - int *: 1, \ - void *: 0) + _Generic((1 ? (void *)((__INTPTR_TYPE__)((expr)*0)) : (int *)0), int * : 1, \ + void * : 0) #else #include #define JSON_HEDLEY_IS_CONSTEXPR_(expr) \ - _Generic((1 ? (void *)((intptr_t)*0) : (int *)0), int *: 1, void *: 0) + _Generic((1 ? (void *)((intptr_t)*0) : (int *)0), int * : 1, void * : 0) #endif #elif defined(JSON_HEDLEY_GCC_VERSION) || \ defined(JSON_HEDLEY_INTEL_VERSION) || \ @@ -2013,7 +2012,7 @@ JSON_HEDLEY_DIAGNOSTIC_POP defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ defined(JSON_HEDLEY_TI_CLPRU_VERSION) || defined(__clang__) #define JSON_HEDLEY_IS_CONSTEXPR_(expr) \ - (sizeof(void) != sizeof(*(1 ? ((void *)((expr) * 0L)) \ + (sizeof(void) != sizeof(*(1 ? ((void *)((expr)*0L)) \ : ((struct { char v[sizeof(void) * 2]; } *)1)))) #endif #endif @@ -2139,12 +2138,14 @@ JSON_HEDLEY_DIAGNOSTIC_POP #if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") #define JSON_HEDLEY_REQUIRE(expr) \ JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") __attribute__(( \ - diagnose_if(!(expr), #expr, "error"))) JSON_HEDLEY_DIAGNOSTIC_POP + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP #define JSON_HEDLEY_REQUIRE_MSG(expr, msg) \ JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") __attribute__(( \ - diagnose_if(!(expr), msg, "error"))) JSON_HEDLEY_DIAGNOSTIC_POP + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP #else #define JSON_HEDLEY_REQUIRE(expr) \ __attribute__((diagnose_if(!(expr), #expr, "error"))) diff --git a/readmes/README_fr.md b/readmes/README_fr.md index 4623bda5a..6fd2b3238 100644 --- a/readmes/README_fr.md +++ b/readmes/README_fr.md @@ -2,7 +2,6 @@ RNE Logo
-

React Native ExecuTorch

diff --git a/readmes/README_in.md b/readmes/README_in.md index e9433dde6..e0bcc42aa 100644 --- a/readmes/README_in.md +++ b/readmes/README_in.md @@ -25,7 +25,6 @@ README IN

- **React Native ExecuTorch** एक घोषणात्मक तरीका प्रदान करता है जिससे React Native का उपयोग करके उपकरण पर AI मॉडल्स को चलाया जा सके, जो **ExecuTorch** द्वारा संचालित है :rocket:. यह LLMs, कंप्यूटर विज़न मॉडल्स, और भी कई के लिए आउट-ऑफ़-द-बॉक्स सपोर्ट प्रदान करता है। इन मॉडलों का अन्वेषण करने के लिए हमारे [HuggingFace](https://huggingface.co/software-mansion) पेज पर जाएं। **ExecuTorch**, Meta द्वारा विकसित, एक नया फ्रेमवर्क है जो मोबाइल फोनों या माइक्रोकंट्रोलर्स जैसे उपकरणों पर AI मॉडल निष्पादन की अनुमति देता है। diff --git a/readmes/README_pt.md b/readmes/README_pt.md index d807bff77..80f579886 100644 --- a/readmes/README_pt.md +++ b/readmes/README_pt.md @@ -2,7 +2,6 @@ RNE Logo
-

React Native ExecuTorch

diff --git a/yarn.lock b/yarn.lock index 1ca8d5d29..a128bad62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,59 +33,59 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:7.10.4, @babel/code-frame@npm:~7.10.4": - version: 7.10.4 - resolution: "@babel/code-frame@npm:7.10.4" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.20.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" dependencies: - "@babel/highlight": "npm:^7.10.4" - checksum: 10/4ef9c679515be9cb8eab519fcded953f86226155a599cf7ea209e40e088bb9a51bb5893d3307eae510b07bb3e359d64f2620957a00c27825dbe26ac62aca81f5 + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/199e15ff89007dd30675655eec52481cb245c9fdf4f81e4dc1f866603b0217b57aff25f5ffa0a95bbc8e31eb861695330cd7869ad52cc211aa63016320ef72c5 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.20.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/code-frame@npm:7.27.1" +"@babel/code-frame@npm:~7.10.4": + version: 7.10.4 + resolution: "@babel/code-frame@npm:7.10.4" dependencies: - "@babel/helper-validator-identifier": "npm:^7.27.1" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10/721b8a6e360a1fa0f1c9fe7351ae6c874828e119183688b533c477aa378f1010f37cc9afbfc4722c686d1f5cdd00da02eab4ba7278a0c504fa0d7a321dcd4fdf + "@babel/highlight": "npm:^7.10.4" + checksum: 10/4ef9c679515be9cb8eab519fcded953f86226155a599cf7ea209e40e088bb9a51bb5893d3307eae510b07bb3e359d64f2620957a00c27825dbe26ac62aca81f5 languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/compat-data@npm:7.28.5" - checksum: 10/5a5ff00b187049e847f04bd02e21fbd8094544e5016195c2b45e56fa2e311eeb925b158f52a85624c9e6bacc1ce0323e26c303513723d918a8034e347e22610d +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.28.6, @babel/compat-data@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/compat-data@npm:7.29.0" + checksum: 10/7f21beedb930ed8fbf7eabafc60e6e6521c1d905646bf1317a61b2163339157fe797efeb85962bf55136e166b01fd1a6b526a15974b92a8b877d564dcb6c9580 languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.20.0, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": - version: 7.28.5 - resolution: "@babel/core@npm:7.28.5" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.25.2": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.5" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-module-transforms": "npm:^7.28.3" - "@babel/helpers": "npm:^7.28.4" - "@babel/parser": "npm:^7.28.5" - "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.28.5" - "@babel/types": "npm:^7.28.5" + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helpers": "npm:^7.28.6" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/2f1e224125179f423f4300d605a0c5a3ef315003281a63b1744405b2605ee2a2ffc5b1a8349aa4f262c72eca31c7e1802377ee04ad2b852a2c88f8ace6cac324 + checksum: 10/25f4e91688cdfbaf1365831f4f245b436cdaabe63d59389b75752013b8d61819ee4257101b52fc328b0546159fd7d0e74457ed7cf12c365fea54be4fb0a40229 languageName: node linkType: hard "@babel/eslint-parser@npm:^7.25.1": - version: 7.28.5 - resolution: "@babel/eslint-parser@npm:7.28.5" + version: 7.28.6 + resolution: "@babel/eslint-parser@npm:7.28.6" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": "npm:5.1.1-v1" eslint-visitor-keys: "npm:^2.1.0" @@ -93,20 +93,20 @@ __metadata: peerDependencies: "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 10/ec8eb061f319fe3854f4c720303bf239625e63c5ddc9391a3c00f17339d417dc5482dc043b64d15506b0e87f26820dfec9ff4880a1862f7c05f4cf1bbf6e34be + checksum: 10/15c0c9c78abcc5f267a34bab95437c37dfc468e3ac5e11094ed26bebd63c7a5b056fa47c005ba74eb9fbed6c79e37f90cbe2a24ed09425921275391fe9a5bbe7 languageName: node linkType: hard -"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.28.5, @babel/generator@npm:^7.7.2": - version: 7.28.5 - resolution: "@babel/generator@npm:7.28.5" +"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.7.2": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" dependencies: - "@babel/parser": "npm:^7.28.5" - "@babel/types": "npm:^7.28.5" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" "@jridgewell/gen-mapping": "npm:^0.3.12" "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10/ae618f0a17a6d76c3983e1fd5d9c2f5fdc07703a119efdb813a7d9b8ad4be0a07d4c6f0d718440d2de01a68e321f64e2d63c77fc5d43ae47ae143746ef28ac1f + checksum: 10/61fe4ddd6e817aa312a14963ccdbb5c9a8c57e8b97b98d19a8a99ccab2215fda1a5f52bc8dd8d2e3c064497ddeb3ab8ceb55c76fa0f58f8169c34679d2256fe0 languageName: node linkType: hard @@ -119,37 +119,37 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/helper-compilation-targets@npm:7.27.2" +"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2, @babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: - "@babel/compat-data": "npm:^7.27.2" + "@babel/compat-data": "npm:^7.28.6" "@babel/helper-validator-option": "npm:^7.27.1" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/bd53c30a7477049db04b655d11f4c3500aea3bcbc2497cf02161de2ecf994fec7c098aabbcebe210ffabc2ecbdb1e3ffad23fb4d3f18723b814f423ea1749fe8 + checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.27.1, @babel/helper-create-class-features-plugin@npm:^7.28.3, @babel/helper-create-class-features-plugin@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/helper-create-class-features-plugin@npm:7.28.5" +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.27.1, @babel/helper-create-class-features-plugin@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.6" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.27.3" "@babel/helper-member-expression-to-functions": "npm:^7.28.5" "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/0bbf3dfe91875f642fe7ef38f60647f0df8eb9994d4350b19a4d1a9bdc32629e49e56e9a80afb12eeb6f6bcc6666392b37f32231b7c054fc91a0d5251cd67d5b + checksum: 10/11f55607fcf66827ade745c0616aa3c6086aa655c0fab665dd3c4961829752e4c94c942262db30c4831ef9bce37ad444722e85ef1b7136587e28c6b1ef8ad43c languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" dependencies: @@ -162,18 +162,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.5": - version: 0.6.5 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" +"@babel/helper-define-polyfill-provider@npm:^0.6.5, @babel/helper-define-polyfill-provider@npm:^0.6.6": + version: 0.6.6 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - debug: "npm:^4.4.1" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + debug: "npm:^4.4.3" lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.22.10" + resolve: "npm:^1.22.11" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/0bdd2d9654d2f650c33976caa1a2afac2c23cf07e83856acdb482423c7bf4542c499ca0bdc723f2961bb36883501f09e9f4fe061ba81c07996daacfba82a6f62 + checksum: 10/1c725c47bafb10ae4527aff6741b44ca49b18bf7005ae4583b15f992783e7c1d7687eab1a5583a373b5494160d46e91e29145280bd850e97d36b8b01bc5fef99 languageName: node linkType: hard @@ -193,7 +193,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.27.1, @babel/helper-member-expression-to-functions@npm:^7.28.5": +"@babel/helper-member-expression-to-functions@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: @@ -203,26 +203,26 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.25.9, @babel/helper-module-imports@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-module-imports@npm:7.27.1" +"@babel/helper-module-imports@npm:^7.25.9, @babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10/58e792ea5d4ae71676e0d03d9fef33e886a09602addc3bd01388a98d87df9fcfd192968feb40ac4aedb7e287ec3d0c17b33e3ecefe002592041a91d8a1998a8d + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/helper-module-transforms@npm:7.28.3" +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.3" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/598fdd8aa5b91f08542d0ba62a737847d0e752c8b95ae2566bc9d11d371856d6867d93e50db870fb836a6c44cfe481c189d8a2b35ca025a224f070624be9fa87 + checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b languageName: node linkType: hard @@ -235,10 +235,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.27.1 - resolution: "@babel/helper-plugin-utils@npm:7.27.1" - checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: 10/21c853bbc13dbdddf03309c9a0477270124ad48989e1ad6524b83e83a77524b333f92edd2caae645c5a7ecf264ec6d04a9ebe15aeb54c7f33c037b71ec521e4a languageName: node linkType: hard @@ -255,16 +255,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-replace-supers@npm:7.27.1" +"@babel/helper-replace-supers@npm:^7.27.1, @babel/helper-replace-supers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-replace-supers@npm:7.28.6" dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/72e3f8bef744c06874206bf0d80a0abbedbda269586966511c2491df4f6bf6d47a94700810c7a6737345a545dfb8295222e1e72f506bcd0b40edb3f594f739ea + checksum: 10/ad2724713a4d983208f509e9607e8f950855f11bd97518a700057eb8bec69d687a8f90dc2da0c3c47281d2e3b79cf1d14ecf1fe3e1ee0a8e90b61aee6759c9a7 languageName: node linkType: hard @@ -285,7 +285,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": +"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 @@ -300,23 +300,23 @@ __metadata: linkType: hard "@babel/helper-wrap-function@npm:^7.27.1": - version: 7.28.3 - resolution: "@babel/helper-wrap-function@npm:7.28.3" + version: 7.28.6 + resolution: "@babel/helper-wrap-function@npm:7.28.6" dependencies: - "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.28.3" - "@babel/types": "npm:^7.28.2" - checksum: 10/a5ed5fe7b8d9949d3b4f45ccec0b365018b8e444f6a6d794b4c8291e251e680f5b7c79c49c2170de9d14967c78721f59620ce70c5dac2d53c30628ef971d9dce + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/d8a895a75399904746f4127db33593a20021fc55d1a5b5dfeb060b87cc13a8dceea91e70a4951bcd376ba9bd8232b0c04bff9a86c1dab83d691e01852c3b5bcd languageName: node linkType: hard -"@babel/helpers@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/helpers@npm:7.28.4" +"@babel/helpers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helpers@npm:7.28.6" dependencies: - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.4" - checksum: 10/5a70a82e196cf8808f8a449cc4780c34d02edda2bb136d39ce9d26e63b615f18e89a95472230c3ce7695db0d33e7026efeee56f6454ed43480f223007ed205eb + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/213485cdfffc4deb81fc1bf2cefed61bc825049322590ef69690e223faa300a2a4d1e7d806c723bb1f1f538226b9b1b6c356ca94eb47fa7c6d9e9f251ee425e6 languageName: node linkType: hard @@ -332,14 +332,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/parser@npm:7.28.5" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/parser@npm:7.29.0" dependencies: - "@babel/types": "npm:^7.28.5" + "@babel/types": "npm:^7.29.0" bin: parser: ./bin/babel-parser.js - checksum: 10/8d9bfb437af6c97a7f6351840b9ac06b4529ba79d6d3def24d6c2996ab38ff7f1f9d301e868ca84a93a3050fadb3d09dbc5105b24634cd281671ac11eebe8df7 + checksum: 10/b1576dca41074997a33ee740d87b330ae2e647f4b7da9e8d2abd3772b18385d303b0cee962b9b88425e0f30d58358dbb8d63792c1a2d005c823d335f6a029747 languageName: node linkType: hard @@ -390,15 +390,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.3" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/eeacdb7fa5ae19e366cbc4da98736b898e05b9abe572aa23093e6be842c6c8284d08af538528ec771073a3749718033be3713ff455ca008d11a7b0e90e62a53d + checksum: 10/9377897aa7cba3a0b78a7c6015799ff71504b2b203329357e42ab3185d44aab07344ba33f5dd53f14d5340c1dc5a2587346343e0859538947bbab0484e72b914 languageName: node linkType: hard @@ -416,7 +416,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.13.0, @babel/plugin-proposal-class-properties@npm:^7.18.0": +"@babel/plugin-proposal-class-properties@npm:^7.18.0": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" dependencies: @@ -429,15 +429,15 @@ __metadata: linkType: hard "@babel/plugin-proposal-decorators@npm:^7.12.9": - version: 7.28.0 - resolution: "@babel/plugin-proposal-decorators@npm:7.28.0" + version: 7.29.0 + resolution: "@babel/plugin-proposal-decorators@npm:7.29.0" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-syntax-decorators": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-syntax-decorators": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/984a4cc0891ac910ee65793c02299048ad18903855032f3e922476b5bd1e9839dd1ed0505bf3f69956b50b6d4dcbc3c74798bcc4c12d0160c37c187c2330ead4 + checksum: 10/fa7b9aa1a48993ad60b9e118619ed364aa67da4c634b8a755a6f0529a9f61719723fccfdaf3bf0c6ff693eeee0992a67fb311e0cbe8fed7d48de43cdc8ebff2c languageName: node linkType: hard @@ -452,7 +452,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.13.8, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.18.0": +"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.18.0": version: 7.18.6 resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" dependencies: @@ -503,7 +503,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.13.12, @babel/plugin-proposal-optional-chaining@npm:^7.20.0": +"@babel/plugin-proposal-optional-chaining@npm:^7.20.0": version: 7.21.0 resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" dependencies: @@ -569,14 +569,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-decorators@npm:7.27.1" +"@babel/plugin-syntax-decorators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-decorators@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2dd303f969c7eacb666294493e87d0121122d2b0f6f678855f8e134e0866dc20633cbe1b7351e9eae3874f95657bfdc63dcde68992e99f014111a725467059ca + checksum: 10/6c7544eaa586aba1bcb400eab9304011c1d5be8d9cff02d02c930e70d4023505595c36feca2bf62960f3891d2c3abbc32e116d4c8ab1da63b0fc5329d7694919 languageName: node linkType: hard @@ -592,46 +592,46 @@ __metadata: linkType: hard "@babel/plugin-syntax-export-default-from@npm:^7.0.0, @babel/plugin-syntax-export-default-from@npm:^7.24.7": - version: 7.27.1 - resolution: "@babel/plugin-syntax-export-default-from@npm:7.27.1" + version: 7.28.6 + resolution: "@babel/plugin-syntax-export-default-from@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d9a6a9c51f644a5ed139dbe1e8cf5a38c9b390af27ad2fc6f0eba579ac543b039efff34200744bfc8523132c06aa6de921238bd2088948bb4dce4571cea43438 + checksum: 10/06330b90a4baf9edafe8a4e2e6520d548f83e178c1e832c1ad5018532052996331aedc8c3b4e6b0e51acaef75abe76e25ad3465d3d914658d65acec6908f202a languageName: node linkType: hard "@babel/plugin-syntax-flow@npm:^7.12.1, @babel/plugin-syntax-flow@npm:^7.18.0, @babel/plugin-syntax-flow@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-flow@npm:7.27.1" + version: 7.28.6 + resolution: "@babel/plugin-syntax-flow@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7baca3171ed595d04c865b0ce46fca7f21900686df9d7fcd1017036ce78bb5483e33803de810831e68d39cf478953db69f49ae3f3de2e3207bc4ba49a96b6739 + checksum: 10/3dfe5d8168e400376e16937c92648142771b9ba0d9937b04ccdaacd06bf9d854170021b466106d4aa39ba6062b8b5b9b53efddae2c64ca133d4d6fafaa472909 languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.27.1" +"@babel/plugin-syntax-import-assertions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/fb661d630808d67ecb85eabad25aac4e9696a20464bad4c4a6a0d3d40e4dc22557d47e9be3d591ec06429cf048cfe169b8891c373606344d51c4f3ac0f91d6d0 + checksum: 10/25017235e1e2c4ed892aa327a3fa10f4209cc618c6dd7806fc40c07d8d7d24a39743d3d5568b8d1c8f416cffe03c174e78874ded513c9338b07a7ab1dcbab050 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" +"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf + checksum: 10/6c8c6a5988dbb9799d6027360d1a5ba64faabf551f2ef11ba4eade0c62253b5c85d44ddc8eb643c74b9acb2bcaa664a950bd5de9a5d4aef291c4f2a48223bb4b languageName: node linkType: hard @@ -657,14 +657,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.27.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.28.6, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.28.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c6d1324cff286a369aa95d99b8abd21dd07821b5d3affd5fe7d6058c84cff9190743287826463ee57a7beecd10fa1e4bc99061df532ee14e188c1c8937b13e3a + checksum: 10/572e38f5c1bb4b8124300e7e3dd13e82ae84a21f90d3f0786c98cd05e63c78ca1f32d1cfe462dfbaf5e7d5102fa7cd8fd741dfe4f3afc2e01a3b2877dcc8c866 languageName: node linkType: hard @@ -756,14 +756,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.27.1 - resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" +"@babel/plugin-syntax-typescript@npm:^7.28.6, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.28.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/87836f7e32af624c2914c73cd6b9803cf324e07d43f61dbb973c6a86f75df725e12540d91fac7141c14b697aa9268fd064220998daced156e96ac3062d7afb41 + checksum: 10/5c55f9c63bd36cf3d7e8db892294c8f85000f9c1526c3a1cc310d47d1e174f5c6f6605e5cc902c4636d885faba7a9f3d5e5edc6b35e4f3b1fd4c2d58d0304fa5 languageName: node linkType: hard @@ -779,7 +779,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.0.0-0, @babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": +"@babel/plugin-transform-arrow-functions@npm:7.27.1, @babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.0.0-0, @babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: @@ -790,29 +790,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.0" + "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8ad31b9969b203dec572738a872e17b14ef76ca45b4ef5ffa76f3514be417ca233d1a0978e5f8de166412a8a745619eb22b07cc5df96f5ebad8ca500f920f61b + checksum: 10/e2c064a5eb212cbdf14f7c0113e069b845ca0f0ba431c1cc04607d3fc4f3bf1ed70f5c375fe7c61338a45db88bc1a79d270c8d633ce12256e1fce3666c1e6b93 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.20.0, @babel/plugin-transform-async-to-generator@npm:^7.24.7, @babel/plugin-transform-async-to-generator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" +"@babel/plugin-transform-async-to-generator@npm:^7.20.0, @babel/plugin-transform-async-to-generator@npm:^7.24.7, @babel/plugin-transform-async-to-generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-remap-async-to-generator": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d79d7a7ae7d416f6a48200017d027a6ba94c09c7617eea8b4e9c803630f00094c1a4fc32bf20ce3282567824ce3fcbda51653aac4003c71ea4e681b331338979 + checksum: 10/bca5774263ec01dd2bf71c74bbaf7baa183bf03576636b7826c3346be70c8c8cb15cff549112f2983c36885131a0afde6c443591278c281f733ee17f455aa9b1 languageName: node linkType: hard @@ -827,18 +827,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.28.5" +"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4b695360ede8472262111efb9d5c35b515767e1ead9e272c3e9799235e3f5feeb21d99a66bb23acbba9424465d13e7695a22a22a680c4aa558702ef8aad461d6 + checksum: 10/7ab8a0856024a5360ba16c3569b739385e939bc5a15ad7d811bec8459361a9aa5ee7c5f154a4e2ce79f5d66779c19464e7532600c31a1b6f681db4eb7e1c7bde languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": +"@babel/plugin-transform-class-properties@npm:7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: @@ -850,19 +850,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.27.1, @babel/plugin-transform-class-static-block@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/plugin-transform-class-static-block@npm:7.28.3" +"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.28.3" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.27.1, @babel/plugin-transform-class-static-block@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/c0ba8f0cbf3699287e5a711907dab3b29f346d9c107faa4e424aa26252e45845d74ca08ee6245bfccf32a8c04bc1d07a89b635e51522592c6044b810a48d3f58 + checksum: 10/bea7836846deefd02d9976ad1b30b5ade0d6329ecd92866db789dcf6aacfaf900b7a77031e25680f8de5ad636a771a5bdca8961361e6218d45d538ec5d9b71cc languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.0.0-0, @babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.4": +"@babel/plugin-transform-classes@npm:7.28.4": version: 7.28.4 resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: @@ -878,19 +890,35 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.24.7, @babel/plugin-transform-computed-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" +"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.0.0-0, @babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/template": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/9c3278a314d1c4bcda792bb22aced20e30c735557daf9bcc56397c0f3eb54761b21c770219e4581036a10dabda3e597321ed093bc245d5f4d561e19ceff66a6d + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.24.7, @babel/plugin-transform-computed-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/101f6d4575447070943d5a9efaa5bea8c552ea3083d73a9612f1a16d38b0a0a7b79a5feb65c6cc4e4fcabf28e85a570b97ccd3294da966e8fbbb6dfb97220eda + checksum: 10/4a5e270f7e1f1e9787cf7cf133d48e3c1e38eb935d29a90331a1324d7c720f589b7b626b2e6485cd5521a7a13f2dbdc89a3e46ecbe7213d5bbb631175267c4aa languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.20.0, @babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.28.0, @babel/plugin-transform-destructuring@npm:^7.28.5": +"@babel/plugin-transform-destructuring@npm:^7.20.0, @babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.28.5": version: 7.28.5 resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" dependencies: @@ -902,15 +930,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.27.1" +"@babel/plugin-transform-dotall-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2173e5b13f403538ffc6bd57b190cedf4caf320abc13a99e5b2721864e7148dbd3bd7c82d92377136af80432818f665fdd9a1fd33bc5549a4c91e24e5ce2413c + checksum: 10/866ffbbdee77fa955063b37c75593db8dbbe46b1ebb64cc788ea437e3a9aa41cb7b9afcee617c678a32b6705baa0892ec8e5d4b8af3bbb0ab1b254514ccdbd37 languageName: node linkType: hard @@ -925,15 +953,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/2a109613535e6ac79240dced71429e988affd6a5b3d0cd0f563c8d6c208c51ce7bf2c300bc1150502376b26a51f279119b3358f1c0f2d2f8abca3bcd62e1ae46 + checksum: 10/7fa7b773259a578c9e01c80946f75ecc074520064aa7a87a65db06c7df70766e2fa6be78cda55fa9418a14e30b2b9d595484a46db48074d495d9f877a4276065 languageName: node linkType: hard @@ -948,26 +976,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/93d7835160bf8623c7b7072898046c9a2a46cf911f38fa2a002de40a11045a65bf9c1663c98f2e4e04615037f63391832c20b45d7bc26a16d39a97995d0669bc + checksum: 10/36d638a253dbdaee5548b4ddd21c04ee4e39914b207437bb64cf79bb41c2caadb4321768d3dba308c1016702649bc44efe751e2052de393004563c7376210d86 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.5" +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/da9bb5acd35c9fba92b802641f9462b82334158a149c78a739a04576a1e62be41057a201a41c022dda263bb73ac1a26521bbc997c7fc067f54d487af297995f4 + checksum: 10/b232152499370435c7cd4bf3321f58e189150e35ca3722ea16533d33434b97294df1342f5499671ec48e62b71c34cdea0ca8cf317ad12594a10f6fc670315e62 languageName: node linkType: hard @@ -982,7 +1010,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.20.0, @babel/plugin-transform-flow-strip-types@npm:^7.25.2, @babel/plugin-transform-flow-strip-types@npm:^7.26.5, @babel/plugin-transform-flow-strip-types@npm:^7.27.1": +"@babel/plugin-transform-flow-strip-types@npm:^7.20.0, @babel/plugin-transform-flow-strip-types@npm:^7.25.2, @babel/plugin-transform-flow-strip-types@npm:^7.26.5": version: 7.27.1 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.27.1" dependencies: @@ -1019,14 +1047,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-json-strings@npm:7.27.1" +"@babel/plugin-transform-json-strings@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2c05a02f63b49f47069271b3405a66c3c8038de5b995b0700b1bd9a5e2bb3e67abd01e4604629302a521f4d8122a4233944aefa16559fd4373d256cc5d3da57f + checksum: 10/69d82a1a0a72ed6e6f7969e09cf330516599d79b2b4e680e9dd3c57616a8c6af049b5103456e370ab56642815e80e46ed88bb81e9e059304a85c5fe0bf137c29 languageName: node linkType: hard @@ -1041,14 +1069,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.5" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c76778f4b186cc4f0b7e3658d91c690678bdb2b9d032f189213016d6177f2564709b79b386523b022b7d52e52331fd91f280f7c7bf85d835e0758b4b0d371447 + checksum: 10/36095d5d1cfc680e95298b5389a16016da800ae3379b130dabf557e94652c47b06610407e9fa44aaa03e9b0a5aa7b4b93348123985d44a45e369bf5f3497d149 languageName: node linkType: hard @@ -1075,29 +1103,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" +"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1, @babel/plugin-transform-modules-commonjs@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9059243a977bc1f13e3dccfc6feb6508890e7c7bb191f7eb56626b20672b4b12338051ca835ab55426875a473181502c8f35b4df58ba251bef63b25866d995fe + checksum: 10/ec6ea2958e778a7e0220f4a75cb5816cecddc6bd98efa10499fff7baabaa29a594d50d787a4ebf8a8ba66fefcf76ca2ded602be0b4554ae3317e53b3b3375b37 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.28.5" +"@babel/plugin-transform-modules-systemjs@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.0" dependencies: - "@babel/helper-module-transforms": "npm:^7.28.3" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.28.5" + "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1b91b4848845eaf6e21663d97a2a6c896553b127deaf3c2e9a2a4f041249277d13ebf71fd42d0ecbc4385e9f76093eff592fe0da0dcf1401b3f38c1615d8c539 + checksum: 10/b3e64728eef02d829510778226da4c06be740fe52e0d45d4aa68b24083096d8ad7df67f2e9e67198b2e85f3237d42bd66f5771f85846f7a746105d05ca2e0cae languageName: node linkType: hard @@ -1113,15 +1141,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.0.0, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.0.0, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/a711c92d9753df26cefc1792481e5cbff4fe4f32b383d76b25e36fa865d8023b1b9aa6338cf18f5c0e864c71a7fbe8115e840872ccd61a914d9953849c68de7d + checksum: 10/ed8c27699ca82a6c01cbfd39f3de16b90cfea4f8146a358057f76df290d308a66a8bd2e6734e6a87f68c18576e15d2d70548a84cd474d26fdf256c3f5ae44d8c languageName: node linkType: hard @@ -1136,7 +1164,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": +"@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" dependencies: @@ -1147,29 +1175,40 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7, @babel/plugin-transform-numeric-separator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.27.1" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/049b958911de86d32408cd78017940a207e49c054ae9534ab53a32a57122cc592c0aae3c166d6f29bd1a7d75cc779d71883582dd76cb28b2fbb493e842d8ffca + checksum: 10/88106952ca4f4fea8f97222a25f9595c6859d458d76905845dfa54f54e7d345e3dc338932e8c84a9c57a6c88b2f6d9ebff47130ce508a49c2b6e6a9f03858750 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.4" +"@babel/plugin-transform-numeric-separator@npm:^7.24.7, @babel/plugin-transform-numeric-separator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/4b5ca60e481e22f0842761a3badca17376a230b5a7e5482338604eb95836c2d0c9c9bde53bdc5c2de1c6a12ae6c12de7464d098bf74b0943f85905ca358f0b68 + languageName: node + linkType: hard + +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.6" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" "@babel/plugin-transform-parameters": "npm:^7.27.7" - "@babel/traverse": "npm:^7.28.4" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/aebe464e368cefa5c3ba40316c47b61eb25f891d436b2241021efef5bd0b473c4aa5ba4b9fa0f4b4d5ce4f6bc6b727628d1ca79d54e7b8deebb5369f7dff2984 + checksum: 10/9c8c51a515a5ec98a33a715e82d49f873e58b04b53fa1e826f3c2009f7133cd396d6730553a53d265e096dbfbea17dd100ae38815d0b506c094cb316a7a5519e languageName: node linkType: hard @@ -1185,26 +1224,38 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7, @babel/plugin-transform-optional-catch-binding@npm:^7.27.1": +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7, @babel/plugin-transform-optional-catch-binding@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ee24a17defec056eb9ef01824d7e4a1f65d531af6b4b79acfd0bcb95ce0b47926e80c61897f36f8c01ce733b069c9acdb1c9ce5ec07a729d0dbf9e8d859fe992 + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-chaining@npm:7.27.1": version: 7.27.1 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.27.1" + resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f4356b04cf21a98480f9788ea50f1f13ee88e89bb6393ba4b84d1f39a4a84c7928c9a4328e8f4c5b6deb218da68a8fd17bf4f46faec7653ddc20ffaaa5ba49f4 + checksum: 10/34b0f96400c259a2722740d17a001fe45f78d8ff052c40e29db2e79173be72c1cfe8d9681067e3f5da3989e4a557402df5c982c024c18257587a41e022f95640 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.5" +"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0bc900bff66d5acc13b057107eaeb6084b4cb0b124654d35b103f71f292d33dba5beac444ab4f92528583585b6e0cf34d64ce9cbb473b15d22375a4a6ed3cbac + checksum: 10/c7cf29f99384a9a98748f04489a122c0106e0316aa64a2e61ef8af74c1057b587b96d9a08eb4e33d2ac17d1aaff1f0a86fae658d429fa7bcce4ef977e0ad684b languageName: node linkType: hard @@ -1219,28 +1270,28 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.24.7, @babel/plugin-transform-private-methods@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-private-methods@npm:7.27.1" +"@babel/plugin-transform-private-methods@npm:^7.24.7, @babel/plugin-transform-private-methods@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c76f8f6056946466116e67eb9d8014a2d748ade2062636ab82045c1dac9c233aff10e597777bc5af6f26428beb845ceb41b95007abef7d0484da95789da56662 + checksum: 10/b80179b28f6a165674d0b0d6c6349b13a01dd282b18f56933423c0a33c23fc0626c8f011f859fc20737d021fe966eb8474a5233e4596401482e9ee7fb00e2aa2 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7, @babel/plugin-transform-private-property-in-object@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7, @babel/plugin-transform-private-property-in-object@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d4466d42a02c5a318d9d7b8102969fd032b17ff044918dfd462d5cc49bd11f5773ee0794781702afdf4727ba11e9be6cbea1e396bc0a7307761bb9a56399012a + checksum: 10/d02008c62fd32ff747b850b8581ab5076b717320e1cb01c7fc66ebf5169095bd922e18cfb269992f85bc7fbd2cc61e5b5af25e2b54aad67411474b789ea94d5f languageName: node linkType: hard @@ -1300,17 +1351,17 @@ __metadata: linkType: hard "@babel/plugin-transform-react-jsx@npm:^7.0.0, @babel/plugin-transform-react-jsx@npm:^7.25.2, @babel/plugin-transform-react-jsx@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx@npm:7.27.1" + version: 7.28.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-syntax-jsx": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-syntax-jsx": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e865f194770906398957df23530af9a46009ac3737aaa10026b3925fe0a38fc3254f4b227d3b8807ab66ac92c14323bef561dd2217644052de5a9702af76e2f6 + checksum: 10/c6eade7309f0710b6aac9e747f8c3305633801c035a35efc5e2436742cc466e457ed5848d3dd5dade36e34332cfc50ac92d69a33f7803d66ae2d72f13a76c3bc languageName: node linkType: hard @@ -1326,26 +1377,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/plugin-transform-regenerator@npm:7.28.4" +"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/24da51a659d882e02bd4353da9d8e045e58d967c1cddaf985ad699a9fc9f920a45eff421c4283a248d83dc16590b8956e66fd710be5db8723b274cfea0b51b2f + checksum: 10/c8fa9da74371568c5d34fd7d53de018752550cb10334040ca59e41f34b27f127974bdc5b4d1a1a8e8f3ebcf3cb7f650aa3f2df3b7bf1b7edf67c04493b9e3cb8 languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.27.1" +"@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/f6cb385fe0e798bff7e9b20cf5912bf40e180895ff3610b1ccdce260f3c20daaebb3a99dc087c8168a99151cd3e16b94f4689fd5a4b01cf1834b45c133e620b2 + checksum: 10/5aacc570034c085afa0165137bb9a04cd4299b86eb9092933a96dcc1132c8f591d9d534419988f5f762b2f70d43a3c719a6b8fa05fdd3b2b1820d01cf85500da languageName: node linkType: hard @@ -1361,22 +1412,22 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.0.0, @babel/plugin-transform-runtime@npm:^7.24.7": - version: 7.28.5 - resolution: "@babel/plugin-transform-runtime@npm:7.28.5" + version: 7.29.0 + resolution: "@babel/plugin-transform-runtime@npm:7.29.0" dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" babel-plugin-polyfill-corejs2: "npm:^0.4.14" babel-plugin-polyfill-corejs3: "npm:^0.13.0" babel-plugin-polyfill-regenerator: "npm:^0.6.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0d16c90d40dd34f1a981e742ad656ceef619b92d3662ec9ac8d7c8ba79f22bb425c3f9e097333659a4938f03868a53077b1a3aadb7f37504157a0c7af64ec2be + checksum: 10/314cfede923a7fb3aeecf4b282a3090e4a9ae1d84005e9a0365284c5142165a4dccd308455af9013d486a4ad8ada25ccad2fea28c2ec19b086d1ffa0088a69d7 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.0.0-0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": +"@babel/plugin-transform-shorthand-properties@npm:7.27.1, @babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.0.0-0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: @@ -1387,15 +1438,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.24.7, @babel/plugin-transform-spread@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-spread@npm:7.27.1" +"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.24.7, @babel/plugin-transform-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-spread@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3edd28b07e1951f32aa2d380d9a0e0ed408c64a5cea2921d02308541042aca18f146b3a61e82e534d4d61cb3225dbc847f4f063aedfff6230b1a41282e95e8a2 + checksum: 10/1fa02ac60ae5e49d46fa2966aaf3f7578cf37255534c2ecf379d65855088a1623c3eea28b9ee6a0b1413b0199b51f9019d0da3fe9da89986bc47e07242415f60 languageName: node linkType: hard @@ -1421,7 +1472,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.0.0-0, @babel/plugin-transform-template-literals@npm:^7.27.1": +"@babel/plugin-transform-template-literals@npm:7.27.1, @babel/plugin-transform-template-literals@npm:^7.0.0-0, @babel/plugin-transform-template-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: @@ -1443,18 +1494,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.28.5, @babel/plugin-transform-typescript@npm:^7.5.0": - version: 7.28.5 - resolution: "@babel/plugin-transform-typescript@npm:7.28.5" +"@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.27.1, @babel/plugin-transform-typescript@npm:^7.28.5, @babel/plugin-transform-typescript@npm:^7.5.0": + version: 7.28.6 + resolution: "@babel/plugin-transform-typescript@npm:7.28.6" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.27.3" - "@babel/helper-create-class-features-plugin": "npm:^7.28.5" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/plugin-syntax-typescript": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e4706379df70c2de9d3d3f573ff74a160e05221620a22dd0a64899ab45fddad9e4530fbba33014c75906f13aa78d8044fed80dba85068e11d84ed1f033dea445 + checksum: 10/a0bccc531fa8710a45b0b593140273741e0e4a0721b1ef6ef9dfefae0bbe61528440d65aab7936929551fd76793272257d74f60cf66891352f793294930a4b67 languageName: node linkType: hard @@ -1469,19 +1520,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" +"@babel/plugin-transform-unicode-property-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5d99c89537d1ebaac3f526c04b162cf95a47d363d4829f78c6701a2c06ab78a48da66a94f853f85f44a3d72153410ba923e072bed4b7166fa097f503eb14131d + checksum: 10/d14e8c51aa73f592575c1543400fd67d96df6410d75c9dc10dd640fd7eecb37366a2f2368bbdd7529842532eda4af181c921bda95146c6d373c64ea59c6e9991 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.0.0, @babel/plugin-transform-unicode-regex@npm:^7.0.0-0, @babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": +"@babel/plugin-transform-unicode-regex@npm:7.27.1, @babel/plugin-transform-unicode-regex@npm:^7.0.0, @babel/plugin-transform-unicode-regex@npm:^7.0.0-0, @babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: @@ -1493,108 +1544,95 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/295126074c7388ab05c82ef3ed0907a1ee4666bbdd763477ead9aba6eb2c74bdf65669416861ac93d337a4a27640963bb214acadc2697275ce95aab14868d57f + checksum: 10/423971fe2eef9d18782b1c30f5f42613ee510e5b9c08760c5538a0997b36c34495acce261e0e37a27831f81330359230bd1f33c2e1822de70241002b45b7d68e languageName: node linkType: hard "@babel/preset-env@npm:^7.25.2": - version: 7.28.5 - resolution: "@babel/preset-env@npm:7.28.5" + version: 7.29.0 + resolution: "@babel/preset-env@npm:7.29.0" dependencies: - "@babel/compat-data": "npm:^7.28.5" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/compat-data": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-validator-option": "npm:^7.27.1" "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.6" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" - "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" + "@babel/plugin-syntax-import-assertions": "npm:^7.28.6" + "@babel/plugin-syntax-import-attributes": "npm:^7.28.6" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.28.0" - "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.29.0" + "@babel/plugin-transform-async-to-generator": "npm:^7.28.6" "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" - "@babel/plugin-transform-block-scoping": "npm:^7.28.5" - "@babel/plugin-transform-class-properties": "npm:^7.27.1" - "@babel/plugin-transform-class-static-block": "npm:^7.28.3" - "@babel/plugin-transform-classes": "npm:^7.28.4" - "@babel/plugin-transform-computed-properties": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.6" + "@babel/plugin-transform-class-properties": "npm:^7.28.6" + "@babel/plugin-transform-class-static-block": "npm:^7.28.6" + "@babel/plugin-transform-classes": "npm:^7.28.6" + "@babel/plugin-transform-computed-properties": "npm:^7.28.6" "@babel/plugin-transform-destructuring": "npm:^7.28.5" - "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.28.6" "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.29.0" "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" - "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.0" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.28.5" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.6" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.28.6" "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" "@babel/plugin-transform-for-of": "npm:^7.27.1" "@babel/plugin-transform-function-name": "npm:^7.27.1" - "@babel/plugin-transform-json-strings": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.28.6" "@babel/plugin-transform-literals": "npm:^7.27.1" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.28.5" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.28.6" "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" "@babel/plugin-transform-modules-amd": "npm:^7.27.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.28.5" + "@babel/plugin-transform-modules-commonjs": "npm:^7.28.6" + "@babel/plugin-transform-modules-systemjs": "npm:^7.29.0" "@babel/plugin-transform-modules-umd": "npm:^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.29.0" "@babel/plugin-transform-new-target": "npm:^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.28.4" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.28.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.28.6" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.6" "@babel/plugin-transform-object-super": "npm:^7.27.1" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.28.5" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.28.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.28.6" "@babel/plugin-transform-parameters": "npm:^7.27.7" - "@babel/plugin-transform-private-methods": "npm:^7.27.1" - "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" + "@babel/plugin-transform-private-methods": "npm:^7.28.6" + "@babel/plugin-transform-private-property-in-object": "npm:^7.28.6" "@babel/plugin-transform-property-literals": "npm:^7.27.1" - "@babel/plugin-transform-regenerator": "npm:^7.28.4" - "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.29.0" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.28.6" "@babel/plugin-transform-reserved-words": "npm:^7.27.1" "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" - "@babel/plugin-transform-spread": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.28.6" "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" "@babel/plugin-transform-template-literals": "npm:^7.27.1" "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.28.6" "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.28.6" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.14" - babel-plugin-polyfill-corejs3: "npm:^0.13.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.5" - core-js-compat: "npm:^3.43.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.15" + babel-plugin-polyfill-corejs3: "npm:^0.14.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.6" + core-js-compat: "npm:^3.48.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e9a5136a7e34553cc70dd6594716144678a2e9ecc971caf6885c380c38fcbed8b387f3af418c9aa4b2d2765964bb4e8a2e14b709c2f165eec6ed13bda32587ea - languageName: node - linkType: hard - -"@babel/preset-flow@npm:^7.13.13": - version: 7.27.1 - resolution: "@babel/preset-flow@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-transform-flow-strip-types": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/f3f25b390debf72a6ff0170a2d5198aea344ba96f05eaca0bae2c7072119706fd46321604d89646bda1842527cfc6eab8828a983ec90149218d2120b9cd26596 + checksum: 10/211b33ec8644636275f61aa273071d8cbc2a6bb28d82ad246e3831a6aa7d96c610a55b5140bcd21be7f71fb04c3aa4a10eb08665fb5505e153cfdd8dbc8c1c1c languageName: node linkType: hard @@ -1627,76 +1665,76 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.16.7, @babel/preset-typescript@npm:^7.23.0, @babel/preset-typescript@npm:^7.24.7": - version: 7.28.5 - resolution: "@babel/preset-typescript@npm:7.28.5" +"@babel/preset-typescript@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/preset-typescript@npm:7.27.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-validator-option": "npm:^7.27.1" "@babel/plugin-syntax-jsx": "npm:^7.27.1" "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" - "@babel/plugin-transform-typescript": "npm:^7.28.5" + "@babel/plugin-transform-typescript": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/72c03e01c34906041b1813542761a283c52da1751e7ddf63191bc5fb2a0354eca30a00537c5a92951688bec3975bdc0e50ef4516b5e94cfd6d4cf947f2125bdc + checksum: 10/9d8e75326b3c93fa016ba7aada652800fc77bc05fcc181888700a049935e8cf1284b549de18a5d62ef3591d02f097ea6de1111f7d71a991aaf36ba74657bd145 languageName: node linkType: hard -"@babel/register@npm:^7.13.16": - version: 7.28.3 - resolution: "@babel/register@npm:7.28.3" +"@babel/preset-typescript@npm:^7.16.7, @babel/preset-typescript@npm:^7.23.0, @babel/preset-typescript@npm:^7.24.7": + version: 7.28.5 + resolution: "@babel/preset-typescript@npm:7.28.5" dependencies: - clone-deep: "npm:^4.0.1" - find-cache-dir: "npm:^2.0.0" - make-dir: "npm:^2.1.0" - pirates: "npm:^4.0.6" - source-map-support: "npm:^0.5.16" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-typescript": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9475696152579933dbb0ffa7f47e0a3d130064101fc6ee471ec4cd8f20c70438798f3165708cb2ad29f585d81af0a26a4c233d732fbe63c7abec6a63b7d509d8 + checksum: 10/72c03e01c34906041b1813542761a283c52da1751e7ddf63191bc5fb2a0354eca30a00537c5a92951688bec3975bdc0e50ef4516b5e94cfd6d4cf947f2125bdc languageName: node linkType: hard "@babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.25.0": - version: 7.28.4 - resolution: "@babel/runtime@npm:7.28.4" - checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163 + version: 7.28.6 + resolution: "@babel/runtime@npm:7.28.6" + checksum: 10/fbcd439cb74d4a681958eb064c509829e3f46d8a4bfaaf441baa81bb6733d1e680bccc676c813883d7741bcaada1d0d04b15aa320ef280b5734e2192b50decf9 languageName: node linkType: hard -"@babel/template@npm:^7.0.0, @babel/template@npm:^7.25.0, @babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2, @babel/template@npm:^7.3.3": - version: 7.27.2 - resolution: "@babel/template@npm:7.27.2" +"@babel/template@npm:^7.0.0, @babel/template@npm:^7.25.0, @babel/template@npm:^7.28.6, @babel/template@npm:^7.3.3": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/parser": "npm:^7.27.2" - "@babel/types": "npm:^7.27.1" - checksum: 10/fed15a84beb0b9340e5f81566600dbee5eccd92e4b9cc42a944359b1aa1082373391d9d5fc3656981dff27233ec935d0bc96453cf507f60a4b079463999244d8 + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 languageName: node linkType: hard -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.4, @babel/traverse@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/traverse@npm:7.28.5" +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.4, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.5" + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.28.5" - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.5" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.29.0" debug: "npm:^4.3.1" - checksum: 10/1fce426f5ea494913c40f33298ce219708e703f71cac7ac045ebde64b5a7b17b9275dfa4e05fb92c3f123136913dff62c8113172f4a5de66dab566123dbe7437 + checksum: 10/3a0d0438f1ba9fed4fbe1706ea598a865f9af655a16ca9517ab57bda526e224569ca1b980b473fb68feea5e08deafbbf2cf9febb941f92f2d2533310c3fc4abc languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.26.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.28.5 - resolution: "@babel/types@npm:7.28.5" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.26.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.28.5" - checksum: 10/4256bb9fb2298c4f9b320bde56e625b7091ea8d2433d98dcf524d4086150da0b6555aabd7d0725162670614a9ac5bf036d1134ca13dedc9707f988670f1362d7 + checksum: 10/bfc2b211210f3894dcd7e6a33b2d1c32c93495dc1e36b547376aa33441abe551ab4bc1640d4154ee2acd8e46d3bbc925c7224caae02fcaf0e6a771e97fccc661 languageName: node linkType: hard @@ -1827,9 +1865,9 @@ __metadata: linkType: hard "@cspell/dict-aws@npm:^4.0.10": - version: 4.0.16 - resolution: "@cspell/dict-aws@npm:4.0.16" - checksum: 10/2b2e48a2d06f9c91b9422428247ae265c7b226bec98ec675d743193c1bbe2244c2fc48e97fe109cee7db0619cfe51ea9c0d319602b2c5c483a89eeaa610bc779 + version: 4.0.17 + resolution: "@cspell/dict-aws@npm:4.0.17" + checksum: 10/9f724e385ffe76a04cb3cd081bf301191c56b31273f5619507ca6baabf8fa00fbe27571d66e89016cd0bbc68cbf97a9920b5247e90e73a60e2eeedb87e1b86c6 languageName: node linkType: hard @@ -1843,9 +1881,9 @@ __metadata: linkType: hard "@cspell/dict-companies@npm:^3.1.15": - version: 3.2.7 - resolution: "@cspell/dict-companies@npm:3.2.7" - checksum: 10/b2754f6328c11d9d17ddbaa217a358280cf5a2b73378e161e62f70c50d51a67d456b6bdaedd63af8024cae52bca96b27a7d052d718d4449de47b2b01113e629b + version: 3.2.10 + resolution: "@cspell/dict-companies@npm:3.2.10" + checksum: 10/e3e6be70cef9be8fa7da86ed2ce1150545062175f6335d30de9bcac2cf509fbfa82d5428333129be823698870df48f78abbff4c6ee50b465efb1951adaa4cdf3 languageName: node linkType: hard @@ -1864,51 +1902,51 @@ __metadata: linkType: hard "@cspell/dict-csharp@npm:^4.0.6": - version: 4.0.7 - resolution: "@cspell/dict-csharp@npm:4.0.7" - checksum: 10/bfc429fc40585905a1b8754eaf1c70fd59911250364bc8ec5f1ce81dfb38cfb27421a8ed4052d81b40832dfb26de8d4e63656a200c5a6459ad0fa9da8e8bb6ae + version: 4.0.8 + resolution: "@cspell/dict-csharp@npm:4.0.8" + checksum: 10/5acb41c32cdce8c3bda7ea74dfb833db92c403813a57373b8781d4aaede005be1342ad946a16139d47162f2405b90869eee477fc033b7cc10d731bb3ff9547db languageName: node linkType: hard "@cspell/dict-css@npm:^4.0.17": - version: 4.0.18 - resolution: "@cspell/dict-css@npm:4.0.18" - checksum: 10/1d829b7e2b3bb7bea5daca179d4de847b7aac761a68984783b226132c986e42504cf4d6410ae69b3103afa4779859c2860810b5373d6bc80709637128c7d397c + version: 4.0.19 + resolution: "@cspell/dict-css@npm:4.0.19" + checksum: 10/293edf2d26b33d85ea5828b499e77e5a6a471f7c8ac754adf7c574dac62363f10d46d1de47afc20b8904554212834b671bbd8e98669e59908856ca1c46c787db languageName: node linkType: hard "@cspell/dict-dart@npm:^2.3.0": - version: 2.3.1 - resolution: "@cspell/dict-dart@npm:2.3.1" - checksum: 10/79764a0499a0267c34febc368ae8dfb47ebe58a79373e48070581a3a8095102a71e8cb88711b7dd431ca559d0d0554803ca2d53051e325903459a670f56c984f + version: 2.3.2 + resolution: "@cspell/dict-dart@npm:2.3.2" + checksum: 10/d4bf20c272110ad6537824199de1224447b798abf225fd3af2b73d8eca4d9e64eac3c2580940d93b07d74744d8e35aea7f2f547ac3ef3e73b0499bf36bb50f74 languageName: node linkType: hard -"@cspell/dict-data-science@npm:^2.0.12, @cspell/dict-data-science@npm:^2.0.8": - version: 2.0.12 - resolution: "@cspell/dict-data-science@npm:2.0.12" - checksum: 10/2eb3492c9de93a5fea57f81bb3daac80c5174dbac5ae981782d27b56438fbc10d96a06973fa07051e5eaf8489a5ce02c37dce5158d601388d5df85c6c0a2b055 +"@cspell/dict-data-science@npm:^2.0.13, @cspell/dict-data-science@npm:^2.0.8": + version: 2.0.13 + resolution: "@cspell/dict-data-science@npm:2.0.13" + checksum: 10/d5aee1a87dace4a401ebe7d9327773a8b21f1e0ae5ce4307f302d60857539f964de334a98c772d6dd88c60e3f3056b9bdd3774fe1bcacb2dbaca9160aef52725 languageName: node linkType: hard "@cspell/dict-django@npm:^4.1.4": - version: 4.1.5 - resolution: "@cspell/dict-django@npm:4.1.5" - checksum: 10/cc0181e0e8e9ede5b4efc11c5a141cf54122721b204c956a7e270573adf1e8ca14e6f80e51b5c071154da17188056b5f4cc3da1f68f84ff2162b62abef3e3ebc + version: 4.1.6 + resolution: "@cspell/dict-django@npm:4.1.6" + checksum: 10/0898787758a64de3a9b9a74febc1e789de30e01403c3c87fe4d99ce992419113297a4a6ddf982c3504f51c4382dd60467288da63cc87e27506f3daba8c03b15a languageName: node linkType: hard "@cspell/dict-docker@npm:^1.1.13": - version: 1.1.16 - resolution: "@cspell/dict-docker@npm:1.1.16" - checksum: 10/dc126d94203fa23c0a9d1466fa634b1ee4b4770d5762dbbbc868198318cf8d860de26d1632700a3e613eb81d27d0e46c72cbf74ba0cca5cca0032dbf056ae472 + version: 1.1.17 + resolution: "@cspell/dict-docker@npm:1.1.17" + checksum: 10/438cc04e0ebcab53b49cecee7ae02c743733b8ec7df4b75075c31574f764aa60353a3cb0db3fb8c80271339d4fc0c1d05864bb6b1ac14891cacfd4098f0b0dce languageName: node linkType: hard "@cspell/dict-dotnet@npm:^5.0.9": - version: 5.0.10 - resolution: "@cspell/dict-dotnet@npm:5.0.10" - checksum: 10/ce9d101cfd1af390e49ac114dd576172a932e95a5e4590289a246477ff6d14711efa5dd794188affed13c45050e0ecda4cf95cd26019c5c04dce33580effdc88 + version: 5.0.12 + resolution: "@cspell/dict-dotnet@npm:5.0.12" + checksum: 10/a49d2f284ce3c3209b9a121dbae174121dc4285300fd8f3babb69da38d2edbabffcbf4c6029e598a2a760be14c29805f57f81c49909ffaa3a3416f0358eb512f languageName: node linkType: hard @@ -1920,9 +1958,9 @@ __metadata: linkType: hard "@cspell/dict-en-common-misspellings@npm:^2.0.10": - version: 2.1.8 - resolution: "@cspell/dict-en-common-misspellings@npm:2.1.8" - checksum: 10/fe8764a14b28269956650092eea34df94ce4e903ff5178e3a504283414cc2ae3b2afc2e2716317d2adde6fe13bc5189eae3577901921f5ef462af1ac2a898b8c + version: 2.1.12 + resolution: "@cspell/dict-en-common-misspellings@npm:2.1.12" + checksum: 10/2f3d608c241694c673cfd0191274554270c82ca18953d84a3224fe7122fe5cb68261ab06f13ff90466266da4835ce1a2f266790f67a19b8f2f1928b3a1d22354 languageName: node linkType: hard @@ -1934,16 +1972,16 @@ __metadata: linkType: hard "@cspell/dict-en_us@npm:^4.4.3": - version: 4.4.24 - resolution: "@cspell/dict-en_us@npm:4.4.24" - checksum: 10/b7a6525d5c6153610e8722266d7d8cbbf4818c741992977a4b8099b0ff7196824b2bb509deba9de66fc2414479bfc4db2f41640e9748e048edd99058aaae2a42 + version: 4.4.29 + resolution: "@cspell/dict-en_us@npm:4.4.29" + checksum: 10/537f254cb34484f6b44a9c935ad8ad32924c950b338c23ee2494c26a65b8eb06cfa16452ef5bf3102322ec4be3a55563a582d8efd3f651b64c41b5ee16f90738 languageName: node linkType: hard "@cspell/dict-filetypes@npm:^3.0.11": - version: 3.0.14 - resolution: "@cspell/dict-filetypes@npm:3.0.14" - checksum: 10/545eee0cb4a80491a1fbb03b964d31569379a775528b090c992ba72d3ae6fe4dfae5c484b5a50226f8e52979238875476c688937096486bebfa0c8f3a72da499 + version: 3.0.15 + resolution: "@cspell/dict-filetypes@npm:3.0.15" + checksum: 10/cdfe3de4c57c7b581266a49a882cf75f36173ef6c6768995cf9709d864089f1118203c78410f59c9fea1ba79b9e0c051b32a0346ac08c5aaeb9129f575e80608 languageName: node linkType: hard @@ -1969,9 +2007,9 @@ __metadata: linkType: hard "@cspell/dict-fullstack@npm:^3.2.6": - version: 3.2.7 - resolution: "@cspell/dict-fullstack@npm:3.2.7" - checksum: 10/cdb69a00663a34cb611c8f3e8f26651a0aa8e50d59de6ebb85724cfdd239382398ca35636bbe64f3573e1da795c15ace297dbf47cb83747439b109f16bab593d + version: 3.2.8 + resolution: "@cspell/dict-fullstack@npm:3.2.8" + checksum: 10/d38cd753542866308ef31b586bc2b58777ff1b08dc094256cebe10b31acf2820614966c3e3391897ea3f5a1958b80499743495fa9b33a0be034070ae21f87781 languageName: node linkType: hard @@ -1983,16 +2021,16 @@ __metadata: linkType: hard "@cspell/dict-git@npm:^3.0.4": - version: 3.0.7 - resolution: "@cspell/dict-git@npm:3.0.7" - checksum: 10/bf88770be43c1bd4c2bea6737edd20939a78b7c0e9ff28e06490394f056637a27f49a6716e0f6ed845eaf2fc1afa85d4bd7cfafb56e3d4dfeb491b49669fd376 + version: 3.1.0 + resolution: "@cspell/dict-git@npm:3.1.0" + checksum: 10/d64ac12882bfff6f02755bf4eaf47d9e340edcf36867a83d5df106dba6e13ab7ccc519c48f12f8312324a4ac674ff468a8499b4ebd9cf264af97f545597614eb languageName: node linkType: hard "@cspell/dict-golang@npm:^6.0.20": - version: 6.0.24 - resolution: "@cspell/dict-golang@npm:6.0.24" - checksum: 10/4c1b4ac025d389759458ab31e73b9cb7a84fa54147f97a71b93f06e69330d9b02af1ba36a4828af1891049e3bb11f659f2c2da53a947dbfe0235ed1d5d26faed + version: 6.0.26 + resolution: "@cspell/dict-golang@npm:6.0.26" + checksum: 10/b229f7e5b78b2839eed501e37719546cee787426f323a4a62feaec1db15422482b8b4d97a126c0c6342c2bf1c6f6dc12ac4e05aa245de4b768c5753d2affe9d4 languageName: node linkType: hard @@ -2011,16 +2049,16 @@ __metadata: linkType: hard "@cspell/dict-html-symbol-entities@npm:^4.0.3": - version: 4.0.4 - resolution: "@cspell/dict-html-symbol-entities@npm:4.0.4" - checksum: 10/1898fc84496526e9c54e125369f3c87412839aee3e00da8aee3fee1c1165d4f2e7944833398b08f07ee58e817999af462f254e9ce06b06323fd665cbe6d01a3e + version: 4.0.5 + resolution: "@cspell/dict-html-symbol-entities@npm:4.0.5" + checksum: 10/050f57152c873bf9725dfec3e7c6b6ce6a0c178ee084fcad48be186bcc965caabf10462d47fc3c9adcae8d5d8d91dc3cf739ab913d2ed7f5f50abec215e9851b languageName: node linkType: hard "@cspell/dict-html@npm:^4.0.11": - version: 4.0.13 - resolution: "@cspell/dict-html@npm:4.0.13" - checksum: 10/856a73c5888d1d4904c9403f7852ec5ab9ac1fb8683af838c5be136691095739f892110974f4266c68f61f51c377b907d0404b532523cbf83ed2b38d330dfd2f + version: 4.0.14 + resolution: "@cspell/dict-html@npm:4.0.14" + checksum: 10/b6047177b6012d467926c27777391cc3f6ebc522c6f4dce01e58a8100dfac61d5cecefc59ba5994728d41c7480d7c9d994d0f8673197740526f6afbed544094a languageName: node linkType: hard @@ -2081,42 +2119,42 @@ __metadata: linkType: hard "@cspell/dict-markdown@npm:^2.0.10": - version: 2.0.13 - resolution: "@cspell/dict-markdown@npm:2.0.13" + version: 2.0.14 + resolution: "@cspell/dict-markdown@npm:2.0.14" peerDependencies: - "@cspell/dict-css": ^4.0.18 - "@cspell/dict-html": ^4.0.13 - "@cspell/dict-html-symbol-entities": ^4.0.4 + "@cspell/dict-css": ^4.0.19 + "@cspell/dict-html": ^4.0.14 + "@cspell/dict-html-symbol-entities": ^4.0.5 "@cspell/dict-typescript": ^3.2.3 - checksum: 10/7f1d131301ff7128b974ab35498fe2842584626c2c8f45a11a30fc245439417caaa7a615611ce324f834648da3593fd5c305999af157d317973c2f2c0a2a8849 + checksum: 10/7ca267a7089bcf63aebb94b2934220aa81e1b747427e7c7998fc6852818a726da8ccaf380e0b76314cfc57504308446361dc6f1daef3cd73f3d60479563c636a languageName: node linkType: hard "@cspell/dict-monkeyc@npm:^1.0.10": - version: 1.0.11 - resolution: "@cspell/dict-monkeyc@npm:1.0.11" - checksum: 10/6e896fd9596261ece639cdad4d03291f4faf92ed27d9257aae1f34f075b13a865287734d170a2e9ea228ac2b7de03eaaec795284b945c8a96ac24684ad56ba7a + version: 1.0.12 + resolution: "@cspell/dict-monkeyc@npm:1.0.12" + checksum: 10/9c952968b50a44d5860f9d9ebce49a71d433f1411d7a074711db176eedaaaf810c0c01bb5e32bc66bb08953b8d4a2c8a19bef394407603d18023d1242a882470 languageName: node linkType: hard "@cspell/dict-node@npm:^5.0.7": - version: 5.0.8 - resolution: "@cspell/dict-node@npm:5.0.8" - checksum: 10/6a008c8b82021e24124f619efdd485683f1dfb3c37ec4fe2b645e8d8002270c221869a19a5e2d17a978acb8d60292e5c5dd056aa0dd35b3e4fedf87e7b8afae4 + version: 5.0.9 + resolution: "@cspell/dict-node@npm:5.0.9" + checksum: 10/b934c9c94e230742a612f3133cc81a62af4073e2f8c50855d37e90bad7860200600b8492988d70f3ba13a055e357554a4abf71f0a437650ae24e5b300d6615ee languageName: node linkType: hard "@cspell/dict-npm@npm:^5.2.1": - version: 5.2.25 - resolution: "@cspell/dict-npm@npm:5.2.25" - checksum: 10/e25141f0f52567dbe09263dd624966fe27d472ccef20f2d5ffdd2b844febe9285d05d2db4a5e501bf075557ba01780807f2ef0c2e6d1f44d095d2420abfd0a22 + version: 5.2.34 + resolution: "@cspell/dict-npm@npm:5.2.34" + checksum: 10/5c334091412de75094006004291ff44634ee25b629d804db4a1d81b7a2a3cfd0b47b22f42d64a8dbf8121436b65644d6d285b3f0365fbfdb75917c7dea1e9e91 languageName: node linkType: hard "@cspell/dict-php@npm:^4.0.14": - version: 4.1.0 - resolution: "@cspell/dict-php@npm:4.1.0" - checksum: 10/64ab278a581822381335df5dcf830c449a63e5a5fba5c0bbea4f43a36bd8039b3323392b386be2fc5b751bd6fef0061b338d5ae28d7c12214f2c2def0dcce260 + version: 4.1.1 + resolution: "@cspell/dict-php@npm:4.1.1" + checksum: 10/e81bed158736ea6f2db8d9e116c16cc3f46b455bb3ed673a100166cfee340be38d0cd9bc3f39c5590364c0bb2bd472755f5e4c65a20787d2d7df749ff43f49d1 languageName: node linkType: hard @@ -2135,11 +2173,11 @@ __metadata: linkType: hard "@cspell/dict-python@npm:^4.2.17": - version: 4.2.23 - resolution: "@cspell/dict-python@npm:4.2.23" + version: 4.2.25 + resolution: "@cspell/dict-python@npm:4.2.25" dependencies: - "@cspell/dict-data-science": "npm:^2.0.12" - checksum: 10/ded89d5fd843bf1fe0e3ae3a7386db63c66c00a90d5a122fcff4206cb4c6dec9dfa463fcc841553a3d93b102da62ff9a03aaf359876cc9aec5e2a3c897f04f9c + "@cspell/dict-data-science": "npm:^2.0.13" + checksum: 10/fcbbc2db9a1ff01e16e33df10c1f6575e65eece8b13b1ef3a45481aeaafa6250ad28358a6ec787d4d7a6061907b338c7adb52bc882502cd6ae8904d20b60f10d languageName: node linkType: hard @@ -2151,23 +2189,23 @@ __metadata: linkType: hard "@cspell/dict-ruby@npm:^5.0.8": - version: 5.0.9 - resolution: "@cspell/dict-ruby@npm:5.0.9" - checksum: 10/57a752ff19f9484a042e859254eb6d487b46266f374faeb17e257b3583d94fbd908c0bd308e2a7d3b0169839cdd5a6d9fc12563955b69f26e8667acc43fbfd53 + version: 5.1.0 + resolution: "@cspell/dict-ruby@npm:5.1.0" + checksum: 10/afe89daa54a6c3be62686f4f74fe924dabb4077e9aead71bf26e211885d068066df414857f27da258a130e2e06ecb5eac394225bc120607bebcb08746b6188f9 languageName: node linkType: hard "@cspell/dict-rust@npm:^4.0.11": - version: 4.0.12 - resolution: "@cspell/dict-rust@npm:4.0.12" - checksum: 10/ba928f5538e09887f715713a6899d09ed7b1663c85d33c766adbaf22a95e01fa71d3736d5ff17c3c0f0a387c43756702fb1529e62e714ddec0df6cde9617ad20 + version: 4.1.2 + resolution: "@cspell/dict-rust@npm:4.1.2" + checksum: 10/f618727d8c3af5f3d5e74eca04e9b0685f525d217206c40faf9803aa4fd7b9defc9b5174bff17411ef2d935df7ebe66cb2e38f34b6887a118908e10a5c834376 languageName: node linkType: hard "@cspell/dict-scala@npm:^5.0.7": - version: 5.0.8 - resolution: "@cspell/dict-scala@npm:5.0.8" - checksum: 10/f9d8d748a66cea454fbe3d6dc51dde03d58cf2a28a4a64698ac4022a91b65503b2b6f74206421488d4396949d9b09477699734ca05e28a79a9c2e6a39f65e2c5 + version: 5.0.9 + resolution: "@cspell/dict-scala@npm:5.0.9" + checksum: 10/9b095e052e4c72fe0d0657f11f654cac6e8bbf6f6ac2043e8f1de8641aa7cad46b94416d70aa9dbd8556b1c1cfd0ac522868867e911a707e7b0e2cbcfcbfb5e2 languageName: node linkType: hard @@ -2179,9 +2217,9 @@ __metadata: linkType: hard "@cspell/dict-software-terms@npm:^5.0.5": - version: 5.1.15 - resolution: "@cspell/dict-software-terms@npm:5.1.15" - checksum: 10/7bcdaf626936c85163b4e0153a95d5318da207446a6c9f2ccd705a3f0a49cada14ec678153f9b691f2fbcb2f702f54828c3ce2d4c193d319ebd7407684dc6f30 + version: 5.1.21 + resolution: "@cspell/dict-software-terms@npm:5.1.21" + checksum: 10/3783be8aaadf1f284d540ff8baaaa72d07bc2a5e3f7049a772c249fdad92acfe2f723d09564bbcc86c1f9dbfe64478ae7e970035ba282d126135cb5dd53776b9 languageName: node linkType: hard @@ -2272,6 +2310,19 @@ __metadata: languageName: node linkType: hard +"@dr.pogodin/react-native-fs@npm:^2.36.2": + version: 2.37.0 + resolution: "@dr.pogodin/react-native-fs@npm:2.37.0" + dependencies: + buffer: "npm:^6.0.3" + http-status-codes: "npm:^2.3.0" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/c66c03a9e814c0c4e3c9b575bc1dc7aedee18e815f45860541b94935cbfdfae8ccb71964c359c420498d120b00a1b997bf5e4739da58a8d681ad33df1d76ef03 + languageName: node + linkType: hard + "@egjs/hammerjs@npm:^2.0.17": version: 2.0.17 resolution: "@egjs/hammerjs@npm:2.0.17" @@ -2282,13 +2333,13 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.9.0 - resolution: "@eslint-community/eslint-utils@npm:4.9.0" + version: 4.9.1 + resolution: "@eslint-community/eslint-utils@npm:4.9.1" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/89b1eb3137e14c379865e60573f524fcc0ee5c4b0c7cd21090673e75e5a720f14b92f05ab2d02704c2314b67e67b6f96f3bb209ded6b890ced7b667aa4bf1fa2 + checksum: 10/863b5467868551c9ae34d03eefe634633d08f623fc7b19d860f8f26eb6f303c1a5934253124163bee96181e45ed22bf27473dccc295937c3078493a4a8c9eddd languageName: node linkType: hard @@ -2333,24 +2384,24 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:54.0.18": - version: 54.0.18 - resolution: "@expo/cli@npm:54.0.18" +"@expo/cli@npm:54.0.23": + version: 54.0.23 + resolution: "@expo/cli@npm:54.0.23" dependencies: "@0no-co/graphql.web": "npm:^1.0.8" - "@expo/code-signing-certificates": "npm:^0.0.5" - "@expo/config": "npm:~12.0.11" - "@expo/config-plugins": "npm:~54.0.3" + "@expo/code-signing-certificates": "npm:^0.0.6" + "@expo/config": "npm:~12.0.13" + "@expo/config-plugins": "npm:~54.0.4" "@expo/devcert": "npm:^1.2.1" "@expo/env": "npm:~2.0.8" "@expo/image-utils": "npm:^0.8.8" "@expo/json-file": "npm:^10.0.8" - "@expo/metro": "npm:~54.1.0" - "@expo/metro-config": "npm:~54.0.10" + "@expo/metro": "npm:~54.2.0" + "@expo/metro-config": "npm:~54.0.14" "@expo/osascript": "npm:^2.3.8" - "@expo/package-manager": "npm:^1.9.9" + "@expo/package-manager": "npm:^1.9.10" "@expo/plist": "npm:^0.4.8" - "@expo/prebuild-config": "npm:^54.0.7" + "@expo/prebuild-config": "npm:^54.0.8" "@expo/schema-utils": "npm:^0.1.8" "@expo/spawn-async": "npm:^1.7.2" "@expo/ws-tunnel": "npm:^1.0.1" @@ -2375,7 +2426,7 @@ __metadata: glob: "npm:^13.0.0" lan-network: "npm:^0.1.6" minimatch: "npm:^9.0.0" - node-forge: "npm:^1.3.1" + node-forge: "npm:^1.3.3" npm-package-arg: "npm:^11.0.0" ora: "npm:^3.4.0" picomatch: "npm:^3.0.1" @@ -2411,27 +2462,26 @@ __metadata: optional: true bin: expo-internal: build/bin/cli - checksum: 10/9a84554d120759be74ee84e2d9e31d7279e67c5992ace7ba51871815169b552f3b30cb6715a9c3685717bde32756e45dbeae6d5200f75b7d2ea877f5f80172e3 + checksum: 10/9a41c55aa7f628ad44048c9f41cd8d7f4f73a8bfc01adaa956ddaae87d332ae979eadb52bdab894ef5b1c9b5722486ccdb999057d8b9eed392c827f476feb79f languageName: node linkType: hard -"@expo/code-signing-certificates@npm:^0.0.5": - version: 0.0.5 - resolution: "@expo/code-signing-certificates@npm:0.0.5" +"@expo/code-signing-certificates@npm:^0.0.6": + version: 0.0.6 + resolution: "@expo/code-signing-certificates@npm:0.0.6" dependencies: - node-forge: "npm:^1.2.1" - nullthrows: "npm:^1.1.1" - checksum: 10/6783721e2eafff5547500eaf99bee54641f076dc7221e52b48f1494f993040d779fe13ae7d95d3874c483eb545cafbf692315e2da0b0fc24e7a477b84e289617 + node-forge: "npm:^1.3.3" + checksum: 10/4446cca45e8b48b90ba728e39aab6b1195ede730d7aba7d9830f635aa16a52634e6eba9dc510f83cc6ff6fb6b0e3077bc6021098f0157f6dba96f8494685c388 languageName: node linkType: hard -"@expo/config-plugins@npm:~54.0.3": - version: 54.0.3 - resolution: "@expo/config-plugins@npm:54.0.3" +"@expo/config-plugins@npm:~54.0.4": + version: 54.0.4 + resolution: "@expo/config-plugins@npm:54.0.4" dependencies: - "@expo/config-types": "npm:^54.0.9" - "@expo/json-file": "npm:~10.0.7" - "@expo/plist": "npm:^0.4.7" + "@expo/config-types": "npm:^54.0.10" + "@expo/json-file": "npm:~10.0.8" + "@expo/plist": "npm:^0.4.8" "@expo/sdk-runtime-versions": "npm:^1.0.0" chalk: "npm:^4.1.2" debug: "npm:^4.3.5" @@ -2443,25 +2493,25 @@ __metadata: slugify: "npm:^1.6.6" xcode: "npm:^3.0.1" xml2js: "npm:0.6.0" - checksum: 10/5eb33583eba8ba87ad19f4775749864fd72fe251be1b9bb1b765f0499fd36d21a7dd936f53c36368454726b72b0a8ea99b1e315bd6c005de1f4541bafb57d1c6 + checksum: 10/55dab3f5f29b6dfb58bc32a9b0a681766f6b260ee94b1c295f67ac3c5e8f372afc512bb416f2e50901e387d4012e3a4a8fd3b461e5aa8c20e16fdcde64a07327 languageName: node linkType: hard -"@expo/config-types@npm:^54.0.9": - version: 54.0.9 - resolution: "@expo/config-types@npm:54.0.9" - checksum: 10/572ddcf9b8a3d785c0cb0275fbcd2cc4f7004191cda5fa387cf2babfcea79ae04b9d68bf459a9b43538ad35ce09955dfa5e6ebafb6050758cd596cb6e61885b8 +"@expo/config-types@npm:^54.0.10": + version: 54.0.10 + resolution: "@expo/config-types@npm:54.0.10" + checksum: 10/7e4d598d2d1905dc53f2b30d5a1e0817dd486b13c89a24575deb4e25ec441b0de009d156f041a3c9a1f2121dfba28f2a24fd4fb5a056cac90502ca67c639bb8a languageName: node linkType: hard -"@expo/config@npm:~12.0.11": - version: 12.0.11 - resolution: "@expo/config@npm:12.0.11" +"@expo/config@npm:~12.0.13": + version: 12.0.13 + resolution: "@expo/config@npm:12.0.13" dependencies: "@babel/code-frame": "npm:~7.10.4" - "@expo/config-plugins": "npm:~54.0.3" - "@expo/config-types": "npm:^54.0.9" - "@expo/json-file": "npm:^10.0.7" + "@expo/config-plugins": "npm:~54.0.4" + "@expo/config-types": "npm:^54.0.10" + "@expo/json-file": "npm:^10.0.8" deepmerge: "npm:^4.3.1" getenv: "npm:^2.0.0" glob: "npm:^13.0.0" @@ -2471,7 +2521,7 @@ __metadata: semver: "npm:^7.6.0" slugify: "npm:^1.3.4" sucrase: "npm:~3.35.1" - checksum: 10/c749457b50a5c2531c5fb7d29c343a7761081f7218199ab65524ff8ab9edb36f5903cde6a35fbd95b792e537a7c4183362bb9061a1bdedff8aae4d731171e4f5 + checksum: 10/2caac758fb706a75fc6d07df31c24c22d633f522091148e615d9c28475ae35cfaed29458cfd08f13d40d71d33715e5ac618af78591c11886529157b8519fe4ea languageName: node linkType: hard @@ -2502,16 +2552,16 @@ __metadata: languageName: node linkType: hard -"@expo/env@npm:~2.0.7, @expo/env@npm:~2.0.8": - version: 2.0.8 - resolution: "@expo/env@npm:2.0.8" +"@expo/env@npm:~2.0.8": + version: 2.0.11 + resolution: "@expo/env@npm:2.0.11" dependencies: chalk: "npm:^4.0.0" debug: "npm:^4.3.4" dotenv: "npm:~16.4.5" dotenv-expand: "npm:~11.0.6" getenv: "npm:^2.0.0" - checksum: 10/d440e0c7d8f4d438a9f82794435c315b63fc18a9b251ee7238f150255634d2786874cd85ff78589eb0488125d41d57a9b055fb1a25c4e06a08a0330d809e78cd + checksum: 10/bfb307d6b35d47c58f82424c85543325370bbdc0f303cdd4ddfe5d6854e0386ad72166fec6e1da633fc7cb3b0915d7c40642c49773ae31e6faed13569d1b601c languageName: node linkType: hard @@ -2537,8 +2587,8 @@ __metadata: linkType: hard "@expo/image-utils@npm:^0.8.8": - version: 0.8.8 - resolution: "@expo/image-utils@npm:0.8.8" + version: 0.8.12 + resolution: "@expo/image-utils@npm:0.8.12" dependencies: "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.0.0" @@ -2546,35 +2596,32 @@ __metadata: jimp-compact: "npm:0.16.1" parse-png: "npm:^2.1.0" resolve-from: "npm:^5.0.0" - resolve-global: "npm:^1.0.0" semver: "npm:^7.6.0" - temp-dir: "npm:~2.0.0" - unique-string: "npm:~2.0.0" - checksum: 10/f7a2d81785e81e3ba5cabf1ae9acf3923b9320345b1761dfd6ebaaa1dc77f7b08e5a86aead2657223d47b65dec96fb70f012b149149dbf202de4809e5920baf5 + checksum: 10/fb474558bb4009f39c640fb028a57cfae721e52dae0085bb2505390c6968d30cdc82eb195c15de82f30879c710104c08e60120de8f49613183437701f19dd363 languageName: node linkType: hard -"@expo/json-file@npm:^10.0.7, @expo/json-file@npm:^10.0.8, @expo/json-file@npm:~10.0.7": - version: 10.0.8 - resolution: "@expo/json-file@npm:10.0.8" +"@expo/json-file@npm:^10.0.12, @expo/json-file@npm:^10.0.8, @expo/json-file@npm:~10.0.8": + version: 10.0.12 + resolution: "@expo/json-file@npm:10.0.12" dependencies: - "@babel/code-frame": "npm:~7.10.4" + "@babel/code-frame": "npm:^7.20.0" json5: "npm:^2.2.3" - checksum: 10/d744edb72ea5a52d8829357fb2adb93be3181a522e3b6b8dc3a32a448c9c76eca603f8a390f1a126f4b16c21a470e0c1b2dde0bcd2cb799d97178e48df93a3b3 + checksum: 10/547f5b9d1c5b10147ef0780d079d853e3b2e8ec0b09080420cb48592060a4399308622fd205aaec5e157c41d37c5b69dffa9aaa96c01fe444b0258f78c3bb85f languageName: node linkType: hard -"@expo/metro-config@npm:54.0.10, @expo/metro-config@npm:~54.0.10": - version: 54.0.10 - resolution: "@expo/metro-config@npm:54.0.10" +"@expo/metro-config@npm:54.0.14, @expo/metro-config@npm:~54.0.14": + version: 54.0.14 + resolution: "@expo/metro-config@npm:54.0.14" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.5" - "@expo/config": "npm:~12.0.11" - "@expo/env": "npm:~2.0.7" - "@expo/json-file": "npm:~10.0.7" - "@expo/metro": "npm:~54.1.0" + "@expo/config": "npm:~12.0.13" + "@expo/env": "npm:~2.0.8" + "@expo/json-file": "npm:~10.0.8" + "@expo/metro": "npm:~54.2.0" "@expo/spawn-async": "npm:^1.7.2" browserslist: "npm:^4.25.0" chalk: "npm:^4.1.0" @@ -2594,7 +2641,7 @@ __metadata: peerDependenciesMeta: expo: optional: true - checksum: 10/4a2fc2eea0cdc88f52d29d0a70fdb315bdbcc7b5300cb64afcc6a2a756db01449b3a60e401fc662ea13b441dc2287d1b492524ac7e6dece0c23d6d7105e2ebdf + checksum: 10/c1a67c187fcd9f3dd43cd1b33a500644715768ab55939d5e2ff354311709ea5fed2bb3c103610b0ddac961d7ab2f94f7a1d1f25d033af98690ed6b9cec9ac787 languageName: node linkType: hard @@ -2618,51 +2665,52 @@ __metadata: languageName: node linkType: hard -"@expo/metro@npm:~54.1.0": - version: 54.1.0 - resolution: "@expo/metro@npm:54.1.0" +"@expo/metro@npm:~54.2.0": + version: 54.2.0 + resolution: "@expo/metro@npm:54.2.0" dependencies: - metro: "npm:0.83.2" - metro-babel-transformer: "npm:0.83.2" - metro-cache: "npm:0.83.2" - metro-cache-key: "npm:0.83.2" - metro-config: "npm:0.83.2" - metro-core: "npm:0.83.2" - metro-file-map: "npm:0.83.2" - metro-resolver: "npm:0.83.2" - metro-runtime: "npm:0.83.2" - metro-source-map: "npm:0.83.2" - metro-transform-plugins: "npm:0.83.2" - metro-transform-worker: "npm:0.83.2" - checksum: 10/219d1d3b94faa0cfa2af94a3c9c307e63bc1ede1e96da6d2e324c02275b882bd2a814730a4ab1842f8f0117316a0e66e0f02f83bba5620397096b5562f28da51 + metro: "npm:0.83.3" + metro-babel-transformer: "npm:0.83.3" + metro-cache: "npm:0.83.3" + metro-cache-key: "npm:0.83.3" + metro-config: "npm:0.83.3" + metro-core: "npm:0.83.3" + metro-file-map: "npm:0.83.3" + metro-minify-terser: "npm:0.83.3" + metro-resolver: "npm:0.83.3" + metro-runtime: "npm:0.83.3" + metro-source-map: "npm:0.83.3" + metro-symbolicate: "npm:0.83.3" + metro-transform-plugins: "npm:0.83.3" + metro-transform-worker: "npm:0.83.3" + checksum: 10/36087cec4cb1788f6c8f6148f9dcd30e8d3693fbf8a14f8b0a3c9575895bd6b1847690c958181d7e92718d49ab66df285a79d64ff3c13e4168bbfee26b670d7f languageName: node linkType: hard "@expo/osascript@npm:^2.3.8": - version: 2.3.8 - resolution: "@expo/osascript@npm:2.3.8" + version: 2.4.2 + resolution: "@expo/osascript@npm:2.4.2" dependencies: "@expo/spawn-async": "npm:^1.7.2" - exec-async: "npm:^2.2.0" - checksum: 10/153ddb710870a29a4f69d2b6a42a492bf03f9707f8bc2c8929540429b3844c0ff3ccdb8f8ff78ee886fa54c3e8a584f7ca1d9718322503fca7c325558f121db6 + checksum: 10/5609b926bd68120b6a01edea0c7b14d4fa9fcd454bbcb49b89988f7acdb540f3b9c1c133acbbd3f9cd6a6937ce2a950c9cdde2a98ec8769d8a8b1481666a67d9 languageName: node linkType: hard -"@expo/package-manager@npm:^1.9.9": - version: 1.9.9 - resolution: "@expo/package-manager@npm:1.9.9" +"@expo/package-manager@npm:^1.9.10": + version: 1.10.3 + resolution: "@expo/package-manager@npm:1.10.3" dependencies: - "@expo/json-file": "npm:^10.0.8" + "@expo/json-file": "npm:^10.0.12" "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.0.0" npm-package-arg: "npm:^11.0.0" ora: "npm:^3.4.0" resolve-workspace-root: "npm:^2.0.0" - checksum: 10/d39c90599a8f94fcb93a274e6505df60872ef1f574fbb29e653de622a93536db926e3f9219ac4e8249c8380143518b92e95736a4aa0bed220bf33114206974fb + checksum: 10/cac9008ec362af0b54ebf55cb64514e3f4258423f0be9a0d1adb2815380e912783be78750c898e393f7bebe7a1b8288d449052b0ce9f790400d185a29b8274bd languageName: node linkType: hard -"@expo/plist@npm:^0.4.7, @expo/plist@npm:^0.4.8": +"@expo/plist@npm:^0.4.8": version: 0.4.8 resolution: "@expo/plist@npm:0.4.8" dependencies: @@ -2673,13 +2721,13 @@ __metadata: languageName: node linkType: hard -"@expo/prebuild-config@npm:^54.0.7": - version: 54.0.7 - resolution: "@expo/prebuild-config@npm:54.0.7" +"@expo/prebuild-config@npm:^54.0.8": + version: 54.0.8 + resolution: "@expo/prebuild-config@npm:54.0.8" dependencies: - "@expo/config": "npm:~12.0.11" - "@expo/config-plugins": "npm:~54.0.3" - "@expo/config-types": "npm:^54.0.9" + "@expo/config": "npm:~12.0.13" + "@expo/config-plugins": "npm:~54.0.4" + "@expo/config-types": "npm:^54.0.10" "@expo/image-utils": "npm:^0.8.8" "@expo/json-file": "npm:^10.0.8" "@react-native/normalize-colors": "npm:0.81.5" @@ -2689,7 +2737,7 @@ __metadata: xml2js: "npm:0.6.0" peerDependencies: expo: "*" - checksum: 10/6194661c2531041d1f5cc141f07fb2ddf8a558110732d8dcccfe8c7887345f28756bfd2c72fd72da364db274dde7d11fc77b8f39eace18cb215b8364997910c1 + checksum: 10/67f0fd1ad9332ff10c554e4b31602656daf222f2c51cebde9c024cb47b7ea13653ee1b01a00b6ea7cdf8fe8c99e20955788de9dec578c394e6b2357ef5919ab9 languageName: node linkType: hard @@ -2742,16 +2790,15 @@ __metadata: linkType: hard "@expo/xcpretty@npm:^4.3.0": - version: 4.3.2 - resolution: "@expo/xcpretty@npm:4.3.2" + version: 4.4.0 + resolution: "@expo/xcpretty@npm:4.4.0" dependencies: - "@babel/code-frame": "npm:7.10.4" + "@babel/code-frame": "npm:^7.20.0" chalk: "npm:^4.1.0" - find-up: "npm:^5.0.0" js-yaml: "npm:^4.1.0" bin: excpretty: build/cli.js - checksum: 10/4d2adaf531d24154898b858d3d0f3b4ec272fa08bb628f94cadee5b1eb505cc1f3a6b0ab7c1cb3d55af0f22c2534b4a9781a6fe7293dc2062fc5784eb376b0bb + checksum: 10/cdfea7e412255baa17bb61c25dfefb37ab5392ceca1edf2ee5bb24751e7781ee005469bbdd8ff04a02154f108fbaebf7788935060f77aa2044adad2172857baa languageName: node linkType: hard @@ -2772,9 +2819,9 @@ __metadata: linkType: hard "@huggingface/jinja@npm:^0.5.0": - version: 0.5.3 - resolution: "@huggingface/jinja@npm:0.5.3" - checksum: 10/2797550d8400495facec93c00051ddba17df8849250a0ad61dfc3cd84b05c4013c852a0580e3fa8cf2fd153c9fbe35af2ced5409b1b23effd639f0a03a4c16b4 + version: 0.5.5 + resolution: "@huggingface/jinja@npm:0.5.5" + checksum: 10/9575f8a689ab2c31f2540ea2dd82da2bcddb536196c3de3ae8f3b2fa06f01f47eb6a0513b410bbeac90fea7123733a15bf5d484f45fe3132bc16232a60f0dce3 languageName: node linkType: hard @@ -2803,22 +2850,6 @@ __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: 10/102fbc6d2c0d5edf8f6dbf2b3feb21695a21bc850f11bc47c4f06aa83bd8884fde3fe9d6d797d619901d96865fdcb4569ac2a54c937992c48885c5e3d9967fe8 - 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: 10/cf3b7f206aff12128214a1df764ac8cdbc517c110db85249b945282407e3dfc5c6e66286383a7c9391a059fc8e6e6a8ca82262fc9d2590bd615376141fbebd2d - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2833,6 +2864,13 @@ __metadata: languageName: node linkType: hard +"@isaacs/cliui@npm:^9.0.0": + version: 9.0.0 + resolution: "@isaacs/cliui@npm:9.0.0" + checksum: 10/8ea3d1009fd29071419209bb91ede20cf27e6e2a1630c5e0702d8b3f47f9e1a3f1c5a587fa2cb96d22d18219790327df49db1bcced573346bbaf4577cf46b643 + languageName: node + linkType: hard + "@isaacs/fs-minipass@npm:^4.0.0": version: 4.0.1 resolution: "@isaacs/fs-minipass@npm:4.0.1" @@ -3162,6 +3200,15 @@ __metadata: languageName: node linkType: hard +"@kesha-antonov/react-native-background-downloader@npm:^4.4.5": + version: 4.5.2 + resolution: "@kesha-antonov/react-native-background-downloader@npm:4.5.2" + peerDependencies: + react-native: ">=0.57.0" + checksum: 10/2543563caa62aa9362ef4c37dcb11f4b762cb9803869bbdf5a45260c2bbb3ae68336450920594f768ea29500dd6fe04958cbf07a90620617737df5862718343e + languageName: node + linkType: hard + "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -3620,119 +3667,119 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-clean@npm:20.0.2" +"@react-native-community/cli-clean@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-clean@npm:20.1.1" dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.1" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - checksum: 10/d839318d979a83c0574b81f2eb765726431e2b3b14aee14621a72c2af527730072af58ab8a9c457e12e137c81ae41329f83f5f56a3d36b08efbed5d7fe6718bf + picocolors: "npm:^1.1.1" + checksum: 10/5ff8917381dc5b2abebca028a2e50af4385457e6645555186d6c5144617c91ca843cd67a5b1820b8db217f9d7b4c85bf328a6b3b2b1cdd8ba3fb6c3aea4b4c3d languageName: node linkType: hard -"@react-native-community/cli-config-android@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-config-android@npm:20.0.2" +"@react-native-community/cli-config-android@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-config-android@npm:20.1.1" dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.1" fast-glob: "npm:^3.3.2" fast-xml-parser: "npm:^4.4.1" - checksum: 10/ccbe4998887d722332c6734dbee38d7ea99362000f7afd88af4f7301e87928d669287e78ab112e618f8785e10c483064d1c00ce34368b564152d291eee32cb43 + picocolors: "npm:^1.1.1" + checksum: 10/baa29d945f923b510561bea6625786d0987c8e979f544650a5baf4139f4c76e92b8dc25e978d00f496329c4ccd54709de53903d199eb5873f39a2c1d7e8a88bf languageName: node linkType: hard -"@react-native-community/cli-config-apple@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-config-apple@npm:20.0.2" +"@react-native-community/cli-config-apple@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-config-apple@npm:20.1.1" dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.1" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - checksum: 10/5f888674b70d8d52be2ea2f1e513afdf98a43de30d6db224514c7a3a0466ad99a1c8ad4080558b6ac172c92eaca2d1a20691afd0744fbcb8fafedf8e6cd73cf1 + picocolors: "npm:^1.1.1" + checksum: 10/31e1770878a0c3e1793385b7862f53e32c0aeb367726e601741c4ed9d25e760f722403f631743ef07db7cc5b41f805de9ac7a198cda9c081b49d54e2286c7386 languageName: node linkType: hard -"@react-native-community/cli-config@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-config@npm:20.0.2" +"@react-native-community/cli-config@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-config@npm:20.1.1" dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-tools": "npm:20.1.1" cosmiconfig: "npm:^9.0.0" deepmerge: "npm:^4.3.0" fast-glob: "npm:^3.3.2" joi: "npm:^17.2.1" - checksum: 10/05658bfeecce40f14d4c91d804b4748d0b514e73a572ff58a3420c41e4cbebe63fa6fb6ecf8f9622227e33891313e3494c7d26c469335f40e234e2470a7b6f6b + picocolors: "npm:^1.1.1" + checksum: 10/818488ab41bd5b9e13fdf2115e40ccde622b51e78156cdb865acc60d2a02fc2f5316560c3d623405e64178231697f96f6786471ded289e621a5b7a158f32ed23 languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-doctor@npm:20.0.2" +"@react-native-community/cli-doctor@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-doctor@npm:20.1.1" dependencies: - "@react-native-community/cli-config": "npm:20.0.2" - "@react-native-community/cli-platform-android": "npm:20.0.2" - "@react-native-community/cli-platform-apple": "npm:20.0.2" - "@react-native-community/cli-platform-ios": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-config": "npm:20.1.1" + "@react-native-community/cli-platform-android": "npm:20.1.1" + "@react-native-community/cli-platform-apple": "npm:20.1.1" + "@react-native-community/cli-platform-ios": "npm:20.1.1" + "@react-native-community/cli-tools": "npm:20.1.1" command-exists: "npm:^1.2.8" deepmerge: "npm:^4.3.0" envinfo: "npm:^7.13.0" execa: "npm:^5.0.0" node-stream-zip: "npm:^1.9.1" ora: "npm:^5.4.1" + picocolors: "npm:^1.1.1" semver: "npm:^7.5.2" wcwidth: "npm:^1.0.1" yaml: "npm:^2.2.1" - checksum: 10/11a4a9ff5da4d471920418e8b4a598f997036d1d8e5d25f5957886b26727a5526789996430575dc422a5251f225df786a40ab42ec9c2c11f112ec980d6e1cc02 + checksum: 10/44f8cc6f8b22a5e39a3129544ce64778bacfc292f7228643a03a9853a4f88b0a53f460b616a05d85b4d619a075b7d4d5ea2cdbb73aba12a265217fac4f468463 languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-platform-android@npm:20.0.2" +"@react-native-community/cli-platform-android@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-platform-android@npm:20.1.1" dependencies: - "@react-native-community/cli-config-android": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-config-android": "npm:20.1.1" + "@react-native-community/cli-tools": "npm:20.1.1" execa: "npm:^5.0.0" logkitty: "npm:^0.7.1" - checksum: 10/465ef6988d335740cb998c51d29f837344e063bd04cf07b3f959e44df7823b2902ee6a25bf036e82581b1d6e1cfacbd8bcf87690f4dc0c6fb4b21f15eb64951e + picocolors: "npm:^1.1.1" + checksum: 10/7afafe5fad6b2f7d6c42f7d7fcd9483baca90311b87456ff1eecf1dc933528b8571d03cea625126d39db83f5a20b60c7e75b44f96448e9a20954589f007ff285 languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-platform-apple@npm:20.0.2" +"@react-native-community/cli-platform-apple@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-platform-apple@npm:20.1.1" dependencies: - "@react-native-community/cli-config-apple": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" + "@react-native-community/cli-config-apple": "npm:20.1.1" + "@react-native-community/cli-tools": "npm:20.1.1" execa: "npm:^5.0.0" fast-xml-parser: "npm:^4.4.1" - checksum: 10/f316b4f54f6d323319c0df9b6bf3cd7a5aa3b81d170e18755b9dc80297b1989f5c275b779f1044f063392126ec510e172283d06ef9ab8700950d7b36e1cb4d72 + picocolors: "npm:^1.1.1" + checksum: 10/577c28ef96bb4d505fc7a68857e67ff7f65b232ce6919094443960e17d5bcee28938a8d5d242747eb8c21f48ecea35b416a15994cebb013c956f1e73c9c78bab languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-platform-ios@npm:20.0.2" +"@react-native-community/cli-platform-ios@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-platform-ios@npm:20.1.1" dependencies: - "@react-native-community/cli-platform-apple": "npm:20.0.2" - checksum: 10/a0290feadc079981429143e9829a3030a768593927e0c2bcf546f52c8c22a53a49ea5f9ae9484f7eb390e01a46d7b0d7d9dc3374268d07237c808e6e7e3c50b3 + "@react-native-community/cli-platform-apple": "npm:20.1.1" + checksum: 10/a2ec3bf30048824f48143bc8b994b7bd0deec706898493b19366649da4bf0c1a426db0f73059c4e7ec79c25dd1463ccba0215b84c11d9ebcfce438b0a6d678a6 languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-server-api@npm:20.0.2" +"@react-native-community/cli-server-api@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-server-api@npm:20.1.1" dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" + "@react-native-community/cli-tools": "npm:20.1.1" body-parser: "npm:^1.20.3" compression: "npm:^1.7.1" connect: "npm:^3.6.5" @@ -3741,63 +3788,104 @@ __metadata: open: "npm:^6.2.0" pretty-format: "npm:^29.7.0" serve-static: "npm:^1.13.1" + strict-url-sanitise: "npm:0.0.1" ws: "npm:^6.2.3" - checksum: 10/7771524a0016f200a15c9c5df430b18ada846ef4d426be9d6540a343e69d042b359069aeef156bec7b267bcf43a50f97b8ec7f1514dad55d84c4e16fbd4e176b + checksum: 10/448048828deeb7997aa4caeb47148bcbab161ef25bcb5e9ceafceb6da5befadadb9aeca74a957b75d22811722d62d0e8c1565f610e681a3724d02bdbd3316343 languageName: node linkType: hard -"@react-native-community/cli-tools@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-tools@npm:20.0.2" +"@react-native-community/cli-tools@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-tools@npm:20.1.1" dependencies: "@vscode/sudo-prompt": "npm:^9.0.0" appdirsjs: "npm:^1.2.4" - chalk: "npm:^4.1.2" execa: "npm:^5.0.0" find-up: "npm:^5.0.0" launch-editor: "npm:^2.9.1" mime: "npm:^2.4.1" ora: "npm:^5.4.1" + picocolors: "npm:^1.1.1" prompts: "npm:^2.4.2" semver: "npm:^7.5.2" - checksum: 10/8f1c752a6bffa4dc201446bd4d8a7162ae296e87e3a7f2d87201e79cc9ceadb9ed4daafde83b732d79f54f76c4294e8822fae483c9120c358bc422482d98c045 + checksum: 10/0539b1f1acd7bed3d4d9ee944c281673ae2fa718b3b01cecbe2152f4c2e6cf315881ededbeca32f01b7a65196fc672c6a4056797e45e76c8898842f0cc9f8dc2 languageName: node linkType: hard -"@react-native-community/cli-types@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-types@npm:20.0.2" +"@react-native-community/cli-types@npm:20.1.1": + version: 20.1.1 + resolution: "@react-native-community/cli-types@npm:20.1.1" dependencies: joi: "npm:^17.2.1" - checksum: 10/b4e708fe759ef995b99bdbe89f0e83a00cba680c01a119d317f445528e8321d89a842e0641ad2a08f4c3793ddb9e02b0045d2e82da66d279cb21ee42961ba9ce + checksum: 10/0e03906f4636b35935eccabb47311748ceb5dc9328db16c42c5b7752aa21b822e0ddbf5dee91297310fe92db7cee19cfc312877bb0dd0c3b37cd183dcf127dda languageName: node linkType: hard "@react-native-community/cli@npm:latest": - version: 20.0.2 - resolution: "@react-native-community/cli@npm:20.0.2" - dependencies: - "@react-native-community/cli-clean": "npm:20.0.2" - "@react-native-community/cli-config": "npm:20.0.2" - "@react-native-community/cli-doctor": "npm:20.0.2" - "@react-native-community/cli-server-api": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - "@react-native-community/cli-types": "npm:20.0.2" - chalk: "npm:^4.1.2" + version: 20.1.1 + resolution: "@react-native-community/cli@npm:20.1.1" + dependencies: + "@react-native-community/cli-clean": "npm:20.1.1" + "@react-native-community/cli-config": "npm:20.1.1" + "@react-native-community/cli-doctor": "npm:20.1.1" + "@react-native-community/cli-server-api": "npm:20.1.1" + "@react-native-community/cli-tools": "npm:20.1.1" + "@react-native-community/cli-types": "npm:20.1.1" commander: "npm:^9.4.1" deepmerge: "npm:^4.3.0" execa: "npm:^5.0.0" find-up: "npm:^5.0.0" fs-extra: "npm:^8.1.0" graceful-fs: "npm:^4.1.3" + picocolors: "npm:^1.1.1" prompts: "npm:^2.4.2" semver: "npm:^7.5.2" bin: rnc-cli: build/bin.js - checksum: 10/8de75d8ab9c3ffce215e4dcff57832f22e8f8853a212dbd0c2b8e96cff6e6511593d7ed064aba920a8245147b4079a77ab4445461bab97a9e08bf84472a6e8e6 + checksum: 10/9e1ebdd31d59fc8d8085c92aad72eb611c378da70038cefc6bb92047d0ff34b82f6711f2e6f5af91aee6aa3ee04d677884860fb726325b96d979a074d13ed577 languageName: node linkType: hard +"@react-native-executorch/bare-resource-fetcher@workspace:packages/bare-resource-fetcher": + version: 0.0.0-use.local + resolution: "@react-native-executorch/bare-resource-fetcher@workspace:packages/bare-resource-fetcher" + dependencies: + "@dr.pogodin/react-native-fs": "npm:^2.36.2" + "@kesha-antonov/react-native-background-downloader": "npm:^4.4.5" + "@types/react": "npm:~19.1.10" + react: "npm:19.1.0" + react-native: "npm:0.81.5" + react-native-executorch: "workspace:*" + typescript: "npm:~5.9.2" + peerDependencies: + "@dr.pogodin/react-native-fs": ^2.0.0 + "@kesha-antonov/react-native-background-downloader": ^4.0.0 + react-native: "*" + react-native-executorch: "*" + languageName: unknown + linkType: soft + +"@react-native-executorch/expo-resource-fetcher@workspace:*, @react-native-executorch/expo-resource-fetcher@workspace:packages/expo-resource-fetcher": + version: 0.0.0-use.local + resolution: "@react-native-executorch/expo-resource-fetcher@workspace:packages/expo-resource-fetcher" + dependencies: + "@types/react": "npm:~19.1.10" + expo: "npm:^54.0.0" + expo-asset: "npm:12.0.11" + expo-file-system: "npm:^19.0.20" + react: "npm:19.1.0" + react-native: "npm:0.81.5" + react-native-executorch: "workspace:*" + typescript: "npm:~5.9.2" + peerDependencies: + expo: ">=54.0.0" + expo-asset: ^12.0.0 + expo-file-system: ^19.0.0 + react-native: "*" + react-native-executorch: "*" + languageName: unknown + linkType: soft + "@react-native/assets-registry@npm:0.81.5": version: 0.81.5 resolution: "@react-native/assets-registry@npm:0.81.5" @@ -3805,15 +3893,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/babel-plugin-codegen@npm:0.76.9" - dependencies: - "@react-native/codegen": "npm:0.76.9" - checksum: 10/f70b341954c8a83de7c9ee0d261f55b326204d2c02ff7680e091a999fa9137b654aa8fe13769ab76daac5d12b47532833cf49b9bdc7a00011d260c8871b5b4cf - languageName: node - linkType: hard - "@react-native/babel-plugin-codegen@npm:0.81.5": version: 0.81.5 resolution: "@react-native/babel-plugin-codegen@npm:0.81.5" @@ -3824,9 +3903,19 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/babel-preset@npm:0.76.9" +"@react-native/babel-plugin-codegen@npm:0.81.6": + version: 0.81.6 + resolution: "@react-native/babel-plugin-codegen@npm:0.81.6" + dependencies: + "@babel/traverse": "npm:^7.25.3" + "@react-native/codegen": "npm:0.81.6" + checksum: 10/e395a1b69d2d9534d3a38734b7df0260223cdd326ee78058c4764d9b08e1e4e684047240e56373fe785a84cb541192748739e254d2991750f8676ed2d63bd185 + languageName: node + linkType: hard + +"@react-native/babel-preset@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/babel-preset@npm:0.81.5" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -3869,19 +3958,19 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.76.9" - babel-plugin-syntax-hermes-parser: "npm:^0.25.1" + "@react-native/babel-plugin-codegen": "npm:0.81.5" + babel-plugin-syntax-hermes-parser: "npm:0.29.1" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/3f4810482ea40b0f48add41320e440daabcae1c62ab9c344d0d426b81b2196a6c9b02882b594cfeb039e398fc238980c35f73c4b0182bfd15298de0faed13f0f + checksum: 10/c077e01b093be9f93e08b36dd7bc425d897749f76f9a2912cff8589f9ad3e36be0d6b54542ec6fbf13bd4b87ff7648b17a275930c546665d7b8accf4c89b6ff3 languageName: node linkType: hard -"@react-native/babel-preset@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/babel-preset@npm:0.81.5" +"@react-native/babel-preset@npm:0.81.6": + version: 0.81.6 + resolution: "@react-native/babel-preset@npm:0.81.6" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -3924,37 +4013,36 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.81.5" + "@react-native/babel-plugin-codegen": "npm:0.81.6" babel-plugin-syntax-hermes-parser: "npm:0.29.1" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/c077e01b093be9f93e08b36dd7bc425d897749f76f9a2912cff8589f9ad3e36be0d6b54542ec6fbf13bd4b87ff7648b17a275930c546665d7b8accf4c89b6ff3 + checksum: 10/930604718f04852f9626080b2f524f7b0b652a2a9bb625192e391c5269cc36dce23fe863784b9100b153ac50809895904ce0a4fb044c7b8a73ec2ac47920339b languageName: node linkType: hard -"@react-native/codegen@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/codegen@npm:0.76.9" +"@react-native/codegen@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/codegen@npm:0.81.5" dependencies: + "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.25.3" glob: "npm:^7.1.1" - hermes-parser: "npm:0.23.1" + hermes-parser: "npm:0.29.1" invariant: "npm:^2.2.4" - jscodeshift: "npm:^0.14.0" - mkdirp: "npm:^0.5.1" nullthrows: "npm:^1.1.1" yargs: "npm:^17.6.2" peerDependencies: - "@babel/preset-env": ^7.1.6 - checksum: 10/4a4c97f8d7569fb1917e2dad71b4be66558be5d47993d666d14e886e65f19c7b1ebfd5d2205d382e7c3724b2d58bcbc8e23e5a64cb2a281d8869e0419153bab5 + "@babel/core": "*" + checksum: 10/eb162a2b4232e6b6a345a659688c488610ba918e40dc8e4a9d17ed4fd3e026ca8066825128533ea5955b0eb58b3af0f8beb813f188bc506d8989285572f5d34f languageName: node linkType: hard -"@react-native/codegen@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/codegen@npm:0.81.5" +"@react-native/codegen@npm:0.81.6": + version: 0.81.6 + resolution: "@react-native/codegen@npm:0.81.6" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.25.3" @@ -3965,7 +4053,7 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/eb162a2b4232e6b6a345a659688c488610ba918e40dc8e4a9d17ed4fd3e026ca8066825128533ea5955b0eb58b3af0f8beb813f188bc506d8989285572f5d34f + checksum: 10/a1d5e9dfd9f70248fb6f592ff9477d20bf00542517859eb4eff543bbf48b5a2e0fa2e876502248ae3e1db6777d3af8cab0f8c2784191f49c625bf5d63d66b125 languageName: node linkType: hard @@ -4055,13 +4143,6 @@ __metadata: languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/js-polyfills@npm:0.76.9" - checksum: 10/3e1b64b9143a5ad69d7d56537792b1adba4f3b94aaf04f8a67f5ff3b851fd85df8d1cd79c9247a1811072dff93958d9142c7d41f125e7806138a03d6da105b03 - languageName: node - linkType: hard - "@react-native/js-polyfills@npm:0.81.5": version: 0.81.5 resolution: "@react-native/js-polyfills@npm:0.81.5" @@ -4069,29 +4150,36 @@ __metadata: languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.76.9": - version: 0.76.9 - resolution: "@react-native/metro-babel-transformer@npm:0.76.9" +"@react-native/js-polyfills@npm:0.81.6": + version: 0.81.6 + resolution: "@react-native/js-polyfills@npm:0.81.6" + checksum: 10/9edd8a49c5b4eab5285987fba4242983970266a7c75354eea9b74973f6ec76fdaad156bf100a02213b44fb916c93341e40e95bd799b1c46ed32428e1c7d2faf8 + languageName: node + linkType: hard + +"@react-native/metro-babel-transformer@npm:0.81.6": + version: 0.81.6 + resolution: "@react-native/metro-babel-transformer@npm:0.81.6" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/babel-preset": "npm:0.76.9" - hermes-parser: "npm:0.23.1" + "@react-native/babel-preset": "npm:0.81.6" + hermes-parser: "npm:0.29.1" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/c9cd4100142b634ecc61981bde71cbd044e4f5fa5f459284ed141599d46be4d43d1520319265ee02a4d474a98de6cc7f60a2ec4597e2b1bc76579c8a11d3619e + checksum: 10/4724d7cd7290b40f14d0cd40f5fb73955260d0494acdfd20cef2bb863514fbf50f62286b1ccc5e769d1fe96a62a55f520f263b45f2a62d0ea57db95a40e9e21a languageName: node linkType: hard -"@react-native/metro-config@npm:^0.76.3": - version: 0.76.9 - resolution: "@react-native/metro-config@npm:0.76.9" +"@react-native/metro-config@npm:^0.81.5": + version: 0.81.6 + resolution: "@react-native/metro-config@npm:0.81.6" dependencies: - "@react-native/js-polyfills": "npm:0.76.9" - "@react-native/metro-babel-transformer": "npm:0.76.9" - metro-config: "npm:^0.81.0" - metro-runtime: "npm:^0.81.0" - checksum: 10/c52dd64967e6ead75d735702def2e29767f56321d888eae48b683e65118852c567c066755fa0f18c554773a8a0cb44493b436f516bf2c96bb6625f86e7439fec + "@react-native/js-polyfills": "npm:0.81.6" + "@react-native/metro-babel-transformer": "npm:0.81.6" + metro-config: "npm:^0.83.1" + metro-runtime: "npm:^0.83.1" + checksum: 10/0e39fa974a61f51172f6bae6b5bc90cbefb104685acbbd68e7886bc7687fda11d533ddbec22538e2a4981b626cbc710b34ad6e0a49b866f8d870c22b926fcb9b languageName: node linkType: hard @@ -4120,27 +4208,27 @@ __metadata: linkType: hard "@react-navigation/bottom-tabs@npm:^7.4.0": - version: 7.8.11 - resolution: "@react-navigation/bottom-tabs@npm:7.8.11" + version: 7.13.0 + resolution: "@react-navigation/bottom-tabs@npm:7.13.0" dependencies: - "@react-navigation/elements": "npm:^2.9.1" + "@react-navigation/elements": "npm:^2.9.5" color: "npm:^4.2.3" sf-symbols-typescript: "npm:^2.1.0" peerDependencies: - "@react-navigation/native": ^7.1.24 + "@react-navigation/native": ^7.1.28 react: ">= 18.2.0" react-native: "*" react-native-safe-area-context: ">= 4.0.0" react-native-screens: ">= 4.0.0" - checksum: 10/313f4daf2a02325460ee6f2515adf4273c3f0cec9001f5ea73c77ad5ce25d003fa623b593390af111a1db505a5eb3793bae32fd029dd1f740fe5b7b39e19f923 + checksum: 10/a69ab57289255e2764a5e8b9ecdf190ae55c8ec2ef59b16b29dd34b3933d69b991b0038365772dbd8cdc21b782106020c33071cd7689978c2dd35e2fcf036f6f languageName: node linkType: hard -"@react-navigation/core@npm:^7.13.5": - version: 7.13.5 - resolution: "@react-navigation/core@npm:7.13.5" +"@react-navigation/core@npm:^7.14.0": + version: 7.14.0 + resolution: "@react-navigation/core@npm:7.14.0" dependencies: - "@react-navigation/routers": "npm:^7.5.2" + "@react-navigation/routers": "npm:^7.5.3" escape-string-regexp: "npm:^4.0.0" fast-deep-equal: "npm:^3.1.3" nanoid: "npm:^3.3.11" @@ -4150,73 +4238,73 @@ __metadata: use-sync-external-store: "npm:^1.5.0" peerDependencies: react: ">= 18.2.0" - checksum: 10/3abe3f59492f97c7ea3e13cb9b531114c97156288255eac013b91c4d687377eef88653a1e3d7375cab0f995fa99ba84f5be13a2688b9637b7d0bda4f7bcac7e7 + checksum: 10/fa43ad12304f0dfa60688c73f59ac374c1900d1bad1823ab2b1454ab7e6376d0038ec2a597f67fa09fabe4381bfd210fb048518d61ad4fc44d6d608a0ceb6a1a languageName: node linkType: hard "@react-navigation/drawer@npm:^7.3.9": - version: 7.7.8 - resolution: "@react-navigation/drawer@npm:7.7.8" + version: 7.8.1 + resolution: "@react-navigation/drawer@npm:7.8.1" dependencies: - "@react-navigation/elements": "npm:^2.9.1" + "@react-navigation/elements": "npm:^2.9.5" color: "npm:^4.2.3" - react-native-drawer-layout: "npm:^4.2.0" + react-native-drawer-layout: "npm:^4.2.2" use-latest-callback: "npm:^0.2.4" peerDependencies: - "@react-navigation/native": ^7.1.24 + "@react-navigation/native": ^7.1.28 react: ">= 18.2.0" react-native: "*" react-native-gesture-handler: ">= 2.0.0" react-native-reanimated: ">= 2.0.0" react-native-safe-area-context: ">= 4.0.0" react-native-screens: ">= 4.0.0" - checksum: 10/99ca45d9b0d37fd46dfdd17d43b0a44da5995c67c7b09d92480aa9d9d509834bb156abf2290aa0e4ef6ec2c3b9f83e6e040c73733e4a4f308a1b1ab7900dd57f + checksum: 10/1c39458642865379a55ea456937fc6e0eef07b0430b48ece64a2f96f393f81702831ed25981ade1938d1e72701062d4c1c3b60ded377a8edce11d0a3ce7f7af9 languageName: node linkType: hard -"@react-navigation/elements@npm:^2.9.1": - version: 2.9.1 - resolution: "@react-navigation/elements@npm:2.9.1" +"@react-navigation/elements@npm:^2.9.5": + version: 2.9.5 + resolution: "@react-navigation/elements@npm:2.9.5" 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.24 + "@react-navigation/native": ^7.1.28 react: ">= 18.2.0" react-native: "*" react-native-safe-area-context: ">= 4.0.0" peerDependenciesMeta: "@react-native-masked-view/masked-view": optional: true - checksum: 10/ae4bb3be4773d12001a469cd972467cd4f83affe5eded4e972a9af1a14dee54b13bbb6d8481a7166329e028e9943e63d19ff36473d29b095053ca8de773f8939 + checksum: 10/b71c367082527dda303dfaa319af930ccbb1622f2cbe018382c8070c91944b59891fcabe048a76590d52ee07eac7ca9acb33e03fdacd8092aff1d58a165b0762 languageName: node linkType: hard "@react-navigation/native-stack@npm:^7.3.16": - version: 7.8.5 - resolution: "@react-navigation/native-stack@npm:7.8.5" + version: 7.12.0 + resolution: "@react-navigation/native-stack@npm:7.12.0" dependencies: - "@react-navigation/elements": "npm:^2.9.1" + "@react-navigation/elements": "npm:^2.9.5" color: "npm:^4.2.3" sf-symbols-typescript: "npm:^2.1.0" warn-once: "npm:^0.1.1" peerDependencies: - "@react-navigation/native": ^7.1.24 + "@react-navigation/native": ^7.1.28 react: ">= 18.2.0" react-native: "*" react-native-safe-area-context: ">= 4.0.0" react-native-screens: ">= 4.0.0" - checksum: 10/69381f0f938aed5b4ecfd8d980f4d01f510dd2d3a932c59e7e8c9e7f9c64f38c239a1ffe51fb794c238b7e661346799bdada5cb73a4eabf999b8d3c3a84d699a + checksum: 10/b080ad286c90a59186617f239a61272610cd9f52a577ce26861e9a4941a6cc62624665bfbe62cd3bc543c7303a7b2f089871428411c3268134bc44ae4eaa588b languageName: node linkType: hard "@react-navigation/native@npm:^7.1.6, @react-navigation/native@npm:^7.1.8": - version: 7.1.24 - resolution: "@react-navigation/native@npm:7.1.24" + version: 7.1.28 + resolution: "@react-navigation/native@npm:7.1.28" dependencies: - "@react-navigation/core": "npm:^7.13.5" + "@react-navigation/core": "npm:^7.14.0" escape-string-regexp: "npm:^4.0.0" fast-deep-equal: "npm:^3.1.3" nanoid: "npm:^3.3.11" @@ -4224,22 +4312,22 @@ __metadata: peerDependencies: react: ">= 18.2.0" react-native: "*" - checksum: 10/efa8c912a71d40d00105b683ce3ebaba5a2f5d78142f0236a9a8bd4d6ccee8e28a105ff7ddf7a1455aa1c24abee890da7660c3e4db22a438817473596190d31e + checksum: 10/64f2d3136ad4034315b2aaf81d0ffd3d73425787aebf3ef7934dfb50931d50cbc3322378fdc240df5d795f5c1ab361038c3200cc24c266c8a089706ca1f4edb7 languageName: node linkType: hard -"@react-navigation/routers@npm:^7.5.2": - version: 7.5.2 - resolution: "@react-navigation/routers@npm:7.5.2" +"@react-navigation/routers@npm:^7.5.3": + version: 7.5.3 + resolution: "@react-navigation/routers@npm:7.5.3" dependencies: nanoid: "npm:^3.3.11" - checksum: 10/b490b9bf9865cc419dfe9a7c3aa99041e7495b4b48e385716c1f9ce815fb59677c9c667de7e3b17d7e1fad6f9a7da5e26ace6f2ca8cb0be5e65178e9b9cc31a9 + checksum: 10/8b02cf4c9acd7d1ccb0771ebfbf18fa27aa8db4e5653403d9d78a08d1792b9f22654cb36ce3a1150181b141d8cf694d7665007ef005c041bce404d33f44acc73 languageName: node linkType: hard -"@shopify/react-native-skia@npm:2.2.12": - version: 2.2.12 - resolution: "@shopify/react-native-skia@npm:2.2.12" +"@shopify/react-native-skia@npm:2.4.14": + version: 2.4.14 + resolution: "@shopify/react-native-skia@npm:2.4.14" dependencies: canvaskit-wasm: "npm:0.40.0" react-reconciler: "npm:0.31.0" @@ -4254,7 +4342,7 @@ __metadata: optional: true bin: setup-skia-web: scripts/setup-canvaskit.js - checksum: 10/2543664085470267a9a6491ee90760f01d258cdd97cda5955d0c9f980ad57d647dffa5670f9d5d5f8cd6180ff46fe1df6f4281ae2e0b5c3632c703479b6a7608 + checksum: 10/cb0274dadb89046b357fb9cf071349f2e6c348ca3ea18360a791e084a1456c729de862d2cda3c0b81b306faebbbf2b63a91380ca2de3298266f0aa248f12d434 languageName: node linkType: hard @@ -4282,9 +4370,9 @@ __metadata: linkType: hard "@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d + version: 0.27.10 + resolution: "@sinclair/typebox@npm:0.27.10" + checksum: 10/1498c5ef1375787e6272528615d5c262afb60873191d2441316359817b1c411917063c8be102ef15b0b5c62243a9daa7aefc8426f20eb406b67038b3eaa0695a languageName: node linkType: hard @@ -4587,11 +4675,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 24.10.1 - resolution: "@types/node@npm:24.10.1" + version: 25.2.3 + resolution: "@types/node@npm:25.2.3" dependencies: undici-types: "npm:~7.16.0" - checksum: 10/ddac8c97be5f7401e31ea0e9316c6e864993c6cd06689b7f9874ecfb576ef8349f2d14298248a08b94a6dd029570a46a285cddc4d50e524817f1a3730b29a86e + checksum: 10/46962e3c1c0205da5b637c2e924f4eb03ce16f384af686b69afeb5fd4f8274d9a570375f8a24de2750633b69cb7ac33f0e458d9c3f20a66e12eb3a569499062d languageName: node linkType: hard @@ -4604,7 +4692,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:~19.1.10": +"@types/react@npm:~19.1.0, @types/react@npm:~19.1.10": version: 19.1.17 resolution: "@types/react@npm:19.1.17" dependencies: @@ -4868,9 +4956,9 @@ __metadata: linkType: hard "@vscode/sudo-prompt@npm:^9.0.0": - version: 9.3.1 - resolution: "@vscode/sudo-prompt@npm:9.3.1" - checksum: 10/233edb992ae5dda69b9c63101f85a7996ff7034cb9b0ea976f3ab06483511a35162a650d8e081ded5f07aa9b2f2bac93e45420d956cf1b1d8a76ac385d4a9581 + version: 9.3.2 + resolution: "@vscode/sudo-prompt@npm:9.3.2" + checksum: 10/2eabbf59ba784c5828d9f45cde2ada83f51796d88dea05ed0c270a98545ad5f47c8d48e54c2ed335273ec75499e9700ee8b48f1d9bf2bb3e42050faf1070d8c3 languageName: node linkType: hard @@ -4904,7 +4992,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.7, accepts@npm:^1.3.8, accepts@npm:~1.3.7": +"accepts@npm:^1.3.7, accepts@npm:^1.3.8, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -4961,6 +5049,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.11.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10/ee3c62162c953e91986c838f004132b6a253d700f1e51253b99791e2dbfdb39161bc950ebdc2f156f8568035bb5ed8be7bd78289cd9ecbf3381fe8f5b82e3f33 + languageName: node + linkType: hard + "anser@npm:^1.4.9": version: 1.4.10 resolution: "anser@npm:1.4.10" @@ -5097,23 +5197,23 @@ __metadata: languageName: node linkType: hard -"arkregex@npm:0.0.4": - version: 0.0.4 - resolution: "arkregex@npm:0.0.4" +"arkregex@npm:0.0.5": + version: 0.0.5 + resolution: "arkregex@npm:0.0.5" dependencies: "@ark/util": "npm:0.56.0" - checksum: 10/af9eccf7e931a810ee18196ffa4c97d436d807d6332de9ae4dbc7dec0f315b6cb69990cad40d3344de9464ec191024a1354d3765d19868c668acd4ead5820ea6 + checksum: 10/c5eca109df57639b3245e1e72efe1b43cf881a2234b29736b11f57d29674d9ef78a2dcf54f5381a33690d53ce8989520bc123bb686dcce83f15c44f141c7f8a9 languageName: node linkType: hard "arktype@npm:^2.1.15": - version: 2.1.28 - resolution: "arktype@npm:2.1.28" + version: 2.1.29 + resolution: "arktype@npm:2.1.29" dependencies: "@ark/schema": "npm:0.56.0" "@ark/util": "npm:0.56.0" - arkregex: "npm:0.0.4" - checksum: 10/790503fdbcaf2c549a96d4ffe83938d12221817f7c0d9939e857334e3bbca2895c4d34edfc66e74f2e925e6d97cdb280160ec5af39346f960d4d59e4b75ab3ed + arkregex: "npm:0.0.5" + checksum: 10/091df54e5df0282a26f5de74cc001569483fc61b3297277a51cb8244f277334a549cf8ae3342ca3bbde95bd10172aaa2f86e6c5738e2853b2b66c088a7c9f398 languageName: node linkType: hard @@ -5230,15 +5330,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:0.15.2": - version: 0.15.2 - resolution: "ast-types@npm:0.15.2" - dependencies: - tslib: "npm:^2.0.1" - checksum: 10/81680bd5829cdec33524e9aa3434e23f3919c0c388927068a0ff2e8466f55b0f34eae53e0007b3668742910c289481ab4e1d486a5318f618ae2fc93b5e7e863b - languageName: node - linkType: hard - "astral-regex@npm:^1.0.0": version: 1.0.0 resolution: "astral-regex@npm:1.0.0" @@ -5276,15 +5367,6 @@ __metadata: languageName: node linkType: hard -"babel-core@npm:^7.0.0-bridge.0": - version: 7.0.0-bridge.0 - resolution: "babel-core@npm:7.0.0-bridge.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/2a1cb879019dffb08d17bec36e13c3a6d74c94773f41c1fd8b14de13f149cc34b705b0a1e07b42fcf35917b49d78db6ff0c5c3b00b202a5235013d517b5c6bbb - languageName: node - linkType: hard - "babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" @@ -5327,16 +5409,16 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.14": - version: 0.4.14 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" +"babel-plugin-polyfill-corejs2@npm:^0.4.14, babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.15 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.15" dependencies: - "@babel/compat-data": "npm:^7.27.7" - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/8ec00a1b821ccbfcc432630da66e98bc417f5301f4ce665269d50d245a18ad3ce8a8af2a007f28e3defcd555bb8ce65f16b0d4b6d131bd788e2b97d8b8953332 + checksum: 10/e5f8a4e716400b2b5c51f7b3c0eec58da92f1d8cc1c6fe2e32555c98bc594be1de7fa1da373f8e42ab098c33867c4cc2931ce648c92aab7a4f4685417707c438 languageName: node linkType: hard @@ -5352,14 +5434,26 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.5": - version: 0.6.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" +"babel-plugin-polyfill-corejs3@npm:^0.14.0": + version: 0.14.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" + core-js-compat: "npm:^3.48.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/ed1932fa9a31e0752fd10ebf48ab9513a654987cab1182890839523cb898559d24ae0578fdc475d9f995390420e64eeaa4b0427045b56949dace3c725bc66dbb + checksum: 10/09c854a3bda9a930fbce4b80d52a24e5b0744fccb0c81bf8f470d62296f197a2afe111b2b9ecb0d8a47068de2f938d14b748295953377e47594b0673d53c9396 + languageName: node + linkType: hard + +"babel-plugin-polyfill-regenerator@npm:^0.6.5, babel-plugin-polyfill-regenerator@npm:^0.6.6": + version: 0.6.6 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.6" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/8de7ea32856e75784601cacf8f4e3cbf04ce1fd05d56614b08b7bbe0674d1e59e37ccaa1c7ed16e3b181a63abe5bd43a1ab0e28b8c95618a9ebf0be5e24d6b25 languageName: node linkType: hard @@ -5388,15 +5482,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-syntax-hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.25.1" - dependencies: - hermes-parser: "npm:0.25.1" - checksum: 10/dc80fafde1aed8e60cf86ecd2e9920e7f35ffe02b33bd4e772daaa786167bcf508aac3fc1aea425ff4c7a0be94d82528f3fe8619b7f41dac853264272d640c04 - languageName: node - linkType: hard - "babel-plugin-syntax-hermes-parser@npm:^0.28.0": version: 0.28.1 resolution: "babel-plugin-syntax-hermes-parser@npm:0.28.1" @@ -5440,9 +5525,9 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~54.0.8": - version: 54.0.8 - resolution: "babel-preset-expo@npm:54.0.8" +"babel-preset-expo@npm:~54.0.10": + version: 54.0.10 + resolution: "babel-preset-expo@npm:54.0.10" dependencies: "@babel/helper-module-imports": "npm:^7.25.9" "@babel/plugin-proposal-decorators": "npm:^7.12.9" @@ -5475,7 +5560,7 @@ __metadata: optional: true expo: optional: true - checksum: 10/7ecd779623fb80cb6eb559dc1b8fcf54e6128bff412336875fb97159abc847ed9aa8f04862d3f5054fbce844ee3fbaac2af16a65ddf26ab92f3855bab86bd57c + checksum: 10/210493e87fb2566fbf774a2bf20a0cfd552eb83f7d3fb71aa4b576ebeed6d367a1d7eda64cec8d166859efde6594789946676bae0d26176a45e4be9fac2fd6a4 languageName: node linkType: hard @@ -5498,6 +5583,15 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^4.0.2": + version: 4.0.2 + resolution: "balanced-match@npm:4.0.2" + dependencies: + jackspeak: "npm:^4.2.3" + checksum: 10/862d6e14832a45558bdd2bc4663ba6d8e7ba60670a6cb1ef952a62348d5f086b16ee71a21b369f0fee808432590c724c823a80cb59eddd140b5ffa3f55497b62 + languageName: node + linkType: hard + "base64-js@npm:^1.2.3, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -5506,11 +5600,11 @@ __metadata: linkType: hard "baseline-browser-mapping@npm:^2.9.0": - version: 2.9.2 - resolution: "baseline-browser-mapping@npm:2.9.2" + version: 2.9.19 + resolution: "baseline-browser-mapping@npm:2.9.19" bin: baseline-browser-mapping: dist/cli.js - checksum: 10/6e42ae4aaaa0becd37a58b00aa4734063a59b752b5bb66776fc73858d8d7eecea007f4af67fba7c48a9022ec243ad6a77aee735d9e063b1220a7f39b8cd39f4b + checksum: 10/8d7bbb7fe3d1ad50e04b127c819ba6d059c01ed0d2a7a5fc3327e23a8c42855fa3a8b510550c1fe1e37916147e6a390243566d3ef85bf6130c8ddfe5cc3db530 languageName: node linkType: hard @@ -5621,6 +5715,15 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^5.0.2": + version: 5.0.2 + resolution: "brace-expansion@npm:5.0.2" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10/18d382c0919c68f8bb56fbe4a9cb1181a0bf10e6786b5683e586493dfbb517bdcf972f4a3a8d560486627fd9c9c6ecef0a2b8fd454eb6082780307ffd5586251 + languageName: node + linkType: hard + "braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" @@ -5630,7 +5733,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.0, browserslist@npm:^4.28.0": +"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.0, browserslist@npm:^4.28.1": version: 4.28.1 resolution: "browserslist@npm:4.28.1" dependencies: @@ -5793,9 +5896,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001759": - version: 1.0.30001759 - resolution: "caniuse-lite@npm:1.0.30001759" - checksum: 10/da0ec28dd993dffa99402914903426b9466d2798d41c1dc9341fcb7dd10f58fdd148122e2c65001246c030ba1c939645b7b4597f6321e3246dc792323bb11541 + version: 1.0.30001769 + resolution: "caniuse-lite@npm:1.0.30001769" + checksum: 10/4b7d087832d4330a8b1fa02cd9455bdb068ea67f1735f2aa6324d5b64b24f5079cf6349b13d209f268ffa59644b9f4f784266b780bafd877ceb83c9797ca80ba languageName: node linkType: hard @@ -6007,17 +6110,6 @@ __metadata: languageName: node linkType: hard -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 10/770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 - languageName: node - linkType: hard - "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -6148,27 +6240,20 @@ __metadata: linkType: hard "comment-json@npm:^4.2.5": - version: 4.4.1 - resolution: "comment-json@npm:4.4.1" + version: 4.5.1 + resolution: "comment-json@npm:4.5.1" dependencies: array-timsort: "npm:^1.0.3" core-util-is: "npm:^1.0.3" esprima: "npm:^4.0.1" - checksum: 10/2d05701e361320c670623b01343ed9ff180f4b4a38291f19ab9e2ef5269f51c8d1011f003fceff8cbf73d293f53a8ffc8ba1f85ccb1f6d0703829155bd628bce + checksum: 10/3bdd2703f26690537f65ef708d62aae3980dba6fc566e82a71d95511b413a6f5f285af9af0415e4739dc6f363db24225e46f5267c576f249100cdb28c3adb00d languageName: node linkType: hard "comment-parser@npm:^1.4.0": - version: 1.4.1 - resolution: "comment-parser@npm:1.4.1" - checksum: 10/16a3260b5e77819ebd9c99b0b65c7d6723b1ff73487bac9ce2d8f016a2847dd689e8663b88e1fad1444bbea89847c42f785708ac86a2c55f614f7095249bbf6b - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10/4620bc4936a4ef12ce7dfcd272bb23a99f2ad68889a4e4ad766c9f8ad21af982511934d6f7050d4a8bde90011b1c15d56e61a1b4576d9913efbf697a20172d6c + version: 1.4.5 + resolution: "comment-parser@npm:1.4.5" + checksum: 10/4b5cacc7ab1ec48e3f51b788bd7cda567f5c83040e029e5c92eacf0785735a9b44ac49fdaf73d9bd4af9464aa4cc8cc7184902090b55b0023605a845f2666ba4 languageName: node linkType: hard @@ -6201,32 +6286,39 @@ __metadata: resolution: "computer-vision@workspace:apps/computer-vision" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/metro-config": "npm:^0.76.3" + "@expo/config-plugins": "npm:~54.0.4" + "@react-native-executorch/expo-resource-fetcher": "workspace:*" + "@react-native/metro-config": "npm:^0.81.5" "@react-navigation/drawer": "npm:^7.3.9" "@react-navigation/native": "npm:^7.1.6" - "@shopify/react-native-skia": "npm:2.2.12" + "@shopify/react-native-skia": "npm:2.4.14" "@types/pngjs": "npm:^6.0.5" - "@types/react": "npm:~19.1.10" - expo: "npm:^54.0.27" + "@types/react": "npm:~19.1.0" + expo: "npm:~54.0.33" + expo-build-properties: "npm:~1.0.10" expo-constants: "npm:~18.0.11" expo-font: "npm:~14.0.10" expo-linking: "npm:~8.0.10" expo-router: "npm:~6.0.17" expo-status-bar: "npm:~3.0.9" - metro-config: "npm:^0.81.0" + metro-config: "npm:^0.81.5" react: "npm:19.1.0" + react-dom: "npm:19.1.0" react-native: "npm:0.81.5" react-native-device-info: "npm:^14.0.4" react-native-executorch: "workspace:*" - react-native-gesture-handler: "npm:~2.28.0" + react-native-gesture-handler: "npm:~2.30.0" react-native-image-picker: "npm:^7.2.2" react-native-loading-spinner-overlay: "npm:^3.0.1" - react-native-reanimated: "npm:~4.1.1" + react-native-nitro-image: "npm:0.10.2" + react-native-nitro-modules: "npm:0.33.4" + react-native-reanimated: "npm:~4.2.1" react-native-safe-area-context: "npm:~5.6.0" - react-native-screens: "npm:~4.16.0" - react-native-svg: "npm:15.12.1" + react-native-screens: "npm:~4.22.0" + react-native-svg: "npm:15.15.1" react-native-svg-transformer: "npm:^1.5.0" - react-native-worklets: "npm:0.5.1" + react-native-vision-camera: "portal:../../../react-native-vision-camera-v5/packages/react-native-vision-camera" + react-native-worklets: "npm:^0.7.2" languageName: unknown linkType: soft @@ -6256,19 +6348,19 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^2.0.0": +"convert-source-map@npm:2.0.0, convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 languageName: node linkType: hard -"core-js-compat@npm:^3.43.0": - version: 3.47.0 - resolution: "core-js-compat@npm:3.47.0" +"core-js-compat@npm:^3.43.0, core-js-compat@npm:^3.48.0": + version: 3.48.0 + resolution: "core-js-compat@npm:3.48.0" dependencies: - browserslist: "npm:^4.28.0" - checksum: 10/8555ac0aede2e61e3b37c50d31a9d63bb59e96ef76194bea0521d2778b24d8b20b45bed7bf2fce9df9856872a1c31e03fec1da101507b4dbaba669693dc95f94 + browserslist: "npm:^4.28.1" + checksum: 10/83c326dcfef5e174fd3f8f33c892c66e06d567ce27f323a1197a6c280c0178fe18d3e9c5fb95b00c18b98d6c53fba5c646def5fedaa77310a4297d16dfbe2029 languageName: node linkType: hard @@ -6353,13 +6445,6 @@ __metadata: languageName: node linkType: hard -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 10/0283879f55e7c16fdceacc181f87a0a65c53bc16ffe1d58b9d19a6277adcd71900d02bb2c4843dd55e78c51e30e89b0fec618a7f170ebcc95b33182c28f05fd6 - languageName: node - linkType: hard - "cspell-config-lib@npm:8.19.4": version: 8.19.4 resolution: "cspell-config-lib@npm:8.19.4" @@ -6632,7 +6717,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -6661,11 +6746,11 @@ __metadata: linkType: hard "decode-named-character-reference@npm:^1.0.0": - version: 1.2.0 - resolution: "decode-named-character-reference@npm:1.2.0" + version: 1.3.0 + resolution: "decode-named-character-reference@npm:1.3.0" dependencies: character-entities: "npm:^2.0.0" - checksum: 10/f26b23046c1a137c0b41fa51e3ce07ba8364640322c742a31570999784abc8572fc24cb108a76b14ff72ddb75d35aad3d14b10d7743639112145a2664b9d1864 + checksum: 10/82eb1208abf59d1f1e368285b6880201a3c3f147a4d7ce74e44cd41374ef00c9a376e8595e38002031db63291f91f7f3ff56b9724f715befff8f5566593d6de0 languageName: node linkType: hard @@ -6684,14 +6769,14 @@ __metadata: linkType: hard "dedent@npm:^1.0.0": - version: 1.7.0 - resolution: "dedent@npm:1.7.0" + version: 1.7.1 + resolution: "dedent@npm:1.7.1" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: 10/c902f3e7e828923bd642c12c1d8996616ff5588f8279a2951790bd7c7e479fa4dd7f016b55ce2c9ea1aa2895fc503e7d6c0cde6ebc95ca683ac0230f7c911fd7 + checksum: 10/78785ef592e37e0b1ca7a7a5964c8f3dee1abdff46c5bb49864168579c122328f6bb55c769bc7e005046a7381c3372d3859f0f78ab083950fa146e1c24873f4f languageName: node linkType: hard @@ -6952,9 +7037,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.263": - version: 1.5.266 - resolution: "electron-to-chromium@npm:1.5.266" - checksum: 10/2c7e05d1df189013e01b9fa19f5794dc249b80f330ab87f78674fa7416df153e2d32738d16914eee1112b5d8878b6181336e502215a34c63c255da078de5209d + version: 1.5.286 + resolution: "electron-to-chromium@npm:1.5.286" + checksum: 10/530ae36571f3f737431dc1f97ab176d9ec38d78e7a14a78fff78540769ef139e9011200a886864111ee26d64e647136531ff004f368f5df8cdd755c45ad97649 languageName: node linkType: hard @@ -7081,18 +7166,18 @@ __metadata: linkType: hard "errorhandler@npm:^1.5.1": - version: 1.5.1 - resolution: "errorhandler@npm:1.5.1" + version: 1.5.2 + resolution: "errorhandler@npm:1.5.2" dependencies: - accepts: "npm:~1.3.7" + accepts: "npm:~1.3.8" escape-html: "npm:~1.0.3" - checksum: 10/73b7abb08fb751107e9bebecc33c40c0641a54be8bda8e4a045f3f5cb7b805041927fef5629ea39b1737799eb52fe2499ca531f11ac51b0294ccc4667d72cb91 + checksum: 10/7ce0a598cc2c52840e32b46d2da8c7b0a4594aa67e93db46112cf791d4c8a4a1299af7f7aa65253d2e9d42af4d275c96387c0d186427df5ee93d33670bdac541 languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0": - version: 1.24.0 - resolution: "es-abstract@npm:1.24.0" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.1": + version: 1.24.1 + resolution: "es-abstract@npm:1.24.1" dependencies: array-buffer-byte-length: "npm:^1.0.2" arraybuffer.prototype.slice: "npm:^1.0.4" @@ -7148,7 +7233,7 @@ __metadata: typed-array-length: "npm:^1.0.7" unbox-primitive: "npm:^1.1.0" which-typed-array: "npm:^1.1.19" - checksum: 10/64e07a886f7439cf5ccfc100f9716e6173e10af6071a50a5031afbdde474a3dbc9619d5965da54e55f8908746a9134a46be02af8c732d574b7b81ed3124e2daf + checksum: 10/c84cb69ebae36781309a3ed70ff40b4767a921d3b3518060fac4e08f14ede04491b68e9f318aedf186e349d4af4a40f5d0e4111e46513800e8368551fd09de8c languageName: node linkType: hard @@ -7167,26 +7252,26 @@ __metadata: linkType: hard "es-iterator-helpers@npm:^1.2.1": - version: 1.2.1 - resolution: "es-iterator-helpers@npm:1.2.1" + version: 1.2.2 + resolution: "es-iterator-helpers@npm:1.2.2" dependencies: call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" + call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.6" + es-abstract: "npm:^1.24.1" es-errors: "npm:^1.3.0" - es-set-tostringtag: "npm:^2.0.3" + es-set-tostringtag: "npm:^2.1.0" function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.6" + get-intrinsic: "npm:^1.3.0" globalthis: "npm:^1.0.4" gopd: "npm:^1.2.0" has-property-descriptors: "npm:^1.0.2" has-proto: "npm:^1.2.0" has-symbols: "npm:^1.1.0" internal-slot: "npm:^1.1.0" - iterator.prototype: "npm:^1.1.4" + iterator.prototype: "npm:^1.1.5" safe-array-concat: "npm:^1.1.3" - checksum: 10/802e0e8427a05ff4a5b0c70c7fdaaeff37cdb81a28694aeb7bfb831c6ab340d8f3deeb67b96732ff9e9699ea240524d5ea8a9a6a335fcd15aa3983b27b06113f + checksum: 10/17b5b2834c4f5719d6ce0e837a4d11c6ba4640bee28290d22ec4daf7106ec3d5fe0ff4f7e5dbaa2b4612e8335934360e964a8f08608d43f2889da106b25481ee languageName: node linkType: hard @@ -7199,7 +7284,7 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": +"es-set-tostringtag@npm:^2.1.0": version: 2.1.0 resolution: "es-set-tostringtag@npm:2.1.0" dependencies: @@ -7339,11 +7424,11 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.0.1": - version: 5.5.4 - resolution: "eslint-plugin-prettier@npm:5.5.4" + version: 5.5.5 + resolution: "eslint-plugin-prettier@npm:5.5.5" dependencies: - prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.11.7" + prettier-linter-helpers: "npm:^1.0.1" + synckit: "npm:^0.11.12" peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" @@ -7354,7 +7439,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10/5e39e3b7046d4ba0e1111cc2048630ee9d0aa5d5bb00d6230bef56893fdae37cbe2261babfb26db350cc2ad517c81d283b3f8b04cfee4e5aef7cd4bee72f90de + checksum: 10/36c22c2fa2fd7c61ed292af1280e1d8f94dfe1671eacc5a503a249ca4b27fd226dbf6a1820457d611915926946f42729488d2dc7a5c320601e6cf1fad0d28f66 languageName: node linkType: hard @@ -7506,7 +7591,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -7517,11 +7602,11 @@ __metadata: linkType: hard "esquery@npm:^1.4.2": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" + version: 1.7.0 + resolution: "esquery@npm:1.7.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a + checksum: 10/4afaf3089367e1f5885caa116ef386dffd8bfd64da21fd3d0e56e938d2667cfb2e5400ab4a825aa70e799bb3741e5b5d63c0b94d86e2d4cf3095c9e64b2f5a15 languageName: node linkType: hard @@ -7569,13 +7654,6 @@ __metadata: languageName: node linkType: hard -"exec-async@npm:^2.2.0": - version: 2.2.0 - resolution: "exec-async@npm:2.2.0" - checksum: 10/35932a49c825245e1fe022848a3ffef71717955149a3af8d56bf15b04a21c8f098581ffe2e4916a9dbd7736ce559365ccd55327e72422136adb9f4af867e1203 - languageName: node - linkType: hard - "execa@npm:^4.0.3": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -7630,17 +7708,31 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:12.0.11, expo-asset@npm:~12.0.11": - version: 12.0.11 - resolution: "expo-asset@npm:12.0.11" +"expo-asset@npm:12.0.11": + version: 12.0.11 + resolution: "expo-asset@npm:12.0.11" + dependencies: + "@expo/image-utils": "npm:^0.8.8" + expo-constants: "npm:~18.0.11" + peerDependencies: + expo: "*" + react: "*" + react-native: "*" + checksum: 10/9e278a6127efae6c2d2d8faf213db760d18d901e8c7969d4a185b746f4b0264d7c4eac48d49674e1e5fc33fdf86c59c26d3903abee3bd23788c5cd3715614f3c + languageName: node + linkType: hard + +"expo-asset@npm:~12.0.12": + version: 12.0.12 + resolution: "expo-asset@npm:12.0.12" dependencies: "@expo/image-utils": "npm:^0.8.8" - expo-constants: "npm:~18.0.11" + expo-constants: "npm:~18.0.12" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/9e278a6127efae6c2d2d8faf213db760d18d901e8c7969d4a185b746f4b0264d7c4eac48d49674e1e5fc33fdf86c59c26d3903abee3bd23788c5cd3715614f3c + checksum: 10/7034316d820837c92ac70274be56a8e59181f1513805f8a4c85e16f12e1dd75ac6d6ae0b231bd8a76adbb71be6163c05b31b1d437f15b14745c70cc1f255c8a1 languageName: node linkType: hard @@ -7654,6 +7746,18 @@ __metadata: languageName: node linkType: hard +"expo-build-properties@npm:~1.0.10": + version: 1.0.10 + resolution: "expo-build-properties@npm:1.0.10" + dependencies: + ajv: "npm:^8.11.0" + semver: "npm:^7.6.0" + peerDependencies: + expo: "*" + checksum: 10/0dde41d659d243268ceae49bba3e4c07b72c245df8124f86fb720bc0556a2c4d03dd75e59e068a07438ef5ba3188b67a7a6516d2a37d3d91429070745b2506a2 + languageName: node + linkType: hard + "expo-calendar@npm:~15.0.8": version: 15.0.8 resolution: "expo-calendar@npm:15.0.8" @@ -7664,39 +7768,39 @@ __metadata: languageName: node linkType: hard -"expo-constants@npm:~18.0.11": - version: 18.0.11 - resolution: "expo-constants@npm:18.0.11" +"expo-constants@npm:~18.0.11, expo-constants@npm:~18.0.12, expo-constants@npm:~18.0.13": + version: 18.0.13 + resolution: "expo-constants@npm:18.0.13" dependencies: - "@expo/config": "npm:~12.0.11" + "@expo/config": "npm:~12.0.13" "@expo/env": "npm:~2.0.8" peerDependencies: expo: "*" react-native: "*" - checksum: 10/4da78ce638b417d1cb958b8f7c56a54a84cd1cd600d8e62751a32ca858b130e8fe1db7d97acc765d667e7668e401247016b62bfc88cd8624cc92e2345bbd4cb8 + checksum: 10/f29c72b6f5798bd37550aafcc89c3f1a630c4910a5b69c1e19d03544f6ebf0cb65adf39db600ccbeb6e60545b2b231d244373ef3139e3c75991b380940065c6b languageName: node linkType: hard -"expo-file-system@npm:^19.0.20, expo-file-system@npm:~19.0.20": - version: 19.0.20 - resolution: "expo-file-system@npm:19.0.20" +"expo-file-system@npm:^19.0.20, expo-file-system@npm:~19.0.21": + version: 19.0.21 + resolution: "expo-file-system@npm:19.0.21" peerDependencies: expo: "*" react-native: "*" - checksum: 10/c0ead2eb2f97840fea54f88bcc41f0094d5bef19b6261d768bdaa9fd06e5accf40ce49fe183f84d7042484b7595319cf37691123b699b0f2b00c81068582fbe9 + checksum: 10/00a2f13f8139724016f8b811303dd4a4070a315f80ee9e1877bcfd00773b38caafe4f1d3d7d4a87777e4ff53ba645aae0b4430e875f9ee5f277b88372b507811 languageName: node linkType: hard -"expo-font@npm:~14.0.10": - version: 14.0.10 - resolution: "expo-font@npm:14.0.10" +"expo-font@npm:~14.0.10, expo-font@npm:~14.0.11": + version: 14.0.11 + resolution: "expo-font@npm:14.0.11" dependencies: fontfaceobserver: "npm:^2.1.0" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/3fb7d87c75c818c3c8503d43f9e13b3d237f2e128bcb59e09b8fdad3eaf1aece2ab89030d5cffbeb5b172d7b030df627e4319b0fdd97e6f6d57e27bbdb520f22 + checksum: 10/80acffecdbd49a2ba1d7ecd8727f355bf47c39873d92f5959ff3bf7fd1de3e6ac10ebe2a77b8238287c3f2b7d033df40b562505fec370f82d9444400e19d7518 languageName: node linkType: hard @@ -7711,21 +7815,21 @@ __metadata: linkType: hard "expo-linking@npm:~8.0.10": - version: 8.0.10 - resolution: "expo-linking@npm:8.0.10" + version: 8.0.11 + resolution: "expo-linking@npm:8.0.11" dependencies: - expo-constants: "npm:~18.0.11" + expo-constants: "npm:~18.0.12" invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/332353a7ca3dd1112e92ba73d95a51fc22c518725b02bd2aca7fdbd12f26b8879d3bcf3321fc94ca95485ebf00e72b42b64af0b11b611bd91ad4f79303342c31 + checksum: 10/b43851e173e5b2b21ac7cfc1fef05ae1cb39209c82af73943abb1e701a767e3759cf4a85e47bb181ab8a0c7b080f9b9d9b7d52f6c54f620f06dad7848e05f336 languageName: node linkType: hard -"expo-modules-autolinking@npm:3.0.23": - version: 3.0.23 - resolution: "expo-modules-autolinking@npm:3.0.23" +"expo-modules-autolinking@npm:3.0.24": + version: 3.0.24 + resolution: "expo-modules-autolinking@npm:3.0.24" dependencies: "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.1.0" @@ -7734,25 +7838,25 @@ __metadata: resolve-from: "npm:^5.0.0" bin: expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10/d16b686a2f8a1b665e2d3bd98c60c94d4a276c24367c8a0bf6d7c81e5ec3c6ac24cec811bc3fc8ec440d7a98355e1123cf9ab3cc830500f325be9a742b50efcb + checksum: 10/e3b77d2fa84b77e53dca2ef608b48c4db196957c76ac7cc1aba4eb2cca44b5082a16f7af8a3549a342c7a1362f069a76fb9ebdab4be6b467e3791ad48387e15a languageName: node linkType: hard -"expo-modules-core@npm:3.0.28": - version: 3.0.28 - resolution: "expo-modules-core@npm:3.0.28" +"expo-modules-core@npm:3.0.29": + version: 3.0.29 + resolution: "expo-modules-core@npm:3.0.29" dependencies: invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/9ee68a2f75b7658d05de3ed54be9039e7a248a1c89ca1bf582d1635d2fff50ac0ac6de7a1d2b315aca5df432f0d67064d2cd2ad63ee2b5cb30c9f738fb92a9c7 + checksum: 10/db23a1c7321db54f40f0bcb9c18e7239d798fb7fb5d8ceedf09879f7ff4d90a85e375851796008006441326ed61c00ba00950b06bc7ea74f6ba648a9dac9d053 languageName: node linkType: hard "expo-router@npm:~6.0.17": - version: 6.0.17 - resolution: "expo-router@npm:6.0.17" + version: 6.0.23 + resolution: "expo-router@npm:6.0.23" dependencies: "@expo/metro-runtime": "npm:^6.1.2" "@expo/schema-utils": "npm:^0.1.8" @@ -7782,8 +7886,8 @@ __metadata: "@react-navigation/drawer": ^7.5.0 "@testing-library/react-native": ">= 12.0.0" expo: "*" - expo-constants: ^18.0.11 - expo-linking: ^8.0.10 + expo-constants: ^18.0.13 + expo-linking: ^8.0.11 react: "*" react-dom: "*" react-native: "*" @@ -7792,7 +7896,7 @@ __metadata: react-native-safe-area-context: ">= 5.4.0" react-native-screens: "*" react-native-web: "*" - react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 + react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4 peerDependenciesMeta: "@react-navigation/drawer": optional: true @@ -7808,7 +7912,7 @@ __metadata: optional: true react-server-dom-webpack: optional: true - checksum: 10/3d6e6774add5c84045bc07843c09e4e0f25eb65de5cee6d13f53ff61c2daefb47106db70308d0cead96e9166a31faa8cb94eccc23e57f21e9d9446e6f9c9a6fb + checksum: 10/37b92fb8adc038ff5813298235a66bd22ac9a6002d5f016f3ceefa3f96e59910de6e069f0a27b9c23f6b2b40171a6589d31ad944cfe85171a4484937e981676d languageName: node linkType: hard @@ -7831,28 +7935,28 @@ __metadata: languageName: node linkType: hard -"expo@npm:^54.0.0, expo@npm:^54.0.27": - version: 54.0.27 - resolution: "expo@npm:54.0.27" +"expo@npm:^54.0.0, expo@npm:^54.0.27, expo@npm:~54.0.33": + version: 54.0.33 + resolution: "expo@npm:54.0.33" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:54.0.18" - "@expo/config": "npm:~12.0.11" - "@expo/config-plugins": "npm:~54.0.3" + "@expo/cli": "npm:54.0.23" + "@expo/config": "npm:~12.0.13" + "@expo/config-plugins": "npm:~54.0.4" "@expo/devtools": "npm:0.1.8" "@expo/fingerprint": "npm:0.15.4" - "@expo/metro": "npm:~54.1.0" - "@expo/metro-config": "npm:54.0.10" + "@expo/metro": "npm:~54.2.0" + "@expo/metro-config": "npm:54.0.14" "@expo/vector-icons": "npm:^15.0.3" "@ungap/structured-clone": "npm:^1.3.0" - babel-preset-expo: "npm:~54.0.8" - expo-asset: "npm:~12.0.11" - expo-constants: "npm:~18.0.11" - expo-file-system: "npm:~19.0.20" - expo-font: "npm:~14.0.10" + babel-preset-expo: "npm:~54.0.10" + expo-asset: "npm:~12.0.12" + expo-constants: "npm:~18.0.13" + expo-file-system: "npm:~19.0.21" + expo-font: "npm:~14.0.11" expo-keep-awake: "npm:~15.0.8" - expo-modules-autolinking: "npm:3.0.23" - expo-modules-core: "npm:3.0.28" + expo-modules-autolinking: "npm:3.0.24" + expo-modules-core: "npm:3.0.29" pretty-format: "npm:^29.7.0" react-refresh: "npm:^0.14.2" whatwg-url-without-unicode: "npm:8.0.0-3" @@ -7873,7 +7977,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10/58917b6a363d8908395cf283f1e72f5e5c253619e297896160dafe1d18acb8feb46b76d880d9b52c96954aebe78f7069cf623726ad8921d431d07f9527a0699f + checksum: 10/ed672f78333cf50545ea1cca8181506604150cca01a8aae782da30ddcba185d68f2d48f2ca10dee575a7abbc7913cca3f4c3d34d98373b0e9706b344030fa929 languageName: node linkType: hard @@ -7899,9 +8003,9 @@ __metadata: linkType: hard "fast-equals@npm:^5.2.2": - version: 5.3.3 - resolution: "fast-equals@npm:5.3.3" - checksum: 10/e9af422e313564f9f5db60a655d50e0baec23140da14165b2d191a243fef7c16eac10c4aa1659acd74c00bf1aa623f46e8eee91742af2beb539a6dfb63c8cd96 + version: 5.4.0 + resolution: "fast-equals@npm:5.4.0" + checksum: 10/bea068ceb7825d486d88a17ccc3fe889d1833efefa8dc64c83806e797f66b3ea953ac4aebd96af022d828de315ec87476e76418a5da774217d0ab66de53d68f5 languageName: node linkType: hard @@ -7932,6 +8036,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10/818b2c96dc913bcf8511d844c3d2420e2c70b325c0653633f51821e4e29013c2015387944435cd0ef5322c36c9beecc31e44f71b257aeb8e0b333c1d62bb17c2 + languageName: node + linkType: hard + "fast-xml-parser@npm:^4.4.1": version: 4.5.3 resolution: "fast-xml-parser@npm:4.5.3" @@ -7944,11 +8055,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.19.1 - resolution: "fastq@npm:1.19.1" + version: 1.20.1 + resolution: "fastq@npm:1.20.1" dependencies: reusify: "npm:^1.0.4" - checksum: 10/75679dc226316341c4f2a6b618571f51eac96779906faecd8921b984e844d6ae42fabb2df69b1071327d398d5716693ea9c9c8941f64ac9e89ec2032ce59d730 + checksum: 10/ab2fe3a7a108112e7752cfe7fc11683c21e595913a6a593ad0b4415f31dddbfc283775ab66f2c8ccea6ab7cfc116157cbddcfae9798d9de98d08fe0a2c3e97b2 languageName: node linkType: hard @@ -8022,26 +8133,6 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^2.0.0": - version: 2.1.0 - resolution: "find-cache-dir@npm:2.1.0" - dependencies: - commondir: "npm:^1.0.1" - make-dir: "npm:^2.0.0" - pkg-dir: "npm:^3.0.0" - checksum: 10/60ad475a6da9f257df4e81900f78986ab367d4f65d33cf802c5b91e969c28a8762f098693d7a571b6e4dd4c15166c2da32ae2d18b6766a18e2071079448fdce4 - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10/38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -8097,13 +8188,6 @@ __metadata: languageName: node linkType: hard -"flow-parser@npm:0.*": - version: 0.292.0 - resolution: "flow-parser@npm:0.292.0" - checksum: 10/d5f9de995cdf6035bff4086a590b93ebcf94d759d94738ec83e7a98716553009caaa998bf9c19a97e2ed297c6ebcc4322060f6cff32937b2bcdff07f1ca90545 - languageName: node - linkType: hard - "fontfaceobserver@npm:^2.1.0": version: 2.3.0 resolution: "fontfaceobserver@npm:2.3.0" @@ -8137,7 +8221,7 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 10/64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1 @@ -8371,13 +8455,13 @@ __metadata: linkType: hard "glob@npm:^13.0.0": - version: 13.0.0 - resolution: "glob@npm:13.0.0" + version: 13.0.3 + resolution: "glob@npm:13.0.3" dependencies: - minimatch: "npm:^10.1.1" + minimatch: "npm:^10.2.0" minipass: "npm:^7.1.2" path-scurry: "npm:^2.0.0" - checksum: 10/de390721d29ee1c9ea41e40ec2aa0de2cabafa68022e237dc4297665a5e4d650776f2573191984ea1640aba1bf0ea34eddef2d8cbfbfc2ad24b5fb0af41d8846 + checksum: 10/38a9c78de078f61df1a555badf1198833c298fd3320520c93504a499f14afed6c37c892c576119f05e4d94981a4550a1a2246e826ffa6894a427004aff5b78b2 languageName: node linkType: hard @@ -8404,15 +8488,6 @@ __metadata: languageName: node linkType: hard -"global-dirs@npm:^0.1.1": - version: 0.1.1 - resolution: "global-dirs@npm:0.1.1" - dependencies: - ini: "npm:^1.3.4" - checksum: 10/10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -8453,7 +8528,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -8531,13 +8606,6 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-estree@npm:0.23.1" - checksum: 10/b7ad78f53044d53ec1c77e93036c16e34f6f0985c895540876301e4791d4db08da828870977140f5cf1ae34532bbb9d9d013a0a1a4a5a0da05177225648d5295 - languageName: node - linkType: hard - "hermes-estree@npm:0.25.1": version: 0.25.1 resolution: "hermes-estree@npm:0.25.1" @@ -8566,15 +8634,6 @@ __metadata: languageName: node linkType: hard -"hermes-parser@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-parser@npm:0.23.1" - dependencies: - hermes-estree: "npm:0.23.1" - checksum: 10/de88df4f23bd8dc2ffa89c8a317445320af8c7705a2aeeb05c4dd171f037a747982be153a0a237b1c9c7337b79bceaeb5052934cb8a25fe2e2473294a5343334 - languageName: node - linkType: hard - "hermes-parser@npm:0.25.1": version: 0.25.1 resolution: "hermes-parser@npm:0.25.1" @@ -8643,19 +8702,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10/0e7f76ee8ff8a33e58a3281a469815b893c41357378f408be8f6d4aa7d1efafb0da064625518e7078381b6a92325949b119dc38fcb30bdbc4e3a35f78c44c439 - languageName: node - linkType: hard - "http-errors@npm:~2.0.1": version: 2.0.1 resolution: "http-errors@npm:2.0.1" @@ -8679,6 +8725,13 @@ __metadata: languageName: node linkType: hard +"http-status-codes@npm:^2.3.0": + version: 2.3.0 + resolution: "http-status-codes@npm:2.3.0" + checksum: 10/1b8a01940b5e14d3c5b2f842313f4531469b41ce4fa40ca3aae5c82a3101828db2cc9406bfb2d50a46e6d521d106577b6656c2b065c76125b99ee54b2cbbac09 + languageName: node + linkType: hard + "https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" @@ -8809,7 +8862,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 @@ -8823,7 +8876,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.4, ini@npm:~1.3.0": +"ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10/314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 @@ -9139,15 +9192,6 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10/2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca - languageName: node - linkType: hard - "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -9301,17 +9345,10 @@ __metadata: languageName: node linkType: hard -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10/7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e - languageName: node - linkType: hard - -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: 10/db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10/2ead327ef596042ef9c9ec5f236b316acfaedb87f4bb61b3c3d574fb2e9c8a04b67305e04733bde52c24d9622fdebd3270aadb632adfbf9cadef88fe30f479e5 languageName: node linkType: hard @@ -9380,7 +9417,7 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.4": +"iterator.prototype@npm:^1.1.5": version: 1.1.5 resolution: "iterator.prototype@npm:1.1.5" dependencies: @@ -9407,6 +9444,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.2.3": + version: 4.2.3 + resolution: "jackspeak@npm:4.2.3" + dependencies: + "@isaacs/cliui": "npm:^9.0.0" + checksum: 10/b88e3fe5fa04d34f0f939a15b7cef4a8589999b7a366ef89a3e0f2c45d2a7666066b67cbf46d57c3a4796a76d27b9d869b23d96a803dd834200d222c2a70de7e + languageName: node + linkType: hard + "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -9903,37 +9949,6 @@ __metadata: languageName: node linkType: hard -"jscodeshift@npm:^0.14.0": - version: 0.14.0 - resolution: "jscodeshift@npm:0.14.0" - dependencies: - "@babel/core": "npm:^7.13.16" - "@babel/parser": "npm:^7.13.16" - "@babel/plugin-proposal-class-properties": "npm:^7.13.0" - "@babel/plugin-proposal-nullish-coalescing-operator": "npm:^7.13.8" - "@babel/plugin-proposal-optional-chaining": "npm:^7.13.12" - "@babel/plugin-transform-modules-commonjs": "npm:^7.13.8" - "@babel/preset-flow": "npm:^7.13.13" - "@babel/preset-typescript": "npm:^7.13.0" - "@babel/register": "npm:^7.13.16" - babel-core: "npm:^7.0.0-bridge.0" - chalk: "npm:^4.1.2" - flow-parser: "npm:0.*" - graceful-fs: "npm:^4.2.4" - micromatch: "npm:^4.0.4" - neo-async: "npm:^2.5.0" - node-dir: "npm:^0.1.17" - recast: "npm:^0.21.0" - temp: "npm:^0.8.4" - write-file-atomic: "npm:^2.3.0" - peerDependencies: - "@babel/preset-env": ^7.1.6 - bin: - jscodeshift: bin/jscodeshift.js - checksum: 10/fc355dde2287c026a682e8b38df5d8d1ff5c9ca044dfd558f2b6d17bb28f9257063bd0e47690814612e572804caa5383733c9d8ca8bc18e70bcee43e0458df59 - languageName: node - linkType: hard - "jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -9971,6 +9986,13 @@ __metadata: languageName: node linkType: hard +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10/02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -10013,11 +10035,11 @@ __metadata: linkType: hard "jsonrepair@npm:^3.12.0": - version: 3.13.1 - resolution: "jsonrepair@npm:3.13.1" + version: 3.13.2 + resolution: "jsonrepair@npm:3.13.2" bin: jsonrepair: bin/cli.js - checksum: 10/cea418eeafe60ebbbf57207d2029fab7be229814c21dacca8380b3da331bc441ddd575cb2e1b533d0e0402e7291b18576686b7c96e6bc31547b8d996fde0001d + checksum: 10/c0c1ec46af1d8e396c22e4d41e4d85eff2c713afdb71b6634a72ed4f356b79259affadb4e79b31042e4c1634313ddc0b3d7960fd74f5fba918198ecc74fe5e82 languageName: node linkType: hard @@ -10049,13 +10071,6 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 - languageName: node - linkType: hard - "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -10116,99 +10131,99 @@ __metadata: languageName: node linkType: hard -"lightningcss-android-arm64@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-android-arm64@npm:1.30.2" +"lightningcss-android-arm64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-android-arm64@npm:1.31.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"lightningcss-darwin-arm64@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-darwin-arm64@npm:1.30.2" +"lightningcss-darwin-arm64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-darwin-arm64@npm:1.31.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"lightningcss-darwin-x64@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-darwin-x64@npm:1.30.2" +"lightningcss-darwin-x64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-darwin-x64@npm:1.31.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"lightningcss-freebsd-x64@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-freebsd-x64@npm:1.30.2" +"lightningcss-freebsd-x64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-freebsd-x64@npm:1.31.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"lightningcss-linux-arm-gnueabihf@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.2" +"lightningcss-linux-arm-gnueabihf@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.31.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"lightningcss-linux-arm64-gnu@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-linux-arm64-gnu@npm:1.30.2" +"lightningcss-linux-arm64-gnu@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm64-gnu@npm:1.31.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-arm64-musl@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-linux-arm64-musl@npm:1.30.2" +"lightningcss-linux-arm64-musl@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm64-musl@npm:1.31.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"lightningcss-linux-x64-gnu@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-linux-x64-gnu@npm:1.30.2" +"lightningcss-linux-x64-gnu@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-x64-gnu@npm:1.31.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-x64-musl@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-linux-x64-musl@npm:1.30.2" +"lightningcss-linux-x64-musl@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-x64-musl@npm:1.31.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"lightningcss-win32-arm64-msvc@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-win32-arm64-msvc@npm:1.30.2" +"lightningcss-win32-arm64-msvc@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-win32-arm64-msvc@npm:1.31.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"lightningcss-win32-x64-msvc@npm:1.30.2": - version: 1.30.2 - resolution: "lightningcss-win32-x64-msvc@npm:1.30.2" +"lightningcss-win32-x64-msvc@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-win32-x64-msvc@npm:1.31.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "lightningcss@npm:^1.30.1": - version: 1.30.2 - resolution: "lightningcss@npm:1.30.2" + version: 1.31.1 + resolution: "lightningcss@npm:1.31.1" dependencies: detect-libc: "npm:^2.0.3" - lightningcss-android-arm64: "npm:1.30.2" - lightningcss-darwin-arm64: "npm:1.30.2" - lightningcss-darwin-x64: "npm:1.30.2" - lightningcss-freebsd-x64: "npm:1.30.2" - lightningcss-linux-arm-gnueabihf: "npm:1.30.2" - lightningcss-linux-arm64-gnu: "npm:1.30.2" - lightningcss-linux-arm64-musl: "npm:1.30.2" - lightningcss-linux-x64-gnu: "npm:1.30.2" - lightningcss-linux-x64-musl: "npm:1.30.2" - lightningcss-win32-arm64-msvc: "npm:1.30.2" - lightningcss-win32-x64-msvc: "npm:1.30.2" + lightningcss-android-arm64: "npm:1.31.1" + lightningcss-darwin-arm64: "npm:1.31.1" + lightningcss-darwin-x64: "npm:1.31.1" + lightningcss-freebsd-x64: "npm:1.31.1" + lightningcss-linux-arm-gnueabihf: "npm:1.31.1" + lightningcss-linux-arm64-gnu: "npm:1.31.1" + lightningcss-linux-arm64-musl: "npm:1.31.1" + lightningcss-linux-x64-gnu: "npm:1.31.1" + lightningcss-linux-x64-musl: "npm:1.31.1" + lightningcss-win32-arm64-msvc: "npm:1.31.1" + lightningcss-win32-x64-msvc: "npm:1.31.1" dependenciesMeta: lightningcss-android-arm64: optional: true @@ -10232,7 +10247,7 @@ __metadata: optional: true lightningcss-win32-x64-msvc: optional: true - checksum: 10/d6cc06d9bac295589a49446e9c45a241dfa16f4f81a7318c26cbc0be3e189003ec0da5d9a0fd9bdffc63a3ce05878cc7329277eaac77a826e8b68c73dc96cfda + checksum: 10/3c2b2c2f648b12d9cba623d2e558f74fcce35911077e3d33f97ed521e0ad7a84e2c814628f6e16f64095c4483f6b180dee7b2e441b3ff5f44d142a510785a0c6 languageName: node linkType: hard @@ -10257,7 +10272,8 @@ __metadata: resolution: "llm@workspace:apps/llm" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/metro-config": "npm:^0.76.3" + "@react-native-executorch/expo-resource-fetcher": "workspace:*" + "@react-native/metro-config": "npm:^0.81.5" "@react-navigation/drawer": "npm:^7.3.9" "@react-navigation/native": "npm:^7.1.6" "@types/react": "npm:~19.1.10" @@ -10269,7 +10285,7 @@ __metadata: expo-linking: "npm:~8.0.10" expo-router: "npm:~6.0.17" expo-status-bar: "npm:~3.0.9" - metro-config: "npm:^0.81.0" + metro-config: "npm:^0.81.5" react: "npm:19.1.0" react-native: "npm:0.81.5" react-native-audio-api: "npm:^0.8.2" @@ -10287,16 +10303,6 @@ __metadata: languageName: unknown linkType: soft -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10/53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -10337,9 +10343,9 @@ __metadata: linkType: hard "lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 10/82504c88250f58da7a5a4289f57a4f759c44946c005dd232821c7688b5fcfbf4a6268f6a6cdde4b792c91edd2f3b5398c1d2a0998274432cff76def48735e233 languageName: node linkType: hard @@ -10403,9 +10409,9 @@ __metadata: linkType: hard "lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": - version: 11.2.4 - resolution: "lru-cache@npm:11.2.4" - checksum: 10/3b2da74c0b6653767f8164c38c4c4f4d7f0cc10c62bfa512663d94a830191ae6a5af742a8d88a8b30d5f9974652d3adae53931f32069139ad24fa2a18a199aca + version: 11.2.6 + resolution: "lru-cache@npm:11.2.6" + checksum: 10/91222bbd59f793a0a0ad57789388f06b34ac9bb1613433c1d1810457d09db5cd3ec8943227ce2e1f5d6a0a15d6f1a9f129cb2c49ae9b6b10e82d4965fddecbef languageName: node linkType: hard @@ -10418,16 +10424,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: "npm:^4.0.1" - semver: "npm:^5.6.0" - checksum: 10/043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -10611,18 +10607,6 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.83.2": - version: 0.83.2 - resolution: "metro-babel-transformer@npm:0.83.2" - dependencies: - "@babel/core": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - hermes-parser: "npm:0.32.0" - nullthrows: "npm:^1.1.1" - checksum: 10/8ca98216c3fc32757cbb445d2e42042617b5a2399d3d409759b168fbd3d52aadf8bb2b8471e4b204ddf5c654b7b146397edb7693f48a0582e7e4e169cf3bbfbb - languageName: node - linkType: hard - "metro-babel-transformer@npm:0.83.3": version: 0.83.3 resolution: "metro-babel-transformer@npm:0.83.3" @@ -10644,15 +10628,6 @@ __metadata: languageName: node linkType: hard -"metro-cache-key@npm:0.83.2": - version: 0.83.2 - resolution: "metro-cache-key@npm:0.83.2" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/ad60492b1db35b7d4eb1f9ed6f8aa79a051dcb1be3183fcd5b0a810e7c4ba5dba5e9f02e131ccd271d6db2efaa9893ef0e316ef26ebb3ab49cb074fada4de1b5 - languageName: node - linkType: hard - "metro-cache-key@npm:0.83.3": version: 0.83.3 resolution: "metro-cache-key@npm:0.83.3" @@ -10673,18 +10648,6 @@ __metadata: languageName: node linkType: hard -"metro-cache@npm:0.83.2": - version: 0.83.2 - resolution: "metro-cache@npm:0.83.2" - dependencies: - exponential-backoff: "npm:^3.1.1" - flow-enums-runtime: "npm:^0.0.6" - https-proxy-agent: "npm:^7.0.5" - metro-core: "npm:0.83.2" - checksum: 10/3183bcd8e0590ab4630f344f9dd4daa3b2371450e7f4546f2b1128b1386ecece204a74a7e3df49a8f3776b5a4a746fe4aa05f952a97e6f4f61deda80be5c55cf - languageName: node - linkType: hard - "metro-cache@npm:0.83.3": version: 0.83.3 resolution: "metro-cache@npm:0.83.3" @@ -10697,7 +10660,7 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.81.5, metro-config@npm:^0.81.0": +"metro-config@npm:0.81.5, metro-config@npm:^0.81.5": version: 0.81.5 resolution: "metro-config@npm:0.81.5" dependencies: @@ -10713,22 +10676,6 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.83.2": - version: 0.83.2 - resolution: "metro-config@npm:0.83.2" - dependencies: - connect: "npm:^3.6.5" - flow-enums-runtime: "npm:^0.0.6" - jest-validate: "npm:^29.7.0" - metro: "npm:0.83.2" - metro-cache: "npm:0.83.2" - metro-core: "npm:0.83.2" - metro-runtime: "npm:0.83.2" - yaml: "npm:^2.6.1" - checksum: 10/830696bb515ad421f1a25003d64c01bca580b2485c69266e03faf0c8f36f55283388fda5505f53ae400f8298502f712aab6c76655e45996907588288d2586c6b - languageName: node - linkType: hard - "metro-config@npm:0.83.3, metro-config@npm:^0.83.1": version: 0.83.3 resolution: "metro-config@npm:0.83.3" @@ -10756,17 +10703,6 @@ __metadata: languageName: node linkType: hard -"metro-core@npm:0.83.2": - version: 0.83.2 - resolution: "metro-core@npm:0.83.2" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - lodash.throttle: "npm:^4.1.1" - metro-resolver: "npm:0.83.2" - checksum: 10/dbbef6b6d0cdb76ff808928cda59086aa4fc04a50ff76be8e19bd181d9cf270f4fe0a6b60883d0230aeeba2ba65a68875af549c83c2cfee5a1f0988ed1b4fccd - languageName: node - linkType: hard - "metro-core@npm:0.83.3, metro-core@npm:^0.83.1": version: 0.83.3 resolution: "metro-core@npm:0.83.3" @@ -10795,23 +10731,6 @@ __metadata: languageName: node linkType: hard -"metro-file-map@npm:0.83.2": - version: 0.83.2 - resolution: "metro-file-map@npm:0.83.2" - dependencies: - debug: "npm:^4.4.0" - fb-watchman: "npm:^2.0.0" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - nullthrows: "npm:^1.1.1" - walker: "npm:^1.0.7" - checksum: 10/349a52c74cd02a1db75d0677c82e31750098e74a67bd1e10b2241e296897bfb20de2d8a2f27d7c292e2b3f492a36a191eb3c1bd5d09d5758b8febd36db86e58f - languageName: node - linkType: hard - "metro-file-map@npm:0.83.3": version: 0.83.3 resolution: "metro-file-map@npm:0.83.3" @@ -10839,16 +10758,6 @@ __metadata: languageName: node linkType: hard -"metro-minify-terser@npm:0.83.2": - version: 0.83.2 - resolution: "metro-minify-terser@npm:0.83.2" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - terser: "npm:^5.15.0" - checksum: 10/ee164bdd3ddf797e1b0f9fd71960b662b40fc3abead77521b1e1435291d38cc151442348362d6afee0596d52fcff48cc6a055a04a7928905e9557968e05293ac - languageName: node - linkType: hard - "metro-minify-terser@npm:0.83.3": version: 0.83.3 resolution: "metro-minify-terser@npm:0.83.3" @@ -10917,15 +10826,6 @@ __metadata: languageName: node linkType: hard -"metro-resolver@npm:0.83.2": - version: 0.83.2 - resolution: "metro-resolver@npm:0.83.2" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/2ba0cdda5c5a3ddac72fd486a310892638ba7d67a736246ec128674dfa6217d6169bdd0f811874435eae37f0201d72735fe7dddfc0c83a9e1439f05994bc293a - languageName: node - linkType: hard - "metro-resolver@npm:0.83.3": version: 0.83.3 resolution: "metro-resolver@npm:0.83.3" @@ -10935,7 +10835,7 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.81.5, metro-runtime@npm:^0.81.0": +"metro-runtime@npm:0.81.5": version: 0.81.5 resolution: "metro-runtime@npm:0.81.5" dependencies: @@ -10945,16 +10845,6 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.83.2": - version: 0.83.2 - resolution: "metro-runtime@npm:0.83.2" - dependencies: - "@babel/runtime": "npm:^7.25.0" - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/1666e0e5c51d39f916642ed3918cf1996f76e82366ba9ca3132d6c11c5c62a1ab1115e4aa325f0fc9b8cefbe62d6ca8d1948cfde2ee78963491deafcbc79adba - languageName: node - linkType: hard - "metro-runtime@npm:0.83.3, metro-runtime@npm:^0.83.1": version: 0.83.3 resolution: "metro-runtime@npm:0.83.3" @@ -10983,24 +10873,6 @@ __metadata: languageName: node linkType: hard -"metro-source-map@npm:0.83.2": - version: 0.83.2 - resolution: "metro-source-map@npm:0.83.2" - dependencies: - "@babel/traverse": "npm:^7.25.3" - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-symbolicate: "npm:0.83.2" - nullthrows: "npm:^1.1.1" - ob1: "npm:0.83.2" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - checksum: 10/6253f6aa9a19ff35d70a08e1a434b9641874392e3cccec6abc8dcbac1c3e9289e348fa37960f16581c386e8f9ba743631ecc8ed5bf42817a5d5c54b6784c63b5 - languageName: node - linkType: hard - "metro-source-map@npm:0.83.3, metro-source-map@npm:^0.83.1": version: 0.83.3 resolution: "metro-source-map@npm:0.83.3" @@ -11035,22 +10907,6 @@ __metadata: languageName: node linkType: hard -"metro-symbolicate@npm:0.83.2": - version: 0.83.2 - resolution: "metro-symbolicate@npm:0.83.2" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-source-map: "npm:0.83.2" - nullthrows: "npm:^1.1.1" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - bin: - metro-symbolicate: src/index.js - checksum: 10/1ddd82d0f1e236f4eb69c49b319a5446f364aaa421b4301554898abe86d23a452a5fb5113bfef6b6c68c2a697ad3a68fb00919a2f7b9b73a040c92689002a8d4 - languageName: node - linkType: hard - "metro-symbolicate@npm:0.83.3": version: 0.83.3 resolution: "metro-symbolicate@npm:0.83.3" @@ -11081,20 +10937,6 @@ __metadata: languageName: node linkType: hard -"metro-transform-plugins@npm:0.83.2": - version: 0.83.2 - resolution: "metro-transform-plugins@npm:0.83.2" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - flow-enums-runtime: "npm:^0.0.6" - nullthrows: "npm:^1.1.1" - checksum: 10/e3ebef11d64e5e568fde3fe2edc5d7f1e9508b28c7607c14dd711bc29058cbfc97e53edbfee79bd60f58c189e4d74869d87a30488534024fe88503296a7d095a - languageName: node - linkType: hard - "metro-transform-plugins@npm:0.83.3": version: 0.83.3 resolution: "metro-transform-plugins@npm:0.83.3" @@ -11130,27 +10972,6 @@ __metadata: languageName: node linkType: hard -"metro-transform-worker@npm:0.83.2": - version: 0.83.2 - resolution: "metro-transform-worker@npm:0.83.2" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - metro: "npm:0.83.2" - metro-babel-transformer: "npm:0.83.2" - metro-cache: "npm:0.83.2" - metro-cache-key: "npm:0.83.2" - metro-minify-terser: "npm:0.83.2" - metro-source-map: "npm:0.83.2" - metro-transform-plugins: "npm:0.83.2" - nullthrows: "npm:^1.1.1" - checksum: 10/b4286b1b0511e46e2ec265e24138d03d8a794687260beae297de3d378285cce0e06132280dac62d447dfaf55627432c28463939a63136f3a84c2cf6b880d3865 - languageName: node - linkType: hard - "metro-transform-worker@npm:0.83.3": version: 0.83.3 resolution: "metro-transform-worker@npm:0.83.3" @@ -11172,59 +10993,9 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.81.5": - version: 0.81.5 - resolution: "metro@npm:0.81.5" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - accepts: "npm:^1.3.7" - chalk: "npm:^4.0.0" - ci-info: "npm:^2.0.0" - connect: "npm:^3.6.5" - debug: "npm:^2.2.0" - error-stack-parser: "npm:^2.0.6" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.25.1" - image-size: "npm:^1.0.2" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - jsc-safe-url: "npm:^0.2.2" - lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.81.5" - metro-cache: "npm:0.81.5" - metro-cache-key: "npm:0.81.5" - metro-config: "npm:0.81.5" - metro-core: "npm:0.81.5" - metro-file-map: "npm:0.81.5" - metro-resolver: "npm:0.81.5" - metro-runtime: "npm:0.81.5" - metro-source-map: "npm:0.81.5" - metro-symbolicate: "npm:0.81.5" - metro-transform-plugins: "npm:0.81.5" - metro-transform-worker: "npm:0.81.5" - mime-types: "npm:^2.1.27" - nullthrows: "npm:^1.1.1" - serialize-error: "npm:^2.1.0" - source-map: "npm:^0.5.6" - throat: "npm:^5.0.0" - ws: "npm:^7.5.10" - yargs: "npm:^17.6.2" - bin: - metro: src/cli.js - checksum: 10/c0f44bf151e1a9f7be7946047e638d03f9e42a67b6707a49ba4d737678c91fbca980732033ff0c6f0636e7fd7f127ad4bb22b62283c71ea6c2a3bb6f5d7545e9 - languageName: node - linkType: hard - -"metro@npm:0.83.2": - version: 0.83.2 - resolution: "metro@npm:0.83.2" +"metro@npm:0.81.5": + version: 0.81.5 + resolution: "metro@npm:0.81.5" dependencies: "@babel/code-frame": "npm:^7.24.7" "@babel/core": "npm:^7.25.2" @@ -11237,28 +11008,28 @@ __metadata: chalk: "npm:^4.0.0" ci-info: "npm:^2.0.0" connect: "npm:^3.6.5" - debug: "npm:^4.4.0" + debug: "npm:^2.2.0" error-stack-parser: "npm:^2.0.6" flow-enums-runtime: "npm:^0.0.6" graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.32.0" + hermes-parser: "npm:0.25.1" image-size: "npm:^1.0.2" invariant: "npm:^2.2.4" jest-worker: "npm:^29.7.0" jsc-safe-url: "npm:^0.2.2" lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.83.2" - metro-cache: "npm:0.83.2" - metro-cache-key: "npm:0.83.2" - metro-config: "npm:0.83.2" - metro-core: "npm:0.83.2" - metro-file-map: "npm:0.83.2" - metro-resolver: "npm:0.83.2" - metro-runtime: "npm:0.83.2" - metro-source-map: "npm:0.83.2" - metro-symbolicate: "npm:0.83.2" - metro-transform-plugins: "npm:0.83.2" - metro-transform-worker: "npm:0.83.2" + metro-babel-transformer: "npm:0.81.5" + metro-cache: "npm:0.81.5" + metro-cache-key: "npm:0.81.5" + metro-config: "npm:0.81.5" + metro-core: "npm:0.81.5" + metro-file-map: "npm:0.81.5" + metro-resolver: "npm:0.81.5" + metro-runtime: "npm:0.81.5" + metro-source-map: "npm:0.81.5" + metro-symbolicate: "npm:0.81.5" + metro-transform-plugins: "npm:0.81.5" + metro-transform-worker: "npm:0.81.5" mime-types: "npm:^2.1.27" nullthrows: "npm:^1.1.1" serialize-error: "npm:^2.1.0" @@ -11268,7 +11039,7 @@ __metadata: yargs: "npm:^17.6.2" bin: metro: src/cli.js - checksum: 10/524c0f98ce8be619a345f58c39d19e6d0e5745dfd156c9b0a06201e6d9ad59e4405922f09f56fe92a86df9e06b0e89b173a3136640f1ec69c395b9ca34c1b042 + checksum: 10/c0f44bf151e1a9f7be7946047e638d03f9e42a67b6707a49ba4d737678c91fbca980732033ff0c6f0636e7fd7f127ad4bb22b62283c71ea6c2a3bb6f5d7545e9 languageName: node linkType: hard @@ -11633,16 +11404,16 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.1.1": - version: 10.1.1 - resolution: "minimatch@npm:10.1.1" +"minimatch@npm:^10.2.0": + version: 10.2.0 + resolution: "minimatch@npm:10.2.0" dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10/110f38921ea527022e90f7a5f43721838ac740d0a0c26881c03b57c261354fb9a0430e40b2c56dfcea2ef3c773768f27210d1106f1f2be19cde3eea93f26f45e + brace-expansion: "npm:^5.0.2" + checksum: 10/3ceceac1c66b4702236ea00b4fb9ad7a16d44f7a4f380fe838f99fbb3577ed4b15e6beb48e01367f597817f8b0ad6a53a220be2bafaa36d0b04fabdd7d2070c2 languageName: node linkType: hard -"minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"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" dependencies: @@ -11660,7 +11431,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -11677,17 +11448,17 @@ __metadata: linkType: hard "minipass-fetch@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass-fetch@npm:5.0.0" + version: 5.0.1 + resolution: "minipass-fetch@npm:5.0.1" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" + minipass-sized: "npm:^2.0.0" minizlib: "npm:^3.0.1" dependenciesMeta: encoding: optional: true - checksum: 10/4fb7dca630a64e6970a8211dade505bfe260d0b8d60beb348dcdfb95fe35ef91d977b29963929c9017ae0805686aa3f413107dc6bc5deac9b9e26b0b41c3b86c + checksum: 10/08bf0c9866e7f344bf1863ce0d99c0a6fe96b43ef5a4119e23d84a21e613a3f55ecf302adf28d9e228b4ebd50e81d5e84c397e0535089090427319379f478d94 languageName: node linkType: hard @@ -11709,12 +11480,12 @@ __metadata: languageName: node linkType: hard -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" +"minipass-sized@npm:^2.0.0": + version: 2.0.0 + resolution: "minipass-sized@npm:2.0.0" dependencies: - minipass: "npm:^3.0.0" - checksum: 10/40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd + minipass: "npm:^7.1.2" + checksum: 10/3b89adf64ca705662f77481e278eff5ec0a57aeffb5feba7cc8843722b1e7770efc880f2a17d1d4877b2d7bf227873cd46afb4da44c0fd18088b601ea50f96bb languageName: node linkType: hard @@ -11743,17 +11514,6 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10/0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - "mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -11825,13 +11585,6 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.5.0": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10/1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 - languageName: node - linkType: hard - "nested-error-stacks@npm:~2.0.1": version: 2.0.1 resolution: "nested-error-stacks@npm:2.0.1" @@ -11856,16 +11609,7 @@ __metadata: languageName: node linkType: hard -"node-dir@npm:^0.1.17": - version: 0.1.17 - resolution: "node-dir@npm:0.1.17" - dependencies: - minimatch: "npm:^3.0.2" - checksum: 10/281fdea12d9c080a7250e5b5afefa3ab39426d40753ec8126a2d1e67f189b8824723abfed74f5d8549c5d78352d8c489fe08d0b067d7684c87c07283d38374a5 - languageName: node - linkType: hard - -"node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": +"node-forge@npm:^1.3.3": version: 1.3.3 resolution: "node-forge@npm:1.3.3" checksum: 10/f41c31b9296771a4b8c955d58417471712f54f324603a35f8e6cbac19d5e6eaaf5fd5fd14584dfedecbf46a05438ded6eee60a5f2f0822fc5061aaa073cfc75d @@ -11873,8 +11617,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 12.1.0 - resolution: "node-gyp@npm:12.1.0" + version: 12.2.0 + resolution: "node-gyp@npm:12.2.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -11883,12 +11627,12 @@ __metadata: nopt: "npm:^9.0.0" proc-log: "npm:^6.0.0" semver: "npm:^7.3.5" - tar: "npm:^7.5.2" + tar: "npm:^7.5.4" tinyglobby: "npm:^0.2.12" which: "npm:^6.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/d93079236cef1dd7fa4df683708d8708ad255c55865f6656664c8959e4d3963d908ac48e8f9f341705432e979dbbf502a40d68d65a17fe35956a5a05ba6c1cb4 + checksum: 10/4ebab5b77585a637315e969c2274b5520562473fe75de850639a580c2599652fb9f33959ec782ea45a2e149d8f04b548030f472eeeb3dbdf19a7f2ccbc30b908 languageName: node linkType: hard @@ -11977,15 +11721,6 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.83.2": - version: 0.83.2 - resolution: "ob1@npm:0.83.2" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/8eb482589b66cf46600d1231c2ea50a365f47ee5db0274795d1d3f5c43112e255b931a41ce1ef8a220f31b4fb985fb269c6a54bf7e9719f90dac3f4001a89a6c - languageName: node - linkType: hard - "ob1@npm:0.83.3": version: 0.83.3 resolution: "ob1@npm:0.83.3" @@ -12066,21 +11801,21 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1, on-finished@npm:~2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" +"on-finished@npm:~2.3.0": + version: 2.3.0 + resolution: "on-finished@npm:2.3.0" dependencies: ee-first: "npm:1.1.1" - checksum: 10/8e81472c5028125c8c39044ac4ab8ba51a7cdc19a9fbd4710f5d524a74c6d8c9ded4dd0eed83f28d3d33ac1d7a6a439ba948ccb765ac6ce87f30450a26bfe2ea + checksum: 10/1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b languageName: node linkType: hard -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" +"on-finished@npm:~2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" dependencies: ee-first: "npm:1.1.1" - checksum: 10/1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b + checksum: 10/8e81472c5028125c8c39044ac4ab8ba51a7cdc19a9fbd4710f5d524a74c6d8c9ded4dd0eed83f28d3d33ac1d7a6a439ba948ccb765ac6ce87f30450a26bfe2ea languageName: node linkType: hard @@ -12204,7 +11939,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": +"p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -12222,15 +11957,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10/83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -12356,13 +12082,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10/96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -12446,29 +12165,13 @@ __metadata: languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10/8b97cbf9dc6d4c1320cc238a2db0fc67547f9dc77011729ff353faf34f1936ea1a4d7f3c63b2f4980b253be77bcc72ea1e9e76ee3fd53cce2aafb6a8854d07ec - languageName: node - linkType: hard - -"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.6": +"pirates@npm:^4.0.1, pirates@npm:^4.0.4": version: 4.0.7 resolution: "pirates@npm:4.0.7" checksum: 10/2427f371366081ae42feb58214f04805d6b41d6b84d74480ebcc9e0ddbd7105a139f7c653daeaf83ad8a1a77214cf07f64178e76de048128fec501eab3305a96 languageName: node linkType: hard -"pkg-dir@npm:^3.0.0": - version: 3.0.0 - resolution: "pkg-dir@npm:3.0.0" - dependencies: - find-up: "npm:^3.0.0" - checksum: 10/70c9476ffefc77552cc6b1880176b71ad70bfac4f367604b2b04efd19337309a4eec985e94823271c7c0e83946fa5aeb18cd360d15d10a5d7533e19344bfa808 - languageName: node - linkType: hard - "pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -12528,93 +12231,34 @@ __metadata: languageName: node linkType: hard -"prettier-linter-helpers@npm:^1.0.0": - version: 1.0.0 - resolution: "prettier-linter-helpers@npm:1.0.0" +"prettier-linter-helpers@npm:^1.0.1": + version: 1.0.1 + resolution: "prettier-linter-helpers@npm:1.0.1" dependencies: fast-diff: "npm:^1.1.2" - checksum: 10/00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + checksum: 10/2dc35f5036a35f4c4f5e645887edda1436acb63687a7f12b2383e0a6f3c1f76b8a0a4709fe4d82e19157210feb5984b159bb714d43290022911ab53d606474ec languageName: node linkType: hard "prettier-plugin-jsdoc@npm:^1.3.0": - version: 1.7.0 - resolution: "prettier-plugin-jsdoc@npm:1.7.0" + version: 1.8.0 + resolution: "prettier-plugin-jsdoc@npm:1.8.0" dependencies: binary-searching: "npm:^2.0.5" comment-parser: "npm:^1.4.0" mdast-util-from-markdown: "npm:^2.0.0" - prettier-plugin-tailwindcss: "npm:^0.7.1" peerDependencies: prettier: ^3.0.0 - checksum: 10/28f71f429f453e9073c9bf3eff1131f0e461b21ff184f9da54d1f3919a5898817b32abd87440c7e342f2320280b44ff141096bafd20204f950cce60780552d8b - languageName: node - linkType: hard - -"prettier-plugin-tailwindcss@npm:^0.7.1": - version: 0.7.2 - resolution: "prettier-plugin-tailwindcss@npm:0.7.2" - peerDependencies: - "@ianvs/prettier-plugin-sort-imports": "*" - "@prettier/plugin-hermes": "*" - "@prettier/plugin-oxc": "*" - "@prettier/plugin-pug": "*" - "@shopify/prettier-plugin-liquid": "*" - "@trivago/prettier-plugin-sort-imports": "*" - "@zackad/prettier-plugin-twig": "*" - prettier: ^3.0 - prettier-plugin-astro: "*" - prettier-plugin-css-order: "*" - prettier-plugin-jsdoc: "*" - prettier-plugin-marko: "*" - prettier-plugin-multiline-arrays: "*" - prettier-plugin-organize-attributes: "*" - prettier-plugin-organize-imports: "*" - prettier-plugin-sort-imports: "*" - prettier-plugin-svelte: "*" - peerDependenciesMeta: - "@ianvs/prettier-plugin-sort-imports": - optional: true - "@prettier/plugin-hermes": - optional: true - "@prettier/plugin-oxc": - optional: true - "@prettier/plugin-pug": - optional: true - "@shopify/prettier-plugin-liquid": - optional: true - "@trivago/prettier-plugin-sort-imports": - optional: true - "@zackad/prettier-plugin-twig": - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-css-order: - optional: true - prettier-plugin-jsdoc: - optional: true - prettier-plugin-marko: - optional: true - prettier-plugin-multiline-arrays: - optional: true - prettier-plugin-organize-attributes: - optional: true - prettier-plugin-organize-imports: - optional: true - prettier-plugin-sort-imports: - optional: true - prettier-plugin-svelte: - optional: true - checksum: 10/c77253025d62555e761b0a76df6e5c73d48d96a259ac157de9c21f11a7851fd2b434c27b296b119530895a57fe87c8cf337b0df0bff97b2bc1a0d48a442b0d99 + checksum: 10/f25412b87b74f77606addb718207b6273d41697a04931c52e011c6c637fdebfeca57a1572523cb95e144e808840af1399b5fd72767d14281ea2066c0b8b70b11 languageName: node linkType: hard "prettier@npm:^3.3.3": - version: 3.7.4 - resolution: "prettier@npm:3.7.4" + version: 3.8.1 + resolution: "prettier@npm:3.8.1" bin: prettier: bin/prettier.cjs - checksum: 10/b4d00ea13baed813cb777c444506632fb10faaef52dea526cacd03085f01f6db11fc969ccebedf05bf7d93c3960900994c6adf1b150e28a31afd5cfe7089b313 + checksum: 10/3da1cf8c1ef9bea828aa618553696c312e951f810bee368f6887109b203f18ee869fe88f66e65f9cf60b7cb1f2eae859892c860a300c062ff8ec69c381fc8dbd languageName: node linkType: hard @@ -12731,11 +12375,11 @@ __metadata: linkType: hard "qs@npm:~6.14.0": - version: 6.14.0 - resolution: "qs@npm:6.14.0" + version: 6.14.2 + resolution: "qs@npm:6.14.2" dependencies: side-channel: "npm:^1.1.0" - checksum: 10/a60e49bbd51c935a8a4759e7505677b122e23bf392d6535b8fc31c1e447acba2c901235ecb192764013cd2781723dc1f61978b5fdd93cc31d7043d31cdc01974 + checksum: 10/682933a85bb4b7bd0d66e13c0a40d9e612b5e4bcc2cb9238f711a9368cd22d91654097a74fff93551e58146db282c56ac094957dfdc60ce64ea72c3c9d7779ac languageName: node linkType: hard @@ -12810,6 +12454,17 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:19.1.0": + version: 19.1.0 + resolution: "react-dom@npm:19.1.0" + dependencies: + scheduler: "npm:^0.26.0" + peerDependencies: + react: ^19.1.0 + checksum: 10/c5b58605862c7b0bb044416b01c73647bb8e89717fb5d7a2c279b11815fb7b49b619fe685c404e59f55eb52c66831236cc565c25ee1c2d042739f4a2cc538aa2 + languageName: node + linkType: hard + "react-fast-compare@npm:^3.2.2": version: 3.2.2 resolution: "react-fast-compare@npm:3.2.2" @@ -12841,9 +12496,9 @@ __metadata: linkType: hard "react-is@npm:^19.1.0": - version: 19.2.1 - resolution: "react-is@npm:19.2.1" - checksum: 10/d2d0f2b55710c73af1ee5c17e438a274a52758522af9cb1f1f6df35b233a5eb158f4dc8e38e0c058b090bf7d432f27fc6c59dd016c811109260097cea5268461 + version: 19.2.4 + resolution: "react-is@npm:19.2.4" + checksum: 10/3360fc50a38c23299c5003a709949f2439b2901e77962eea78d892f526f710d05a7777b600b302f853583d1861979b00d7a0a071c89c6562eac5740ac29b9665 languageName: node linkType: hard @@ -12872,8 +12527,8 @@ __metadata: linkType: hard "react-native-builder-bob@npm:^0.40.12": - version: 0.40.16 - resolution: "react-native-builder-bob@npm:0.40.16" + version: 0.40.18 + resolution: "react-native-builder-bob@npm:0.40.18" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-transform-flow-strip-types": "npm:^7.26.5" @@ -12894,12 +12549,12 @@ __metadata: json5: "npm:^2.2.1" kleur: "npm:^4.1.4" prompts: "npm:^2.4.2" - react-native-monorepo-config: "npm:^0.1.8" + react-native-monorepo-config: "npm:^0.3.3" which: "npm:^2.0.2" yargs: "npm:^17.5.1" bin: bob: bin/bob - checksum: 10/7f9c6e02131a833d68df92e6338f86e2880c7404116c5104c7eaa1cb8517ed559f2de591306b6d67e0af39f4f4fef9894b69b3fd624dce35822fb7d4b752776b + checksum: 10/06eddba046a508dff0aa322c823fa57a280e2ed6a6f586de2114ebc11b6bb7863714eaaff8e93d681bb851fb4f9e792b102541211847f0e546f4e9546df6c3de languageName: node linkType: hard @@ -12912,9 +12567,9 @@ __metadata: languageName: node linkType: hard -"react-native-drawer-layout@npm:^4.2.0": - version: 4.2.0 - resolution: "react-native-drawer-layout@npm:4.2.0" +"react-native-drawer-layout@npm:^4.2.2": + version: 4.2.2 + resolution: "react-native-drawer-layout@npm:4.2.2" dependencies: color: "npm:^4.2.3" use-latest-callback: "npm:^0.2.4" @@ -12923,7 +12578,7 @@ __metadata: react-native: "*" react-native-gesture-handler: ">= 2.0.0" react-native-reanimated: ">= 2.0.0" - checksum: 10/9226ede6c7b038bbd0a6e16b67898fc6c5a016cc030fbd9f6598dc1dc59a3319e9e7514a1184356645373ce94fdc6f365ebd39887f75ab368a8d99ac48ad4025 + checksum: 10/eb21cd0004b642c1489d045654486ec7e2f2be7dec0cedad3fa0cb65c23f1df19b60108ffa7b6c14db94b1962d095f2a6e4a76e275ac30ff3ebcd12ba565c99a languageName: node linkType: hard @@ -12931,6 +12586,7 @@ __metadata: version: 0.0.0-use.local resolution: "react-native-executorch-monorepo@workspace:." dependencies: + "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" "@cspell/eslint-plugin": "npm:^8.19.0" "@evilmartians/lefthook": "npm:^1.5.0" "@react-native/eslint-config": "npm:^0.79.0" @@ -12952,9 +12608,6 @@ __metadata: "@react-native-community/cli": "npm:latest" "@types/jest": "npm:^29.5.5" "@types/react": "npm:~19.1.10" - expo: "npm:^54.0.0" - expo-asset: "npm:12.0.11" - expo-file-system: "npm:^19.0.20" jest: "npm:^29.7.0" jsonrepair: "npm:^3.12.0" jsonschema: "npm:^1.5.0" @@ -12965,9 +12618,6 @@ __metadata: typescript: "npm:~5.9.2" zod: "npm:^3.25.0" peerDependencies: - expo: ">=54.0.0" - expo-asset: ^12.0.0 - expo-file-system: ^19.0.0 react: "*" react-native: "*" languageName: unknown @@ -12996,6 +12646,20 @@ __metadata: languageName: node linkType: hard +"react-native-gesture-handler@npm:~2.30.0": + version: 2.30.0 + resolution: "react-native-gesture-handler@npm:2.30.0" + dependencies: + "@egjs/hammerjs": "npm:^2.0.17" + hoist-non-react-statics: "npm:^3.3.0" + invariant: "npm:^2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/242b1eb29202bc9fc7bf0271c3da102559adc9f2810441465b6d78c1a8ed8f65bdd91335957c841a4716f796be3e7b87d1d55629d6803ea12e1be832d89c946c + languageName: node + linkType: hard + "react-native-image-picker@npm:^7.2.2": version: 7.2.3 resolution: "react-native-image-picker@npm:7.2.3" @@ -13006,7 +12670,7 @@ __metadata: languageName: node linkType: hard -"react-native-is-edge-to-edge@npm:^1.1.6, react-native-is-edge-to-edge@npm:^1.2.1": +"react-native-is-edge-to-edge@npm:1.2.1, react-native-is-edge-to-edge@npm:^1.1.6, react-native-is-edge-to-edge@npm:^1.2.1": version: 1.2.1 resolution: "react-native-is-edge-to-edge@npm:1.2.1" peerDependencies: @@ -13041,13 +12705,34 @@ __metadata: languageName: node linkType: hard -"react-native-monorepo-config@npm:^0.1.8": - version: 0.1.10 - resolution: "react-native-monorepo-config@npm:0.1.10" +"react-native-monorepo-config@npm:^0.3.3": + version: 0.3.3 + resolution: "react-native-monorepo-config@npm:0.3.3" dependencies: escape-string-regexp: "npm:^5.0.0" fast-glob: "npm:^3.3.3" - checksum: 10/36611eca9cbda6647111e659d5c466fdba002c608172b9d25880b6e3ac95c51f41d15520e06d9d3188c096b0c9182caeba7b9340c64f6b45f1fee331c08b877b + checksum: 10/d301020b38f80010bce38108a9e1b72deee3eb37f1ba5e2f0471dc0737584b8d25158a2e649c38ddbe890b653c29a69ef82d73c522473cfdb2396239ee84fcd8 + languageName: node + linkType: hard + +"react-native-nitro-image@npm:0.10.2": + version: 0.10.2 + resolution: "react-native-nitro-image@npm:0.10.2" + peerDependencies: + react: "*" + react-native: "*" + react-native-nitro-modules: "*" + checksum: 10/3be75e93da369adfe00441dae78171572dec38d3d7e75e5d4cb302b81479be9686c8d8dc0ea4b331514b8725099bf3eb069ab9933f7029627d12a72d71766cb4 + languageName: node + linkType: hard + +"react-native-nitro-modules@npm:0.33.4": + version: 0.33.4 + resolution: "react-native-nitro-modules@npm:0.33.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/a737ff6b142c55821688612305245fd10a7cff36f0ee66cad0956c6815a60cdd4ba64cdfba6137a6dbfe815645763ce5d406cf488876edd47dab7f8d0031e01a languageName: node linkType: hard @@ -13066,6 +12751,20 @@ __metadata: languageName: node linkType: hard +"react-native-reanimated@npm:~4.2.1": + version: 4.2.1 + resolution: "react-native-reanimated@npm:4.2.1" + dependencies: + react-native-is-edge-to-edge: "npm:1.2.1" + semver: "npm:7.7.3" + peerDependencies: + react: "*" + react-native: "*" + react-native-worklets: ">=0.7.0" + checksum: 10/869eb4c90b5464ac616bf048f77a309fd2c793020a662b80b874022f90256b7c955f43d7e7c4751c15f2f767c306e52c624cc37f3edff4fe0bbf26c2c3f955b7 + languageName: node + linkType: hard + "react-native-safe-area-context@npm:~5.6.0": version: 5.6.2 resolution: "react-native-safe-area-context@npm:5.6.2" @@ -13090,9 +12789,22 @@ __metadata: languageName: node linkType: hard +"react-native-screens@npm:~4.22.0": + version: 4.22.0 + resolution: "react-native-screens@npm:4.22.0" + dependencies: + react-freeze: "npm:^1.0.0" + warn-once: "npm:^0.1.0" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/42be14f2de0bfe7b76e3e8fccffa8843fc558cda70aa182c8cb7ed2697826a684cd83abb0a8647dbd1e01a0710960a120b706f01502a4206819d6f54ef3d3fce + languageName: node + linkType: hard + "react-native-svg-transformer@npm:^1.5.0": - version: 1.5.2 - resolution: "react-native-svg-transformer@npm:1.5.2" + version: 1.5.3 + resolution: "react-native-svg-transformer@npm:1.5.3" dependencies: "@svgr/core": "npm:^8.1.0" "@svgr/plugin-jsx": "npm:^8.1.0" @@ -13101,7 +12813,7 @@ __metadata: peerDependencies: react-native: ">=0.59.0" react-native-svg: ">=12.0.0" - checksum: 10/3b148e89edbbb70b16034a8a7d2f81b49bd0dba036a9bcbc765c942ae7631684154855dffbe597c45ebd911444b7f2d2228024bde508e6fcf08e8ef967676d92 + checksum: 10/1c66bce6073b3e4144a71d931ff6e1305485154f858f5c8d2f5292f2fcac1ee0155fb6c0958a4ee03cb6267bed57481ab887325b8685240c2ba51cafa0c05185 languageName: node linkType: hard @@ -13119,6 +12831,32 @@ __metadata: languageName: node linkType: hard +"react-native-svg@npm:15.15.1": + version: 15.15.1 + resolution: "react-native-svg@npm:15.15.1" + dependencies: + css-select: "npm:^5.1.0" + css-tree: "npm:^1.1.3" + warn-once: "npm:0.1.1" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/3a5dbbee0c6a81b3feb2b91a5a617a1a25e01c908686af479fab4fe6661376253ba0e0e1d3eda36f27eab9b2cd2c4c17b68423cfca465df255f20cacc1ba384d + languageName: node + linkType: hard + +"react-native-vision-camera@portal:../../../react-native-vision-camera-v5/packages/react-native-vision-camera::locator=computer-vision%40workspace%3Aapps%2Fcomputer-vision": + version: 0.0.0-use.local + resolution: "react-native-vision-camera@portal:../../../react-native-vision-camera-v5/packages/react-native-vision-camera::locator=computer-vision%40workspace%3Aapps%2Fcomputer-vision" + peerDependencies: + react: "*" + react-native: "*" + react-native-nitro-image: "*" + react-native-nitro-modules: "*" + react-native-worklets: "*" + languageName: node + linkType: soft + "react-native-worklets@npm:0.5.1": version: 0.5.1 resolution: "react-native-worklets@npm:0.5.1" @@ -13142,6 +12880,29 @@ __metadata: languageName: node linkType: hard +"react-native-worklets@npm:^0.7.2": + version: 0.7.3 + resolution: "react-native-worklets@npm:0.7.3" + dependencies: + "@babel/plugin-transform-arrow-functions": "npm:7.27.1" + "@babel/plugin-transform-class-properties": "npm:7.27.1" + "@babel/plugin-transform-classes": "npm:7.28.4" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:7.27.1" + "@babel/plugin-transform-template-literals": "npm:7.27.1" + "@babel/plugin-transform-unicode-regex": "npm:7.27.1" + "@babel/preset-typescript": "npm:7.27.1" + convert-source-map: "npm:2.0.0" + semver: "npm:7.7.3" + peerDependencies: + "@babel/core": "*" + react: "*" + react-native: "*" + checksum: 10/bc0b24bb8281fa319f7b0b85faa19058020bb26814fc6275b10bd56ad5d6536c4788c7ca913126f27de3ebbe45c7fce144503e3c06d697110910c901dd56db56 + languageName: node + linkType: hard + "react-native@npm:0.81.5": version: 0.81.5 resolution: "react-native@npm:0.81.5" @@ -13286,18 +13047,6 @@ __metadata: languageName: node linkType: hard -"recast@npm:^0.21.0": - version: 0.21.5 - resolution: "recast@npm:0.21.5" - dependencies: - ast-types: "npm:0.15.2" - esprima: "npm:~4.0.0" - source-map: "npm:~0.6.1" - tslib: "npm:^2.0.1" - checksum: 10/b41da2bcf7e705511db2f27d17420ace027de8dd167de9f19190d4988a1f80d112f60c095101ac2f145c8657ddde0c5133eb71df20504efaf3fd9d76ad07e15d - languageName: node - linkType: hard - "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": version: 1.0.10 resolution: "reflect.getprototypeof@npm:1.0.10" @@ -13445,19 +13194,10 @@ __metadata: languageName: node linkType: hard -"resolve-global@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-global@npm:1.0.0" - dependencies: - global-dirs: "npm:^0.1.1" - checksum: 10/c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 - languageName: node - linkType: hard - "resolve-workspace-root@npm:^2.0.0": - version: 2.0.0 - resolution: "resolve-workspace-root@npm:2.0.0" - checksum: 10/c2de02d213ca327964bd2a1e6cbb17d96d2adbd738b6aa737129ed952ef4f7e52b79452599e1ef99c6cf4f109c937866b7f3abf34f8f41af376e1b08a03523a4 + version: 2.0.1 + resolution: "resolve-workspace-root@npm:2.0.1" + checksum: 10/d10b1897018c291a8c0c6d6a36d174830bc004b7aa2a9e416b9c1e0ea4d8575a68bc4ed9d6f28be5859a3b0d5f70f0ffdc12e6ef0af010f487d91cf7d4ce8ff0 languageName: node linkType: hard @@ -13468,7 +13208,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.2": +"resolve@npm:^1.20.0, resolve@npm:^1.22.11, resolve@npm:^1.22.2": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -13503,7 +13243,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin": +"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.11#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: @@ -13583,17 +13323,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:~2.6.2": - version: 2.6.3 - resolution: "rimraf@npm:2.6.3" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10/756419f2fa99aa119c46a9fc03e09d84ecf5421a80a72d1944c5088c9e4671e77128527a900a313ed9d3fdbdd37e2ae05486cd7e9116d5812d8c31f2399d7c86 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -13652,13 +13381,13 @@ __metadata: linkType: hard "sax@npm:>=0.6.0": - version: 1.4.3 - resolution: "sax@npm:1.4.3" - checksum: 10/99161215f23e0b13bc7f94adbaa63a6a2f188fe291c450790d92b5bc3cd7966d574a15dcd5918c30917e17ed68129e34cc3168564263b967f9b8f61869d6ccc4 + version: 1.4.4 + resolution: "sax@npm:1.4.4" + checksum: 10/00ff7b258baa37d98f8abfa0b5c8b3ee739ca37e9b6ecb83405be9e6e5b0b2856394a5eff142db1d987d589b54b139d4236f25830c1e17a2b640efa53c8fda72 languageName: node linkType: hard -"scheduler@npm:0.26.0": +"scheduler@npm:0.26.0, scheduler@npm:^0.26.0": version: 0.26.0 resolution: "scheduler@npm:0.26.0" checksum: 10/1ecf2e5d7de1a7a132796834afe14a2d589ba7e437615bd8c06f3e0786a3ac3434655e67aac8755d9b14e05754c177e49c064261de2673aaa3c926bc98caa002 @@ -13681,12 +13410,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.6.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" +"semver@npm:7.7.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: - semver: bin/semver - checksum: 10/fca14418a174d4b4ef1fecb32c5941e3412d52a4d3d85165924ce3a47fbc7073372c26faf7484ceb4bbc2bde25880c6b97e492473dc7e9708fdfb1c6a02d546e + semver: bin/semver.js + checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 languageName: node linkType: hard @@ -13700,11 +13429,11 @@ __metadata: linkType: hard "semver@npm:^7.1.3, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1": - version: 7.7.3 - resolution: "semver@npm:7.7.3" + version: 7.7.4 + resolution: "semver@npm:7.7.4" bin: semver: bin/semver.js - checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 + checksum: 10/26bdc6d58b29528f4142d29afb8526bc335f4fc04c4a10f2b98b217f277a031c66736bf82d3d3bb354a2f6a3ae50f18fd62b053c4ac3f294a3d10a61f5075b75 languageName: node linkType: hard @@ -13717,30 +13446,9 @@ __metadata: languageName: node linkType: hard -"send@npm:0.19.0": - version: 0.19.0 - resolution: "send@npm:0.19.0" - dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10/1f6064dea0ae4cbe4878437aedc9270c33f2a6650a77b56a16b62d057527f2766d96ee282997dd53ec0339082f2aad935bc7d989b46b48c82fc610800dc3a1d0 - languageName: node - linkType: hard - -"send@npm:^0.19.0": - version: 0.19.1 - resolution: "send@npm:0.19.1" +"send@npm:^0.19.0, send@npm:~0.19.1": + version: 0.19.2 + resolution: "send@npm:0.19.2" dependencies: debug: "npm:2.6.9" depd: "npm:2.0.0" @@ -13748,14 +13456,14 @@ __metadata: encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.1" mime: "npm:1.6.0" ms: "npm:2.1.3" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10/360bf50a839c7bbc181f67c3a0f3424a7ad8016dfebcd9eb90891f4b762b4377da14414c32250d67b53872e884171c27469110626f6c22765caa7c38c207ee1d + statuses: "npm:~2.0.2" + checksum: 10/e932a592f62c58560b608a402d52333a8ae98a5ada076feb5db1d03adaa77c3ca32a7befa1c4fd6dedc186e88f342725b0cb4b3d86835eaf834688b259bef18d languageName: node linkType: hard @@ -13767,14 +13475,14 @@ __metadata: linkType: hard "serve-static@npm:^1.13.1, serve-static@npm:^1.16.2": - version: 1.16.2 - resolution: "serve-static@npm:1.16.2" + version: 1.16.3 + resolution: "serve-static@npm:1.16.3" dependencies: encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" - send: "npm:0.19.0" - checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 + send: "npm:~0.19.1" + checksum: 10/149d6718dd9e53166784d0a65535e21a7c01249d9c51f57224b786a7306354c6807e7811a9f6c143b45c863b1524721fca2f52b5c81a8b5194e3dde034a03b9c languageName: node linkType: hard @@ -13829,7 +13537,7 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": +"setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" checksum: 10/fde1630422502fbbc19e6844346778f99d449986b2f9cdcceb8326730d2f3d9964dbcb03c02aaadaefffecd0f2c063315ebea8b3ad895914bf1afc1747fc172e @@ -13843,15 +13551,6 @@ __metadata: languageName: node linkType: hard -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 10/e066bd540cfec5e1b0f78134853e0d892d1c8945fb9a926a579946052e7cb0c70ca4fc34f875a8083aa7910d751805d36ae64af250a6de6f3d28f9fa7be6c21b - languageName: node - linkType: hard - "shallowequal@npm:^1.1.0": version: 1.1.0 resolution: "shallowequal@npm:1.1.0" @@ -14051,7 +13750,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.16, source-map-support@npm:~0.5.20, source-map-support@npm:~0.5.21": +"source-map-support@npm:~0.5.20, source-map-support@npm:~0.5.21": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -14068,7 +13767,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff @@ -14080,13 +13779,14 @@ __metadata: resolution: "speech@workspace:apps/speech" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/metro-config": "npm:^0.76.3" + "@react-native-executorch/expo-resource-fetcher": "workspace:*" + "@react-native/metro-config": "npm:^0.81.5" "@types/react": "npm:~19.1.10" buffer: "npm:^6.0.3" expo: "npm:^54.0.27" expo-font: "npm:~14.0.10" expo-status-bar: "npm:~3.0.9" - metro-config: "npm:^0.81.0" + metro-config: "npm:^0.81.5" react: "npm:19.1.0" react-native: "npm:0.81.5" react-native-audio-api: "npm:0.6.5" @@ -14115,11 +13815,11 @@ __metadata: linkType: hard "ssri@npm:^13.0.0": - version: 13.0.0 - resolution: "ssri@npm:13.0.0" + version: 13.0.1 + resolution: "ssri@npm:13.0.1" dependencies: minipass: "npm:^7.0.3" - checksum: 10/fd59bfedf0659c1b83f6e15459162da021f08ec0f5834dd9163296f8b77ee82f9656aa1d415c3d3848484293e0e6aefdd482e863e52ddb53d520bb73da1eeec1 + checksum: 10/ae560d0378d074006a71b06af71bfbe84a3fe1ac6e16c1f07575f69e670d40170507fe52b21bcc23399429bc6a15f4bc3ea8d9bc88e9dfd7e87de564e6da6a72 languageName: node linkType: hard @@ -14148,13 +13848,6 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10/18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - "statuses@npm:~1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" @@ -14193,6 +13886,13 @@ __metadata: languageName: node linkType: hard +"strict-url-sanitise@npm:0.0.1": + version: 0.0.1 + resolution: "strict-url-sanitise@npm:0.0.1" + checksum: 10/cab6ae551f998f18ea7fb14176a9d835f5b304e5419c61851de897c830ccc20c2848bbb50ced242227114e06a3f6379dcc9179a84bc0a7b8cf81f5192b5b4789 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -14465,41 +14165,25 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.11.4, synckit@npm:^0.11.7": - version: 0.11.11 - resolution: "synckit@npm:0.11.11" +"synckit@npm:^0.11.12, synckit@npm:^0.11.4": + version: 0.11.12 + resolution: "synckit@npm:0.11.12" dependencies: "@pkgr/core": "npm:^0.2.9" - checksum: 10/6ecd88212b5be80004376b6ea74babcba284566ff59a50d8803afcaa78c165b5d268635c1dd84532ee3f690a979409e1eda225a8a35bed2d135ffdcea06ce7b0 + checksum: 10/2f51978bfed81aaf0b093f596709a72c49b17909020f42b43c5549f9c0fe18b1fe29f82e41ef771172d729b32e9ce82900a85d2b87fa14d59f886d4df8d7a329 languageName: node linkType: hard -"tar@npm:^7.5.2": - version: 7.5.2 - resolution: "tar@npm:7.5.2" +"tar@npm:^7.5.2, tar@npm:^7.5.4": + version: 7.5.7 + resolution: "tar@npm:7.5.7" 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: 10/dbad9c9a07863cd1bdf8801d563b3280aa7dd0f4a6cead779ff7516d148dc80b4c04639ba732d47f91f04002f57e8c3c6573a717d649daecaac74ce71daa7ad3 - languageName: node - linkType: hard - -"temp-dir@npm:~2.0.0": - version: 2.0.0 - resolution: "temp-dir@npm:2.0.0" - checksum: 10/cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa - languageName: node - linkType: hard - -"temp@npm:^0.8.4": - version: 0.8.4 - resolution: "temp@npm:0.8.4" - dependencies: - rimraf: "npm:~2.6.2" - checksum: 10/0a7f76b49637415bc391c3f6e69377cc4c38afac95132b4158fa711e77b70b082fe56fd886f9d11ffab9d148df181a105a93c8b618fb72266eeaa5e5ddbfe37f + checksum: 10/0d6938dd32fe5c0f17c8098d92bd9889ee0ed9d11f12381b8146b6e8c87bb5aa49feec7abc42463f0597503d8e89e4c4c0b42bff1a5a38444e918b4878b7fd21 languageName: node linkType: hard @@ -14514,8 +14198,8 @@ __metadata: linkType: hard "terser@npm:^5.15.0": - version: 5.44.1 - resolution: "terser@npm:5.44.1" + version: 5.46.0 + resolution: "terser@npm:5.46.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.15.0" @@ -14523,7 +14207,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/516ece205b7db778c4eddb287a556423cb776b7ca591b06270e558a76aa2d57c8d71d9c3c4410b276d3426beb03516fff7d96ff8b517e10730a72908810c6e33 + checksum: 10/331e4f5a165d91d16ac6a95b510d4f5ef24679e4bc9e1b4e4182e89b7245f614d24ce0def583e2ca3ca45f82ba810991e0c5b66dd4353a6e0b7082786af6bd35 languageName: node linkType: hard @@ -14543,6 +14227,7 @@ __metadata: resolution: "text-embeddings@workspace:apps/text-embeddings" dependencies: "@babel/core": "npm:^7.25.2" + "@react-native-executorch/expo-resource-fetcher": "workspace:*" "@react-navigation/drawer": "npm:^7.3.9" "@types/react": "npm:~19.1.10" expo: "npm:^54.0.27" @@ -14623,7 +14308,7 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": +"toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" checksum: 10/952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 @@ -14653,7 +14338,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -14825,9 +14510,9 @@ __metadata: linkType: hard "undici@npm:^6.18.2": - version: 6.22.0 - resolution: "undici@npm:6.22.0" - checksum: 10/2398de2b460e05f80f994d8a64fcb603aac8f253f8e7ff737067531c1101e1d74644fe5205894b0f7356ea69602d10d6d98c554fcd8b383ec3cc07a3268ec293 + version: 6.23.0 + resolution: "undici@npm:6.23.0" + checksum: 10/56950995e7b628e62c996430445d17995ca9b70f6f2afe760a63da54205660d968bd08f0741b6f4fb008f40aa35c69cce979cd96ced399585d8c897a76a4f1d1 languageName: node linkType: hard @@ -14880,15 +14565,6 @@ __metadata: languageName: node linkType: hard -"unique-string@npm:~2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" - dependencies: - crypto-random-string: "npm:^2.0.0" - checksum: 10/107cae65b0b618296c2c663b8e52e4d1df129e9af04ab38d53b4f2189e96da93f599c85f4589b7ffaf1a11c9327cbb8a34f04c71b8d4950d3e385c2da2a93828 - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-stringify-position@npm:2.0.3" @@ -14929,8 +14605,8 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.2.0": - version: 1.2.2 - resolution: "update-browserslist-db@npm:1.2.2" + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" dependencies: escalade: "npm:^3.2.0" picocolors: "npm:^1.1.1" @@ -14938,7 +14614,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/ae2102d3c83fca35e9deb012d82bfde6f734998ced937e34a3bf239a4b67577108fdd144283aafc0e5e3cf38ca1aecd7714906ba6f562896c762d2f2fa391026 + checksum: 10/059f774300efb4b084a49293143c511f3ae946d40397b5c30914e900cd5691a12b8e61b41dd54ed73d3b56c8204165a0333107dd784ccf8f8c81790bcc423175 languageName: node linkType: hard @@ -15185,8 +14861,8 @@ __metadata: linkType: hard "which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": - version: 1.1.19 - resolution: "which-typed-array@npm:1.1.19" + version: 1.1.20 + resolution: "which-typed-array@npm:1.1.20" dependencies: available-typed-arrays: "npm:^1.0.7" call-bind: "npm:^1.0.8" @@ -15195,7 +14871,7 @@ __metadata: get-proto: "npm:^1.0.1" gopd: "npm:^1.2.0" has-tostringtag: "npm:^1.0.2" - checksum: 10/12be30fb88567f9863186bee1777f11bea09dd59ed8b3ce4afa7dd5cade75e2f4cc56191a2da165113cc7cf79987ba021dac1e22b5b62aa7e5c56949f2469a68 + checksum: 10/e56da3fc995d330ff012f682476f7883c16b12d36c6717c87c7ca23eb5a5ef957fa89115dacb389b11a9b4e99d5dbe2d12689b4d5d08c050b5aed0eae385b840 languageName: node linkType: hard @@ -15211,13 +14887,13 @@ __metadata: linkType: hard "which@npm:^6.0.0": - version: 6.0.0 - resolution: "which@npm:6.0.0" + version: 6.0.1 + resolution: "which@npm:6.0.1" dependencies: - isexe: "npm:^3.1.1" + isexe: "npm:^4.0.0" bin: node-which: bin/which.js - checksum: 10/df19b2cd8aac94b333fa29b42e8e371a21e634a742a3b156716f7752a5afe1d73fb5d8bce9b89326f453d96879e8fe626eb421e0117eb1a3ce9fd8c97f6b7db9 + checksum: 10/dbea77c7d3058bf6c78bf9659d2dce4d2b57d39a15b826b2af6ac2e5a219b99dc8a831b79fdbc453c0598adb4f3f84cf9c2491fd52beb9f5d2dececcad117f68 languageName: node linkType: hard @@ -15275,17 +14951,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^2.3.0": - version: 2.4.3 - resolution: "write-file-atomic@npm:2.4.3" - dependencies: - graceful-fs: "npm:^4.1.11" - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^3.0.2" - checksum: 10/15ce863dce07075d0decedd7c9094f4461e46139d28a758c53162f24c0791c16cd2e7a76baa5b47b1a851fbb51e16f2fab739afb156929b22628f3225437135c - languageName: node - linkType: hard - "write-file-atomic@npm:^4.0.2": version: 4.0.2 resolution: "write-file-atomic@npm:4.0.2" @@ -15321,8 +14986,8 @@ __metadata: linkType: hard "ws@npm:^8.12.1": - version: 8.18.3 - resolution: "ws@npm:8.18.3" + version: 8.19.0 + resolution: "ws@npm:8.19.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -15331,7 +14996,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + checksum: 10/26e4901e93abaf73af9f26a93707c95b4845e91a7a347ec8c569e6e9be7f9df066f6c2b817b2d685544e208207898a750b78461e6e8d810c11a370771450c31b languageName: node linkType: hard