From 1b748ce4864e62ceae714c0e938a14533c652484 Mon Sep 17 00:00:00 2001 From: vadymv-mendix Date: Fri, 8 May 2026 15:47:34 +0200 Subject: [PATCH 01/26] chore: update RN to v084 --- .../project.pbxproj | 12 +- example/ios/Podfile.lock | 643 ++++----- example/package.json | 28 +- package.json | 12 +- src/specs/NativeMendixNative.ts | 36 +- yarn.lock | 1266 ++++++++++------- 6 files changed, 1137 insertions(+), 860 deletions(-) diff --git a/example/ios/MendixNativeExample.xcodeproj/project.pbxproj b/example/ios/MendixNativeExample.xcodeproj/project.pbxproj index 9c8e4be..8d0597b 100644 --- a/example/ios/MendixNativeExample.xcodeproj/project.pbxproj +++ b/example/ios/MendixNativeExample.xcodeproj/project.pbxproj @@ -372,7 +372,10 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "$(inherited)"; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", @@ -380,6 +383,7 @@ "-DFOLLY_USE_LIBCPP=1", "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = ( "$(inherited)", @@ -446,7 +450,10 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = "$(inherited)"; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", @@ -454,6 +461,7 @@ "-DFOLLY_USE_LIBCPP=1", "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = ( "$(inherited)", diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 3db9fce..2fb0a75 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,9 +1,9 @@ PODS: - - FBLazyVector (0.83.4) - - hermes-engine (0.14.1): - - hermes-engine/Pre-built (= 0.14.1) - - hermes-engine/Pre-built (0.14.1) - - MendixNative (0.4.0): + - FBLazyVector (0.84.1) + - hermes-engine (250829098.0.9): + - hermes-engine/Pre-built (= 250829098.0.9) + - hermes-engine/Pre-built (250829098.0.9) + - MendixNative (0.4.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -50,35 +50,35 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - OpenSSL-Universal (3.3.3001) - - RCTDeprecation (0.83.4) - - RCTRequired (0.83.4) - - RCTSwiftUI (0.83.4) - - RCTSwiftUIWrapper (0.83.4): + - OpenSSL-Universal (3.6.0000) + - RCTDeprecation (0.84.1) + - RCTRequired (0.84.1) + - RCTSwiftUI (0.84.1) + - RCTSwiftUIWrapper (0.84.1): - RCTSwiftUI - - RCTTypeSafety (0.83.4): - - FBLazyVector (= 0.83.4) - - RCTRequired (= 0.83.4) - - React-Core (= 0.83.4) - - React (0.83.4): - - React-Core (= 0.83.4) - - React-Core/DevSupport (= 0.83.4) - - React-Core/RCTWebSocket (= 0.83.4) - - React-RCTActionSheet (= 0.83.4) - - React-RCTAnimation (= 0.83.4) - - React-RCTBlob (= 0.83.4) - - React-RCTImage (= 0.83.4) - - React-RCTLinking (= 0.83.4) - - React-RCTNetwork (= 0.83.4) - - React-RCTSettings (= 0.83.4) - - React-RCTText (= 0.83.4) - - React-RCTVibration (= 0.83.4) - - React-callinvoker (0.83.4) - - React-Core (0.83.4): + - RCTTypeSafety (0.84.1): + - FBLazyVector (= 0.84.1) + - RCTRequired (= 0.84.1) + - React-Core (= 0.84.1) + - React (0.84.1): + - React-Core (= 0.84.1) + - React-Core/DevSupport (= 0.84.1) + - React-Core/RCTWebSocket (= 0.84.1) + - React-RCTActionSheet (= 0.84.1) + - React-RCTAnimation (= 0.84.1) + - React-RCTBlob (= 0.84.1) + - React-RCTImage (= 0.84.1) + - React-RCTLinking (= 0.84.1) + - React-RCTNetwork (= 0.84.1) + - React-RCTSettings (= 0.84.1) + - React-RCTText (= 0.84.1) + - React-RCTVibration (= 0.84.1) + - React-callinvoker (0.84.1) + - React-Core (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt - - React-Core/Default (= 0.83.4) + - React-Core/Default (= 0.84.1) - React-cxxreact - React-featureflags - React-hermes @@ -93,9 +93,9 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core-prebuilt (0.83.4): + - React-Core-prebuilt (0.84.1): - ReactNativeDependencies - - React-Core/CoreModulesHeaders (0.83.4): + - React-Core/CoreModulesHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -114,7 +114,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/Default (0.83.4): + - React-Core/Default (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -132,12 +132,12 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/DevSupport (0.83.4): + - React-Core/DevSupport (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt - - React-Core/Default (= 0.83.4) - - React-Core/RCTWebSocket (= 0.83.4) + - React-Core/Default (= 0.84.1) + - React-Core/RCTWebSocket (= 0.84.1) - React-cxxreact - React-featureflags - React-hermes @@ -152,7 +152,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTActionSheetHeaders (0.83.4): + - React-Core/RCTActionSheetHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -171,7 +171,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTAnimationHeaders (0.83.4): + - React-Core/RCTAnimationHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -190,7 +190,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTBlobHeaders (0.83.4): + - React-Core/RCTBlobHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -209,7 +209,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTImageHeaders (0.83.4): + - React-Core/RCTImageHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -228,7 +228,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTLinkingHeaders (0.83.4): + - React-Core/RCTLinkingHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -247,7 +247,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTNetworkHeaders (0.83.4): + - React-Core/RCTNetworkHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -266,7 +266,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTSettingsHeaders (0.83.4): + - React-Core/RCTSettingsHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -285,7 +285,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTTextHeaders (0.83.4): + - React-Core/RCTTextHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -304,7 +304,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTVibrationHeaders (0.83.4): + - React-Core/RCTVibrationHeaders (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt @@ -323,11 +323,11 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-Core/RCTWebSocket (0.83.4): + - React-Core/RCTWebSocket (0.84.1): - hermes-engine - RCTDeprecation - React-Core-prebuilt - - React-Core/Default (= 0.83.4) + - React-Core/Default (= 0.84.1) - React-cxxreact - React-featureflags - React-hermes @@ -342,40 +342,40 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-CoreModules (0.83.4): - - RCTTypeSafety (= 0.83.4) + - React-CoreModules (0.84.1): + - RCTTypeSafety (= 0.84.1) - React-Core-prebuilt - - React-Core/CoreModulesHeaders (= 0.83.4) + - React-Core/CoreModulesHeaders (= 0.84.1) - React-debug - - React-jsi (= 0.83.4) + - React-jsi (= 0.84.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.83.4) + - React-RCTImage (= 0.84.1) - React-runtimeexecutor - React-utils - ReactCommon - ReactNativeDependencies - - React-cxxreact (0.83.4): + - React-cxxreact (0.84.1): - hermes-engine - - React-callinvoker (= 0.83.4) + - React-callinvoker (= 0.84.1) - React-Core-prebuilt - - React-debug (= 0.83.4) - - React-jsi (= 0.83.4) + - React-debug (= 0.84.1) + - React-jsi (= 0.84.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.83.4) - - React-perflogger (= 0.83.4) + - React-logger (= 0.84.1) + - React-perflogger (= 0.84.1) - React-runtimeexecutor - - React-timing (= 0.83.4) + - React-timing (= 0.84.1) - React-utils - ReactNativeDependencies - - React-debug (0.83.4) - - React-defaultsnativemodule (0.83.4): + - React-debug (0.84.1) + - React-defaultsnativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-domnativemodule @@ -390,7 +390,7 @@ PODS: - React-webperformancenativemodule - ReactNativeDependencies - Yoga - - React-domnativemodule (0.83.4): + - React-domnativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-Fabric @@ -404,7 +404,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-Fabric (0.83.4): + - React-Fabric (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -412,25 +412,25 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/animated (= 0.83.4) - - React-Fabric/animationbackend (= 0.83.4) - - React-Fabric/animations (= 0.83.4) - - React-Fabric/attributedstring (= 0.83.4) - - React-Fabric/bridging (= 0.83.4) - - React-Fabric/componentregistry (= 0.83.4) - - React-Fabric/componentregistrynative (= 0.83.4) - - React-Fabric/components (= 0.83.4) - - React-Fabric/consistency (= 0.83.4) - - React-Fabric/core (= 0.83.4) - - React-Fabric/dom (= 0.83.4) - - React-Fabric/imagemanager (= 0.83.4) - - React-Fabric/leakchecker (= 0.83.4) - - React-Fabric/mounting (= 0.83.4) - - React-Fabric/observers (= 0.83.4) - - React-Fabric/scheduler (= 0.83.4) - - React-Fabric/telemetry (= 0.83.4) - - React-Fabric/templateprocessor (= 0.83.4) - - React-Fabric/uimanager (= 0.83.4) + - React-Fabric/animated (= 0.84.1) + - React-Fabric/animationbackend (= 0.84.1) + - React-Fabric/animations (= 0.84.1) + - React-Fabric/attributedstring (= 0.84.1) + - React-Fabric/bridging (= 0.84.1) + - React-Fabric/componentregistry (= 0.84.1) + - React-Fabric/componentregistrynative (= 0.84.1) + - React-Fabric/components (= 0.84.1) + - React-Fabric/consistency (= 0.84.1) + - React-Fabric/core (= 0.84.1) + - React-Fabric/dom (= 0.84.1) + - React-Fabric/imagemanager (= 0.84.1) + - React-Fabric/leakchecker (= 0.84.1) + - React-Fabric/mounting (= 0.84.1) + - React-Fabric/observers (= 0.84.1) + - React-Fabric/scheduler (= 0.84.1) + - React-Fabric/telemetry (= 0.84.1) + - React-Fabric/templateprocessor (= 0.84.1) + - React-Fabric/uimanager (= 0.84.1) - React-featureflags - React-graphics - React-jsi @@ -442,7 +442,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/animated (0.83.4): + - React-Fabric/animated (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -461,7 +461,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/animationbackend (0.83.4): + - React-Fabric/animationbackend (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -480,7 +480,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/animations (0.83.4): + - React-Fabric/animations (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -499,7 +499,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/attributedstring (0.83.4): + - React-Fabric/attributedstring (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -518,7 +518,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/bridging (0.83.4): + - React-Fabric/bridging (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -537,7 +537,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/componentregistry (0.83.4): + - React-Fabric/componentregistry (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -556,7 +556,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/componentregistrynative (0.83.4): + - React-Fabric/componentregistrynative (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -575,7 +575,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components (0.83.4): + - React-Fabric/components (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -583,10 +583,10 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.83.4) - - React-Fabric/components/root (= 0.83.4) - - React-Fabric/components/scrollview (= 0.83.4) - - React-Fabric/components/view (= 0.83.4) + - React-Fabric/components/legacyviewmanagerinterop (= 0.84.1) + - React-Fabric/components/root (= 0.84.1) + - React-Fabric/components/scrollview (= 0.84.1) + - React-Fabric/components/view (= 0.84.1) - React-featureflags - React-graphics - React-jsi @@ -598,7 +598,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/legacyviewmanagerinterop (0.83.4): + - React-Fabric/components/legacyviewmanagerinterop (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -617,7 +617,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/root (0.83.4): + - React-Fabric/components/root (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -636,7 +636,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/scrollview (0.83.4): + - React-Fabric/components/scrollview (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -655,7 +655,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/components/view (0.83.4): + - React-Fabric/components/view (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -676,7 +676,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-Fabric/consistency (0.83.4): + - React-Fabric/consistency (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -695,7 +695,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/core (0.83.4): + - React-Fabric/core (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -714,7 +714,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/dom (0.83.4): + - React-Fabric/dom (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -733,7 +733,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/imagemanager (0.83.4): + - React-Fabric/imagemanager (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -752,7 +752,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/leakchecker (0.83.4): + - React-Fabric/leakchecker (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -771,7 +771,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/mounting (0.83.4): + - React-Fabric/mounting (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -790,7 +790,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/observers (0.83.4): + - React-Fabric/observers (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -798,8 +798,8 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.83.4) - - React-Fabric/observers/intersection (= 0.83.4) + - React-Fabric/observers/events (= 0.84.1) + - React-Fabric/observers/intersection (= 0.84.1) - React-featureflags - React-graphics - React-jsi @@ -811,7 +811,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/observers/events (0.83.4): + - React-Fabric/observers/events (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -830,7 +830,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/observers/intersection (0.83.4): + - React-Fabric/observers/intersection (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -849,7 +849,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/scheduler (0.83.4): + - React-Fabric/scheduler (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -871,7 +871,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/telemetry (0.83.4): + - React-Fabric/telemetry (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -890,7 +890,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/templateprocessor (0.83.4): + - React-Fabric/templateprocessor (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -909,7 +909,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/uimanager (0.83.4): + - React-Fabric/uimanager (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -917,7 +917,7 @@ PODS: - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.83.4) + - React-Fabric/uimanager/consistency (= 0.84.1) - React-featureflags - React-graphics - React-jsi @@ -930,7 +930,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-Fabric/uimanager/consistency (0.83.4): + - React-Fabric/uimanager/consistency (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -950,7 +950,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-FabricComponents (0.83.4): + - React-FabricComponents (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -959,8 +959,8 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.83.4) - - React-FabricComponents/textlayoutmanager (= 0.83.4) + - React-FabricComponents/components (= 0.84.1) + - React-FabricComponents/textlayoutmanager (= 0.84.1) - React-featureflags - React-graphics - React-jsi @@ -973,7 +973,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components (0.83.4): + - React-FabricComponents/components (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -982,18 +982,18 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.83.4) - - React-FabricComponents/components/iostextinput (= 0.83.4) - - React-FabricComponents/components/modal (= 0.83.4) - - React-FabricComponents/components/rncore (= 0.83.4) - - React-FabricComponents/components/safeareaview (= 0.83.4) - - React-FabricComponents/components/scrollview (= 0.83.4) - - React-FabricComponents/components/switch (= 0.83.4) - - React-FabricComponents/components/text (= 0.83.4) - - React-FabricComponents/components/textinput (= 0.83.4) - - React-FabricComponents/components/unimplementedview (= 0.83.4) - - React-FabricComponents/components/virtualview (= 0.83.4) - - React-FabricComponents/components/virtualviewexperimental (= 0.83.4) + - React-FabricComponents/components/inputaccessory (= 0.84.1) + - React-FabricComponents/components/iostextinput (= 0.84.1) + - React-FabricComponents/components/modal (= 0.84.1) + - React-FabricComponents/components/rncore (= 0.84.1) + - React-FabricComponents/components/safeareaview (= 0.84.1) + - React-FabricComponents/components/scrollview (= 0.84.1) + - React-FabricComponents/components/switch (= 0.84.1) + - React-FabricComponents/components/text (= 0.84.1) + - React-FabricComponents/components/textinput (= 0.84.1) + - React-FabricComponents/components/unimplementedview (= 0.84.1) + - React-FabricComponents/components/virtualview (= 0.84.1) + - React-FabricComponents/components/virtualviewexperimental (= 0.84.1) - React-featureflags - React-graphics - React-jsi @@ -1006,7 +1006,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/inputaccessory (0.83.4): + - React-FabricComponents/components/inputaccessory (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1027,7 +1027,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/iostextinput (0.83.4): + - React-FabricComponents/components/iostextinput (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1048,7 +1048,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/modal (0.83.4): + - React-FabricComponents/components/modal (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1069,7 +1069,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/rncore (0.83.4): + - React-FabricComponents/components/rncore (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1090,7 +1090,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/safeareaview (0.83.4): + - React-FabricComponents/components/safeareaview (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1111,7 +1111,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/scrollview (0.83.4): + - React-FabricComponents/components/scrollview (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1132,7 +1132,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/switch (0.83.4): + - React-FabricComponents/components/switch (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1153,7 +1153,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/text (0.83.4): + - React-FabricComponents/components/text (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1174,7 +1174,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/textinput (0.83.4): + - React-FabricComponents/components/textinput (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1195,7 +1195,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/unimplementedview (0.83.4): + - React-FabricComponents/components/unimplementedview (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1216,7 +1216,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/virtualview (0.83.4): + - React-FabricComponents/components/virtualview (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1237,7 +1237,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/components/virtualviewexperimental (0.83.4): + - React-FabricComponents/components/virtualviewexperimental (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1258,7 +1258,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricComponents/textlayoutmanager (0.83.4): + - React-FabricComponents/textlayoutmanager (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1279,27 +1279,27 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-FabricImage (0.83.4): + - React-FabricImage (0.84.1): - hermes-engine - - RCTRequired (= 0.83.4) - - RCTTypeSafety (= 0.83.4) + - RCTRequired (= 0.84.1) + - RCTTypeSafety (= 0.84.1) - React-Core-prebuilt - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.83.4) + - React-jsiexecutor (= 0.84.1) - React-logger - React-rendererdebug - React-utils - ReactCommon - ReactNativeDependencies - Yoga - - React-featureflags (0.83.4): + - React-featureflags (0.84.1): - React-Core-prebuilt - ReactNativeDependencies - - React-featureflagsnativemodule (0.83.4): + - React-featureflagsnativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-featureflags @@ -1308,27 +1308,28 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-graphics (0.83.4): + - React-graphics (0.84.1): - hermes-engine - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-utils - ReactNativeDependencies - - React-hermes (0.83.4): + - React-hermes (0.84.1): - hermes-engine - React-Core-prebuilt - - React-cxxreact (= 0.83.4) + - React-cxxreact (= 0.84.1) - React-jsi - - React-jsiexecutor (= 0.83.4) + - React-jsiexecutor (= 0.84.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing + - React-jsitooling - React-oscompat - - React-perflogger (= 0.83.4) + - React-perflogger (= 0.84.1) - React-runtimeexecutor - ReactNativeDependencies - - React-idlecallbacksnativemodule (0.83.4): + - React-idlecallbacksnativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1338,7 +1339,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-ImageManager (0.83.4): + - React-ImageManager (0.84.1): - React-Core-prebuilt - React-Core/Default - React-debug @@ -1347,7 +1348,7 @@ PODS: - React-rendererdebug - React-utils - ReactNativeDependencies - - React-intersectionobservernativemodule (0.83.4): + - React-intersectionobservernativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1362,7 +1363,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - React-jserrorhandler (0.83.4): + - React-jserrorhandler (0.84.1): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1371,24 +1372,26 @@ PODS: - React-jsi - ReactCommon/turbomodule/bridging - ReactNativeDependencies - - React-jsi (0.83.4): + - React-jsi (0.84.1): - hermes-engine - React-Core-prebuilt - ReactNativeDependencies - - React-jsiexecutor (0.83.4): + - React-jsiexecutor (0.84.1): - hermes-engine - React-Core-prebuilt - React-cxxreact - React-debug + - React-jserrorhandler - React-jsi - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing + - React-jsitooling - React-perflogger - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-jsinspector (0.83.4): + - React-jsinspector (0.84.1): - hermes-engine - React-Core-prebuilt - React-featureflags @@ -1397,18 +1400,18 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.83.4) + - React-perflogger (= 0.84.1) - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-jsinspectorcdp (0.83.4): + - React-jsinspectorcdp (0.84.1): - React-Core-prebuilt - ReactNativeDependencies - - React-jsinspectornetwork (0.83.4): + - React-jsinspectornetwork (0.84.1): - React-Core-prebuilt - React-jsinspectorcdp - ReactNativeDependencies - - React-jsinspectortracing (0.83.4): + - React-jsinspectortracing (0.84.1): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1416,27 +1419,28 @@ PODS: - React-oscompat - React-timing - ReactNativeDependencies - - React-jsitooling (0.83.4): + - React-jsitooling (0.84.1): + - hermes-engine - React-Core-prebuilt - - React-cxxreact (= 0.83.4) + - React-cxxreact (= 0.84.1) - React-debug - - React-jsi (= 0.83.4) + - React-jsi (= 0.84.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-jsitracing (0.83.4): + - React-jsitracing (0.84.1): - React-jsi - - React-logger (0.83.4): + - React-logger (0.84.1): - React-Core-prebuilt - ReactNativeDependencies - - React-Mapbuffer (0.83.4): + - React-Mapbuffer (0.84.1): - React-Core-prebuilt - React-debug - ReactNativeDependencies - - React-microtasksnativemodule (0.83.4): + - React-microtasksnativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1444,7 +1448,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-NativeModulesApple (0.83.4): + - React-NativeModulesApple (0.84.1): - hermes-engine - React-callinvoker - React-Core @@ -1459,19 +1463,18 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - React-networking (0.83.4): + - React-networking (0.84.1): - React-Core-prebuilt - - React-featureflags - React-jsinspectornetwork - React-jsinspectortracing - React-performancetimeline - React-timing - ReactNativeDependencies - - React-oscompat (0.83.4) - - React-perflogger (0.83.4): + - React-oscompat (0.84.1) + - React-perflogger (0.84.1): - React-Core-prebuilt - ReactNativeDependencies - - React-performancecdpmetrics (0.83.4): + - React-performancecdpmetrics (0.84.1): - hermes-engine - React-Core-prebuilt - React-jsi @@ -1479,26 +1482,28 @@ PODS: - React-runtimeexecutor - React-timing - ReactNativeDependencies - - React-performancetimeline (0.83.4): + - React-performancetimeline (0.84.1): - React-Core-prebuilt - React-featureflags + - React-jsinspector - React-jsinspectortracing - React-perflogger - React-timing - ReactNativeDependencies - - React-RCTActionSheet (0.83.4): - - React-Core/RCTActionSheetHeaders (= 0.83.4) - - React-RCTAnimation (0.83.4): + - React-RCTActionSheet (0.84.1): + - React-Core/RCTActionSheetHeaders (= 0.84.1) + - React-RCTAnimation (0.84.1): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTAnimationHeaders + - React-debug - React-featureflags - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-RCTAppDelegate (0.83.4): + - React-RCTAppDelegate (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1526,7 +1531,7 @@ PODS: - React-utils - ReactCommon - ReactNativeDependencies - - React-RCTBlob (0.83.4): + - React-RCTBlob (0.84.1): - hermes-engine - React-Core-prebuilt - React-Core/RCTBlobHeaders @@ -1539,7 +1544,7 @@ PODS: - React-RCTNetwork - ReactCommon - ReactNativeDependencies - - React-RCTFabric (0.83.4): + - React-RCTFabric (0.84.1): - hermes-engine - RCTSwiftUIWrapper - React-Core @@ -1570,7 +1575,7 @@ PODS: - React-utils - ReactNativeDependencies - Yoga - - React-RCTFBReactNativeSpec (0.83.4): + - React-RCTFBReactNativeSpec (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1578,10 +1583,10 @@ PODS: - React-Core-prebuilt - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.83.4) + - React-RCTFBReactNativeSpec/components (= 0.84.1) - ReactCommon - ReactNativeDependencies - - React-RCTFBReactNativeSpec/components (0.83.4): + - React-RCTFBReactNativeSpec/components (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1598,7 +1603,7 @@ PODS: - ReactCommon - ReactNativeDependencies - Yoga - - React-RCTImage (0.83.4): + - React-RCTImage (0.84.1): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTImageHeaders @@ -1608,14 +1613,14 @@ PODS: - React-RCTNetwork - ReactCommon - ReactNativeDependencies - - React-RCTLinking (0.83.4): - - React-Core/RCTLinkingHeaders (= 0.83.4) - - React-jsi (= 0.83.4) + - React-RCTLinking (0.84.1): + - React-Core/RCTLinkingHeaders (= 0.84.1) + - React-jsi (= 0.84.1) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.83.4) - - React-RCTNetwork (0.83.4): + - ReactCommon/turbomodule/core (= 0.84.1) + - React-RCTNetwork (0.84.1): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTNetworkHeaders @@ -1629,7 +1634,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-RCTRuntime (0.83.4): + - React-RCTRuntime (0.84.1): - hermes-engine - React-Core - React-Core-prebuilt @@ -1645,7 +1650,7 @@ PODS: - React-RuntimeHermes - React-utils - ReactNativeDependencies - - React-RCTSettings (0.83.4): + - React-RCTSettings (0.84.1): - RCTTypeSafety - React-Core-prebuilt - React-Core/RCTSettingsHeaders @@ -1654,10 +1659,10 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-RCTText (0.83.4): - - React-Core/RCTTextHeaders (= 0.83.4) + - React-RCTText (0.84.1): + - React-Core/RCTTextHeaders (= 0.84.1) - Yoga - - React-RCTVibration (0.83.4): + - React-RCTVibration (0.84.1): - React-Core-prebuilt - React-Core/RCTVibrationHeaders - React-jsi @@ -1665,15 +1670,15 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - ReactNativeDependencies - - React-rendererconsistency (0.83.4) - - React-renderercss (0.83.4): + - React-rendererconsistency (0.84.1) + - React-renderercss (0.84.1): - React-debug - React-utils - - React-rendererdebug (0.83.4): + - React-rendererdebug (0.84.1): - React-Core-prebuilt - React-debug - ReactNativeDependencies - - React-RuntimeApple (0.83.4): + - React-RuntimeApple (0.84.1): - hermes-engine - React-callinvoker - React-Core-prebuilt @@ -1696,7 +1701,7 @@ PODS: - React-runtimescheduler - React-utils - ReactNativeDependencies - - React-RuntimeCore (0.83.4): + - React-RuntimeCore (0.84.1): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1712,14 +1717,14 @@ PODS: - React-runtimescheduler - React-utils - ReactNativeDependencies - - React-runtimeexecutor (0.83.4): + - React-runtimeexecutor (0.84.1): - React-Core-prebuilt - React-debug - React-featureflags - - React-jsi (= 0.83.4) + - React-jsi (= 0.84.1) - React-utils - ReactNativeDependencies - - React-RuntimeHermes (0.83.4): + - React-RuntimeHermes (0.84.1): - hermes-engine - React-Core-prebuilt - React-featureflags @@ -1734,7 +1739,7 @@ PODS: - React-runtimeexecutor - React-utils - ReactNativeDependencies - - React-runtimescheduler (0.83.4): + - React-runtimescheduler (0.84.1): - hermes-engine - React-callinvoker - React-Core-prebuilt @@ -1750,15 +1755,15 @@ PODS: - React-timing - React-utils - ReactNativeDependencies - - React-timing (0.83.4): + - React-timing (0.84.1): - React-debug - - React-utils (0.83.4): + - React-utils (0.84.1): - hermes-engine - React-Core-prebuilt - React-debug - - React-jsi (= 0.83.4) + - React-jsi (= 0.84.1) - ReactNativeDependencies - - React-webperformancenativemodule (0.83.4): + - React-webperformancenativemodule (0.84.1): - hermes-engine - React-Core-prebuilt - React-cxxreact @@ -1769,9 +1774,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - ReactNativeDependencies - - ReactAppDependencyProvider (0.83.4): + - ReactAppDependencyProvider (0.84.1): - ReactCodegen - - ReactCodegen (0.83.4): + - ReactCodegen (0.84.1): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1791,43 +1796,43 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - ReactCommon (0.83.4): + - ReactCommon (0.84.1): - React-Core-prebuilt - - ReactCommon/turbomodule (= 0.83.4) + - ReactCommon/turbomodule (= 0.84.1) - ReactNativeDependencies - - ReactCommon/turbomodule (0.83.4): + - ReactCommon/turbomodule (0.84.1): - hermes-engine - - React-callinvoker (= 0.83.4) + - React-callinvoker (= 0.84.1) - React-Core-prebuilt - - React-cxxreact (= 0.83.4) - - React-jsi (= 0.83.4) - - React-logger (= 0.83.4) - - React-perflogger (= 0.83.4) - - ReactCommon/turbomodule/bridging (= 0.83.4) - - ReactCommon/turbomodule/core (= 0.83.4) + - React-cxxreact (= 0.84.1) + - React-jsi (= 0.84.1) + - React-logger (= 0.84.1) + - React-perflogger (= 0.84.1) + - ReactCommon/turbomodule/bridging (= 0.84.1) + - ReactCommon/turbomodule/core (= 0.84.1) - ReactNativeDependencies - - ReactCommon/turbomodule/bridging (0.83.4): + - ReactCommon/turbomodule/bridging (0.84.1): - hermes-engine - - React-callinvoker (= 0.83.4) + - React-callinvoker (= 0.84.1) - React-Core-prebuilt - - React-cxxreact (= 0.83.4) - - React-jsi (= 0.83.4) - - React-logger (= 0.83.4) - - React-perflogger (= 0.83.4) + - React-cxxreact (= 0.84.1) + - React-jsi (= 0.84.1) + - React-logger (= 0.84.1) + - React-perflogger (= 0.84.1) - ReactNativeDependencies - - ReactCommon/turbomodule/core (0.83.4): + - ReactCommon/turbomodule/core (0.84.1): - hermes-engine - - React-callinvoker (= 0.83.4) + - React-callinvoker (= 0.84.1) - React-Core-prebuilt - - React-cxxreact (= 0.83.4) - - React-debug (= 0.83.4) - - React-featureflags (= 0.83.4) - - React-jsi (= 0.83.4) - - React-logger (= 0.83.4) - - React-perflogger (= 0.83.4) - - React-utils (= 0.83.4) + - React-cxxreact (= 0.84.1) + - React-debug (= 0.84.1) + - React-featureflags (= 0.84.1) + - React-jsi (= 0.84.1) + - React-logger (= 0.84.1) + - React-perflogger (= 0.84.1) + - React-utils (= 0.84.1) - ReactNativeDependencies - - ReactNativeDependencies (0.83.4) + - ReactNativeDependencies (0.84.1) - RNCAsyncStorage (2.2.0): - hermes-engine - RCTRequired @@ -1850,7 +1855,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - RNGestureHandler (2.30.0): + - RNGestureHandler (2.31.2): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1965,7 +1970,7 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/FBLazyVector" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-v0.14.1 + :tag: hermes-v250829098.0.9 MendixNative: :path: "../.." op-sqlite: @@ -2118,85 +2123,85 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - FBLazyVector: 061f518bbd81677ed8a8317e2ae60b8779495808 - hermes-engine: f8a008831ed2a6655a05eec287332a01c1c2e108 - MendixNative: d23548dd07ed06f0d6243ee934963715adbf215d + FBLazyVector: e97c19a5a442429d1988f182a1940fb08df514da + hermes-engine: 22eccaf19c439374e5cd56a3e71cf0ba6d19c2b4 + MendixNative: 27efb5f8b34da919431b0ee534de0d552c58b259 op-sqlite: e9ef65bcf95a97863874cee87841425bb71c8396 - OpenSSL-Universal: 6082b0bf950e5636fe0d78def171184e2b3899c2 - RCTDeprecation: 5045f20b2cc1239bf422764004338c720684a22f - RCTRequired: b6b9724225dd780ac2989d2e575d5513c50fe04b - RCTSwiftUI: 395b65655229fa2006415207adcfcb6e35dc78ed - RCTSwiftUIWrapper: 91351441a592e07e09a2f94d2cbdf088fde7e2e1 - RCTTypeSafety: dfd539968f0b82892da72bb32b7d8aa2f5789622 - React: 3e14066ac707b3e369d09e2e923d8bee7f8c33ff - React-callinvoker: bd7959a24564feaf5e4c8c11789e64884da13482 - React-Core: f060f4e14e9301685ce63ea65fbe903bf3397e45 - React-Core-prebuilt: cf5b4ab35c4238252626d92d316fe38c2af03ddb - React-CoreModules: 89a1a544297be88ca4cdff317423f9e0d0c192a4 - React-cxxreact: 81b1bfa305b1b759cc0fe18327644816216e5993 - React-debug: 234fddb309822e13b9b442ef1bdca8d2b8c3cbf2 - React-defaultsnativemodule: e465ef591eee34d967cd8542d3e2a4e3d46a354e - React-domnativemodule: e0df99aca200b98799d97323b7e8ceec67ed205b - React-Fabric: 78be00ef029f74f47ae75b8aac163c108b049c55 - React-FabricComponents: 84a6c91260cbcc4382380c16eb68b41118d59a49 - React-FabricImage: 52851292bb447ce2f77bfd1b053102fda5f47864 - React-featureflags: 5868b47efa183acb7e50be2a0313f81101049ce4 - React-featureflagsnativemodule: f2d8c27152f3e09c4448ab86012a0499785599d7 - React-graphics: 96a2a086c46f9a3577b67ce3298c0c5935251104 - React-hermes: 8a2af4efdf2c8bcb98ac60dc7fe9541bf1e7ce0d - React-idlecallbacksnativemodule: 010e6287d81d99f74a1922009ca50cd8228d5db0 - React-ImageManager: d8404f1283093dbb0a43452a9558f055d9982658 - React-intersectionobservernativemodule: 44cd7c0c5c21da8f5847ab59d65f65e3c4208c2c - React-jserrorhandler: d4c73c16ba639be63387971a2d52d478d6d1f8bd - React-jsi: e901e18fd04833b441de6803565903eb55336b24 - React-jsiexecutor: bc6a2b2d53ce85c5f235f0cd3993c3ecc6fbd5e4 - React-jsinspector: 603e56d09fdeccd36aef1d3515e0010680c46779 - React-jsinspectorcdp: 7cddf91b091012c09d53d7ef1aef6774a99c33b8 - React-jsinspectornetwork: c8c0bbdd96a056bd42aed980eff6991c935179e9 - React-jsinspectortracing: 1fde11514a9d7b30884e29bb063d2b7c2a0b8479 - React-jsitooling: 3b1d0a6df5ced5ca15566149d9a3dd46657d1cdd - React-jsitracing: dcc408e8d0f91e47cf5850814bfe0c2d2253f61f - React-logger: d0632d799fbd3507cdd5406f72489a83ed5f9163 - React-Mapbuffer: 274cb203819492f7fb594bbb3a1f3f5061fa794d - React-microtasksnativemodule: 563b4dcc8b8570814d6de4fc1196f48d2944acd4 - React-NativeModulesApple: f3eb751b0ea23645a5283ed8c8bb8ebeeda32d15 - React-networking: af5eba8ccda3334cd2f6246b599d3b55bb73eb2e - React-oscompat: 3774ed6bc0e9866ff7236b94adbc7ad33ceaecdd - React-perflogger: 9b2532c128b02a64ae9e5f73c11b5564f2547635 - React-performancecdpmetrics: 7e2785e9bf6b2e6d4d773c591df0e1329678681b - React-performancetimeline: b94b69786a7226d6ab414d1b2e0bf1f60b4e6696 - React-RCTActionSheet: f2148e4017876b944dc9c931f1c56ca7234c290a - React-RCTAnimation: 33e94951f811fb5571e7160165669344d2b22160 - React-RCTAppDelegate: 1621957224c5256869a4deccc42b6741b178e08f - React-RCTBlob: 761bf4785bc035196b20778cca136b0823d32233 - React-RCTFabric: 470928ef9074b7bb00a29ca6142fe34fb7ee81c9 - React-RCTFBReactNativeSpec: 2904ab623b779afa0a2a450947159e0e28ffc894 - React-RCTImage: 5560e503c96e247313b082c879a19cc211ee9f30 - React-RCTLinking: 0ac9f185ea77603c5481a3ed482e7d907c37c3bf - React-RCTNetwork: 72785a503a1f4ef37d7ee874d2e1e5397440338e - React-RCTRuntime: a5a9cb0ab150d114b00d7bbf1893c1db4b157a50 - React-RCTSettings: 89669a77d7eb5cc0ee9b5dac511107d385735c3b - React-RCTText: fd853dcbdcf3c46b08b53bf3fa2b8a817a4bd249 - React-RCTVibration: 976f18168451ab9c2ed338ab8517b2ad560c9020 - React-rendererconsistency: 0db1699629cdfb8110c2e12990e35aa01da2e197 - React-renderercss: ed517df279318338a0b153f9bd378403e8fc7ca6 - React-rendererdebug: d7f5a1c875e3278be110cbb340ad70940c64bf9a - React-RuntimeApple: 6f5f92a383b0d62661d81b060377c14bf4bef5c0 - React-RuntimeCore: 5fa926643f76ec9b359edef2e93f7aa9bc1983c5 - React-runtimeexecutor: f603dc903a3f4a30d319294ccdde90568baa5212 - React-RuntimeHermes: f2316b8ae36214a9a264d4bff5f0d77f7eb78238 - React-runtimescheduler: 22498bd949afb9c56280a23f507bf4767b06b96c - React-timing: ede821a42176a0b3c90a60ea9b85ced1f70b3612 - React-utils: 6e94fb28c75cd15b4a6bacf93ee5a232f35db3ac - React-webperformancenativemodule: c5ea6876ea8eb9908c12cdeae9fa48b1b06cc7b3 - ReactAppDependencyProvider: 2b19d66e5ddfe8dc7afb6338a4626156cbf2bab1 - ReactCodegen: 43f0948182edee9407c7b977fb059455dfeb9361 - ReactCommon: c6e81cc1ae185fa84863f3ea1d58caac4be741d7 - ReactNativeDependencies: 8639b1a01053279dc8b0ed7effdc4516d80cccf9 + OpenSSL-Universal: 9110d21982bb7e8b22a962b6db56a8aa805afde7 + RCTDeprecation: af44b104091a34482596cd9bd7e8d90c4e9b4bd7 + RCTRequired: bb77b070f75f53398ce43c0aaaa58337cebe2bf6 + RCTSwiftUI: afc0a0a635860da1040a0b894bfd529da06d7810 + RCTSwiftUIWrapper: 3197c020094f3b2151bb2d1223f7276787be8166 + RCTTypeSafety: d13e192a37f151ce354641184bf4239844a3be17 + React: 1ba7d364ade7d883a1ec055bfc3606f35fdee17b + React-callinvoker: bc2a26f8d84fb01f003fc6de6c9337b64715f95b + React-Core: 7840d3a80b43a95c5e80ef75146bd70925ebab0f + React-Core-prebuilt: 47c5816551bb8ab769edb186fa6b2290ad5fcbc5 + React-CoreModules: 2eb010400b63b89e53a324ffb3c112e4c7c3ce42 + React-cxxreact: a558e92199d26f145afa9e62c4233cf8e7950efe + React-debug: 755200a6e7f5e6e0a40ff8d215493d43cce285fc + React-defaultsnativemodule: bb85b1bdd9b4b82650cfa92998567fcfdb030145 + React-domnativemodule: ffdba8ba4323387e821d8298be2013516036df87 + React-Fabric: 8705ba7f14acf5b1df474d1af4b0191c69ac4690 + React-FabricComponents: 5a1b5007fe8c5d5f043e45c335ebef2af0717fb2 + React-FabricImage: e96eea6bb65b501cf5db3ce4ad057a97dea1dd69 + React-featureflags: 410f6c383eb94019f63f105374d738169df291ae + React-featureflagsnativemodule: 5d6d7931ec5d4576639661c0f79169a0ae383023 + React-graphics: b9b69adbe79d6944838aa304c849d78f977e9f21 + React-hermes: 666c66bbc856b46dfa4b132f1c9efaa37ad419a1 + React-idlecallbacksnativemodule: 785d307b9236ec9fb4ec0bcf99b34e8539d2d76e + React-ImageManager: daeef8b1c19803c71a9233f21f7f235cd3ec294e + React-intersectionobservernativemodule: c17189d2350205012682aefe566f7ebaa4f980e3 + React-jserrorhandler: 431377b3d1783127bc394986fe8d932bcb8982fe + React-jsi: 33db13b95bb53827b03d9fb0f567d12b63dfc8ef + React-jsiexecutor: 49de4d48a7c4f283eaa865f7a4f3919f2c39be1c + React-jsinspector: 3ec7dd478806a0eb4ec6ab394e51a395e8f895ba + React-jsinspectorcdp: bcb79a666959b1a3e8aac3ff8209d05c719aaa2a + React-jsinspectornetwork: be3b81a6342b56c74dd0bdd58bf3f62f978c1472 + React-jsinspectortracing: 293251deadf7c255da593bf1d9d337a645abdfdc + React-jsitooling: 6f729cdb85ff0c8294709ec1903e1f0c59662331 + React-jsitracing: be95d903cc9440ab89a704c999dd7db6675dc47f + React-logger: b5521614afb8690420146dfc61a1447bb5d65419 + React-Mapbuffer: f4ee8c62e0ef8359d139124f35a471518a172cd3 + React-microtasksnativemodule: d1956f0eec54c619b63a379520fb4c618a55ccb9 + React-NativeModulesApple: 5ba0903927f6b8d335a091700e9fda143980f819 + React-networking: 3a4b7f9ed2b2d1c0441beacb79674323a24bcca6 + React-oscompat: ff26abf0ae3e3fdbe47b44224571e3fc7226a573 + React-perflogger: a86b2146936f2ffa80188425c6e8892729e2ad01 + React-performancecdpmetrics: 65b699c3e52c0a1d978d9cdf15e60c62e335b900 + React-performancetimeline: b44f82caa563e46068d02d9cf5b0d2b84bdc7a6a + React-RCTActionSheet: fc1d5d419856868e7f8c13c14591ed63dadef43a + React-RCTAnimation: 2a1e7eeb55b71e8524db296fa31e46eeaa2d0da4 + React-RCTAppDelegate: 317c1102a2d0bcc07567d8de58d9147102080b0e + React-RCTBlob: c82bbf96b2d1389550c05fb9739d4e85d471052e + React-RCTFabric: d82ad8120ba70fe63207e261b9e33d9b6077e2de + React-RCTFBReactNativeSpec: 4d33b5f3b339e9fa902168e8a1d62c458dda16e9 + React-RCTImage: f959463e53ea731ab267e371eea1b92fccf27634 + React-RCTLinking: 2a857113b8059ac4f0a8ae89f8aa312837b955d0 + React-RCTNetwork: dc026bf25f6457249349be8cf8bd5fdf84cdfb14 + React-RCTRuntime: b0630731fd864064066301e1e31406fea606d5f9 + React-RCTSettings: e159e19475df2e92fd3b4ddcfe29f6cc12cf0ee4 + React-RCTText: 7356cc84c2ed79635931891c176f72e0289dc75d + React-RCTVibration: 77621175b67b22e655ce4b29d1cda8498f2033e7 + React-rendererconsistency: e91aba4bb482dac127ad955dba6333a8af629c5b + React-renderercss: 7cc41efaecf557d7b70edaa08fad5ace79f714f6 + React-rendererdebug: 0f004cbed7b4c27327423be47209770830bf3c6d + React-RuntimeApple: 6f4ff8e2d8b05cb3ceabf57e494c04da8751f009 + React-RuntimeCore: 25be9c7025eabb524cd00dbb6ce56d6b122e3d92 + React-runtimeexecutor: 84d394b9f0a8fc7dab8a98bf88a43228bb04dac2 + React-RuntimeHermes: 2bed5b2d2419945cc5c2f6d627a1b46ce3a0f66a + React-runtimescheduler: 23b092dbcd3088f9c947551c23366dd00254caf3 + React-timing: 2ab9ccd4b41aa171090c16f664f6c5bfb2fd0ddc + React-utils: 8d888b379f0808bfabaea03d85f9e8dd9b8548da + React-webperformancenativemodule: c10016db7f1bb1153060d4aa9f7dbde2c88c845d + ReactAppDependencyProvider: e96e93b493d8d86eeaee3e590ba0be53f6abe46f + ReactCodegen: 797de5178718324c6eba3327b07f9a423fbd5787 + ReactCommon: 07572bf9e687c8a52fbe4a3641e9e3a1a477c78e + ReactNativeDependencies: 8fb48ccd03b7da33b8d37ae401be080e71f782df RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 - RNGestureHandler: 5494787ce29288a8941fa825663f2b1fa0a5aaf1 + RNGestureHandler: b4f6de20b30325ee40b693f558ad02213201ce91 SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef - Yoga: acd565934addf7423687593ec490bd4491b2a802 + Yoga: c0b3f2c7e8d3e327e450223a2414ca3fa296b9a2 PODFILE CHECKSUM: 115c3d28fbc33ec0a408f3aba951d5d16e47a401 diff --git a/example/package.json b/example/package.json index 5a5c165..2f511bc 100644 --- a/example/package.json +++ b/example/package.json @@ -25,28 +25,28 @@ "@op-engineering/op-sqlite": "15.2.5", "@react-native-async-storage/async-storage": "2.2.0", "react": "19.2.4", - "react-native": "0.83.4", - "react-native-gesture-handler": "2.30.0" + "react-native": "0.84.1", + "react-native-gesture-handler": "2.31.2" }, "devDependencies": { "@babel/core": "7.29.0", "@babel/preset-env": "7.29.0", "@babel/runtime": "^7.28.6", - "@react-native-community/cli": "20.1.2", - "@react-native-community/cli-platform-android": "20.1.2", - "@react-native-community/cli-platform-ios": "20.1.2", - "@react-native-harness/jest": "1.0.0-alpha.21", - "@react-native-harness/platform-android": "1.0.0-alpha.21", - "@react-native-harness/platform-apple": "1.0.0-alpha.21", - "@react-native/babel-preset": "0.83.4", - "@react-native/metro-config": "0.83.4", - "@react-native/typescript-config": "0.83.4", + "@react-native-community/cli": "20.1.3", + "@react-native-community/cli-platform-android": "20.1.3", + "@react-native-community/cli-platform-ios": "20.1.3", + "@react-native-harness/jest": "1.1.0", + "@react-native-harness/platform-android": "1.1.0", + "@react-native-harness/platform-apple": "1.1.0", + "@react-native/babel-preset": "0.84.1", + "@react-native/metro-config": "0.84.1", + "@react-native/typescript-config": "0.84.1", "@types/react": "19.2.14", "react-native-builder-bob": "0.40.18", - "react-native-harness": "1.0.0", - "react-native-monorepo-config": "0.1.10" + "react-native-harness": "1.1.0", + "react-native-monorepo-config": "0.3.3" }, "engines": { - "node": ">=18" + "node": ">=22" } } diff --git a/package.json b/package.json index 4aa22ce..b8eae33 100644 --- a/package.json +++ b/package.json @@ -66,9 +66,9 @@ "@eslint/js": "9.39.4", "@op-engineering/op-sqlite": "15.2.5", "@react-native-async-storage/async-storage": "2.2.0", - "@react-native-community/cli": "20.1.2", - "@react-native/babel-preset": "0.83.4", - "@react-native/eslint-config": "0.83.4", + "@react-native-community/cli": "20.1.3", + "@react-native/babel-preset": "0.84.1", + "@react-native/eslint-config": "0.84.1", "@release-it/conventional-changelog": "10.0.5", "@types/jest": "29.5.14", "@types/react": "19.2.14", @@ -81,11 +81,11 @@ "lefthook": "2.1.3", "prettier": "3.4.2", "react": "19.2.4", - "react-native": "0.83.4", + "react-native": "0.84.1", "react-native-builder-bob": "0.40.18", - "react-native-gesture-handler": "2.30.0", + "react-native-gesture-handler": "2.31.2", "release-it": "19.2.4", - "turbo": "2.8.15", + "turbo": "2.8.21", "typescript": "5.9.3" }, "peerDependencies": { diff --git a/src/specs/NativeMendixNative.ts b/src/specs/NativeMendixNative.ts index d3189c6..37c256f 100644 --- a/src/specs/NativeMendixNative.ts +++ b/src/specs/NativeMendixNative.ts @@ -20,16 +20,16 @@ export interface Spec extends TurboModule { downloadHandlerDownload( url: string, downloadPath: string, - config: GenericMap + config: DownloadConfig ): Promise; mxConfigurationGetConfig(): Configuration; - otaDownload(config: GenericMap): Promise; - otaDeploy(config: GenericMap): Promise; + otaDownload(config: OtaDownloadConfig): Promise; + otaDeploy(config: OtaDeployConfig): Promise; - fsConstants(): GenericMap; - fsSave(blob: GenericMap, filePath: string): Promise; + fsConstants(): FsConstants; + fsSave(blob: BlobData, filePath: string): Promise; fsRead(filePath: string): Promise; fsMove(filePath: string, newPath: string): Promise; fsRemove(filePath: string): Promise; @@ -37,8 +37,8 @@ export interface Spec extends TurboModule { fsReadAsDataURL(filePath: string): Promise; fsReadAsText(filePath: string): Promise; //Android only fsFileExists(filePath: string): Promise; - fsWriteJson(data: GenericMap, filepath: string): Promise; - fsReadJson(filepath: string): Promise; + fsWriteJson(data: CodegenTypes.UnsafeObject, filepath: string): Promise; + fsReadJson(filepath: string): Promise; fsSetEncryptionEnabled(enabled: boolean): void; errorHandlerHandle(message: string, stackTrace: StackFrame[]): void; @@ -63,19 +63,6 @@ type BlobData = { lastModified?: number; }; -type GenericType = - | string - | number - | boolean - | null - | undefined - | { [key: string]: GenericType } - | GenericType[]; - -type GenericMap = { [key: string]: GenericType }; - -type GenericArray = GenericType[]; - type Configuration = { RUNTIME_URL: string; APP_NAME: string | null; @@ -97,6 +84,12 @@ type Configuration = { APP_SESSION_ID?: string; }; +type FsConstants = { + DocumentDirectoryPath: string; + SUPPORTS_DIRECTORY_MOVE: boolean; + SUPPORTS_ENCRYPTION: boolean; +}; + type DownloadConfig = { connectionTimeout?: CodegenTypes.Int32; mimeType?: string; @@ -123,9 +116,8 @@ type DownloadProgress = { export type { BlobData, - GenericMap, - GenericArray, Configuration, + FsConstants, DownloadConfig, OtaDownloadConfig, OtaDeployConfig, diff --git a/yarn.lock b/yarn.lock index 970c59d..d4ec23f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -623,7 +623,7 @@ __metadata: languageName: node linkType: hard -"@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": version: 7.27.1 resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: @@ -722,7 +722,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.24.7, @babel/plugin-transform-computed-properties@npm:^7.28.6": +"@babel/plugin-transform-computed-properties@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" dependencies: @@ -850,7 +850,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.1, @babel/plugin-transform-function-name@npm:^7.27.1": +"@babel/plugin-transform-function-name@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: @@ -874,7 +874,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.2, @babel/plugin-transform-literals@npm:^7.27.1": +"@babel/plugin-transform-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-literals@npm:7.27.1" dependencies: @@ -885,7 +885,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": +"@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: @@ -991,7 +991,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7, @babel/plugin-transform-numeric-separator@npm:^7.28.6": +"@babel/plugin-transform-numeric-separator@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" dependencies: @@ -1002,7 +1002,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.28.6": +"@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: @@ -1052,7 +1052,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.27.7": +"@babel/plugin-transform-parameters@npm:^7.27.7": version: 7.27.7 resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: @@ -1220,7 +1220,7 @@ __metadata: languageName: node linkType: hard -"@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": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: @@ -1231,7 +1231,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.24.7, @babel/plugin-transform-spread@npm:^7.28.6": +"@babel/plugin-transform-spread@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-spread@npm:7.28.6" dependencies: @@ -1243,7 +1243,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.24.7, @babel/plugin-transform-sticky-regex@npm:^7.27.1": +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" dependencies: @@ -1480,7 +1480,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.25.0, @babel/template@npm:^7.28.6, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.28.6, @babel/template@npm:^7.3.3": version: 7.28.6 resolution: "@babel/template@npm:7.28.6" dependencies: @@ -1523,16 +1523,6 @@ __metadata: languageName: node linkType: hard -"@clack/core@npm:1.0.0-alpha.5": - version: 1.0.0-alpha.5 - resolution: "@clack/core@npm:1.0.0-alpha.5" - dependencies: - picocolors: "npm:^1.0.0" - sisteransi: "npm:^1.0.5" - checksum: 10/b3907cffe8addfb3d6cb6f8abf70e1b27a92af356b63827d7d43e5273859665678ef4ee582a358f9893d4b925c885abcc8baf378aec6a7231dae7bc256199e94 - languageName: node - linkType: hard - "@clack/core@npm:1.0.0-alpha.7": version: 1.0.0-alpha.7 resolution: "@clack/core@npm:1.0.0-alpha.7" @@ -1543,17 +1533,6 @@ __metadata: languageName: node linkType: hard -"@clack/prompts@npm:1.0.0-alpha.5": - version: 1.0.0-alpha.5 - resolution: "@clack/prompts@npm:1.0.0-alpha.5" - dependencies: - "@clack/core": "npm:1.0.0-alpha.5" - picocolors: "npm:^1.0.0" - sisteransi: "npm:^1.0.5" - checksum: 10/53388c862d6026bb02a0758caab8421749a48ba28d95815ba974dbfb1cdde3fe209b51338aca2237de0f0d77ae9bee3aa42b33d8a84f62b7b77ba25f7b8c5b06 - languageName: node - linkType: hard - "@clack/prompts@npm:1.0.0-alpha.9": version: 1.0.0-alpha.9 resolution: "@clack/prompts@npm:1.0.0-alpha.9" @@ -2835,65 +2814,65 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-clean@npm:20.1.2" +"@react-native-community/cli-clean@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-clean@npm:20.1.3" dependencies: - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-tools": "npm:20.1.3" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" picocolors: "npm:^1.1.1" - checksum: 10/66580b22ac10ed87aa1a121f5226d1bf88e1d87864cf21bcafc2f450133b908f31e44c784e881cc4cbcccb1cfedcca22bad0f09e0951ed5bd13400b2b724f9c5 + checksum: 10/f36c41aa7321f87c27e0411a6b21eaa5381f2c223d45d0a271ef261710893d65a4f862ea61f4ba0a42b592962731dc1b7aea8bb4670e861c2b9e999ce6ac93c0 languageName: node linkType: hard -"@react-native-community/cli-config-android@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-config-android@npm:20.1.2" +"@react-native-community/cli-config-android@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-config-android@npm:20.1.3" dependencies: - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-tools": "npm:20.1.3" fast-glob: "npm:^3.3.2" fast-xml-parser: "npm:^5.3.6" picocolors: "npm:^1.1.1" - checksum: 10/873af8992640a7585322e01fb99870ddf8894cb69a30d11e2c3babd50c9039ab1c62b630e9a58bbe9249c332c4a66386e9d4250a4200b5f7a5be86635850d43d + checksum: 10/1e3ab058f916b8fc7ede9f7505d12332eb240225626d22657bde523afaba06a92938f4589b8c9d56ec63ed9abe18eb8cd06bd908ec3434722090ff6ff77dac21 languageName: node linkType: hard -"@react-native-community/cli-config-apple@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-config-apple@npm:20.1.2" +"@react-native-community/cli-config-apple@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-config-apple@npm:20.1.3" dependencies: - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-tools": "npm:20.1.3" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" picocolors: "npm:^1.1.1" - checksum: 10/262089e3ca1ba161fa1c4c1945b10a731a5c39db35f07e44c94d1fcf0676819d2eccfced3ec56f724efee31b7c1ff8d6c0b1842363575708f0cf86df5a4315e9 + checksum: 10/d9e2bfeb4747ccc48f12e0906d9c7647972ce63c457e5327f48dc3a805dc06562f5ec1928a02cba58949087d46ac310f8bf771991646d2d4382b5f611f69dc6f languageName: node linkType: hard -"@react-native-community/cli-config@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-config@npm:20.1.2" +"@react-native-community/cli-config@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-config@npm:20.1.3" dependencies: - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-tools": "npm:20.1.3" cosmiconfig: "npm:^9.0.0" deepmerge: "npm:^4.3.0" fast-glob: "npm:^3.3.2" joi: "npm:^17.2.1" picocolors: "npm:^1.1.1" - checksum: 10/c43f19458c514c1108162238abb7f8b096156b6377841c6959d46a7fe6ffea170050a6e77c2eaf19800efd40b865297e8cc04043d38f881e6e36d62eccd81164 + checksum: 10/6ff96ef8bd8a93aadc210d370542b61175b0f43c23f7635dd4c8a985f91a76eac8f5692d50a555983a17f1843bdd68e15bac81cc449413dd51d24378fe8fb3d6 languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-doctor@npm:20.1.2" +"@react-native-community/cli-doctor@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-doctor@npm:20.1.3" dependencies: - "@react-native-community/cli-config": "npm:20.1.2" - "@react-native-community/cli-platform-android": "npm:20.1.2" - "@react-native-community/cli-platform-apple": "npm:20.1.2" - "@react-native-community/cli-platform-ios": "npm:20.1.2" - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-config": "npm:20.1.3" + "@react-native-community/cli-platform-android": "npm:20.1.3" + "@react-native-community/cli-platform-apple": "npm:20.1.3" + "@react-native-community/cli-platform-ios": "npm:20.1.3" + "@react-native-community/cli-tools": "npm:20.1.3" command-exists: "npm:^1.2.8" deepmerge: "npm:^4.3.0" envinfo: "npm:^7.13.0" @@ -2904,50 +2883,50 @@ __metadata: semver: "npm:^7.5.2" wcwidth: "npm:^1.0.1" yaml: "npm:^2.2.1" - checksum: 10/6e02acff8a0dd27512a347124dbf68b37ac76f33ad05a46a19646acea1101c695167543553d3e8d8e3ce4e3181f04d73840937afde02245d9f4a7671d831ddaa + checksum: 10/fa17643871f47b36b69baeb874507f9c456ebf751aa55bbd6d5f25c2d39fa5b774be848b817ff15a1b8a04ba91632cdc218bb2f2c5b8a9e6f88eb50545803f05 languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-platform-android@npm:20.1.2" +"@react-native-community/cli-platform-android@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-platform-android@npm:20.1.3" dependencies: - "@react-native-community/cli-config-android": "npm:20.1.2" - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-config-android": "npm:20.1.3" + "@react-native-community/cli-tools": "npm:20.1.3" execa: "npm:^5.0.0" logkitty: "npm:^0.7.1" picocolors: "npm:^1.1.1" - checksum: 10/ff3cd9bd288f4237abc3ab2675efa056feb63bef01d49b843a5ecc7d65bee377512aece43ee4f110c11485640fabded055b61df0149525dc91169dc80b8c7f6e + checksum: 10/5f67a914e871feb0920ba1121853a6c3e47af3195569929915f09a236d8aabb2a3a3e5d3e62d7eb2f36d6f1c6a27e4c8f4a132a8617d802b3336e30d88f0789e languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-platform-apple@npm:20.1.2" +"@react-native-community/cli-platform-apple@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-platform-apple@npm:20.1.3" dependencies: - "@react-native-community/cli-config-apple": "npm:20.1.2" - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-config-apple": "npm:20.1.3" + "@react-native-community/cli-tools": "npm:20.1.3" execa: "npm:^5.0.0" fast-xml-parser: "npm:^5.3.6" picocolors: "npm:^1.1.1" - checksum: 10/b1d4409f8a081e94400acf41cfefa0c8663afdf8280598e7731a85a4f161f64f381e876fdace394baec0d72db716fb58aa1e18ce8eeacc37fc70c5a261ba71f6 + checksum: 10/47e11e7398be608bbb58b436dc229286c5d49306fc9b0959582004ff4adab7fad51d167ec4a1b3aa02cec015e2631bea9c3f214b8e121f48b188a6fcdfbbd82b languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-platform-ios@npm:20.1.2" +"@react-native-community/cli-platform-ios@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-platform-ios@npm:20.1.3" dependencies: - "@react-native-community/cli-platform-apple": "npm:20.1.2" - checksum: 10/711c5366a62a5dfd26fd987bab126ff958faf29e7e2bfab1d29c1c8dfc12be12c03d8291f2fefab4ea90836fe41e90f7bb626b6fa3a9d023cdc39f726aa34512 + "@react-native-community/cli-platform-apple": "npm:20.1.3" + checksum: 10/9a43f6158a3f3cf3b1a432881a5e3218623ca31fdc0d6872d7731ff20de95c414d5c364081e3082afc149cd8129b051471702caaea707715869681fd43d0e528 languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-server-api@npm:20.1.2" +"@react-native-community/cli-server-api@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-server-api@npm:20.1.3" dependencies: - "@react-native-community/cli-tools": "npm:20.1.2" + "@react-native-community/cli-tools": "npm:20.1.3" body-parser: "npm:^2.2.2" compression: "npm:^1.7.1" connect: "npm:^3.6.5" @@ -2958,13 +2937,13 @@ __metadata: serve-static: "npm:^1.13.1" strict-url-sanitise: "npm:0.0.1" ws: "npm:^6.2.3" - checksum: 10/29447084fdc1a0b3f38a62bc781aa71877b835dd8ee5855d30237289350bb3daeb1a27ca9a3b0d97b86d0f85bddcd67c3907968fdaee7c2f5cc7cab72723d1d1 + checksum: 10/2e65e2cd1b2f78d3b38e46510d456f2d82b61ab9b58af37d1f7d674716416575c8dd56907acb87cfb3b81c10833db092d2dd6f6c36f7df1d16845f39b8322635 languageName: node linkType: hard -"@react-native-community/cli-tools@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-tools@npm:20.1.2" +"@react-native-community/cli-tools@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-tools@npm:20.1.3" dependencies: "@vscode/sudo-prompt": "npm:^9.0.0" appdirsjs: "npm:^1.2.4" @@ -2976,29 +2955,29 @@ __metadata: picocolors: "npm:^1.1.1" prompts: "npm:^2.4.2" semver: "npm:^7.5.2" - checksum: 10/6eeeeb38495c9f6636840da0ef564db99d6e69d7672dd4cdeff4b8cc128d00de56d2ea74c0c7fda6c743d1f0a642d481c44f6cdd38d8f57ccdd53e9608930bca + checksum: 10/7bcf1b23ee4e655fe7bf24b5ce917f5c40d65eaf64bd6f0ce55bd1315a77df16b0e9dc1fc517eb56ab7f64717fc33a2c247b15989223165f908a8604ab898059 languageName: node linkType: hard -"@react-native-community/cli-types@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli-types@npm:20.1.2" +"@react-native-community/cli-types@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli-types@npm:20.1.3" dependencies: joi: "npm:^17.2.1" - checksum: 10/b40aaa3e5ccdad210f67760be01cff34760b7107c0afc93a394733317a88eca2a8b8490b977c8d74d98822d2c2117a1a7101c33105bcdd03277c071c7daca510 + checksum: 10/23184e526378139386962a645ed4248f7c3563aa0b345f01449f3e0d53c78b1a16331911e040db998c5a0a74315dd0395310439aec910925fbd7398ca01eed14 languageName: node linkType: hard -"@react-native-community/cli@npm:20.1.2": - version: 20.1.2 - resolution: "@react-native-community/cli@npm:20.1.2" +"@react-native-community/cli@npm:20.1.3": + version: 20.1.3 + resolution: "@react-native-community/cli@npm:20.1.3" dependencies: - "@react-native-community/cli-clean": "npm:20.1.2" - "@react-native-community/cli-config": "npm:20.1.2" - "@react-native-community/cli-doctor": "npm:20.1.2" - "@react-native-community/cli-server-api": "npm:20.1.2" - "@react-native-community/cli-tools": "npm:20.1.2" - "@react-native-community/cli-types": "npm:20.1.2" + "@react-native-community/cli-clean": "npm:20.1.3" + "@react-native-community/cli-config": "npm:20.1.3" + "@react-native-community/cli-doctor": "npm:20.1.3" + "@react-native-community/cli-server-api": "npm:20.1.3" + "@react-native-community/cli-tools": "npm:20.1.3" + "@react-native-community/cli-types": "npm:20.1.3" commander: "npm:^9.4.1" deepmerge: "npm:^4.3.0" execa: "npm:^5.0.0" @@ -3010,313 +2989,230 @@ __metadata: semver: "npm:^7.5.2" bin: rnc-cli: build/bin.js - checksum: 10/85c0f4d2ca4dbbeb47f9439bf0da22abd18a39fccf2736dc47efcc47accbc377c32aa0b75408308fd47a60658e72266e2c645f7f9675a1faf5e4c7dc737c20a8 + checksum: 10/d750e7899754eb225986f49fc041e6811cec6b75fb0e7fd6b6feee8010e754ba15e01d908fe5b9b3b29afec3d598058d1f816c5651c748e33dc2d363350fdd1f languageName: node linkType: hard -"@react-native-harness/babel-preset@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/babel-preset@npm:1.0.0" +"@react-native-harness/babel-preset@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/babel-preset@npm:1.1.0" dependencies: "@babel/plugin-transform-class-static-block": "npm:^7.27.1" babel-plugin-istanbul: "npm:^7.0.1" peerDependencies: "@babel/core": ^7.22.0 "@babel/plugin-transform-react-jsx": "*" - checksum: 10/b11125b767ccc3a540bf1cc37afa20e5a1ec534b71ac26c06003b65f7a352c7f3acdc7b3656cd2a05e664d5d44ac83310978e9d62fc313bf3d19deb0f7ee8cc3 - languageName: node - linkType: hard - -"@react-native-harness/babel-preset@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/babel-preset@npm:1.0.0-alpha.21" - dependencies: - "@babel/plugin-transform-class-static-block": "npm:^7.27.1" - babel-plugin-istanbul: "npm:^7.0.1" - peerDependencies: - "@babel/core": ^7.22.0 - checksum: 10/3fa225a2306f4f58e277db39279e07d91199c9876a1ad9fc2d1920b4069b15d7a5340d8ecab907cba6a648a703e0e0fc78b44448dd778b3d6d1bbeb2c7c022a3 + checksum: 10/90b3bc3519d3832affcc516b7e146d03f6ee6a3fb0380f685fa3951509b4cdeff58f79e39daa9b83b8159822067b427c980675ba22ab3136f7018e2b3361791f languageName: node linkType: hard -"@react-native-harness/bridge@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/bridge@npm:1.0.0" +"@react-native-harness/bridge@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/bridge@npm:1.1.0" dependencies: - "@react-native-harness/platforms": "npm:1.0.0" - "@react-native-harness/tools": "npm:1.0.0" + "@react-native-harness/platforms": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" birpc: "npm:^2.4.0" pixelmatch: "npm:^7.1.0" pngjs: "npm:^7.0.0" ssim.js: "npm:^3.5.0" tslib: "npm:^2.3.0" ws: "npm:^8.18.2" - checksum: 10/845286bdbfa45e0b33f75e7fe5a5a39e2935dc03ebae28c2a11fe630b31e069b2806719d4c76d61dc31df7f1420ba1a69d6c1a55bbdca41477b387043af91a70 - languageName: node - linkType: hard - -"@react-native-harness/bridge@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/bridge@npm:1.0.0-alpha.21" - dependencies: - "@react-native-harness/tools": "npm:1.0.0-alpha.21" - birpc: "npm:^2.4.0" - tslib: "npm:^2.3.0" - ws: "npm:^8.18.2" - checksum: 10/8b8efde703d1ff8ef9bcac598cfe0ae55ab41cd86d36b25b388163b5272fb7d9997c886651b604ab1b8911b43e27ec749b70d4a70cbbd3b60c447562164f0053 + checksum: 10/06f9e9c4c87b662a926db827580ca3e3294261da9858e6fd39d6ce066cb9d6f264aa2f32f6f305d8ddd8d28169958bf0f270bdbb6dd4fc46a501b02263cd0f41 languageName: node linkType: hard -"@react-native-harness/bundler-metro@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/bundler-metro@npm:1.0.0" - dependencies: - "@react-native-harness/config": "npm:1.0.0" - "@react-native-harness/metro": "npm:1.0.0" - "@react-native-harness/tools": "npm:1.0.0" - connect: "npm:^3.7.0" - nocache: "npm:^4.0.0" - tslib: "npm:^2.3.0" - peerDependencies: - metro: "*" - metro-config: "*" - checksum: 10/d59345e25f0a687474b41333793c7808ce54d56bad7e265342527c1dbf304cc84c082292d1fa6c22418f53a62e8cbb212efc08fc83e696506a3e04de8bd95a53 - languageName: node - linkType: hard - -"@react-native-harness/bundler-metro@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/bundler-metro@npm:1.0.0-alpha.21" +"@react-native-harness/bundler-metro@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/bundler-metro@npm:1.1.0" dependencies: - "@react-native-harness/config": "npm:1.0.0-alpha.21" - "@react-native-harness/metro": "npm:1.0.0-alpha.21" - "@react-native-harness/tools": "npm:1.0.0-alpha.21" + "@react-native-harness/babel-preset": "npm:1.1.0" + "@react-native-harness/config": "npm:1.1.0" + "@react-native-harness/runtime": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" + "@react-native/metro-config": "npm:*" connect: "npm:^3.7.0" nocache: "npm:^4.0.0" tslib: "npm:^2.3.0" peerDependencies: metro: "*" + metro-cache: "*" metro-config: "*" - checksum: 10/0d5a684f2454fd2cebcb404fcd4fe7f0458e9ead7472ccd5a980e96671e0427aba9dfcb99954a5fa1cbb984ada732820d9506b34e1a29aaaa026225012a45e9c + metro-resolver: "*" + checksum: 10/b37c782a01c46819ad16b997279727f3a9f0eeb1a08d339319bfb04f321d704447f4483be2d04f5ed38857598d9b76b31c30ab77b84f92b3c55c8b976b8602ad languageName: node linkType: hard -"@react-native-harness/cli@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/cli@npm:1.0.0" +"@react-native-harness/cli@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/cli@npm:1.1.0" dependencies: - "@react-native-harness/bridge": "npm:1.0.0" - "@react-native-harness/config": "npm:1.0.0" - "@react-native-harness/platforms": "npm:1.0.0" - "@react-native-harness/tools": "npm:1.0.0" + "@react-native-harness/bridge": "npm:1.1.0" + "@react-native-harness/config": "npm:1.1.0" + "@react-native-harness/platforms": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" tslib: "npm:^2.3.0" peerDependencies: jest-cli: "*" - checksum: 10/0d89f9f1af0c84b6ef4fd1692ace077999bf964a4f74de889905ddb616280ff6edb5d699ddcb3a011317594f9c3deca0d74633e120bdc83d213f3f6b0040b828 - languageName: node - linkType: hard - -"@react-native-harness/config@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/config@npm:1.0.0" - dependencies: - "@react-native-harness/tools": "npm:1.0.0" - tslib: "npm:^2.3.0" - zod: "npm:^3.25.67" - checksum: 10/b4a20460b7d4ce09aa0c24764ed068a1425aaf80b7a1ede6582c81f2aa2ee77ad83c269fef267a6b695c6c0dc215880ce2db863a435c798793ef07b20f1a5534 + checksum: 10/1901ccc6121f5212f072eeabd82048d80378cb839d943843c80079e81945d90bdf935b7c5698a37522d202c553aa5ff3dc7659b54c95507a58a86626b5284d3f languageName: node linkType: hard -"@react-native-harness/config@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/config@npm:1.0.0-alpha.21" +"@react-native-harness/config@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/config@npm:1.1.0" dependencies: - "@react-native-harness/tools": "npm:1.0.0-alpha.21" + "@react-native-harness/plugins": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" tslib: "npm:^2.3.0" zod: "npm:^3.25.67" - checksum: 10/e27712d87dbcf800da199a6c569f8a8d068c6a6bc015f3ff01235e0d2b9d01bb76d49d6e07753295fc7600bd574726a9b127f4840b31d0df2bc4edde2961c408 + checksum: 10/d0c70cf2e52d2519527cf06f5c8ca32061c87dddffc5af63e7d4783f277b22f3df0b254ef9a4b0fad6aefc3d8971bfaeabc169d858be988e2a7af57354d15433 languageName: node linkType: hard -"@react-native-harness/jest@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/jest@npm:1.0.0" - dependencies: - "@jest/test-result": "npm:^30.2.0" - "@react-native-harness/bridge": "npm:1.0.0" - "@react-native-harness/bundler-metro": "npm:1.0.0" - "@react-native-harness/config": "npm:1.0.0" - "@react-native-harness/platforms": "npm:1.0.0" - "@react-native-harness/tools": "npm:1.0.0" - chalk: "npm:^4.1.2" - jest-message-util: "npm:^30.2.0" - jest-util: "npm:^30.2.0" - p-limit: "npm:^7.1.1" - tslib: "npm:^2.3.0" - yargs: "npm:^17.7.2" - checksum: 10/5f0499c545cce3f06ad7ae72d5eb95013bdf4ca1e496b97615fd56298c50e5db2d98eeaf28f8b77128d0ab77cab9cbce86eba6b0cba2999f218a5d3b50b3eb26 - languageName: node - linkType: hard - -"@react-native-harness/jest@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/jest@npm:1.0.0-alpha.21" +"@react-native-harness/jest@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/jest@npm:1.1.0" dependencies: "@jest/test-result": "npm:^30.2.0" - "@react-native-harness/bridge": "npm:1.0.0-alpha.21" - "@react-native-harness/bundler-metro": "npm:1.0.0-alpha.21" - "@react-native-harness/config": "npm:1.0.0-alpha.21" - "@react-native-harness/platforms": "npm:1.0.0-alpha.21" - "@react-native-harness/tools": "npm:1.0.0-alpha.21" + "@react-native-harness/bridge": "npm:1.1.0" + "@react-native-harness/bundler-metro": "npm:1.1.0" + "@react-native-harness/config": "npm:1.1.0" + "@react-native-harness/platforms": "npm:1.1.0" + "@react-native-harness/plugins": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" chalk: "npm:^4.1.2" jest-message-util: "npm:^30.2.0" jest-util: "npm:^30.2.0" p-limit: "npm:^7.1.1" tslib: "npm:^2.3.0" yargs: "npm:^17.7.2" - checksum: 10/50ac7947a6fc49bcfa4ccdbea4bdb203a189cfa4c425c2b8c717b73c37f8be53799d972b3cb7bddc884bcddc5d5e6dd966b04ee1bc7738ce54121c0ea6434767 - languageName: node - linkType: hard - -"@react-native-harness/metro@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/metro@npm:1.0.0" - dependencies: - "@react-native-harness/babel-preset": "npm:1.0.0" - "@react-native-harness/config": "npm:1.0.0" - tslib: "npm:^2.3.0" - peerDependencies: - "@react-native-harness/runtime": 1.0.0 - metro: "*" - checksum: 10/3e8ce17e163b0b80ad28d1e4e6d3e1ca097e8b847ee07d0324ca6ae58ede3cce8ebf23460a1a6df549509d4edb73fd129d92c55bb1e9bfd963c8aaae7c99a567 + checksum: 10/dcb6a3aaf58763cb55a6b937e4d56a2b8f4eec076a8282b4ec02162facedf48eaaafcfd3ea40192ca2e2e6cbb49875d6a96419e28038efb2181896c3d68013aa languageName: node linkType: hard -"@react-native-harness/metro@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/metro@npm:1.0.0-alpha.21" +"@react-native-harness/metro@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/metro@npm:1.1.0" dependencies: - "@react-native-harness/babel-preset": "npm:1.0.0-alpha.21" - "@react-native-harness/config": "npm:1.0.0-alpha.21" tslib: "npm:^2.3.0" peerDependencies: - "@react-native-harness/runtime": 1.0.0-alpha.21 metro: "*" - checksum: 10/1af775503790adcbf23132efeb5eab431f295a160d79fa46d56123012b36839d003bb991952128e31b81c8a537dc65cb7bc25ec5faaaefb912bd44279bb00d4c + checksum: 10/6072eb7b321e51fa6053a19d23c18a5bf140f3756a3865998ff93cb58220659320b0ccff6d55d204016b5f1269fcd59d685d687c3b92803c3ba8a25c1f5c6952 languageName: node linkType: hard -"@react-native-harness/platform-android@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/platform-android@npm:1.0.0-alpha.21" +"@react-native-harness/platform-android@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/platform-android@npm:1.1.0" dependencies: - "@react-native-harness/config": "npm:1.0.0-alpha.21" - "@react-native-harness/platforms": "npm:1.0.0-alpha.21" - "@react-native-harness/tools": "npm:1.0.0-alpha.21" + "@react-native-harness/config": "npm:1.1.0" + "@react-native-harness/platforms": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" tslib: "npm:^2.3.0" zod: "npm:^3.25.67" - checksum: 10/ea99d5eddc4da9e82af21b1e75f5c6745cdada2d8ee0c98cc62418b73ab2cc7e0c01818d5e5edcb906958769281a4a5bb0dd9c778ad0bb1696a4325019744c69 + checksum: 10/556e2aedcba39868c3a0eeb40c0fbe5f7b4733afc641913500b2dab4a2fea02d20e0a4e8313e5ba5c49893decc16d5c5975116a4f5c70762ccd61b6e36b08612 languageName: node linkType: hard -"@react-native-harness/platform-apple@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/platform-apple@npm:1.0.0-alpha.21" +"@react-native-harness/platform-apple@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/platform-apple@npm:1.1.0" dependencies: - "@react-native-harness/platforms": "npm:1.0.0-alpha.21" - "@react-native-harness/tools": "npm:1.0.0-alpha.21" + "@react-native-harness/config": "npm:1.1.0" + "@react-native-harness/platforms": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" tslib: "npm:^2.3.0" zod: "npm:^3.25.67" - checksum: 10/1a92cb718000445f2d0ff51ef40067290a86b18dd965f18a485dd587af9f66e716060405ba66ed2d486420580c9c20a8d9ecf6478ce564c0f6491d53057bc749 + checksum: 10/1ebdbbc47f6bf93c6bdc7b5b574cb9acb3a5b82d01b5b47c5e1167b211c7c8dd290088cd92ec8634e39911e796d05c1003ecf0fe01520d35d7a8a38d148d0533 languageName: node linkType: hard -"@react-native-harness/platforms@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/platforms@npm:1.0.0" +"@react-native-harness/platforms@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/platforms@npm:1.1.0" dependencies: tslib: "npm:^2.3.0" - checksum: 10/3f615f0f009291d548cf98aca67f9dabc45197ed9351c13c671c9adc0051be6d53ed6ae4f33a687841d8b516ddb0dea8c7c933c03d5ed729b01d830734c0381e + checksum: 10/29c506cb7a5ea7fb964d2941c95498494196d2dd2ca49db3eeebef71cb3a8a805fbec3b6774fbf8c3f44b0aaf458e5776802e14718438785e83ef09020a883a0 languageName: node linkType: hard -"@react-native-harness/platforms@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/platforms@npm:1.0.0-alpha.21" +"@react-native-harness/plugins@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/plugins@npm:1.1.0" dependencies: + "@react-native-harness/bridge": "npm:1.1.0" + "@react-native-harness/platforms": "npm:1.1.0" + "@react-native-harness/tools": "npm:1.1.0" + hookable: "npm:^6.1.0" tslib: "npm:^2.3.0" - checksum: 10/82b24477d82be4253e593ae5b7a91b511d5002eedab9c66f946e7f11754878d89855e6297fa8d4e82b92ef278ce97fd01975e3793263731da46605b3319243fe + checksum: 10/cc47011f508809301cd57baae3376ef18db4adfe3dbda4000dae1543fdbff00a7b2007fab2e740f614ca0cd3d9a6f3bcd673e438324906d938e2f0dbc8fe191a languageName: node linkType: hard -"@react-native-harness/runtime@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/runtime@npm:1.0.0" +"@react-native-harness/runtime@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/runtime@npm:1.1.0" dependencies: - "@react-native-harness/bridge": "npm:1.0.0" + "@react-native-harness/bridge": "npm:1.1.0" "@vitest/expect": "npm:4.0.16" "@vitest/spy": "npm:4.0.16" chai: "npm:^6.2.2" event-target-shim: "npm:^6.0.2" + react-native-url-polyfill: "npm:^3.0.0" use-sync-external-store: "npm:^1.6.0" zustand: "npm:^5.0.5" peerDependencies: react: "*" react-native: "*" - checksum: 10/763f0615a1dee67923ba146793f6c965cfa21e5d5874118e01c5c6534083d7ca8b17e1de506d182549a991a690e343867135d22d3162c5936a3dcbe5f21ea9d6 + checksum: 10/0c93d0a2dc58b8921533fc890013a9577482112481816b644af1dd6bdeb7878b09481685e7ca3d43fba4df5d8666ed83263b543df360a9b5de6d02a2cc2386b7 languageName: node linkType: hard -"@react-native-harness/tools@npm:1.0.0": - version: 1.0.0 - resolution: "@react-native-harness/tools@npm:1.0.0" +"@react-native-harness/tools@npm:1.1.0": + version: 1.1.0 + resolution: "@react-native-harness/tools@npm:1.1.0" dependencies: "@clack/prompts": "npm:1.0.0-alpha.9" - is-unicode-supported: "npm:^0.1.0" nano-spawn: "npm:^1.0.2" picocolors: "npm:^1.1.1" tslib: "npm:^2.3.0" peerDependencies: react-native: "*" - checksum: 10/62ae1e5f1085e7d3aa4c8d4ff561b7f32cc35e616842842b03b617be5b1940eea819de4a518c6b971236604e546d217adb75a0414833afd05b68356ef6d00469 + checksum: 10/a16a33c5aa460af2e8e9a3c0d17ee755561fa83802a6ce0bdcf0ea04eb94523471e1eeadbd2fc944ef5eba84e40cb05f15aa2983c6168a40b9d186e8de605785 languageName: node linkType: hard -"@react-native-harness/tools@npm:1.0.0-alpha.21": - version: 1.0.0-alpha.21 - resolution: "@react-native-harness/tools@npm:1.0.0-alpha.21" - dependencies: - "@clack/prompts": "npm:1.0.0-alpha.5" - is-unicode-supported: "npm:^0.1.0" - nano-spawn: "npm:^1.0.2" - picocolors: "npm:^1.1.1" - tslib: "npm:^2.3.0" - peerDependencies: - react-native: "*" - checksum: 10/cbdb54c3334b782a3fb7724be5447922b633186b852d156df359a72fed997c1ede1c36853c7cf1a23c942e6410a7a557dac5750491b38baf1a13dda18b045ff8 +"@react-native/assets-registry@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/assets-registry@npm:0.84.1" + checksum: 10/1f31c649090c3d569115dfa5f1620a6e124e6e88f8eeb857f3db406b61663d3820b4c669edbc62049ce5de460f5dc224d28560f590e9759c4ee055618a8aa8dc languageName: node linkType: hard -"@react-native/assets-registry@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/assets-registry@npm:0.83.4" - checksum: 10/4c6c04a089ce8d232a8eea473051bd01a2a2a6c67e077f0a155fbc59196a32bc317e97130b80e3d06472e4aff3ee3592f775a6df0db1fd2ee86f9f60b4942d68 +"@react-native/babel-plugin-codegen@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/babel-plugin-codegen@npm:0.84.1" + dependencies: + "@babel/traverse": "npm:^7.25.3" + "@react-native/codegen": "npm:0.84.1" + checksum: 10/59f2571e2855755f3fbc99a05e9956a150d8f10343219d88641160bfae956e8d8703a9e9c6c3df0ee758bdb6672bf512aac0f04034b3ea4cf91769a86e076ccc languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/babel-plugin-codegen@npm:0.83.4" +"@react-native/babel-plugin-codegen@npm:0.85.3": + version: 0.85.3 + resolution: "@react-native/babel-plugin-codegen@npm:0.85.3" dependencies: - "@babel/traverse": "npm:^7.25.3" - "@react-native/codegen": "npm:0.83.4" - checksum: 10/484cb8b9817abd39f0c234b4589e55f04f67ed73806de6d04b0053568cab4ef466fc92047c9b5025dc8b18cbebcf8f27cd6637dd1dfe3a122d3b39bdb476da9d + "@babel/traverse": "npm:^7.29.0" + "@react-native/codegen": "npm:0.85.3" + checksum: 10/195a6ba599a61b94e34e6db98dae540289c2aa9a577da5288b908a82e595b80e8859b9684c4b6a3b9d897a70a609bf3ceaf3f37694bec70d9876753c2875f3d4 languageName: node linkType: hard -"@react-native/babel-preset@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/babel-preset@npm:0.83.4" +"@react-native/babel-preset@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/babel-preset@npm:0.84.1" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -3324,27 +3220,19 @@ __metadata: "@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" @@ -3353,44 +3241,100 @@ __metadata: "@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.83.4" + "@react-native/babel-plugin-codegen": "npm:0.84.1" babel-plugin-syntax-hermes-parser: "npm:0.32.0" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/bc72958ea0340af26842c88c5f75f7fc8ae7cd0719f01bfbf7ae583b2d8b04a460c93f7f796acf41167cd82fcacdb1a35f1f8541df655db882223b491e0b0fbc + checksum: 10/9d362f7fa72a6b2abb9adb67cdc5dca1fe9f8a38bfd66cef01e5d99ef6b715df8842446d74859151829d883aad7ffcc46faa7cdf4b67aef9a787270a7600974c + languageName: node + linkType: hard + +"@react-native/babel-preset@npm:0.85.3": + version: 0.85.3 + resolution: "@react-native/babel-preset@npm:0.85.3" + 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-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-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-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-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" + "@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-typescript": "npm:^7.25.2" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" + "@react-native/babel-plugin-codegen": "npm:0.85.3" + babel-plugin-syntax-hermes-parser: "npm:0.33.3" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + react-refresh: "npm:^0.14.0" + peerDependencies: + "@babel/core": "*" + checksum: 10/0750392facf3e1e1439accb030d04a9dc3e0242a25b5a3938f31f2a4db1cfbc7e527c11e2673c21d52d993c54e6438044db623dabf1d0a40ded065b748677220 languageName: node linkType: hard -"@react-native/codegen@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/codegen@npm:0.83.4" +"@react-native/codegen@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/codegen@npm:0.84.1" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.25.3" - glob: "npm:^7.1.1" hermes-parser: "npm:0.32.0" invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" + tinyglobby: "npm:^0.2.15" yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/04cb29351cab076377e034f036a43be0a491c1fc2f39ff5637ce778483f59232d1efc179ab940e60d9e30c788717b7fd2616c4c22ae4743a86d1585fbf8b6005 + checksum: 10/2fa65f813c56afd4deafce8adcfaa31c5b87fb5b4ee66b625dd1171c745c6114ac192b3dd7f028e71c5ccaae752a9096b12d70d980d99bd71806b043e9234078 languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/community-cli-plugin@npm:0.83.4" +"@react-native/codegen@npm:0.85.3": + version: 0.85.3 + resolution: "@react-native/codegen@npm:0.85.3" dependencies: - "@react-native/dev-middleware": "npm:0.83.4" + "@babel/core": "npm:^7.25.2" + "@babel/parser": "npm:^7.29.0" + hermes-parser: "npm:0.33.3" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + tinyglobby: "npm:^0.2.15" + yargs: "npm:^17.6.2" + peerDependencies: + "@babel/core": "*" + checksum: 10/71986731526148205e43d624b4d02348a55da03d05c302cad3a314c7f216bad4703abc8280dfb77c17c787bce1e1c980f1ea516b404a238ae858b1307717a1c9 + languageName: node + linkType: hard + +"@react-native/community-cli-plugin@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/community-cli-plugin@npm:0.84.1" + dependencies: + "@react-native/dev-middleware": "npm:0.84.1" debug: "npm:^4.4.0" invariant: "npm:^2.2.4" metro: "npm:^0.83.3" @@ -3405,34 +3349,35 @@ __metadata: optional: true "@react-native/metro-config": optional: true - checksum: 10/91bec32c6bafd75753401f02188e10875ed364a4a51411634ea2d84d1e9ae5597c5a46d5c2065a5a0fb033a40c6812268aa42f25b554d8efb772358b3490c25b + checksum: 10/561bcb26af1c391144b71ca0fa3024896d8a74f52dcef856c1bc0b59aaa13560e244ae791039e25ab665c51f913556fc854d69ed0fffc3ed27a099cf3476b2c5 languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/debugger-frontend@npm:0.83.4" - checksum: 10/c664a7686d7d7da26c2622861f2e4ba948f71099fc7c52034cb9a8862760b9b05704a13c5f6235665d5397ce191df84a287634351c398239038b4f133ad5eb45 +"@react-native/debugger-frontend@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/debugger-frontend@npm:0.84.1" + checksum: 10/841386dcbb6964b3e256777ddb0bab26c2c1efa34059ba2bf5533ba2e257130eaefe68a5c557a220aa7c742045c27b158df63aaed7313dfecba48c6c31ae5451 languageName: node linkType: hard -"@react-native/debugger-shell@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/debugger-shell@npm:0.83.4" +"@react-native/debugger-shell@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/debugger-shell@npm:0.84.1" dependencies: cross-spawn: "npm:^7.0.6" + debug: "npm:^4.4.0" fb-dotslash: "npm:0.5.8" - checksum: 10/b47d13946cc9effc094962ab4fbfb2f024ebe51f8cd530ede338475f2cc1030448dd3134a73ea96410cede9512540922b56dab0a49fc94c8dbf8854d116b9780 + checksum: 10/0ce7acd2161b3911089d75907182fb4357cb1069b19fd0d9d0262632a7eb3aeb3aac4c911b682e90f74a6de5cc1c158366182ded9b4f5d727f113227d304f656 languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/dev-middleware@npm:0.83.4" +"@react-native/dev-middleware@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/dev-middleware@npm:0.84.1" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.83.4" - "@react-native/debugger-shell": "npm:0.83.4" + "@react-native/debugger-frontend": "npm:0.84.1" + "@react-native/debugger-shell": "npm:0.84.1" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.2.0" connect: "npm:^3.6.5" @@ -3442,17 +3387,17 @@ __metadata: open: "npm:^7.0.3" serve-static: "npm:^1.16.2" ws: "npm:^7.5.10" - checksum: 10/c0313ffdf9d5ea48cd31e5404574ae33195530aae0ce21e6017165325e2e4359163a5dd33807f0d0d0408b263361621f91a9254b3b12b900129ccc7bb7bdb92c + checksum: 10/7c6e588e6f6a36d57d318487437bcafc8a3c5d3959512e75f7133e92e71ddc4cc6af4e359b0098cf6151f28c01b8136077b801d7539231b2b95b56fbb4dd0f74 languageName: node linkType: hard -"@react-native/eslint-config@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/eslint-config@npm:0.83.4" +"@react-native/eslint-config@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/eslint-config@npm:0.84.1" dependencies: "@babel/core": "npm:^7.25.2" "@babel/eslint-parser": "npm:^7.25.1" - "@react-native/eslint-plugin": "npm:0.83.4" + "@react-native/eslint-plugin": "npm:0.84.1" "@typescript-eslint/eslint-plugin": "npm:^8.36.0" "@typescript-eslint/parser": "npm:^8.36.0" eslint-config-prettier: "npm:^8.5.0" @@ -3461,78 +3406,111 @@ __metadata: eslint-plugin-jest: "npm:^29.0.1" eslint-plugin-react: "npm:^7.30.1" eslint-plugin-react-hooks: "npm:^7.0.1" - eslint-plugin-react-native: "npm:^4.0.0" + eslint-plugin-react-native: "npm:^5.0.0" peerDependencies: - eslint: ">=8" + eslint: ^8.0.0 || ^9.0.0 prettier: ">=2" - checksum: 10/b38215ebeabcfa04404331ca6e25ee1d0f15cad672fd30940d0ff5805614d9619d602d711a1eb021aee13a827d2b26ea213c9120b6234e80d56202fe0d6f81e9 + checksum: 10/37b6e632d43fbc9ffd7f126c90aecc9d3acb018f060a8006853275386ec4d79e6176514b59a22833a6abe9839f0b95670e86da63a5964437ef63d8abb4d90e1b + languageName: node + linkType: hard + +"@react-native/eslint-plugin@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/eslint-plugin@npm:0.84.1" + checksum: 10/6dabbdbc9a42a197fd9194f5eeff2f7a413753fa27fb005187416a1cac016b11186409b8029d92d11603f0b5c67aff075bda542e47737819d71a6b54e35741ee languageName: node linkType: hard -"@react-native/eslint-plugin@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/eslint-plugin@npm:0.83.4" - checksum: 10/a8ace99d94a4c06b5325e7261179011f4932016b92abcca36978d68c8568017e2b77534a9e72ed2870ac0afed65ca0908c036103499445f65e59c1d07e54899e +"@react-native/gradle-plugin@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/gradle-plugin@npm:0.84.1" + checksum: 10/9edf358cb865b287eb04c34a218a8fc31740cff01a8d53bc83fe181c6bcbecc6337b3623b4f9f3490fa1d3a309a6e8ba863a900c7e6bdc88d76717af9175c50e languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/gradle-plugin@npm:0.83.4" - checksum: 10/df7bfa8d298a1cd3e465f724a11741c934855d3c255264464e63c3807028bceb912c1f014554b5413b7ac9230d76dfe1cfcc73901ef7f987af75d7a2b9fba963 +"@react-native/js-polyfills@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/js-polyfills@npm:0.84.1" + checksum: 10/7074e66d54f302864b580d2bf2c048cdb4c37fc4f6fd9dee0faeb4084d524c2f1e7fa60014a54bdcaaa51d75955fbac6a9274e25b806783eee7edf5bce2fb074 languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/js-polyfills@npm:0.83.4" - checksum: 10/cf9a0985979cb7da7fa4be6a002d0e0ef8fc10efcc6c9f0d98dd0683bbe253240fd642b471dc68b9c376935ca027d01649eb3b2e08b45301b9a030a49c3e7f8c +"@react-native/js-polyfills@npm:0.85.3": + version: 0.85.3 + resolution: "@react-native/js-polyfills@npm:0.85.3" + checksum: 10/17eedd2497c128f5c575f3804e2f23c441285e88a64522d740809588d93d11aade5069b3f20edec43715a8aecc3b90e816847e3ff91565bd35a9b692701265a1 languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/metro-babel-transformer@npm:0.83.4" +"@react-native/metro-babel-transformer@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/metro-babel-transformer@npm:0.84.1" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/babel-preset": "npm:0.83.4" + "@react-native/babel-preset": "npm:0.84.1" hermes-parser: "npm:0.32.0" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/dfcef357c538523a967365650c4ee20947461903b12aa4acf82530e3d2b261c1ae138015d197b9ec9b7bb71318eed516c594e61806b7c8641f56f16a3bf9ba2b + checksum: 10/0fc5988b37eb0ef083ab354b5c04a722a44009dd08fa40a7574a630e2f47c19ee34b2da7ee0bd9fab9434515ce4d39ef853fc4d7dc7bab575d71e52d12292e89 languageName: node linkType: hard -"@react-native/metro-config@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/metro-config@npm:0.83.4" +"@react-native/metro-babel-transformer@npm:0.85.3": + version: 0.85.3 + resolution: "@react-native/metro-babel-transformer@npm:0.85.3" dependencies: - "@react-native/js-polyfills": "npm:0.83.4" - "@react-native/metro-babel-transformer": "npm:0.83.4" + "@babel/core": "npm:^7.25.2" + "@react-native/babel-preset": "npm:0.85.3" + hermes-parser: "npm:0.33.3" + nullthrows: "npm:^1.1.1" + peerDependencies: + "@babel/core": "*" + checksum: 10/114fe0708f01903956ad8684e7bbad717a8ea46f083e09f8eb3a67fada2f09dc0b56da5f7401bd31cf0d3bb8c007f7334396d049b80d3a3895d6e32a99ac32fe + languageName: node + linkType: hard + +"@react-native/metro-config@npm:*": + version: 0.85.3 + resolution: "@react-native/metro-config@npm:0.85.3" + dependencies: + "@react-native/js-polyfills": "npm:0.85.3" + "@react-native/metro-babel-transformer": "npm:0.85.3" + metro-config: "npm:^0.84.3" + metro-runtime: "npm:^0.84.3" + checksum: 10/9a0af6d190df911b5e1b5b346b82e2dffeb6a703c832391e3f7b8bd1ac13751d5a2d7a0ef852cdae8b8474fee07783f49b9daa2a9e8b55c9539bd59f4dd609fc + languageName: node + linkType: hard + +"@react-native/metro-config@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/metro-config@npm:0.84.1" + dependencies: + "@react-native/js-polyfills": "npm:0.84.1" + "@react-native/metro-babel-transformer": "npm:0.84.1" metro-config: "npm:^0.83.3" metro-runtime: "npm:^0.83.3" - checksum: 10/d0102b0729ce0a7a32620ab8738dbef03aba0b9385a894f73b2b56642772e12df8d84faa53e0d4650999d197a4fcde3a9c19746776613676d9dc19eaeee7b5ec + checksum: 10/0637fe16d5e1fa7fcfd729dbfa3842b9ead126c1eb6ebe8ff4bcdc959f92a71bc5e0e9bdeb103a33fb04bb3a53dd3ee219736508acee89963aea6fb9db2901c2 languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/normalize-colors@npm:0.83.4" - checksum: 10/3283dfa32db801adf91268701f934254a50a4146ffb8ab0ef125e75564e98a8cc545981980c3afcf383bd58b07b56eba814e6630d3b03a6155482dce4f1fb9e6 +"@react-native/normalize-colors@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/normalize-colors@npm:0.84.1" + checksum: 10/5c65d26dbfab87d19ae9253cfce4eeb284c6f7663d94e8708a535082da65de8150677cac7953146d691922705fe84ea8abf9205e37096f2d9055bd9e9cca6bf1 languageName: node linkType: hard -"@react-native/typescript-config@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/typescript-config@npm:0.83.4" - checksum: 10/23c229fe9563bcb1e910621534a3d464bd914e5dfd9673247e6bf68edf67bb2c215d8bdb6f1c135c485699341d9b35edb47bea16ef5fa0bc09eac61b028b82bb +"@react-native/typescript-config@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/typescript-config@npm:0.84.1" + checksum: 10/6616765f8cf7702818ef251168522aeb68fb9baddcfc8235cd00731d0b4158131bf3fb12680b725c851002832c6fa604bee66b059bb15d35362b437b39615fa0 languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.83.4": - version: 0.83.4 - resolution: "@react-native/virtualized-lists@npm:0.83.4" +"@react-native/virtualized-lists@npm:0.84.1": + version: 0.84.1 + resolution: "@react-native/virtualized-lists@npm:0.84.1" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" @@ -3543,7 +3521,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/44798853aeed19b06fd1267cd2f85dab0be07919aa8124ec106474c49aeb02849f78eb134efccd1e5443367d431e3bd2511c142ce961a37dbdfa0a6843a8369d + checksum: 10/7d28ec774884569fe761a8a28d9667220056c38e8e0775ee44bb8d5d661254810f69bf569fc0efff4fa1b1213764b6e08fc4aedb5661478e6d1f6b7194561d72 languageName: node linkType: hard @@ -3663,6 +3641,48 @@ __metadata: languageName: node linkType: hard +"@turbo/darwin-64@npm:2.8.21": + version: 2.8.21 + resolution: "@turbo/darwin-64@npm:2.8.21" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@turbo/darwin-arm64@npm:2.8.21": + version: 2.8.21 + resolution: "@turbo/darwin-arm64@npm:2.8.21" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@turbo/linux-64@npm:2.8.21": + version: 2.8.21 + resolution: "@turbo/linux-64@npm:2.8.21" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@turbo/linux-arm64@npm:2.8.21": + version: 2.8.21 + resolution: "@turbo/linux-arm64@npm:2.8.21" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@turbo/windows-64@npm:2.8.21": + version: 2.8.21 + resolution: "@turbo/windows-64@npm:2.8.21" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@turbo/windows-arm64@npm:2.8.21": + version: 2.8.21 + resolution: "@turbo/windows-arm64@npm:2.8.21" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -3809,7 +3829,16 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:19.2.14": +"@types/react-test-renderer@npm:^19.1.0": + version: 19.1.0 + resolution: "@types/react-test-renderer@npm:19.1.0" + dependencies: + "@types/react": "npm:*" + checksum: 10/2ef3aec0f2fd638902cda606d70c8531d66f8e8944334427986b99dcac9755ee60b700c5c3a19ac354680f9c45669e98077b84f79cac60e950bdb7d38aebffde + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:19.2.14": version: 19.2.14 resolution: "@types/react@npm:19.2.14" dependencies: @@ -4538,6 +4567,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:0.33.3": + version: 0.33.3 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.33.3" + dependencies: + hermes-parser: "npm:0.33.3" + checksum: 10/250394dbe9fc7b6b2235ed7d0eaed287c811fbb79ab122a6d1a74f212dd85307273a06ae72e0b7f164f908f57d93f45f06183236f51d9fc704083cc67bce78c6 + languageName: node + linkType: hard + "babel-plugin-syntax-hermes-parser@npm:^0.28.0": version: 0.28.1 resolution: "babel-plugin-syntax-hermes-parser@npm:0.28.1" @@ -4740,7 +4778,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.5.0": +"buffer@npm:^5.4.3, buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -6175,14 +6213,14 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-native@npm:^4.0.0": - version: 4.1.0 - resolution: "eslint-plugin-react-native@npm:4.1.0" +"eslint-plugin-react-native@npm:^5.0.0": + version: 5.0.0 + resolution: "eslint-plugin-react-native@npm:5.0.0" dependencies: eslint-plugin-react-native-globals: "npm:^0.1.1" peerDependencies: - eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10/fb2d65a3faca9bf775a0fa430eb7e86b7c27d0b256916d4f79a94def9ad353c8a10605f1f0dc9a5fb10e446b003341d53af9d8cbca4dd7ba394350355efa30c6 + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10/41e84d806b74e3b4906c5541cad0caf1c79e30031130a1f3e92f9c030fb12e9ee4b193ea7b6ed5c425f2d83795e7f3ca51ab357e7e8f1f3d89c12fd4613343be languageName: node linkType: hard @@ -6998,7 +7036,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4": +"glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -7155,10 +7193,10 @@ __metadata: languageName: node linkType: hard -"hermes-compiler@npm:0.14.1": - version: 0.14.1 - resolution: "hermes-compiler@npm:0.14.1" - checksum: 10/dbb0f4886532b26262721fa34de5947502b265cea8574f6094915abf59d31c757da6a41730cb6f6d088ec7607d659e8b4036782d227dcf072e9a49152bbef756 +"hermes-compiler@npm:250829098.0.9": + version: 250829098.0.9 + resolution: "hermes-compiler@npm:250829098.0.9" + checksum: 10/15e1a0565e93f12a01e543d0d6f1a3a4cfb8037c44f89d930abd97c42e37c2b69f230b03e699c97402e6db33b7a9eb2d168c8c4a12966ef3b584e56cc565430a languageName: node linkType: hard @@ -7190,6 +7228,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.35.0": + version: 0.35.0 + resolution: "hermes-estree@npm:0.35.0" + checksum: 10/d10283d0189ab2270ecae08632ed4f15eb79f206add4960d198aa6efd5686e1c92ed37c17a020c730281e46ff2f56661f3d787bdfb1692218c1495b329049747 + languageName: node + linkType: hard + "hermes-parser@npm:0.28.1": version: 0.28.1 resolution: "hermes-parser@npm:0.28.1" @@ -7217,6 +7262,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.35.0": + version: 0.35.0 + resolution: "hermes-parser@npm:0.35.0" + dependencies: + hermes-estree: "npm:0.35.0" + checksum: 10/62be25fa41b708db21c4db9153b0d60cfbf9bd4645f1712eb559b3be8c191266b5b381df60fbbc45416799f73c2361eb69a81eead21dc5159fe2ea72f946d5f7 + languageName: node + linkType: hard + "hermes-parser@npm:^0.25.1": version: 0.25.1 resolution: "hermes-parser@npm:0.25.1" @@ -7235,6 +7289,13 @@ __metadata: languageName: node linkType: hard +"hookable@npm:^6.1.0": + version: 6.1.1 + resolution: "hookable@npm:6.1.1" + checksum: 10/2f8b478ba1bb0782f0112d049b3d3d01aebf8245c250d3bdd306aa4bfdaba0f5d3c82d28fefa4290bb3c2bf4f1be22c6bed7ed50f0b39cd33742983202a32122 + languageName: node + linkType: hard + "hosted-git-info@npm:^8.0.0": version: 8.1.0 resolution: "hosted-git-info@npm:8.1.0" @@ -9152,22 +9213,22 @@ __metadata: "@babel/runtime": "npm:^7.28.6" "@op-engineering/op-sqlite": "npm:15.2.5" "@react-native-async-storage/async-storage": "npm:2.2.0" - "@react-native-community/cli": "npm:20.1.2" - "@react-native-community/cli-platform-android": "npm:20.1.2" - "@react-native-community/cli-platform-ios": "npm:20.1.2" - "@react-native-harness/jest": "npm:1.0.0-alpha.21" - "@react-native-harness/platform-android": "npm:1.0.0-alpha.21" - "@react-native-harness/platform-apple": "npm:1.0.0-alpha.21" - "@react-native/babel-preset": "npm:0.83.4" - "@react-native/metro-config": "npm:0.83.4" - "@react-native/typescript-config": "npm:0.83.4" + "@react-native-community/cli": "npm:20.1.3" + "@react-native-community/cli-platform-android": "npm:20.1.3" + "@react-native-community/cli-platform-ios": "npm:20.1.3" + "@react-native-harness/jest": "npm:1.1.0" + "@react-native-harness/platform-android": "npm:1.1.0" + "@react-native-harness/platform-apple": "npm:1.1.0" + "@react-native/babel-preset": "npm:0.84.1" + "@react-native/metro-config": "npm:0.84.1" + "@react-native/typescript-config": "npm:0.84.1" "@types/react": "npm:19.2.14" react: "npm:19.2.4" - react-native: "npm:0.83.4" + react-native: "npm:0.84.1" react-native-builder-bob: "npm:0.40.18" - react-native-gesture-handler: "npm:2.30.0" - react-native-harness: "npm:1.0.0" - react-native-monorepo-config: "npm:0.1.10" + react-native-gesture-handler: "npm:2.31.2" + react-native-harness: "npm:1.1.0" + react-native-monorepo-config: "npm:0.3.3" languageName: unknown linkType: soft @@ -9181,9 +9242,9 @@ __metadata: "@eslint/js": "npm:9.39.4" "@op-engineering/op-sqlite": "npm:15.2.5" "@react-native-async-storage/async-storage": "npm:2.2.0" - "@react-native-community/cli": "npm:20.1.2" - "@react-native/babel-preset": "npm:0.83.4" - "@react-native/eslint-config": "npm:0.83.4" + "@react-native-community/cli": "npm:20.1.3" + "@react-native/babel-preset": "npm:0.84.1" + "@react-native/eslint-config": "npm:0.84.1" "@release-it/conventional-changelog": "npm:10.0.5" "@types/jest": "npm:29.5.14" "@types/react": "npm:19.2.14" @@ -9196,11 +9257,11 @@ __metadata: lefthook: "npm:2.1.3" prettier: "npm:3.4.2" react: "npm:19.2.4" - react-native: "npm:0.83.4" + react-native: "npm:0.84.1" react-native-builder-bob: "npm:0.40.18" - react-native-gesture-handler: "npm:2.30.0" + react-native-gesture-handler: "npm:2.31.2" release-it: "npm:19.2.4" - turbo: "npm:2.8.15" + turbo: "npm:2.8.21" typescript: "npm:5.9.3" peerDependencies: "@op-engineering/op-sqlite": "*" @@ -9267,6 +9328,19 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.84.4": + version: 0.84.4 + resolution: "metro-babel-transformer@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.35.0" + metro-cache-key: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + checksum: 10/5e3c1b49d88db6e6219f3c47a1fa61dd6cf38def566d9f24a430a8117853009fb0e3f975c7fa5aa20c7af7f142b37ef37b4a22838f0d18324a92002237630fad + languageName: node + linkType: hard + "metro-cache-key@npm:0.83.5": version: 0.83.5 resolution: "metro-cache-key@npm:0.83.5" @@ -9276,6 +9350,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.84.4": + version: 0.84.4 + resolution: "metro-cache-key@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/381f330ec25ad3823ae843e5c21ed75aa5e34f4c92231aead526f4936f4280e1a73977a8d10fecc2b1ef8f11fc884323a76b650a93c699d6b02c706c17eea7ca + languageName: node + linkType: hard + "metro-cache@npm:0.83.5": version: 0.83.5 resolution: "metro-cache@npm:0.83.5" @@ -9288,6 +9371,18 @@ __metadata: languageName: node linkType: hard +"metro-cache@npm:0.84.4": + version: 0.84.4 + resolution: "metro-cache@npm:0.84.4" + 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.84.4" + checksum: 10/e59dcc3c691b545ce574383ef22576e8d3e5b8e5e7ea9fbe9e0070d8d36406705c01458c30b4a31ca3b810e43082cd3a1948d389cbb13552f170c336dc651b7e + languageName: node + linkType: hard + "metro-config@npm:0.83.5, metro-config@npm:^0.83.3": version: 0.83.5 resolution: "metro-config@npm:0.83.5" @@ -9304,6 +9399,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.84.4, metro-config@npm:^0.84.3": + version: 0.84.4 + resolution: "metro-config@npm:0.84.4" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-core: "npm:0.84.4" + metro-runtime: "npm:0.84.4" + yaml: "npm:^2.6.1" + checksum: 10/54c61d4794dcbe5444e65ef3bb28325449f143afd9972e1093d13871472ee9086094c38daf3735fc688448ab13b60e7800623f3cf5685063f7983956a5f55fcd + languageName: node + linkType: hard + "metro-core@npm:0.83.5, metro-core@npm:^0.83.3": version: 0.83.5 resolution: "metro-core@npm:0.83.5" @@ -9315,6 +9426,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.84.4": + version: 0.84.4 + resolution: "metro-core@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.84.4" + checksum: 10/9ee8513522277c5fe00a8d1ef6b698763b9fd2bd2cdc90786617eef36896d3e1e778a0fd8aadd42027d5ca222a54056e734a51f5adb321195878f06341692713 + languageName: node + linkType: hard + "metro-file-map@npm:0.83.5": version: 0.83.5 resolution: "metro-file-map@npm:0.83.5" @@ -9332,6 +9454,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.84.4": + version: 0.84.4 + resolution: "metro-file-map@npm:0.84.4" + 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/ab4d01e5ab78cc78682603b8eaf68e45ccc00fe5e440e4e69d7e6102f79a13e126da3692ae6f3d4b379a8b05b284498fa18d10b1f9447046068e1aa1b658b2db + languageName: node + linkType: hard + "metro-minify-terser@npm:0.83.5": version: 0.83.5 resolution: "metro-minify-terser@npm:0.83.5" @@ -9342,6 +9481,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.84.4": + version: 0.84.4 + resolution: "metro-minify-terser@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/e0893b5672a4ad2bc6e2c492f9994a3eae6e633e49f2e5a52738e80260e37bb5143219ce2c337c22dd16cee850e68b99d1ba4bc378d7cc8e9cd60d636aa051b5 + languageName: node + linkType: hard + "metro-resolver@npm:0.83.5": version: 0.83.5 resolution: "metro-resolver@npm:0.83.5" @@ -9351,6 +9500,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.84.4": + version: 0.84.4 + resolution: "metro-resolver@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/2234b8820ebebc70ae9688e3f4e4ec031f59bfefe51cd6171f7ce2063d97308663021292dccb2f34d80806d685f7f2583834eb718c8d5465a0385687f14b3996 + languageName: node + linkType: hard + "metro-runtime@npm:0.83.5, metro-runtime@npm:^0.83.3": version: 0.83.5 resolution: "metro-runtime@npm:0.83.5" @@ -9361,6 +9519,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.84.4, metro-runtime@npm:^0.84.3": + version: 0.84.4 + resolution: "metro-runtime@npm:0.84.4" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/8c5818fdc67bd8ece9fc16bdcc848e115c76289f41b397efe30e401590dc04e36a4ea5af126682648f3b689ffbee27da20ba27ed261021aa4d222b75a40f353f + languageName: node + linkType: hard + "metro-source-map@npm:0.83.5, metro-source-map@npm:^0.83.3": version: 0.83.5 resolution: "metro-source-map@npm:0.83.5" @@ -9378,6 +9546,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.84.4": + version: 0.84.4 + resolution: "metro-source-map@npm:0.84.4" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.84.4" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/675a4df8a85ef411a58cb334932bda6f8bd87a8e031f73ac1dfd76cfe89ebbe994c167fc36b66fc550c09e7bef1cfe405c5693ae4c20198db9753b6a7acae4fd + languageName: node + linkType: hard + "metro-symbolicate@npm:0.83.5": version: 0.83.5 resolution: "metro-symbolicate@npm:0.83.5" @@ -9394,6 +9579,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.84.4": + version: 0.84.4 + resolution: "metro-symbolicate@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/a6aebc3a604aebd1c83dc090249c4f91f2bad25bcdd48c05c5f0cfc56ad223ac2c1ba558123b68ba6c3e97de7515d81b6ba9b048012746395f3eb68a9e90a189 + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.83.5": version: 0.83.5 resolution: "metro-transform-plugins@npm:0.83.5" @@ -9408,6 +9609,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.84.4": + version: 0.84.4 + resolution: "metro-transform-plugins@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/ae83306fbb640392205e571ddfb69629ec6d2878d664de85da2150d23458949dba833feef03759d9b15a13c0a50b4191ede41c685d12554c16fb8d56609292d6 + languageName: node + linkType: hard + "metro-transform-worker@npm:0.83.5": version: 0.83.5 resolution: "metro-transform-worker@npm:0.83.5" @@ -9429,6 +9644,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.84.4": + version: 0.84.4 + resolution: "metro-transform-worker@npm:0.84.4" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.84.4" + metro-babel-transformer: "npm:0.84.4" + metro-cache: "npm:0.84.4" + metro-cache-key: "npm:0.84.4" + metro-minify-terser: "npm:0.84.4" + metro-source-map: "npm:0.84.4" + metro-transform-plugins: "npm:0.84.4" + nullthrows: "npm:^1.1.1" + checksum: 10/bacccf7a3a051a2216490b221c63f16db97f35845232c0bd32edd211f82befa93b319fd6eb00df47595c24b6d7c3ec1851849773ff532de96c76b931709faa2b + languageName: node + linkType: hard + "metro@npm:0.83.5, metro@npm:^0.83.3": version: 0.83.5 resolution: "metro@npm:0.83.5" @@ -9479,6 +9715,55 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.84.4": + version: 0.84.4 + resolution: "metro@npm:0.84.4" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.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.35.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.84.4" + metro-cache: "npm:0.84.4" + metro-cache-key: "npm:0.84.4" + metro-config: "npm:0.84.4" + metro-core: "npm:0.84.4" + metro-file-map: "npm:0.84.4" + metro-resolver: "npm:0.84.4" + metro-runtime: "npm:0.84.4" + metro-source-map: "npm:0.84.4" + metro-symbolicate: "npm:0.84.4" + metro-transform-plugins: "npm:0.84.4" + metro-transform-worker: "npm:0.84.4" + mime-types: "npm:^3.0.1" + 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/22369963a965398add8e79939852b6a8906565d81bcb2a764255526fc8548417aed2976e315ec44cc432e104ea03afc616879449a0a9e4c292cfe0e9f252649d + languageName: node + linkType: hard + "micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" @@ -9908,6 +10193,15 @@ __metadata: languageName: node linkType: hard +"ob1@npm:0.84.4": + version: 0.84.4 + resolution: "ob1@npm:0.84.4" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/15621cfa2d6bb196c5046031b3f85259735a245d9d7087f41758be3c31589c464e6eef53d94ec3d680fd8286ef08944782b9112f18d790a99421fbc7e311bb32 + languageName: node + linkType: hard + "object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -10582,7 +10876,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 @@ -10706,69 +11000,71 @@ __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" +"react-native-gesture-handler@npm:2.31.2": + version: 2.31.2 + resolution: "react-native-gesture-handler@npm:2.31.2" dependencies: "@egjs/hammerjs": "npm:^2.0.17" + "@types/react-test-renderer": "npm:^19.1.0" hoist-non-react-statics: "npm:^3.3.0" invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/242b1eb29202bc9fc7bf0271c3da102559adc9f2810441465b6d78c1a8ed8f65bdd91335957c841a4716f796be3e7b87d1d55629d6803ea12e1be832d89c946c + checksum: 10/717ae7a0b997e2eba5eb3d78c11c34cfb5b4f5ac86e84037687983e66f217ca4baceb95ee833329f5bb06d81d83cc96bb57009fa43daa759692abae01ea9cfe0 languageName: node linkType: hard -"react-native-harness@npm:1.0.0": - version: 1.0.0 - resolution: "react-native-harness@npm:1.0.0" +"react-native-harness@npm:1.1.0": + version: 1.1.0 + resolution: "react-native-harness@npm:1.1.0" dependencies: - "@react-native-harness/babel-preset": "npm:1.0.0" - "@react-native-harness/cli": "npm:1.0.0" - "@react-native-harness/jest": "npm:1.0.0" - "@react-native-harness/metro": "npm:1.0.0" - "@react-native-harness/runtime": "npm:1.0.0" + "@react-native-harness/babel-preset": "npm:1.1.0" + "@react-native-harness/cli": "npm:1.1.0" + "@react-native-harness/jest": "npm:1.1.0" + "@react-native-harness/metro": "npm:1.1.0" + "@react-native-harness/runtime": "npm:1.1.0" tslib: "npm:^2.3.0" bin: harness: bin.js react-native-harness: bin.js - checksum: 10/229d644d7055358450c2fc126a1221a509bf3559cae57d4a748cc69ce41e2b409533b7dd548127daa512e153c1d527946472bed165e6ecd8415eb436c721111f + checksum: 10/45a7030fa4cdf28d2d592688dce47855727427b2e381e2a711e9502ba39c8637a53bdea1d8292acb2bd35af699ce81b23908ed9e48ba9b32295144df6af1ef5d languageName: node linkType: hard -"react-native-monorepo-config@npm:0.1.10": - version: 0.1.10 - resolution: "react-native-monorepo-config@npm:0.1.10" +"react-native-monorepo-config@npm:0.3.3, 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-monorepo-config@npm:^0.3.3": - version: 0.3.3 - resolution: "react-native-monorepo-config@npm:0.3.3" +"react-native-url-polyfill@npm:^3.0.0": + version: 3.0.0 + resolution: "react-native-url-polyfill@npm:3.0.0" dependencies: - escape-string-regexp: "npm:^5.0.0" - fast-glob: "npm:^3.3.3" - checksum: 10/d301020b38f80010bce38108a9e1b72deee3eb37f1ba5e2f0471dc0737584b8d25158a2e649c38ddbe890b653c29a69ef82d73c522473cfdb2396239ee84fcd8 + whatwg-url-without-unicode: "npm:8.0.0-3" + peerDependencies: + react-native: "*" + checksum: 10/62457a360745bb65fda2349bb95d2a90ad70f87005aa464fa8dd4919fa34bf2007f64bf6bbb1a76b5cdb579e3df9da6a23040a0eddf64456cadf6e766069854f languageName: node linkType: hard -"react-native@npm:0.83.4": - version: 0.83.4 - resolution: "react-native@npm:0.83.4" +"react-native@npm:0.84.1": + version: 0.84.1 + resolution: "react-native@npm:0.84.1" dependencies: "@jest/create-cache-key-function": "npm:^29.7.0" - "@react-native/assets-registry": "npm:0.83.4" - "@react-native/codegen": "npm:0.83.4" - "@react-native/community-cli-plugin": "npm:0.83.4" - "@react-native/gradle-plugin": "npm:0.83.4" - "@react-native/js-polyfills": "npm:0.83.4" - "@react-native/normalize-colors": "npm:0.83.4" - "@react-native/virtualized-lists": "npm:0.83.4" + "@react-native/assets-registry": "npm:0.84.1" + "@react-native/codegen": "npm:0.84.1" + "@react-native/community-cli-plugin": "npm:0.84.1" + "@react-native/gradle-plugin": "npm:0.84.1" + "@react-native/js-polyfills": "npm:0.84.1" + "@react-native/normalize-colors": "npm:0.84.1" + "@react-native/virtualized-lists": "npm:0.84.1" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" @@ -10777,8 +11073,7 @@ __metadata: base64-js: "npm:^1.5.1" commander: "npm:^12.0.0" flow-enums-runtime: "npm:^0.0.6" - glob: "npm:^7.1.1" - hermes-compiler: "npm:0.14.1" + hermes-compiler: "npm:250829098.0.9" invariant: "npm:^2.2.4" jest-environment-node: "npm:^29.7.0" memoize-one: "npm:^5.0.0" @@ -10793,18 +11088,19 @@ __metadata: scheduler: "npm:0.27.0" semver: "npm:^7.1.3" stacktrace-parser: "npm:^0.1.10" + tinyglobby: "npm:^0.2.15" whatwg-fetch: "npm:^3.0.0" ws: "npm:^7.5.10" yargs: "npm:^17.6.2" peerDependencies: "@types/react": ^19.1.1 - react: ^19.2.0 + react: ^19.2.3 peerDependenciesMeta: "@types/react": optional: true bin: react-native: cli.js - checksum: 10/ef79e818bccc17dffac6810270902cd2d6bce8e6ccec3d6c6b71ff3f6da1e32f66ea0f296624c295d5febd4396d3d38ccf923daefb0c943fef3a8aa3c4f554c3 + checksum: 10/f029d0eb9984fdf3fe04e116d36304bf8b5d4b6198cfd332026788e0bdc5648b34d434485567e880bfda461913f8b9819b666e7e731189fa4afb0cb89132b33c languageName: node linkType: hard @@ -11954,74 +12250,32 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:2.8.15": - version: 2.8.15 - resolution: "turbo-darwin-64@npm:2.8.15" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"turbo-darwin-arm64@npm:2.8.15": - version: 2.8.15 - resolution: "turbo-darwin-arm64@npm:2.8.15" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"turbo-linux-64@npm:2.8.15": - version: 2.8.15 - resolution: "turbo-linux-64@npm:2.8.15" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"turbo-linux-arm64@npm:2.8.15": - version: 2.8.15 - resolution: "turbo-linux-arm64@npm:2.8.15" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"turbo-windows-64@npm:2.8.15": - version: 2.8.15 - resolution: "turbo-windows-64@npm:2.8.15" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"turbo-windows-arm64@npm:2.8.15": - version: 2.8.15 - resolution: "turbo-windows-arm64@npm:2.8.15" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"turbo@npm:2.8.15": - version: 2.8.15 - resolution: "turbo@npm:2.8.15" +"turbo@npm:2.8.21": + version: 2.8.21 + resolution: "turbo@npm:2.8.21" dependencies: - turbo-darwin-64: "npm:2.8.15" - turbo-darwin-arm64: "npm:2.8.15" - turbo-linux-64: "npm:2.8.15" - turbo-linux-arm64: "npm:2.8.15" - turbo-windows-64: "npm:2.8.15" - turbo-windows-arm64: "npm:2.8.15" + "@turbo/darwin-64": "npm:2.8.21" + "@turbo/darwin-arm64": "npm:2.8.21" + "@turbo/linux-64": "npm:2.8.21" + "@turbo/linux-arm64": "npm:2.8.21" + "@turbo/windows-64": "npm:2.8.21" + "@turbo/windows-arm64": "npm:2.8.21" dependenciesMeta: - turbo-darwin-64: + "@turbo/darwin-64": optional: true - turbo-darwin-arm64: + "@turbo/darwin-arm64": optional: true - turbo-linux-64: + "@turbo/linux-64": optional: true - turbo-linux-arm64: + "@turbo/linux-arm64": optional: true - turbo-windows-64: + "@turbo/windows-64": optional: true - turbo-windows-arm64: + "@turbo/windows-arm64": optional: true bin: turbo: bin/turbo - checksum: 10/f2c485d4d29d8262b68cf71ad98a73b849a654912561dca7eaee8e32af8461d6b0707bc610f7cdf72b31cb86711f14dae70b92e1271fbad9b9347497bc814792 + checksum: 10/f7f6e391b9babae5da3275e7c63cad481c4362b0559b8769739f43d6cec216458924482b8635744cdda5ed4916e06db2f4fd847a6203de3c8095ecac0d8a6d5d languageName: node linkType: hard @@ -12392,6 +12646,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^5.0.0": + version: 5.0.0 + resolution: "webidl-conversions@npm:5.0.0" + checksum: 10/cea864dd9cf1f2133d82169a446fb94427ba089e4676f5895273ea085f165649afe587ae3f19f2f0370751a724bba2d96e9956d652b3e41ac1feaaa4376e2d70 + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.0.0": version: 3.6.20 resolution: "whatwg-fetch@npm:3.6.20" @@ -12399,6 +12660,17 @@ __metadata: languageName: node linkType: hard +"whatwg-url-without-unicode@npm:8.0.0-3": + version: 8.0.0-3 + resolution: "whatwg-url-without-unicode@npm:8.0.0-3" + dependencies: + buffer: "npm:^5.4.3" + punycode: "npm:^2.1.1" + webidl-conversions: "npm:^5.0.0" + checksum: 10/aa588b54b75304335c5e189f8572626f989364c2ac5be5a1643ac687c2501f044405e1eb5761d65a826f570befade5fe51a723d917e9ab7672bb65d14065e82f + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" From cb2c5b290b772039e803aa679bb0a21c0c4d8d06 Mon Sep 17 00:00:00 2001 From: MxKevinBeqo Date: Wed, 13 May 2026 11:30:34 +0200 Subject: [PATCH 02/26] chore: downgraded react to satisfy react-native v0.84 --- package.json | 2 +- yarn.lock | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b8eae33..2bdd152 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "jest": "29.7.0", "lefthook": "2.1.3", "prettier": "3.4.2", - "react": "19.2.4", + "react": "19.2.3", "react-native": "0.84.1", "react-native-builder-bob": "0.40.18", "react-native-gesture-handler": "2.31.2", diff --git a/yarn.lock b/yarn.lock index d4ec23f..cb221e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9256,7 +9256,7 @@ __metadata: jest: "npm:29.7.0" lefthook: "npm:2.1.3" prettier: "npm:3.4.2" - react: "npm:19.2.4" + react: "npm:19.2.3" react-native: "npm:0.84.1" react-native-builder-bob: "npm:0.40.18" react-native-gesture-handler: "npm:2.31.2" @@ -11111,6 +11111,13 @@ __metadata: languageName: node linkType: hard +"react@npm:19.2.3": + version: 19.2.3 + resolution: "react@npm:19.2.3" + checksum: 10/d16b7f35c0d35a56f63d9d1693819762e4abc479c57dd6310298920bed3820fcec7e17a99d44983416d8f5049143ea45b8005d3ab8324bae8973224400502b08 + languageName: node + linkType: hard + "react@npm:19.2.4": version: 19.2.4 resolution: "react@npm:19.2.4" From b0a8bac0826f0b32a60a280ce5151025cbf30507 Mon Sep 17 00:00:00 2001 From: MxKevinBeqo Date: Wed, 13 May 2026 16:40:09 +0200 Subject: [PATCH 03/26] chore: bump Native Binary Version --- .../main/java/com/mendix/mendixnative/react/MxConfiguration.kt | 2 +- ios/Modules/MxConfiguration/MxConfiguration.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/mendix/mendixnative/react/MxConfiguration.kt b/android/src/main/java/com/mendix/mendixnative/react/MxConfiguration.kt index 2945628..814bfff 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/MxConfiguration.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/MxConfiguration.kt @@ -56,7 +56,7 @@ class MxConfiguration(val reactContext: ReactApplicationContext) { } companion object { - const val NATIVE_BINARY_VERSION: Int = 31 + const val NATIVE_BINARY_VERSION: Int = 32 const val NAME: String = "MxConfiguration" var defaultDatabaseName: String = "default" diff --git a/ios/Modules/MxConfiguration/MxConfiguration.swift b/ios/Modules/MxConfiguration/MxConfiguration.swift index a45cf19..cae46aa 100644 --- a/ios/Modules/MxConfiguration/MxConfiguration.swift +++ b/ios/Modules/MxConfiguration/MxConfiguration.swift @@ -3,7 +3,7 @@ import Foundation @objcMembers public class MxConfiguration: NSObject { - private static let nativeBinaryVersion: Int = 31 + private static let nativeBinaryVersion: Int = 32 private static let defaultDatabaseName = "default" private static let defaultFilesDirectoryName = "files/default" From a07a3e67a9f828bc3266e650c8aef0c6a15590f4 Mon Sep 17 00:00:00 2001 From: Yogendra Shelke <25844542+YogendraShelke@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:56:40 +0530 Subject: [PATCH 04/26] chore: revamp --- .gitignore | 2 + .../react/devsupport/DevInternalSettings.kt | 10 - .../devsupport/DevSupportManagerHelpers.kt | 33 ---- .../mendix/mendixnative/MendixInitializer.kt | 6 +- .../mendix/mendixnative/react/ClearData.kt | 61 ++++-- .../com/mendix/mendixnative/react/CloseApp.kt | 15 +- .../mendixnative/react/NativeErrorHandler.kt | 16 +- .../mendixnative/react/fs/NativeFsModule.kt | 2 +- .../mendixnative/util/ReflectionUtils.java | 122 +++--------- .../com/mendixnative/MendixNativeModule.kt | 183 ------------------ .../com/mendixnative/MendixNativePackage.kt | 64 ++++-- .../configuration/MxConfigurationModule.kt | 24 +++ .../com/mendixnative/cookie/MxCookieModule.kt | 24 +++ .../mendixnative/download/MxDownloadModule.kt | 25 +++ .../encryption/MxEncryptionModule.kt | 40 ++++ .../com/mendixnative/error/MxErrorModule.kt | 24 +++ .../com/mendixnative/fs/MxFileSystemModule.kt | 70 +++++++ .../navigation/MxNavigationModule.kt | 27 +++ .../java/com/mendixnative/ota/MxOtaModule.kt | 29 +++ .../com/mendixnative/reload/MxReloadModule.kt | 30 +++ .../splash/MxSplashScreenModule.kt | 31 +++ .../mendixnative/storage/MxStorageModule.kt | 46 +++++ example/__tests__/splash-screen.harness.ts | 2 +- .../xcschemes/MendixNativeExample.xcscheme | 7 + .../ios/MendixNativeExample/AppDelegate.swift | 57 ++---- example/rn-harness.config.mjs | 4 +- ios/MendixNative.h | 8 - ios/MendixNative.mm | 153 --------------- ios/Modules/Helper/DevHelper.swift | 63 ++---- ios/Modules/Helper/ReactAppProvider.swift | 41 ++-- .../MxConfiguration/MxConfigurationModule.h | 4 + .../MxConfiguration/MxConfigurationModule.mm | 20 ++ ios/TurboModules/MxCookie/MxCookie.h | 4 + ios/TurboModules/MxCookie/MxCookie.mm | 22 +++ ios/TurboModules/MxDownload/MxDownload.h | 4 + ios/TurboModules/MxDownload/MxDownload.mm | 27 +++ ios/TurboModules/MxEncryption/MxEncryption.h | 4 + ios/TurboModules/MxEncryption/MxEncryption.mm | 48 +++++ ios/TurboModules/MxError/MxError.h | 4 + ios/TurboModules/MxError/MxError.mm | 21 ++ ios/TurboModules/MxFileSystem/MxFileSystem.h | 4 + ios/TurboModules/MxFileSystem/MxFileSystem.mm | 87 +++++++++ ios/TurboModules/MxNavigation/MxNavigation.h | 4 + ios/TurboModules/MxNavigation/MxNavigation.mm | 24 +++ ios/TurboModules/MxOta/MxOta.h | 4 + ios/TurboModules/MxOta/MxOta.mm | 30 +++ ios/TurboModules/MxReload/MxReload.h | 4 + ios/TurboModules/MxReload/MxReload.mm | 28 +++ .../MxSplashScreen/MxSplashScreen.h | 4 + .../MxSplashScreen/MxSplashScreen.mm | 24 +++ ios/TurboModules/MxStorage/MxStorage.h | 4 + ios/TurboModules/MxStorage/MxStorage.mm | 58 ++++++ src/cookie.ts | 5 - src/cookie/NativeMxCookie.ts | 7 + src/cookie/index.ts | 5 + src/dev-settings.ts | 100 ++++++++++ src/download-handler.ts | 6 - src/download-handler/NativeMxDownload.ts | 30 +++ src/download-handler/index.ts | 9 + src/encrypted-storage.ts | 13 +- src/encryption/NativeMxEncryption.ts | 46 +++++ src/encryption/index.ts | 74 +++++++ src/error-handler.ts | 5 - src/error/NativeMxError.ts | 8 + src/error/index.ts | 5 + src/events.ts | 7 +- src/file-system/NativeMxFileSystem.ts | 41 ++++ src/{file-system.ts => file-system/index.ts} | 28 +-- src/index.ts | 10 +- src/mx-configuration.ts | 3 - src/mx-configuration/NativeMxConfiguration.ts | 31 +++ src/mx-configuration/index.ts | 3 + src/navigation-mode.ts | 6 - src/navigation-mode/NativeMxNavigation.ts | 9 + src/navigation-mode/index.ts | 6 + src/ota.ts | 9 - src/ota/NativeMxOta.ts | 48 +++++ src/ota/index.ts | 13 ++ src/reload-handler.ts | 6 - src/reload-handler/NativeMxReload.ts | 10 + src/reload-handler/index.ts | 6 + src/specs/NativeMendixNative.ts | 126 ------------ src/splash-screen.ts | 6 - src/splash-screen/NativeMxSplashScreen.ts | 22 +++ src/splash-screen/index.ts | 36 ++++ src/storage/NativeMxStorage.ts | 8 + src/storage/index.ts | 97 ++++++++++ 87 files changed, 1675 insertions(+), 821 deletions(-) delete mode 100644 android/src/main/java/com/facebook/react/devsupport/DevInternalSettings.kt delete mode 100644 android/src/main/java/com/facebook/react/devsupport/DevSupportManagerHelpers.kt delete mode 100644 android/src/main/java/com/mendixnative/MendixNativeModule.kt create mode 100644 android/src/main/java/com/mendixnative/configuration/MxConfigurationModule.kt create mode 100644 android/src/main/java/com/mendixnative/cookie/MxCookieModule.kt create mode 100644 android/src/main/java/com/mendixnative/download/MxDownloadModule.kt create mode 100644 android/src/main/java/com/mendixnative/encryption/MxEncryptionModule.kt create mode 100644 android/src/main/java/com/mendixnative/error/MxErrorModule.kt create mode 100644 android/src/main/java/com/mendixnative/fs/MxFileSystemModule.kt create mode 100644 android/src/main/java/com/mendixnative/navigation/MxNavigationModule.kt create mode 100644 android/src/main/java/com/mendixnative/ota/MxOtaModule.kt create mode 100644 android/src/main/java/com/mendixnative/reload/MxReloadModule.kt create mode 100644 android/src/main/java/com/mendixnative/splash/MxSplashScreenModule.kt create mode 100644 android/src/main/java/com/mendixnative/storage/MxStorageModule.kt delete mode 100644 ios/MendixNative.h delete mode 100644 ios/MendixNative.mm create mode 100644 ios/TurboModules/MxConfiguration/MxConfigurationModule.h create mode 100644 ios/TurboModules/MxConfiguration/MxConfigurationModule.mm create mode 100644 ios/TurboModules/MxCookie/MxCookie.h create mode 100644 ios/TurboModules/MxCookie/MxCookie.mm create mode 100644 ios/TurboModules/MxDownload/MxDownload.h create mode 100644 ios/TurboModules/MxDownload/MxDownload.mm create mode 100644 ios/TurboModules/MxEncryption/MxEncryption.h create mode 100644 ios/TurboModules/MxEncryption/MxEncryption.mm create mode 100644 ios/TurboModules/MxError/MxError.h create mode 100644 ios/TurboModules/MxError/MxError.mm create mode 100644 ios/TurboModules/MxFileSystem/MxFileSystem.h create mode 100644 ios/TurboModules/MxFileSystem/MxFileSystem.mm create mode 100644 ios/TurboModules/MxNavigation/MxNavigation.h create mode 100644 ios/TurboModules/MxNavigation/MxNavigation.mm create mode 100644 ios/TurboModules/MxOta/MxOta.h create mode 100644 ios/TurboModules/MxOta/MxOta.mm create mode 100644 ios/TurboModules/MxReload/MxReload.h create mode 100644 ios/TurboModules/MxReload/MxReload.mm create mode 100644 ios/TurboModules/MxSplashScreen/MxSplashScreen.h create mode 100644 ios/TurboModules/MxSplashScreen/MxSplashScreen.mm create mode 100644 ios/TurboModules/MxStorage/MxStorage.h create mode 100644 ios/TurboModules/MxStorage/MxStorage.mm delete mode 100644 src/cookie.ts create mode 100644 src/cookie/NativeMxCookie.ts create mode 100644 src/cookie/index.ts create mode 100644 src/dev-settings.ts delete mode 100644 src/download-handler.ts create mode 100644 src/download-handler/NativeMxDownload.ts create mode 100644 src/download-handler/index.ts create mode 100644 src/encryption/NativeMxEncryption.ts create mode 100644 src/encryption/index.ts delete mode 100644 src/error-handler.ts create mode 100644 src/error/NativeMxError.ts create mode 100644 src/error/index.ts create mode 100644 src/file-system/NativeMxFileSystem.ts rename src/{file-system.ts => file-system/index.ts} (55%) delete mode 100644 src/mx-configuration.ts create mode 100644 src/mx-configuration/NativeMxConfiguration.ts create mode 100644 src/mx-configuration/index.ts delete mode 100644 src/navigation-mode.ts create mode 100644 src/navigation-mode/NativeMxNavigation.ts create mode 100644 src/navigation-mode/index.ts delete mode 100644 src/ota.ts create mode 100644 src/ota/NativeMxOta.ts create mode 100644 src/ota/index.ts delete mode 100644 src/reload-handler.ts create mode 100644 src/reload-handler/NativeMxReload.ts create mode 100644 src/reload-handler/index.ts delete mode 100644 src/specs/NativeMendixNative.ts delete mode 100644 src/splash-screen.ts create mode 100644 src/splash-screen/NativeMxSplashScreen.ts create mode 100644 src/splash-screen/index.ts create mode 100644 src/storage/NativeMxStorage.ts create mode 100644 src/storage/index.ts diff --git a/.gitignore b/.gitignore index d8bf499..2b842a0 100644 --- a/.gitignore +++ b/.gitignore @@ -90,3 +90,5 @@ lib/ # Fastlane.swift runner binary **/fastlane/FastlaneRunner + +.claude/ diff --git a/android/src/main/java/com/facebook/react/devsupport/DevInternalSettings.kt b/android/src/main/java/com/facebook/react/devsupport/DevInternalSettings.kt deleted file mode 100644 index ceefb9d..0000000 --- a/android/src/main/java/com/facebook/react/devsupport/DevInternalSettings.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.facebook.react.devsupport - -import com.facebook.react.modules.debug.interfaces.DeveloperSettings -import com.mendix.mendixnative.activity.MendixReactActivity -import com.mendix.mendixnative.util.ReflectionUtils - -fun getDevInternalSettings(activity: MendixReactActivity): DeveloperSettings? = - (activity.currentDevSupportManager as? DevSupportManagerBase)?.let { - return ReflectionUtils.getField(it, "mDevSettings") - } diff --git a/android/src/main/java/com/facebook/react/devsupport/DevSupportManagerHelpers.kt b/android/src/main/java/com/facebook/react/devsupport/DevSupportManagerHelpers.kt deleted file mode 100644 index 7b3dcf4..0000000 --- a/android/src/main/java/com/facebook/react/devsupport/DevSupportManagerHelpers.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.facebook.react.devsupport - -import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener -import com.facebook.react.devsupport.interfaces.DevSupportManager -import com.mendix.mendixnative.util.ReflectionUtils - -fun setBundleDownloadListener( - devSupportManager: DevSupportManager?, - listener: DevBundleDownloadListener -) { - devSupportManager?.apply { - ReflectionUtils.setFieldOfSuperclass( - this, - listener, - "mBundleDownloadListener", - "devBundleDownloadListener" - ) - } -} - -fun overrideDevLoadingViewController( - devSupportManager: DevSupportManager, - devLoadingViewController: DefaultDevLoadingViewImplementation -) { - devSupportManager.apply { - ReflectionUtils.setFieldOfSuperclass( - this, - devLoadingViewController, - "mDevLoadingViewManager", - "devLoadingViewManager" - ) - } -} diff --git a/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt b/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt index c4db2f3..53274b6 100644 --- a/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt +++ b/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt @@ -21,7 +21,7 @@ import com.mendix.mendixnative.react.clearCachedReactNativeDevBundle import com.mendix.mendixnative.react.clearData import com.mendix.mendixnative.react.closeSqlDatabaseConnection import com.mendix.mendixnative.react.toggleElementInspector -import com.mendixnative.MendixNativeModule +import com.mendix.mendixnative.react.NativeReloadHandler class MendixInitializer( private val context: Activity, @@ -70,7 +70,9 @@ class MendixInitializer( devMenuTouchEventHandler = DevMenuTouchEventHandler(object : DevMenuTouchEventHandler.DevMenuTouchListener { override fun onTap() { - reactNativeHost.typeSafeNativeModule()?.reloadClientWithState() + reactNativeHost.reactApplicationContext()?.let { + NativeReloadHandler(it).reload() + } } override fun onLongPress() { diff --git a/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt b/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt index 9670f69..37b6a1b 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt @@ -88,30 +88,63 @@ fun clearDataWithReactContext(applicationContext: Application, reactNativeHost: } fun deleteAppDatabaseAsync(reactContext: ReactContext?, cb: BooleanCallback) { - reactContext?.typeSafeNativeModule()?.let { - it.deleteAllDBs() - cb(true) - } ?: cb(false) + val opSQLiteModule = reactContext?.getNativeModule(OPSQLiteModule::class.java) + if (opSQLiteModule != null) { + try { + opSQLiteModule.deleteAllDBs() + cb(true) + } catch (e: Exception) { + Log.e("ClearData", "Failed to delete databases: ${e.message}") + cb(false) + } + } else { + cb(false) + } } +/** + * Clears all AsyncStorage data. + * + * Note: Previous implementation only checked module availability without clearing. + * This now actually clears the storage using AsyncStorageModule.clear(). + */ fun clearAsyncStorage(reactNativeHost: ReactNativeHost): Boolean { - val module = reactNativeHost.typeSafeNativeModule() - if (module != null) { - return true - } else { - return false + val asyncStorageModule = reactNativeHost.reactContext()?.getNativeModule(AsyncStorageModule::class.java) + if (asyncStorageModule != null) { + try { + // Clear AsyncStorage synchronously - clear() expects a callback but we're using fire-and-forget + asyncStorageModule.clear { error -> + if (error != null) { + Log.e("ClearData", "AsyncStorage clear error: $error") + } + } + return true + } catch (e: Exception) { + Log.e("ClearData", "Failed to clear AsyncStorage: ${e.message}") + return false + } } + return false } fun clearSecureStorage(context: Context?): Boolean = context?.let { MendixEncryptedStorage.getMendixEncryptedStorage(it).clear() } ?: false -fun clearCookiesAsync(reactContext: ReactContext?, cb: (success: Boolean) -> Unit) = - reactContext?.typeSafeNativeModule()?.let { module -> - module.clearCookies { - cb(it[0] as Boolean) +fun clearCookiesAsync(reactContext: ReactContext?, cb: (success: Boolean) -> Unit) { + val networkingModule = reactContext?.getNativeModule(NetworkingModule::class.java) + if (networkingModule != null) { + try { + networkingModule.clearCookies { result -> + cb(result[0] as Boolean) + } + } catch (e: Exception) { + Log.e("ClearData", "Failed to clear cookies: ${e.message}") + cb(false) } - } ?: cb(false) + } else { + cb(false) + } +} fun clearCachedReactNativeDevBundle(applicationContext: Application) { try { diff --git a/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt b/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt index 775d252..2159c20 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt @@ -1,8 +1,21 @@ package com.mendix.mendixnative.react +import android.util.Log import com.facebook.react.bridge.ReactContext import com.op.sqlite.OPSQLiteModule +/** + * Closes all SQLite database connections. + * + * This is called during app shutdown to gracefully close database connections. + */ fun closeSqlDatabaseConnection(reactContext: ReactContext?) { - reactContext?.typeSafeNativeModule()?.closeAllConnections() + val opSQLiteModule = reactContext?.getNativeModule(OPSQLiteModule::class.java) + if (opSQLiteModule != null) { + try { + opSQLiteModule.closeAllConnections() + } catch (e: Exception) { + Log.e("CloseApp", "Failed to close database connections: ${e.message}") + } + } } diff --git a/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt b/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt index 3eca055..515ec0d 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt @@ -3,16 +3,22 @@ package com.mendix.mendixnative.react import com.facebook.common.logging.FLog import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReadableArray -import com.facebook.react.bridge.WritableMap -import com.facebook.react.bridge.WritableNativeMap import com.facebook.react.modules.core.ExceptionsManagerModule +/** + * Handles JavaScript exceptions by reporting them to React Native's ExceptionsManager. + * + * This bridges JavaScript errors to the native exception handling system. + */ class NativeErrorHandler(val reactContext: ReactApplicationContext) { fun handle(message: String?, stackTrace: ReadableArray?) { - reactContext.typeSafeNativeModule()?.reportSoftException(message, stackTrace, 0.0) - // updateExceptionMessage is not available in RN 0.77.1 + // Use typed module access instead of generic typeSafeNativeModule + val exceptionsManagerModule = reactContext.getNativeModule(ExceptionsManagerModule::class.java) + exceptionsManagerModule?.reportSoftException(message, stackTrace, 0.0) + + // Note: updateExceptionMessage is not available in RN 0.77.1+ // ref: https://github.com/facebook/react-native/commit/4f47439a02183205ff6f68b1fc3bc392e78e4cb4 - // exceptionsManagerModule.updateExceptionMessage(message, stackTrace, 0); + FLog.e(javaClass, "Received JS exception: $message") } } diff --git a/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt b/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt index 84300cc..5d522e8 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt @@ -30,7 +30,7 @@ class NativeFsModule(private val reactContext: ReactApplicationContext) { fun save(blob: ReadableMap, filePath: String, promise: Promise) { val blobModule = reactContext.getNativeModule(BlobModule::class.java) - val blobId: String = blob.getString("blobId") ?: run {"" + val blobId: String = blob.getString("blobId") ?: run { promise.reject(ERROR_INVALID_BLOB, "The specified blob is invalid") return } diff --git a/android/src/main/java/com/mendix/mendixnative/util/ReflectionUtils.java b/android/src/main/java/com/mendix/mendixnative/util/ReflectionUtils.java index 4627e25..b1fbc0f 100644 --- a/android/src/main/java/com/mendix/mendixnative/util/ReflectionUtils.java +++ b/android/src/main/java/com/mendix/mendixnative/util/ReflectionUtils.java @@ -1,10 +1,16 @@ package com.mendix.mendixnative.util; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +/** + * Minimal reflection utilities for accessing React Native private fields. + * + * **Usage:** Only used by MendixShakeDetector to swap React Native's shake detector. + * There is no public React Native API for this functionality. + * + * **Note:** Reflection should be avoided where possible. This class is kept minimal + * and only exposes methods that are actively used. + */ public class ReflectionUtils { private static Field findDeclaredField(Class objectClass, String... fieldNames) { NoSuchFieldException lastException = null; @@ -20,95 +26,27 @@ private static Field findDeclaredField(Class objectClass, String... fieldName throw new RuntimeException(lastException); } - public static ConstructorWrapper findConstructor(String className, Class... parameterTypes) { - try { - Constructor constructor = Class.forName(className).getDeclaredConstructor(parameterTypes); - constructor.setAccessible(true); - return new ConstructorWrapper(constructor); - } catch (ClassNotFoundException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - // TODO: replace this with a lambda after upgrading to Java 8 - public static class ConstructorWrapper { - private final Constructor constructor; - - ConstructorWrapper(Constructor constructor) { - this.constructor = constructor; - } - - public T newInstance(Object... args) { - try { - return (T) constructor.newInstance(args); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - } - - public static MethodWrapper findMethod(Object object, String methodName, Class... parameterTypes) { - try { - Method method = object.getClass().getDeclaredMethod(methodName, parameterTypes); - method.setAccessible(true); - return new MethodWrapper(method, object); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - // TODO: replace this with a lambda after upgrading to Java 8 - public static class MethodWrapper { - private final Method method; - private final Object object; - - MethodWrapper(Method method, Object object) { - this.method = method; - this.object = object; - } - - public void invoke(Object... args) { - try { - method.invoke(object, args); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - } - - public static void setFieldOfSuperclass(Object object, String fieldName, Object value) { - setFieldOfSuperclass(object, value, fieldName); - } - + /** + * Sets a field on the superclass of the given object. + * Tries multiple field names to handle React Native version differences. + * + * @param object The object whose superclass field should be set + * @param value The value to set + * @param fieldNames Field names to try (in order of preference) + */ public static void setFieldOfSuperclass(Object object, Object value, String... fieldNames) { Field field = findDeclaredField(object.getClass().getSuperclass(), fieldNames); setField(object, field, value); } - public static void setField(Object object, String fieldName, Object value) { - try { - Field field = object.getClass().getDeclaredField(fieldName); - setField(object, field, value); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - } - - private static void setField(Object object, Field field, Object value) { - try { - field.setAccessible(true); - field.set(object, value); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } finally { - field.setAccessible(false); - } - } - - public static T getFieldOfSuperclass(Object object, String fieldName) { - return getFieldOfSuperclass(object, new String[] { fieldName }); - } - + /** + * Gets a field from the superclass of the given object. + * Tries multiple field names to handle React Native version differences. + * + * @param object The object whose superclass field should be retrieved + * @param fieldNames Field names to try (in order of preference) + * @return The field value + */ public static T getFieldOfSuperclass(Object object, String... fieldNames) { try { Field field = findDeclaredField(object.getClass().getSuperclass(), fieldNames); @@ -119,14 +57,14 @@ public static T getFieldOfSuperclass(Object object, String... fieldNames) { } } - public static T getField(Object object, String fieldName) { + private static void setField(Object object, Field field, Object value) { try { - Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); - return (T) field.get(object); - } catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) { + field.set(object, value); + } catch (IllegalAccessException e) { throw new RuntimeException(e); + } finally { + field.setAccessible(false); } } - } diff --git a/android/src/main/java/com/mendixnative/MendixNativeModule.kt b/android/src/main/java/com/mendixnative/MendixNativeModule.kt deleted file mode 100644 index c050cd5..0000000 --- a/android/src/main/java/com/mendixnative/MendixNativeModule.kt +++ /dev/null @@ -1,183 +0,0 @@ -package com.mendixnative - -import com.facebook.react.bridge.Promise -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.bridge.ReadableArray -import com.facebook.react.bridge.ReadableMap -import com.facebook.react.bridge.WritableMap -import com.facebook.react.module.annotations.ReactModule -import com.mendix.mendixnative.encryption.MendixEncryptedStorageModule -import com.mendix.mendixnative.react.MxConfiguration -import com.mendix.mendixnative.react.NativeErrorHandler -import com.mendix.mendixnative.react.NativeReloadHandler -import com.mendix.mendixnative.react.NavigationModeModule -import com.mendix.mendixnative.react.cookie.NativeCookieModule -import com.mendix.mendixnative.react.download.NativeDownloadModule -import com.mendix.mendixnative.react.fs.NativeFsModule -import com.mendix.mendixnative.react.ota.NativeOtaModule -import com.mendix.mendixnative.react.splash.MendixSplashScreenModule -import com.mendix.mendixnative.react.splash.MendixSplashScreenPresenter - -@ReactModule(name = MendixNativeModule.NAME) -class MendixNativeModule(reactContext: ReactApplicationContext) : NativeMendixNativeSpec(reactContext) { - - var presenter: MendixSplashScreenPresenter? = null - - override fun getName(): String { - return NAME - } - - override fun encryptedStorageSetItem(key: String, value: String, promise: Promise) { - MendixEncryptedStorageModule(reactApplicationContext).setItem(key, value, promise) - } - - override fun encryptedStorageGetItem(key: String, promise: Promise) { - MendixEncryptedStorageModule(reactApplicationContext).getItem(key, promise) - } - - override fun encryptedStorageRemoveItem(key: String, promise: Promise) { - MendixEncryptedStorageModule(reactApplicationContext).removeItem(key, promise) - } - - override fun encryptedStorageClear(promise: Promise) { - MendixEncryptedStorageModule(reactApplicationContext).clear(promise) - } - - override fun encryptedStorageIsEncrypted(): Boolean { - return MendixEncryptedStorageModule(reactApplicationContext).isEncrypted - } - - override fun splashScreenShow() { - MendixSplashScreenModule(reactApplicationContext).show(presenter) - } - - override fun splashScreenHide() { - MendixSplashScreenModule(reactApplicationContext).hide(presenter) - } - - override fun cookieClearAll(promise: Promise) { - NativeCookieModule(reactApplicationContext).clearAll(promise) - } - - override fun reloadHandlerReload(promise: Promise) { - NativeReloadHandler(reactApplicationContext).reload() - promise.resolve(null) - } - - fun reloadClientWithState() { - emitOnReloadWithState() - } - - override fun reloadHandlerExitApp(promise: Promise) { - NativeReloadHandler(reactApplicationContext).exitApp() - promise.resolve(null) - } - - override fun downloadHandlerDownload( - url: String, - downloadPath: String, - config: ReadableMap, - promise: Promise - ) { - NativeDownloadModule(reactApplicationContext).download( - url, downloadPath, config, promise - ) - } - - override fun mxConfigurationGetConfig(): WritableMap? { - return MxConfiguration(reactApplicationContext).getConstants() - } - - override fun otaDownload( - config: ReadableMap, - promise: Promise - ) { - NativeOtaModule(reactApplicationContext).download(config, promise) - } - - override fun otaDeploy( - config: ReadableMap, - promise: Promise - ) { - NativeOtaModule(reactApplicationContext).deploy(config, promise) - } - - override fun fsSetEncryptionEnabled(enabled: Boolean) { - NativeFsModule(reactApplicationContext).setEncryptionEnabled(enabled) - } - - override fun fsSave( - blob: ReadableMap, - filePath: String, - promise: Promise - ) { - NativeFsModule(reactApplicationContext).save(blob, filePath, promise) - } - - override fun fsRead(filePath: String, promise: Promise) { - NativeFsModule(reactApplicationContext).read(filePath, promise) - } - - override fun fsMove( - filePath: String, - newPath: String, - promise: Promise - ) { - NativeFsModule(reactApplicationContext).move(filePath, newPath, promise) - } - - override fun fsRemove(filePath: String, promise: Promise) { - NativeFsModule(reactApplicationContext).remove(filePath, promise) - } - - override fun fsList(dirPath: String, promise: Promise) { - NativeFsModule(reactApplicationContext).list(dirPath, promise) - } - - override fun fsReadAsDataURL( - filePath: String, - promise: Promise - ) { - NativeFsModule(reactApplicationContext).readAsDataURL(filePath, promise) - } - - override fun fsReadAsText(filePath: String, promise: Promise) { - NativeFsModule(reactApplicationContext).readAsText(filePath, promise) - } - - override fun fsFileExists(filePath: String, promise: Promise) { - NativeFsModule(reactApplicationContext).fileExists(filePath, promise) - } - - override fun fsWriteJson( - data: ReadableMap, - filepath: String, - promise: Promise - ) { - NativeFsModule(reactApplicationContext).writeJson(data, filepath, promise) - } - - override fun fsReadJson(filepath: String, promise: Promise) { - NativeFsModule(reactApplicationContext).readJson(filepath, promise) - } - - override fun fsConstants(): WritableMap? { - return NativeFsModule(reactApplicationContext).getConstants() - } - - override fun errorHandlerHandle(message: String, stackTrace: ReadableArray) { - NativeErrorHandler(reactApplicationContext).handle(message, stackTrace) - } - - override fun navigationModeIsNavigationBarActive(): Boolean { - return NavigationModeModule(reactApplicationContext).isNavigationBarActive() - } - - override fun navigationModeGetNavigationBarHeight(): Double { - return NavigationModeModule(reactApplicationContext).getNavigationBarHeight() - } - - companion object { - const val NAME = "MendixNative" - } -} diff --git a/android/src/main/java/com/mendixnative/MendixNativePackage.kt b/android/src/main/java/com/mendixnative/MendixNativePackage.kt index 882a1d6..e70de7b 100644 --- a/android/src/main/java/com/mendixnative/MendixNativePackage.kt +++ b/android/src/main/java/com/mendixnative/MendixNativePackage.kt @@ -6,6 +6,17 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.module.model.ReactModuleInfo import com.facebook.react.module.model.ReactModuleInfoProvider import com.mendix.mendixnative.react.splash.MendixSplashScreenPresenter +import com.mendixnative.configuration.MxConfigurationModule +import com.mendixnative.cookie.MxCookieModule +import com.mendixnative.download.MxDownloadModule +import com.mendixnative.encryption.MxEncryptionModule +import com.mendixnative.error.MxErrorModule +import com.mendixnative.fs.MxFileSystemModule +import com.mendixnative.navigation.MxNavigationModule +import com.mendixnative.ota.MxOtaModule +import com.mendixnative.reload.MxReloadModule +import com.mendixnative.splash.MxSplashScreenModule +import com.mendixnative.storage.MxStorageModule import java.util.HashMap class MendixNativePackage : BaseReactPackage() { @@ -13,26 +24,51 @@ class MendixNativePackage : BaseReactPackage() { var splashScreenPresenter: MendixSplashScreenPresenter? = null override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? { - return if (name == MendixNativeModule.NAME) { - val module = MendixNativeModule(reactContext) - module.presenter = splashScreenPresenter - return module - } else { - null + return when (name) { + MxEncryptionModule.NAME -> MxEncryptionModule(reactContext) + MxSplashScreenModule.NAME -> { + val module = MxSplashScreenModule(reactContext) + module.presenter = splashScreenPresenter + module + } + MxFileSystemModule.NAME -> MxFileSystemModule(reactContext) + MxStorageModule.NAME -> MxStorageModule(reactContext) + MxOtaModule.NAME -> MxOtaModule(reactContext) + MxDownloadModule.NAME -> MxDownloadModule(reactContext) + MxReloadModule.NAME -> MxReloadModule(reactContext) + MxConfigurationModule.NAME -> MxConfigurationModule(reactContext) + MxCookieModule.NAME -> MxCookieModule(reactContext) + MxErrorModule.NAME -> MxErrorModule(reactContext) + MxNavigationModule.NAME -> MxNavigationModule(reactContext) + else -> null } } override fun getReactModuleInfoProvider(): ReactModuleInfoProvider { return ReactModuleInfoProvider { val moduleInfos: MutableMap = HashMap() - moduleInfos[MendixNativeModule.NAME] = ReactModuleInfo( - MendixNativeModule.NAME, - MendixNativeModule.NAME, - false, // canOverrideExistingModule - false, // needsEagerInit - false, // isCxxModule - true // isTurboModule - ) + listOf( + MxEncryptionModule.NAME, + MxSplashScreenModule.NAME, + MxFileSystemModule.NAME, + MxStorageModule.NAME, + MxOtaModule.NAME, + MxDownloadModule.NAME, + MxReloadModule.NAME, + MxConfigurationModule.NAME, + MxCookieModule.NAME, + MxErrorModule.NAME, + MxNavigationModule.NAME + ).forEach { + moduleInfos[it] = ReactModuleInfo( + name = it, + className = it, + canOverrideExistingModule = false, + needsEagerInit = false, + isCxxModule = false, + isTurboModule = true + ) + } moduleInfos } } diff --git a/android/src/main/java/com/mendixnative/configuration/MxConfigurationModule.kt b/android/src/main/java/com/mendixnative/configuration/MxConfigurationModule.kt new file mode 100644 index 0000000..8af3df0 --- /dev/null +++ b/android/src/main/java/com/mendixnative/configuration/MxConfigurationModule.kt @@ -0,0 +1,24 @@ +package com.mendixnative.configuration + +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.WritableMap +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.MxConfiguration +import com.mendixnative.NativeMxConfigurationSpec + +@ReactModule(name = MxConfigurationModule.NAME) +class MxConfigurationModule(reactContext: ReactApplicationContext) : + NativeMxConfigurationSpec(reactContext) { + + private val configuration = MxConfiguration(reactContext) + + override fun getName(): String = NAME + + override fun getConfig(): WritableMap? { + return configuration.getConstants() + } + + companion object { + const val NAME = "MxConfiguration" + } +} diff --git a/android/src/main/java/com/mendixnative/cookie/MxCookieModule.kt b/android/src/main/java/com/mendixnative/cookie/MxCookieModule.kt new file mode 100644 index 0000000..edcb843 --- /dev/null +++ b/android/src/main/java/com/mendixnative/cookie/MxCookieModule.kt @@ -0,0 +1,24 @@ +package com.mendixnative.cookie + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.cookie.NativeCookieModule +import com.mendixnative.NativeMxCookieSpec + +@ReactModule(name = MxCookieModule.NAME) +class MxCookieModule(reactContext: ReactApplicationContext) : + NativeMxCookieSpec(reactContext) { + + private val cookieModule = NativeCookieModule(reactContext) + + override fun getName(): String = NAME + + override fun clearAll(promise: Promise) { + cookieModule.clearAll(promise) + } + + companion object { + const val NAME = "MxCookie" + } +} diff --git a/android/src/main/java/com/mendixnative/download/MxDownloadModule.kt b/android/src/main/java/com/mendixnative/download/MxDownloadModule.kt new file mode 100644 index 0000000..843f0ad --- /dev/null +++ b/android/src/main/java/com/mendixnative/download/MxDownloadModule.kt @@ -0,0 +1,25 @@ +package com.mendixnative.download + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.download.NativeDownloadModule +import com.mendixnative.NativeMxDownloadSpec + +@ReactModule(name = MxDownloadModule.NAME) +class MxDownloadModule(reactContext: ReactApplicationContext) : + NativeMxDownloadSpec(reactContext) { + + private val downloadModule = NativeDownloadModule(reactContext) + + override fun getName(): String = NAME + + override fun download(url: String, downloadPath: String, config: ReadableMap, promise: Promise) { + downloadModule.download(url, downloadPath, config, promise) + } + + companion object { + const val NAME = "MxDownload" + } +} diff --git a/android/src/main/java/com/mendixnative/encryption/MxEncryptionModule.kt b/android/src/main/java/com/mendixnative/encryption/MxEncryptionModule.kt new file mode 100644 index 0000000..9c4f9e7 --- /dev/null +++ b/android/src/main/java/com/mendixnative/encryption/MxEncryptionModule.kt @@ -0,0 +1,40 @@ +package com.mendixnative.encryption + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.encryption.MendixEncryptedStorageModule +import com.mendixnative.NativeMxEncryptionSpec + +@ReactModule(name = MxEncryptionModule.NAME) +class MxEncryptionModule(reactContext: ReactApplicationContext) : + NativeMxEncryptionSpec(reactContext) { + + private val encryptedStorage = MendixEncryptedStorageModule(reactContext) + + override fun getName(): String = NAME + + override fun setItem(key: String, value: String, promise: Promise) { + encryptedStorage.setItem(key, value, promise) + } + + override fun getItem(key: String, promise: Promise) { + encryptedStorage.getItem(key, promise) + } + + override fun removeItem(key: String, promise: Promise) { + encryptedStorage.removeItem(key, promise) + } + + override fun clear(promise: Promise) { + encryptedStorage.clear(promise) + } + + override fun isEncrypted(): Boolean { + return encryptedStorage.isEncrypted + } + + companion object { + const val NAME = "MxEncryption" + } +} diff --git a/android/src/main/java/com/mendixnative/error/MxErrorModule.kt b/android/src/main/java/com/mendixnative/error/MxErrorModule.kt new file mode 100644 index 0000000..0e0703c --- /dev/null +++ b/android/src/main/java/com/mendixnative/error/MxErrorModule.kt @@ -0,0 +1,24 @@ +package com.mendixnative.error + +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReadableArray +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.NativeErrorHandler +import com.mendixnative.NativeMxErrorSpec + +@ReactModule(name = MxErrorModule.NAME) +class MxErrorModule(reactContext: ReactApplicationContext) : + NativeMxErrorSpec(reactContext) { + + private val errorHandler = NativeErrorHandler(reactContext) + + override fun getName(): String = NAME + + override fun handle(message: String, stackTrace: ReadableArray) { + errorHandler.handle(message, stackTrace) + } + + companion object { + const val NAME = "MxError" + } +} diff --git a/android/src/main/java/com/mendixnative/fs/MxFileSystemModule.kt b/android/src/main/java/com/mendixnative/fs/MxFileSystemModule.kt new file mode 100644 index 0000000..2bef53e --- /dev/null +++ b/android/src/main/java/com/mendixnative/fs/MxFileSystemModule.kt @@ -0,0 +1,70 @@ +package com.mendixnative.fs + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.WritableMap +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.fs.NativeFsModule +import com.mendixnative.NativeMxFileSystemSpec + +@ReactModule(name = MxFileSystemModule.NAME) +class MxFileSystemModule(reactContext: ReactApplicationContext) : + NativeMxFileSystemSpec(reactContext) { + + private val fsModule = NativeFsModule(reactContext) + + override fun getName(): String = NAME + + override fun constants(): WritableMap? { + return fsModule.getConstants() + } + + override fun save(blob: ReadableMap, filePath: String, promise: Promise) { + fsModule.save(blob, filePath, promise) + } + + override fun read(filePath: String, promise: Promise) { + fsModule.read(filePath, promise) + } + + override fun move(filePath: String, newPath: String, promise: Promise) { + fsModule.move(filePath, newPath, promise) + } + + override fun remove(filePath: String, promise: Promise) { + fsModule.remove(filePath, promise) + } + + override fun list(dirPath: String, promise: Promise) { + fsModule.list(dirPath, promise) + } + + override fun readAsDataURL(filePath: String, promise: Promise) { + fsModule.readAsDataURL(filePath, promise) + } + + override fun readAsText(filePath: String, promise: Promise) { + fsModule.readAsText(filePath, promise) + } + + override fun fileExists(filePath: String, promise: Promise) { + fsModule.fileExists(filePath, promise) + } + + override fun writeJson(data: ReadableMap, filepath: String, promise: Promise) { + fsModule.writeJson(data, filepath, promise) + } + + override fun readJson(filepath: String, promise: Promise) { + fsModule.readJson(filepath, promise) + } + + override fun setEncryptionEnabled(enabled: Boolean) { + fsModule.setEncryptionEnabled(enabled) + } + + companion object { + const val NAME = "MxFileSystem" + } +} diff --git a/android/src/main/java/com/mendixnative/navigation/MxNavigationModule.kt b/android/src/main/java/com/mendixnative/navigation/MxNavigationModule.kt new file mode 100644 index 0000000..fb52f19 --- /dev/null +++ b/android/src/main/java/com/mendixnative/navigation/MxNavigationModule.kt @@ -0,0 +1,27 @@ +package com.mendixnative.navigation + +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.NavigationModeModule +import com.mendixnative.NativeMxNavigationSpec + +@ReactModule(name = MxNavigationModule.NAME) +class MxNavigationModule(reactContext: ReactApplicationContext) : + NativeMxNavigationSpec(reactContext) { + + private val navigationMode = NavigationModeModule(reactContext) + + override fun getName(): String = NAME + + override fun isNavigationBarActive(): Boolean { + return navigationMode.isNavigationBarActive() + } + + override fun getNavigationBarHeight(): Double { + return navigationMode.getNavigationBarHeight() + } + + companion object { + const val NAME = "MxNavigation" + } +} diff --git a/android/src/main/java/com/mendixnative/ota/MxOtaModule.kt b/android/src/main/java/com/mendixnative/ota/MxOtaModule.kt new file mode 100644 index 0000000..8ff1258 --- /dev/null +++ b/android/src/main/java/com/mendixnative/ota/MxOtaModule.kt @@ -0,0 +1,29 @@ +package com.mendixnative.ota + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.ota.NativeOtaModule +import com.mendixnative.NativeMxOtaSpec + +@ReactModule(name = MxOtaModule.NAME) +class MxOtaModule(reactContext: ReactApplicationContext) : + NativeMxOtaSpec(reactContext) { + + private val otaModule = NativeOtaModule(reactContext) + + override fun getName(): String = NAME + + override fun download(config: ReadableMap, promise: Promise) { + otaModule.download(config, promise) + } + + override fun deploy(config: ReadableMap, promise: Promise) { + otaModule.deploy(config, promise) + } + + companion object { + const val NAME = "MxOta" + } +} diff --git a/android/src/main/java/com/mendixnative/reload/MxReloadModule.kt b/android/src/main/java/com/mendixnative/reload/MxReloadModule.kt new file mode 100644 index 0000000..dd6e66d --- /dev/null +++ b/android/src/main/java/com/mendixnative/reload/MxReloadModule.kt @@ -0,0 +1,30 @@ +package com.mendixnative.reload + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.NativeReloadHandler +import com.mendixnative.NativeMxReloadSpec + +@ReactModule(name = MxReloadModule.NAME) +class MxReloadModule(reactContext: ReactApplicationContext) : + NativeMxReloadSpec(reactContext) { + + private val reloadHandler = NativeReloadHandler(reactContext) + + override fun getName(): String = NAME + + override fun reload(promise: Promise) { + reloadHandler.reload() + promise.resolve(null) + } + + override fun exitApp(promise: Promise) { + reloadHandler.exitApp() + promise.resolve(null) + } + + companion object { + const val NAME = "MxReload" + } +} diff --git a/android/src/main/java/com/mendixnative/splash/MxSplashScreenModule.kt b/android/src/main/java/com/mendixnative/splash/MxSplashScreenModule.kt new file mode 100644 index 0000000..86eb385 --- /dev/null +++ b/android/src/main/java/com/mendixnative/splash/MxSplashScreenModule.kt @@ -0,0 +1,31 @@ +package com.mendixnative.splash + +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.annotations.ReactModule +import com.mendix.mendixnative.react.splash.MendixSplashScreenModule +import com.mendix.mendixnative.react.splash.MendixSplashScreenPresenter +import com.mendixnative.NativeMxSplashScreenSpec + +@ReactModule(name = MxSplashScreenModule.NAME) +class MxSplashScreenModule(reactContext: ReactApplicationContext) : + NativeMxSplashScreenSpec(reactContext) { + + private val splashScreenModule = MendixSplashScreenModule(reactContext) + + // Presenter is injected by MendixNativePackage + var presenter: MendixSplashScreenPresenter? = null + + override fun getName(): String = NAME + + override fun show() { + splashScreenModule.show(presenter) + } + + override fun hide() { + splashScreenModule.hide(presenter) + } + + companion object { + const val NAME = "MxSplashScreen" + } +} diff --git a/android/src/main/java/com/mendixnative/storage/MxStorageModule.kt b/android/src/main/java/com/mendixnative/storage/MxStorageModule.kt new file mode 100644 index 0000000..b726c9c --- /dev/null +++ b/android/src/main/java/com/mendixnative/storage/MxStorageModule.kt @@ -0,0 +1,46 @@ +package com.mendixnative.storage + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.annotations.ReactModule +import com.mendixnative.NativeMxStorageSpec +import com.op.sqlite.OPSQLiteModule + +@ReactModule(name = MxStorageModule.NAME) +class MxStorageModule(reactContext: ReactApplicationContext) : + NativeMxStorageSpec(reactContext) { + + override fun getName(): String = NAME + + override fun clearDatabases(promise: Promise) { + val opSQLiteModule = reactApplicationContext.getNativeModule(OPSQLiteModule::class.java) + if (opSQLiteModule != null) { + try { + opSQLiteModule.deleteAllDBs() + promise.resolve(null) + } catch (e: Exception) { + promise.reject("STORAGE_CLEAR_FAILED", "Failed to clear databases: ${e.message}", e) + } + } else { + promise.reject("MODULE_NOT_FOUND", "OPSQLiteModule not available") + } + } + + override fun closeDatabaseConnections(promise: Promise) { + val opSQLiteModule = reactApplicationContext.getNativeModule(OPSQLiteModule::class.java) + if (opSQLiteModule != null) { + try { + opSQLiteModule.closeAllConnections() + promise.resolve(null) + } catch (e: Exception) { + promise.reject("STORAGE_CLOSE_FAILED", "Failed to close database connections: ${e.message}", e) + } + } else { + promise.reject("MODULE_NOT_FOUND", "OPSQLiteModule not available") + } + } + + companion object { + const val NAME = "MxStorage" + } +} diff --git a/example/__tests__/splash-screen.harness.ts b/example/__tests__/splash-screen.harness.ts index 85dc188..9846f2f 100644 --- a/example/__tests__/splash-screen.harness.ts +++ b/example/__tests__/splash-screen.harness.ts @@ -1,5 +1,5 @@ import { describe, test, expect } from 'react-native-harness'; -import { MendixSplashScreen } from 'mendix-native'; +import { MxSplashScreen as MendixSplashScreen } from 'mendix-native'; describe('MendixSplashScreen', () => { describe('API surface', () => { diff --git a/example/ios/MendixNativeExample.xcodeproj/xcshareddata/xcschemes/MendixNativeExample.xcscheme b/example/ios/MendixNativeExample.xcodeproj/xcshareddata/xcschemes/MendixNativeExample.xcscheme index dc9a1e7..c12b556 100644 --- a/example/ios/MendixNativeExample.xcodeproj/xcshareddata/xcschemes/MendixNativeExample.xcscheme +++ b/example/ios/MendixNativeExample.xcodeproj/xcshareddata/xcschemes/MendixNativeExample.xcscheme @@ -60,6 +60,13 @@ ReferencedContainer = "container:MendixNativeExample.xcodeproj"> + + + + Bool { - - SessionCookieStore.restore() setUpProvider() - - guard let bundleUrl = bundleURL() else { - let message = "No script URL provided. Make sure the metro packager is running or you have embedded a JS bundle in your application bundle." - NativeErrorHandler().handle(message: message, stackTrace: []) - return false - } - - ReactNative.shared.setup( - MendixApp.init( - identifier: nil, - bundleUrl: bundleUrl, - runtimeUrl: URL(string: "http://localhost:8081")!, - warningsFilter: .none, - isDeveloperApp: false, - clearDataAtLaunch: false, - splashScreenPresenter: nil, - reactLoading: nil, - enableThreeFingerGestures: false - ), - launchOptions: launchOptions + let mendixApp = MendixApp.init( + identifier: nil, + bundleUrl: bundleUrl, + runtimeUrl: URL(string: "http://localhost:8081")!, + warningsFilter: .none, + isDeveloperApp: false, + clearDataAtLaunch: false, + splashScreenPresenter: nil, + reactLoading: nil, + enableThreeFingerGestures: false ) + ReactNative.shared.setup(mendixApp, launchOptions: nil) ReactNative.shared.start() return super.application(application, didFinishLaunchingWithOptions: launchOptions) } - func applicationDidEnterBackground(_ application: UIApplication) { - SessionCookieStore.persist() - } - - func applicationWillTerminate(_ application: UIApplication) { - SessionCookieStore.persist() - } - - override func sourceURL(for bridge: RCTBridge) -> URL? { - self.bundleURL() - } - - override func bundleURL() -> URL? { - #if DEBUG - RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") - #else - Bundle.main.url(forResource: "main", withExtension: "jsbundle") - #endif + var bundleUrl: URL { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")! +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle")! +#endif } } diff --git a/example/rn-harness.config.mjs b/example/rn-harness.config.mjs index 3190d96..ed8ecfe 100644 --- a/example/rn-harness.config.mjs +++ b/example/rn-harness.config.mjs @@ -20,12 +20,12 @@ const config = { runners: [ androidPlatform({ name: 'android', - device: androidEmulator('Pixel_API_35'), + device: androidEmulator('Pixel_6'), bundleId: 'mendixnative.example', }), applePlatform({ name: 'ios', - device: appleSimulator('iPhone 17', '26.2'), + device: appleSimulator('iPhone 17', '26.0'), bundleId: 'mendixnative.example', }), ], diff --git a/ios/MendixNative.h b/ios/MendixNative.h deleted file mode 100644 index 57f561f..0000000 --- a/ios/MendixNative.h +++ /dev/null @@ -1,8 +0,0 @@ -#import -#import -#import "RNCAsyncStorage.h" -#import "RCTAppDelegate.h" - -@interface MendixNative : NativeMendixNativeSpecBase -- (void)reloadClientWithState; -@end diff --git a/ios/MendixNative.mm b/ios/MendixNative.mm deleted file mode 100644 index 7907018..0000000 --- a/ios/MendixNative.mm +++ /dev/null @@ -1,153 +0,0 @@ -#import "MendixNative.h" -#import "MendixNative-Swift.h" - -@implementation MendixNative - -RCT_EXPORT_MODULE() - -- (std::shared_ptr)getTurboModule: -(const facebook::react::ObjCTurboModule::InitParams &)params -{ - return std::make_shared(params); -} - -- (void)encryptedStorageSetItem:(nonnull NSString *)key value:(nonnull NSString *)value resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; - [[[EncryptedStorage alloc] init] setItemWithKey:key value:value promise:promise]; -} - -- (void)encryptedStorageGetItem:(nonnull NSString *)key resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; - [[[EncryptedStorage alloc] init] getItemWithKey:key promise:promise]; -} - -- (void)encryptedStorageRemoveItem:(nonnull NSString *)key resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; - [[[EncryptedStorage alloc] init] removeItemWithKey:key promise:promise]; -} - -- (void)encryptedStorageClear:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; - [[[EncryptedStorage alloc] init] clearWithPromise:promise]; -} - -- (nonnull NSNumber *)encryptedStorageIsEncrypted { - return [NSNumber numberWithBool: [EncryptedStorage isEncrypted]]; -} - -- (void)splashScreenShow { - [[[MendixSplashScreen alloc] init] show]; -} - -- (void)splashScreenHide { - [[[MendixSplashScreen alloc] init] hide]; -} - -- (void)cookieClearAll:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [Promise instance:resolve reject:reject]; - [[[NativeCookieModule alloc] init] clearAll:promise]; -} - -- (void)reloadHandlerReload:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[ReloadHandler alloc] init] reload]; - resolve(nil); -} - -- (void)reloadClientWithState { - [self emitOnReloadWithState]; -} - -- (void)sendDownloadProgressEvent: (NSDictionary *) data { - [self emitOnDownloadProgress:data]; -} - -- (void)reloadHandlerExitApp:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[ReloadHandler alloc] init] exitApp]; - resolve(nil); -} - -- (void)downloadHandlerDownload:(nonnull NSString *)url downloadPath:(nonnull NSString *)downloadPath config:(nonnull NSDictionary *)config resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [Promise instance:resolve reject:reject]; - [[[NativeDownloadModule alloc] init] download:url downloadPath:downloadPath config:config onProgress:^(NSDictionary * _Nonnull data) { - [self emitOnDownloadProgress:data]; - } promise:promise]; -} - -- (nonnull NSDictionary *)mxConfigurationGetConfig { - return [[[MxConfiguration alloc] init] constants]; -} - -- (void)otaDeploy:(nonnull NSDictionary *)config resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [Promise instance:resolve reject:reject]; - [[[NativeOtaModule alloc] init] deploy:config promise:promise]; -} - -- (void)otaDownload:(nonnull NSDictionary *)config resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - Promise *promise = [Promise instance:resolve reject:reject]; - [[[NativeOtaModule alloc] init] download:config promise:promise]; -} - -- (void)fsSetEncryptionEnabled:(BOOL)enabled { - [[[NativeFsModule alloc] init] setEncryptionEnabled:enabled]; -} - -- (void)fsSave:(nonnull NSDictionary *)blob filePath:(nonnull NSString *)filePath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] save:blob filepath:filePath resolve:resolve reject:reject]; -} - -- (void)fsRead:(nonnull NSString *)filePath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] read:filePath resolve:resolve reject:reject]; -} - -- (void)fsMove:(nonnull NSString *)filePath newPath:(nonnull NSString *)newPath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] move:filePath newPath:newPath resolve:resolve reject:reject]; -} - -- (void)fsRemove:(nonnull NSString *)filePath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] remove:filePath resolve:resolve reject:reject]; -} - -- (void)fsList:(nonnull NSString *)dirPath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] list:dirPath resolve:resolve reject:reject]; -} - -- (void)fsReadAsDataURL:(nonnull NSString *)filePath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] readAsDataURL:filePath resolve:resolve reject:reject]; -} - -- (void)fsFileExists:(nonnull NSString *)filePath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] fileExists:filePath resolve:resolve reject:reject]; -} - -- (void)fsWriteJson:(nonnull NSDictionary *)data filepath:(nonnull NSString *)filepath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] writeJson:data filepath:filepath resolve:resolve reject:reject]; -} - - -- (void)fsReadJson:(nonnull NSString *)filepath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - [[[NativeFsModule alloc] init] readJson:filepath resolve:resolve reject:reject]; -} - -- (nonnull NSDictionary *)fsConstants { - return [[[NativeFsModule alloc] init] constants]; -} - -- (void)errorHandlerHandle:(nonnull NSString *)message stackTrace:(nonnull NSArray *)stackTrace { - [[[NativeErrorHandler alloc] init] handleWithMessage:message stackTrace:stackTrace]; -} - -- (void)fsReadAsText:(nonnull NSString *)filePath resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - reject(@"NOT_SPPORTED", @"Read as text is not supported on iOS", nil); -} - -- (nonnull NSNumber *)navigationModeGetNavigationBarHeight { - return [NSNumber numberWithBool:NO]; -} - - -- (nonnull NSNumber *)navigationModeIsNavigationBarActive { - return [NSNumber numberWithDouble:0.0]; -} - - -@end diff --git a/ios/Modules/Helper/DevHelper.swift b/ios/Modules/Helper/DevHelper.swift index 1878441..9931549 100644 --- a/ios/Modules/Helper/DevHelper.swift +++ b/ios/Modules/Helper/DevHelper.swift @@ -2,72 +2,43 @@ import Foundation import React public class DevHelper { - + public static func showAppMenu() { devMenu?.show() } - + public static func toggleElementInspector() { devSettings?.toggleElementInspector() } - + + // Modern Architecture: Access dev modules through ReactAppProvider's moduleRegistry + // Works with RN 0.83+ where RCTBridge.current() returns nil public static var devSettings: RCTDevSettings? { return ReactAppProvider.getModule(type: RCTDevSettings.self) } - + public static var devMenu: RCTDevMenu? { return ReactAppProvider.getModule(type: RCTDevMenu.self) } - + public static func setDebugMode(enabled: Bool) { AppPreferences.remoteDebuggingEnabled = enabled - // RN <= 0.82 exposed isDebuggingRemotely on RCTDevSettings. - // RN 0.83+ removed that toggle and moved to on-device debugging tooling. - if let devSettings, - devSettings.responds(to: NSSelectorFromString("setIsDebuggingRemotely:")) { - devSettings.setValue(enabled, forKey: "isDebuggingRemotely") - return - } - - if enabled { - openDebuggerIfAvailable() - } else { - disableDebuggerIfAvailable() - } + // Modern Architecture (RN 0.83+): + // Debug operations are controlled from JavaScript via the DevSettings TurboModule. + // Native code no longer needs to control debugging - it's all JavaScript-driven. + // + // To open the debugger from JavaScript: + // import { DevSettings } from 'mendix-native'; + // DevSettings.openDebugger(); + // + // This method now only stores the preference. Actual debug control is via JavaScript. } - private static func openDebuggerIfAvailable() { - guard let bundleURL = ReactNative.shared.bundleURL(), - let inspectorHelperClass = NSClassFromString("RCTInspectorDevServerHelper") as? NSObject.Type else { - return - } - - let selector = NSSelectorFromString("openDebugger:withErrorMessage:") - if inspectorHelperClass.responds(to: selector) { - _ = inspectorHelperClass.perform( - selector, - with: bundleURL, - with: "Failed to open debugger. Please check that the dev server is running and reload the app." - ) - } - } - - private static func disableDebuggerIfAvailable() { - guard let inspectorHelperClass = NSClassFromString("RCTInspectorDevServerHelper") as? NSObject.Type else { - return - } - - let selector = NSSelectorFromString("disableDebugger") - if inspectorHelperClass.responds(to: selector) { - _ = inspectorHelperClass.perform(selector) - } - } - public static func hideDevLoadingView() { devLoadingView?.hide() } - + public static var devLoadingView: RCTDevLoadingView? { return ReactAppProvider.getModule(type: RCTDevLoadingView.self) } diff --git a/ios/Modules/Helper/ReactAppProvider.swift b/ios/Modules/Helper/ReactAppProvider.swift index 6d70941..17bc7a1 100644 --- a/ios/Modules/Helper/ReactAppProvider.swift +++ b/ios/Modules/Helper/ReactAppProvider.swift @@ -37,12 +37,12 @@ open class ReactAppProvider: RCTDefaultReactNativeFactoryDelegate, UIApplication open override func sourceURL(for bridge: RCTBridge) -> URL? { return self.bundleURL() } - + public func setReactViewController(_ controller: UIViewController) { controller.view = reactAppView() changeRoot(to: controller) } - + public func reactAppView() -> UIView? { guard let view = reactNativeFactory?.rootViewFactory.view(withModuleName: reactRootViewName) else { return nil @@ -51,40 +51,41 @@ open class ReactAppProvider: RCTDefaultReactNativeFactoryDelegate, UIApplication view.frame = window?.rootViewController?.view.frame ?? .zero return view } - + public func startReactApp() { - + } - + public func stopReactApp() { } - + public static func shared() -> ReactAppProvider? { return UIApplication.shared.delegate as? ReactAppProvider } - - public static func isReactAppActive() -> Bool { - return unsafeBridge != nil - } - + public func changeRoot(to controller: UIViewController) { window?.rootViewController = controller window?.makeKeyAndVisible() } - + public var rootView: UIView? { return window?.rootViewController?.view } - + + // Check if React Native app is active and running + public static func isReactAppActive() -> Bool { + return RCTBridge.current() != nil + } + + // Dev-only module access (RCTDevMenu, RCTDevSettings, RCTDevLoadingView) + // These modules are not TurboModules and are only available in DEV mode + // Using optional RCTBridge.current() - returns nil gracefully when bridge unavailable + // Note: In RN 0.83+, dev modules may not be available if using new architecture exclusively public static func getModule(type: T.Type) -> T? { - return unsafeBridge?.moduleRegistry.module(for: type.self) as? T + return RCTBridge.current()?.moduleRegistry.module(for: type.self) as? T } - + public static func getModule(name: String) -> Any? { - return unsafeBridge?.moduleRegistry.module(forName: name) - } - - public static var unsafeBridge: RCTBridge? { - return RCTBridge.current() + return RCTBridge.current()?.moduleRegistry.module(forName: name) } } diff --git a/ios/TurboModules/MxConfiguration/MxConfigurationModule.h b/ios/TurboModules/MxConfiguration/MxConfigurationModule.h new file mode 100644 index 0000000..c07ad52 --- /dev/null +++ b/ios/TurboModules/MxConfiguration/MxConfigurationModule.h @@ -0,0 +1,4 @@ +#import + +@interface MxConfigurationModule : NativeMxConfigurationSpecBase +@end diff --git a/ios/TurboModules/MxConfiguration/MxConfigurationModule.mm b/ios/TurboModules/MxConfiguration/MxConfigurationModule.mm new file mode 100644 index 0000000..c14ebe0 --- /dev/null +++ b/ios/TurboModules/MxConfiguration/MxConfigurationModule.mm @@ -0,0 +1,20 @@ +#import "MxConfigurationModule.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxConfigurationModule + +RCT_EXPORT_MODULE(MxConfiguration) + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (nonnull NSDictionary *)getConfig { + return [[[MxConfiguration alloc] init] constants]; +} + +@end diff --git a/ios/TurboModules/MxCookie/MxCookie.h b/ios/TurboModules/MxCookie/MxCookie.h new file mode 100644 index 0000000..1151e33 --- /dev/null +++ b/ios/TurboModules/MxCookie/MxCookie.h @@ -0,0 +1,4 @@ +#import + +@interface MxCookie : NativeMxCookieSpecBase +@end diff --git a/ios/TurboModules/MxCookie/MxCookie.mm b/ios/TurboModules/MxCookie/MxCookie.mm new file mode 100644 index 0000000..96808d7 --- /dev/null +++ b/ios/TurboModules/MxCookie/MxCookie.mm @@ -0,0 +1,22 @@ +#import "MxCookie.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxCookie + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)clearAll:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [Promise instance:resolve reject:reject]; + [[[NativeCookieModule alloc] init] clearAll:promise]; +} + +@end diff --git a/ios/TurboModules/MxDownload/MxDownload.h b/ios/TurboModules/MxDownload/MxDownload.h new file mode 100644 index 0000000..daa52f5 --- /dev/null +++ b/ios/TurboModules/MxDownload/MxDownload.h @@ -0,0 +1,4 @@ +#import + +@interface MxDownload : NativeMxDownloadSpecBase +@end diff --git a/ios/TurboModules/MxDownload/MxDownload.mm b/ios/TurboModules/MxDownload/MxDownload.mm new file mode 100644 index 0000000..fb92377 --- /dev/null +++ b/ios/TurboModules/MxDownload/MxDownload.mm @@ -0,0 +1,27 @@ +#import "MxDownload.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxDownload + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)download:(nonnull NSString *)url + downloadPath:(nonnull NSString *)downloadPath + config:(nonnull NSDictionary *)config + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [Promise instance:resolve reject:reject]; + // Note: Progress events are not emitted from this module + // Use MxOta module for progress events + [[[NativeDownloadModule alloc] init] download:url downloadPath:downloadPath config:config onProgress:nil promise:promise]; +} + +@end diff --git a/ios/TurboModules/MxEncryption/MxEncryption.h b/ios/TurboModules/MxEncryption/MxEncryption.h new file mode 100644 index 0000000..7b661f2 --- /dev/null +++ b/ios/TurboModules/MxEncryption/MxEncryption.h @@ -0,0 +1,4 @@ +#import + +@interface MxEncryption : NativeMxEncryptionSpecBase +@end diff --git a/ios/TurboModules/MxEncryption/MxEncryption.mm b/ios/TurboModules/MxEncryption/MxEncryption.mm new file mode 100644 index 0000000..1476dec --- /dev/null +++ b/ios/TurboModules/MxEncryption/MxEncryption.mm @@ -0,0 +1,48 @@ +#import "MxEncryption.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxEncryption + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)setItem:(nonnull NSString *)key + value:(nonnull NSString *)value + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; + [[[EncryptedStorage alloc] init] setItemWithKey:key value:value promise:promise]; +} + +- (void)getItem:(nonnull NSString *)key + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; + [[[EncryptedStorage alloc] init] getItemWithKey:key promise:promise]; +} + +- (void)removeItem:(nonnull NSString *)key + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; + [[[EncryptedStorage alloc] init] removeItemWithKey:key promise:promise]; +} + +- (void)clear:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [[Promise alloc] initWithResolve:resolve reject:reject]; + [[[EncryptedStorage alloc] init] clearWithPromise:promise]; +} + +- (nonnull NSNumber *)isEncrypted { + return [NSNumber numberWithBool: [EncryptedStorage isEncrypted]]; +} + +@end diff --git a/ios/TurboModules/MxError/MxError.h b/ios/TurboModules/MxError/MxError.h new file mode 100644 index 0000000..7b6709e --- /dev/null +++ b/ios/TurboModules/MxError/MxError.h @@ -0,0 +1,4 @@ +#import + +@interface MxError : NativeMxErrorSpecBase +@end diff --git a/ios/TurboModules/MxError/MxError.mm b/ios/TurboModules/MxError/MxError.mm new file mode 100644 index 0000000..8f400a1 --- /dev/null +++ b/ios/TurboModules/MxError/MxError.mm @@ -0,0 +1,21 @@ +#import "MxError.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxError + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)handle:(nonnull NSString *)message + stackTrace:(nonnull NSArray *)stackTrace { + [[[NativeErrorHandler alloc] init] handleWithMessage:message stackTrace:stackTrace]; +} + +@end diff --git a/ios/TurboModules/MxFileSystem/MxFileSystem.h b/ios/TurboModules/MxFileSystem/MxFileSystem.h new file mode 100644 index 0000000..27f5bbe --- /dev/null +++ b/ios/TurboModules/MxFileSystem/MxFileSystem.h @@ -0,0 +1,4 @@ +#import + +@interface MxFileSystem : NativeMxFileSystemSpecBase +@end diff --git a/ios/TurboModules/MxFileSystem/MxFileSystem.mm b/ios/TurboModules/MxFileSystem/MxFileSystem.mm new file mode 100644 index 0000000..f67a9c1 --- /dev/null +++ b/ios/TurboModules/MxFileSystem/MxFileSystem.mm @@ -0,0 +1,87 @@ +#import "MxFileSystem.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxFileSystem + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (nonnull NSDictionary *)constants { + return [[[NativeFsModule alloc] init] constants]; +} + +- (void)save:(nonnull NSDictionary *)blob + filePath:(nonnull NSString *)filePath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] save:blob filepath:filePath resolve:resolve reject:reject]; +} + +- (void)read:(nonnull NSString *)filePath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] read:filePath resolve:resolve reject:reject]; +} + +- (void)move:(nonnull NSString *)filePath + newPath:(nonnull NSString *)newPath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] move:filePath newPath:newPath resolve:resolve reject:reject]; +} + +- (void)remove:(nonnull NSString *)filePath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] remove:filePath resolve:resolve reject:reject]; +} + +- (void)list:(nonnull NSString *)dirPath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] list:dirPath resolve:resolve reject:reject]; +} + +- (void)readAsDataURL:(nonnull NSString *)filePath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] readAsDataURL:filePath resolve:resolve reject:reject]; +} + +- (void)readAsText:(nonnull NSString *)filePath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + reject(@"NOT_SUPPORTED", @"Read as text is not supported on iOS", nil); +} + +- (void)fileExists:(nonnull NSString *)filePath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] fileExists:filePath resolve:resolve reject:reject]; +} + +- (void)writeJson:(nonnull NSDictionary *)data + filepath:(nonnull NSString *)filepath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] writeJson:data filepath:filepath resolve:resolve reject:reject]; +} + +- (void)readJson:(nonnull NSString *)filepath + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[NativeFsModule alloc] init] readJson:filepath resolve:resolve reject:reject]; +} + +- (void)setEncryptionEnabled:(BOOL)enabled { + [[[NativeFsModule alloc] init] setEncryptionEnabled:enabled]; +} + +@end diff --git a/ios/TurboModules/MxNavigation/MxNavigation.h b/ios/TurboModules/MxNavigation/MxNavigation.h new file mode 100644 index 0000000..0e4c4ce --- /dev/null +++ b/ios/TurboModules/MxNavigation/MxNavigation.h @@ -0,0 +1,4 @@ +#import + +@interface MxNavigation : NativeMxNavigationSpecBase +@end diff --git a/ios/TurboModules/MxNavigation/MxNavigation.mm b/ios/TurboModules/MxNavigation/MxNavigation.mm new file mode 100644 index 0000000..3f7af41 --- /dev/null +++ b/ios/TurboModules/MxNavigation/MxNavigation.mm @@ -0,0 +1,24 @@ +#import "MxNavigation.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxNavigation + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (nonnull NSNumber *)isNavigationBarActive { + return [NSNumber numberWithBool:NO]; +} + +- (nonnull NSNumber *)getNavigationBarHeight { + return [NSNumber numberWithDouble:0.0]; +} + +@end diff --git a/ios/TurboModules/MxOta/MxOta.h b/ios/TurboModules/MxOta/MxOta.h new file mode 100644 index 0000000..42638a7 --- /dev/null +++ b/ios/TurboModules/MxOta/MxOta.h @@ -0,0 +1,4 @@ +#import + +@interface MxOta : NativeMxOtaSpecBase +@end diff --git a/ios/TurboModules/MxOta/MxOta.mm b/ios/TurboModules/MxOta/MxOta.mm new file mode 100644 index 0000000..72d7e7e --- /dev/null +++ b/ios/TurboModules/MxOta/MxOta.mm @@ -0,0 +1,30 @@ +#import "MxOta.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxOta + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)download:(nonnull NSDictionary *)config + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [Promise instance:resolve reject:reject]; + [[[NativeOtaModule alloc] init] download:config promise:promise]; +} + +- (void)deploy:(nonnull NSDictionary *)config + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + Promise *promise = [Promise instance:resolve reject:reject]; + [[[NativeOtaModule alloc] init] deploy:config promise:promise]; +} + +@end diff --git a/ios/TurboModules/MxReload/MxReload.h b/ios/TurboModules/MxReload/MxReload.h new file mode 100644 index 0000000..8127fed --- /dev/null +++ b/ios/TurboModules/MxReload/MxReload.h @@ -0,0 +1,4 @@ +#import + +@interface MxReload : NativeMxReloadSpecBase +@end diff --git a/ios/TurboModules/MxReload/MxReload.mm b/ios/TurboModules/MxReload/MxReload.mm new file mode 100644 index 0000000..f3f0358 --- /dev/null +++ b/ios/TurboModules/MxReload/MxReload.mm @@ -0,0 +1,28 @@ +#import "MxReload.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxReload + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)reload:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[ReloadHandler alloc] init] reload]; + resolve(nil); +} + +- (void)exitApp:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject { + [[[ReloadHandler alloc] init] exitApp]; + resolve(nil); +} + +@end diff --git a/ios/TurboModules/MxSplashScreen/MxSplashScreen.h b/ios/TurboModules/MxSplashScreen/MxSplashScreen.h new file mode 100644 index 0000000..0bdb97b --- /dev/null +++ b/ios/TurboModules/MxSplashScreen/MxSplashScreen.h @@ -0,0 +1,4 @@ +#import + +@interface MxSplashScreen : NativeMxSplashScreenSpecBase +@end diff --git a/ios/TurboModules/MxSplashScreen/MxSplashScreen.mm b/ios/TurboModules/MxSplashScreen/MxSplashScreen.mm new file mode 100644 index 0000000..7808289 --- /dev/null +++ b/ios/TurboModules/MxSplashScreen/MxSplashScreen.mm @@ -0,0 +1,24 @@ +#import "MxSplashScreen.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxSplashScreen + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)show { + [[[MendixSplashScreen alloc] init] show]; +} + +- (void)hide { + [[[MendixSplashScreen alloc] init] hide]; +} + +@end diff --git a/ios/TurboModules/MxStorage/MxStorage.h b/ios/TurboModules/MxStorage/MxStorage.h new file mode 100644 index 0000000..5d66c3b --- /dev/null +++ b/ios/TurboModules/MxStorage/MxStorage.h @@ -0,0 +1,4 @@ +#import + +@interface MxStorage : NativeMxStorageSpecBase +@end diff --git a/ios/TurboModules/MxStorage/MxStorage.mm b/ios/TurboModules/MxStorage/MxStorage.mm new file mode 100644 index 0000000..fceb73c --- /dev/null +++ b/ios/TurboModules/MxStorage/MxStorage.mm @@ -0,0 +1,58 @@ +#import "MxStorage.h" +#import "RCTAppDelegate.h" +#import +#import "MendixNative-Swift.h" + +@implementation MxStorage + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: +(const facebook::react::ObjCTurboModule::InitParams &)params +{ + return std::make_shared(params); +} + +- (void)clearDatabases:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + // NOTE: Using self.bridge for OPSQLite module access + // TODO: Move to JavaScript orchestration - JavaScript can call OPSQLite TurboModule directly + // if it exposes deleteAllDBs() method. This would eliminate native module lookup entirely. + id opSQLiteModule = [self.bridge moduleForName:@"OPSQLite"]; + + if (!opSQLiteModule) { + reject(@"MODULE_NOT_FOUND", @"OPSQLiteModule not available", nil); + return; + } + + SEL deleteAllSelector = NSSelectorFromString(@"deleteAllDBs"); + if ([opSQLiteModule respondsToSelector:deleteAllSelector]) { + [opSQLiteModule performSelector:deleteAllSelector]; + resolve(nil); + } else { + reject(@"METHOD_NOT_FOUND", @"deleteAllDBs method not available on OPSQLite", nil); + } +} + +- (void)closeDatabaseConnections:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + // NOTE: Using self.bridge for OPSQLite module access + // TODO: Move to JavaScript orchestration - JavaScript can call OPSQLite TurboModule directly + // if it exposes closeAllConnections() method. This would eliminate native module lookup entirely. + id opSQLiteModule = [self.bridge moduleForName:@"OPSQLite"]; + + if (!opSQLiteModule) { + reject(@"MODULE_NOT_FOUND", @"OPSQLiteModule not available", nil); + return; + } + + SEL closeAllSelector = NSSelectorFromString(@"closeAllConnections"); + if ([opSQLiteModule respondsToSelector:closeAllSelector]) { + [opSQLiteModule performSelector:closeAllSelector]; + resolve(nil); + } else { + reject(@"METHOD_NOT_FOUND", @"closeAllConnections method not available on OPSQLite", nil); + } +} + +@end diff --git a/src/cookie.ts b/src/cookie.ts deleted file mode 100644 index c85345b..0000000 --- a/src/cookie.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Mx from './specs/NativeMendixNative'; - -export const NativeCookie = { - clearAll: Mx.cookieClearAll, -}; diff --git a/src/cookie/NativeMxCookie.ts b/src/cookie/NativeMxCookie.ts new file mode 100644 index 0000000..f778253 --- /dev/null +++ b/src/cookie/NativeMxCookie.ts @@ -0,0 +1,7 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; + +export interface Spec extends TurboModule { + clearAll(): Promise; +} + +export default TurboModuleRegistry.getEnforcing('MxCookie'); diff --git a/src/cookie/index.ts b/src/cookie/index.ts new file mode 100644 index 0000000..ff8e8c9 --- /dev/null +++ b/src/cookie/index.ts @@ -0,0 +1,5 @@ +import NativeMxCookie from './NativeMxCookie'; + +export const NativeCookie = { + clearAll: NativeMxCookie.clearAll, +}; diff --git a/src/dev-settings.ts b/src/dev-settings.ts new file mode 100644 index 0000000..7e10e94 --- /dev/null +++ b/src/dev-settings.ts @@ -0,0 +1,100 @@ +import { NativeModules, Platform } from 'react-native'; + +const NativeDevSettings = NativeModules.DevSettings; + +/** + * Controls debugging and development settings using React Native's built-in APIs. + * + * **Modern Architecture:** Calls React Native's DevSettings TurboModule directly + * without using the legacy RCTBridge, providing better performance and compatibility + * with React Native's New Architecture. + * + * In RN 0.83+, the deprecated `setIsDebuggingRemotely` API was removed and replaced + * with modern on-device debugging tools accessed through these methods. + */ +export const DevSettings = { + /** + * Opens the debugger (Chrome DevTools or Hermes debugger). + * In RN 0.83+, this replaces the deprecated `setIsDebuggingRemotely` API. + * + * Calls React Native's DevSettings TurboModule directly. + */ + openDebugger(): void { + if (!__DEV__) return; + + // Call React Native's DevSettings TurboModule directly (no bridge) + NativeDevSettings?.openDebugger?.(); + }, + + /** + * Toggles the element inspector overlay. + * + * Calls React Native's DevSettings TurboModule directly. + */ + toggleElementInspector(): void { + if (!__DEV__) return; + + // Call React Native's DevSettings TurboModule directly (no bridge) + NativeDevSettings?.toggleElementInspector?.(); + }, + + /** + * Reloads the JavaScript bundle. + * + * Calls React Native's DevSettings TurboModule directly. + * + * @param reason Optional reason for the reload + */ + reload(reason?: string): void { + if (!__DEV__) return; + + // Call React Native's DevSettings TurboModule directly (no bridge) + if (NativeDevSettings?.reloadWithReason) { + NativeDevSettings.reloadWithReason(reason ?? 'Manual reload from JS'); + } else if (NativeDevSettings?.reload) { + NativeDevSettings.reload(); + } + }, + + /** + * Controls hot reloading (Fast Refresh). + */ + setHotLoadingEnabled(enabled: boolean): void { + if (__DEV__ && NativeDevSettings?.setHotLoadingEnabled) { + NativeDevSettings.setHotLoadingEnabled(enabled); + } + }, + + /** + * Controls React profiling. + */ + setProfilingEnabled(enabled: boolean): void { + if (__DEV__ && NativeDevSettings?.setProfilingEnabled) { + NativeDevSettings.setProfilingEnabled(enabled); + } + }, + + /** + * Controls shake gesture for dev menu (iOS only). + */ + setShakeToShowDevMenuEnabled(enabled: boolean): void { + if ( + __DEV__ && + Platform.OS === 'ios' && + NativeDevSettings?.setIsShakeToShowDevMenuEnabled + ) { + NativeDevSettings.setIsShakeToShowDevMenuEnabled(enabled); + } + }, + + /** + * Adds a custom menu item to the dev menu. + */ + addMenuItem(title: string, _handler: () => void): void { + if (__DEV__ && NativeDevSettings?.addMenuItem) { + NativeDevSettings.addMenuItem(title); + // Note: Event listener setup would need NativeEventEmitter + // See DevSettings.js in react-native for full implementation + } + }, +}; diff --git a/src/download-handler.ts b/src/download-handler.ts deleted file mode 100644 index 2472bef..0000000 --- a/src/download-handler.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Mx, { type DownloadConfig } from './specs/NativeMendixNative'; - -export const NativeDownloadHandler = { - download: (url: string, downloadPath: string, config: DownloadConfig) => - Mx.downloadHandlerDownload(url, downloadPath, config), -}; diff --git a/src/download-handler/NativeMxDownload.ts b/src/download-handler/NativeMxDownload.ts new file mode 100644 index 0000000..9921e6d --- /dev/null +++ b/src/download-handler/NativeMxDownload.ts @@ -0,0 +1,30 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import type { CodegenTypes } from 'react-native'; + +type GenericType = + | string + | number + | boolean + | null + | undefined + | { [key: string]: GenericType } + | GenericType[]; + +type GenericMap = { [key: string]: GenericType }; + +type DownloadConfig = { + connectionTimeout?: CodegenTypes.Int32; + mimeType?: string; +}; + +export interface Spec extends TurboModule { + download( + url: string, + downloadPath: string, + config: GenericMap + ): Promise; +} + +export default TurboModuleRegistry.getEnforcing('MxDownload'); + +export type { GenericMap, DownloadConfig }; diff --git a/src/download-handler/index.ts b/src/download-handler/index.ts new file mode 100644 index 0000000..d2de2a1 --- /dev/null +++ b/src/download-handler/index.ts @@ -0,0 +1,9 @@ +import NativeMxDownload from './NativeMxDownload'; + +// Re-export DownloadConfig type for backward compatibility +export type { DownloadConfig } from './NativeMxDownload'; + +export const NativeDownloadHandler = { + download: (url: string, downloadPath: string, config: Record) => + NativeMxDownload.download(url, downloadPath, config), +}; diff --git a/src/encrypted-storage.ts b/src/encrypted-storage.ts index 23ef80d..ed528a3 100644 --- a/src/encrypted-storage.ts +++ b/src/encrypted-storage.ts @@ -1,9 +1,10 @@ -import Mx from './specs/NativeMendixNative'; +import NativeMxEncryption from './encryption/NativeMxEncryption'; +// Legacy API - uses new MxEncryption module under the hood export const RNMendixEncryptedStorage = { - getItem: Mx.encryptedStorageGetItem, - setItem: Mx.encryptedStorageSetItem, - removeItem: Mx.encryptedStorageRemoveItem, - clear: Mx.encryptedStorageClear, - IS_ENCRYPTED: Mx.encryptedStorageIsEncrypted(), //This one is constant and not a function hence invoked here + getItem: NativeMxEncryption.getItem, + setItem: NativeMxEncryption.setItem, + removeItem: NativeMxEncryption.removeItem, + clear: NativeMxEncryption.clear, + IS_ENCRYPTED: NativeMxEncryption.isEncrypted(), //This one is constant and not a function hence invoked here }; diff --git a/src/encryption/NativeMxEncryption.ts b/src/encryption/NativeMxEncryption.ts new file mode 100644 index 0000000..2603f48 --- /dev/null +++ b/src/encryption/NativeMxEncryption.ts @@ -0,0 +1,46 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; + +/** + * MxEncryption TurboModule + * + * Provides secure encrypted storage using platform-native keychains: + * - iOS: Uses Keychain Services + * - Android: Uses EncryptedSharedPreferences with AES256 + */ +export interface Spec extends TurboModule { + /** + * Store an encrypted key-value pair + * @param key The key to store under + * @param value The value to encrypt and store + * @returns Promise that resolves when stored + */ + setItem(key: string, value: string): Promise; + + /** + * Retrieve a decrypted value by key + * @param key The key to retrieve + * @returns Promise that resolves to the decrypted value, or null if not found + */ + getItem(key: string): Promise; + + /** + * Remove an encrypted key-value pair + * @param key The key to remove + * @returns Promise that resolves when removed + */ + removeItem(key: string): Promise; + + /** + * Clear all encrypted storage + * @returns Promise that resolves when cleared + */ + clear(): Promise; + + /** + * Check if storage is encrypted + * @returns true if encrypted, false otherwise (always true on iOS, may vary on Android) + */ + isEncrypted(): boolean; +} + +export default TurboModuleRegistry.getEnforcing('MxEncryption'); diff --git a/src/encryption/index.ts b/src/encryption/index.ts new file mode 100644 index 0000000..b801574 --- /dev/null +++ b/src/encryption/index.ts @@ -0,0 +1,74 @@ +import NativeMxEncryption from './NativeMxEncryption'; + +/** + * MxEncryption - Secure encrypted storage + * + * Provides a simple key-value store with automatic encryption using platform-native APIs: + * - iOS: Keychain Services + * - Android: EncryptedSharedPreferences (AES256-GCM) + * + * @example + * ```typescript + * import { MxEncryption } from 'mendix-native'; + * + * // Store encrypted data + * await MxEncryption.setItem('auth_token', 'secret123'); + * + * // Retrieve decrypted data + * const token = await MxEncryption.getItem('auth_token'); + * + * // Remove item + * await MxEncryption.removeItem('auth_token'); + * + * // Clear all encrypted storage + * await MxEncryption.clear(); + * + * // Check if encrypted + * const encrypted = MxEncryption.isEncrypted(); // true + * ``` + */ +export const MxEncryption = { + /** + * Store an encrypted key-value pair + * @param key The key to store under + * @param value The value to encrypt and store + * @returns Promise that resolves when stored + */ + async setItem(key: string, value: string): Promise { + return NativeMxEncryption.setItem(key, value); + }, + + /** + * Retrieve a decrypted value by key + * @param key The key to retrieve + * @returns Promise that resolves to the decrypted value, or null if not found + */ + async getItem(key: string): Promise { + return NativeMxEncryption.getItem(key); + }, + + /** + * Remove an encrypted key-value pair + * @param key The key to remove + * @returns Promise that resolves when removed + */ + async removeItem(key: string): Promise { + return NativeMxEncryption.removeItem(key); + }, + + /** + * Clear all encrypted storage + * @returns Promise that resolves when cleared + */ + async clear(): Promise { + return NativeMxEncryption.clear(); + }, + + /** + * Check if storage is encrypted + * @returns true if encrypted, false otherwise (always true on iOS, may vary on Android) + */ + isEncrypted(): boolean { + return NativeMxEncryption.isEncrypted(); + }, +}; diff --git a/src/error-handler.ts b/src/error-handler.ts deleted file mode 100644 index 5d62411..0000000 --- a/src/error-handler.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Mx from './specs/NativeMendixNative'; - -export const NativeErrorHandler = { - handle: Mx.errorHandlerHandle, -}; diff --git a/src/error/NativeMxError.ts b/src/error/NativeMxError.ts new file mode 100644 index 0000000..a2ec891 --- /dev/null +++ b/src/error/NativeMxError.ts @@ -0,0 +1,8 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import type { StackFrame } from 'stacktrace-parser'; + +export interface Spec extends TurboModule { + handle(message: string, stackTrace: StackFrame[]): void; +} + +export default TurboModuleRegistry.getEnforcing('MxError'); diff --git a/src/error/index.ts b/src/error/index.ts new file mode 100644 index 0000000..c7fade6 --- /dev/null +++ b/src/error/index.ts @@ -0,0 +1,5 @@ +import NativeMxError from './NativeMxError'; + +export const NativeErrorHandler = { + handle: NativeMxError.handle, +}; diff --git a/src/events.ts b/src/events.ts index 7b8bca7..b7c10d1 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,4 +1,5 @@ -import Mx from './specs/NativeMendixNative'; +import NativeMxReload from './reload-handler/NativeMxReload'; +import NativeMxOta from './ota/NativeMxOta'; -export const onReloadWithStateEvent = Mx.onReloadWithState; -export const onDownloadProgressEvent = Mx.onDownloadProgress; +export const onReloadWithStateEvent = NativeMxReload.onReloadWithState; +export const onDownloadProgressEvent = NativeMxOta.onDownloadProgress; diff --git a/src/file-system/NativeMxFileSystem.ts b/src/file-system/NativeMxFileSystem.ts new file mode 100644 index 0000000..bafbe87 --- /dev/null +++ b/src/file-system/NativeMxFileSystem.ts @@ -0,0 +1,41 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; + +type BlobData = { + blobId: string; + offset: number; + size: number; + name?: string; + type?: string; + lastModified?: number; +}; + +type GenericType = + | string + | number + | boolean + | null + | undefined + | { [key: string]: GenericType } + | GenericType[]; + +type GenericMap = { [key: string]: GenericType }; +type GenericArray = GenericType[]; + +export interface Spec extends TurboModule { + constants(): GenericMap; + save(blob: GenericMap, filePath: string): Promise; + read(filePath: string): Promise; + move(filePath: string, newPath: string): Promise; + remove(filePath: string): Promise; + list(dirPath: string): Promise; + readAsDataURL(filePath: string): Promise; + readAsText(filePath: string): Promise; + fileExists(filePath: string): Promise; + writeJson(data: GenericMap, filepath: string): Promise; + readJson(filepath: string): Promise; + setEncryptionEnabled(enabled: boolean): void; +} + +export default TurboModuleRegistry.getEnforcing('MxFileSystem'); + +export type { BlobData, GenericMap, GenericArray }; diff --git a/src/file-system.ts b/src/file-system/index.ts similarity index 55% rename from src/file-system.ts rename to src/file-system/index.ts index a0ec8a8..9106703 100644 --- a/src/file-system.ts +++ b/src/file-system/index.ts @@ -1,11 +1,11 @@ -import Mx, { type BlobData } from './specs/NativeMendixNative'; +import NativeMxFileSystem, { type BlobData } from './NativeMxFileSystem'; const initFs = () => { const { DocumentDirectoryPath, SUPPORTS_DIRECTORY_MOVE, SUPPORTS_ENCRYPTION, - } = Mx.fsConstants(); + } = NativeMxFileSystem.constants(); const docDirPath = DocumentDirectoryPath as string; return { //Constants @@ -14,20 +14,22 @@ const initFs = () => { SUPPORTS_ENCRYPTION: cast(SUPPORTS_ENCRYPTION), //Methods - signature matches with specs - read: Mx.fsRead, - list: Mx.fsList, - readAsDataURL: Mx.fsReadAsDataURL, - readAsText: Mx.fsReadAsText, //Android only - fileExists: Mx.fsFileExists, - move: Mx.fsMove, - remove: Mx.fsRemove, - setEncryptionEnabled: Mx.fsSetEncryptionEnabled, + read: NativeMxFileSystem.read, + list: NativeMxFileSystem.list, + readAsDataURL: NativeMxFileSystem.readAsDataURL, + readAsText: NativeMxFileSystem.readAsText, //Android only + fileExists: NativeMxFileSystem.fileExists, + move: NativeMxFileSystem.move, + remove: NativeMxFileSystem.remove, + setEncryptionEnabled: NativeMxFileSystem.setEncryptionEnabled, //Methods - signature modified since specs does not recognize Record and generics - save: (blob: BlobData, filePath: string) => Mx.fsSave(blob, filePath), + save: (blob: BlobData, filePath: string) => + NativeMxFileSystem.save(blob, filePath), writeJson: (data: Record, filepath: string) => - Mx.fsWriteJson(data, filepath), - readJson: (filepath: string) => Mx.fsReadJson(filepath) as Promise, + NativeMxFileSystem.writeJson(data, filepath), + readJson: (filepath: string) => + NativeMxFileSystem.readJson(filepath) as Promise, //Helpers relativeToDocumentsAbsolutePath: (path: string) => diff --git a/src/index.ts b/src/index.ts index 77b7b17..75523a8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,8 @@ -export * from './splash-screen'; +// Modern TurboModule exports (Mx prefix) +export * from './encryption'; // MxEncryption +export * from './splash-screen'; // MxSplashScreen + +// Legacy exports (keep for backward compatibility) export * from './mx-configuration'; export * from './cookie'; export * from './events'; @@ -6,6 +10,8 @@ export * from './ota'; export * from './download-handler'; export * from './reload-handler'; export * from './encrypted-storage'; -export * from './error-handler'; +export * from './error'; export * from './file-system'; export * from './navigation-mode'; +export * from './dev-settings'; +export * from './storage'; diff --git a/src/mx-configuration.ts b/src/mx-configuration.ts deleted file mode 100644 index 4ff47c8..0000000 --- a/src/mx-configuration.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Mx from './specs/NativeMendixNative'; - -export const MxConfiguration = Mx.mxConfigurationGetConfig(); diff --git a/src/mx-configuration/NativeMxConfiguration.ts b/src/mx-configuration/NativeMxConfiguration.ts new file mode 100644 index 0000000..eb1e855 --- /dev/null +++ b/src/mx-configuration/NativeMxConfiguration.ts @@ -0,0 +1,31 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import type { CodegenTypes } from 'react-native'; + +type Configuration = { + RUNTIME_URL: string; + APP_NAME: string | null; + /** + * Do not use directly + * @deprecated + */ + FILES_DIRECTORY_NAME: string; + DATABASE_NAME: string; + WARNINGS_FILTER_LEVEL: string; + OTA_MANIFEST_PATH: string; + NATIVE_DEPENDENCIES?: { [key: string]: string }; + IS_DEVELOPER_APP?: boolean; + /** + * @deprecated + */ + CODE_PUSH_KEY?: string; + NATIVE_BINARY_VERSION?: CodegenTypes.Int32; + APP_SESSION_ID?: string; +}; + +export interface Spec extends TurboModule { + getConfig(): Configuration; +} + +export default TurboModuleRegistry.getEnforcing('MxConfiguration'); + +export type { Configuration }; diff --git a/src/mx-configuration/index.ts b/src/mx-configuration/index.ts new file mode 100644 index 0000000..59abeb5 --- /dev/null +++ b/src/mx-configuration/index.ts @@ -0,0 +1,3 @@ +import NativeMxConfiguration from './NativeMxConfiguration'; + +export const MxConfiguration = NativeMxConfiguration.getConfig(); diff --git a/src/navigation-mode.ts b/src/navigation-mode.ts deleted file mode 100644 index 5788ff4..0000000 --- a/src/navigation-mode.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Mx from './specs/NativeMendixNative'; - -export const AndroidNavigationBar = { - height: Mx.navigationModeGetNavigationBarHeight(), - isActive: Mx.navigationModeIsNavigationBarActive(), -}; diff --git a/src/navigation-mode/NativeMxNavigation.ts b/src/navigation-mode/NativeMxNavigation.ts new file mode 100644 index 0000000..eaa3dc3 --- /dev/null +++ b/src/navigation-mode/NativeMxNavigation.ts @@ -0,0 +1,9 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import type { CodegenTypes } from 'react-native'; + +export interface Spec extends TurboModule { + isNavigationBarActive(): boolean; + getNavigationBarHeight(): CodegenTypes.Double; +} + +export default TurboModuleRegistry.getEnforcing('MxNavigation'); diff --git a/src/navigation-mode/index.ts b/src/navigation-mode/index.ts new file mode 100644 index 0000000..04209dd --- /dev/null +++ b/src/navigation-mode/index.ts @@ -0,0 +1,6 @@ +import NativeMxNavigation from './NativeMxNavigation'; + +export const AndroidNavigationBar = { + height: NativeMxNavigation.getNavigationBarHeight(), + isActive: NativeMxNavigation.isNavigationBarActive(), +}; diff --git a/src/ota.ts b/src/ota.ts deleted file mode 100644 index 639a709..0000000 --- a/src/ota.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Mx, { - type OtaDeployConfig, - type OtaDownloadConfig, -} from './specs/NativeMendixNative'; - -export const NativeOta = { - download: (config: OtaDownloadConfig) => Mx.otaDownload(config), - deploy: (config: OtaDeployConfig) => Mx.otaDeploy(config), -}; diff --git a/src/ota/NativeMxOta.ts b/src/ota/NativeMxOta.ts new file mode 100644 index 0000000..486d662 --- /dev/null +++ b/src/ota/NativeMxOta.ts @@ -0,0 +1,48 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import type { CodegenTypes } from 'react-native'; + +type GenericType = + | string + | number + | boolean + | null + | undefined + | { [key: string]: GenericType } + | GenericType[]; + +type GenericMap = { [key: string]: GenericType }; + +type OtaDownloadConfig = { + url: string; +}; + +type OtaDeployConfig = { + otaDeploymentID: string; + otaPackage: string; + extractionDir: string; +}; + +type OtaDownloadResponse = { + otaPackage: string; +}; + +type DownloadProgress = { + receivedBytes: CodegenTypes.Double; + totalBytes: CodegenTypes.Double; +}; + +export interface Spec extends TurboModule { + download(config: GenericMap): Promise; + deploy(config: GenericMap): Promise; + readonly onDownloadProgress: CodegenTypes.EventEmitter; +} + +export default TurboModuleRegistry.getEnforcing('MxOta'); + +export type { + GenericMap, + OtaDownloadConfig, + OtaDeployConfig, + OtaDownloadResponse, + DownloadProgress, +}; diff --git a/src/ota/index.ts b/src/ota/index.ts new file mode 100644 index 0000000..f1435f9 --- /dev/null +++ b/src/ota/index.ts @@ -0,0 +1,13 @@ +import NativeMxOta from './NativeMxOta'; + +// Re-export types for backward compatibility +export type { + OtaDeployConfig, + OtaDownloadConfig, + OtaDownloadResponse, +} from './NativeMxOta'; + +export const NativeOta = { + download: (config: Record) => NativeMxOta.download(config), + deploy: (config: Record) => NativeMxOta.deploy(config), +}; diff --git a/src/reload-handler.ts b/src/reload-handler.ts deleted file mode 100644 index 889ed74..0000000 --- a/src/reload-handler.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Mx from './specs/NativeMendixNative'; - -export const NativeReloadHandler = { - reload: Mx.reloadHandlerReload, - exitApp: Mx.reloadHandlerExitApp, -}; diff --git a/src/reload-handler/NativeMxReload.ts b/src/reload-handler/NativeMxReload.ts new file mode 100644 index 0000000..673d08b --- /dev/null +++ b/src/reload-handler/NativeMxReload.ts @@ -0,0 +1,10 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import type { CodegenTypes } from 'react-native'; + +export interface Spec extends TurboModule { + reload(): Promise; + exitApp(): Promise; + readonly onReloadWithState: CodegenTypes.EventEmitter; +} + +export default TurboModuleRegistry.getEnforcing('MxReload'); diff --git a/src/reload-handler/index.ts b/src/reload-handler/index.ts new file mode 100644 index 0000000..ca324d9 --- /dev/null +++ b/src/reload-handler/index.ts @@ -0,0 +1,6 @@ +import NativeMxReload from './NativeMxReload'; + +export const NativeReloadHandler = { + reload: NativeMxReload.reload, + exitApp: NativeMxReload.exitApp, +}; diff --git a/src/specs/NativeMendixNative.ts b/src/specs/NativeMendixNative.ts deleted file mode 100644 index 37c256f..0000000 --- a/src/specs/NativeMendixNative.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { TurboModuleRegistry, type TurboModule } from 'react-native'; -import type { StackFrame } from 'stacktrace-parser'; -import type { CodegenTypes } from 'react-native'; - -export interface Spec extends TurboModule { - encryptedStorageSetItem(key: string, value: string): Promise; - encryptedStorageGetItem(key: string): Promise; - encryptedStorageRemoveItem(key: string): Promise; - encryptedStorageClear(): Promise; - encryptedStorageIsEncrypted(): boolean; - - splashScreenShow(): void; - splashScreenHide(): void; - - cookieClearAll(): Promise; - - reloadHandlerReload(): Promise; - reloadHandlerExitApp(): Promise; - - downloadHandlerDownload( - url: string, - downloadPath: string, - config: DownloadConfig - ): Promise; - - mxConfigurationGetConfig(): Configuration; - - otaDownload(config: OtaDownloadConfig): Promise; - otaDeploy(config: OtaDeployConfig): Promise; - - fsConstants(): FsConstants; - fsSave(blob: BlobData, filePath: string): Promise; - fsRead(filePath: string): Promise; - fsMove(filePath: string, newPath: string): Promise; - fsRemove(filePath: string): Promise; - fsList(dirPath: string): Promise; - fsReadAsDataURL(filePath: string): Promise; - fsReadAsText(filePath: string): Promise; //Android only - fsFileExists(filePath: string): Promise; - fsWriteJson(data: CodegenTypes.UnsafeObject, filepath: string): Promise; - fsReadJson(filepath: string): Promise; - fsSetEncryptionEnabled(enabled: boolean): void; - - errorHandlerHandle(message: string, stackTrace: StackFrame[]): void; - - navigationModeIsNavigationBarActive(): boolean; - navigationModeGetNavigationBarHeight(): CodegenTypes.Double; - - readonly onReloadWithState: CodegenTypes.EventEmitter; - readonly onDownloadProgress: CodegenTypes.EventEmitter; -} - -export default TurboModuleRegistry.getEnforcing('MendixNative'); - -// Codegen could not recognize types placed in other files hence placed here - -type BlobData = { - blobId: string; - offset: number; - size: number; - name?: string; - type?: string; - lastModified?: number; -}; - -type Configuration = { - RUNTIME_URL: string; - APP_NAME: string | null; - /** - * Do not use directly - * @deprecated - */ - FILES_DIRECTORY_NAME: string; - DATABASE_NAME: string; - WARNINGS_FILTER_LEVEL: string; - OTA_MANIFEST_PATH: string; - NATIVE_DEPENDENCIES?: { [key: string]: string }; - IS_DEVELOPER_APP?: boolean; - /** - * @deprecated - */ - CODE_PUSH_KEY?: string; - NATIVE_BINARY_VERSION?: CodegenTypes.Int32; - APP_SESSION_ID?: string; -}; - -type FsConstants = { - DocumentDirectoryPath: string; - SUPPORTS_DIRECTORY_MOVE: boolean; - SUPPORTS_ENCRYPTION: boolean; -}; - -type DownloadConfig = { - connectionTimeout?: CodegenTypes.Int32; - mimeType?: string; -}; - -type OtaDownloadConfig = { - url: string; -}; - -type OtaDeployConfig = { - otaDeploymentID: string; - otaPackage: string; - extractionDir: string; -}; - -type OtaDownloadResponse = { - otaPackage: string; -}; - -type DownloadProgress = { - receivedBytes: CodegenTypes.Double; - totalBytes: CodegenTypes.Double; -}; - -export type { - BlobData, - Configuration, - FsConstants, - DownloadConfig, - OtaDownloadConfig, - OtaDeployConfig, - OtaDownloadResponse, - DownloadProgress, -}; diff --git a/src/splash-screen.ts b/src/splash-screen.ts deleted file mode 100644 index 9204e49..0000000 --- a/src/splash-screen.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Mx from './specs/NativeMendixNative'; - -export const MendixSplashScreen = { - show: Mx.splashScreenShow, - hide: Mx.splashScreenHide, -}; diff --git a/src/splash-screen/NativeMxSplashScreen.ts b/src/splash-screen/NativeMxSplashScreen.ts new file mode 100644 index 0000000..000822a --- /dev/null +++ b/src/splash-screen/NativeMxSplashScreen.ts @@ -0,0 +1,22 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; + +/** + * MxSplashScreen TurboModule + * + * Controls the native splash screen display during app launch. + */ +export interface Spec extends TurboModule { + /** + * Show the splash screen + * Displays the native splash screen overlay + */ + show(): void; + + /** + * Hide the splash screen + * Removes the native splash screen overlay with animation + */ + hide(): void; +} + +export default TurboModuleRegistry.getEnforcing('MxSplashScreen'); diff --git a/src/splash-screen/index.ts b/src/splash-screen/index.ts new file mode 100644 index 0000000..b072ee5 --- /dev/null +++ b/src/splash-screen/index.ts @@ -0,0 +1,36 @@ +import NativeMxSplashScreen from './NativeMxSplashScreen'; + +/** + * MxSplashScreen - Native splash screen control + * + * Controls the display of the native splash screen during app launch. + * Typically used to hide the splash screen once the app is ready. + * + * @example + * ```typescript + * import { MxSplashScreen } from 'mendix-native'; + * + * // Show splash screen (usually called automatically on launch) + * MxSplashScreen.show(); + * + * // Hide splash screen when app is ready + * MxSplashScreen.hide(); + * ``` + */ +export const MxSplashScreen = { + /** + * Show the splash screen + * Displays the native splash screen overlay + */ + show(): void { + NativeMxSplashScreen.show(); + }, + + /** + * Hide the splash screen + * Removes the native splash screen overlay with animation + */ + hide(): void { + NativeMxSplashScreen.hide(); + }, +}; diff --git a/src/storage/NativeMxStorage.ts b/src/storage/NativeMxStorage.ts new file mode 100644 index 0000000..f127bd1 --- /dev/null +++ b/src/storage/NativeMxStorage.ts @@ -0,0 +1,8 @@ +import { TurboModuleRegistry, type TurboModule } from 'react-native'; + +export interface Spec extends TurboModule { + clearDatabases(): Promise; + closeDatabaseConnections(): Promise; +} + +export default TurboModuleRegistry.getEnforcing('MxStorage'); diff --git a/src/storage/index.ts b/src/storage/index.ts new file mode 100644 index 0000000..6062c57 --- /dev/null +++ b/src/storage/index.ts @@ -0,0 +1,97 @@ +import AsyncStorage from '@react-native-async-storage/async-storage'; +import NativeMxStorage from './NativeMxStorage'; + +/** + * Storage API for managing app data (AsyncStorage, SQLite databases). + * + * Provides a unified, type-safe interface for clearing and managing storage + * across the Mendix Native application. + * + * **Modern Architecture:** This API calls TurboModules directly without using + * the legacy RCTBridge, providing better performance and compatibility with + * React Native's New Architecture. + * + * @example + * ```typescript + * import { Storage } from 'mendix-native'; + * + * // Clear all storage + * await Storage.clearAll(); + * + * // Clear specific storage + * await Storage.clearAsyncStorage(); + * await Storage.clearDatabases(); + * ``` + */ +export const Storage = { + /** + * Clears all AsyncStorage data. + * + * This removes all key-value pairs stored via React Native's AsyncStorage. + * Calls the AsyncStorage TurboModule directly for optimal performance. + * + * @throws {Error} If AsyncStorage module is not available or clear fails + * @example + * ```typescript + * await Storage.clearAsyncStorage(); + * ``` + */ + async clearAsyncStorage(): Promise { + // Call AsyncStorage TurboModule directly (no bridge, no wrapper) + await AsyncStorage.clear(); + }, + + /** + * Deletes all SQLite databases. + * + * This removes all databases created by the op-sqlite module. + * Use with caution as this is irreversible. + * + * @throws {Error} If OPSQLite module is not available + * @example + * ```typescript + * await Storage.clearDatabases(); + * ``` + */ + async clearDatabases(): Promise { + return NativeMxStorage.clearDatabases(); + }, + + /** + * Closes all SQLite database connections. + * + * This gracefully closes all open database connections without deleting data. + * Useful before app termination or data clearing operations. + * + * @throws {Error} If OPSQLite module is not available + * @example + * ```typescript + * await Storage.closeDatabaseConnections(); + * ``` + */ + async closeDatabaseConnections(): Promise { + return NativeMxStorage.closeDatabaseConnections(); + }, + + /** + * Clears all app storage (AsyncStorage + SQLite databases). + * + * This is a convenience method that clears both AsyncStorage and databases + * in a single call. Operations are performed sequentially to ensure proper cleanup. + * + * JavaScript orchestrates the clearing process, calling each TurboModule directly + * for optimal performance. + * + * @throws {Error} If any storage module is not available + * @example + * ```typescript + * // Clear everything + * await Storage.clearAll(); + * ``` + */ + async clearAll(): Promise { + // JavaScript orchestrates - call each TurboModule directly + await this.clearAsyncStorage(); + await this.clearDatabases(); + }, +}; From ce52a85f1a66dc38a5f1e4f765d39abadb62fc03 Mon Sep 17 00:00:00 2001 From: Yogendra Shelke <25844542+YogendraShelke@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:38:23 +0530 Subject: [PATCH 05/26] test: add new tests --- example/__tests__/dev-settings.harness.ts | 21 +++ example/__tests__/download-handler.harness.ts | 47 +++++++ example/__tests__/encryption.harness.ts | 44 +++++++ example/__tests__/error.harness.ts | 24 ++++ example/__tests__/events.harness.ts | 32 +++++ example/__tests__/reload-handler.harness.ts | 14 ++ example/__tests__/storage.harness.ts | 122 ++++++++++++++++++ 7 files changed, 304 insertions(+) create mode 100644 example/__tests__/dev-settings.harness.ts create mode 100644 example/__tests__/download-handler.harness.ts create mode 100644 example/__tests__/encryption.harness.ts create mode 100644 example/__tests__/error.harness.ts create mode 100644 example/__tests__/events.harness.ts create mode 100644 example/__tests__/reload-handler.harness.ts create mode 100644 example/__tests__/storage.harness.ts diff --git a/example/__tests__/dev-settings.harness.ts b/example/__tests__/dev-settings.harness.ts new file mode 100644 index 0000000..52979ca --- /dev/null +++ b/example/__tests__/dev-settings.harness.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from 'react-native-harness'; +import { DevSettings } from 'mendix-native'; + +describe('DevSettings', () => { + test('safe toggle APIs can be invoked repeatedly', () => { + expect(DevSettings.setHotLoadingEnabled(true)).toBeUndefined(); + expect(DevSettings.setHotLoadingEnabled(false)).toBeUndefined(); + + expect(DevSettings.setProfilingEnabled(true)).toBeUndefined(); + expect(DevSettings.setProfilingEnabled(false)).toBeUndefined(); + + expect(DevSettings.setShakeToShowDevMenuEnabled(true)).toBeUndefined(); + expect(DevSettings.setShakeToShowDevMenuEnabled(false)).toBeUndefined(); + }); + + test('menu items can be registered without throwing', () => { + expect( + DevSettings.addMenuItem('Harness menu item', () => {}) + ).toBeUndefined(); + }); +}); diff --git a/example/__tests__/download-handler.harness.ts b/example/__tests__/download-handler.harness.ts new file mode 100644 index 0000000..8751d16 --- /dev/null +++ b/example/__tests__/download-handler.harness.ts @@ -0,0 +1,47 @@ +import { beforeEach, describe, expect, test } from 'react-native-harness'; +import { NativeDownloadHandler, NativeFileSystem } from 'mendix-native'; + +const downloadPath = NativeFileSystem.relativeToDocumentsAbsolutePath( + 'downloads/invalid-url.txt' +); + +describe('NativeDownloadHandler', () => { + beforeEach(async () => { + try { + await NativeFileSystem.remove(downloadPath); + } catch { + // Cleanup is best-effort. + } + }); + + test('rejects malformed URLs without creating a destination file', async () => { + const config = { + connectionTimeout: 25, + mimeType: 'text/plain', + }; + + await expect( + NativeDownloadHandler.download( + '://definitely-invalid-url', + downloadPath, + config + ) + ).rejects.toBeDefined(); + + expect(await NativeFileSystem.fileExists(downloadPath)).toBe(false); + }); + + test('does not mutate the config object while rejecting invalid downloads', async () => { + const config = { + connectionTimeout: 10, + mimeType: 'application/json', + }; + const originalConfig = { ...config }; + + await expect( + NativeDownloadHandler.download('://still-invalid', downloadPath, config) + ).rejects.toBeDefined(); + + expect(config).toEqual(originalConfig); + }); +}); diff --git a/example/__tests__/encryption.harness.ts b/example/__tests__/encryption.harness.ts new file mode 100644 index 0000000..02c3c29 --- /dev/null +++ b/example/__tests__/encryption.harness.ts @@ -0,0 +1,44 @@ +import { beforeEach, describe, expect, test } from 'react-native-harness'; +import { MxEncryption, RNMendixEncryptedStorage } from 'mendix-native'; + +describe('MxEncryption', () => { + beforeEach(async () => { + await MxEncryption.clear(); + }); + + test('stores and retrieves values through the modern API', async () => { + await MxEncryption.setItem('modern-key', 'modern-value'); + + await expect(MxEncryption.getItem('modern-key')).resolves.toBe( + 'modern-value' + ); + }); + + test('shares the same backing store as the legacy encrypted storage API', async () => { + await MxEncryption.setItem('shared-key', 'set-by-modern'); + await expect(RNMendixEncryptedStorage.getItem('shared-key')).resolves.toBe( + 'set-by-modern' + ); + + await RNMendixEncryptedStorage.setItem('shared-key', 'set-by-legacy'); + await expect(MxEncryption.getItem('shared-key')).resolves.toBe( + 'set-by-legacy' + ); + }); + + test('removeItem is visible across both exported wrappers', async () => { + await RNMendixEncryptedStorage.setItem('cross-remove-key', 'value'); + + await MxEncryption.removeItem('cross-remove-key'); + + await expect( + RNMendixEncryptedStorage.getItem('cross-remove-key') + ).resolves.toBe(null); + }); + + test('isEncrypted matches the legacy constant contract', () => { + expect(MxEncryption.isEncrypted()).toBe( + RNMendixEncryptedStorage.IS_ENCRYPTED + ); + }); +}); diff --git a/example/__tests__/error.harness.ts b/example/__tests__/error.harness.ts new file mode 100644 index 0000000..9ba408b --- /dev/null +++ b/example/__tests__/error.harness.ts @@ -0,0 +1,24 @@ +import { describe, expect, test } from 'react-native-harness'; +import { NativeErrorHandler } from 'mendix-native'; + +describe('NativeErrorHandler', () => { + test('accepts normalized stack frame payloads synchronously', () => { + const stackTrace = [ + { + column: 12, + file: 'example/__tests__/error.harness.ts', + lineNumber: 8, + methodName: 'accepts normalized stack frame payloads synchronously', + }, + ] as any; + + expect(() => { + const result = NativeErrorHandler.handle( + 'Harness error contract check', + stackTrace + ); + + expect(result).toBeUndefined(); + }).not.toThrow(); + }); +}); diff --git a/example/__tests__/events.harness.ts b/example/__tests__/events.harness.ts new file mode 100644 index 0000000..c71799f --- /dev/null +++ b/example/__tests__/events.harness.ts @@ -0,0 +1,32 @@ +import { describe, expect, test } from 'react-native-harness'; +import { onDownloadProgressEvent, onReloadWithStateEvent } from 'mendix-native'; + +describe('Module events', () => { + test('download progress exposes a removable subscription', () => { + let callbackCount = 0; + + const subscription = onDownloadProgressEvent(() => { + callbackCount += 1; + }); + + expect(subscription).toBeDefined(); + expect(typeof subscription.remove).toBe('function'); + expect(callbackCount).toBe(0); + + subscription.remove(); + }); + + test('reload state exposes a removable subscription', () => { + let callbackCount = 0; + + const subscription = onReloadWithStateEvent(() => { + callbackCount += 1; + }); + + expect(subscription).toBeDefined(); + expect(typeof subscription.remove).toBe('function'); + expect(callbackCount).toBe(0); + + subscription.remove(); + }); +}); diff --git a/example/__tests__/reload-handler.harness.ts b/example/__tests__/reload-handler.harness.ts new file mode 100644 index 0000000..f19887f --- /dev/null +++ b/example/__tests__/reload-handler.harness.ts @@ -0,0 +1,14 @@ +import { describe, expect, test } from 'react-native-harness'; +import { NativeReloadHandler, onReloadWithStateEvent } from 'mendix-native'; + +describe('NativeReloadHandler', () => { + test('exposes async control methods and a removable state listener', () => { + const subscription = onReloadWithStateEvent(() => {}); + + expect(typeof NativeReloadHandler.reload).toBe('function'); + expect(typeof NativeReloadHandler.exitApp).toBe('function'); + expect(typeof subscription.remove).toBe('function'); + + subscription.remove(); + }); +}); diff --git a/example/__tests__/storage.harness.ts b/example/__tests__/storage.harness.ts new file mode 100644 index 0000000..f78a3fc --- /dev/null +++ b/example/__tests__/storage.harness.ts @@ -0,0 +1,122 @@ +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { open } from '@op-engineering/op-sqlite'; +import { beforeEach, describe, expect, test } from 'react-native-harness'; +import { Storage } from 'mendix-native'; + +const DB_NAME = 'storage-harness.sqlite'; +const TABLE_NAME = 'storage_harness_records'; + +async function seedDatabase(): Promise { + const db = open({ name: DB_NAME }); + + await db.execute( + `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL)` + ); + await db.execute(`DELETE FROM ${TABLE_NAME}`); + await db.execute(`INSERT INTO ${TABLE_NAME} (value) VALUES (?)`, ['fixture']); + + db.close(); +} + +async function getRowCount(): Promise { + const db = open({ name: DB_NAME }); + const result = await db.execute( + `SELECT COUNT(*) AS count FROM ${TABLE_NAME}` + ); + const rowCount = Number(result.rows?.[0]?.count ?? 0); + + db.close(); + + return rowCount; +} + +async function tableExists(): Promise { + const db = open({ name: DB_NAME }); + const result = await db.execute( + "SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?", + [TABLE_NAME] + ); + const exists = result.rows.length > 0; + + db.close(); + + return exists; +} + +describe('Storage', () => { + beforeEach(async () => { + await AsyncStorage.clear(); + + try { + await Storage.closeDatabaseConnections(); + } catch { + // Ignore cleanup failures so the real test can surface the error. + } + + try { + await Storage.clearDatabases(); + } catch { + // Ignore cleanup failures so the real test can surface the error. + } + }); + + describe('clearAsyncStorage', () => { + test('removes previously persisted AsyncStorage keys', async () => { + await AsyncStorage.setItem('storage-harness:key-1', 'value-1'); + await AsyncStorage.setItem('storage-harness:key-2', 'value-2'); + + await Storage.clearAsyncStorage(); + + const values = await AsyncStorage.multiGet([ + 'storage-harness:key-1', + 'storage-harness:key-2', + ]); + + expect(values).toEqual([ + ['storage-harness:key-1', null], + ['storage-harness:key-2', null], + ]); + }); + }); + + describe('closeDatabaseConnections', () => { + test('closes active sqlite connections without deleting persisted data', async () => { + const db = open({ name: DB_NAME }); + + await db.execute( + `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL)` + ); + await db.execute(`DELETE FROM ${TABLE_NAME}`); + await db.execute(`INSERT INTO ${TABLE_NAME} (value) VALUES (?)`, [ + 'fixture', + ]); + + await Storage.closeDatabaseConnections(); + + expect(await getRowCount()).toBe(1); + }); + }); + + describe('clearDatabases', () => { + test('removes sqlite schema created through op-sqlite', async () => { + await seedDatabase(); + expect(await tableExists()).toBe(true); + + await Storage.clearDatabases(); + + expect(await tableExists()).toBe(false); + }); + }); + + describe('clearAll', () => { + test('clears AsyncStorage and sqlite state in one call', async () => { + await AsyncStorage.setItem('storage-harness:combined', 'present'); + await seedDatabase(); + + await Storage.clearAll(); + + expect(await AsyncStorage.getItem('storage-harness:combined')).toBe(null); + expect(await tableExists()).toBe(false); + }); + }); +}); From 083cfeb000f3e71d52ed93243708008fb2fa1dba Mon Sep 17 00:00:00 2001 From: vadymv-mendix Date: Fri, 8 May 2026 15:47:34 +0200 Subject: [PATCH 06/26] chore: update RN to v084 --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2bdd152..b8eae33 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "jest": "29.7.0", "lefthook": "2.1.3", "prettier": "3.4.2", - "react": "19.2.3", + "react": "19.2.4", "react-native": "0.84.1", "react-native-builder-bob": "0.40.18", "react-native-gesture-handler": "2.31.2", diff --git a/yarn.lock b/yarn.lock index cb221e4..8b8163b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9256,7 +9256,7 @@ __metadata: jest: "npm:29.7.0" lefthook: "npm:2.1.3" prettier: "npm:3.4.2" - react: "npm:19.2.3" + react: "npm:19.2.4" react-native: "npm:0.84.1" react-native-builder-bob: "npm:0.40.18" react-native-gesture-handler: "npm:2.31.2" From 5b6ca0329684ad0eb87777acb6d2e95ec8b90132 Mon Sep 17 00:00:00 2001 From: Yogendra Shelke <25844542+YogendraShelke@users.noreply.github.com> Date: Tue, 12 May 2026 15:23:37 +0530 Subject: [PATCH 07/26] refactor: streamline type definitions and remove unused code --- src/download-handler/NativeMxDownload.ts | 15 ++--------- src/download-handler/index.ts | 3 --- src/file-system/NativeMxFileSystem.ts | 32 +++++++++++------------- src/ota/NativeMxOta.ts | 16 ++---------- src/ota/index.ts | 14 ++++------- 5 files changed, 24 insertions(+), 56 deletions(-) diff --git a/src/download-handler/NativeMxDownload.ts b/src/download-handler/NativeMxDownload.ts index 9921e6d..6173c46 100644 --- a/src/download-handler/NativeMxDownload.ts +++ b/src/download-handler/NativeMxDownload.ts @@ -1,17 +1,6 @@ import { TurboModuleRegistry, type TurboModule } from 'react-native'; import type { CodegenTypes } from 'react-native'; -type GenericType = - | string - | number - | boolean - | null - | undefined - | { [key: string]: GenericType } - | GenericType[]; - -type GenericMap = { [key: string]: GenericType }; - type DownloadConfig = { connectionTimeout?: CodegenTypes.Int32; mimeType?: string; @@ -21,10 +10,10 @@ export interface Spec extends TurboModule { download( url: string, downloadPath: string, - config: GenericMap + config: DownloadConfig ): Promise; } export default TurboModuleRegistry.getEnforcing('MxDownload'); -export type { GenericMap, DownloadConfig }; +export type { DownloadConfig }; diff --git a/src/download-handler/index.ts b/src/download-handler/index.ts index d2de2a1..1dc9972 100644 --- a/src/download-handler/index.ts +++ b/src/download-handler/index.ts @@ -1,8 +1,5 @@ import NativeMxDownload from './NativeMxDownload'; -// Re-export DownloadConfig type for backward compatibility -export type { DownloadConfig } from './NativeMxDownload'; - export const NativeDownloadHandler = { download: (url: string, downloadPath: string, config: Record) => NativeMxDownload.download(url, downloadPath, config), diff --git a/src/file-system/NativeMxFileSystem.ts b/src/file-system/NativeMxFileSystem.ts index bafbe87..0505202 100644 --- a/src/file-system/NativeMxFileSystem.ts +++ b/src/file-system/NativeMxFileSystem.ts @@ -1,4 +1,8 @@ -import { TurboModuleRegistry, type TurboModule } from 'react-native'; +import { + TurboModuleRegistry, + type TurboModule, + type CodegenTypes, +} from 'react-native'; type BlobData = { blobId: string; @@ -9,21 +13,15 @@ type BlobData = { lastModified?: number; }; -type GenericType = - | string - | number - | boolean - | null - | undefined - | { [key: string]: GenericType } - | GenericType[]; - -type GenericMap = { [key: string]: GenericType }; -type GenericArray = GenericType[]; +type FsConstants = { + DocumentDirectoryPath: string; + SUPPORTS_DIRECTORY_MOVE: boolean; + SUPPORTS_ENCRYPTION: boolean; +}; export interface Spec extends TurboModule { - constants(): GenericMap; - save(blob: GenericMap, filePath: string): Promise; + constants(): FsConstants; + save(blob: BlobData, filePath: string): Promise; read(filePath: string): Promise; move(filePath: string, newPath: string): Promise; remove(filePath: string): Promise; @@ -31,11 +29,11 @@ export interface Spec extends TurboModule { readAsDataURL(filePath: string): Promise; readAsText(filePath: string): Promise; fileExists(filePath: string): Promise; - writeJson(data: GenericMap, filepath: string): Promise; - readJson(filepath: string): Promise; + writeJson(data: CodegenTypes.UnsafeObject, filepath: string): Promise; + readJson(filepath: string): Promise; setEncryptionEnabled(enabled: boolean): void; } export default TurboModuleRegistry.getEnforcing('MxFileSystem'); -export type { BlobData, GenericMap, GenericArray }; +export type { BlobData, FsConstants }; diff --git a/src/ota/NativeMxOta.ts b/src/ota/NativeMxOta.ts index 486d662..eb89732 100644 --- a/src/ota/NativeMxOta.ts +++ b/src/ota/NativeMxOta.ts @@ -1,17 +1,6 @@ import { TurboModuleRegistry, type TurboModule } from 'react-native'; import type { CodegenTypes } from 'react-native'; -type GenericType = - | string - | number - | boolean - | null - | undefined - | { [key: string]: GenericType } - | GenericType[]; - -type GenericMap = { [key: string]: GenericType }; - type OtaDownloadConfig = { url: string; }; @@ -32,15 +21,14 @@ type DownloadProgress = { }; export interface Spec extends TurboModule { - download(config: GenericMap): Promise; - deploy(config: GenericMap): Promise; + download(config: OtaDownloadConfig): Promise; + deploy(config: OtaDeployConfig): Promise; readonly onDownloadProgress: CodegenTypes.EventEmitter; } export default TurboModuleRegistry.getEnforcing('MxOta'); export type { - GenericMap, OtaDownloadConfig, OtaDeployConfig, OtaDownloadResponse, diff --git a/src/ota/index.ts b/src/ota/index.ts index f1435f9..4f9fefb 100644 --- a/src/ota/index.ts +++ b/src/ota/index.ts @@ -1,13 +1,9 @@ -import NativeMxOta from './NativeMxOta'; - -// Re-export types for backward compatibility -export type { - OtaDeployConfig, - OtaDownloadConfig, - OtaDownloadResponse, +import NativeMxOta, { + type OtaDeployConfig, + type OtaDownloadConfig, } from './NativeMxOta'; export const NativeOta = { - download: (config: Record) => NativeMxOta.download(config), - deploy: (config: Record) => NativeMxOta.deploy(config), + download: (config: OtaDownloadConfig) => NativeMxOta.download(config), + deploy: (config: OtaDeployConfig) => NativeMxOta.deploy(config), }; From 2b582de7b0a290521afe2035a77721a442ebb850 Mon Sep 17 00:00:00 2001 From: Yogendra Shelke <25844542+YogendraShelke@users.noreply.github.com> Date: Tue, 12 May 2026 15:28:31 +0530 Subject: [PATCH 08/26] chore: update hermes-engine and React-Core-prebuilt checksums in Podfile.lock --- example/ios/Podfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 2fb0a75..b271ea1 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2124,7 +2124,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBLazyVector: e97c19a5a442429d1988f182a1940fb08df514da - hermes-engine: 22eccaf19c439374e5cd56a3e71cf0ba6d19c2b4 + hermes-engine: a7179a4cd45fa3f8143712e52bd3c2d20b5274a0 MendixNative: 27efb5f8b34da919431b0ee534de0d552c58b259 op-sqlite: e9ef65bcf95a97863874cee87841425bb71c8396 OpenSSL-Universal: 9110d21982bb7e8b22a962b6db56a8aa805afde7 @@ -2136,7 +2136,7 @@ SPEC CHECKSUMS: React: 1ba7d364ade7d883a1ec055bfc3606f35fdee17b React-callinvoker: bc2a26f8d84fb01f003fc6de6c9337b64715f95b React-Core: 7840d3a80b43a95c5e80ef75146bd70925ebab0f - React-Core-prebuilt: 47c5816551bb8ab769edb186fa6b2290ad5fcbc5 + React-Core-prebuilt: a666604237ac1fb51754ee37234701cf197d851b React-CoreModules: 2eb010400b63b89e53a324ffb3c112e4c7c3ce42 React-cxxreact: a558e92199d26f145afa9e62c4233cf8e7950efe React-debug: 755200a6e7f5e6e0a40ff8d215493d43cce285fc @@ -2197,7 +2197,7 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: e96e93b493d8d86eeaee3e590ba0be53f6abe46f ReactCodegen: 797de5178718324c6eba3327b07f9a423fbd5787 ReactCommon: 07572bf9e687c8a52fbe4a3641e9e3a1a477c78e - ReactNativeDependencies: 8fb48ccd03b7da33b8d37ae401be080e71f782df + ReactNativeDependencies: 9ed9fcba1a22047730c895521de699bacbb90312 RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 RNGestureHandler: b4f6de20b30325ee40b693f558ad02213201ce91 SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef From 8eab392438776f4835151026ca1eb6d5a4ebd317 Mon Sep 17 00:00:00 2001 From: Yogendra Shelke <25844542+YogendraShelke@users.noreply.github.com> Date: Tue, 12 May 2026 16:47:38 +0530 Subject: [PATCH 09/26] feat: add RN_HARNESS configuration for app registry and view flattening --- example/.harness/manifest.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 example/.harness/manifest.js diff --git a/example/.harness/manifest.js b/example/.harness/manifest.js new file mode 100644 index 0000000..2ea24cc --- /dev/null +++ b/example/.harness/manifest.js @@ -0,0 +1,4 @@ +global.RN_HARNESS = { + appRegistryComponentName: 'App', + disableViewFlattening: false, +}; From 4886110ebeec468026c1464bd1eed44e9c67ec67 Mon Sep 17 00:00:00 2001 From: Yogendra Shelke <25844542+YogendraShelke@users.noreply.github.com> Date: Wed, 13 May 2026 17:36:26 +0530 Subject: [PATCH 10/26] chore: replace deprecated apis with modern --- .github/CI_DOCUMENTATION.md | 2 +- MendixNative.podspec | 4 +- android/build.gradle | 4 +- .../mendix/mendixnative/MendixInitializer.kt | 58 +-------- .../activity/MendixReactActivity.kt | 4 +- .../fragment/MendixReactFragment.kt | 4 +- .../mendix/mendixnative/react/ClearData.kt | 16 +-- .../com/mendix/mendixnative/react/CloseApp.kt | 2 +- .../mendix/mendixnative/react/ModuleHelper.kt | 24 +--- .../mendixnative/react/NativeErrorHandler.kt | 2 +- .../react/ToggleElementInspector.kt | 11 -- .../mendixnative/react/fs/NativeFsModule.kt | 7 +- .../mendixnative/react/menu/DevAppMenu.kt | 113 ---------------- .../com/mendixnative/MendixNativePackage.kt | 3 - .../mendixnative/storage/MxStorageModule.kt | 46 ------- .../src/main/res/layout/app_menu_layout.xml | 94 -------------- android/src/main/res/values/strings.xml | 17 --- example/__tests__/download-handler.harness.ts | 8 +- example/__tests__/storage.harness.ts | 122 ------------------ .../ios/MendixNativeExample/AppDelegate.swift | 40 +++++- example/ios/Podfile.lock | 2 +- example/src/App.tsx | 33 ++++- ios/Modules/Helper/DevHelper.swift | 6 +- ios/Modules/Helper/ReactAppProvider.swift | 45 ++----- ios/Modules/Helper/ReactHostHelper.h | 20 +++ ios/Modules/Helper/ReactHostHelper.mm | 66 ++++++++++ ios/Modules/Helper/UnsafeMxFunction.swift | 33 ----- .../NativeDownloadHandler.swift | 27 ++-- .../NativeFsModule/NativeFsModule.swift | 2 +- .../NativeOtaModule/NativeOtaModule.swift | 38 +++++- ios/Modules/ReactNative.swift | 2 +- ios/TurboModules/MxDownload/MxDownload.mm | 13 +- ios/TurboModules/MxOta/MxOta.mm | 19 ++- ios/TurboModules/MxReload/MxReload.h | 3 + ios/TurboModules/MxReload/MxReload.mm | 4 + ios/TurboModules/MxStorage/MxStorage.h | 4 - ios/TurboModules/MxStorage/MxStorage.mm | 58 --------- src/file-system/NativeMxFileSystem.ts | 2 +- src/index.ts | 1 - src/storage/NativeMxStorage.ts | 8 -- src/storage/index.ts | 97 -------------- 41 files changed, 278 insertions(+), 786 deletions(-) delete mode 100644 android/src/main/java/com/mendix/mendixnative/react/ToggleElementInspector.kt delete mode 100644 android/src/main/java/com/mendix/mendixnative/react/menu/DevAppMenu.kt delete mode 100644 android/src/main/java/com/mendixnative/storage/MxStorageModule.kt delete mode 100644 android/src/main/res/layout/app_menu_layout.xml delete mode 100644 android/src/main/res/values/strings.xml delete mode 100644 example/__tests__/storage.harness.ts create mode 100644 ios/Modules/Helper/ReactHostHelper.h create mode 100644 ios/Modules/Helper/ReactHostHelper.mm delete mode 100644 ios/Modules/Helper/UnsafeMxFunction.swift delete mode 100644 ios/TurboModules/MxStorage/MxStorage.h delete mode 100644 ios/TurboModules/MxStorage/MxStorage.mm delete mode 100644 src/storage/NativeMxStorage.ts delete mode 100644 src/storage/index.ts diff --git a/.github/CI_DOCUMENTATION.md b/.github/CI_DOCUMENTATION.md index da7baeb..677f51c 100644 --- a/.github/CI_DOCUMENTATION.md +++ b/.github/CI_DOCUMENTATION.md @@ -20,7 +20,7 @@ All workflows use standardized tooling versions to ensure consistency: | ---------------- | --------- | ----------------------------- | | **Node.js** | `24` | `.nvmrc` | | **Yarn** | `4.12.0` | `package.json#packageManager` | -| **React Native** | `0.83.4` | `package.json` | +| **React Native** | `0.84.1` | `package.json` | | **React** | `19.2.14` | `package.json` | | **TypeScript** | `5.9.3` | `package.json` | diff --git a/MendixNative.podspec b/MendixNative.podspec index 8ed9239..0328b65 100644 --- a/MendixNative.podspec +++ b/MendixNative.podspec @@ -14,8 +14,8 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/mendix/mendix-native.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,m,mm,cpp,swift}" - s.public_header_files = "ios/**/*.h" - s.private_header_files = "ios/**/*.h" + s.public_header_files = "ios/Modules/Helper/ReactHostHelper.h" + s.private_header_files = "ios/TurboModules/**/*.h" s.dependency "SSZipArchive" s.dependency "RNCAsyncStorage" diff --git a/android/build.gradle b/android/build.gradle index 2a0193c..b7a6b0f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -36,8 +36,6 @@ android { } buildFeatures { - dataBinding true - viewBinding true buildConfig true } @@ -88,7 +86,7 @@ dependencies { kapt 'com.github.bumptech.glide:compiler:4.12.0' - api "com.facebook.react:react-android:0.83.4" + api "com.facebook.react:react-android:0.84.1" api project(':op-engineering_op-sqlite') api project(':react-native-async-storage_async-storage') api project(':react-native-gesture-handler') diff --git a/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt b/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt index 53274b6..362988d 100644 --- a/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt +++ b/android/src/main/java/com/mendix/mendixnative/MendixInitializer.kt @@ -3,9 +3,6 @@ package com.mendix.mendixnative import android.app.Activity import android.view.MotionEvent import com.facebook.react.ReactHost -import com.facebook.react.ReactInstanceEventListener -import com.facebook.react.ReactNativeHost -import com.facebook.react.bridge.ReactContext import com.facebook.react.common.ShakeDetector import com.facebook.react.devsupport.DevSupportManagerBase import com.facebook.react.devsupport.attachMendixSupportManagerShakeDetector @@ -20,25 +17,16 @@ import com.mendix.mendixnative.react.MxConfiguration import com.mendix.mendixnative.react.clearCachedReactNativeDevBundle import com.mendix.mendixnative.react.clearData import com.mendix.mendixnative.react.closeSqlDatabaseConnection -import com.mendix.mendixnative.react.toggleElementInspector -import com.mendix.mendixnative.react.NativeReloadHandler class MendixInitializer( private val context: Activity, private val reactHost: ReactHost, - private val reactNativeHost: ReactNativeHost, private val hasRNDeveloperSupport: Boolean = false, -) : ReactInstanceEventListener { +) { private var shakeDetector: ShakeDetector? = null private var devMenuTouchEventHandler: DevMenuTouchEventHandler? = null - fun onCreate( - mendixApp: MendixApp, - devAppMenuHandler: DevAppMenuHandler = object : DevAppMenuHandler { - override fun showDevAppMenu() {} - }, - clearData: Boolean, - ) { + fun onCreate(mendixApp: MendixApp, clearData: Boolean) { // Assign mendix xas id interceptor to okhttp CookieEncryption.init(this.context) if (CookieEncryption.isCookieEncryptionEnabled()) { @@ -54,33 +42,9 @@ class MendixInitializer( MxConfiguration.warningsFilter = mendixApp.warningsFilter // This is here to make sure that a clean host instance is initialised. - restartReactInstanceManager() + reactHost.invalidate() if (clearData) clearData(context.application) if (hasRNDeveloperSupport) setupDeveloperApp(runtimeUrl, mendixApp) - if (mendixApp.attachCustomDeveloperMenu) attachCustomDeveloperMenu(devAppMenuHandler) - } - - private fun restartReactInstanceManager() { - if (reactNativeHost.hasInstance()) reactNativeHost.clear() - // Pre-initialize reactInstanceManager to be available for other methods - if (reactNativeHost.hasInstance()) reactNativeHost.reactInstanceManager - } - - private fun attachCustomDeveloperMenu(devAppMenuHandler: DevAppMenuHandler) { - devMenuTouchEventHandler = - DevMenuTouchEventHandler(object : DevMenuTouchEventHandler.DevMenuTouchListener { - override fun onTap() { - reactNativeHost.reactApplicationContext()?.let { - NativeReloadHandler(it).reload() - } - } - - override fun onLongPress() { - devAppMenuHandler.showDevAppMenu() - } - }) - - attachShakeDetector(devAppMenuHandler) } fun onDestroy() { @@ -89,29 +53,18 @@ class MendixInitializer( if (hasRNDeveloperSupport) { AppPreferences(context.applicationContext).setElementInspector(false) - reactHost.removeReactInstanceEventListener(this) } - - // We need to clear the host to allow for reinitialization of the Native Modules - // Especially for when switching between apps - reactNativeHost.clear() + reactHost.invalidate() // We need to close all databases separately to avoid hitting a read only state exception // Databases need to close after we are done closing the react native host to avoid db locks - closeSqlDatabaseConnection(reactNativeHost.reactApplicationContext()) + closeSqlDatabaseConnection(reactHost.currentReactContext) } fun stopShakeDetector() { shakeDetector?.stop() } - override fun onReactContextInitialized(context: ReactContext) { - val preferences = AppPreferences(context) - if (preferences.isElementInspectorEnabled) { - toggleElementInspector(context) - } - } - fun dispatchTouchEvent(ev: MotionEvent?): Boolean { return devMenuTouchEventHandler?.handle(ev) ?: false } @@ -139,7 +92,6 @@ class MendixInitializer( preferences.setDevMode((mendixApp.showExtendedDevMenu)) clearCachedReactNativeDevBundle(context.application) - reactHost.addReactInstanceEventListener(this) } } diff --git a/android/src/main/java/com/mendix/mendixnative/activity/MendixReactActivity.kt b/android/src/main/java/com/mendix/mendixnative/activity/MendixReactActivity.kt index 1e2b04a..d7651fd 100644 --- a/android/src/main/java/com/mendix/mendixnative/activity/MendixReactActivity.kt +++ b/android/src/main/java/com/mendix/mendixnative/activity/MendixReactActivity.kt @@ -31,8 +31,8 @@ open class MendixReactActivity : ReactActivity(), DevAppMenuHandler, LaunchScree ?: throw ClassCastException("Application needs to implement MendixApplication") mendixInitializer = - MendixInitializer(this, reactHost, reactNativeHost, mendixApplication.useDeveloperSupport) - mendixInitializer.onCreate(mendixApp!!, this, intent.getBooleanExtra(CLEAR_DATA, false)) + MendixInitializer(this, reactHost, mendixApplication.useDeveloperSupport) + mendixInitializer.onCreate(mendixApp!!, intent.getBooleanExtra(CLEAR_DATA, false)) super.onCreate(null) } diff --git a/android/src/main/java/com/mendix/mendixnative/fragment/MendixReactFragment.kt b/android/src/main/java/com/mendix/mendixnative/fragment/MendixReactFragment.kt index 2d44156..3ed4782 100644 --- a/android/src/main/java/com/mendix/mendixnative/fragment/MendixReactFragment.kt +++ b/android/src/main/java/com/mendix/mendixnative/fragment/MendixReactFragment.kt @@ -67,8 +67,8 @@ open class MendixReactFragment : ReactFragment(), MendixReactFragmentView { val hasRNDeveloperSupport = requireArguments().getBoolean(ARG_USE_DEVELOPER_SUPPORT, false) mendixInitializer = - MendixInitializer(requireActivity(), reactHost!!, reactNativeHost, hasRNDeveloperSupport).also { - it.onCreate(mendixApp!!, this, clearData) + MendixInitializer(requireActivity(), reactHost!!, hasRNDeveloperSupport).also { + it.onCreate(mendixApp!!, clearData) } super.onCreate(savedInstanceState) diff --git a/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt b/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt index 37b6a1b..6e654db 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/ClearData.kt @@ -5,7 +5,7 @@ import android.content.Context import android.util.Log import android.webkit.CookieManager import android.widget.Toast -import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactHost import com.facebook.react.bridge.ReactContext import com.facebook.react.modules.network.NetworkingModule import com.mendix.mendixnative.encryption.MendixEncryptedStorage @@ -34,9 +34,9 @@ fun clearData(applicationContext: Application) = clearCookies().also { fileBackend.deleteDirectory(applicationContext.filesDir) } -fun clearDataWithReactContext(applicationContext: Application, reactNativeHost: ReactNativeHost, cb: (success: Boolean) -> Unit) { +fun clearDataWithReactContext(applicationContext: Application, reactHost: ReactHost, cb: (success: Boolean) -> Unit) { clearCachedReactNativeDevBundle(applicationContext) - val reactContext = reactNativeHost.reactContext() + val reactContext = reactHost.currentReactContext val fileBackend = FileBackend(applicationContext) fileBackend.deleteDirectory(applicationContext.filesDir) val errorString = "Clearing %s failed. Please clear your data from the launch screen." @@ -57,7 +57,7 @@ fun clearDataWithReactContext(applicationContext: Application, reactNativeHost: reportError("database") } - if (!clearAsyncStorage(reactNativeHost)) { + if (!clearAsyncStorage(reactHost)) { reportError("async storage") } @@ -88,7 +88,7 @@ fun clearDataWithReactContext(applicationContext: Application, reactNativeHost: } fun deleteAppDatabaseAsync(reactContext: ReactContext?, cb: BooleanCallback) { - val opSQLiteModule = reactContext?.getNativeModule(OPSQLiteModule::class.java) + val opSQLiteModule = reactContext?.nativeModule(OPSQLiteModule.NAME) if (opSQLiteModule != null) { try { opSQLiteModule.deleteAllDBs() @@ -108,8 +108,8 @@ fun deleteAppDatabaseAsync(reactContext: ReactContext?, cb: BooleanCallback) { * Note: Previous implementation only checked module availability without clearing. * This now actually clears the storage using AsyncStorageModule.clear(). */ -fun clearAsyncStorage(reactNativeHost: ReactNativeHost): Boolean { - val asyncStorageModule = reactNativeHost.reactContext()?.getNativeModule(AsyncStorageModule::class.java) +fun clearAsyncStorage(reactHost: ReactHost): Boolean { + val asyncStorageModule = reactHost.nativeModule(AsyncStorageModule.NAME) if (asyncStorageModule != null) { try { // Clear AsyncStorage synchronously - clear() expects a callback but we're using fire-and-forget @@ -131,7 +131,7 @@ fun clearSecureStorage(context: Context?): Boolean = context?.let { MendixEncryptedStorage.getMendixEncryptedStorage(it).clear() } ?: false fun clearCookiesAsync(reactContext: ReactContext?, cb: (success: Boolean) -> Unit) { - val networkingModule = reactContext?.getNativeModule(NetworkingModule::class.java) + val networkingModule = reactContext?.nativeModule(NetworkingModule.NAME) if (networkingModule != null) { try { networkingModule.clearCookies { result -> diff --git a/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt b/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt index 2159c20..194d6d3 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/CloseApp.kt @@ -10,7 +10,7 @@ import com.op.sqlite.OPSQLiteModule * This is called during app shutdown to gracefully close database connections. */ fun closeSqlDatabaseConnection(reactContext: ReactContext?) { - val opSQLiteModule = reactContext?.getNativeModule(OPSQLiteModule::class.java) + val opSQLiteModule = reactContext?.nativeModule(OPSQLiteModule.NAME) if (opSQLiteModule != null) { try { opSQLiteModule.closeAllConnections() diff --git a/android/src/main/java/com/mendix/mendixnative/react/ModuleHelper.kt b/android/src/main/java/com/mendix/mendixnative/react/ModuleHelper.kt index b39c0f5..7068635 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/ModuleHelper.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/ModuleHelper.kt @@ -1,34 +1,24 @@ package com.mendix.mendixnative.react -import android.annotation.SuppressLint import android.util.Log import com.facebook.react.ReactApplication -import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactHost import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContext - -inline fun ReactContext.typeSafeNativeModule(): T? { +inline fun ReactContext.nativeModule(name: String): T? { return try { - getNativeModule(T::class.java) + getNativeModule(name) as? T } catch (e: Exception) { Log.e("ModuleAccess", "Error getting module ${T::class.simpleName}", e) null } } -inline fun ReactNativeHost.typeSafeNativeModule(): T? { - return reactContext()?.typeSafeNativeModule() -} - -fun ReactNativeHost.reactContext(): ReactContext? { - return reactInstanceManager.currentReactContext +inline fun ReactHost.nativeModule(name: String): T? { + return currentReactContext?.nativeModule(name) } -fun ReactNativeHost.reactApplicationContext(): ReactApplicationContext? { - val context = reactContext() - if (context is ReactApplicationContext) { - return context - } - return null +inline fun ReactApplicationContext.nativeModule(name: String): T? { + return (applicationContext as? ReactApplication)?.reactHost?.nativeModule(name) } diff --git a/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt b/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt index 515ec0d..a370d21 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/NativeErrorHandler.kt @@ -13,7 +13,7 @@ import com.facebook.react.modules.core.ExceptionsManagerModule class NativeErrorHandler(val reactContext: ReactApplicationContext) { fun handle(message: String?, stackTrace: ReadableArray?) { // Use typed module access instead of generic typeSafeNativeModule - val exceptionsManagerModule = reactContext.getNativeModule(ExceptionsManagerModule::class.java) + val exceptionsManagerModule = reactContext.nativeModule(ExceptionsManagerModule.NAME) exceptionsManagerModule?.reportSoftException(message, stackTrace, 0.0) // Note: updateExceptionMessage is not available in RN 0.77.1+ diff --git a/android/src/main/java/com/mendix/mendixnative/react/ToggleElementInspector.kt b/android/src/main/java/com/mendix/mendixnative/react/ToggleElementInspector.kt deleted file mode 100644 index a22381e..0000000 --- a/android/src/main/java/com/mendix/mendixnative/react/ToggleElementInspector.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.mendix.mendixnative.react - -import com.facebook.react.ReactInstanceManager -import com.facebook.react.bridge.ReactContext -import com.facebook.react.modules.core.DeviceEventManagerModule - -@CopiedFrom(ReactInstanceManager::class) -fun toggleElementInspector(context: ReactContext?) { - context?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) - ?.emit("toggleElementInspector", null) -} diff --git a/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt b/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt index 5d522e8..15add2a 100644 --- a/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt +++ b/android/src/main/java/com/mendix/mendixnative/react/fs/NativeFsModule.kt @@ -13,6 +13,7 @@ import com.fasterxml.jackson.core.JsonParseException import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.JsonMappingException import com.fasterxml.jackson.databind.ObjectMapper +import com.mendix.mendixnative.react.nativeModule import java.io.File import java.io.FileNotFoundException import java.io.IOException @@ -29,7 +30,7 @@ class NativeFsModule(private val reactContext: ReactApplicationContext) { } fun save(blob: ReadableMap, filePath: String, promise: Promise) { - val blobModule = reactContext.getNativeModule(BlobModule::class.java) + val blobModule = reactContext.nativeModule(BlobModule.NAME) val blobId: String = blob.getString("blobId") ?: run { promise.reject(ERROR_INVALID_BLOB, "The specified blob is invalid") return @@ -149,7 +150,7 @@ class NativeFsModule(private val reactContext: ReactApplicationContext) { fun readAsDataURL(filePath: String, promise: Promise) { try { val fileReaderModule = - reactContext.getNativeModule(FileReaderModule::class.java) + reactContext.nativeModule(FileReaderModule.NAME) fileReaderModule!!.readAsDataURL(read(ensureWhiteListedPath(filePath)), promise) } catch (_: FileNotFoundException) { promise.resolve(null) @@ -241,7 +242,7 @@ class NativeFsModule(private val reactContext: ReactApplicationContext) { private fun read(filePath: String): ReadableMap { val data = fileBackend.read(filePath) - val blobModule = reactContext.getNativeModule(BlobModule::class.java) + val blobModule = reactContext.nativeModule(BlobModule.NAME) val blob: WritableMap = WritableNativeMap() blob.putString("blobId", blobModule!!.store(data)) blob.putInt("offset", 0) diff --git a/android/src/main/java/com/mendix/mendixnative/react/menu/DevAppMenu.kt b/android/src/main/java/com/mendix/mendixnative/react/menu/DevAppMenu.kt deleted file mode 100644 index 51396fb..0000000 --- a/android/src/main/java/com/mendix/mendixnative/react/menu/DevAppMenu.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.mendix.mendixnative.react.menu - -import android.app.Activity -import android.app.AlertDialog -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.widget.Toast -import com.mendix.mendixnative.MendixApplication -import com.mendixnative.R -import com.mendixnative.databinding.AppMenuLayoutBinding -import com.mendix.mendixnative.config.AppPreferences -import com.mendix.mendixnative.react.clearDataWithReactContext -import com.mendix.mendixnative.react.reactContext -import com.mendix.mendixnative.react.toggleElementInspector - -class DevAppMenu( - val activity: Activity, - isDevModeEnabled: Boolean = false, - handleReload: () -> Unit, - onCloseProjectSelected: (() -> Unit)? = null -) : AppMenu { - private val dialog: AlertDialog - - init { - val preferences = AppPreferences(activity.applicationContext) - val binding = AppMenuLayoutBinding.inflate(LayoutInflater.from(activity)) - val view = binding.root - - binding.advancedSettingsButton - - dialog = AlertDialog.Builder(activity) - .setView(view) - .create() - - binding.advancedSettingsContainer.visibility = View.GONE - binding.advancedSettingsButton.visibility = visibleWhenDevModeEnabled(isDevModeEnabled) - binding.advancedSettingsButton.setOnClickListener { - binding.advancedSettingsContainer.visibility = - when (binding.advancedSettingsContainer.visibility) { - (View.GONE) -> View.VISIBLE - else -> View.GONE - } - } - - binding.remoteDebuggingButton.visibility = visibleWhenDevModeEnabled(isDevModeEnabled) - binding.remoteDebuggingButton.text = - activity.resources.getText(remoteDebugginButtonTextResource(preferences.isRemoteJSDebugEnabled)) - binding.remoteDebuggingButton.setOnClickListener { - preferences.setRemoteDebugging(!preferences.isRemoteJSDebugEnabled) - handleReload() - binding.remoteDebuggingButton.text = - activity.resources.getText(remoteDebugginButtonTextResource(preferences.isRemoteJSDebugEnabled)) - dialog.dismiss() - } - - binding.advancedClearData.setOnClickListener { - activity.runOnUiThread { - clearDataWithReactContext( - activity.application, - (activity.application as MendixApplication).reactNativeHost - ) { success: Boolean -> - if (success) { - activity.runOnUiThread { - handleReload() - } - } else { - Toast.makeText(activity, "Clearing data failed.", Toast.LENGTH_LONG).show() - } - } - } - dialog.dismiss() - } - - binding.elementInspectorButton.visibility = visibleWhenDevModeEnabled(isDevModeEnabled) - binding.elementInspectorButton.setOnClickListener { - preferences.setElementInspector(!preferences.isElementInspectorEnabled) - toggleElementInspector((activity.application as MendixApplication).reactNativeHost.reactContext()) - dialog.dismiss() - } - - binding.reloadButton.setOnClickListener { - handleReload() - dialog.dismiss() - } - - binding.closeButton.setOnClickListener { - dialog.dismiss() - onCloseProjectSelected?.invoke() - } - } - - override fun show() { - if (!activity.isDestroyed) { - dialog.show() - } else { - Log.d("DevAppMenu", "Attempted to show dialog in a destroyed activity") - } - } - - private fun visibleWhenDevModeEnabled(devModeEnabled: Boolean): Int = if (devModeEnabled) { - View.VISIBLE - } else { - View.GONE - } - - private fun remoteDebugginButtonTextResource(isRemoteJsDebugEnabled: Boolean): Int = - if (isRemoteJsDebugEnabled) { - R.string.dev_menu_disable_remote_debugging - } else { - R.string.dev_menu_enable_remote_debugging - } -} diff --git a/android/src/main/java/com/mendixnative/MendixNativePackage.kt b/android/src/main/java/com/mendixnative/MendixNativePackage.kt index e70de7b..9560089 100644 --- a/android/src/main/java/com/mendixnative/MendixNativePackage.kt +++ b/android/src/main/java/com/mendixnative/MendixNativePackage.kt @@ -16,7 +16,6 @@ import com.mendixnative.navigation.MxNavigationModule import com.mendixnative.ota.MxOtaModule import com.mendixnative.reload.MxReloadModule import com.mendixnative.splash.MxSplashScreenModule -import com.mendixnative.storage.MxStorageModule import java.util.HashMap class MendixNativePackage : BaseReactPackage() { @@ -32,7 +31,6 @@ class MendixNativePackage : BaseReactPackage() { module } MxFileSystemModule.NAME -> MxFileSystemModule(reactContext) - MxStorageModule.NAME -> MxStorageModule(reactContext) MxOtaModule.NAME -> MxOtaModule(reactContext) MxDownloadModule.NAME -> MxDownloadModule(reactContext) MxReloadModule.NAME -> MxReloadModule(reactContext) @@ -51,7 +49,6 @@ class MendixNativePackage : BaseReactPackage() { MxEncryptionModule.NAME, MxSplashScreenModule.NAME, MxFileSystemModule.NAME, - MxStorageModule.NAME, MxOtaModule.NAME, MxDownloadModule.NAME, MxReloadModule.NAME, diff --git a/android/src/main/java/com/mendixnative/storage/MxStorageModule.kt b/android/src/main/java/com/mendixnative/storage/MxStorageModule.kt deleted file mode 100644 index b726c9c..0000000 --- a/android/src/main/java/com/mendixnative/storage/MxStorageModule.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.mendixnative.storage - -import com.facebook.react.bridge.Promise -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.module.annotations.ReactModule -import com.mendixnative.NativeMxStorageSpec -import com.op.sqlite.OPSQLiteModule - -@ReactModule(name = MxStorageModule.NAME) -class MxStorageModule(reactContext: ReactApplicationContext) : - NativeMxStorageSpec(reactContext) { - - override fun getName(): String = NAME - - override fun clearDatabases(promise: Promise) { - val opSQLiteModule = reactApplicationContext.getNativeModule(OPSQLiteModule::class.java) - if (opSQLiteModule != null) { - try { - opSQLiteModule.deleteAllDBs() - promise.resolve(null) - } catch (e: Exception) { - promise.reject("STORAGE_CLEAR_FAILED", "Failed to clear databases: ${e.message}", e) - } - } else { - promise.reject("MODULE_NOT_FOUND", "OPSQLiteModule not available") - } - } - - override fun closeDatabaseConnections(promise: Promise) { - val opSQLiteModule = reactApplicationContext.getNativeModule(OPSQLiteModule::class.java) - if (opSQLiteModule != null) { - try { - opSQLiteModule.closeAllConnections() - promise.resolve(null) - } catch (e: Exception) { - promise.reject("STORAGE_CLOSE_FAILED", "Failed to close database connections: ${e.message}", e) - } - } else { - promise.reject("MODULE_NOT_FOUND", "OPSQLiteModule not available") - } - } - - companion object { - const val NAME = "MxStorage" - } -} diff --git a/android/src/main/res/layout/app_menu_layout.xml b/android/src/main/res/layout/app_menu_layout.xml deleted file mode 100644 index ce948e6..0000000 --- a/android/src/main/res/layout/app_menu_layout.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - -