From 7e8c81ab28c0800841a64e18d81e24c6e3b9ba3b Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Wed, 11 Feb 2026 11:48:16 +0100 Subject: [PATCH 01/16] fix: correct frame data extraction --- .../object_detection/ObjectDetection.cpp | 123 ++++++++++++++++-- 1 file changed, 111 insertions(+), 12 deletions(-) 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..f17a4f074 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,17 @@ #include #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, @@ -29,14 +32,49 @@ ObjectDetection::ObjectDetection( modelInputShape[modelInputShape.size() - 2]); } +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 rgb; + + // Convert RGBA/BGRA to RGB if needed (for VisionCamera frames) + if (frame.channels() == 4) { +// 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 + } else if (frame.channels() == 3) { + // Already RGB + rgb = frame; + } else { + char errorMessage[100]; + std::snprintf(errorMessage, sizeof(errorMessage), + "Unsupported frame format: %d channels", frame.channels()); + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + errorMessage); + } + + // Only resize if dimensions don't match + if (rgb.size() != tensorSize) { + cv::Mat resized; + cv::resize(rgb, resized, tensorSize); + return resized; + } + + return rgb; +} + 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 = @@ -70,14 +108,23 @@ ObjectDetection::postprocess(const std::vector &tensors, scores[i]); } - std::vector output = utils::nonMaxSuppression(detections); - return output; + return utils::nonMaxSuppression(detections); } std::vector -ObjectDetection::generate(std::string imageSource, double detectionThreshold) { - auto [inputTensor, originalSize] = - image_processing::readImageToTensor(imageSource, getAllInputShapes()[0]); +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()) { @@ -88,4 +135,56 @@ ObjectDetection::generate(std::string imageSource, double detectionThreshold) { return postprocess(forwardResult.get(), originalSize, detectionThreshold); } -} // namespace rnexecutorch::models::object_detection + +std::vector +ObjectDetection::generateFromString(std::string imageSource, + double detectionThreshold) { + // Read image using OpenCV (BGR format) + cv::Mat image = image_processing::readImage(imageSource); + + // Convert BGR to RGB (OpenCV imread returns BGR) + cv::Mat imageRGB; + cv::cvtColor(image, imageRGB, cv::COLOR_BGR2RGB); + + // Use the internal helper - it handles locking, preprocessing, and inference + return runInference(imageRGB, 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 + } + + // Extract frame (under lock to ensure thread safety) + cv::Mat frame; + { + std::lock_guard lock(inference_mutex_, std::adopt_lock); + auto frameObj = frameData.asObject(runtime); + frame = + rnexecutorch::utils::FrameProcessor::extractFrame(runtime, frameObj); + } + // Lock is automatically released here when going out of scope + + // Use the internal helper - it handles locking, preprocessing, and inference + return runInference(frame, detectionThreshold); +} + +std::vector +ObjectDetection::generateFromPixels(jsi::Runtime &runtime, + const jsi::Value &pixelData, + double detectionThreshold) { + // Convert JSI value to JSTensorViewIn + auto tensorView = + jsi_conversion::getValue(pixelData, runtime); + + // Extract raw pixel data to cv::Mat + cv::Mat image = extractFromPixels(tensorView); + + // Use the internal helper - it handles locking, preprocessing, and inference + return runInference(image, detectionThreshold); +} +} // namespace rnexecutorch::models::object_detection \ No newline at end of file From 4338accae90c437734f3bb872bf9599d6359547b Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Thu, 12 Feb 2026 14:24:02 +0100 Subject: [PATCH 02/16] feat: frame extractor for zero-copy approach --- .../rnexecutorch/utils/FrameExtractor.cpp | 151 ++++++++++++++++++ .../rnexecutorch/utils/FrameExtractor.h | 60 +++++++ .../src/types/common.ts | 33 ++++ yarn.lock | 110 ++++++++++--- 4 files changed, 328 insertions(+), 26 deletions(-) create mode 100644 packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp create mode 100644 packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h 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/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/yarn.lock b/yarn.lock index 436005c8d..c96a63691 100644 --- a/yarn.lock +++ b/yarn.lock @@ -149,6 +149,23 @@ __metadata: languageName: node linkType: hard +"@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.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + 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": version: 7.28.5 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" @@ -343,6 +360,17 @@ __metadata: languageName: node linkType: hard +"@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.29.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/b1576dca41074997a33ee740d87b330ae2e647f4b7da9e8d2abd3772b18385d303b0cee962b9b88425e0f30d58358dbb8d63792c1a2d005c823d335f6a029747 + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": version: 7.28.5 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" @@ -838,7 +866,7 @@ __metadata: 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, @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": version: 7.27.1 resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: @@ -862,7 +890,7 @@ __metadata: 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, @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": version: 7.28.4 resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: @@ -1196,6 +1224,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:7.27.1": + version: 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/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" @@ -1481,7 +1521,7 @@ __metadata: 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: @@ -1662,6 +1702,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.28.6": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-globals": "npm:^7.28.0" + "@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/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" @@ -4799,6 +4854,15 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:~19.2.0": + version: 19.2.13 + resolution: "@types/react@npm:19.2.13" + dependencies: + csstype: "npm:^3.2.2" + checksum: 10/a3bb8d09c79f5f29dfbc7e47c5b39c687f4329b76041713993c025781f32c26e4881fbeead65ff44d728945f222b781c6053263bc1819ef90596b4fbfd83f718 + languageName: node + linkType: hard + "@types/semver@npm:^7.3.12": version: 7.7.1 resolution: "@types/semver@npm:7.7.1" @@ -12983,11 +13047,9 @@ __metadata: languageName: node linkType: hard -"react-native-audio-api@npm:0.11.3": - version: 0.11.3 - resolution: "react-native-audio-api@npm:0.11.3" - dependencies: - semver: "npm:^7.7.3" +"react-native-audio-api@npm:0.6.5": + version: 0.6.5 + resolution: "react-native-audio-api@npm:0.6.5" peerDependencies: react: "*" react-native: "*" @@ -13198,6 +13260,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" @@ -13799,24 +13875,6 @@ __metadata: languageName: node 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" - bin: - semver: bin/semver.js - checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 - languageName: node - linkType: hard - -"semver@npm:^7.7.3": - version: 7.7.4 - resolution: "semver@npm:7.7.4" - bin: - semver: bin/semver.js - checksum: 10/26bdc6d58b29528f4142d29afb8526bc335f4fc04c4a10f2b98b217f277a031c66736bf82d3d3bb354a2f6a3ae50f18fd62b053c4ac3f294a3d10a61f5075b75 - languageName: node - linkType: hard - "semver@npm:~7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" From 4c9f64f0af76be68cc890d5ff588e460176a15ca Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Fri, 13 Feb 2026 11:29:23 +0100 Subject: [PATCH 03/16] chore: num minSdkVersion to 26 --- packages/react-native-executorch/android/gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From aea9c26446a0e1ef40802b04a0775b69ad9680a8 Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Mon, 16 Feb 2026 10:37:11 +0100 Subject: [PATCH 04/16] feat: unify frame extraction and preprocessing --- .../rnexecutorch/models/VisionModel.cpp | 20 + .../common/rnexecutorch/models/VisionModel.h | 139 + .../models/classification/Classification.cpp | 2 +- .../rnexecutorch/utils/FrameProcessor.cpp | 142 + .../rnexecutorch/utils/FrameProcessor.h | 109 + .../src/modules/BaseModule.ts | 79 +- yarn.lock | 3083 +++++++---------- 7 files changed, 1792 insertions(+), 1782 deletions(-) create mode 100644 packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp create mode 100644 packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h create mode 100644 packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp create mode 100644 packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h 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..671ed03c8 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -0,0 +1,20 @@ +#include "VisionModel.h" +#include + +namespace rnexecutorch { +namespace models { + +using namespace facebook; + +cv::Mat VisionModel::extractAndPreprocess(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); +} + +} // 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..11da49547 --- /dev/null +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h @@ -0,0 +1,139 @@ +#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 = extractAndPreprocess(runtime, frameData); + * auto tensor = image_processing::getTensorFromMatrix(dims, preprocessed); + * @endcode + */ + cv::Mat extractAndPreprocess(jsi::Runtime &runtime, + const jsi::Value &frameData) 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/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/src/modules/BaseModule.ts b/packages/react-native-executorch/src/modules/BaseModule.ts index 6aefc8b2a..315b82249 100644 --- a/packages/react-native-executorch/src/modules/BaseModule.ts +++ b/packages/react-native-executorch/src/modules/BaseModule.ts @@ -1,12 +1,68 @@ import { ResourceSource } 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 +75,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,11 +93,29 @@ 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) { this.nativeModule.unload(); } } + + /** + * Bind JSI methods to this instance for worklet compatibility. + * + * This makes native JSI functions accessible from worklet threads, + * which is essential for VisionCamera frame processing. + * + * @internal + */ + protected bindJSIMethods() { + if (this.nativeModule && this.nativeModule.generateFromFrame) { + // Bind the native JSI method directly to this instance + // This makes it worklet-compatible since JSI functions work across threads + this.generateFromFrame = this.nativeModule.generateFromFrame; + } + } } diff --git a/yarn.lock b/yarn.lock index c96a63691..b2879dcbe 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.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" + 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,20 @@ __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 - 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" - 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-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.5" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/0bbf3dfe91875f642fe7ef38f60647f0df8eb9994d4350b19a4d1a9bdc32629e49e56e9a80afb12eeb6f6bcc6666392b37f32231b7c054fc91a0d5251cd67d5b + checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.28.6": +"@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: @@ -166,7 +149,7 @@ __metadata: 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: @@ -179,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 @@ -210,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: @@ -220,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 @@ -252,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 @@ -272,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 @@ -302,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 @@ -317,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 @@ -349,18 +332,7 @@ __metadata: languageName: node linkType: hard -"@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.27.2, @babel/parser@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/parser@npm:7.28.5" - dependencies: - "@babel/types": "npm:^7.28.5" - bin: - parser: ./bin/babel-parser.js - checksum: 10/8d9bfb437af6c97a7f6351840b9ac06b4529ba79d6d3def24d6c2996ab38ff7f1f9d301e868ca84a93a3050fadb3d09dbc5105b24634cd281671ac11eebe8df7 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": +"@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: @@ -418,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 @@ -457,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 @@ -597,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 @@ -620,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 @@ -685,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 @@ -784,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 @@ -807,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: @@ -818,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 @@ -855,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.27.1, @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: @@ -878,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.28.4, @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: @@ -906,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: @@ -930,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 @@ -953,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 @@ -976,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 @@ -1047,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 @@ -1069,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 @@ -1103,29 +1103,29 @@ __metadata: languageName: node linkType: hard -"@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": - 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 @@ -1141,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 @@ -1164,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: @@ -1175,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 @@ -1213,14 +1224,14 @@ __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": - version: 7.27.1 - resolution: "@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.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f4356b04cf21a98480f9788ea50f1f13ee88e89bb6393ba4b84d1f39a4a84c7928c9a4328e8f4c5b6deb218da68a8fd17bf4f46faec7653ddc20ffaaa5ba49f4 + checksum: 10/ee24a17defec056eb9ef01824d7e4a1f65d531af6b4b79acfd0bcb95ce0b47926e80c61897f36f8c01ce733b069c9acdb1c9ce5ec07a729d0dbf9e8d859fe992 languageName: node linkType: hard @@ -1236,15 +1247,15 @@ __metadata: 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 @@ -1259,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 @@ -1340,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 @@ -1366,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 @@ -1401,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: @@ -1427,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 @@ -1461,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: @@ -1483,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 @@ -1509,15 +1520,15 @@ __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 @@ -1533,95 +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 + checksum: 10/211b33ec8644636275f61aa273071d8cbc2a6bb28d82ad246e3831a6aa7d96c610a55b5140bcd21be7f71fb04c3aa4a10eb08665fb5505e153cfdd8dbc8c1c1c languageName: node linkType: hard @@ -1654,6 +1665,21 @@ __metadata: languageName: node linkType: hard +"@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.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/9d8e75326b3c93fa016ba7aada652800fc77bc05fcc181888700a049935e8cf1284b549de18a5d62ef3591d02f097ea6de1111f7d71a991aaf36ba74657bd145 + languageName: node + linkType: hard + "@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" @@ -1670,39 +1696,24 @@ __metadata: 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 - 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" - dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/parser": "npm:^7.27.2" - "@babel/types": "npm:^7.27.1" - checksum: 10/fed15a84beb0b9340e5f81566600dbee5eccd92e4b9cc42a944359b1aa1082373391d9d5fc3656981dff27233ec935d0bc96453cf507f60a4b079463999244d8 + version: 7.28.6 + resolution: "@babel/runtime@npm:7.28.6" + checksum: 10/fbcd439cb74d4a681958eb064c509829e3f46d8a4bfaaf441baa81bb6733d1e680bccc676c813883d7741bcaada1d0d04b15aa320ef280b5734e2192b50decf9 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/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/generator": "npm:^7.28.5" - "@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" - debug: "npm:^4.3.1" - checksum: 10/1fce426f5ea494913c40f33298ce219708e703f71cac7ac045ebde64b5a7b17b9275dfa4e05fb92c3f123136913dff62c8113172f4a5de66dab566123dbe7437 + "@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@npm:^7.28.6": +"@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: @@ -1717,13 +1728,13 @@ __metadata: 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 @@ -1854,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 @@ -1870,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 @@ -1891,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 @@ -1947,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 @@ -1961,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 @@ -1996,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 @@ -2010,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 @@ -2038,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 @@ -2108,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 @@ -2162,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 @@ -2178,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 @@ -2206,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 @@ -2300,15 +2311,15 @@ __metadata: linkType: hard "@dr.pogodin/react-native-fs@npm:^2.36.2": - version: 2.36.2 - resolution: "@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/6a4b1c324386c455e01ccf45daf80474364079bc6495f0a65c1468e4e15607951754b81d9d720fb635a8caba5ba94b34719d0140357ce8e168172583e09156d4 + checksum: 10/c66c03a9e814c0c4e3c9b575bc1dc7aedee18e815f45860541b94935cbfdfae8ccb71964c359c420498d120b00a1b997bf5e4739da58a8d681ad33df1d76ef03 languageName: node linkType: hard @@ -2322,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 @@ -2349,115 +2360,33 @@ __metadata: globals: "npm:^13.19.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 - languageName: node - linkType: hard - -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 - languageName: node - linkType: hard - -"@evilmartians/lefthook@npm:^1.5.0": - version: 1.13.6 - resolution: "@evilmartians/lefthook@npm:1.13.6" - bin: - lefthook: bin/index.js - checksum: 10/d3a564d9c9f7db61fe01530e6d15817b29a067c0df2989a5cc8cbd5e4bdcfe7d3ca406980733076d7a3888883d0b7a2ca9e0a8aae36b670df38226fccc7c7753 - conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=ia32) - languageName: node - linkType: hard - -"@expo/cli@npm:54.0.18": - version: 54.0.18 - resolution: "@expo/cli@npm:54.0.18" - 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/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/osascript": "npm:^2.3.8" - "@expo/package-manager": "npm:^1.9.9" - "@expo/plist": "npm:^0.4.8" - "@expo/prebuild-config": "npm:^54.0.7" - "@expo/schema-utils": "npm:^0.1.8" - "@expo/spawn-async": "npm:^1.7.2" - "@expo/ws-tunnel": "npm:^1.0.1" - "@expo/xcpretty": "npm:^4.3.0" - "@react-native/dev-middleware": "npm:0.81.5" - "@urql/core": "npm:^5.0.6" - "@urql/exchange-retry": "npm:^1.3.0" - accepts: "npm:^1.3.8" - arg: "npm:^5.0.2" - better-opn: "npm:~3.0.2" - bplist-creator: "npm:0.1.0" - bplist-parser: "npm:^0.3.1" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.3.0" - compression: "npm:^1.7.4" - connect: "npm:^3.7.0" - debug: "npm:^4.3.4" - env-editor: "npm:^0.4.1" - expo-server: "npm:^1.0.5" - freeport-async: "npm:^2.0.0" - getenv: "npm:^2.0.0" - glob: "npm:^13.0.0" - lan-network: "npm:^0.1.6" - minimatch: "npm:^9.0.0" - node-forge: "npm:^1.3.1" - npm-package-arg: "npm:^11.0.0" - ora: "npm:^3.4.0" - picomatch: "npm:^3.0.1" - pretty-bytes: "npm:^5.6.0" - pretty-format: "npm:^29.7.0" - progress: "npm:^2.0.3" - prompts: "npm:^2.3.2" - qrcode-terminal: "npm:0.11.0" - require-from-string: "npm:^2.0.2" - requireg: "npm:^0.2.2" - resolve: "npm:^1.22.2" - resolve-from: "npm:^5.0.0" - resolve.exports: "npm:^2.0.3" - semver: "npm:^7.6.0" - send: "npm:^0.19.0" - slugify: "npm:^1.3.4" - source-map-support: "npm:~0.5.21" - stacktrace-parser: "npm:^0.1.10" - structured-headers: "npm:^0.4.1" - tar: "npm:^7.5.2" - terminal-link: "npm:^2.1.1" - undici: "npm:^6.18.2" - wrap-ansi: "npm:^7.0.0" - ws: "npm:^8.12.1" - peerDependencies: - expo: "*" - expo-router: "*" - react-native: "*" - peerDependenciesMeta: - expo-router: - optional: true - react-native: - optional: true + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 + languageName: node + linkType: hard + +"@evilmartians/lefthook@npm:^1.5.0": + version: 1.13.6 + resolution: "@evilmartians/lefthook@npm:1.13.6" bin: - expo-internal: build/bin/cli - checksum: 10/9a84554d120759be74ee84e2d9e31d7279e67c5992ace7ba51871815169b552f3b30cb6715a9c3685717bde32756e45dbeae6d5200f75b7d2ea877f5f80172e3 + lefthook: bin/index.js + checksum: 10/d3a564d9c9f7db61fe01530e6d15817b29a067c0df2989a5cc8cbd5e4bdcfe7d3ca406980733076d7a3888883d0b7a2ca9e0a8aae36b670df38226fccc7c7753 + conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=ia32) languageName: node linkType: hard -"@expo/cli@npm:54.0.22": - version: 54.0.22 - resolution: "@expo/cli@npm:54.0.22" +"@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.6" @@ -2533,17 +2462,7 @@ __metadata: optional: true bin: expo-internal: build/bin/cli - checksum: 10/c20c89f5737e1f5b055567d6b560a920ea52ed17cab73fd5ab59d8f1640c62f7a9915d9d69eb0c5ebc85bd04505e3ac32ba329ab8f1e15da8a9fcd6c6dd8d808 - 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" - dependencies: - node-forge: "npm:^1.2.1" - nullthrows: "npm:^1.1.1" - checksum: 10/6783721e2eafff5547500eaf99bee54641f076dc7221e52b48f1494f993040d779fe13ae7d95d3874c483eb545cafbf692315e2da0b0fc24e7a477b84e289617 + checksum: 10/9a41c55aa7f628ad44048c9f41cd8d7f4f73a8bfc01adaa956ddaae87d332ae979eadb52bdab894ef5b1c9b5722486ccdb999057d8b9eed392c827f476feb79f languageName: node linkType: hard @@ -2556,28 +2475,6 @@ __metadata: languageName: node linkType: hard -"@expo/config-plugins@npm:~54.0.3": - version: 54.0.3 - resolution: "@expo/config-plugins@npm:54.0.3" - dependencies: - "@expo/config-types": "npm:^54.0.9" - "@expo/json-file": "npm:~10.0.7" - "@expo/plist": "npm:^0.4.7" - "@expo/sdk-runtime-versions": "npm:^1.0.0" - chalk: "npm:^4.1.2" - debug: "npm:^4.3.5" - getenv: "npm:^2.0.0" - glob: "npm:^13.0.0" - resolve-from: "npm:^5.0.0" - semver: "npm:^7.5.4" - slash: "npm:^3.0.0" - slugify: "npm:^1.6.6" - xcode: "npm:^3.0.1" - xml2js: "npm:0.6.0" - checksum: 10/5eb33583eba8ba87ad19f4775749864fd72fe251be1b9bb1b765f0499fd36d21a7dd936f53c36368454726b72b0a8ea99b1e315bd6c005de1f4541bafb57d1c6 - languageName: node - linkType: hard - "@expo/config-plugins@npm:~54.0.4": version: 54.0.4 resolution: "@expo/config-plugins@npm:54.0.4" @@ -2607,34 +2504,6 @@ __metadata: 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 - languageName: node - linkType: hard - -"@expo/config@npm:~12.0.11": - version: 12.0.11 - resolution: "@expo/config@npm:12.0.11" - 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" - deepmerge: "npm:^4.3.1" - getenv: "npm:^2.0.0" - glob: "npm:^13.0.0" - require-from-string: "npm:^2.0.2" - resolve-from: "npm:^5.0.0" - resolve-workspace-root: "npm:^2.0.0" - semver: "npm:^7.6.0" - slugify: "npm:^1.3.4" - sucrase: "npm:~3.35.1" - checksum: 10/c749457b50a5c2531c5fb7d29c343a7761081f7218199ab65524ff8ab9edb36f5903cde6a35fbd95b792e537a7c4183362bb9061a1bdedff8aae4d731171e4f5 - languageName: node - linkType: hard - "@expo/config@npm:~12.0.13": version: 12.0.13 resolution: "@expo/config@npm:12.0.13" @@ -2683,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 @@ -2718,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" @@ -2727,65 +2596,18 @@ __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 - 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" - dependencies: - "@babel/code-frame": "npm:~7.10.4" - json5: "npm:^2.2.3" - checksum: 10/d744edb72ea5a52d8829357fb2adb93be3181a522e3b6b8dc3a32a448c9c76eca603f8a390f1a126f4b16c21a470e0c1b2dde0bcd2cb799d97178e48df93a3b3 - languageName: node - linkType: hard - -"@expo/json-file@npm:^10.0.9, @expo/json-file@npm:~10.0.8": - version: 10.0.9 - resolution: "@expo/json-file@npm:10.0.9" - dependencies: - "@babel/code-frame": "npm:~7.10.4" - json5: "npm:^2.2.3" - checksum: 10/40c758fcdb37b35aa5ca43acd2c882763f073672ccaf53038bf94100a5c511ff90e0d1f900a4c49394ae968bdbabbedfc39f961b7d60a47abecb8ec55c6863da + checksum: 10/fb474558bb4009f39c640fb028a57cfae721e52dae0085bb2505390c6968d30cdc82eb195c15de82f30879c710104c08e60120de8f49613183437701f19dd363 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/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.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/spawn-async": "npm:^1.7.2" - browserslist: "npm:^4.25.0" - chalk: "npm:^4.1.0" - debug: "npm:^4.3.2" - dotenv: "npm:~16.4.5" - dotenv-expand: "npm:~11.0.6" - getenv: "npm:^2.0.0" - glob: "npm:^13.0.0" - hermes-parser: "npm:^0.29.1" - jsc-safe-url: "npm:^0.2.4" - lightningcss: "npm:^1.30.1" - minimatch: "npm:^9.0.0" - postcss: "npm:~8.4.32" - resolve-from: "npm:^5.0.0" - peerDependencies: - expo: "*" - peerDependenciesMeta: - expo: - optional: true - checksum: 10/4a2fc2eea0cdc88f52d29d0a70fdb315bdbcc7b5300cb64afcc6a2a756db01449b3a60e401fc662ea13b441dc2287d1b492524ac7e6dece0c23d6d7105e2ebdf + json5: "npm:^2.2.3" + checksum: 10/547f5b9d1c5b10147ef0780d079d853e3b2e8ec0b09080420cb48592060a4399308622fd205aaec5e157c41d37c5b69dffa9aaa96c01fe444b0258f78c3bb85f languageName: node linkType: hard @@ -2843,26 +2665,6 @@ __metadata: languageName: node linkType: hard -"@expo/metro@npm:~54.1.0": - version: 54.1.0 - resolution: "@expo/metro@npm:54.1.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 - languageName: node - linkType: hard - "@expo/metro@npm:~54.2.0": version: 54.2.0 resolution: "@expo/metro@npm:54.2.0" @@ -2886,44 +2688,29 @@ __metadata: 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.10": - version: 1.10.0 - resolution: "@expo/package-manager@npm:1.10.0" - dependencies: - "@expo/json-file": "npm:^10.0.9" - "@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/61dc892764f886fc9bf4b957fbc8b686fc941f2ceb008428752070f61cd44a40bd4d48bef594b3169eacb389d9e44f86c6b0003da8ef1c8ab3948dfd88875328 - languageName: node - linkType: hard - -"@expo/package-manager@npm:^1.9.9": - version: 1.9.9 - resolution: "@expo/package-manager@npm:1.9.9" + 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: @@ -2934,26 +2721,6 @@ __metadata: languageName: node linkType: hard -"@expo/prebuild-config@npm:^54.0.7": - version: 54.0.7 - resolution: "@expo/prebuild-config@npm:54.0.7" - dependencies: - "@expo/config": "npm:~12.0.11" - "@expo/config-plugins": "npm:~54.0.3" - "@expo/config-types": "npm:^54.0.9" - "@expo/image-utils": "npm:^0.8.8" - "@expo/json-file": "npm:^10.0.8" - "@react-native/normalize-colors": "npm:0.81.5" - debug: "npm:^4.3.1" - resolve-from: "npm:^5.0.0" - semver: "npm:^7.6.0" - xml2js: "npm:0.6.0" - peerDependencies: - expo: "*" - checksum: 10/6194661c2531041d1f5cc141f07fb2ddf8a558110732d8dcccfe8c7887345f28756bfd2c72fd72da364db274dde7d11fc77b8f39eace18cb215b8364997910c1 - languageName: node - linkType: hard - "@expo/prebuild-config@npm:^54.0.8": version: 54.0.8 resolution: "@expo/prebuild-config@npm:54.0.8" @@ -3023,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 @@ -3053,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 @@ -3084,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" @@ -3114,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" @@ -3444,11 +3201,11 @@ __metadata: linkType: hard "@kesha-antonov/react-native-background-downloader@npm:^4.4.5": - version: 4.4.5 - resolution: "@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/56c90b08f5efdbc017a373dd3358470b5879f1ccb28b9a25df6b725fb6cc534d7d60c989167e07774f4c8bca530b22ed383322f5f105f8bd58bac2d85914c548 + checksum: 10/2543563caa62aa9362ef4c37dcb11f4b762cb9803869bbdf5a45260c2bbb3ae68336450920594f768ea29500dd6fe04958cbf07a90620617737df5862718343e languageName: node linkType: hard @@ -3910,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" @@ -4031,60 +3788,61 @@ __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 @@ -4145,6 +3903,16 @@ __metadata: languageName: node linkType: hard +"@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" @@ -4200,6 +3968,61 @@ __metadata: languageName: node linkType: hard +"@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" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" + "@babel/plugin-transform-class-properties": "npm:^7.25.4" + "@babel/plugin-transform-classes": "npm:^7.25.4" + "@babel/plugin-transform-computed-properties": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" + "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" + "@babel/plugin-transform-for-of": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" + "@babel/plugin-transform-literals": "npm:^7.25.2" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-react-display-name": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx": "npm:^7.25.2" + "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" + "@babel/plugin-transform-regenerator": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" + "@babel/plugin-transform-spread": "npm:^7.24.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" + "@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.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/930604718f04852f9626080b2f524f7b0b652a2a9bb625192e391c5269cc36dce23fe863784b9100b153ac50809895904ce0a4fb044c7b8a73ec2ac47920339b + languageName: node + linkType: hard + "@react-native/codegen@npm:0.81.5": version: 0.81.5 resolution: "@react-native/codegen@npm:0.81.5" @@ -4217,6 +4040,23 @@ __metadata: languageName: node linkType: hard +"@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" + glob: "npm:^7.1.1" + hermes-parser: "npm:0.29.1" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + yargs: "npm:^17.6.2" + peerDependencies: + "@babel/core": "*" + checksum: 10/a1d5e9dfd9f70248fb6f592ff9477d20bf00542517859eb4eff543bbf48b5a2e0fa2e876502248ae3e1db6777d3af8cab0f8c2784191f49c625bf5d63d66b125 + languageName: node + linkType: hard + "@react-native/community-cli-plugin@npm:0.81.5": version: 0.81.5 resolution: "@react-native/community-cli-plugin@npm:0.81.5" @@ -4310,29 +4150,36 @@ __metadata: languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/metro-babel-transformer@npm:0.81.5" +"@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.81.5" + "@react-native/babel-preset": "npm:0.81.6" hermes-parser: "npm:0.29.1" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/401cd5e396a0c04865164c8321c29c17b9cdfbfef5efdf771befb77f830fd28c0bafe116f6d51930e684372f37b4a47f143a404341780187ae9e9fab0da39af4 + checksum: 10/4724d7cd7290b40f14d0cd40f5fb73955260d0494acdfd20cef2bb863514fbf50f62286b1ccc5e769d1fe96a62a55f520f263b45f2a62d0ea57db95a40e9e21a languageName: node linkType: hard "@react-native/metro-config@npm:^0.81.5": - version: 0.81.5 - resolution: "@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.81.5" - "@react-native/metro-babel-transformer": "npm:0.81.5" + "@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/13af9cb8f743e8ae51fe0c77db4c61070ef31074b985911ad03b53ec79985f3ba261f1b0026bc62b1b070a3954c8928b73d2d956fc13bad6ece3699b3f5d7254 + checksum: 10/0e39fa974a61f51172f6bae6b5bc90cbefb104685acbbd68e7886bc7687fda11d533ddbec22538e2a4981b626cbc710b34ad6e0a49b866f8d870c22b926fcb9b languageName: node linkType: hard @@ -4361,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" @@ -4391,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" @@ -4465,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" @@ -4495,7 +4342,7 @@ __metadata: optional: true bin: setup-skia-web: scripts/setup-canvaskit.js - checksum: 10/2543664085470267a9a6491ee90760f01d258cdd97cda5955d0c9f980ad57d647dffa5670f9d5d5f8cd6180ff46fe1df6f4281ae2e0b5c3632c703479b6a7608 + checksum: 10/cb0274dadb89046b357fb9cf071349f2e6c348ca3ea18360a791e084a1456c729de862d2cda3c0b81b306faebbbf2b63a91380ca2de3298266f0aa248f12d434 languageName: node linkType: hard @@ -4523,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 @@ -4828,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 @@ -4845,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: @@ -4854,15 +4701,6 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:~19.2.0": - version: 19.2.13 - resolution: "@types/react@npm:19.2.13" - dependencies: - csstype: "npm:^3.2.2" - checksum: 10/a3bb8d09c79f5f29dfbc7e47c5b39c687f4329b76041713993c025781f32c26e4881fbeead65ff44d728945f222b781c6053263bc1819ef90596b4fbfd83f718 - languageName: node - linkType: hard - "@types/semver@npm:^7.3.12": version: 7.7.1 resolution: "@types/semver@npm:7.7.1" @@ -5118,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 @@ -5154,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: @@ -5211,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" @@ -5347,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 @@ -5559,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 @@ -5576,22 +5426,34 @@ __metadata: version: 0.13.0 resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" - core-js-compat: "npm:^3.43.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/aa36f9a09521404dd0569a4cbd5f88aa4b9abff59508749abde5d09d66c746012fb94ed1e6e2c8be3710939a2a4c6293ee3be889125d7611c93e5897d9e5babd + languageName: node + linkType: hard + +"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.6" + core-js-compat: "npm:^3.48.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/aa36f9a09521404dd0569a4cbd5f88aa4b9abff59508749abde5d09d66c746012fb94ed1e6e2c8be3710939a2a4c6293ee3be889125d7611c93e5897d9e5babd + checksum: 10/09c854a3bda9a930fbce4b80d52a24e5b0744fccb0c81bf8f470d62296f197a2afe111b2b9ecb0d8a47068de2f938d14b748295953377e47594b0673d53c9396 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-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.5" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/ed1932fa9a31e0752fd10ebf48ab9513a654987cab1182890839523cb898559d24ae0578fdc475d9f995390420e64eeaa4b0427045b56949dace3c725bc66dbb + checksum: 10/8de7ea32856e75784601cacf8f4e3cbf04ce1fd05d56614b08b7bbe0674d1e59e37ccaa1c7ed16e3b181a63abe5bd43a1ab0e28b8c95618a9ebf0be5e24d6b25 languageName: node linkType: hard @@ -5702,45 +5564,6 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~54.0.8": - version: 54.0.8 - resolution: "babel-preset-expo@npm:54.0.8" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/plugin-proposal-decorators": "npm:^7.12.9" - "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" - "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" - "@babel/plugin-transform-class-static-block": "npm:^7.27.1" - "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" - "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.24.7" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-runtime": "npm:^7.24.7" - "@babel/preset-react": "npm:^7.22.15" - "@babel/preset-typescript": "npm:^7.23.0" - "@react-native/babel-preset": "npm:0.81.5" - babel-plugin-react-compiler: "npm:^1.0.0" - babel-plugin-react-native-web: "npm:~0.21.0" - babel-plugin-syntax-hermes-parser: "npm:^0.29.1" - babel-plugin-transform-flow-enums: "npm:^0.0.2" - debug: "npm:^4.3.4" - resolve-from: "npm:^5.0.0" - peerDependencies: - "@babel/runtime": ^7.20.0 - expo: "*" - react-refresh: ">=0.14.0 <1.0.0" - peerDependenciesMeta: - "@babel/runtime": - optional: true - expo: - optional: true - checksum: 10/7ecd779623fb80cb6eb559dc1b8fcf54e6128bff412336875fb97159abc847ed9aa8f04862d3f5054fbce844ee3fbaac2af16a65ddf26ab92f3855bab86bd57c - languageName: node - linkType: hard - "babel-preset-jest@npm:^29.6.3": version: 29.6.3 resolution: "babel-preset-jest@npm:29.6.3" @@ -5760,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" @@ -5768,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 @@ -5883,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" @@ -5892,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: @@ -6055,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 @@ -6399,20 +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 + version: 1.4.5 + resolution: "comment-parser@npm:1.4.5" + checksum: 10/4b5cacc7ab1ec48e3f51b788bd7cda567f5c83040e029e5c92eacf0785735a9b44ac49fdaf73d9bd4af9464aa4cc8cc7184902090b55b0023605a845f2666ba4 languageName: node linkType: hard @@ -6445,14 +6286,16 @@ __metadata: resolution: "computer-vision@workspace:apps/computer-vision" dependencies: "@babel/core": "npm:^7.25.2" + "@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" @@ -6460,18 +6303,22 @@ __metadata: expo-status-bar: "npm:~3.0.9" 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 @@ -6501,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 @@ -6598,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" @@ -6877,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: @@ -6906,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 @@ -6929,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 @@ -7197,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 @@ -7326,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" @@ -7393,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 @@ -7412,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 @@ -7444,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: @@ -7584,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" @@ -7599,7 +7439,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10/5e39e3b7046d4ba0e1111cc2048630ee9d0aa5d5bb00d6230bef56893fdae37cbe2261babfb26db350cc2ad517c81d283b3f8b04cfee4e5aef7cd4bee72f90de + checksum: 10/36c22c2fa2fd7c61ed292af1280e1d8f94dfe1671eacc5a503a249ca4b27fd226dbf6a1820457d611915926946f42729488d2dc7a5c320601e6cf1fad0d28f66 languageName: node linkType: hard @@ -7762,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 @@ -7814,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" @@ -7875,7 +7708,7 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:12.0.11, expo-asset@npm:~12.0.11": +"expo-asset@npm:12.0.11": version: 12.0.11 resolution: "expo-asset@npm:12.0.11" dependencies: @@ -7913,30 +7746,29 @@ __metadata: languageName: node linkType: hard -"expo-calendar@npm:~15.0.8": - version: 15.0.8 - resolution: "expo-calendar@npm:15.0.8" +"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: "*" - react-native: "*" - checksum: 10/7a8538af25f3784467b56a352726c7c3e19d0caecff6a0ed9e0946000dbab0f38f8386b8bb38b35f2d384c66dda5dff3984376eb1282ab6775f75f500abd4b7c + checksum: 10/0dde41d659d243268ceae49bba3e4c07b72c245df8124f86fb720bc0556a2c4d03dd75e59e068a07438ef5ba3188b67a7a6516d2a37d3d91429070745b2506a2 languageName: node linkType: hard -"expo-constants@npm:~18.0.11": - version: 18.0.11 - resolution: "expo-constants@npm:18.0.11" - dependencies: - "@expo/config": "npm:~12.0.11" - "@expo/env": "npm:~2.0.8" +"expo-calendar@npm:~15.0.8": + version: 15.0.8 + resolution: "expo-calendar@npm:15.0.8" peerDependencies: expo: "*" react-native: "*" - checksum: 10/4da78ce638b417d1cb958b8f7c56a54a84cd1cd600d8e62751a32ca858b130e8fe1db7d97acc765d667e7668e401247016b62bfc88cd8624cc92e2345bbd4cb8 + checksum: 10/7a8538af25f3784467b56a352726c7c3e19d0caecff6a0ed9e0946000dbab0f38f8386b8bb38b35f2d384c66dda5dff3984376eb1282ab6775f75f500abd4b7c languageName: node linkType: hard -"expo-constants@npm:~18.0.12, expo-constants@npm:~18.0.13": +"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: @@ -7959,30 +7791,7 @@ __metadata: languageName: node linkType: hard -"expo-file-system@npm:~19.0.20": - version: 19.0.20 - resolution: "expo-file-system@npm:19.0.20" - peerDependencies: - expo: "*" - react-native: "*" - checksum: 10/c0ead2eb2f97840fea54f88bcc41f0094d5bef19b6261d768bdaa9fd06e5accf40ce49fe183f84d7042484b7595319cf37691123b699b0f2b00c81068582fbe9 - languageName: node - linkType: hard - -"expo-font@npm:~14.0.10": - version: 14.0.10 - resolution: "expo-font@npm:14.0.10" - dependencies: - fontfaceobserver: "npm:^2.1.0" - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - checksum: 10/3fb7d87c75c818c3c8503d43f9e13b3d237f2e128bcb59e09b8fdad3eaf1aece2ab89030d5cffbeb5b172d7b030df627e4319b0fdd97e6f6d57e27bbdb520f22 - languageName: node - linkType: hard - -"expo-font@npm:~14.0.11": +"expo-font@npm:~14.0.10, expo-font@npm:~14.0.11": version: 14.0.11 resolution: "expo-font@npm:14.0.11" dependencies: @@ -8006,30 +7815,15 @@ __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 - languageName: node - linkType: hard - -"expo-modules-autolinking@npm:3.0.23": - version: 3.0.23 - resolution: "expo-modules-autolinking@npm:3.0.23" - dependencies: - "@expo/spawn-async": "npm:^1.7.2" - chalk: "npm:^4.1.0" - commander: "npm:^7.2.0" - require-from-string: "npm:^2.0.2" - resolve-from: "npm:^5.0.0" - bin: - expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10/d16b686a2f8a1b665e2d3bd98c60c94d4a276c24367c8a0bf6d7c81e5ec3c6ac24cec811bc3fc8ec440d7a98355e1123cf9ab3cc830500f325be9a742b50efcb + checksum: 10/b43851e173e5b2b21ac7cfc1fef05ae1cb39209c82af73943abb1e701a767e3759cf4a85e47bb181ab8a0c7b080f9b9d9b7d52f6c54f620f06dad7848e05f336 languageName: node linkType: hard @@ -8048,18 +7842,6 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:3.0.28": - version: 3.0.28 - resolution: "expo-modules-core@npm:3.0.28" - dependencies: - invariant: "npm:^2.2.4" - peerDependencies: - react: "*" - react-native: "*" - checksum: 10/9ee68a2f75b7658d05de3ed54be9039e7a248a1c89ca1bf582d1635d2fff50ac0ac6de7a1d2b315aca5df432f0d67064d2cd2ad63ee2b5cb30c9f738fb92a9c7 - languageName: node - linkType: hard - "expo-modules-core@npm:3.0.29": version: 3.0.29 resolution: "expo-modules-core@npm:3.0.29" @@ -8073,8 +7855,8 @@ __metadata: 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" @@ -8104,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: "*" @@ -8114,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 @@ -8130,7 +7912,7 @@ __metadata: optional: true react-server-dom-webpack: optional: true - checksum: 10/3d6e6774add5c84045bc07843c09e4e0f25eb65de5cee6d13f53ff61c2daefb47106db70308d0cead96e9166a31faa8cb94eccc23e57f21e9d9446e6f9c9a6fb + checksum: 10/37b92fb8adc038ff5813298235a66bd22ac9a6002d5f016f3ceefa3f96e59910de6e069f0a27b9c23f6b2b40171a6589d31ad944cfe85171a4484937e981676d languageName: node linkType: hard @@ -8153,12 +7935,12 @@ __metadata: languageName: node linkType: hard -"expo@npm:^54.0.0": - version: 54.0.32 - resolution: "expo@npm:54.0.32" +"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.22" + "@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" @@ -8195,53 +7977,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10/78c9b88b98bcf424c00ffdd399b77e6fbf34f2c26a3d420e731bfccd9cdfb54e95f27b539d071155c4144ae7157e2700f9d22d4b2816974b20f8fcf0675bbb05 - languageName: node - linkType: hard - -"expo@npm:^54.0.27": - version: 54.0.27 - resolution: "expo@npm:54.0.27" - 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/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/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" - expo-keep-awake: "npm:~15.0.8" - expo-modules-autolinking: "npm:3.0.23" - expo-modules-core: "npm:3.0.28" - pretty-format: "npm:^29.7.0" - react-refresh: "npm:^0.14.2" - whatwg-url-without-unicode: "npm:8.0.0-3" - peerDependencies: - "@expo/dom-webview": "*" - "@expo/metro-runtime": "*" - react: "*" - react-native: "*" - react-native-webview: "*" - peerDependenciesMeta: - "@expo/dom-webview": - optional: true - "@expo/metro-runtime": - optional: true - react-native-webview: - optional: true - bin: - expo: bin/cli - expo-modules-autolinking: bin/autolinking - fingerprint: bin/fingerprint - checksum: 10/58917b6a363d8908395cf283f1e72f5e5c253619e297896160dafe1d18acb8feb46b76d880d9b52c96954aebe78f7069cf623726ad8921d431d07f9527a0699f + checksum: 10/ed672f78333cf50545ea1cca8181506604150cca01a8aae782da30ddcba185d68f2d48f2ca10dee575a7abbc7913cca3f4c3d34d98373b0e9706b344030fa929 languageName: node linkType: hard @@ -8267,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 @@ -8300,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" @@ -8312,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 @@ -8478,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 @@ -8712,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 @@ -8745,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" @@ -8968,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" @@ -9141,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 @@ -9155,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 @@ -9624,10 +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 +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10/2ead327ef596042ef9c9ec5f236b316acfaedb87f4bb61b3c3d574fb2e9c8a04b67305e04733bde52c24d9622fdebd3270aadb632adfbf9cadef88fe30f479e5 languageName: node linkType: hard @@ -9696,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: @@ -9723,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" @@ -10256,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" @@ -10298,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 @@ -10394,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 @@ -10510,7 +10247,7 @@ __metadata: optional: true lightningcss-win32-x64-msvc: optional: true - checksum: 10/d6cc06d9bac295589a49446e9c45a241dfa16f4f81a7318c26cbc0be3e189003ec0da5d9a0fd9bdffc63a3ce05878cc7329277eaac77a826e8b68c73dc96cfda + checksum: 10/3c2b2c2f648b12d9cba623d2e558f74fcce35911077e3d33f97ed521e0ad7a84e2c814628f6e16f64095c4483f6b180dee7b2e441b3ff5f44d142a510785a0c6 languageName: node linkType: hard @@ -10606,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 @@ -10672,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 @@ -10870,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" @@ -10903,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" @@ -10932,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" @@ -10972,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" @@ -11015,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" @@ -11054,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" @@ -11098,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" @@ -11169,19 +10819,10 @@ __metadata: "metro-resolver@npm:0.81.5": version: 0.81.5 - resolution: "metro-resolver@npm:0.81.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/3f20592755ac52db973a8c111adddad7430322b0b27c5d3d2cf2e2ff73e0693922f98b32a9a46941abc97b604cfb116b0e42c64f005e5c002460fe141a4e5847 - languageName: node - linkType: hard - -"metro-resolver@npm:0.83.2": - version: 0.83.2 - resolution: "metro-resolver@npm:0.83.2" + resolution: "metro-resolver@npm:0.81.5" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/2ba0cdda5c5a3ddac72fd486a310892638ba7d67a736246ec128674dfa6217d6169bdd0f811874435eae37f0201d72735fe7dddfc0c83a9e1439f05994bc293a + checksum: 10/3f20592755ac52db973a8c111adddad7430322b0b27c5d3d2cf2e2ff73e0693922f98b32a9a46941abc97b604cfb116b0e42c64f005e5c002460fe141a4e5847 languageName: node linkType: hard @@ -11204,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" @@ -11242,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" @@ -11294,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" @@ -11340,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" @@ -11389,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" @@ -11481,56 +11043,6 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.83.2": - version: 0.83.2 - resolution: "metro@npm:0.83.2" - 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:^4.4.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" - 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" - 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/524c0f98ce8be619a345f58c39d19e6d0e5745dfd156c9b0a06201e6d9ad59e4405922f09f56fe92a86df9e06b0e89b173a3136640f1ec69c395b9ca34c1b042 - languageName: node - linkType: hard - "metro@npm:0.83.3, metro@npm:^0.83.1": version: 0.83.3 resolution: "metro@npm:0.83.3" @@ -11892,12 +11404,12 @@ __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 @@ -11936,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 @@ -11968,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 @@ -12097,7 +11609,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1.2.1, node-forge@npm:^1.3.1, node-forge@npm:^1.3.3": +"node-forge@npm:^1.3.3": version: 1.3.3 resolution: "node-forge@npm:1.3.3" checksum: 10/f41c31b9296771a4b8c955d58417471712f54f324603a35f8e6cbac19d5e6eaaf5fd5fd14584dfedecbf46a05438ded6eee60a5f2f0822fc5061aaa073cfc75d @@ -12105,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" @@ -12115,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 @@ -12209,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" @@ -12298,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 @@ -12728,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 @@ -12931,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 @@ -13010,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" @@ -13041,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 @@ -13072,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" @@ -13094,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 @@ -13112,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" @@ -13123,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 @@ -13131,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" @@ -13190,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" @@ -13200,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: @@ -13235,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 @@ -13298,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" @@ -13309,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 @@ -13327,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" @@ -13350,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" @@ -13641,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 @@ -13664,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: @@ -13699,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: @@ -13837,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 @@ -13866,6 +13410,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.7.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" + bin: + semver: bin/semver.js + checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 + languageName: node + linkType: hard + "semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -13875,6 +13428,15 @@ __metadata: languageName: node 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.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10/26bdc6d58b29528f4142d29afb8526bc335f4fc04c4a10f2b98b217f277a031c66736bf82d3d3bb354a2f6a3ae50f18fd62b053c4ac3f294a3d10a61f5075b75 + languageName: node + linkType: hard + "semver@npm:~7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" @@ -13884,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" @@ -13915,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 @@ -13934,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 @@ -13996,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 @@ -14274,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 @@ -14307,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" @@ -14352,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" @@ -14624,32 +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 + checksum: 10/0d6938dd32fe5c0f17c8098d92bd9889ee0ed9d11f12381b8146b6e8c87bb5aa49feec7abc42463f0597503d8e89e4c4c0b42bff1a5a38444e918b4878b7fd21 languageName: node linkType: hard @@ -14664,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" @@ -14673,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 @@ -14774,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 @@ -14976,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 @@ -15031,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" @@ -15080,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" @@ -15089,7 +14614,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/ae2102d3c83fca35e9deb012d82bfde6f734998ced937e34a3bf239a4b67577108fdd144283aafc0e5e3cf38ca1aecd7714906ba6f562896c762d2f2fa391026 + checksum: 10/059f774300efb4b084a49293143c511f3ae946d40397b5c30914e900cd5691a12b8e61b41dd54ed73d3b56c8204165a0333107dd784ccf8f8c81790bcc423175 languageName: node linkType: hard @@ -15336,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" @@ -15346,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 @@ -15362,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 @@ -15461,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" @@ -15471,7 +14996,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + checksum: 10/26e4901e93abaf73af9f26a93707c95b4845e91a7a347ec8c569e6e9be7f9df066f6c2b817b2d685544e208207898a750b78461e6e8d810c11a370771450c31b languageName: node linkType: hard @@ -15623,4 +15148,4 @@ __metadata: resolution: "zod@npm:3.25.76" checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995 languageName: node - linkType: hard + linkType: hard \ No newline at end of file From e4e0f95031cd56477eee933a695cabe2ed44315f Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Mon, 16 Feb 2026 11:22:16 +0100 Subject: [PATCH 05/16] feat: remove unused bindJSIMethods --- .../src/modules/BaseModule.ts | 16 ---------------- .../computer_vision/ObjectDetectionModule.ts | 1 - 2 files changed, 17 deletions(-) diff --git a/packages/react-native-executorch/src/modules/BaseModule.ts b/packages/react-native-executorch/src/modules/BaseModule.ts index 315b82249..0870a30b6 100644 --- a/packages/react-native-executorch/src/modules/BaseModule.ts +++ b/packages/react-native-executorch/src/modules/BaseModule.ts @@ -102,20 +102,4 @@ export abstract class BaseModule { this.nativeModule.unload(); } } - - /** - * Bind JSI methods to this instance for worklet compatibility. - * - * This makes native JSI functions accessible from worklet threads, - * which is essential for VisionCamera frame processing. - * - * @internal - */ - protected bindJSIMethods() { - if (this.nativeModule && this.nativeModule.generateFromFrame) { - // Bind the native JSI method directly to this instance - // This makes it worklet-compatible since JSI functions work across threads - this.generateFromFrame = this.nativeModule.generateFromFrame; - } - } } 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 95b9e436b..78dfed4f6 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts @@ -28,7 +28,6 @@ export class ObjectDetectionModule extends BaseModule { onDownloadProgressCallback, model.modelSource ); - if (!paths?.[0]) { throw new RnExecutorchError( RnExecutorchErrorCode.DownloadInterrupted, From 3527d0186edaa851771acd17f9c65336724a1a1b Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Tue, 17 Feb 2026 13:05:14 +0100 Subject: [PATCH 06/16] feat: initial version of vision model API --- .cspell-wordlist.txt | 3 +- .../app/object_detection/index.tsx | 167 +++++++++++++++++- .../rnexecutorch/RnExecutorchInstaller.h | 12 +- .../host_objects/ModelHostObject.h | 21 ++- .../metaprogramming/TypeConcepts.h | 9 +- .../rnexecutorch/models/VisionModel.cpp | 47 ++++- .../common/rnexecutorch/models/VisionModel.h | 42 ++++- .../models/embeddings/image/ImageEmbeddings.h | 2 +- .../image_segmentation/ImageSegmentation.cpp | 2 +- .../image_segmentation/ImageSegmentation.h | 2 +- .../models/object_detection/ObjectDetection.h | 18 +- .../models/style_transfer/StyleTransfer.h | 2 +- .../tests/integration/ObjectDetectionTest.cpp | 25 +-- .../computer_vision/useObjectDetection.ts | 7 +- .../src/hooks/useModule.ts | 38 ++++ .../computer_vision/ObjectDetectionModule.ts | 24 +-- .../modules/computer_vision/VisionModule.ts | 154 ++++++++++++++++ .../src/types/objectDetection.ts | 73 +++++++- 18 files changed, 577 insertions(+), 71 deletions(-) create mode 100644 packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts diff --git a/.cspell-wordlist.txt b/.cspell-wordlist.txt index 7428cd147..1b30572a8 100644 --- a/.cspell-wordlist.txt +++ b/.cspell-wordlist.txt @@ -111,4 +111,5 @@ logprob RNFS pogodin kesha -antonov \ No newline at end of file +antonov +worklet 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/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h index d5c98763d..80b7d18b3 100644 --- a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h +++ b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h @@ -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/ModelHostObject.h b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h index a1ce8e8e8..bed4c9de2 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h @@ -45,10 +45,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) { @@ -155,10 +156,22 @@ template class ModelHostObject : public JsiHostObject { addFunctions(JSI_EXPORT_FUNCTION(ModelHostObject, promiseHostFunction<&Model::stream>, "stream")); + } + + // Register generateFromFrame for all VisionModel subclasses + if constexpr (meta::DerivedFromOrSameAs) { addFunctions(JSI_EXPORT_FUNCTION( ModelHostObject, synchronousHostFunction<&Model::streamStop>, "streamStop")); } + + // 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 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 index 671ed03c8..54c0adfd2 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -6,8 +6,8 @@ namespace models { using namespace facebook; -cv::Mat VisionModel::extractAndPreprocess(jsi::Runtime &runtime, - const jsi::Value &frameData) const { +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); @@ -16,5 +16,48 @@ cv::Mat VisionModel::extractAndPreprocess(jsi::Runtime &runtime, 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 index 11da49547..9ba5cf7e4 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h @@ -121,12 +121,48 @@ class VisionModel : public BaseModel { * responsible * @note Typical usage: * @code - * cv::Mat preprocessed = extractAndPreprocess(runtime, frameData); + * cv::Mat preprocessed = extractFromFrame(runtime, frameData); * auto tensor = image_processing::getTensorFromMatrix(dims, preprocessed); * @endcode */ - cv::Mat extractAndPreprocess(jsi::Runtime &runtime, - const jsi::Value &frameData) const; + 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 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/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.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/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/modules/computer_vision/ObjectDetectionModule.ts b/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts index 78dfed4f6..0818d9682 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/ObjectDetectionModule.ts @@ -3,15 +3,15 @@ import { ResourceSource } from '../../types/common'; import { Detection } from '../../types/objectDetection'; import { RnExecutorchErrorCode } from '../../errors/ErrorCodes'; import { parseUnknownError, RnExecutorchError } from '../../errors/errorUtils'; -import { BaseModule } from '../BaseModule'; import { Logger } from '../../common/Logger'; +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`. @@ -41,24 +41,4 @@ export class ObjectDetectionModule extends BaseModule { throw parseUnknownError(error); } } - - /** - * 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/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/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; } From f5527101c9355c82f4fcfb2eccb030532aec77a9 Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Tue, 17 Feb 2026 17:51:10 +0100 Subject: [PATCH 07/16] refactor: errors, logs, unnecessary comments, use existing TensorPtr --- .../app/object_detection/index.tsx | 61 +++++++------- apps/computer-vision/package.json | 9 ++- .../host_objects/JsiConversions.h | 19 +++++ .../host_objects/ModelHostObject.h | 62 +++++++++++++- .../rnexecutorch/models/VisionModel.cpp | 69 +++++++++------- .../rnexecutorch/utils/FrameExtractor.cpp | 63 +++++---------- .../rnexecutorch/utils/FrameProcessor.cpp | 80 +++++-------------- .../rnexecutorch/utils/FrameProcessor.h | 14 ++-- .../src/hooks/useModule.ts | 1 - .../modules/computer_vision/VisionModule.ts | 41 +++------- .../src/types/common.ts | 60 +++++++++----- .../src/types/objectDetection.ts | 6 -- 12 files changed, 256 insertions(+), 229 deletions(-) diff --git a/apps/computer-vision/app/object_detection/index.tsx b/apps/computer-vision/app/object_detection/index.tsx index 9e60589fb..54c0eb18f 100644 --- a/apps/computer-vision/app/object_detection/index.tsx +++ b/apps/computer-vision/app/object_detection/index.tsx @@ -13,7 +13,26 @@ 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 +// Helper function to convert BGRA to RGB +function convertBGRAtoRGB( + buffer: ArrayBuffer, + width: number, + height: number +): ArrayBuffer { + const source = new Uint8Array(buffer); + const rgb = new Uint8Array(width * height * 3); + + for (let i = 0; i < width * height; i++) { + // BGRA format: [B, G, R, A] → RGB: [R, G, B] + rgb[i * 3 + 0] = source[i * 4 + 2]; // R + rgb[i * 3 + 1] = source[i * 4 + 1]; // G + rgb[i * 3 + 2] = source[i * 4 + 0]; // B + } + + return rgb.buffer; +} + +// Helper function to convert image URI to raw RGB pixel data async function imageUriToPixelData( uri: string, targetWidth: number, @@ -29,32 +48,19 @@ async function imageUriToPixelData( const image = await Images.loadFromFileAsync(uri); const resized = image.resize(targetWidth, targetHeight); - // Get pixel data as ArrayBuffer (RGBA format) - const pixelData = resized.toRawPixelData(); + // Get pixel data as ArrayBuffer (BGRA format from NitroImage) + const rawPixelData = 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; + rawPixelData instanceof ArrayBuffer ? rawPixelData : rawPixelData.buffer; - console.log('Requested:', targetWidth, 'x', targetHeight); - console.log('Buffer size:', bufferSize); - console.log( - 'Actual dimensions:', - Math.round(actualWidth), - 'x', - Math.round(actualHeight) - ); + // Convert BGRA to RGB as required by the native API + const rgbBuffer = convertBGRAtoRGB(buffer, targetWidth, targetHeight); return { - data: buffer, - width: Math.round(actualWidth), - height: Math.round(actualHeight), - channels: 4, // RGBA + data: rgbBuffer, + width: targetWidth, + height: targetHeight, + channels: 3, // RGB }; } catch (error) { console.error('Error loading image with NitroImage:', error); @@ -106,12 +112,11 @@ export default function ObjectDetectionScreen() { if (imageUri && imageDimensions) { try { console.log('Converting image to pixel data...'); - // Resize to 640x640 to avoid memory issues - const intermediateSize = 640; + // Use original dimensions - let the model resize internally const pixelData = await imageUriToPixelData( imageUri, - intermediateSize, - intermediateSize + imageDimensions.width, + imageDimensions.height ); console.log('Running forward with pixel data...', { @@ -122,7 +127,7 @@ export default function ObjectDetectionScreen() { }); // Run inference using unified forward() API - const output = await ssdLite.forward(pixelData, 0.5); + const output = await ssdLite.forward(pixelData, 0.3); console.log('Pixel data result:', output.length, 'detections'); setResults(output); } catch (e) { diff --git a/apps/computer-vision/package.json b/apps/computer-vision/package.json index cce918197..3f47c357c 100644 --- a/apps/computer-vision/package.json +++ b/apps/computer-vision/package.json @@ -17,6 +17,7 @@ "@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", @@ -30,17 +31,19 @@ "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-nitro-image": "0.10.2", + "react-native-nitro-modules": "0.33.4", + "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-worklets": "^0.7.2" }, "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/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h b/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h index df9abbdef..b4409b0f2 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h @@ -360,6 +360,25 @@ inline jsi::Value getJsiValue(uint64_t val, jsi::Runtime &runtime) { return {runtime, bigInt}; } +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++) { + // 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, + 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]))); + } + return {runtime, array}; +} + inline jsi::Value getJsiValue(int val, jsi::Runtime &runtime) { return {runtime, val}; } 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 bed4c9de2..134393a4d 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h @@ -158,14 +158,12 @@ template class ModelHostObject : public JsiHostObject { "stream")); } - // Register generateFromFrame for all VisionModel subclasses if constexpr (meta::DerivedFromOrSameAs) { addFunctions(JSI_EXPORT_FUNCTION( ModelHostObject, synchronousHostFunction<&Model::streamStop>, "streamStop")); } - // Register generateFromPixels for models that support it if constexpr (meta::HasGenerateFromPixels) { addFunctions( JSI_EXPORT_FUNCTION(ModelHostObject, @@ -221,6 +219,66 @@ 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. diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp index 54c0adfd2..fd2c40ee8 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -1,4 +1,9 @@ #include "VisionModel.h" +#include +#include +#include +#include +#include #include namespace rnexecutorch { @@ -18,45 +23,47 @@ cv::Mat VisionModel::extractFromFrame(jsi::Runtime &runtime, 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(); + // PixelData follows TensorPtr structure (dataPtr, sizes, scalarType) + // Use JSI conversion helper to extract the data + auto tensorView = jsi::fromHostObject(runtime, pixelData); - // 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"); + // Validate dimensions: sizes must be [height, width, channels] + if (tensorView.sizes.size() != 3) { + char errorMessage[100]; + std::snprintf(errorMessage, sizeof(errorMessage), + "Invalid pixel data: sizes must have 3 elements " + "[height, width, channels], got %zu", + tensorView.sizes.size()); + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + errorMessage); } - auto arrayBuffer = dataValue.asObject(runtime).getArrayBuffer(runtime); - size_t expectedSize = width * height * channels; + int height = tensorView.sizes[0]; + int width = tensorView.sizes[1]; + int channels = tensorView.sizes[2]; - if (arrayBuffer.size(runtime) != expectedSize) { - throw std::runtime_error( - "ArrayBuffer size does not match width * height * channels"); + // Pixel data must be RGB (3 channels) and BYTE type + if (channels != 3) { + char errorMessage[100]; + std::snprintf(errorMessage, sizeof(errorMessage), + "Invalid pixel data: expected 3 channels (RGB), got %d", + channels); + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + errorMessage); } - // 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); + if (tensorView.scalarType != ScalarType::Byte) { + throw RnExecutorchError( + RnExecutorchErrorCode::InvalidUserInput, + "Invalid pixel data: scalarType must be BYTE (Uint8Array)"); + } - // Copy data from ArrayBuffer to cv::Mat - std::memcpy(image.data, arrayBuffer.data(runtime), expectedSize); + // Create cv::Mat directly from dataPtr (zero-copy view) + uint8_t *dataPtr = static_cast(tensorView.dataPtr); + cv::Mat image(height, width, CV_8UC3, dataPtr); - return image; + // Clone to own the data, since JS memory may be GC'd + return image.clone(); } } // namespace models diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp index f64855131..9fbbaeb74 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp @@ -1,4 +1,6 @@ #include "FrameExtractor.h" +#include +#include #include #ifdef __APPLE__ @@ -20,7 +22,8 @@ cv::Mat FrameExtractor::extractFromNativeBuffer(uint64_t bufferPtr) { #elif defined(__ANDROID__) return extractFromAHardwareBuffer(reinterpret_cast(bufferPtr)); #else - throw std::runtime_error("NativeBuffer not supported on this platform"); + throw RnExecutorchError(RnExecutorchErrorCode::NotSupported, + "NativeBuffer not supported on this platform"); #endif } @@ -40,41 +43,25 @@ cv::Mat FrameExtractor::extractFromCVPixelBuffer(void *pixelBuffer) { 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)); + char errorMessage[100]; + std::snprintf(errorMessage, sizeof(errorMessage), + "Unsupported CVPixelBuffer format: %u", pixelFormat); + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + errorMessage); } // Note: We don't unlock here - Vision Camera manages the lifecycle @@ -99,50 +86,36 @@ cv::Mat FrameExtractor::extractFromAHardwareBuffer(void *hardwareBuffer) { buffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr, &data); if (lockResult != 0) { - throw std::runtime_error("Failed to lock AHardwareBuffer"); + throw RnExecutorchError(RnExecutorchErrorCode::AccessFailed, + "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)); + char errorMessage[100]; + std::snprintf(errorMessage, sizeof(errorMessage), + "Unsupported AHardwareBuffer format: %u", desc.format); + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + errorMessage); } // Note: We don't unlock here - Vision Camera manages the lifecycle return mat; #else - throw std::runtime_error("AHardwareBuffer requires Android API 26+"); + throw RnExecutorchError(RnExecutorchErrorCode::NotSupported, + "AHardwareBuffer requires Android API 26+"); #endif // __ANDROID_API__ >= 26 } #endif // __ANDROID__ diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp index 02faa072d..087aec816 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp @@ -1,7 +1,8 @@ #include "FrameProcessor.h" #include "FrameExtractor.h" +#include +#include #include -#include namespace rnexecutorch { namespace utils { @@ -16,34 +17,21 @@ cv::Mat FrameProcessor::extractFrame(jsi::Runtime &runtime, // 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); + return extractFromNativeBuffer(runtime, frameData); } 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 on failure } } // 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( + throw RnExecutorchError( + RnExecutorchErrorCode::InvalidUserInput, "FrameProcessor: No valid frame data (neither nativeBuffer nor data " "property found)"); } @@ -52,8 +40,9 @@ 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"); + throw RnExecutorchError( + RnExecutorchErrorCode::InvalidUserInput, + "FrameProcessor: Frame data missing width or height property"); } int width = @@ -70,8 +59,7 @@ bool FrameProcessor::hasNativeBuffer(jsi::Runtime &runtime, } cv::Mat FrameProcessor::extractFromNativeBuffer(jsi::Runtime &runtime, - const jsi::Object &frameData, - int width, int height) { + const jsi::Object &frameData) { auto nativeBufferValue = frameData.getProperty(runtime, "nativeBuffer"); // Handle bigint pointer value from JavaScript @@ -79,15 +67,8 @@ cv::Mat FrameProcessor::extractFromNativeBuffer(jsi::Runtime &runtime, 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; + // Native buffer contains all metadata (width, height, format) + return FrameExtractor::extractFromNativeBuffer(bufferPtr); } cv::Mat FrameProcessor::extractFromArrayBuffer(jsi::Runtime &runtime, @@ -103,39 +84,22 @@ cv::Mat FrameProcessor::extractFromArrayBuffer(jsi::Runtime &runtime, 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; - } + return cv::Mat(height, width, CV_8UC4, data, stride); } 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; - } + return cv::Mat(height, width, CV_8UC3, data, stride); } 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)); + char errorMessage[200]; + std::snprintf( + errorMessage, sizeof(errorMessage), + "FrameProcessor: Unexpected buffer size - expected %zu or %zu bytes " + "per row, got %zu", + expectedRGBStride, expectedRGBAStride, stride); + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + errorMessage); } - - return frame; } } // namespace utils diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h index e37b5bfd6..0838b6594 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h @@ -45,8 +45,8 @@ class FrameProcessor { * * @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 + * @throws RnExecutorchError if neither nativeBuffer nor data is available + * @throws RnExecutorchError 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. @@ -62,7 +62,7 @@ class FrameProcessor { * * @return cv::Size with frame width and height * - * @throws std::runtime_error if width or height properties are missing + * @throws RnExecutorchError if width or height properties are missing */ static cv::Size getFrameSize(jsi::Runtime &runtime, const jsi::Object &frameData); @@ -81,15 +81,15 @@ class FrameProcessor { /** * @brief Extract frame from nativeBuffer pointer (zero-copy) * + * Native buffer contains all metadata (width, height, format), so no need to + * pass dimensions separately. + * * @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); + const jsi::Object &frameData); /** * @brief Extract frame from ArrayBuffer (with copy) diff --git a/packages/react-native-executorch/src/hooks/useModule.ts b/packages/react-native-executorch/src/hooks/useModule.ts index 2e6f0ce49..61a36bfda 100644 --- a/packages/react-native-executorch/src/hooks/useModule.ts +++ b/packages/react-native-executorch/src/hooks/useModule.ts @@ -6,7 +6,6 @@ interface Module { load: (...args: any[]) => Promise; forward: (...args: any[]) => Promise; delete: () => void; - nativeModule?: any; // JSI host object with native methods } interface ModuleConstructor { diff --git a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts index 06acf6654..72e797437 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts @@ -1,25 +1,7 @@ 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; -}; +import { Frame, PixelData, ScalarType } from '../../types/common'; /** * Base class for computer vision models that support multiple input types. @@ -74,8 +56,6 @@ export abstract class VisionModule extends BaseModule { nativeBuffer = frame.getNativeBuffer(); const frameData = { nativeBuffer: nativeBuffer.pointer, - width: frame.width, - height: frame.height, }; return nativeGenerateFromFrame(frameData, ...args); } finally { @@ -107,10 +87,9 @@ export abstract class VisionModule extends BaseModule { * * // Pixel data (async) * const result2 = await model.forward({ - * data: pixelBuffer, - * width: 640, - * height: 480, - * channels: 3 + * dataPtr: new Uint8Array(pixelBuffer), + * sizes: [480, 640, 3], + * scalarType: ScalarType.BYTE * }); * * // For VisionCamera frames, use runOnFrame in worklet: @@ -136,11 +115,13 @@ export abstract class VisionModule extends BaseModule { 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' + 'dataPtr' in input && + input.dataPtr instanceof Uint8Array && + 'sizes' in input && + Array.isArray(input.sizes) && + input.sizes.length === 3 && + 'scalarType' in input && + input.scalarType === ScalarType.BYTE ) { // Pixel data → generateFromPixels() return await this.nativeModule.generateFromPixels(input, ...args); diff --git a/packages/react-native-executorch/src/types/common.ts b/packages/react-native-executorch/src/types/common.ts index c8ace7f52..f50431943 100644 --- a/packages/react-native-executorch/src/types/common.ts +++ b/packages/react-native-executorch/src/types/common.ts @@ -138,34 +138,58 @@ export interface TensorPtr { } /** - * 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 + * Represents raw pixel data in RGB format for vision models. + * + * This type extends TensorPtr with constraints specific to image data: + * - dataPtr must be Uint8Array (8-bit unsigned integers) + * - scalarType is always BYTE (ScalarType.BYTE) + * - sizes represents [height, width, channels] where channels must be 3 (RGB) + * + * @category Types + * @example + * ```typescript + * const pixelData: PixelData = { + * dataPtr: new Uint8Array(width * height * 3), // RGB pixel data + * sizes: [height, width, 3], // [height, width, channels] + * scalarType: ScalarType.BYTE + * }; + * ``` */ -export interface FrameData { +export interface PixelData extends Omit { /** - * Raw pixel data as ArrayBuffer (requires memory copy). - * Use this for compatibility or when getNativeBuffer is not available. + * RGB pixel data as Uint8Array. + * Expected format: RGB (3 channels), not RGBA or BGRA. + * Size must equal: width * height * 3 */ - data?: ArrayBuffer | ArrayBufferLike; + dataPtr: Uint8Array; /** - * 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` + * Dimensions of the pixel data: [height, width, channels]. + * - sizes[0]: height (number of rows) + * - sizes[1]: width (number of columns) + * - sizes[2]: channels (must be 3 for RGB) */ - nativeBuffer?: bigint; + sizes: [number, number, 3]; /** - * Frame width in pixels + * Scalar type is always BYTE for pixel data. */ - width: number; + scalarType: ScalarType.BYTE; +} +/** + * 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 Frame { /** - * Frame height in pixels + * 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` */ - height: number; + getNativeBuffer(): { pointer: number; release(): void }; } diff --git a/packages/react-native-executorch/src/types/objectDetection.ts b/packages/react-native-executorch/src/types/objectDetection.ts index 2dddaad64..abb0142a7 100644 --- a/packages/react-native-executorch/src/types/objectDetection.ts +++ b/packages/react-native-executorch/src/types/objectDetection.ts @@ -237,10 +237,4 @@ export interface ObjectDetectionType { * @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; } From 62cfb016935443114afb27a03d7898d9b120bf4f Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Tue, 17 Feb 2026 17:51:37 +0100 Subject: [PATCH 08/16] fix: change Frame import in BaseModule --- packages/react-native-executorch/src/modules/BaseModule.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-native-executorch/src/modules/BaseModule.ts b/packages/react-native-executorch/src/modules/BaseModule.ts index 0870a30b6..41a2da6cf 100644 --- a/packages/react-native-executorch/src/modules/BaseModule.ts +++ b/packages/react-native-executorch/src/modules/BaseModule.ts @@ -1,4 +1,4 @@ -import { ResourceSource } from '../types/common'; +import { Frame, ResourceSource } from '../types/common'; import { TensorPtr } from '../types/common'; /** @@ -51,9 +51,9 @@ export abstract class BaseModule { * @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 + * @see {@link Frame} for frame data format details */ - public generateFromFrame!: (frameData: FrameData, ...args: any[]) => any; + public generateFromFrame!: (frameData: Frame, ...args: any[]) => any; /** * Load the model and prepare it for inference. From ff53e57635aa4ede6001e9567eaa6a0b3f56d64d Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Wed, 18 Feb 2026 12:49:15 +0100 Subject: [PATCH 09/16] feat: use TensorPtrish type for Pixel data input --- .../app/object_detection/index.tsx | 119 ++++++------------ .../rnexecutorch/models/VisionModel.cpp | 13 +- .../common/rnexecutorch/models/VisionModel.h | 29 ++--- .../rnexecutorch/utils/FrameExtractor.cpp | 2 +- .../rnexecutorch/utils/FrameProcessor.cpp | 12 +- .../modules/computer_vision/VisionModule.ts | 2 +- .../src/types/common.ts | 2 +- .../src/types/objectDetection.ts | 22 ++-- 8 files changed, 72 insertions(+), 129 deletions(-) diff --git a/apps/computer-vision/app/object_detection/index.tsx b/apps/computer-vision/app/object_detection/index.tsx index 54c0eb18f..d843682eb 100644 --- a/apps/computer-vision/app/object_detection/index.tsx +++ b/apps/computer-vision/app/object_detection/index.tsx @@ -4,6 +4,8 @@ import { Detection, useObjectDetection, SSDLITE_320_MOBILENET_V3_LARGE, + ScalarType, + PixelData, } from 'react-native-executorch'; import { View, StyleSheet, Image, TouchableOpacity, Text } from 'react-native'; import ImageWithBboxes from '../../components/ImageWithBboxes'; @@ -11,62 +13,6 @@ 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 BGRA to RGB -function convertBGRAtoRGB( - buffer: ArrayBuffer, - width: number, - height: number -): ArrayBuffer { - const source = new Uint8Array(buffer); - const rgb = new Uint8Array(width * height * 3); - - for (let i = 0; i < width * height; i++) { - // BGRA format: [B, G, R, A] → RGB: [R, G, B] - rgb[i * 3 + 0] = source[i * 4 + 2]; // R - rgb[i * 3 + 1] = source[i * 4 + 1]; // G - rgb[i * 3 + 2] = source[i * 4 + 0]; // B - } - - return rgb.buffer; -} - -// Helper function to convert image URI to raw RGB pixel data -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 (BGRA format from NitroImage) - const rawPixelData = resized.toRawPixelData(); - const buffer = - rawPixelData instanceof ArrayBuffer ? rawPixelData : rawPixelData.buffer; - - // Convert BGRA to RGB as required by the native API - const rgbBuffer = convertBGRAtoRGB(buffer, targetWidth, targetHeight); - - return { - data: rgbBuffer, - width: targetWidth, - height: targetHeight, - channels: 3, // RGB - }; - } catch (error) { - console.error('Error loading image with NitroImage:', error); - throw error; - } -} export default function ObjectDetectionScreen() { const [imageUri, setImageUri] = useState(''); @@ -109,30 +55,45 @@ export default function ObjectDetectionScreen() { }; const runForwardPixels = async () => { - if (imageUri && imageDimensions) { - try { - console.log('Converting image to pixel data...'); - // Use original dimensions - let the model resize internally - const pixelData = await imageUriToPixelData( - imageUri, - imageDimensions.width, - imageDimensions.height - ); - - 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.3); - console.log('Pixel data result:', output.length, 'detections'); - setResults(output); - } catch (e) { - console.error('Error in runForwardPixels:', e); + try { + console.log('Testing with hardcoded pixel data...'); + + // Create a simple 320x320 test image (all zeros - black image) + // In a real scenario, you would load actual image pixel data here + const width = 320; + const height = 320; + const channels = 3; // RGB + + // Create a black image (you can replace this with actual pixel data) + const rgbData = new Uint8Array(width * height * channels); + + // Optionally, add some test pattern (e.g., white square in center) + for (let y = 100; y < 220; y++) { + for (let x = 100; x < 220; x++) { + const idx = (y * width + x) * 3; + rgbData[idx + 0] = 255; // R + rgbData[idx + 1] = 255; // G + rgbData[idx + 2] = 255; // B + } } + + const pixelData: PixelData = { + dataPtr: rgbData, + sizes: [height, width, channels], + scalarType: ScalarType.BYTE, + }; + + console.log('Running forward with hardcoded pixel data...', { + sizes: pixelData.sizes, + dataSize: pixelData.dataPtr.byteLength, + }); + + // Run inference using unified forward() API + const output = await ssdLite.forward(pixelData, 0.3); + console.log('Pixel data result:', output.length, 'detections'); + setResults(output); + } catch (e) { + console.error('Error in runForwardPixels:', e); } }; diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp index fd2c40ee8..8155b8819 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -2,8 +2,6 @@ #include #include #include -#include -#include #include namespace rnexecutorch { @@ -21,12 +19,7 @@ cv::Mat VisionModel::extractFromFrame(jsi::Runtime &runtime, return preprocessFrame(frame); } -cv::Mat VisionModel::extractFromPixels(jsi::Runtime &runtime, - const jsi::Object &pixelData) const { - // PixelData follows TensorPtr structure (dataPtr, sizes, scalarType) - // Use JSI conversion helper to extract the data - auto tensorView = jsi::fromHostObject(runtime, pixelData); - +cv::Mat VisionModel::extractFromPixels(const JSTensorViewIn &tensorView) const { // Validate dimensions: sizes must be [height, width, channels] if (tensorView.sizes.size() != 3) { char errorMessage[100]; @@ -59,11 +52,11 @@ cv::Mat VisionModel::extractFromPixels(jsi::Runtime &runtime, } // Create cv::Mat directly from dataPtr (zero-copy view) + // Data is valid for the duration of this synchronous call uint8_t *dataPtr = static_cast(tensorView.dataPtr); cv::Mat image(height, width, CV_8UC3, dataPtr); - // Clone to own the data, since JS memory may be GC'd - return image.clone(); + return image; } } // namespace models diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h index 9ba5cf7e4..c362d745f 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h @@ -129,40 +129,35 @@ class VisionModel : public BaseModel { const jsi::Value &frameData) const; /** - * @brief Extract cv::Mat from raw pixel data (ArrayBuffer) sent from + * @brief Extract cv::Mat from raw pixel data (TensorPtr) 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) + * @param tensorView JSTensorViewIn containing: + * - dataPtr: Pointer to raw pixel values (RGB format) + * - sizes: [height, width, channels] - must be 3D + * - scalarType: Must be ScalarType::Byte (Uint8Array) * * @return cv::Mat containing the pixel data * - * @throws std::runtime_error if pixelData format is invalid + * @throws RnExecutorchError if tensorView 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 Expected pixel format: RGB (3 channels), row-major order * @note Typical usage from JS: * @code - * const pixels = new Uint8Array([...]); // Raw pixel data + * const pixels = new Uint8Array([...]); // Raw RGB pixel data * const result = model.generateFromPixels({ - * data: pixels.buffer, - * width: 640, - * height: 480, - * channels: 3 + * dataPtr: pixels, + * sizes: [480, 640, 3], + * scalarType: ScalarType.BYTE * }, 0.5); * @endcode */ - cv::Mat extractFromPixels(jsi::Runtime &runtime, - const jsi::Object &pixelData) const; + cv::Mat extractFromPixels(const JSTensorViewIn &tensorView) const; }; } // namespace models diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp index 9fbbaeb74..900eae297 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp @@ -86,7 +86,7 @@ cv::Mat FrameExtractor::extractFromAHardwareBuffer(void *hardwareBuffer) { buffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr, &data); if (lockResult != 0) { - throw RnExecutorchError(RnExecutorchErrorCode::AccessFailed, + throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, "Failed to lock AHardwareBuffer"); } diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp index 087aec816..5e593dfd0 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp @@ -9,13 +9,8 @@ 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) + // Native buffer contains dimensions, so we don't need width/height properties if (hasNativeBuffer(runtime, frameData)) { try { return extractFromNativeBuffer(runtime, frameData); @@ -25,7 +20,12 @@ cv::Mat FrameProcessor::extractFrame(jsi::Runtime &runtime, } // Fallback to ArrayBuffer path (with copy) + // Get frame dimensions for ArrayBuffer path if (frameData.hasProperty(runtime, "data")) { + int width = + static_cast(frameData.getProperty(runtime, "width").asNumber()); + int height = + static_cast(frameData.getProperty(runtime, "height").asNumber()); return extractFromArrayBuffer(runtime, frameData, width, height); } diff --git a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts index 72e797437..d6a0038ee 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts @@ -73,7 +73,7 @@ export abstract class VisionModule extends BaseModule { * 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. + * **Note**: For VisionCamera frame processing, use `runOnFrame` instead. * This method is async and cannot be called in worklet context. * * @param input - Image source (string path or PixelData object) diff --git a/packages/react-native-executorch/src/types/common.ts b/packages/react-native-executorch/src/types/common.ts index f50431943..3f2f3b714 100644 --- a/packages/react-native-executorch/src/types/common.ts +++ b/packages/react-native-executorch/src/types/common.ts @@ -191,5 +191,5 @@ export interface Frame { * * Obtain from Vision Camera v5: `frame.getNativeBuffer().pointer` */ - getNativeBuffer(): { pointer: number; release(): void }; + getNativeBuffer(): { pointer: bigint; release(): void }; } diff --git a/packages/react-native-executorch/src/types/objectDetection.ts b/packages/react-native-executorch/src/types/objectDetection.ts index abb0142a7..c2281598a 100644 --- a/packages/react-native-executorch/src/types/objectDetection.ts +++ b/packages/react-native-executorch/src/types/objectDetection.ts @@ -1,5 +1,5 @@ import { RnExecutorchError } from '../errors/errorUtils'; -import { ResourceSource } from './common'; +import { ResourceSource, PixelData, Frame } from './common'; /** * Represents a bounding box for a detected object in an image. @@ -190,22 +190,14 @@ export interface ObjectDetectionType { * * // Pixel data * const detections2 = await model.forward({ - * data: pixelBuffer, - * width: 640, - * height: 480, - * channels: 3 + * dataPtr: new Uint8Array(rgbPixels), + * sizes: [480, 640, 3], + * scalarType: ScalarType.BYTE * }); * ``` */ forward: ( - input: - | string - | { - data: ArrayBuffer; - width: number; - height: number; - channels: number; - }, + input: string | PixelData, detectionThreshold?: number ) => Promise; @@ -236,5 +228,7 @@ export interface ObjectDetectionType { * @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; + runOnFrame: + | ((frame: Frame, detectionThreshold?: number) => Detection[]) + | null; } From f3e17e2a2bc4b061833e41bf41529839cb66852c Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Wed, 18 Feb 2026 13:03:22 +0100 Subject: [PATCH 10/16] refactor: add or remove empty lines --- .../rnexecutorch/models/classification/Classification.cpp | 2 +- .../rnexecutorch/models/embeddings/image/ImageEmbeddings.h | 2 +- .../models/image_segmentation/ImageSegmentation.cpp | 2 +- .../rnexecutorch/models/image_segmentation/ImageSegmentation.h | 2 +- .../common/rnexecutorch/models/style_transfer/StyleTransfer.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) 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 b9fad1b88..0fba07108 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 \ No newline at end of file +} // namespace rnexecutorch::models::classification 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 9a1d6429b..7e114e939 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 \ No newline at end of file +} // namespace rnexecutorch 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 08f2a4683..a2c1ae865 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 \ No newline at end of file +} // namespace rnexecutorch::models::image_segmentation 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 ba154898f..301833ce8 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 \ No newline at end of file +} // namespace rnexecutorch 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 8eed3c888..73744c4d8 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 \ No newline at end of file +} // namespace rnexecutorch From 09589b0b39f169778025295e3fd92045ef0ce3dd Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Thu, 19 Feb 2026 22:34:20 +0100 Subject: [PATCH 11/16] fix: errors after rebase --- .../host_objects/JsiConversions.h | 10 -- .../host_objects/ModelHostObject.h | 7 +- .../metaprogramming/FunctionHelpers.h | 67 +++++++++- .../metaprogramming/TypeConcepts.h | 5 + yarn.lock | 117 +++++------------- 5 files changed, 104 insertions(+), 102 deletions(-) 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 b4409b0f2..5fc8615ea 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/JsiConversions.h @@ -360,16 +360,6 @@ inline jsi::Value getJsiValue(uint64_t val, jsi::Runtime &runtime) { return {runtime, bigInt}; } -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++) { - // 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, jsi::Runtime &runtime) { jsi::Array array(runtime, vec.size()); 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 134393a4d..bb996984b 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -158,10 +159,10 @@ template class ModelHostObject : public JsiHostObject { "stream")); } - if constexpr (meta::DerivedFromOrSameAs) { + if constexpr (meta::HasGenerateFromFrame) { addFunctions(JSI_EXPORT_FUNCTION( - ModelHostObject, synchronousHostFunction<&Model::streamStop>, - "streamStop")); + ModelHostObject, visionHostFunction<&Model::generateFromFrame>, + "generateFromFrame")); } if constexpr (meta::HasGenerateFromPixels) { diff --git a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h index 8290a810b..a48aa0119 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); } -} // namespace rnexecutorch::meta \ No newline at end of file + +// 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 diff --git a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h index 8100a471b..f625bf6e7 100644 --- a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h +++ b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/TypeConcepts.h @@ -21,6 +21,11 @@ concept HasGenerateFromPixels = requires(T t) { { &T::generateFromPixels }; }; +template +concept HasGenerateFromFrame = requires(T t) { + { &T::generateFromFrame }; +}; + template concept HasEncode = requires(T t) { { &T::encode }; diff --git a/yarn.lock b/yarn.lock index b2879dcbe..a3039d1a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4325,9 +4325,9 @@ __metadata: languageName: node linkType: hard -"@shopify/react-native-skia@npm:2.4.14": - version: 2.4.14 - resolution: "@shopify/react-native-skia@npm:2.4.14" +"@shopify/react-native-skia@npm:2.2.12": + version: 2.2.12 + resolution: "@shopify/react-native-skia@npm:2.2.12" dependencies: canvaskit-wasm: "npm:0.40.0" react-reconciler: "npm:0.31.0" @@ -4342,7 +4342,7 @@ __metadata: optional: true bin: setup-skia-web: scripts/setup-canvaskit.js - checksum: 10/cb0274dadb89046b357fb9cf071349f2e6c348ca3ea18360a791e084a1456c729de862d2cda3c0b81b306faebbbf2b63a91380ca2de3298266f0aa248f12d434 + checksum: 10/2543664085470267a9a6491ee90760f01d258cdd97cda5955d0c9f980ad57d647dffa5670f9d5d5f8cd6180ff46fe1df6f4281ae2e0b5c3632c703479b6a7608 languageName: node linkType: hard @@ -4692,7 +4692,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:~19.1.0, @types/react@npm:~19.1.10": +"@types/react@npm:~19.1.10": version: 19.1.17 resolution: "@types/react@npm:19.1.17" dependencies: @@ -4701,6 +4701,15 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:~19.2.0": + version: 19.2.14 + resolution: "@types/react@npm:19.2.14" + dependencies: + csstype: "npm:^3.2.2" + checksum: 10/fbff239089ee64b6bd9b00543594db498278b06de527ef1b0f71bb0eb09cc4445a71b5dd3c0d3d0257255c4eed94406be40a74ad4a987ade8a8d5dd65c82bc5f + languageName: node + linkType: hard + "@types/semver@npm:^7.3.12": version: 7.7.1 resolution: "@types/semver@npm:7.7.1" @@ -6286,15 +6295,14 @@ __metadata: resolution: "computer-vision@workspace:apps/computer-vision" dependencies: "@babel/core": "npm:^7.25.2" - "@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.4.14" + "@shopify/react-native-skia": "npm:2.2.12" "@types/pngjs": "npm:^6.0.5" - "@types/react": "npm:~19.1.0" - expo: "npm:~54.0.33" + "@types/react": "npm:~19.2.0" + expo: "npm:^54.0.27" expo-build-properties: "npm:~1.0.10" expo-constants: "npm:~18.0.11" expo-font: "npm:~14.0.10" @@ -6303,21 +6311,19 @@ __metadata: expo-status-bar: "npm:~3.0.9" 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.30.0" + react-native-gesture-handler: "npm:~2.28.0" react-native-image-picker: "npm:^7.2.2" react-native-loading-spinner-overlay: "npm:^3.0.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.22.0" - react-native-svg: "npm:15.15.1" + react-native-screens: "npm:~4.16.0" + react-native-svg: "npm:15.12.1" react-native-svg-transformer: "npm:^1.5.0" - 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 @@ -6661,7 +6667,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": +"csstype@npm:^3.0.2, csstype@npm:^3.2.2": version: 3.2.3 resolution: "csstype@npm:3.2.3" checksum: 10/ad41baf7e2ffac65ab544d79107bf7cd1a4bb9bab9ac3302f59ab4ba655d5e30942a8ae46e10ba160c6f4ecea464cc95b975ca2fefbdeeacd6ac63f12f99fe1f @@ -7935,7 +7941,7 @@ __metadata: languageName: node linkType: hard -"expo@npm:^54.0.0, expo@npm:^54.0.27, expo@npm:~54.0.33": +"expo@npm:^54.0.0, expo@npm:^54.0.27": version: 54.0.33 resolution: "expo@npm:54.0.33" dependencies: @@ -12454,17 +12460,6 @@ __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" @@ -12502,9 +12497,11 @@ __metadata: languageName: node linkType: hard -"react-native-audio-api@npm:0.6.5": - version: 0.6.5 - resolution: "react-native-audio-api@npm:0.6.5" +"react-native-audio-api@npm:0.11.3": + version: 0.11.3 + resolution: "react-native-audio-api@npm:0.11.3" + dependencies: + semver: "npm:^7.7.3" peerDependencies: react: "*" react-native: "*" @@ -12586,7 +12583,6 @@ __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" @@ -12646,20 +12642,6 @@ __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" @@ -12789,19 +12771,6 @@ __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.3 resolution: "react-native-svg-transformer@npm:1.5.3" @@ -12831,32 +12800,6 @@ __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" @@ -13387,7 +13330,7 @@ __metadata: 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 @@ -13428,7 +13371,7 @@ __metadata: languageName: node 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": +"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, semver@npm:^7.7.3": version: 7.7.4 resolution: "semver@npm:7.7.4" bin: @@ -15148,4 +15091,4 @@ __metadata: resolution: "zod@npm:3.25.76" checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995 languageName: node - linkType: hard \ No newline at end of file + linkType: hard From 3e15a2550c93bbf1956de7c52a8fba6d4b597cdb Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Fri, 20 Feb 2026 09:27:37 +0100 Subject: [PATCH 12/16] fix: remove redundant preprocessing step --- .../common/rnexecutorch/models/VisionModel.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp index 8155b8819..a81518921 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -11,12 +11,8 @@ 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); + return ::rnexecutorch::utils::FrameProcessor::extractFrame(runtime, frameObj); } cv::Mat VisionModel::extractFromPixels(const JSTensorViewIn &tensorView) const { From d886604722a8b641d8547ff6701ad1e19a9c6b6f Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Mon, 23 Feb 2026 11:46:18 +0100 Subject: [PATCH 13/16] refactor: changes suggested in review --- .cspell-wordlist.txt | 2 + .../rnexecutorch/RnExecutorchInstaller.h | 3 - .../rnexecutorch/models/VisionModel.cpp | 18 +-- .../common/rnexecutorch/models/VisionModel.h | 24 +--- .../object_detection/ObjectDetection.cpp | 41 +------ .../models/object_detection/ObjectDetection.h | 1 - .../rnexecutorch/utils/FrameExtractor.cpp | 50 ++++---- .../rnexecutorch/utils/FrameExtractor.h | 61 +++------- .../rnexecutorch/utils/FrameProcessor.cpp | 102 ++--------------- .../rnexecutorch/utils/FrameProcessor.h | 108 +++--------------- .../src/hooks/useModule.ts | 1 - .../modules/computer_vision/VisionModule.ts | 27 +++-- 12 files changed, 90 insertions(+), 348 deletions(-) diff --git a/.cspell-wordlist.txt b/.cspell-wordlist.txt index 1b30572a8..1369b32f0 100644 --- a/.cspell-wordlist.txt +++ b/.cspell-wordlist.txt @@ -113,3 +113,5 @@ pogodin kesha antonov worklet +worklets +BGRA \ No newline at end of file diff --git a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h index 80b7d18b3..54e8c1cbb 100644 --- a/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h +++ b/packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.h @@ -54,9 +54,6 @@ class RnExecutorchInstaller { meta::createConstructorArgsWithCallInvoker( args, runtime, jsCallInvoker); - // 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( diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp index a81518921..b88310e12 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.cpp @@ -4,19 +4,17 @@ #include #include -namespace rnexecutorch { -namespace models { +namespace rnexecutorch::models { using namespace facebook; cv::Mat VisionModel::extractFromFrame(jsi::Runtime &runtime, const jsi::Value &frameData) const { auto frameObj = frameData.asObject(runtime); - return ::rnexecutorch::utils::FrameProcessor::extractFrame(runtime, frameObj); + return ::rnexecutorch::utils::extractFrame(runtime, frameObj); } cv::Mat VisionModel::extractFromPixels(const JSTensorViewIn &tensorView) const { - // Validate dimensions: sizes must be [height, width, channels] if (tensorView.sizes.size() != 3) { char errorMessage[100]; std::snprintf(errorMessage, sizeof(errorMessage), @@ -27,11 +25,10 @@ cv::Mat VisionModel::extractFromPixels(const JSTensorViewIn &tensorView) const { errorMessage); } - int height = tensorView.sizes[0]; - int width = tensorView.sizes[1]; - int channels = tensorView.sizes[2]; + int32_t height = tensorView.sizes[0]; + int32_t width = tensorView.sizes[1]; + int32_t channels = tensorView.sizes[2]; - // Pixel data must be RGB (3 channels) and BYTE type if (channels != 3) { char errorMessage[100]; std::snprintf(errorMessage, sizeof(errorMessage), @@ -47,13 +44,10 @@ cv::Mat VisionModel::extractFromPixels(const JSTensorViewIn &tensorView) const { "Invalid pixel data: scalarType must be BYTE (Uint8Array)"); } - // Create cv::Mat directly from dataPtr (zero-copy view) - // Data is valid for the duration of this synchronous call uint8_t *dataPtr = static_cast(tensorView.dataPtr); cv::Mat image(height, width, CV_8UC3, dataPtr); return image; } -} // namespace models -} // namespace rnexecutorch +} // namespace rnexecutorch::models diff --git a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h index c362d745f..82d544db3 100644 --- a/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h +++ b/packages/react-native-executorch/common/rnexecutorch/models/VisionModel.h @@ -18,17 +18,13 @@ namespace models { * 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 + * - All inference operations are protected by a mutex via scoped_lock * * 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) + * 3. Delegate to runInference() which handles locking internally * * Example: * @code @@ -36,18 +32,9 @@ namespace models { * 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 + * cv::Mat frame = utils::extractFrame(runtime, frameObject); + * return runInference(frame); * } * }; * @endcode @@ -64,9 +51,6 @@ class VisionModel : public BaseModel { std::shared_ptr callInvoker) : BaseModel(modelSource, callInvoker) {} - /** - * @brief Virtual destructor for proper cleanup in derived classes - */ virtual ~VisionModel() = default; protected: 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 f17a4f074..1ae2460c3 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 @@ -33,26 +33,19 @@ ObjectDetection::ObjectDetection( } 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 rgb; - // Convert RGBA/BGRA to RGB if needed (for VisionCamera frames) if (frame.channels() == 4) { -// 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 } else if (frame.channels() == 3) { - // Already RGB rgb = frame; } else { char errorMessage[100]; @@ -113,15 +106,11 @@ ObjectDetection::postprocess(const std::vector &tensors, std::vector ObjectDetection::runInference(cv::Mat image, double detectionThreshold) { - std::lock_guard lock(inference_mutex_); + std::scoped_lock 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); @@ -139,14 +128,11 @@ ObjectDetection::runInference(cv::Mat image, double detectionThreshold) { std::vector ObjectDetection::generateFromString(std::string imageSource, double detectionThreshold) { - // Read image using OpenCV (BGR format) - cv::Mat image = image_processing::readImage(imageSource); + cv::Mat imageBGR = image_processing::readImage(imageSource); - // Convert BGR to RGB (OpenCV imread returns BGR) cv::Mat imageRGB; - cv::cvtColor(image, imageRGB, cv::COLOR_BGR2RGB); + cv::cvtColor(imageBGR, imageRGB, cv::COLOR_BGR2RGB); - // Use the internal helper - it handles locking, preprocessing, and inference return runInference(imageRGB, detectionThreshold); } @@ -154,22 +140,9 @@ 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 - } + auto frameObj = frameData.asObject(runtime); + cv::Mat frame = rnexecutorch::utils::extractFrame(runtime, frameObj); - // Extract frame (under lock to ensure thread safety) - cv::Mat frame; - { - std::lock_guard lock(inference_mutex_, std::adopt_lock); - auto frameObj = frameData.asObject(runtime); - frame = - rnexecutorch::utils::FrameProcessor::extractFrame(runtime, frameObj); - } - // Lock is automatically released here when going out of scope - - // Use the internal helper - it handles locking, preprocessing, and inference return runInference(frame, detectionThreshold); } @@ -177,14 +150,10 @@ std::vector ObjectDetection::generateFromPixels(jsi::Runtime &runtime, const jsi::Value &pixelData, double detectionThreshold) { - // Convert JSI value to JSTensorViewIn auto tensorView = jsi_conversion::getValue(pixelData, runtime); - - // Extract raw pixel data to cv::Mat cv::Mat image = extractFromPixels(tensorView); - // Use the internal helper - it handles locking, preprocessing, and inference return runInference(image, detectionThreshold); } } // namespace rnexecutorch::models::object_detection \ No newline at end of file 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 fc554003b..bf231ff0b 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 @@ -30,7 +30,6 @@ class ObjectDetection : public VisionModel { 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; diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp index 900eae297..3b31bc10f 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp @@ -7,52 +7,35 @@ #import #endif -#ifdef __ANDROID__ -#if __ANDROID_API__ >= 26 +#if defined(__ANDROID__) && __ANDROID_API__ >= 26 #include #endif -#endif -namespace rnexecutorch { -namespace utils { +namespace rnexecutorch::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 RnExecutorchError(RnExecutorchErrorCode::NotSupported, - "NativeBuffer not supported on this platform"); -#endif -} +namespace { #ifdef __APPLE__ -cv::Mat FrameExtractor::extractFromCVPixelBuffer(void *pixelBuffer) { +cv::Mat 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; if (pixelFormat == kCVPixelFormatType_32BGRA) { - // BGRA format (most common on iOS when using pixelFormat: 'rgb') mat = cv::Mat(static_cast(height), static_cast(width), CV_8UC4, baseAddress, bytesPerRow); } else if (pixelFormat == kCVPixelFormatType_32RGBA) { - // RGBA format mat = cv::Mat(static_cast(height), static_cast(width), CV_8UC4, baseAddress, bytesPerRow); } else if (pixelFormat == kCVPixelFormatType_24RGB) { - // RGB format mat = cv::Mat(static_cast(height), static_cast(width), CV_8UC3, baseAddress, bytesPerRow); } else { @@ -72,15 +55,13 @@ cv::Mat FrameExtractor::extractFromCVPixelBuffer(void *pixelBuffer) { #endif #ifdef __ANDROID__ -cv::Mat FrameExtractor::extractFromAHardwareBuffer(void *hardwareBuffer) { +cv::Mat 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); @@ -93,13 +74,10 @@ cv::Mat FrameExtractor::extractFromAHardwareBuffer(void *hardwareBuffer) { cv::Mat mat; if (desc.format == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) { - // RGBA format (expected when using pixelFormat: 'rgb' on Android) 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) 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) mat = cv::Mat(desc.height, desc.width, CV_8UC3, data, desc.stride * 3); } else { AHardwareBuffer_unlock(buffer, nullptr); @@ -118,7 +96,19 @@ cv::Mat FrameExtractor::extractFromAHardwareBuffer(void *hardwareBuffer) { "AHardwareBuffer requires Android API 26+"); #endif // __ANDROID_API__ >= 26 } -#endif // __ANDROID__ +#endif + +} // namespace + +cv::Mat extractFromNativeBuffer(uint64_t bufferPtr) { +#ifdef __APPLE__ + return extractFromCVPixelBuffer(reinterpret_cast(bufferPtr)); +#elif defined(__ANDROID__) + return extractFromAHardwareBuffer(reinterpret_cast(bufferPtr)); +#else + throw RnExecutorchError(RnExecutorchErrorCode::NotSupported, + "NativeBuffer not supported on this platform"); +#endif +} -} // namespace utils -} // namespace rnexecutorch +} // namespace rnexecutorch::utils diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h index a90e6ad23..f5d7c2094 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.h @@ -3,58 +3,23 @@ #include #include -namespace rnexecutorch { -namespace utils { +namespace rnexecutorch::utils { /** - * @brief Utility class for extracting cv::Mat from native platform buffers + * @brief Extract cv::Mat from a native platform buffer pointer (zero-copy) * - * Provides zero-copy extraction of frames from: + * Dispatches to the platform-specific implementation: * - iOS: CVPixelBufferRef * - Android: AHardwareBuffer + * + * @param bufferPtr Platform-specific buffer pointer (uint64_t) + * @return cv::Mat wrapping the buffer data (zero-copy) + * + * @throws RnExecutorchError if the platform is unsupported or extraction fails + * + * @note The returned cv::Mat does not own the data. + * Caller must ensure the buffer remains valid during use. */ -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 -}; +cv::Mat extractFromNativeBuffer(uint64_t bufferPtr); -} // namespace utils -} // namespace rnexecutorch +} // namespace rnexecutorch::utils diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp index 5e593dfd0..30238ad5c 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.cpp @@ -2,105 +2,27 @@ #include "FrameExtractor.h" #include #include -#include -namespace rnexecutorch { -namespace utils { +namespace rnexecutorch::utils { -cv::Mat FrameProcessor::extractFrame(jsi::Runtime &runtime, - const jsi::Object &frameData) { - // Try zero-copy path first (nativeBuffer) - // Native buffer contains dimensions, so we don't need width/height properties - if (hasNativeBuffer(runtime, frameData)) { - try { - return extractFromNativeBuffer(runtime, frameData); - } catch (const std::exception &e) { - // Fallback to ArrayBuffer on failure - } - } - - // Fallback to ArrayBuffer path (with copy) - // Get frame dimensions for ArrayBuffer path - if (frameData.hasProperty(runtime, "data")) { - int width = - static_cast(frameData.getProperty(runtime, "width").asNumber()); - int height = - static_cast(frameData.getProperty(runtime, "height").asNumber()); - return extractFromArrayBuffer(runtime, frameData, width, height); - } +namespace { - // No valid frame data source - throw RnExecutorchError( - RnExecutorchErrorCode::InvalidUserInput, - "FrameProcessor: No valid frame data (neither nativeBuffer nor data " - "property found)"); +bool hasNativeBuffer(jsi::Runtime &runtime, const jsi::Object &frameData) { + return frameData.hasProperty(runtime, "nativeBuffer"); } -cv::Size FrameProcessor::getFrameSize(jsi::Runtime &runtime, - const jsi::Object &frameData) { - if (!frameData.hasProperty(runtime, "width") || - !frameData.hasProperty(runtime, "height")) { - throw RnExecutorchError( - RnExecutorchErrorCode::InvalidUserInput, - "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); -} +} // namespace -bool FrameProcessor::hasNativeBuffer(jsi::Runtime &runtime, - const jsi::Object &frameData) { - return frameData.hasProperty(runtime, "nativeBuffer"); -} +cv::Mat extractFrame(jsi::Runtime &runtime, const jsi::Object &frameData) { + if (!hasNativeBuffer(runtime, frameData)) { + throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + "FrameProcessor: No nativeBuffer found in frame"); + } -cv::Mat FrameProcessor::extractFromNativeBuffer(jsi::Runtime &runtime, - const jsi::Object &frameData) { 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 - // Native buffer contains all metadata (width, height, format) - return FrameExtractor::extractFromNativeBuffer(bufferPtr); -} - -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; - - if (stride == expectedRGBAStride || bufferSize >= width * height * 4) { - // RGBA format with potential padding - return cv::Mat(height, width, CV_8UC4, data, stride); - } else if (stride >= expectedRGBStride) { - // RGB format - return cv::Mat(height, width, CV_8UC3, data, stride); - } else { - char errorMessage[200]; - std::snprintf( - errorMessage, sizeof(errorMessage), - "FrameProcessor: Unexpected buffer size - expected %zu or %zu bytes " - "per row, got %zu", - expectedRGBStride, expectedRGBAStride, stride); - throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, - errorMessage); - } + return extractFromNativeBuffer(bufferPtr); } - -} // namespace utils -} // namespace rnexecutorch +} // namespace rnexecutorch::utils diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h index 0838b6594..403f4bde9 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameProcessor.h @@ -3,107 +3,25 @@ #include #include -namespace rnexecutorch { -namespace utils { +namespace rnexecutorch::utils { using namespace facebook; /** - * @brief Utility class for processing camera frames from VisionCamera + * @brief Extract cv::Mat from VisionCamera frame data via nativeBuffer * - * Provides high-level helpers for extracting and working with frames from - * react-native-vision-camera in a consistent way across all vision models. + * @param runtime JSI runtime + * @param frameData JSI object containing frame data from VisionCamera + * Expected properties: + * - nativeBuffer: BigInt pointer to native buffer * - * 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 + * @return cv::Mat wrapping the frame data (zero-copy) * - * Usage: - * @code - * auto frameObj = frameData.asObject(runtime); - * cv::Mat frame = FrameProcessor::extractFrame(runtime, frameObj); - * cv::Size size = FrameProcessor::getFrameSize(runtime, frameObj); - * @endcode + * @throws RnExecutorchError if nativeBuffer is not present or extraction fails + * + * @note The returned cv::Mat does not own the data. + * Caller must ensure the source frame remains valid during use. */ -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 RnExecutorchError if neither nativeBuffer nor data is available - * @throws RnExecutorchError 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 RnExecutorchError 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) - * - * Native buffer contains all metadata (width, height, format), so no need to - * pass dimensions separately. - * - * @param runtime JSI runtime - * @param frameData JSI object with nativeBuffer property - * @return cv::Mat wrapping the native buffer data - */ - static cv::Mat extractFromNativeBuffer(jsi::Runtime &runtime, - const jsi::Object &frameData); - - /** - * @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); -}; +cv::Mat extractFrame(jsi::Runtime &runtime, const jsi::Object &frameData); -} // namespace utils -} // namespace rnexecutorch +} // namespace rnexecutorch::utils diff --git a/packages/react-native-executorch/src/hooks/useModule.ts b/packages/react-native-executorch/src/hooks/useModule.ts index 61a36bfda..6ddd2e9a0 100644 --- a/packages/react-native-executorch/src/hooks/useModule.ts +++ b/packages/react-native-executorch/src/hooks/useModule.ts @@ -44,7 +44,6 @@ export const useModule = < 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; diff --git a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts index d6a0038ee..eabe50ab0 100644 --- a/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts +++ b/packages/react-native-executorch/src/modules/computer_vision/VisionModule.ts @@ -15,6 +15,20 @@ import { Frame, PixelData, ScalarType } from '../../types/common'; * * @category Typescript API */ +function isPixelData(input: unknown): input is PixelData { + return ( + typeof input === 'object' && + input !== null && + 'dataPtr' in input && + input.dataPtr instanceof Uint8Array && + 'sizes' in input && + Array.isArray(input.sizes) && + input.sizes.length === 3 && + 'scalarType' in input && + input.scalarType === ScalarType.BYTE + ); +} + export abstract class VisionModule extends BaseModule { /** * Synchronous worklet function for real-time VisionCamera frame processing. @@ -111,19 +125,8 @@ export abstract class VisionModule extends BaseModule { // Type detection and routing if (typeof input === 'string') { - // String path → generateFromString() return await this.nativeModule.generateFromString(input, ...args); - } else if ( - typeof input === 'object' && - 'dataPtr' in input && - input.dataPtr instanceof Uint8Array && - 'sizes' in input && - Array.isArray(input.sizes) && - input.sizes.length === 3 && - 'scalarType' in input && - input.scalarType === ScalarType.BYTE - ) { - // Pixel data → generateFromPixels() + } else if (isPixelData(input)) { return await this.nativeModule.generateFromPixels(input, ...args); } else { throw new RnExecutorchError( From 57e57947827cfb2e09b571281d216329bea9213b Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Mon, 23 Feb 2026 13:00:39 +0100 Subject: [PATCH 14/16] fix: not existing error type, add comments to JSI code --- .../host_objects/ModelHostObject.h | 60 +++++++++-------- .../metaprogramming/FunctionHelpers.h | 66 ++++++++----------- .../rnexecutorch/utils/FrameExtractor.cpp | 7 +- 3 files changed, 60 insertions(+), 73 deletions(-) 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 bb996984b..42bff698b 100644 --- a/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h +++ b/packages/react-native-executorch/common/rnexecutorch/host_objects/ModelHostObject.h @@ -46,13 +46,6 @@ template class ModelHostObject : public JsiHostObject { "getInputShape")); } - if constexpr (meta::HasGenerateFromString) { - addFunctions( - JSI_EXPORT_FUNCTION(ModelHostObject, - promiseHostFunction<&Model::generateFromString>, - "generateFromString")); - } - if constexpr (meta::HasEncode) { addFunctions(JSI_EXPORT_FUNCTION(ModelHostObject, promiseHostFunction<&Model::encode>, @@ -159,6 +152,13 @@ template class ModelHostObject : public JsiHostObject { "stream")); } + if constexpr (meta::HasGenerateFromString) { + addFunctions( + JSI_EXPORT_FUNCTION(ModelHostObject, + promiseHostFunction<&Model::generateFromString>, + "generateFromString")); + } + if constexpr (meta::HasGenerateFromFrame) { addFunctions(JSI_EXPORT_FUNCTION( ModelHostObject, visionHostFunction<&Model::generateFromFrame>, @@ -168,7 +168,7 @@ template class ModelHostObject : public JsiHostObject { if constexpr (meta::HasGenerateFromPixels) { addFunctions( JSI_EXPORT_FUNCTION(ModelHostObject, - visionHostFunction<&Model::generateFromPixels>, + promiseHostFunction<&Model::generateFromPixels>, "generateFromPixels")); } } @@ -220,36 +220,40 @@ template class ModelHostObject : public JsiHostObject { } } + /** + * Unlike promiseHostFunction, this runs synchronously on the JS thread, + * which is required for VisionCamera worklet frame processors. + * + * The key challenge is argument mapping: the C++ function takes + * (Runtime, frameData, Rest...) but from the JS side, Runtime is injected + * automatically and frameData is JS args[0]. The remaining args (Rest...) + * map to JS args[1..N]. + * + * This is achieved via TailSignature: it extracts the Rest... parameter pack + * from the function pointer type, creates a dummy free function with only + * those types, then uses createArgsTupleFromJsi on that dummy to convert + * args[1..N] — bypassing the manually-handled frameData at args[0]. + * + * Argument mapping: + * C++ params: (Runtime&, frameData, Rest[0], Rest[1], ...) + * JS args: ( args[0], args[1], args[2], ...) + * JS arg count = C++ arity - 1 (Runtime is injected, not counted) + * + */ 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; @@ -257,10 +261,8 @@ template class ModelHostObject : public JsiHostObject { std::apply( [&](auto &&...tailArgs) { (model.get()->*FnPtr)( - runtime, - args[0], // 1. PixelData (Manually passed) - std::forward( - tailArgs)...); // 2. The rest (Auto parsed) + runtime, args[0], + std::forward(tailArgs)...); }, std::move(tailArgsTuple)); return jsi::Value::undefined(); diff --git a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h index a48aa0119..88bf04bf0 100644 --- a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h +++ b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h @@ -10,32 +10,6 @@ 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); @@ -46,10 +20,6 @@ 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, @@ -62,6 +32,7 @@ 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, @@ -78,7 +49,9 @@ std::tuple createArgsTupleFromJsi(R (Model::*f)(Types...) const, runtime); } -// Overload for free functions (used by TailSignature dummy) +// Free function overload used by visionHostFunction: accepts a dummy free +// function pointer whose parameter types (Rest...) are extracted by +// TailSignature and converted from JSI args. template std::tuple createArgsTupleFromJsi(void (*f)(Types...), const jsi::Value *args, @@ -87,27 +60,40 @@ std::tuple createArgsTupleFromJsi(void (*f)(Types...), runtime); } -// ========================================================================= -// 4. Tail Signature Helper (Crucial for Vision Functions) -// ========================================================================= +// Extracts arity, return type, and argument types from a member function +// pointer at compile time. Used by visionHostFunction to determine the expected +// JS argument count and invoke the correct return path. +template struct FunctionTraits; + +template +struct FunctionTraits { + static constexpr std::size_t arity = sizeof...(Args); + using return_type = R; + using args_tuple = std::tuple; +}; + +template +struct FunctionTraits { + static constexpr std::size_t arity = sizeof...(Args); + using return_type = R; + using args_tuple = std::tuple; +}; -// Extracts the "Tail" arguments of a function signature, skipping the first -// two arguments (Runtime and FrameValue). +// Strips the first two parameters (Runtime& and jsi::Value&) from a member +// function pointer and exposes the remaining types as a dummy free function. +// Used by visionHostFunction to parse only the tail JS args via +// createArgsTupleFromJsi, while frameData at args[0] is passed manually. 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 diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp index 3b31bc10f..51d206cdd 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp @@ -84,15 +84,14 @@ cv::Mat extractFromAHardwareBuffer(void *hardwareBuffer) { char errorMessage[100]; std::snprintf(errorMessage, sizeof(errorMessage), "Unsupported AHardwareBuffer format: %u", desc.format); - throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, - errorMessage); + throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, errorMessage); } // Note: We don't unlock here - Vision Camera manages the lifecycle return mat; #else - throw RnExecutorchError(RnExecutorchErrorCode::NotSupported, + throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, "AHardwareBuffer requires Android API 26+"); #endif // __ANDROID_API__ >= 26 } @@ -106,7 +105,7 @@ cv::Mat extractFromNativeBuffer(uint64_t bufferPtr) { #elif defined(__ANDROID__) return extractFromAHardwareBuffer(reinterpret_cast(bufferPtr)); #else - throw RnExecutorchError(RnExecutorchErrorCode::NotSupported, + throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, "NativeBuffer not supported on this platform"); #endif } From 0d5088f07df6fe60c0c8c76ea3ee2dd14cf36ff4 Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Mon, 23 Feb 2026 13:06:50 +0100 Subject: [PATCH 15/16] feat: add new PlatformNotSupported error --- .../common/rnexecutorch/ErrorCodes.h | 5 +++++ .../common/rnexecutorch/utils/FrameExtractor.cpp | 9 +++++---- .../react-native-executorch/src/errors/ErrorCodes.ts | 4 ++++ scripts/errors.config.ts | 4 ++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h b/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h index f4fd2e7f0..d49f3a175 100644 --- a/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h +++ b/packages/react-native-executorch/common/rnexecutorch/ErrorCodes.h @@ -75,6 +75,11 @@ enum class RnExecutorchErrorCode : int32_t { * interruptions. */ DownloadInterrupted = 118, + /** + * Thrown when a feature or platform is not supported in the current + * environment. + */ + PlatformNotSupported = 119, /** * Thrown when an error occurs with the tokenizer or tokenization process. */ diff --git a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp index 51d206cdd..baae35dc3 100644 --- a/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp +++ b/packages/react-native-executorch/common/rnexecutorch/utils/FrameExtractor.cpp @@ -43,7 +43,7 @@ cv::Mat extractFromCVPixelBuffer(void *pixelBuffer) { char errorMessage[100]; std::snprintf(errorMessage, sizeof(errorMessage), "Unsupported CVPixelBuffer format: %u", pixelFormat); - throw RnExecutorchError(RnExecutorchErrorCode::InvalidUserInput, + throw RnExecutorchError(RnExecutorchErrorCode::PlatformNotSupported, errorMessage); } @@ -84,14 +84,15 @@ cv::Mat extractFromAHardwareBuffer(void *hardwareBuffer) { char errorMessage[100]; std::snprintf(errorMessage, sizeof(errorMessage), "Unsupported AHardwareBuffer format: %u", desc.format); - throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, errorMessage); + throw RnExecutorchError(RnExecutorchErrorCode::PlatformNotSupported, + errorMessage); } // Note: We don't unlock here - Vision Camera manages the lifecycle return mat; #else - throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, + throw RnExecutorchError(RnExecutorchErrorCode::PlatformNotSupported, "AHardwareBuffer requires Android API 26+"); #endif // __ANDROID_API__ >= 26 } @@ -105,7 +106,7 @@ cv::Mat extractFromNativeBuffer(uint64_t bufferPtr) { #elif defined(__ANDROID__) return extractFromAHardwareBuffer(reinterpret_cast(bufferPtr)); #else - throw RnExecutorchError(RnExecutorchErrorCode::UnknownError, + throw RnExecutorchError(RnExecutorchErrorCode::PlatformNotSupported, "NativeBuffer not supported on this platform"); #endif } diff --git a/packages/react-native-executorch/src/errors/ErrorCodes.ts b/packages/react-native-executorch/src/errors/ErrorCodes.ts index 3e4e557a1..4ccb1f07f 100644 --- a/packages/react-native-executorch/src/errors/ErrorCodes.ts +++ b/packages/react-native-executorch/src/errors/ErrorCodes.ts @@ -58,6 +58,10 @@ export enum RnExecutorchErrorCode { * Thrown when the number of downloaded files is unexpected, due to download interruptions. */ DownloadInterrupted = 118, + /** + * Thrown when a feature or platform is not supported in the current environment. + */ + PlatformNotSupported = 119, /** * Thrown when an error occurs with the tokenizer or tokenization process. */ diff --git a/scripts/errors.config.ts b/scripts/errors.config.ts index 3e6cf1090..6953eec2e 100644 --- a/scripts/errors.config.ts +++ b/scripts/errors.config.ts @@ -59,6 +59,10 @@ export const errorDefinitions = { * Thrown when the number of downloaded files is unexpected, due to download interruptions. */ DownloadInterrupted: 0x76, + /* + * Thrown when a feature or platform is not supported in the current environment. + */ + PlatformNotSupported: 0x77, /* * Thrown when an error occurs with the tokenizer or tokenization process. From d60e82929b35e69ffe498d69e3ed7af0c832b950 Mon Sep 17 00:00:00 2001 From: Norbert Klockiewicz Date: Mon, 23 Feb 2026 13:38:56 +0100 Subject: [PATCH 16/16] fix: compilation JSI error --- .../common/rnexecutorch/metaprogramming/FunctionHelpers.h | 3 ++- .../models/object_detection/ObjectDetection.cpp | 7 ++----- .../rnexecutorch/models/object_detection/ObjectDetection.h | 3 +-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h index 88bf04bf0..fde81e046 100644 --- a/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h +++ b/packages/react-native-executorch/common/rnexecutorch/metaprogramming/FunctionHelpers.h @@ -24,7 +24,8 @@ template std::tuple fillTupleFromArgs(std::index_sequence, const jsi::Value *args, jsi::Runtime &runtime) { - return std::make_tuple(jsi_conversion::getValue(args[I], runtime)...); + return std::tuple{ + jsi_conversion::getValue(args[I], runtime)...}; } /** 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 1ae2460c3..26e85da9c 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 @@ -147,12 +147,9 @@ ObjectDetection::generateFromFrame(jsi::Runtime &runtime, } std::vector -ObjectDetection::generateFromPixels(jsi::Runtime &runtime, - const jsi::Value &pixelData, +ObjectDetection::generateFromPixels(JSTensorViewIn pixelData, double detectionThreshold) { - auto tensorView = - jsi_conversion::getValue(pixelData, runtime); - cv::Mat image = extractFromPixels(tensorView); + cv::Mat image = extractFromPixels(pixelData); return runInference(image, detectionThreshold); } 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 bf231ff0b..d32eea95e 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 @@ -26,8 +26,7 @@ class ObjectDetection : public VisionModel { 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); + generateFromPixels(JSTensorViewIn pixelData, double detectionThreshold); protected: std::vector runInference(cv::Mat image,