diff --git a/apps/bare-expo/macos/Podfile.lock b/apps/bare-expo/macos/Podfile.lock
index 71f8ee3e21cb40..d24fad222ffb5c 100644
--- a/apps/bare-expo/macos/Podfile.lock
+++ b/apps/bare-expo/macos/Podfile.lock
@@ -3,11 +3,11 @@ PODS:
- DoubleConversion (1.1.6)
- EASClient (55.0.2):
- ExpoModulesCore
- - EXConstants (55.0.2):
+ - EXConstants (55.0.7):
- ExpoModulesCore
- - EXManifests (55.0.3):
+ - EXManifests (55.0.9):
- ExpoModulesCore
- - Expo (55.0.0-preview.7):
+ - Expo (55.0.2):
- boost
- DoubleConversion
- ExpoModulesCore
@@ -38,17 +38,17 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - expo-dev-client (55.0.3):
+ - expo-dev-client (55.0.9):
- EXManifests
- expo-dev-launcher
- expo-dev-menu
- expo-dev-menu-interface
- EXUpdatesInterface
- - expo-dev-launcher (55.0.4):
+ - expo-dev-launcher (55.0.10):
- boost
- DoubleConversion
- EXManifests
- - expo-dev-launcher/Main (= 55.0.4)
+ - expo-dev-launcher/Main (= 55.0.10)
- expo-dev-menu
- expo-dev-menu-interface
- ExpoModulesCore
@@ -81,7 +81,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - expo-dev-launcher/Main (55.0.4):
+ - expo-dev-launcher/Main (55.0.10):
- boost
- DoubleConversion
- EXManifests
@@ -118,7 +118,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - expo-dev-launcher/Unsafe (55.0.4):
+ - expo-dev-launcher/Unsafe (55.0.10):
- boost
- DoubleConversion
- EXManifests
@@ -154,10 +154,10 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - expo-dev-menu (55.0.3):
+ - expo-dev-menu (55.0.9):
- boost
- DoubleConversion
- - expo-dev-menu/Main (= 55.0.3)
+ - expo-dev-menu/Main (= 55.0.9)
- fast_float
- fmt
- glog
@@ -184,7 +184,7 @@ PODS:
- SocketRocket
- Yoga
- expo-dev-menu-interface (55.0.1)
- - expo-dev-menu/Main (55.0.3):
+ - expo-dev-menu/Main (55.0.9):
- boost
- DoubleConversion
- EXManifests
@@ -216,25 +216,25 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - ExpoAsset (55.0.2):
+ - ExpoAsset (55.0.7):
- ExpoModulesCore
- - ExpoCrypto (55.0.3):
+ - ExpoCrypto (55.0.8):
- ExpoModulesCore
- - ExpoFileSystem (55.0.3):
+ - ExpoFileSystem (55.0.9):
- ExpoModulesCore
- - ExpoFont (55.0.3):
+ - ExpoFont (55.0.4):
- ExpoModulesCore
- - ExpoKeepAwake (55.0.2):
+ - ExpoKeepAwake (55.0.4):
- ExpoModulesCore
- - ExpoLinking (55.0.3):
+ - ExpoLinking (55.0.7):
- ExpoModulesCore
- - ExpoLocalAuthentication (55.0.3):
+ - ExpoLocalAuthentication (55.0.8):
- ExpoModulesCore
- - ExpoLogBox (55.0.3):
+ - ExpoLogBox (55.0.7):
- React-Core
- - ExpoMeshGradient (55.0.3):
+ - ExpoMeshGradient (55.0.8):
- ExpoModulesCore
- - ExpoModulesCore (55.0.5):
+ - ExpoModulesCore (55.0.12):
- boost
- DoubleConversion
- ExpoModulesJSI
@@ -265,16 +265,17 @@ PODS:
- RNWorklets
- SocketRocket
- Yoga
- - ExpoModulesJSI (55.0.5):
+ - ExpoModulesJSI (55.0.12):
- hermes-engine
- React-Core
+ - React-runtimescheduler
- ReactCommon
- - ExpoSQLite (55.0.3):
+ - ExpoSQLite (55.0.10):
- ExpoModulesCore
- - ExpoWebBrowser (55.0.3):
+ - ExpoWebBrowser (55.0.9):
- ExpoModulesCore
- EXStructuredHeaders (55.0.0)
- - EXUpdates (55.0.5):
+ - EXUpdates (55.0.11):
- boost
- DoubleConversion
- EASClient
@@ -308,15 +309,15 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - EXUpdatesInterface (55.1.1):
+ - EXUpdatesInterface (55.1.3):
- ExpoModulesCore
- fast_float (8.0.0)
- - FBLazyVector (0.81.1)
+ - FBLazyVector (0.81.3)
- fmt (11.0.2)
- glog (0.3.5)
- - hermes-engine (0.81.5):
- - hermes-engine/Pre-built (= 0.81.5)
- - hermes-engine/Pre-built (0.81.5)
+ - hermes-engine (0.81.6):
+ - hermes-engine/Pre-built (= 0.81.6)
+ - hermes-engine/Pre-built (0.81.6)
- lottie-ios (4.5.0)
- lottie-react-native (7.3.4):
- boost
@@ -366,28 +367,28 @@ PODS:
- fast_float (= 8.0.0)
- fmt (= 11.0.2)
- glog
- - RCTDeprecation (0.81.1)
- - RCTRequired (0.81.1)
- - RCTTypeSafety (0.81.1):
- - FBLazyVector (= 0.81.1)
- - RCTRequired (= 0.81.1)
- - React-Core (= 0.81.1)
+ - RCTDeprecation (0.81.3)
+ - RCTRequired (0.81.3)
+ - RCTTypeSafety (0.81.3):
+ - FBLazyVector (= 0.81.3)
+ - RCTRequired (= 0.81.3)
+ - React-Core (= 0.81.3)
- ReachabilitySwift (5.2.4)
- - React (0.81.1):
- - React-Core (= 0.81.1)
- - React-Core/DevSupport (= 0.81.1)
- - React-Core/RCTWebSocket (= 0.81.1)
- - React-RCTActionSheet (= 0.81.1)
- - React-RCTAnimation (= 0.81.1)
- - React-RCTBlob (= 0.81.1)
- - React-RCTImage (= 0.81.1)
- - React-RCTLinking (= 0.81.1)
- - React-RCTNetwork (= 0.81.1)
- - React-RCTSettings (= 0.81.1)
- - React-RCTText (= 0.81.1)
- - React-RCTVibration (= 0.81.1)
- - React-callinvoker (0.81.1)
- - React-Core (0.81.1):
+ - React (0.81.3):
+ - React-Core (= 0.81.3)
+ - React-Core/DevSupport (= 0.81.3)
+ - React-Core/RCTWebSocket (= 0.81.3)
+ - React-RCTActionSheet (= 0.81.3)
+ - React-RCTAnimation (= 0.81.3)
+ - React-RCTBlob (= 0.81.3)
+ - React-RCTImage (= 0.81.3)
+ - React-RCTLinking (= 0.81.3)
+ - React-RCTNetwork (= 0.81.3)
+ - React-RCTSettings (= 0.81.3)
+ - React-RCTText (= 0.81.3)
+ - React-RCTVibration (= 0.81.3)
+ - React-callinvoker (0.81.3)
+ - React-Core (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -397,7 +398,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- RCTDeprecation
- - React-Core/Default (= 0.81.1)
+ - React-Core/Default (= 0.81.3)
- React-cxxreact
- React-featureflags
- React-hermes
@@ -412,7 +413,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/CoreModulesHeaders (0.81.1):
+ - React-Core/CoreModulesHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -437,7 +438,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/Default (0.81.1):
+ - React-Core/Default (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -461,7 +462,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/DevSupport (0.81.1):
+ - React-Core/DevSupport (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -471,8 +472,8 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- RCTDeprecation
- - React-Core/Default (= 0.81.1)
- - React-Core/RCTWebSocket (= 0.81.1)
+ - React-Core/Default (= 0.81.3)
+ - React-Core/RCTWebSocket (= 0.81.3)
- React-cxxreact
- React-featureflags
- React-hermes
@@ -487,7 +488,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTActionSheetHeaders (0.81.1):
+ - React-Core/RCTActionSheetHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -512,7 +513,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTAnimationHeaders (0.81.1):
+ - React-Core/RCTAnimationHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -537,7 +538,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTBlobHeaders (0.81.1):
+ - React-Core/RCTBlobHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -562,7 +563,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTImageHeaders (0.81.1):
+ - React-Core/RCTImageHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -587,7 +588,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTLinkingHeaders (0.81.1):
+ - React-Core/RCTLinkingHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -612,7 +613,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTNetworkHeaders (0.81.1):
+ - React-Core/RCTNetworkHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -637,7 +638,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTSettingsHeaders (0.81.1):
+ - React-Core/RCTSettingsHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -662,7 +663,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTTextHeaders (0.81.1):
+ - React-Core/RCTTextHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -687,7 +688,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTVibrationHeaders (0.81.1):
+ - React-Core/RCTVibrationHeaders (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -712,7 +713,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-Core/RCTWebSocket (0.81.1):
+ - React-Core/RCTWebSocket (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -722,7 +723,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- RCTDeprecation
- - React-Core/Default (= 0.81.1)
+ - React-Core/Default (= 0.81.3)
- React-cxxreact
- React-featureflags
- React-hermes
@@ -737,7 +738,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-CoreModules (0.81.1):
+ - React-CoreModules (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -745,20 +746,20 @@ PODS:
- glog
- RCT-Folly
- RCT-Folly/Fabric
- - RCTTypeSafety (= 0.81.1)
- - React-Core/CoreModulesHeaders (= 0.81.1)
- - React-jsi (= 0.81.1)
+ - RCTTypeSafety (= 0.81.3)
+ - React-Core/CoreModulesHeaders (= 0.81.3)
+ - React-jsi (= 0.81.3)
- React-jsinspector
- React-jsinspectorcdp
- React-jsinspectortracing
- React-NativeModulesApple
- React-RCTBlob
- React-RCTFBReactNativeSpec
- - React-RCTImage (= 0.81.1)
+ - React-RCTImage (= 0.81.3)
- React-runtimeexecutor
- ReactCommon
- SocketRocket
- - React-cxxreact (0.81.1):
+ - React-cxxreact (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -767,19 +768,19 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - React-callinvoker (= 0.81.1)
- - React-debug (= 0.81.1)
- - React-jsi (= 0.81.1)
+ - React-callinvoker (= 0.81.3)
+ - React-debug (= 0.81.3)
+ - React-jsi (= 0.81.3)
- React-jsinspector
- React-jsinspectorcdp
- React-jsinspectortracing
- - React-logger (= 0.81.1)
- - React-perflogger (= 0.81.1)
+ - React-logger (= 0.81.3)
+ - React-perflogger (= 0.81.3)
- React-runtimeexecutor
- - React-timing (= 0.81.1)
+ - React-timing (= 0.81.3)
- SocketRocket
- - React-debug (0.81.1)
- - React-defaultsnativemodule (0.81.1):
+ - React-debug (0.81.3)
+ - React-defaultsnativemodule (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -796,7 +797,7 @@ PODS:
- React-microtasksnativemodule
- React-RCTFBReactNativeSpec
- SocketRocket
- - React-domnativemodule (0.81.1):
+ - React-domnativemodule (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -816,7 +817,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-Fabric (0.81.1):
+ - React-Fabric (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -830,23 +831,23 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/animations (= 0.81.1)
- - React-Fabric/attributedstring (= 0.81.1)
- - React-Fabric/bridging (= 0.81.1)
- - React-Fabric/componentregistry (= 0.81.1)
- - React-Fabric/componentregistrynative (= 0.81.1)
- - React-Fabric/components (= 0.81.1)
- - React-Fabric/consistency (= 0.81.1)
- - React-Fabric/core (= 0.81.1)
- - React-Fabric/dom (= 0.81.1)
- - React-Fabric/imagemanager (= 0.81.1)
- - React-Fabric/leakchecker (= 0.81.1)
- - React-Fabric/mounting (= 0.81.1)
- - React-Fabric/observers (= 0.81.1)
- - React-Fabric/scheduler (= 0.81.1)
- - React-Fabric/telemetry (= 0.81.1)
- - React-Fabric/templateprocessor (= 0.81.1)
- - React-Fabric/uimanager (= 0.81.1)
+ - React-Fabric/animations (= 0.81.3)
+ - React-Fabric/attributedstring (= 0.81.3)
+ - React-Fabric/bridging (= 0.81.3)
+ - React-Fabric/componentregistry (= 0.81.3)
+ - React-Fabric/componentregistrynative (= 0.81.3)
+ - React-Fabric/components (= 0.81.3)
+ - React-Fabric/consistency (= 0.81.3)
+ - React-Fabric/core (= 0.81.3)
+ - React-Fabric/dom (= 0.81.3)
+ - React-Fabric/imagemanager (= 0.81.3)
+ - React-Fabric/leakchecker (= 0.81.3)
+ - React-Fabric/mounting (= 0.81.3)
+ - React-Fabric/observers (= 0.81.3)
+ - React-Fabric/scheduler (= 0.81.3)
+ - React-Fabric/telemetry (= 0.81.3)
+ - React-Fabric/templateprocessor (= 0.81.3)
+ - React-Fabric/uimanager (= 0.81.3)
- React-featureflags
- React-graphics
- React-jsi
@@ -858,7 +859,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/animations (0.81.1):
+ - React-Fabric/animations (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -883,7 +884,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/attributedstring (0.81.1):
+ - React-Fabric/attributedstring (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -908,7 +909,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/bridging (0.81.1):
+ - React-Fabric/bridging (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -933,7 +934,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/componentregistry (0.81.1):
+ - React-Fabric/componentregistry (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -958,7 +959,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/componentregistrynative (0.81.1):
+ - React-Fabric/componentregistrynative (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -983,7 +984,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/components (0.81.1):
+ - React-Fabric/components (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -997,10 +998,10 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/components/legacyviewmanagerinterop (= 0.81.1)
- - React-Fabric/components/root (= 0.81.1)
- - React-Fabric/components/scrollview (= 0.81.1)
- - React-Fabric/components/view (= 0.81.1)
+ - React-Fabric/components/legacyviewmanagerinterop (= 0.81.3)
+ - React-Fabric/components/root (= 0.81.3)
+ - React-Fabric/components/scrollview (= 0.81.3)
+ - React-Fabric/components/view (= 0.81.3)
- React-featureflags
- React-graphics
- React-jsi
@@ -1012,7 +1013,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/components/legacyviewmanagerinterop (0.81.1):
+ - React-Fabric/components/legacyviewmanagerinterop (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1037,7 +1038,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/components/root (0.81.1):
+ - React-Fabric/components/root (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1062,7 +1063,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/components/scrollview (0.81.1):
+ - React-Fabric/components/scrollview (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1087,7 +1088,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/components/view (0.81.1):
+ - React-Fabric/components/view (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1114,7 +1115,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-Fabric/consistency (0.81.1):
+ - React-Fabric/consistency (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1139,7 +1140,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/core (0.81.1):
+ - React-Fabric/core (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1164,7 +1165,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/dom (0.81.1):
+ - React-Fabric/dom (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1189,7 +1190,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/imagemanager (0.81.1):
+ - React-Fabric/imagemanager (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1214,7 +1215,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/leakchecker (0.81.1):
+ - React-Fabric/leakchecker (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1239,7 +1240,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/mounting (0.81.1):
+ - React-Fabric/mounting (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1264,7 +1265,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/observers (0.81.1):
+ - React-Fabric/observers (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1278,7 +1279,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/observers/events (= 0.81.1)
+ - React-Fabric/observers/events (= 0.81.3)
- React-featureflags
- React-graphics
- React-jsi
@@ -1290,7 +1291,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/observers/events (0.81.1):
+ - React-Fabric/observers/events (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1315,7 +1316,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/scheduler (0.81.1):
+ - React-Fabric/scheduler (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1342,7 +1343,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/telemetry (0.81.1):
+ - React-Fabric/telemetry (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1367,7 +1368,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/templateprocessor (0.81.1):
+ - React-Fabric/templateprocessor (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1392,7 +1393,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/uimanager (0.81.1):
+ - React-Fabric/uimanager (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1406,7 +1407,7 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/uimanager/consistency (= 0.81.1)
+ - React-Fabric/uimanager/consistency (= 0.81.3)
- React-featureflags
- React-graphics
- React-jsi
@@ -1419,7 +1420,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-Fabric/uimanager/consistency (0.81.1):
+ - React-Fabric/uimanager/consistency (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1445,7 +1446,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- SocketRocket
- - React-FabricComponents (0.81.1):
+ - React-FabricComponents (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1460,8 +1461,8 @@ PODS:
- React-cxxreact
- React-debug
- React-Fabric
- - React-FabricComponents/components (= 0.81.1)
- - React-FabricComponents/textlayoutmanager (= 0.81.1)
+ - React-FabricComponents/components (= 0.81.3)
+ - React-FabricComponents/textlayoutmanager (= 0.81.3)
- React-featureflags
- React-graphics
- React-jsi
@@ -1474,7 +1475,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components (0.81.1):
+ - React-FabricComponents/components (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1489,17 +1490,17 @@ PODS:
- React-cxxreact
- React-debug
- React-Fabric
- - React-FabricComponents/components/inputaccessory (= 0.81.1)
- - React-FabricComponents/components/iostextinput (= 0.81.1)
- - React-FabricComponents/components/modal (= 0.81.1)
- - React-FabricComponents/components/rncore (= 0.81.1)
- - React-FabricComponents/components/safeareaview (= 0.81.1)
- - React-FabricComponents/components/scrollview (= 0.81.1)
- - React-FabricComponents/components/switch (= 0.81.1)
- - React-FabricComponents/components/text (= 0.81.1)
- - React-FabricComponents/components/textinput (= 0.81.1)
- - React-FabricComponents/components/unimplementedview (= 0.81.1)
- - React-FabricComponents/components/virtualview (= 0.81.1)
+ - React-FabricComponents/components/inputaccessory (= 0.81.3)
+ - React-FabricComponents/components/iostextinput (= 0.81.3)
+ - React-FabricComponents/components/modal (= 0.81.3)
+ - React-FabricComponents/components/rncore (= 0.81.3)
+ - React-FabricComponents/components/safeareaview (= 0.81.3)
+ - React-FabricComponents/components/scrollview (= 0.81.3)
+ - React-FabricComponents/components/switch (= 0.81.3)
+ - React-FabricComponents/components/text (= 0.81.3)
+ - React-FabricComponents/components/textinput (= 0.81.3)
+ - React-FabricComponents/components/unimplementedview (= 0.81.3)
+ - React-FabricComponents/components/virtualview (= 0.81.3)
- React-featureflags
- React-graphics
- React-jsi
@@ -1512,7 +1513,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/inputaccessory (0.81.1):
+ - React-FabricComponents/components/inputaccessory (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1539,7 +1540,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/iostextinput (0.81.1):
+ - React-FabricComponents/components/iostextinput (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1566,7 +1567,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/modal (0.81.1):
+ - React-FabricComponents/components/modal (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1593,7 +1594,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/rncore (0.81.1):
+ - React-FabricComponents/components/rncore (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1620,7 +1621,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/safeareaview (0.81.1):
+ - React-FabricComponents/components/safeareaview (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1647,7 +1648,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/scrollview (0.81.1):
+ - React-FabricComponents/components/scrollview (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1674,7 +1675,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/switch (0.81.1):
+ - React-FabricComponents/components/switch (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1701,7 +1702,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/text (0.81.1):
+ - React-FabricComponents/components/text (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1728,7 +1729,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/textinput (0.81.1):
+ - React-FabricComponents/components/textinput (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1755,7 +1756,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/unimplementedview (0.81.1):
+ - React-FabricComponents/components/unimplementedview (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1782,7 +1783,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/components/virtualview (0.81.1):
+ - React-FabricComponents/components/virtualview (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1809,7 +1810,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricComponents/textlayoutmanager (0.81.1):
+ - React-FabricComponents/textlayoutmanager (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1836,7 +1837,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-FabricImage (0.81.1):
+ - React-FabricImage (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1845,21 +1846,21 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - RCTRequired (= 0.81.1)
- - RCTTypeSafety (= 0.81.1)
+ - RCTRequired (= 0.81.3)
+ - RCTTypeSafety (= 0.81.3)
- React-Fabric
- React-featureflags
- React-graphics
- React-ImageManager
- React-jsi
- - React-jsiexecutor (= 0.81.1)
+ - React-jsiexecutor (= 0.81.3)
- React-logger
- React-rendererdebug
- React-utils
- ReactCommon
- SocketRocket
- Yoga
- - React-featureflags (0.81.1):
+ - React-featureflags (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1868,7 +1869,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- SocketRocket
- - React-featureflagsnativemodule (0.81.1):
+ - React-featureflagsnativemodule (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1883,7 +1884,7 @@ PODS:
- React-RCTFBReactNativeSpec
- ReactCommon/turbomodule/core
- SocketRocket
- - React-graphics (0.81.1):
+ - React-graphics (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1897,7 +1898,7 @@ PODS:
- React-jsiexecutor
- React-utils
- SocketRocket
- - React-hermes (0.81.1):
+ - React-hermes (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1906,16 +1907,16 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - React-cxxreact (= 0.81.1)
+ - React-cxxreact (= 0.81.3)
- React-jsi
- - React-jsiexecutor (= 0.81.1)
+ - React-jsiexecutor (= 0.81.3)
- React-jsinspector
- React-jsinspectorcdp
- React-jsinspectortracing
- - React-perflogger (= 0.81.1)
+ - React-perflogger (= 0.81.3)
- React-runtimeexecutor
- SocketRocket
- - React-idlecallbacksnativemodule (0.81.1):
+ - React-idlecallbacksnativemodule (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1931,7 +1932,7 @@ PODS:
- React-runtimescheduler
- ReactCommon/turbomodule/core
- SocketRocket
- - React-ImageManager (0.81.1):
+ - React-ImageManager (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1946,7 +1947,7 @@ PODS:
- React-rendererdebug
- React-utils
- SocketRocket
- - React-jserrorhandler (0.81.1):
+ - React-jserrorhandler (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1961,7 +1962,7 @@ PODS:
- React-jsi
- ReactCommon/turbomodule/bridging
- SocketRocket
- - React-jsi (0.81.1):
+ - React-jsi (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1971,7 +1972,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- SocketRocket
- - React-jsiexecutor (0.81.1):
+ - React-jsiexecutor (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -1980,15 +1981,15 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - React-cxxreact (= 0.81.1)
- - React-jsi (= 0.81.1)
+ - React-cxxreact (= 0.81.3)
+ - React-jsi (= 0.81.3)
- React-jsinspector
- React-jsinspectorcdp
- React-jsinspectortracing
- - React-perflogger (= 0.81.1)
+ - React-perflogger (= 0.81.3)
- React-runtimeexecutor
- SocketRocket
- - React-jsinspector (0.81.1):
+ - React-jsinspector (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2003,10 +2004,10 @@ PODS:
- React-jsinspectornetwork
- React-jsinspectortracing
- React-oscompat
- - React-perflogger (= 0.81.1)
+ - React-perflogger (= 0.81.3)
- React-runtimeexecutor
- SocketRocket
- - React-jsinspectorcdp (0.81.1):
+ - React-jsinspectorcdp (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2015,7 +2016,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- SocketRocket
- - React-jsinspectornetwork (0.81.1):
+ - React-jsinspectornetwork (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2028,7 +2029,7 @@ PODS:
- React-performancetimeline
- React-timing
- SocketRocket
- - React-jsinspectortracing (0.81.1):
+ - React-jsinspectortracing (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2039,7 +2040,7 @@ PODS:
- React-oscompat
- React-timing
- SocketRocket
- - React-jsitooling (0.81.1):
+ - React-jsitooling (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2047,16 +2048,16 @@ PODS:
- glog
- RCT-Folly
- RCT-Folly/Fabric
- - React-cxxreact (= 0.81.1)
- - React-jsi (= 0.81.1)
+ - React-cxxreact (= 0.81.3)
+ - React-jsi (= 0.81.3)
- React-jsinspector
- React-jsinspectorcdp
- React-jsinspectortracing
- React-runtimeexecutor
- SocketRocket
- - React-jsitracing (0.81.1):
+ - React-jsitracing (0.81.3):
- React-jsi
- - React-logger (0.81.1):
+ - React-logger (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2065,7 +2066,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- SocketRocket
- - React-Mapbuffer (0.81.1):
+ - React-Mapbuffer (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2075,7 +2076,7 @@ PODS:
- RCT-Folly/Fabric
- React-debug
- SocketRocket
- - React-microtasksnativemodule (0.81.1):
+ - React-microtasksnativemodule (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2089,8 +2090,34 @@ PODS:
- React-RCTFBReactNativeSpec
- ReactCommon/turbomodule/core
- SocketRocket
- - react-native-netinfo (11.4.1):
+ - react-native-netinfo (11.5.2):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - RCT-Folly/Fabric
+ - RCTRequired
+ - RCTTypeSafety
- React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - SocketRocket
+ - Yoga
- react-native-safe-area-context (5.6.2):
- boost
- DoubleConversion
@@ -2206,7 +2233,7 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
- - React-NativeModulesApple (0.81.1):
+ - React-NativeModulesApple (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2226,8 +2253,8 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- SocketRocket
- - React-oscompat (0.81.1)
- - React-perflogger (0.81.1):
+ - React-oscompat (0.81.3)
+ - React-perflogger (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2236,7 +2263,7 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- SocketRocket
- - React-performancetimeline (0.81.1):
+ - React-performancetimeline (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2249,9 +2276,9 @@ PODS:
- React-perflogger
- React-timing
- SocketRocket
- - React-RCTActionSheet (0.81.1):
- - React-Core/RCTActionSheetHeaders (= 0.81.1)
- - React-RCTAnimation (0.81.1):
+ - React-RCTActionSheet (0.81.3):
+ - React-Core/RCTActionSheetHeaders (= 0.81.3)
+ - React-RCTAnimation (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2267,7 +2294,7 @@ PODS:
- React-RCTFBReactNativeSpec
- ReactCommon
- SocketRocket
- - React-RCTAppDelegate (0.81.1):
+ - React-RCTAppDelegate (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2301,7 +2328,7 @@ PODS:
- React-utils
- ReactCommon
- SocketRocket
- - React-RCTBlob (0.81.1):
+ - React-RCTBlob (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2320,7 +2347,7 @@ PODS:
- React-RCTNetwork
- ReactCommon
- SocketRocket
- - React-RCTFabric (0.81.1):
+ - React-RCTFabric (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2355,7 +2382,7 @@ PODS:
- React-utils
- SocketRocket
- Yoga
- - React-RCTFBReactNativeSpec (0.81.1):
+ - React-RCTFBReactNativeSpec (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2369,10 +2396,10 @@ PODS:
- React-Core
- React-jsi
- React-NativeModulesApple
- - React-RCTFBReactNativeSpec/components (= 0.81.1)
+ - React-RCTFBReactNativeSpec/components (= 0.81.3)
- ReactCommon
- SocketRocket
- - React-RCTFBReactNativeSpec/components (0.81.1):
+ - React-RCTFBReactNativeSpec/components (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2395,7 +2422,7 @@ PODS:
- ReactCommon
- SocketRocket
- Yoga
- - React-RCTImage (0.81.1):
+ - React-RCTImage (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2411,14 +2438,14 @@ PODS:
- React-RCTNetwork
- ReactCommon
- SocketRocket
- - React-RCTLinking (0.81.1):
- - React-Core/RCTLinkingHeaders (= 0.81.1)
- - React-jsi (= 0.81.1)
+ - React-RCTLinking (0.81.3):
+ - React-Core/RCTLinkingHeaders (= 0.81.3)
+ - React-jsi (= 0.81.3)
- React-NativeModulesApple
- React-RCTFBReactNativeSpec
- ReactCommon
- - ReactCommon/turbomodule/core (= 0.81.1)
- - React-RCTNetwork (0.81.1):
+ - ReactCommon/turbomodule/core (= 0.81.3)
+ - React-RCTNetwork (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2436,7 +2463,7 @@ PODS:
- React-RCTFBReactNativeSpec
- ReactCommon
- SocketRocket
- - React-RCTRuntime (0.81.1):
+ - React-RCTRuntime (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2456,7 +2483,7 @@ PODS:
- React-runtimeexecutor
- React-RuntimeHermes
- SocketRocket
- - React-RCTSettings (0.81.1):
+ - React-RCTSettings (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2471,10 +2498,10 @@ PODS:
- React-RCTFBReactNativeSpec
- ReactCommon
- SocketRocket
- - React-RCTText (0.81.1):
- - React-Core/RCTTextHeaders (= 0.81.1)
+ - React-RCTText (0.81.3):
+ - React-Core/RCTTextHeaders (= 0.81.3)
- Yoga
- - React-RCTVibration (0.81.1):
+ - React-RCTVibration (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2488,11 +2515,11 @@ PODS:
- React-RCTFBReactNativeSpec
- ReactCommon
- SocketRocket
- - React-rendererconsistency (0.81.1)
- - React-renderercss (0.81.1):
+ - React-rendererconsistency (0.81.3)
+ - React-renderercss (0.81.3):
- React-debug
- React-utils
- - React-rendererdebug (0.81.1):
+ - React-rendererdebug (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2502,7 +2529,7 @@ PODS:
- RCT-Folly/Fabric
- React-debug
- SocketRocket
- - React-RuntimeApple (0.81.1):
+ - React-RuntimeApple (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2531,7 +2558,7 @@ PODS:
- React-runtimescheduler
- React-utils
- SocketRocket
- - React-RuntimeCore (0.81.1):
+ - React-RuntimeCore (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2553,7 +2580,7 @@ PODS:
- React-runtimescheduler
- React-utils
- SocketRocket
- - React-runtimeexecutor (0.81.1):
+ - React-runtimeexecutor (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2563,10 +2590,10 @@ PODS:
- RCT-Folly/Fabric
- React-debug
- React-featureflags
- - React-jsi (= 0.81.1)
+ - React-jsi (= 0.81.3)
- React-utils
- SocketRocket
- - React-RuntimeHermes (0.81.1):
+ - React-RuntimeHermes (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2587,7 +2614,7 @@ PODS:
- React-runtimeexecutor
- React-utils
- SocketRocket
- - React-runtimescheduler (0.81.1):
+ - React-runtimescheduler (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2609,9 +2636,9 @@ PODS:
- React-timing
- React-utils
- SocketRocket
- - React-timing (0.81.1):
+ - React-timing (0.81.3):
- React-debug
- - React-utils (0.81.1):
+ - React-utils (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2621,11 +2648,11 @@ PODS:
- RCT-Folly
- RCT-Folly/Fabric
- React-debug
- - React-jsi (= 0.81.1)
+ - React-jsi (= 0.81.3)
- SocketRocket
- - ReactAppDependencyProvider (0.81.1):
+ - ReactAppDependencyProvider (0.81.3):
- ReactCodegen
- - ReactCodegen (0.81.1):
+ - ReactCodegen (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2651,7 +2678,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- SocketRocket
- - ReactCommon (0.81.1):
+ - ReactCommon (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2659,9 +2686,9 @@ PODS:
- glog
- RCT-Folly
- RCT-Folly/Fabric
- - ReactCommon/turbomodule (= 0.81.1)
+ - ReactCommon/turbomodule (= 0.81.3)
- SocketRocket
- - ReactCommon/turbomodule (0.81.1):
+ - ReactCommon/turbomodule (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2670,15 +2697,15 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - React-callinvoker (= 0.81.1)
- - React-cxxreact (= 0.81.1)
- - React-jsi (= 0.81.1)
- - React-logger (= 0.81.1)
- - React-perflogger (= 0.81.1)
- - ReactCommon/turbomodule/bridging (= 0.81.1)
- - ReactCommon/turbomodule/core (= 0.81.1)
+ - React-callinvoker (= 0.81.3)
+ - React-cxxreact (= 0.81.3)
+ - React-jsi (= 0.81.3)
+ - React-logger (= 0.81.3)
+ - React-perflogger (= 0.81.3)
+ - ReactCommon/turbomodule/bridging (= 0.81.3)
+ - ReactCommon/turbomodule/core (= 0.81.3)
- SocketRocket
- - ReactCommon/turbomodule/bridging (0.81.1):
+ - ReactCommon/turbomodule/bridging (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2687,13 +2714,13 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - React-callinvoker (= 0.81.1)
- - React-cxxreact (= 0.81.1)
- - React-jsi (= 0.81.1)
- - React-logger (= 0.81.1)
- - React-perflogger (= 0.81.1)
+ - React-callinvoker (= 0.81.3)
+ - React-cxxreact (= 0.81.3)
+ - React-jsi (= 0.81.3)
+ - React-logger (= 0.81.3)
+ - React-perflogger (= 0.81.3)
- SocketRocket
- - ReactCommon/turbomodule/core (0.81.1):
+ - ReactCommon/turbomodule/core (0.81.3):
- boost
- DoubleConversion
- fast_float
@@ -2702,14 +2729,14 @@ PODS:
- hermes-engine
- RCT-Folly
- RCT-Folly/Fabric
- - React-callinvoker (= 0.81.1)
- - React-cxxreact (= 0.81.1)
- - React-debug (= 0.81.1)
- - React-featureflags (= 0.81.1)
- - React-jsi (= 0.81.1)
- - React-logger (= 0.81.1)
- - React-perflogger (= 0.81.1)
- - React-utils (= 0.81.1)
+ - React-callinvoker (= 0.81.3)
+ - React-cxxreact (= 0.81.3)
+ - React-debug (= 0.81.3)
+ - React-featureflags (= 0.81.3)
+ - React-jsi (= 0.81.3)
+ - React-logger (= 0.81.3)
+ - React-perflogger (= 0.81.3)
+ - React-utils (= 0.81.3)
- SocketRocket
- RNCAsyncStorage (2.2.0):
- boost
@@ -3300,109 +3327,109 @@ SPEC CHECKSUMS:
boost: cea1d4f90a3a59537f3deb03ff5656489d7133dd
DoubleConversion: d31b1eb37f6d6f456530c4fd9124b857d6889cab
EASClient: a4b8ae18e8de52019ec94d14795faac4800905f0
- EXConstants: 24884af8d52408773d50379b5339ce14a0022b39
- EXManifests: 7afe669f6a3d11e5d3a39670bd586d1421e685e8
- Expo: 9326a365e033ca80d24f264001359c05bc7d274c
- expo-dev-client: 133b0ba789694ceb6210f2875f00de50099432fe
- expo-dev-launcher: be6411aa54180ee1146322686aa9834018bd2736
- expo-dev-menu: 7273fb20b8da0713a4ffa2e5220f94076707c37d
+ EXConstants: a16ad8db13865e97aaecf64bb92e8ad8e8ce1ae8
+ EXManifests: 22ec6b0abf4e9b54ea22624aa955cf68d6c90590
+ Expo: 32293c3c6a3ed43a7df7f735452b34b6492ac4b8
+ expo-dev-client: de1af4570c4d213e52b700f701914521270ad93d
+ expo-dev-launcher: e81f3a1edd9292b18fbceb5547f41686019647de
+ expo-dev-menu: 5088d5e44ace01845dcb5f15d58f8a62defb4d2d
expo-dev-menu-interface: bf6f816d29b45bec038080790963c635e8d588c2
- ExpoAsset: 540045d6438f5e0f41f63943b9cba82efbd9829c
- ExpoCrypto: 8fd03fc529872c039a4aca90b4bf7f7852eb2519
- ExpoFileSystem: fbc1b6c573adea694db76bcfdec603952d96b0d5
- ExpoFont: 4e2967170d6ee7316c5efd62dd06aabd7b4593d2
- ExpoKeepAwake: fa30695ff813ea45747d5ef78b75d6c9b4b73faa
- ExpoLinking: bf252fa7f77068df5638db7f7a2ae7a9e453974a
- ExpoLocalAuthentication: d612e8f4a88a947bfaf0744ebb73cff8821bfe8e
- ExpoLogBox: d3a3380a07801282efd5658bcdd652da61ff0481
- ExpoMeshGradient: 308102ffaa1bce30374d7293461114c52d84b9b8
- ExpoModulesCore: a2af0bd93f366e15faaecc5cdcbcfedd98ca27b6
- ExpoModulesJSI: 188d87b8f01420e35a666affeb7620e2d93c9050
- ExpoSQLite: 6b5bc671d5a671bdab15efbffbd1b047121f0ce7
- ExpoWebBrowser: 026dd01637261e51f58ecb19f4ecb3d35ffe1e7e
+ ExpoAsset: 7c5ca25ca94db0d34d8d3148b9cb18a1a66a2277
+ ExpoCrypto: ac96b323c2badd6326887eb68647dd07f1ec2bd0
+ ExpoFileSystem: 7bc4dd246598030591c391c735d5493741c41eee
+ ExpoFont: 4d2a6dedce012c4793532cb38d561d3da95eaafd
+ ExpoKeepAwake: 55711a70fe88a41e793bbe28543c93cb47ff265d
+ ExpoLinking: 31827b9e0d27d058026a87a0e852f238c5834804
+ ExpoLocalAuthentication: ccc92a75fd11b83b1e321074a803ba7dd90bead1
+ ExpoLogBox: 35febda08748ff213ea133f51acf976ba8c44b2c
+ ExpoMeshGradient: 3cf846fe392cee87c16d3208d03326712fe1c906
+ ExpoModulesCore: a502756f9a8415d90d142b503b7d3d426438736f
+ ExpoModulesJSI: 1733437df661254d42bc5b1f030e6ba30b758b63
+ ExpoSQLite: c01882b3ce0d20ad2351213dbd081a6e0e1f8837
+ ExpoWebBrowser: 19c5d250e0c101027677970a5f2fc635d9df2e73
EXStructuredHeaders: aa49a5557fa24aa61dda4ac665f3987bf3e9e35d
- EXUpdates: 99192a5e7e5c8de9c6b2b653ea03bfb5992fea8d
- EXUpdatesInterface: 48272cb8995e613f0843fe531347e2f783e1df5f
+ EXUpdates: d88d60c37e35277d651837bd5dc9320d80a90e14
+ EXUpdatesInterface: 26412751a0f7a7130614655929e316f684552aab
fast_float: 20817c22759af6ac8d4d67e6e059b8b499953656
- FBLazyVector: 47006f04f48c051efc49874d37464783f567a24b
+ FBLazyVector: ac5833da37759ba00e917acade2f6ee83c64849b
fmt: 24e7591456deb60b4a77518f83d9a916ac84223f
glog: 0b31c25149b9d350b2666c7d459229861a00ec07
- hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172
+ hermes-engine: 7219f6e751ad6ec7f3d7ec121830ee34dae40749
lottie-ios: a881093fab623c467d3bce374367755c272bdd59
lottie-react-native: d849be4292d467c0e13fd4ca5042bb352b7d1a61
RCT-Folly: 0a7558aedae101878b4a1273756c05613dbdfb61
- RCTDeprecation: c4b9e2fd0ab200e3af72b013ed6113187c607077
- RCTRequired: 14662ae08f93538b252e8c4e604f2f033d5182ed
- RCTTypeSafety: 595f74c08cd117d828a41cb0b00be1bf62efba1a
+ RCTDeprecation: 78aa7764dbddbc2c87060d26a3ab19fb65dad4ce
+ RCTRequired: 418deca3d896d69dd28208b5756e4e620dab426d
+ RCTTypeSafety: 69bd5ed86837aa6c405d6fdaf0872da0e5931e54
ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda
- React: 285e67c52f202a184d1c1011d3156d1d571150b2
- React-callinvoker: ba9cf6f733a1d086d05a1c3f75568dfa7ab6e1c2
- React-Core: e23dd4b0ea52bbc82cc7e2eb1f287ed6f9110920
- React-CoreModules: 1e94997c05ad765f9c81343b6bbca5d5c62ee8ef
- React-cxxreact: 6950d1df7901b3a46acfc1018e4bfc06ef2e98b5
- React-debug: e59fc25e72bd054e327ee178db8a3650ed249fa7
- React-defaultsnativemodule: 5c386ab7157a63488fa0cd6a8937eb733f3599b9
- React-domnativemodule: 7ce026d5acd43cbccb565f1b6a43f86491dc22bd
- React-Fabric: 0913e5a702237b0efeca40f4b66e4323ad905a90
- React-FabricComponents: 5de704d859888cb6d58eb97e9f391fcf33dddf87
- React-FabricImage: 40624bf3360e5c8e486d43133b52c4da1d667ac7
- React-featureflags: 20759c7cdc6ce861ee408bfcaa7b4c0edc359cae
- React-featureflagsnativemodule: c45600af275cb044fbd82bfb0e867704ceac1d74
- React-graphics: 49283b443ae10babbc5df93b2f8f11f69bb0b1de
- React-hermes: 61a8114d91ff23b94d58378c1f291d69b9f2dd69
- React-idlecallbacksnativemodule: 1dbdc60538504c3e92115d3aa25a1296eda0d9dd
- React-ImageManager: f079cfc04cdf989cad6691e1763d4e6024c83f3f
- React-jserrorhandler: 631d481279d75f347918bc39d1010213c3b0fc89
- React-jsi: fa831196e99556190c624c96f445a9758eee5e03
- React-jsiexecutor: 0bf68e1e4ef3bfe62c20008637dc42aa687e2e73
- React-jsinspector: a910a217f56e8fd2cd224484128b81d98c600c5b
- React-jsinspectorcdp: 9726ea2a3f961cbe71575fc0557cf6f5728ba66b
- React-jsinspectornetwork: 1ede33c5a2ebd3e27805ec3c48f0aafffc716ab8
- React-jsinspectortracing: ff65e58cb898d694803a4d46d7885c18c1661683
- React-jsitooling: 4cd0d826e96228c3e93418d63b6585097fc8ca91
- React-jsitracing: b909676be8758b0ecfbe3eb3db63bb8f86c04f42
- React-logger: 0fb0d0dc2698d5aa5f70b9608e41611cbc159ea1
- React-Mapbuffer: dfd8035b800564269bfbafdd7469f4d5ec3724f7
- React-microtasksnativemodule: 34a125ff7425b9dc3b875d9fa052255195527bb0
- react-native-netinfo: f0a9899081c185db1de5bb2fdc1c88c202a059ac
+ React: 70e9096fc23f1f8ee768e95bd95c930f4ca11eea
+ React-callinvoker: f69dc6fa70787abae5816ea817b4eccd758eebba
+ React-Core: b6b65763ee58d02519c58d9ca6558162efc78161
+ React-CoreModules: b393e90402e20dde703d6a45c4ff1489acec571d
+ React-cxxreact: 0e2fee6a2e8baa33fd0571a4a58671606acec893
+ React-debug: 7f60989bdc5b7eea5f17ecdcbefb88f57216c892
+ React-defaultsnativemodule: 63f582341120e877269453542228720f7117821b
+ React-domnativemodule: 4a0207059b276f46d97e9a96e7562f494ef36c4f
+ React-Fabric: f33fc9516cc1e68f31331d01d024b2baf862ac8d
+ React-FabricComponents: 0f80782c5367017021f377c96268fb2096b44b7f
+ React-FabricImage: e32ca782d06332943de88e2cb86e87603e72f50d
+ React-featureflags: efa6225dbc8b22264544d2fbc1cb20ddb3afe0c2
+ React-featureflagsnativemodule: 54721f923fa0f332f230dbd14d13473980d1f9d9
+ React-graphics: 7968ca6f7e8a111be160e8108dfb11fc5ce98bb1
+ React-hermes: 16489d51a1dedf72663649272ca316d9d6792c5b
+ React-idlecallbacksnativemodule: 20b1fb44a4384e19ffc806a46f57fc47aa679d4d
+ React-ImageManager: 4bcccc5302a78d5e82374b665cf444ecfa4e43fa
+ React-jserrorhandler: 413cbbdbb6ff6eb5eabc27df5b516d9cf7666574
+ React-jsi: 6e6fa09154224037093b1a2dddf26819f58a2c54
+ React-jsiexecutor: 9924ed19861e3e824ed1f5901e9fd366459777c4
+ React-jsinspector: 961b0c593cdea3f6b8f43d6f39a4e5c032f18ac6
+ React-jsinspectorcdp: 7adc5777a01ffafee595bd50f0cd41c2ca7c390f
+ React-jsinspectornetwork: 3a9a18c1ed46ab9dee372e07a4e74c2e8cc73e4e
+ React-jsinspectortracing: 8fe9e9a2bdb10cbfae929a648cfc1e36ebe659b2
+ React-jsitooling: f68e0f1bfb1c09c7e853a6c5a7ed9fd9dbfe3717
+ React-jsitracing: 14b48de455dc94916b42120b3e1a24ddfc793cb7
+ React-logger: 05e45617e07a6d3ec98367d6c68ffcd690197174
+ React-Mapbuffer: 542b27423f39e66b2afb2cf95ea04e5946618868
+ React-microtasksnativemodule: 4326b8b0aba7ca44ce7f92ada728fc3ac3215a80
+ react-native-netinfo: 5e036f49ab00a53569bcc0cbc2954b608b6532c3
react-native-safe-area-context: 54d812805f3c4e08a4580ad086cbde1d8780c2e4
react-native-webview: 8b9097e270a99ee8798449f191a7ea27c790fa1c
- React-NativeModulesApple: 77b7e9561657d92ffca9569f342034821510b3b6
- React-oscompat: 8a27536d4ae736ce0fe2c7f96c22421c31889761
- React-perflogger: 950c1c497705d971933d1bbe97a9e1b4ee5676c4
- React-performancetimeline: a5553fe7925981a9462a2a8849bcff1323494e6c
- React-RCTActionSheet: 0328ba439a451e5ffc2142cd0a1a6ef5ad4430ab
- React-RCTAnimation: 300cc110426937b239df4b9c3da184812b5ba600
- React-RCTAppDelegate: f6fdd29f523df73edf3be3eaccf75edee2d558cf
- React-RCTBlob: a8acf04d5943343a01f408e66de91c699e366f83
- React-RCTFabric: 71fe0969baea8445f9c8c75ec54d33a535da6030
- React-RCTFBReactNativeSpec: 291c81249ebd7835dcb550a96672ce5ad8520afd
- React-RCTImage: 663e6c7b8e4fbef279beb85a97ddc52653250857
- React-RCTLinking: ed77413e473417e6d43cd03865ebb417daf5c8c8
- React-RCTNetwork: e7dd06d60e3fedcf6dc1a17864676f8ede53b83a
- React-RCTRuntime: 35823fc85727f446b7891f3fecd3917a29aec282
- React-RCTSettings: 75f86eebdda0c69341ee78a1759cce8203abc274
- React-RCTText: ad42eed30048d709ced41e9d992e2d1c239940d2
- React-RCTVibration: 04f49ad7d24cb7af5cf65686fb181dfe1d8a9e70
- React-rendererconsistency: d5bd36d64e62a217dedb0d05583b748fe7f53b48
- React-renderercss: acf8a64f3342ac9f7206516c382b5a9ef400a1d6
- React-rendererdebug: b41aefb24f2c85f4cef9b06ca3559b20643bfdc2
- React-RuntimeApple: 59de728cc8a651bd5bad9e01ecc9c2b0d930478c
- React-RuntimeCore: 7a8a40fd863e1a64cbb29519049811d7f2c2deaf
- React-runtimeexecutor: c34606bfc1a2fb03016e938f63a73ce26dd950f6
- React-RuntimeHermes: 22839d130a5f569cb237679e8ab6488582177b58
- React-runtimescheduler: a4dfe7bd34ae8a142a961caca9df46a4880a06cb
- React-timing: c9b91dd22ce989ba033bc7c4f57791fc0e60e2e5
- React-utils: 188f7178b8e053748dcb13db850fb7e5832a7a7f
- ReactAppDependencyProvider: d1d412f22cb3ff6585d255e35b73d39fd4b83b09
- ReactCodegen: 991cd380fa68a6c5f959fc50966dd6ecabbe8502
- ReactCommon: f8076449c9d401dd97dbce7405c5fee1ff61ef1d
+ React-NativeModulesApple: 8db9300ac6e2fa3f442d88725375ef463782a8a5
+ React-oscompat: aed7511b40db9142cb90957c06a8eaa4f4fb8f35
+ React-perflogger: 3086100c15bfdf5b04422573d991fc36c0e5ef80
+ React-performancetimeline: 67246835bb032e2a20bf66d3a889a7691a1cc80f
+ React-RCTActionSheet: 588ca9b68b9e7af4a918dfbb1ad2df73a8597c30
+ React-RCTAnimation: dbe4b8651fd1d876d67e2bf5575f3eabd397d9f6
+ React-RCTAppDelegate: a9b05fa0d9a9c35fe54c05bf319ce30ac055463d
+ React-RCTBlob: 513e325f293e23a41713bae3c7bf456f1ef92f07
+ React-RCTFabric: a9fc62d10b0dfbc9efbefdbfd5f2f21fa59ebdf1
+ React-RCTFBReactNativeSpec: 67c9f42ab8f09f7c4ff44ddcc6c2281e31e9dcd8
+ React-RCTImage: 5e7bc1ecedb3b01efd77a84a97c94d223f8c7540
+ React-RCTLinking: c25a7bc71475bf9531f0f0567c8b17a38c53ef3f
+ React-RCTNetwork: bbc81097558f6ae674940f50cc2e63397643a8da
+ React-RCTRuntime: 4b758e1306504373079737de29484069ef481ab3
+ React-RCTSettings: a87b70611d381003351b571b7365ca28c66d249e
+ React-RCTText: d5e9836cef2714c0577d3474529178b7488970fd
+ React-RCTVibration: ededc3390d835709d9400ed46dcf55764b292e3c
+ React-rendererconsistency: dadd29700cf4c64650791276aaa1d713adca5a5d
+ React-renderercss: 476f17552ab220c0fd108c61c802d33aa4318643
+ React-rendererdebug: ad85df5c72eb29e1ff6949ca9dbecace4e1ee88d
+ React-RuntimeApple: 8bbc747b31f821921d31c9cff63cf39727d9b663
+ React-RuntimeCore: 31e692cdf4604a2bd75d32403e051df22694e743
+ React-runtimeexecutor: e33393724b54876e7263c3aa8bd5275e0c8a48ef
+ React-RuntimeHermes: e6894347fffe47a69b75e107860e6b81cbb0685f
+ React-runtimescheduler: af9520acb355f2a15a3e4b87a2791adffa26b350
+ React-timing: b1d071d301d69805aba4d9c7b70041014adcd091
+ React-utils: f67cebb439053dd82368c38880fa722208634bd3
+ ReactAppDependencyProvider: 5fad3905658e584239aa16c0582083d3f4343227
+ ReactCodegen: b553c40b6d72dfb3b7736b2b857c2b5c95026b43
+ ReactCommon: 11314ceed7043fec3d8d9f1dbf352eb2b3431eb3
RNCAsyncStorage: 302f2fac014fd450046c120567ca364632da682b
RNGestureHandler: 77eecab5fd636666ca73a55bb61e2f1a685b7e84
RNReanimated: 31da8d5f1605f5367e2392748ba9f4ba6eaf1178
RNWorklets: 8e934a6b6d5a2710b9250e63a18a2d2f8b875a18
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
- Yoga: b9d6f057671b0ab86481057b33f1127f170dddf2
+ Yoga: a12947ee35fb381e3be96cbf365b554402b0dfd6
PODFILE CHECKSUM: 8a504db1001201acbfe0854c65ce07ebcc292524
diff --git a/apps/expo-go/android/app/build.gradle b/apps/expo-go/android/app/build.gradle
index 01b042abb0f2ee..6973270f9e2fbf 100644
--- a/apps/expo-go/android/app/build.gradle
+++ b/apps/expo-go/android/app/build.gradle
@@ -35,7 +35,6 @@ apply plugin: 'com.facebook.react'
react {
def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
- entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
reactNativeDir = new File(projectRoot, "../../react-native-lab/react-native/packages/react-native")
codegenDir = new File(projectRoot, "../../react-native-lab/react-native/packages/react-native-codegen")
diff --git a/apps/expo-go/app.json b/apps/expo-go/app.json
new file mode 100644
index 00000000000000..5a555065afc6c3
--- /dev/null
+++ b/apps/expo-go/app.json
@@ -0,0 +1,38 @@
+{
+ "expo": {
+ "name": "expo-home",
+ "description": "",
+ "slug": "home",
+ "privacy": "unlisted",
+ "sdkVersion": "55.0.0",
+ "version": "55.0.0",
+ "platforms": ["ios", "android"],
+ "primaryColor": "#cccccc",
+ "icon": "https://s3.amazonaws.com/exp-brand-assets/ExponentEmptyManifest_192.png",
+ "updates": {
+ "checkAutomatically": "NEVER",
+ "fallbackToCacheTimeout": 0,
+ "url": "https://u.expo.dev/6b6c6660-df76-11e6-b9b4-59d1587e6774"
+ },
+ "userInterfaceStyle": "automatic",
+ "ios": {
+ "supportsTablet": true,
+ "bundleIdentifier": "host.exp.exponent"
+ },
+ "newArchEnabled": true,
+ "android": {
+ "package": "host.exp.exponent"
+ },
+ "androidStatusBar": {
+ "barStyle": "dark-content"
+ },
+ "scheme": "exp",
+ "jsEngine": "hermes",
+ "extra": {
+ "eas": {
+ "projectId": "6b6c6660-df76-11e6-b9b4-59d1587e6774"
+ }
+ },
+ "runtimeVersion": "55.0.0"
+ }
+}
diff --git a/docs/constants/navigation.js b/docs/constants/navigation.js
index 789da8ff4aae49..53770f2c063ed1 100644
--- a/docs/constants/navigation.js
+++ b/docs/constants/navigation.js
@@ -295,6 +295,7 @@ export const general = [
makePage('router/reference/src-directory.mdx'),
makePage('router/reference/testing.mdx'),
makePage('router/reference/troubleshooting.mdx'),
+ makePage('router/reference/reserved-paths.mdx'),
]),
makeGroup('Migration', [
makePage('router/migrate/from-react-navigation.mdx'),
diff --git a/docs/pages/guides/customizing-metro.mdx b/docs/pages/guides/customizing-metro.mdx
index 135cb67b082f46..b4853c4bb6fcd8 100644
--- a/docs/pages/guides/customizing-metro.mdx
+++ b/docs/pages/guides/customizing-metro.mdx
@@ -173,6 +173,8 @@ You can overwrite the default **index.html** in Metro web by creating a **public
In the future, this will work universally across platforms with EAS Update hosting. Currently, the feature is web-only based on the static host used for the native app, for example, the legacy Expo service updates do not support this feature.
+> **warning** Some paths such as `/assets` are reserved by Metro. Avoid placing files in **public/assets/** or other reserved paths. See [Reserved paths](/router/reference/reserved-paths/) for the complete list.
+
## TypeScript
Expo's Metro config supports the `compilerOptions.paths` and `compilerOptions.baseUrl` fields in the project's **tsconfig.json** (or **jsconfig.json**) file. This enables absolute imports and aliases in the project. See [TypeScript](/guides/typescript) guide for more information.
diff --git a/docs/pages/guides/publishing-websites.mdx b/docs/pages/guides/publishing-websites.mdx
index b37aea5e4b26ce..c5199406625738 100644
--- a/docs/pages/guides/publishing-websites.mdx
+++ b/docs/pages/guides/publishing-websites.mdx
@@ -57,7 +57,7 @@ Run the universal export command to compile the project for web:
The resulting project files are located in the **dist** directory. Any files inside the **public** directory are also copied to the **dist** directory.
-> **warning** Avoid creating the directory `/public/assets/`. The path `/assets` is reserved by Metro and will cause file access errors during development.
+> **warning** Some paths such as `/assets` are reserved by Metro. Avoid placing files in **public/assets/** or other reserved paths. See [Reserved paths](/router/reference/reserved-paths/) for the complete list.
## Serve locally
diff --git a/docs/pages/router/basics/notation.mdx b/docs/pages/router/basics/notation.mdx
index dd8285ed6e8c1e..c153f63fdf59c2 100644
--- a/docs/pages/router/basics/notation.mdx
+++ b/docs/pages/router/basics/notation.mdx
@@ -65,7 +65,7 @@ Routes that include a `+` have special significance to Expo Router, and are used
- [`+native-intent`](/router/advanced/native-intent/) is used to handle deep links into your app that don't match a specific route, such as links generated by third-party services.
- [`+middleware`](/router/web/middleware/) is used to run code before a route is rendered, allowing you to perform tasks like authentication or redirection for every request.
-> **warning** Avoid creating a top-level route named `assets` (like `/app/assets.tsx` or `/app/assets/[other-pages].tsx`). The path `/assets` is reserved by Metro and will cause errors when trying to access it from the URL.
+> **warning** Some path names such as `/assets` are reserved by Metro and Expo Router. Avoid using them for routes. See [Reserved paths](/router/reference/reserved-paths/) for the complete list.
## Route notation applied
diff --git a/docs/pages/router/reference/reserved-paths.mdx b/docs/pages/router/reference/reserved-paths.mdx
new file mode 100644
index 00000000000000..641be64415bcb0
--- /dev/null
+++ b/docs/pages/router/reference/reserved-paths.mdx
@@ -0,0 +1,63 @@
+---
+title: Reserved paths
+description: URL paths reserved by Metro and Expo Router that you should avoid using for routes or static files.
+---
+
+import { FileTree } from '~/ui/components/FileTree';
+
+If you create a route or place static files at certain URL paths, Metro or Expo Router will intercept the request instead of serving your content. Depending on the path, this can result in a "404 Asset not found" error or your page being silently replaced by an internal dev server response.
+
+## `/assets/*`
+
+Metro serves all bundled assets (images, fonts, and other files) at this path. If you create a route at **app/assets.tsx** or a directory at **public/assets/**, Metro intercepts the request and your content is never reached.
+
+This applies to both top-level routes and static files:
+
+
+
+Rename your route or directory to avoid the conflict:
+
+
+
+## `/_expo/*`
+
+Expo Router uses this path for multiple internal middlewares, including dev tools and manifests. Do not create routes or static files under this path.
+
+## `/_flight/*`
+
+React Server Components use this path internally. Do not create routes or static files under this path.
+
+## `/inspector`
+
+React Native uses `/inspector/debug` and `/inspector/network` for the debugger. Avoid creating routes that match `/inspector` or its sub-paths.
+
+## `/expo-dev-plugins/*`
+
+Expo development tool plugins use this path. Do not create routes or static files under this path.
+
+## `/manifest`
+
+The dev server serves the native app manifest at this path. If you create a route at **app/manifest.tsx**, the dev server responds with manifest JSON instead of your page. Your route will appear to silently not load during development.
+
+## `/_sitemap`
+
+Expo Router automatically generates a sitemap route at this path for debugging. If you create a route at **app/\_sitemap.tsx**, it will override the built-in sitemap. See [Sitemap](/router/reference/sitemap/) for more details on this feature.
+
+## `/public/*`
+
+If your project has a **public** directory, the `/public` URL path may conflict with static file serving. Avoid creating a route at **app/public.tsx** or **app/public/index.tsx** since the path is implicitly reserved when the **public** directory exists.
+
+## `/favicon.ico`
+
+Unlike the paths above, `/favicon.ico` is safe to override. Expo CLI serves a default favicon when none is provided. You can replace it by placing a **favicon.ico** file in your **public** directory or by creating an [API route](/router/web/api-routes/).
diff --git a/docs/pages/router/web/static-rendering.mdx b/docs/pages/router/web/static-rendering.mdx
index 95303b0084a4cf..95dad22ab72513 100644
--- a/docs/pages/router/web/static-rendering.mdx
+++ b/docs/pages/router/web/static-rendering.mdx
@@ -123,8 +123,6 @@ export async function generateStaticParams(params: {
-> **warning** Avoid creating a top-level route named `assets` (like `/app/assets.tsx` or `/app/assets/[other-pages].tsx`). The path `/assets` is reserved by Metro and will cause errors when trying to access it from the URL.
-
### Read files using `process.cwd()`
Since Expo Router compiles your code into a separate directory you cannot use `__dirname` to form a path as its value will be different than expected.
@@ -229,7 +227,7 @@ Expo CLI supports a root **public** directory that gets copied to the **dist** d
files={['public/favicon.ico', 'public/logo.png', 'public/.well-known/apple-app-site-association']}
/>
-> **warning** Avoid creating the directory `/public/assets/`. The path `/assets` is reserved by Metro and will cause file access errors during development.
+> **warning** Some paths such as `/assets` are reserved by Metro. Avoid placing files in **public/assets/** or other reserved paths. See [Reserved paths](/router/reference/reserved-paths/) for the complete list.
These files will be copied to the **dist** directory during static rendering:
diff --git a/docs/pages/workflow/upgrading-expo-sdk-walkthrough.mdx b/docs/pages/workflow/upgrading-expo-sdk-walkthrough.mdx
index 7048954cd9b608..4af20d20fb1f55 100644
--- a/docs/pages/workflow/upgrading-expo-sdk-walkthrough.mdx
+++ b/docs/pages/workflow/upgrading-expo-sdk-walkthrough.mdx
@@ -1,13 +1,11 @@
---
title: Upgrade Expo SDK
description: Learn how to incrementally upgrade the Expo SDK version in your project.
-hasVideoLink: true
---
import { Collapsible } from '~/ui/components/Collapsible';
import { Terminal } from '~/ui/components/Snippet';
import { Step } from '~/ui/components/Step';
-import { VideoBoxLink } from '~/ui/components/VideoBoxLink';
> **info** We recommend upgrading SDK versions incrementally, one at a time. Doing so will help you pinpoint breakages and issues that arise during the upgrade process.
@@ -15,11 +13,6 @@ With a new SDK release, the latest version enters the current release status. Th
If you are looking to install a specific version of Expo Go, visit [expo.dev/go](https://expo.dev/go). It supports downloads for Android devices/emulators and iOS simulators. However, due to iOS platform restrictions, only the latest version of Expo Go is available for installation on physical iOS devices.
-
-
## How to upgrade to the latest SDK version
@@ -30,14 +23,14 @@ Install the new version of the Expo package:
-Depending on which SDK you're upgrading to, substitute the `expo@^54.0.0` with the version range of the Expo SDK version you're targeting. For example, `expo@^54.0.0` stands for SDK 54.
+Depending on which SDK you're upgrading to, substitute `expo@^55.0.0` with the version range of the Expo SDK version you're targeting. For example, `expo@^55.0.0` stands for SDK 55.
@@ -75,10 +68,9 @@ Read the [SDK changelogs](#sdk-changelogs) for the SDK version you are upgrading
Each SDK announcement release notes post contains information deprecations, breaking changes, and anything else that might be unique to that particular SDK version. When upgrading, be sure to check these out to make sure you don't miss anything.
+- **SDK 55**: [Release notes](https://expo.dev/changelog/sdk-55)
- **SDK 54**: [Release notes](https://expo.dev/changelog/sdk-54)
- **SDK 53**: [Release notes](https://expo.dev/changelog/sdk-53)
-- **SDK 52**: [Release notes](https://expo.dev/changelog/2024-11-12-sdk-52)
- - **React Native 0.77 is available with Expo SDK 52**. To upgrade, see these [Release notes](https://expo.dev/changelog/2025/01-21-react-native-0.77).
### Deprecated SDK Version Changelogs
@@ -86,6 +78,8 @@ The following blog posts may included outdated information, but they are still u
+- **SDK 52**: [Release notes](https://expo.dev/changelog/2024-11-12-sdk-52)
+ - **React Native 0.77 is available with Expo SDK 52**. To upgrade, see these [Release notes](https://expo.dev/changelog/2025/01-21-react-native-0.77).
- **SDK 51**: [Release notes](https://expo.dev/changelog/2024-05-07-sdk-51)
- **SDK 50**: [Release notes](https://expo.dev/changelog/2024-01-18-sdk-50)
- **SDK 49**: [Release notes](https://blog.expo.dev/expo-sdk-49-c6d398cdf740)
diff --git a/docs/public/static/data/unversioned/expo-widgets.json b/docs/public/static/data/unversioned/expo-widgets.json
index 9f6f84d2bf9492..c79fa14fb973b0 100644
--- a/docs/public/static/data/unversioned/expo-widgets.json
+++ b/docs/public/static/data/unversioned/expo-widgets.json
@@ -1 +1 @@
-{"schemaVersion":"2.0","name":"expo-widgets","variant":"project","kind":1,"children":[{"name":"LiveActivity","variant":"declaration","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents a Live Activity instance. Provides methods to update its content and end it."}]},"children":[{"name":"constructor","variant":"declaration","kind":512,"signatures":[{"name":"LiveActivity","variant":"signature","kind":16384,"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"nativeLiveActivity","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"expo-widgets","packagePath":"src/Widgets.types.ts","qualifiedName":"NativeLiveActivity"},"name":"NativeLiveActivity","package":"expo-widgets"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivity.T","refersToTypeParameter":true}],"name":"LiveActivity","package":"expo-widgets"}}]},{"name":"addPushTokenListener","variant":"declaration","kind":2048,"signatures":[{"name":"addPushTokenListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener for push token update events on this Live Activity instance.\nThe token can be used to send content updates to this specific activity via APNs."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An event subscription that can be used to remove the listener."}]}]},"parameters":[{"name":"listener","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback invoked when a new push token is available."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reference","name":"PushTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/EventEmitter.ts","qualifiedName":"EventSubscription"},"name":"EventSubscription","package":"expo-modules-core"}}]},{"name":"end","variant":"declaration","kind":2048,"signatures":[{"name":"end","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Ends the Live Activity."}]},"parameters":[{"name":"dismissalPolicy","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Controls when the Live Activity is removed from the Lock Screen after ending."}]},"type":{"type":"reference","name":"LiveActivityDismissalPolicy","package":"expo-widgets"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]},{"name":"getPushToken","variant":"declaration","kind":2048,"signatures":[{"name":"getPushToken","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the push token for this Live Activity, used to send push notification updates via APNs.\nReturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if push notifications are not enabled or the token is not yet available."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","package":"typescript"}}]},{"name":"update","variant":"declaration","kind":2048,"signatures":[{"name":"update","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Updates the Live Activity's content. The UI reflects the new properties immediately."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The updated content properties."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivity.T","refersToTypeParameter":true}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"LiveActivityFactory","variant":"declaration","kind":128,"comment":{"summary":[{"kind":"text","text":"Manages Live Activity instances of a specific type. Use it to start new activities and retrieve currently active ones."}]},"children":[{"name":"constructor","variant":"declaration","kind":512,"signatures":[{"name":"LiveActivityFactory","variant":"signature","kind":16384,"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"layout","variant":"param","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivityComponent","package":"expo-widgets"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivityFactory","package":"expo-widgets"}}]},{"name":"getInstances","variant":"declaration","kind":2048,"signatures":[{"name":"getInstances","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns all currently active instances of this Live Activity type."}]},"type":{"type":"array","elementType":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivity","package":"expo-widgets"}}}]},{"name":"start","variant":"declaration","kind":2048,"signatures":[{"name":"start","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts a new Live Activity with the given properties."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The new Live Activity instance."}]}]},"parameters":[{"name":"props","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The initial content properties for the Live Activity."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}},{"name":"url","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional URL to associate with the Live Activity, used for deep linking."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivity","package":"expo-widgets"}}]}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"Widget","variant":"declaration","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents a widget instance. Provides methods to manage the widget's timeline."}]},"children":[{"name":"constructor","variant":"declaration","kind":512,"signatures":[{"name":"Widget","variant":"signature","kind":16384,"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"layout","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"p","variant":"param","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"WidgetBase","package":"expo-widgets"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"React.JSX.Element"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"Widget","package":"expo-widgets"}}]},{"name":"getTimeline","variant":"declaration","kind":2048,"signatures":[{"name":"getTimeline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the current timeline entries for the widget, including past and future entries."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"array","elementType":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"WidgetTimelineEntry","package":"expo-widgets"}}],"name":"Promise","package":"typescript"}}]},{"name":"reload","variant":"declaration","kind":2048,"signatures":[{"name":"reload","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Force reloads the widget, causing it to refresh its content and timeline."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"updateSnapshot","variant":"declaration","kind":2048,"signatures":[{"name":"updateSnapshot","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the widget's content to the given props immediately, without scheduling a timeline."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The properties to display in the widget."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"updateTimeline","variant":"declaration","kind":2048,"signatures":[{"name":"updateTimeline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Schedules a series of updates for the widget's content and reloads the widget."}]},"parameters":[{"name":"entries","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Timeline entries, each specifying a date and the props to display at that time."}]},"type":{"type":"array","elementType":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"WidgetTimelineEntry","package":"expo-widgets"}}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"ExpoWidgetsEvents","variant":"declaration","kind":2097152,"children":[{"name":"onExpoWidgetsPushToStartTokenReceived","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Function that is invoked when a push-to-start token is received."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Token event details."}]},"type":{"type":"reference","name":"PushToStartTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onExpoWidgetsUserInteraction","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Function that is invoked when user interacts with a widget."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Interaction event details."}]},"type":{"type":"reference","name":"UserInteractionEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"LiveActivityComponent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"A function that returns the layout for a Live Activity."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}}],"type":{"type":"reference","name":"LiveActivityLayout","package":"expo-widgets"}}]}}},{"name":"LiveActivityDismissalPolicy","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Dismissal policy for ending a live activity."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"immediate"}]}},{"name":"LiveActivityEvents","variant":"declaration","kind":2097152,"children":[{"name":"onExpoWidgetsTokenReceived","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Function that is invoked when a push token is received for a live activity."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Token event details."}]},"type":{"type":"reference","name":"PushTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"LiveActivityLayout","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Defines the layout sections for an iOS Live Activity."}]},"children":[{"name":"banner","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The main banner content displayed in Notifications Center."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"bannerSmall","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The small banner content displayed in CarPlay and WatchOS. Falls back to "},{"kind":"code","text":"`banner`"},{"kind":"text","text":" if not provided."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"compactLeading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The leading content in the compact Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"compactTrailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The trailing content in the compact Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedBottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The bottom content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedCenter","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The center content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedLeading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The leading content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedTrailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The trailing content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"minimal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The minimal content shown when the Dynamic Island is in its smallest form."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]},{"name":"PushTokenEvent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Event emitted when a push token is received for a live activity."}]},"children":[{"name":"activityId","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The ID of the live activity."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"pushToken","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The push token for the live activity."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"PushToStartTokenEvent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Event emitted when a push-to-start token is received."}]},"children":[{"name":"activityPushToStartToken","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The push-to-start token for starting live activities remotely."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"UserInteractionEvent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Event emitted when a user interacts with a widget."}]},"children":[{"name":"source","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Widget that triggered the interaction."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"target","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Button/toggle that was pressed."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"timestamp","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Timestamp of the event."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The event type identifier."}]},"type":{"type":"literal","value":"ExpoWidgetsUserInteraction"}}]},{"name":"WidgetBase","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Props passed to a widget component."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"date","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The date of this timeline entry."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Date"},"name":"Date","package":"typescript"}},{"name":"family","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The widget family."}]},"type":{"type":"reference","name":"WidgetFamily","package":"expo-widgets"}}]}},{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}]}},{"name":"WidgetFamily","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"The widget family (size).\n- "},{"kind":"code","text":"`systemSmall`"},{"kind":"text","text":" - Small square widget (2x2 grid).\n- "},{"kind":"code","text":"`systemMedium`"},{"kind":"text","text":" - Medium widget (4x2 grid).\n- "},{"kind":"code","text":"`systemLarge`"},{"kind":"text","text":" - Large widget (4x4 grid).\n- "},{"kind":"code","text":"`systemExtraLarge`"},{"kind":"text","text":" - Extra large widget (iPad only, 6x4 grid).\n- "},{"kind":"code","text":"`accessoryCircular`"},{"kind":"text","text":" - Circular accessory widget for the Lock Screen.\n- "},{"kind":"code","text":"`accessoryRectangular`"},{"kind":"text","text":" - Rectangular accessory widget for the Lock Screen.\n- "},{"kind":"code","text":"`accessoryInline`"},{"kind":"text","text":" - Inline accessory widget for the Lock Screen."}]},"type":{"type":"union","types":[{"type":"literal","value":"systemSmall"},{"type":"literal","value":"systemMedium"},{"type":"literal","value":"systemLarge"},{"type":"literal","value":"systemExtraLarge"},{"type":"literal","value":"accessoryCircular"},{"type":"literal","value":"accessoryRectangular"},{"type":"literal","value":"accessoryInline"}]}},{"name":"WidgetTimelineEntry","variant":"declaration","kind":2097152,"children":[{"name":"date","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Date when widget should update."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Date"},"name":"Date","package":"typescript"}},{"name":"props","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Props to be passed to the widget."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"addPushToStartTokenListener","variant":"declaration","kind":64,"signatures":[{"name":"addPushToStartTokenListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener for push-to-start token events.\nThis token can be used to start live activities remotely via APNs."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An event subscription that can be used to remove the listener."}]}]},"parameters":[{"name":"listener","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback function to handle push-to-start token events."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reference","name":"PushToStartTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/EventEmitter.ts","qualifiedName":"EventSubscription"},"name":"EventSubscription","package":"expo-modules-core"}}]},{"name":"addUserInteractionListener","variant":"declaration","kind":64,"signatures":[{"name":"addUserInteractionListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener for widget interaction events (for example, button taps)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An event subscription that can be used to remove the listener."}]}]},"parameters":[{"name":"listener","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback function to handle user interaction events."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reference","name":"UserInteractionEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/EventEmitter.ts","qualifiedName":"EventSubscription"},"name":"EventSubscription","package":"expo-modules-core"}}]},{"name":"createLiveActivity","variant":"declaration","kind":64,"signatures":[{"name":"createLiveActivity","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a Live Activity Factory for managing Live Activities of a specific type."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The Live Activity name. Must match the "},{"kind":"code","text":"`'name'`"},{"kind":"text","text":" field in your widget configuration in the app config."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"liveActivity","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The Live Activity component, marked with the "},{"kind":"code","text":"`'widget'`"},{"kind":"text","text":" directive."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"LiveActivityComponent","package":"expo-widgets"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"LiveActivityFactory","package":"expo-widgets"}}]},{"name":"createWidget","variant":"declaration","kind":64,"signatures":[{"name":"createWidget","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a Widget instance."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The widget name. Must match the "},{"kind":"code","text":"`'name'`"},{"kind":"text","text":" field in your widget configuration in the app config."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"widget","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The widget component, marked with the "},{"kind":"code","text":"`'widget'`"},{"kind":"text","text":" directive."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"WidgetBase","package":"expo-widgets"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"React.JSX.Element"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"Widget","package":"expo-widgets"}}]}],"packageName":"expo-widgets"}
\ No newline at end of file
+{"schemaVersion":"2.0","name":"expo-widgets","variant":"project","kind":1,"children":[{"name":"LiveActivity","variant":"declaration","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents a Live Activity instance. Provides methods to update its content and end it."}]},"children":[{"name":"constructor","variant":"declaration","kind":512,"signatures":[{"name":"LiveActivity","variant":"signature","kind":16384,"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"nativeLiveActivity","variant":"param","kind":32768,"type":{"type":"reference","target":{"packageName":"expo-widgets","packagePath":"src/Widgets.types.ts","qualifiedName":"NativeLiveActivity"},"name":"NativeLiveActivity","package":"expo-widgets"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivity.T","refersToTypeParameter":true}],"name":"LiveActivity","package":"expo-widgets"}}]},{"name":"addPushTokenListener","variant":"declaration","kind":2048,"signatures":[{"name":"addPushTokenListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener for push token update events on this Live Activity instance.\nThe token can be used to send content updates to this specific activity via APNs."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An event subscription that can be used to remove the listener."}]}]},"parameters":[{"name":"listener","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback invoked when a new push token is available."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reference","name":"PushTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/EventEmitter.ts","qualifiedName":"EventSubscription"},"name":"EventSubscription","package":"expo-modules-core"}}]},{"name":"end","variant":"declaration","kind":2048,"signatures":[{"name":"end","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Ends the Live Activity."}]},"parameters":[{"name":"dismissalPolicy","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Controls when the Live Activity is removed from the Lock Screen after ending.\nCan be "},{"kind":"code","text":"`'default'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'immediate'`"},{"kind":"text","text":", or "},{"kind":"code","text":"`after(date)`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"LiveActivityDismissalPolicy","package":"expo-widgets"}},{"name":"props","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Final content properties to update after the activity ends."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivity.T","refersToTypeParameter":true}},{"name":"contentDate","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The time the data in the payload was generated. If this is older than a previous update or push payload, the system ignores this update."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Date"},"name":"Date","package":"typescript"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]},{"name":"getPushToken","variant":"declaration","kind":2048,"signatures":[{"name":"getPushToken","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the push token for this Live Activity, used to send push notification updates via APNs.\nReturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if push notifications are not enabled or the token is not yet available."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","package":"typescript"}}]},{"name":"update","variant":"declaration","kind":2048,"signatures":[{"name":"update","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Updates the Live Activity's content. The UI reflects the new properties immediately."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The updated content properties."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivity.T","refersToTypeParameter":true}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"LiveActivityFactory","variant":"declaration","kind":128,"comment":{"summary":[{"kind":"text","text":"Manages Live Activity instances of a specific type. Use it to start new activities and retrieve currently active ones."}]},"children":[{"name":"constructor","variant":"declaration","kind":512,"signatures":[{"name":"LiveActivityFactory","variant":"signature","kind":16384,"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"layout","variant":"param","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivityComponent","package":"expo-widgets"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivityFactory","package":"expo-widgets"}}]},{"name":"getInstances","variant":"declaration","kind":2048,"signatures":[{"name":"getInstances","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns all currently active instances of this Live Activity type."}]},"type":{"type":"array","elementType":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivity","package":"expo-widgets"}}}]},{"name":"start","variant":"declaration","kind":2048,"signatures":[{"name":"start","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts a new Live Activity with the given properties."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The new Live Activity instance."}]}]},"parameters":[{"name":"props","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The initial content properties for the Live Activity."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}},{"name":"url","variant":"param","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional URL to associate with the Live Activity, used for deep linking."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"LiveActivityFactory.T","refersToTypeParameter":true}],"name":"LiveActivity","package":"expo-widgets"}}]}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"Widget","variant":"declaration","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents a widget instance. Provides methods to manage the widget's timeline."}]},"children":[{"name":"constructor","variant":"declaration","kind":512,"signatures":[{"name":"Widget","variant":"signature","kind":16384,"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"layout","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"p","variant":"param","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"WidgetBase","package":"expo-widgets"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"React.JSX.Element"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"Widget","package":"expo-widgets"}}]},{"name":"getTimeline","variant":"declaration","kind":2048,"signatures":[{"name":"getTimeline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the current timeline entries for the widget, including past and future entries."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"array","elementType":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"WidgetTimelineEntry","package":"expo-widgets"}}],"name":"Promise","package":"typescript"}}]},{"name":"reload","variant":"declaration","kind":2048,"signatures":[{"name":"reload","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Force reloads the widget, causing it to refresh its content and timeline."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"updateSnapshot","variant":"declaration","kind":2048,"signatures":[{"name":"updateSnapshot","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the widget's content to the given props immediately, without scheduling a timeline."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The properties to display in the widget."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"updateTimeline","variant":"declaration","kind":2048,"signatures":[{"name":"updateTimeline","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Schedules a series of updates for the widget's content and reloads the widget."}]},"parameters":[{"name":"entries","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Timeline entries, each specifying a date and the props to display at that time."}]},"type":{"type":"array","elementType":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","qualifiedName":"Widget.T","refersToTypeParameter":true}],"name":"WidgetTimelineEntry","package":"expo-widgets"}}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"ExpoWidgetsEvents","variant":"declaration","kind":2097152,"children":[{"name":"onExpoWidgetsPushToStartTokenReceived","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Function that is invoked when a push-to-start token is received."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Token event details."}]},"type":{"type":"reference","name":"PushToStartTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onExpoWidgetsUserInteraction","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Function that is invoked when user interacts with a widget."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Interaction event details."}]},"type":{"type":"reference","name":"UserInteractionEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"LiveActivityComponent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"A function that returns the layout for a Live Activity."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}}],"type":{"type":"reference","name":"LiveActivityLayout","package":"expo-widgets"}}]}}},{"name":"LiveActivityDismissalPolicy","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Dismissal policy for ending a live activity.\n- "},{"kind":"code","text":"`'default'`"},{"kind":"text","text":" - The system’s default dismissal policy for the Live Activity.\n- "},{"kind":"code","text":"`'immediate'`"},{"kind":"text","text":" - The system immediately removes the Live Activity that ended.\n- "},{"kind":"code","text":"`after(date)`"},{"kind":"text","text":" - The system removes the Live Activity that ended at the specified time within a four-hour window."}]},"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"immediate"},{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"ReturnType"},"typeArguments":[{"type":"query","queryType":{"type":"reference","name":"after","package":"expo-widgets"}}],"name":"ReturnType","package":"typescript"}]}},{"name":"LiveActivityEvents","variant":"declaration","kind":2097152,"children":[{"name":"onExpoWidgetsTokenReceived","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Function that is invoked when a push token is received for a live activity."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Token event details."}]},"type":{"type":"reference","name":"PushTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"LiveActivityLayout","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Defines the layout sections for an iOS Live Activity."}]},"children":[{"name":"banner","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The main banner content displayed in Notifications Center."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"bannerSmall","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The small banner content displayed in CarPlay and WatchOS. Falls back to "},{"kind":"code","text":"`banner`"},{"kind":"text","text":" if not provided."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"compactLeading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The leading content in the compact Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"compactTrailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The trailing content in the compact Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedBottom","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The bottom content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedCenter","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The center content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedLeading","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The leading content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"expandedTrailing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The trailing content in the expanded Dynamic Island presentation."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"minimal","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The minimal content shown when the Dynamic Island is in its smallest form."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]},{"name":"PushTokenEvent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Event emitted when a push token is received for a live activity."}]},"children":[{"name":"activityId","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The ID of the live activity."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"pushToken","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The push token for the live activity."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"PushToStartTokenEvent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Event emitted when a push-to-start token is received."}]},"children":[{"name":"activityPushToStartToken","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The push-to-start token for starting live activities remotely."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"UserInteractionEvent","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Event emitted when a user interacts with a widget."}]},"children":[{"name":"source","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Widget that triggered the interaction."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"target","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Button/toggle that was pressed."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"timestamp","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Timestamp of the event."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The event type identifier."}]},"type":{"type":"literal","value":"ExpoWidgetsUserInteraction"}}]},{"name":"WidgetBase","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Props passed to a widget component."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"date","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The date of this timeline entry."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Date"},"name":"Date","package":"typescript"}},{"name":"family","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The widget family."}]},"type":{"type":"reference","name":"WidgetFamily","package":"expo-widgets"}}]}},{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}]}},{"name":"WidgetFamily","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"The widget family (size).\n- "},{"kind":"code","text":"`systemSmall`"},{"kind":"text","text":" - Small square widget (2x2 grid).\n- "},{"kind":"code","text":"`systemMedium`"},{"kind":"text","text":" - Medium widget (4x2 grid).\n- "},{"kind":"code","text":"`systemLarge`"},{"kind":"text","text":" - Large widget (4x4 grid).\n- "},{"kind":"code","text":"`systemExtraLarge`"},{"kind":"text","text":" - Extra large widget (iPad only, 6x4 grid).\n- "},{"kind":"code","text":"`accessoryCircular`"},{"kind":"text","text":" - Circular accessory widget for the Lock Screen.\n- "},{"kind":"code","text":"`accessoryRectangular`"},{"kind":"text","text":" - Rectangular accessory widget for the Lock Screen.\n- "},{"kind":"code","text":"`accessoryInline`"},{"kind":"text","text":" - Inline accessory widget for the Lock Screen."}]},"type":{"type":"union","types":[{"type":"literal","value":"systemSmall"},{"type":"literal","value":"systemMedium"},{"type":"literal","value":"systemLarge"},{"type":"literal","value":"systemExtraLarge"},{"type":"literal","value":"accessoryCircular"},{"type":"literal","value":"accessoryRectangular"},{"type":"literal","value":"accessoryInline"}]}},{"name":"WidgetTimelineEntry","variant":"declaration","kind":2097152,"children":[{"name":"date","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Date when widget should update."}]},"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Date"},"name":"Date","package":"typescript"}},{"name":"props","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Props to be passed to the widget."}]},"type":{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}}],"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}]},{"name":"addPushToStartTokenListener","variant":"declaration","kind":64,"signatures":[{"name":"addPushToStartTokenListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener for push-to-start token events.\nThis token can be used to start live activities remotely via APNs."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An event subscription that can be used to remove the listener."}]}]},"parameters":[{"name":"listener","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback function to handle push-to-start token events."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reference","name":"PushToStartTokenEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/EventEmitter.ts","qualifiedName":"EventSubscription"},"name":"EventSubscription","package":"expo-modules-core"}}]},{"name":"addUserInteractionListener","variant":"declaration","kind":64,"signatures":[{"name":"addUserInteractionListener","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener for widget interaction events (for example, button taps)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An event subscription that can be used to remove the listener."}]}]},"parameters":[{"name":"listener","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback function to handle user interaction events."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"event","variant":"param","kind":32768,"type":{"type":"reference","name":"UserInteractionEvent","package":"expo-widgets"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/EventEmitter.ts","qualifiedName":"EventSubscription"},"name":"EventSubscription","package":"expo-modules-core"}}]},{"name":"createLiveActivity","variant":"declaration","kind":64,"signatures":[{"name":"createLiveActivity","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a Live Activity Factory for managing Live Activities of a specific type."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The Live Activity name. Must match the "},{"kind":"code","text":"`'name'`"},{"kind":"text","text":" field in your widget configuration in the app config."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"liveActivity","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The Live Activity component, marked with the "},{"kind":"code","text":"`'widget'`"},{"kind":"text","text":" directive."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"LiveActivityComponent","package":"expo-widgets"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"LiveActivityFactory","package":"expo-widgets"}}]},{"name":"createWidget","variant":"declaration","kind":64,"signatures":[{"name":"createWidget","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a Widget instance."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072,"type":{"type":"intrinsic","name":"object"},"default":{"type":"intrinsic","name":"object"}}],"parameters":[{"name":"name","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The widget name. Must match the "},{"kind":"code","text":"`'name'`"},{"kind":"text","text":" field in your widget configuration in the app config."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"widget","variant":"param","kind":32768,"comment":{"summary":[{"kind":"text","text":"The widget component, marked with the "},{"kind":"code","text":"`'widget'`"},{"kind":"text","text":" directive."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"WidgetBase","package":"expo-widgets"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"React.JSX.Element"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"expo-widgets","refersToTypeParameter":true}],"name":"Widget","package":"expo-widgets"}}]}],"packageName":"expo-widgets"}
\ No newline at end of file
diff --git a/packages/@expo/cli/CHANGELOG.md b/packages/@expo/cli/CHANGELOG.md
index 2a1b1a0b7f3566..7e87850ff20dd4 100644
--- a/packages/@expo/cli/CHANGELOG.md
+++ b/packages/@expo/cli/CHANGELOG.md
@@ -14,6 +14,7 @@
- Add `@react-navigation/core` and `@react-navigation/native` to autolinking resolution ([#43456](https://github.com/expo/expo/pull/43456) by [@kitten](https://github.com/kitten))
- Drop `expo-router/doctor` install check ([#43461](https://github.com/expo/expo/pull/43461) by [@kitten](https://github.com/kitten))
+- Pass on `tls` options from Metro config to Metro `runServer` fork ([#43186](https://github.com/expo/expo/pull/43186) by [@cortinico](https://github.com/cortinico))
## 55.0.12 — 2026-02-25
diff --git a/packages/@expo/cli/src/start/server/metro/MetroBundlerDevServer.ts b/packages/@expo/cli/src/start/server/metro/MetroBundlerDevServer.ts
index 1ecc08377fe287..8b9a5b3d0ed677 100644
--- a/packages/@expo/cli/src/start/server/metro/MetroBundlerDevServer.ts
+++ b/packages/@expo/cli/src/start/server/metro/MetroBundlerDevServer.ts
@@ -37,6 +37,7 @@ import {
type ImmutableRequest,
resolveLoaderContextKey,
} from 'expo-server/private';
+import https from 'https';
import path from 'path';
import {
@@ -1232,9 +1233,6 @@ export class MetroBundlerDevServer extends BundlerDevServer {
resetCache: options.resetDevServer,
};
- // Required for symbolication:
- process.env.EXPO_DEV_SERVER_ORIGIN = `http://localhost:${options.port}`;
-
event('start', {
mode,
web: this.isTargetingWeb(),
@@ -1257,6 +1255,11 @@ export class MetroBundlerDevServer extends BundlerDevServer {
}
);
+ const protocol = server instanceof https.Server ? 'https' : 'http';
+
+ // Required for symbolication:
+ process.env.EXPO_DEV_SERVER_ORIGIN = `${protocol}://localhost:${options.port}`;
+
if (!options.isExporting) {
const manifestMiddleware = await this.getManifestMiddlewareAsync(options);
@@ -1494,9 +1497,8 @@ export class MetroBundlerDevServer extends BundlerDevServer {
port: options.port,
// localhost isn't always correct.
host: 'localhost',
- // http is the only supported protocol on native.
- url: `http://localhost:${options.port}`,
- protocol: 'http',
+ url: `${protocol}://localhost:${options.port}`,
+ protocol,
},
middleware,
messageSocket,
diff --git a/packages/@expo/cli/src/start/server/metro/instantiateMetro.ts b/packages/@expo/cli/src/start/server/metro/instantiateMetro.ts
index 37f2222f2f378d..161f11683a8e2a 100644
--- a/packages/@expo/cli/src/start/server/metro/instantiateMetro.ts
+++ b/packages/@expo/cli/src/start/server/metro/instantiateMetro.ts
@@ -8,7 +8,7 @@ import MetroHmrServer, { Client as MetroHmrClient } from '@expo/metro/metro/HmrS
import RevisionNotFoundError from '@expo/metro/metro/IncrementalBundler/RevisionNotFoundError';
import type MetroServer from '@expo/metro/metro/Server';
import formatBundlingError from '@expo/metro/metro/lib/formatBundlingError';
-import { InputConfigT, mergeConfig, resolveConfig, type ConfigT } from '@expo/metro/metro-config';
+import { mergeConfig, resolveConfig, type ConfigT } from '@expo/metro/metro-config';
import { Terminal } from '@expo/metro/metro-core';
import { createStableModuleIdFactory, getDefaultConfig } from '@expo/metro-config';
import chalk from 'chalk';
@@ -21,7 +21,7 @@ import { MetroTerminalReporter } from './MetroTerminalReporter';
import { attachAtlasAsync } from './debugging/attachAtlas';
import { createDebugMiddleware } from './debugging/createDebugMiddleware';
import { createMetroMiddleware } from './dev-server/createMetroMiddleware';
-import { runServer } from './runServer-fork';
+import { runServer, type SecureServerOptions } from './runServer-fork';
import { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';
import { events, shouldReduceLogs } from '../../../events';
import { Log } from '../../../log';
@@ -359,6 +359,19 @@ export async function instantiateMetroAsync(
resetAtlasFile: isExporting,
});
+ // Support HTTPS based on the metro's tls server config
+ // TODO(@kitten): Remove cast once `@expo/metro` is updated to a Metro version that supports the tls config
+ const tls = (metroConfig.server as typeof metroConfig.server & { tls?: SecureServerOptions })
+ ?.tls;
+ const secureServerOptions = tls
+ ? {
+ key: tls.key,
+ cert: tls.cert,
+ ca: tls.ca,
+ requestCert: tls.requestCert,
+ }
+ : undefined;
+
const { address, server, hmrServer, metro } = await runServer(
metroBundler,
metroConfig,
@@ -366,6 +379,7 @@ export async function instantiateMetroAsync(
host: options.host,
websocketEndpoints,
watch: !isExporting && isWatchEnabled(),
+ secureServerOptions,
},
{
mockServer: isExporting,
diff --git a/packages/@expo/cli/src/start/server/metro/runServer-fork.ts b/packages/@expo/cli/src/start/server/metro/runServer-fork.ts
index a780d4ae5de88b..c890ce06890883 100644
--- a/packages/@expo/cli/src/start/server/metro/runServer-fork.ts
+++ b/packages/@expo/cli/src/start/server/metro/runServer-fork.ts
@@ -20,6 +20,25 @@ import { MetroBundlerDevServer } from './MetroBundlerDevServer';
import { Log } from '../../../log';
import type { ConnectAppType } from '../middleware/server.types';
+export interface SecureServerOptions {
+ readonly key: string | Buffer;
+ readonly cert: string | Buffer;
+ readonly ca: string | Buffer;
+ readonly requestCert: boolean;
+}
+
+interface RunServerOptionsFork {
+ hasReducedPerformance?: boolean;
+ host?: string;
+ onError?($$PARAM_0$$: Error & { code?: string }): void;
+ onReady?(server: http.Server | https.Server): void;
+ onClose?(): void;
+ websocketEndpoints?: RunServerOptions['websocketEndpoints'];
+ secureServerOptions?: SecureServerOptions;
+ waitForBundler?: boolean;
+ watch?: boolean;
+}
+
export const runServer = async (
_metroBundler: MetroBundlerDevServer,
config: ConfigT,
@@ -32,7 +51,7 @@ export const runServer = async (
waitForBundler = false,
websocketEndpoints = {},
watch,
- }: RunServerOptions,
+ }: RunServerOptionsFork,
{
mockServer,
}: {
diff --git a/packages/expo-brownfield/CHANGELOG.md b/packages/expo-brownfield/CHANGELOG.md
index 7d555a62c3b255..d74eeefdd6e1ce 100644
--- a/packages/expo-brownfield/CHANGELOG.md
+++ b/packages/expo-brownfield/CHANGELOG.md
@@ -6,6 +6,9 @@
### 🎉 New features
+- [android] add basic implementation of shared state for android ([#43097](https://github.com/expo/expo/pull/43097) by [@pmleczek](https://github.com/pmleczek))
+- [cli] allow shipping ios artifacts as swift package ([#43369](https://github.com/expo/expo/pull/43369) by [@pmleczek](https://github.com/pmleczek))
+
### 🐛 Bug fixes
### 💡 Others
diff --git a/packages/expo-brownfield/cli/build/commands/build-ios.js b/packages/expo-brownfield/cli/build/commands/build-ios.js
index 548ba5b7084fa0..fef8df0ba8ffa8 100644
--- a/packages/expo-brownfield/cli/build/commands/build-ios.js
+++ b/packages/expo-brownfield/cli/build/commands/build-ios.js
@@ -8,6 +8,7 @@ const buildIos = async (command) => {
await (0, utils_1.cleanUpArtifacts)(config);
(0, utils_1.makeArtifactsDirectory)(config);
await (0, utils_1.buildFramework)(config);
+ await (0, utils_1.createSwiftPackage)(config);
await (0, utils_1.createXcframework)(config);
await (0, utils_1.copyHermesXcframework)(config);
};
diff --git a/packages/expo-brownfield/cli/build/index.js b/packages/expo-brownfield/cli/build/index.js
index 01bffcdb826353..d4da7d947e0425 100644
--- a/packages/expo-brownfield/cli/build/index.js
+++ b/packages/expo-brownfield/cli/build/index.js
@@ -36,6 +36,7 @@ program
.option('-x, --xcworkspace ', 'path to the Xcode workspace (.xcworkspace)')
.option('-a, --artifacts ', 'path to the artifacts directory')
.option('--dry-run', 'only print the commands without executing them')
+ .option('-p, --package [package]', 'package artifacts as a Swift Package (with an optionally specified name)')
.action(async function () {
await (0, commands_1.buildIos)(this);
});
diff --git a/packages/expo-brownfield/cli/build/utils/config.js b/packages/expo-brownfield/cli/build/utils/config.js
index c7e0bfd89cae3f..5cf331e74f2622 100644
--- a/packages/expo-brownfield/cli/build/utils/config.js
+++ b/packages/expo-brownfield/cli/build/utils/config.js
@@ -26,17 +26,25 @@ const resolveBuildConfigIos = (options) => {
const buildProductsPath = node_path_1.default.join(derivedDataPath, 'Build/Products');
const buildConfiguration = resolveBuildConfiguration(options);
const device = node_path_1.default.join(buildProductsPath, `${buildConfiguration.toLowerCase()}-iphoneos`);
+ const scheme = resolveScheme(options);
const simulator = node_path_1.default.join(buildProductsPath, `${buildConfiguration.toLowerCase()}-iphonesimulator`);
const hermesFrameworkPath = 'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework';
+ const packageName = options.package && typeof options.package === 'string' ? options.package : `${scheme}Artifacts`;
+ const output = options.package
+ ? {
+ packageName,
+ }
+ : 'frameworks';
return {
...resolveCommonConfig(options),
artifacts,
+ output,
buildConfiguration,
derivedDataPath,
device,
simulator,
hermesFrameworkPath,
- scheme: resolveScheme(options),
+ scheme,
workspace: resolveWorkspace(options),
};
};
diff --git a/packages/expo-brownfield/cli/build/utils/ios.d.ts b/packages/expo-brownfield/cli/build/utils/ios.d.ts
index 9e36e1dfc3c68c..d891ecec29c0f6 100644
--- a/packages/expo-brownfield/cli/build/utils/ios.d.ts
+++ b/packages/expo-brownfield/cli/build/utils/ios.d.ts
@@ -2,8 +2,10 @@ import { IosConfig } from './types';
export declare const cleanUpArtifacts: (config: IosConfig) => Promise;
export declare const buildFramework: (config: IosConfig) => Promise;
export declare const copyHermesXcframework: (config: IosConfig) => Promise;
+export declare const createSwiftPackage: (config: IosConfig) => Promise;
export declare const createXcframework: (config: IosConfig) => Promise;
export declare const findScheme: () => string | undefined;
export declare const findWorkspace: (dryRun: boolean) => string | undefined;
+export declare const generatePackageMetadataFile: (config: IosConfig, packagePath: string) => Promise;
export declare const makeArtifactsDirectory: (config: IosConfig) => void;
export declare const printIosConfig: (config: IosConfig) => void;
diff --git a/packages/expo-brownfield/cli/build/utils/ios.js b/packages/expo-brownfield/cli/build/utils/ios.js
index 382a51387d1c0a..73cef7776e0ffd 100644
--- a/packages/expo-brownfield/cli/build/utils/ios.js
+++ b/packages/expo-brownfield/cli/build/utils/ios.js
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.printIosConfig = exports.makeArtifactsDirectory = exports.findWorkspace = exports.findScheme = exports.createXcframework = exports.copyHermesXcframework = exports.buildFramework = exports.cleanUpArtifacts = void 0;
+exports.printIosConfig = exports.makeArtifactsDirectory = exports.generatePackageMetadataFile = exports.findWorkspace = exports.findScheme = exports.createXcframework = exports.createSwiftPackage = exports.copyHermesXcframework = exports.buildFramework = exports.cleanUpArtifacts = void 0;
const chalk_1 = __importDefault(require("chalk"));
const node_fs_1 = __importDefault(require("node:fs"));
const node_path_1 = __importDefault(require("node:path"));
@@ -20,10 +20,7 @@ const cleanUpArtifacts = async (config) => {
if (!node_fs_1.default.existsSync(config.artifacts)) {
return;
}
- const xcframeworks = node_fs_1.default
- .readdirSync(config.artifacts)
- .filter((item) => item.endsWith('.xcframework'));
- xcframeworks.forEach((item) => {
+ node_fs_1.default.readdirSync(config.artifacts).forEach((item) => {
const itemPath = `${config.artifacts}/${item}`;
node_fs_1.default.rmSync(itemPath, { recursive: true, force: true });
});
@@ -63,8 +60,11 @@ const buildFramework = async (config) => {
};
exports.buildFramework = buildFramework;
const copyHermesXcframework = async (config) => {
+ const destinationPath = config.output === 'frameworks'
+ ? `${config.artifacts}/hermesvm.xcframework`
+ : `${config.artifacts}/${config.output.packageName}/xcframeworks/hermesvm.xcframework`;
if (config.dryRun) {
- console.log(`Copying hermes XCFramework from ${config.hermesFrameworkPath} to ${config.artifacts}/hermes.xcframework`);
+ console.log(`Copying hermes XCFramework from ${config.hermesFrameworkPath} to ${destinationPath}`);
return;
}
const sourcePath = `./ios/${config.hermesFrameworkPath}`;
@@ -72,7 +72,7 @@ const copyHermesXcframework = async (config) => {
error_1.default.handle('ios-hermes-framework-not-found', sourcePath);
}
return (0, spinner_1.withSpinner)({
- operation: async () => node_fs_1.default.cpSync(sourcePath, `${config.artifacts}/hermesvm.xcframework`, {
+ operation: async () => node_fs_1.default.promises.cp(sourcePath, destinationPath, {
force: true,
recursive: true,
}),
@@ -83,7 +83,34 @@ const copyHermesXcframework = async (config) => {
});
};
exports.copyHermesXcframework = copyHermesXcframework;
+const createSwiftPackage = async (config) => {
+ if (config.dryRun && config.output !== 'frameworks') {
+ console.log(`Creating Swift package with name: ${config.output.packageName} at path: ${config.artifacts}`);
+ return;
+ }
+ return (0, spinner_1.withSpinner)({
+ operation: async () => {
+ if (config.output === 'frameworks') {
+ return;
+ }
+ const packagePath = node_path_1.default.join(config.artifacts, config.output.packageName);
+ await node_fs_1.default.promises.mkdir(packagePath, { recursive: true });
+ // /xcframeworks
+ const xcframeworksDir = node_path_1.default.join(packagePath, 'xcframeworks');
+ await node_fs_1.default.promises.mkdir(xcframeworksDir, { recursive: true });
+ await (0, exports.generatePackageMetadataFile)(config, packagePath);
+ },
+ loaderMessage: 'Creating Swift package...',
+ successMessage: 'Creating Swift package succeeded',
+ errorMessage: 'Creating Swift package failed',
+ verbose: config.verbose,
+ });
+};
+exports.createSwiftPackage = createSwiftPackage;
const createXcframework = async (config) => {
+ const output = config.output === 'frameworks'
+ ? `${config.artifacts}/${config.scheme}.xcframework`
+ : `${config.artifacts}/${config.output.packageName}/xcframeworks/${config.scheme}.xcframework`;
const args = [
'-create-xcframework',
'-framework',
@@ -91,7 +118,7 @@ const createXcframework = async (config) => {
'-framework',
`${config.simulator}/${config.scheme}.framework`,
'-output',
- `${config.artifacts}/${config.scheme}.xcframework`,
+ output,
];
if (config.dryRun) {
console.log(`xcodebuild ${args.join(' ')}`);
@@ -155,6 +182,42 @@ const findWorkspace = (dryRun) => {
}
};
exports.findWorkspace = findWorkspace;
+// TODO(pmleczek): Add support for prebuilt RN frameworks in future PR
+const generatePackageMetadataFile = async (config, packagePath) => {
+ if (config.output === 'frameworks') {
+ return;
+ }
+ const xcframeworks = [
+ { name: config.scheme, targets: [config.scheme] },
+ { name: 'hermesvm', targets: ['hermesvm'] },
+ ];
+ const contents = `// swift-tools-version:5.9
+import PackageDescription
+
+let package = Package(
+ name: "${config.output.packageName}",
+ platforms: [.iOS(.v15)],
+ products: [${xcframeworks
+ .map((xcf) => `
+ .library(
+ name: "${xcf.name}",
+ targets: ["${xcf.targets.join('", "')}"],
+ ),
+ `)
+ .join('\n')}],
+ targets: [${xcframeworks
+ .map((xcf) => `
+ .binaryTarget(
+ name: "${xcf.name}",
+ path: "xcframeworks/${xcf.name}.xcframework",
+ ),
+ `)
+ .join('\n')}]
+);
+`;
+ await node_fs_1.default.promises.writeFile(node_path_1.default.join(packagePath, 'Package.swift'), contents);
+};
+exports.generatePackageMetadataFile = generatePackageMetadataFile;
const makeArtifactsDirectory = (config) => {
try {
if (!node_fs_1.default.existsSync(config.artifacts)) {
@@ -175,6 +238,9 @@ const printIosConfig = (config) => {
console.log(` - Dry run: ${chalk_1.default.blue(config.dryRun)}`);
console.log(` - Verbose: ${chalk_1.default.blue(config.verbose)}`);
console.log(` - Artifacts path: ${chalk_1.default.blue(config.artifacts)}`);
+ if (config.output !== 'frameworks') {
+ console.log(` - Package name: ${chalk_1.default.blue(config.output.packageName)}`);
+ }
console.log();
};
exports.printIosConfig = printIosConfig;
diff --git a/packages/expo-brownfield/cli/build/utils/types.d.ts b/packages/expo-brownfield/cli/build/utils/types.d.ts
index 2c4b92d3cf6a92..47bef6ed786ecb 100644
--- a/packages/expo-brownfield/cli/build/utils/types.d.ts
+++ b/packages/expo-brownfield/cli/build/utils/types.d.ts
@@ -25,6 +25,9 @@ export interface AndroidConfig extends CommonConfig {
tasks: string[];
variant: BuildVariant;
}
+export interface PackageConfiguration {
+ packageName: string;
+}
export type BuildConfiguration = 'Debug' | 'Release';
export interface IosConfig extends CommonConfig {
artifacts: string;
@@ -32,6 +35,7 @@ export interface IosConfig extends CommonConfig {
derivedDataPath: string;
device: string;
hermesFrameworkPath: string;
+ output: 'frameworks' | PackageConfiguration;
scheme: string;
simulator: string;
workspace: string;
diff --git a/packages/expo-brownfield/cli/src/commands/build-ios.ts b/packages/expo-brownfield/cli/src/commands/build-ios.ts
index ca5bed14ba0ee5..239a4458b433ee 100644
--- a/packages/expo-brownfield/cli/src/commands/build-ios.ts
+++ b/packages/expo-brownfield/cli/src/commands/build-ios.ts
@@ -3,6 +3,7 @@ import type { Command } from 'commander';
import {
buildFramework,
cleanUpArtifacts,
+ createSwiftPackage,
createXcframework,
copyHermesXcframework,
makeArtifactsDirectory,
@@ -20,6 +21,7 @@ const buildIos = async (command: Command) => {
await cleanUpArtifacts(config);
makeArtifactsDirectory(config);
await buildFramework(config);
+ await createSwiftPackage(config);
await createXcframework(config);
await copyHermesXcframework(config);
};
diff --git a/packages/expo-brownfield/cli/src/index.ts b/packages/expo-brownfield/cli/src/index.ts
index e6c2905e65c814..af05f8ce5ba24c 100644
--- a/packages/expo-brownfield/cli/src/index.ts
+++ b/packages/expo-brownfield/cli/src/index.ts
@@ -39,6 +39,10 @@ program
.option('-x, --xcworkspace ', 'path to the Xcode workspace (.xcworkspace)')
.option('-a, --artifacts ', 'path to the artifacts directory')
.option('--dry-run', 'only print the commands without executing them')
+ .option(
+ '-p, --package [package]',
+ 'package artifacts as a Swift Package (with an optionally specified name)'
+ )
.action(async function (this: Command) {
await buildIos(this);
});
diff --git a/packages/expo-brownfield/cli/src/utils/config.ts b/packages/expo-brownfield/cli/src/utils/config.ts
index e7268aca242b61..8326dd522fcf8b 100644
--- a/packages/expo-brownfield/cli/src/utils/config.ts
+++ b/packages/expo-brownfield/cli/src/utils/config.ts
@@ -33,6 +33,7 @@ export const resolveBuildConfigIos = (options: OptionValues): IosConfig => {
const buildConfiguration = resolveBuildConfiguration(options);
const device = path.join(buildProductsPath, `${buildConfiguration.toLowerCase()}-iphoneos`);
+ const scheme = resolveScheme(options);
const simulator = path.join(
buildProductsPath,
`${buildConfiguration.toLowerCase()}-iphonesimulator`
@@ -40,16 +41,24 @@ export const resolveBuildConfigIos = (options: OptionValues): IosConfig => {
const hermesFrameworkPath =
'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework';
+ const packageName =
+ options.package && typeof options.package === 'string' ? options.package : `${scheme}Artifacts`;
+ const output = options.package
+ ? {
+ packageName,
+ }
+ : 'frameworks';
return {
...resolveCommonConfig(options),
artifacts,
+ output,
buildConfiguration,
derivedDataPath,
device,
simulator,
hermesFrameworkPath,
- scheme: resolveScheme(options),
+ scheme,
workspace: resolveWorkspace(options),
};
};
diff --git a/packages/expo-brownfield/cli/src/utils/ios.ts b/packages/expo-brownfield/cli/src/utils/ios.ts
index 87b8799ec9f105..0ec38f74ac182b 100644
--- a/packages/expo-brownfield/cli/src/utils/ios.ts
+++ b/packages/expo-brownfield/cli/src/utils/ios.ts
@@ -19,10 +19,7 @@ export const cleanUpArtifacts = async (config: IosConfig) => {
return;
}
- const xcframeworks = fs
- .readdirSync(config.artifacts)
- .filter((item) => item.endsWith('.xcframework'));
- xcframeworks.forEach((item) => {
+ fs.readdirSync(config.artifacts).forEach((item) => {
const itemPath = `${config.artifacts}/${item}`;
fs.rmSync(itemPath, { recursive: true, force: true });
});
@@ -64,9 +61,14 @@ export const buildFramework = async (config: IosConfig) => {
};
export const copyHermesXcframework = async (config: IosConfig) => {
+ const destinationPath =
+ config.output === 'frameworks'
+ ? `${config.artifacts}/hermesvm.xcframework`
+ : `${config.artifacts}/${config.output.packageName}/xcframeworks/hermesvm.xcframework`;
+
if (config.dryRun) {
console.log(
- `Copying hermes XCFramework from ${config.hermesFrameworkPath} to ${config.artifacts}/hermes.xcframework`
+ `Copying hermes XCFramework from ${config.hermesFrameworkPath} to ${destinationPath}`
);
return;
}
@@ -78,7 +80,7 @@ export const copyHermesXcframework = async (config: IosConfig) => {
return withSpinner({
operation: async () =>
- fs.cpSync(sourcePath, `${config.artifacts}/hermesvm.xcframework`, {
+ fs.promises.cp(sourcePath, destinationPath, {
force: true,
recursive: true,
}),
@@ -89,7 +91,42 @@ export const copyHermesXcframework = async (config: IosConfig) => {
});
};
+export const createSwiftPackage = async (config: IosConfig) => {
+ if (config.dryRun && config.output !== 'frameworks') {
+ console.log(
+ `Creating Swift package with name: ${config.output.packageName} at path: ${config.artifacts}`
+ );
+ return;
+ }
+
+ return withSpinner({
+ operation: async () => {
+ if (config.output === 'frameworks') {
+ return;
+ }
+
+ const packagePath = path.join(config.artifacts, config.output.packageName);
+ await fs.promises.mkdir(packagePath, { recursive: true });
+
+ // /xcframeworks
+ const xcframeworksDir = path.join(packagePath, 'xcframeworks');
+ await fs.promises.mkdir(xcframeworksDir, { recursive: true });
+
+ await generatePackageMetadataFile(config, packagePath);
+ },
+ loaderMessage: 'Creating Swift package...',
+ successMessage: 'Creating Swift package succeeded',
+ errorMessage: 'Creating Swift package failed',
+ verbose: config.verbose,
+ });
+};
+
export const createXcframework = async (config: IosConfig) => {
+ const output =
+ config.output === 'frameworks'
+ ? `${config.artifacts}/${config.scheme}.xcframework`
+ : `${config.artifacts}/${config.output.packageName}/xcframeworks/${config.scheme}.xcframework`;
+
const args = [
'-create-xcframework',
'-framework',
@@ -97,7 +134,7 @@ export const createXcframework = async (config: IosConfig) => {
'-framework',
`${config.simulator}/${config.scheme}.framework`,
'-output',
- `${config.artifacts}/${config.scheme}.xcframework`,
+ output,
];
if (config.dryRun) {
@@ -169,6 +206,49 @@ export const findWorkspace = (dryRun: boolean): string | undefined => {
}
};
+// TODO(pmleczek): Add support for prebuilt RN frameworks in future PR
+export const generatePackageMetadataFile = async (config: IosConfig, packagePath: string) => {
+ if (config.output === 'frameworks') {
+ return;
+ }
+
+ const xcframeworks = [
+ { name: config.scheme, targets: [config.scheme] },
+ { name: 'hermesvm', targets: ['hermesvm'] },
+ ];
+
+ const contents = `// swift-tools-version:5.9
+import PackageDescription
+
+let package = Package(
+ name: "${config.output.packageName}",
+ platforms: [.iOS(.v15)],
+ products: [${xcframeworks
+ .map(
+ (xcf) => `
+ .library(
+ name: "${xcf.name}",
+ targets: ["${xcf.targets.join('", "')}"],
+ ),
+ `
+ )
+ .join('\n')}],
+ targets: [${xcframeworks
+ .map(
+ (xcf) => `
+ .binaryTarget(
+ name: "${xcf.name}",
+ path: "xcframeworks/${xcf.name}.xcframework",
+ ),
+ `
+ )
+ .join('\n')}]
+);
+`;
+
+ await fs.promises.writeFile(path.join(packagePath, 'Package.swift'), contents);
+};
+
export const makeArtifactsDirectory = (config: IosConfig) => {
try {
if (!fs.existsSync(config.artifacts)) {
@@ -188,5 +268,10 @@ export const printIosConfig = (config: IosConfig) => {
console.log(` - Dry run: ${chalk.blue(config.dryRun)}`);
console.log(` - Verbose: ${chalk.blue(config.verbose)}`);
console.log(` - Artifacts path: ${chalk.blue(config.artifacts)}`);
+
+ if (config.output !== 'frameworks') {
+ console.log(` - Package name: ${chalk.blue(config.output.packageName)}`);
+ }
+
console.log();
};
diff --git a/packages/expo-brownfield/cli/src/utils/types.ts b/packages/expo-brownfield/cli/src/utils/types.ts
index 84f03968d9a4f2..5a3f9565c6c52c 100644
--- a/packages/expo-brownfield/cli/src/utils/types.ts
+++ b/packages/expo-brownfield/cli/src/utils/types.ts
@@ -25,19 +25,26 @@ export interface CommonConfig {
}
export type BuildVariant = 'All' | 'Debug' | 'Release';
+
export interface AndroidConfig extends CommonConfig {
library: string;
tasks: string[];
variant: BuildVariant;
}
+export interface PackageConfiguration {
+ packageName: string;
+}
+
export type BuildConfiguration = 'Debug' | 'Release';
+
export interface IosConfig extends CommonConfig {
artifacts: string;
buildConfiguration: BuildConfiguration;
derivedDataPath: string;
device: string;
hermesFrameworkPath: string;
+ output: 'frameworks' | PackageConfiguration;
scheme: string;
simulator: string;
workspace: string;
diff --git a/packages/expo-brownfield/e2e/cli/__tests__/__snapshots__/build-ios.test.ts.snap b/packages/expo-brownfield/e2e/cli/__tests__/__snapshots__/build-ios.test.ts.snap
index 0f4d0c8af0774e..d7c4ef50c4d0e0 100644
--- a/packages/expo-brownfield/e2e/cli/__tests__/__snapshots__/build-ios.test.ts.snap
+++ b/packages/expo-brownfield/e2e/cli/__tests__/__snapshots__/build-ios.test.ts.snap
@@ -14,6 +14,8 @@ Options:
-a, --artifacts path to the artifacts directory
--dry-run only print the commands without executing
them
+ -p, --package [package] package artifacts as a Swift Package (with an
+ optionally specified name)
-h, --help display help for command"
`;
@@ -31,6 +33,8 @@ Options:
-a, --artifacts path to the artifacts directory
--dry-run only print the commands without executing
them
+ -p, --package [package] package artifacts as a Swift Package (with an
+ optionally specified name)
-h, --help display help for command"
`;
@@ -48,5 +52,7 @@ Options:
-a, --artifacts path to the artifacts directory
--dry-run only print the commands without executing
them
+ -p, --package [package] package artifacts as a Swift Package (with an
+ optionally specified name)
-h, --help display help for command"
`;
diff --git a/packages/expo-brownfield/e2e/cli/__tests__/build-ios.test.ts b/packages/expo-brownfield/e2e/cli/__tests__/build-ios.test.ts
index f8ff35ada5df95..05a196f7ddab00 100644
--- a/packages/expo-brownfield/e2e/cli/__tests__/build-ios.test.ts
+++ b/packages/expo-brownfield/e2e/cli/__tests__/build-ios.test.ts
@@ -281,7 +281,7 @@ describe('build:ios command', () => {
});
/**
- * Command: npx expo-brownfield build:ios --dry-run -s/--scheme someworkspace.xcworkspace
+ * Command: npx expo-brownfield build:ios --dry-run -a/--artifacts ../artifacts
* Expected behavior: The CLI should print the build configuration with the correct workspace
*/
it('should properly handle --artifacts option', async () => {
@@ -297,5 +297,24 @@ describe('build:ios command', () => {
stdout: [`- Artifacts path: ${expectedPath}`],
});
});
+
+ it('should properly handle --package option', async () => {
+ await buildIosTest({
+ directory: TEMP_DIR_PREBUILD,
+ args: ['--dry-run', '-p', 'MyAppArtifacts'],
+ stdout: [
+ BUILD_IOS.PACKAGE_CREATION('MyAppArtifacts'),
+ BUILD_IOS.PACKAGE_CONFIGURATION('MyAppArtifacts'),
+ ],
+ });
+ await buildIosTest({
+ directory: TEMP_DIR_PREBUILD,
+ args: ['--dry-run', '--package', 'MyAppArtifacts'],
+ stdout: [
+ BUILD_IOS.PACKAGE_CREATION('MyAppArtifacts'),
+ BUILD_IOS.PACKAGE_CONFIGURATION('MyAppArtifacts'),
+ ],
+ });
+ });
});
});
diff --git a/packages/expo-brownfield/e2e/utils/output.ts b/packages/expo-brownfield/e2e/utils/output.ts
index 70b7f17756cc08..c64a424684df0e 100644
--- a/packages/expo-brownfield/e2e/utils/output.ts
+++ b/packages/expo-brownfield/e2e/utils/output.ts
@@ -62,6 +62,9 @@ export const BUILD_IOS = {
`-framework ${projectRoot}/ios/build/Build/Products/${configuration.toLowerCase()}-iphonesimulator/testapp${workspace}brownfield.framework`,
`-output ${projectRoot}/artifacts/testapp${workspace}brownfield.xcframework`,
],
+ PACKAGE_CONFIGURATION: (packageName: string) => `- Package name: ${packageName}`,
+ PACKAGE_CREATION: (packageName: string) =>
+ `Creating Swift package with name: ${packageName} at path:`,
};
/**
diff --git a/packages/expo-calendar/CHANGELOG.md b/packages/expo-calendar/CHANGELOG.md
index 7711fdc7546b2d..e779982939eabb 100644
--- a/packages/expo-calendar/CHANGELOG.md
+++ b/packages/expo-calendar/CHANGELOG.md
@@ -8,6 +8,8 @@
### 🐛 Bug fixes
+- Fixed `NumberFormatException` crash on Android when calendar/event IDs exceed `Integer.MAX_VALUE`. ([#43344](https://github.com/expo/expo/pull/43344) by [@olivier-bouillet](https://github.com/olivier-bouillet))
+
### 💡 Others
## 55.0.8 — 2026-02-25
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/CalendarModule.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/CalendarModule.kt
index 605774cb8145ea..2d9f930a23a529 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/CalendarModule.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/CalendarModule.kt
@@ -217,7 +217,7 @@ class CalendarModule : Module() {
//endregion
- private suspend fun saveEvent(eventInput: Either): Int {
+ private suspend fun saveEvent(eventInput: Either): Long {
return if (eventInput.`is`(EventUpdateInput::class)) {
eventRepository.updateEvent(eventInput.second())
} else {
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/attendee/AttendeeRepository.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/attendee/AttendeeRepository.kt
index 670c7f8666b5c8..592a2ab43158eb 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/attendee/AttendeeRepository.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/attendee/AttendeeRepository.kt
@@ -31,7 +31,7 @@ class AttendeeRepository(context: Context) {
}
}
- suspend fun saveAttendeeForEvent(attendee: Attendee, eventID: String?): Int {
+ suspend fun saveAttendeeForEvent(attendee: Attendee, eventID: String?): Long {
return if (attendee.isNewAttendeePayload) {
contentResolver.insertAttendee(attendee, eventID)
} else {
@@ -40,7 +40,7 @@ class AttendeeRepository(context: Context) {
}
suspend fun deleteAttendee(attendeeId: String): Boolean {
- val uri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeId.toInt().toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeId.toLong())
val rows = withContext(Dispatchers.IO) {
contentResolver.delete(uri, null, null)
}
@@ -59,9 +59,9 @@ class AttendeeRepository(context: Context) {
}
}
-private suspend fun ContentResolver.insertAttendee(attendee: Attendee, eventID: String?): Int {
+private suspend fun ContentResolver.insertAttendee(attendee: Attendee, eventID: String?): Long {
val contentValues = attendee.toContentValues().apply {
- put(CalendarContract.Attendees.EVENT_ID, eventID?.toInt())
+ put(CalendarContract.Attendees.EVENT_ID, eventID?.toLong())
}
val attendeesUri = CalendarContract.Attendees.CONTENT_URI
@@ -69,13 +69,13 @@ private suspend fun ContentResolver.insertAttendee(attendee: Attendee, eventID:
val attendeeId = requireNotNull(attendeeUri?.lastPathSegment) {
"Couldn't decode attendee ID from inserted content URI"
}
- return attendeeId.toInt()
+ return attendeeId.toLong()
}
-private suspend fun ContentResolver.updateAttendee(attendee: Attendee): Int {
- val attendeeId = requireNotNull(attendee.id?.toInt()) { "Attendee ID must be present when updating" }
+private suspend fun ContentResolver.updateAttendee(attendee: Attendee): Long {
+ val attendeeId = requireNotNull(attendee.id?.toLong()) { "Attendee ID must be present when updating" }
- val updateUri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeId.toLong())
+ val updateUri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeId)
withContext(Dispatchers.IO) {
update(updateUri, attendee.toContentValues(), null, null)
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/calendar/CalendarRepository.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/calendar/CalendarRepository.kt
index 0a29de7505a5af..7e0ac07d44dfc1 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/calendar/CalendarRepository.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/calendar/CalendarRepository.kt
@@ -32,7 +32,7 @@ class CalendarRepository(context: Context) {
}
suspend fun findCalendarById(calendarId: String): CalendarEntity? = withContext(Dispatchers.IO) {
- val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId.toInt().toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId.toLong())
val cursor = contentResolver.query(
uri,
findCalendarByIdQueryFields,
@@ -46,7 +46,7 @@ class CalendarRepository(context: Context) {
}
}
- suspend fun createCalendar(calendarInput: NewCalendarInput): Int {
+ suspend fun createCalendar(calendarInput: NewCalendarInput): Long {
val uriBuilder = CalendarContract.Calendars.CONTENT_URI
.buildUpon()
.appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
@@ -60,12 +60,12 @@ class CalendarRepository(context: Context) {
val calendarId = requireNotNull(calendarUri?.lastPathSegment) {
"Couldn't decode calendar ID from inserted content URI"
}
- return calendarId.toInt()
+ return calendarId.toLong()
}
- suspend fun updateCalendar(updateInput: CalendarUpdateInput): Int {
- val calendarId = updateInput.id.toInt()
- val updateUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId.toLong())
+ suspend fun updateCalendar(updateInput: CalendarUpdateInput): Long {
+ val calendarId = updateInput.id.toLong()
+ val updateUri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId)
withContext(Dispatchers.IO) {
contentResolver.update(updateUri, updateInput.toContentValues(), null, null)
}
@@ -74,7 +74,7 @@ class CalendarRepository(context: Context) {
@Throws(SecurityException::class)
suspend fun deleteCalendar(calendarId: String): Boolean {
- val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId.toInt().toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarId.toLong())
val rows = withContext(Dispatchers.IO) {
contentResolver.delete(uri, null, null)
}
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/event/EventRepository.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/event/EventRepository.kt
index 3fbc5b8d46e1e6..25a50cbfe0f893 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/event/EventRepository.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/domain/event/EventRepository.kt
@@ -56,7 +56,7 @@ class EventRepository(context: Context) {
}
suspend fun findEventById(eventId: String): EventEntity? = withContext(Dispatchers.IO) {
- val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId.toInt().toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId.toLong())
val selection = "((${CalendarContract.Events.DELETED} != 1))"
val cursor = contentResolver.query(
uri,
@@ -71,9 +71,9 @@ class EventRepository(context: Context) {
}
}
- suspend fun createEvent(eventInput: NewEventInput): Int = withContext(Dispatchers.IO) {
+ suspend fun createEvent(eventInput: NewEventInput): Long = withContext(Dispatchers.IO) {
val payload = eventInput.toContentValues().apply {
- put(CalendarContract.Events.CALENDAR_ID, eventInput.calendarId.toInt())
+ put(CalendarContract.Events.CALENDAR_ID, eventInput.calendarId.toLong())
}
val eventsUri = CalendarContract.Events.CONTENT_URI
@@ -82,7 +82,7 @@ class EventRepository(context: Context) {
val eventId = requireNotNull(eventUri.lastPathSegment) {
"Couldn't decode event ID from inserted content URI"
- }.toInt()
+ }.toLong()
eventInput.alarms?.let { reminders ->
createRemindersForEvent(eventId, reminders)
@@ -91,9 +91,9 @@ class EventRepository(context: Context) {
return@withContext eventId
}
- suspend fun updateEvent(updateInput: EventUpdateInput): Int = withContext(Dispatchers.IO) {
- val eventID = updateInput.id.toInt()
- val updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID.toLong())
+ suspend fun updateEvent(updateInput: EventUpdateInput): Long = withContext(Dispatchers.IO) {
+ val eventID = updateInput.id.toLong()
+ val updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
contentResolver.update(updateUri, updateInput.toContentValues(), null, null)
removeRemindersForEvent(eventID)
@@ -124,7 +124,7 @@ class EventRepository(context: Context) {
return@withContext true
}
- private suspend fun createRemindersForEvent(eventId: Int, reminders: List) = withContext(Dispatchers.IO) {
+ private suspend fun createRemindersForEvent(eventId: Long, reminders: List) = withContext(Dispatchers.IO) {
for (reminder in reminders) {
ensureActive()
if (reminder.relativeOffset == null) {
@@ -143,11 +143,11 @@ class EventRepository(context: Context) {
}
}
- private suspend fun removeRemindersForEvent(eventId: Int) = withContext(Dispatchers.IO) {
+ private suspend fun removeRemindersForEvent(eventId: Long) = withContext(Dispatchers.IO) {
val projection = arrayOf(CalendarContract.Reminders._ID)
val cursor = CalendarContract.Reminders.query(
contentResolver,
- eventId.toLong(),
+ eventId,
projection
)
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendar.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendar.kt
index 40fd6e5db4e42a..3de127eb79dcc7 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendar.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendar.kt
@@ -52,9 +52,9 @@ class ExpoCalendar(
suspend fun deleteCalendar(): Boolean {
return withContext(Dispatchers.IO) {
- val calendarID = calendarRecord?.id?.toIntOrNull()
+ val calendarID = calendarRecord?.id?.toLongOrNull()
?: throw EventNotFoundException("Calendar id is null")
- val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarID.toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarID)
val contentResolver = reactContext.contentResolver
val rows = contentResolver.delete(uri, null, null)
calendarRecord = null
@@ -123,7 +123,7 @@ class ExpoCalendar(
}
companion object {
- suspend fun updateCalendar(appContext: AppContext, calendarRecord: CalendarRecord, isNew: Boolean = false): Int {
+ suspend fun updateCalendar(appContext: AppContext, calendarRecord: CalendarRecord, isNew: Boolean = false): Long {
return withContext(Dispatchers.IO) {
if (isNew) {
if (calendarRecord.title == null) {
@@ -204,7 +204,7 @@ class ExpoCalendar(
val calendarsUri = uriBuilder.build()
val calendarUri = contentResolver.insert(calendarsUri, values)
- val calendarId = calendarUri?.lastPathSegment!!.toInt()
+ val calendarId = calendarUri?.lastPathSegment!!.toLong()
calendarId
} else {
val uri = CalendarContract.Calendars.CONTENT_URI.buildUpon().appendPath(calendarRecord.id).build()
@@ -212,7 +212,7 @@ class ExpoCalendar(
if (rowsUpdated == 0) {
throw CalendarCouldNotBeUpdatedException("Failed to update calendar")
}
- calendarRecord.id!!.toInt()
+ calendarRecord.id!!.toLong()
}
}
}
@@ -240,7 +240,7 @@ class ExpoCalendar(
suspend fun findExpoCalendarById(context: AppContext, calendarID: String): ExpoCalendar? {
return withContext(Dispatchers.IO) {
- val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarID.toInt().toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI, calendarID.toLong())
val contentResolver = (
context.reactContext
?: throw Exceptions.ReactContextLost()
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarAttendee.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarAttendee.kt
index 316d0cb011258e..992ca99fc8d260 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarAttendee.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarAttendee.kt
@@ -27,7 +27,7 @@ class ExpoCalendarAttendee(
val reactContext: Context
get() = appContext?.reactContext ?: throw Exceptions.ReactContextLost()
- suspend fun saveAttendee(attendeeRecord: AttendeeRecord, eventId: Int? = null, nullableFields: List? = null): String {
+ suspend fun saveAttendee(attendeeRecord: AttendeeRecord, eventId: Long? = null, nullableFields: List? = null): String {
return withContext(Dispatchers.IO) {
val attendeeValues = buildAttendeeContentValues(attendeeRecord, eventId)
val contentResolver = reactContext.contentResolver
@@ -55,12 +55,12 @@ class ExpoCalendarAttendee(
suspend fun deleteAttendee() {
return withContext(Dispatchers.IO) {
- val attendeeID = attendeeRecord?.id?.toIntOrNull()
+ val attendeeID = attendeeRecord?.id?.toLongOrNull()
?: throw AttendeeCouldNotBeDeletedException("Attendee ID not found")
val contentResolver = reactContext.contentResolver
- val uri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeID.toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeID)
val rows = contentResolver.delete(uri, null, null)
attendeeRecord = null
check(rows > 0) { throw AttendeeCouldNotBeDeletedException("An error occurred while deleting attendee") }
@@ -69,11 +69,11 @@ class ExpoCalendarAttendee(
suspend fun reloadAttendee(attendeeID: String? = null) {
withContext(Dispatchers.IO) {
- val attendeeID = (attendeeID ?: attendeeRecord?.id)?.toIntOrNull()
+ val attendeeID = (attendeeID ?: attendeeRecord?.id)?.toLongOrNull()
?: throw AttendeeNotFoundException("Attendee ID not found")
val contentResolver = reactContext.contentResolver
- val uri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeID.toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Attendees.CONTENT_URI, attendeeID)
val projection = AttendeeRepository.findAttendeesByEventIdQueryParameters
val cursor = contentResolver.query(uri, projection, null, null, null)
requireNotNull(cursor) { "Cursor shouldn't be null" }
@@ -104,7 +104,7 @@ class ExpoCalendarAttendee(
}
}
- private fun buildAttendeeContentValues(attendeeRecord: AttendeeRecord, eventId: Int?): ContentValues {
+ private fun buildAttendeeContentValues(attendeeRecord: AttendeeRecord, eventId: Long?): ContentValues {
val values = ContentValues()
eventId?.let { values.put(CalendarContract.Attendees.EVENT_ID, it) }
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarEvent.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarEvent.kt
index 15e21300413252..eb7eaa6add3954 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarEvent.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/ExpoCalendarEvent.kt
@@ -39,7 +39,7 @@ class ExpoCalendarEvent(
val reactContext: Context
get() = appContext?.reactContext ?: throw Exceptions.ReactContextLost()
- suspend fun saveEvent(eventRecord: EventRecord, calendarId: String? = null, nullableFields: List? = null): Int? {
+ suspend fun saveEvent(eventRecord: EventRecord, calendarId: String? = null, nullableFields: List? = null): Long? {
return withContext(Dispatchers.IO) {
val eventBuilder = CalendarBuilderNext()
@@ -92,10 +92,10 @@ class ExpoCalendarEvent(
if (this@ExpoCalendarEvent.eventRecord?.id != null) {
// Update current event
- val eventID = this@ExpoCalendarEvent.eventRecord?.id?.toIntOrNull()
+ val eventID = this@ExpoCalendarEvent.eventRecord?.id?.toLongOrNull()
?: throw EventNotFoundException("Event ID is required")
- val updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID.toLong())
+ val updateUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val contentResolver = reactContext.contentResolver
contentResolver.update(updateUri, eventBuilder.build(), null, null)
@@ -111,12 +111,12 @@ class ExpoCalendarEvent(
if (calendarId == null) {
throw InvalidArgumentException("CalendarId is required.")
}
- eventBuilder.put(CalendarContract.Events.CALENDAR_ID, calendarId.toInt())
+ eventBuilder.put(CalendarContract.Events.CALENDAR_ID, calendarId.toLong())
val eventsUri = CalendarContract.Events.CONTENT_URI
val contentResolver = reactContext.contentResolver
val eventUri = contentResolver.insert(eventsUri, eventBuilder.build())
?: throw EventsCouldNotBeCreatedException("Failed to insert event into the database")
- val eventID = eventUri.lastPathSegment!!.toInt()
+ val eventID = eventUri.lastPathSegment!!.toLong()
if (eventRecord.alarms != null) {
createRemindersForEvent(eventID, eventRecord.alarms)
}
@@ -127,7 +127,7 @@ class ExpoCalendarEvent(
suspend fun createAttendee(attendeeRecord: AttendeeRecord): ExpoCalendarAttendee? {
val attendee = ExpoCalendarAttendee(appContext ?: throw Exceptions.AppContextLost())
- val eventId = eventRecord?.id?.toIntOrNull()
+ val eventId = eventRecord?.id?.toLongOrNull()
?: throw EventNotFoundException("Event ID is required")
val newAttendeeId = attendee.saveAttendee(attendeeRecord, eventId)
@@ -137,7 +137,7 @@ class ExpoCalendarEvent(
suspend fun deleteEvent() {
withContext(Dispatchers.IO) {
- val eventID = eventRecord?.id?.toInt()
+ val eventID = eventRecord?.id?.toLong()
?: throw EventCouldNotBeDeletedException("Event ID is required")
val contentResolver = reactContext.contentResolver
@@ -145,7 +145,7 @@ class ExpoCalendarEvent(
if (options?.futureEvents == null || options?.futureEvents == false) {
val url = ContentUris.withAppendedId(
CalendarContract.Events.CONTENT_URI,
- eventID.toLong()
+ eventID
)
contentResolver
.delete(url, null, null)
@@ -169,7 +169,7 @@ class ExpoCalendarEvent(
exceptionValues.put(CalendarContract.Events.ORIGINAL_INSTANCE_TIME, startCal.timeInMillis)
exceptionValues.put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CANCELED)
- val exceptionUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_EXCEPTION_URI, eventID.toLong())
+ val exceptionUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_EXCEPTION_URI, eventID)
contentResolver.insert(exceptionUri, exceptionValues)
}
}
@@ -177,11 +177,11 @@ class ExpoCalendarEvent(
suspend fun reloadEvent(eventId: String? = null) {
withContext(Dispatchers.IO) {
- val eventID = (eventId ?: eventRecord?.id)?.toIntOrNull()
+ val eventID = (eventId ?: eventRecord?.id)?.toLongOrNull()
?: throw EventNotFoundException("Event ID is required")
val contentResolver = reactContext.contentResolver
- val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID.toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID)
val projection = EventRepository.findEventByIdQueryParameters
val cursor = contentResolver.query(uri, projection, null, null, null)
@@ -255,7 +255,7 @@ class ExpoCalendarEvent(
}
}
- private fun createRemindersForEvent(eventID: Int, reminders: List) {
+ private fun createRemindersForEvent(eventID: Long, reminders: List) {
val contentResolver = reactContext.contentResolver
reminders
.filter { it.relativeOffset != null }
@@ -290,7 +290,7 @@ class ExpoCalendarEvent(
companion object {
suspend fun findEventById(eventID: String, appContext: AppContext): ExpoCalendarEvent? {
return withContext(Dispatchers.IO) {
- val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID.toInt().toLong())
+ val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventID.toLong())
val selection = "((${CalendarContract.Events.DELETED} != 1))"
val projection = EventRepository.findEventByIdQueryParameters
val contentResolver = appContext.reactContext?.contentResolver
diff --git a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/utils/EventNextUtils.kt b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/utils/EventNextUtils.kt
index 4de97908914678..f5be417feb862d 100644
--- a/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/utils/EventNextUtils.kt
+++ b/packages/expo-calendar/android/src/main/java/expo/modules/calendar/next/utils/EventNextUtils.kt
@@ -38,13 +38,13 @@ fun dateToMilliseconds(stringValue: String?): Long? {
return cal.timeInMillis
}
-fun removeRemindersForEvent(contentResolver: ContentResolver, eventID: Int) {
+fun removeRemindersForEvent(contentResolver: ContentResolver, eventID: Long) {
val projection = arrayOf(
CalendarContract.Reminders._ID
)
val cursor = CalendarContract.Reminders.query(
contentResolver,
- eventID.toLong(),
+ eventID,
projection
)
diff --git a/packages/expo-widgets/CHANGELOG.md b/packages/expo-widgets/CHANGELOG.md
index a51ffa750cd3f6..b27621662b98dc 100644
--- a/packages/expo-widgets/CHANGELOG.md
+++ b/packages/expo-widgets/CHANGELOG.md
@@ -6,6 +6,8 @@
### 🎉 New features
+- Add support for `after(date)` dismissal policy, final content state, and `contentDate` when ending a Live Activity. ([#43472](https://github.com/expo/expo/pull/43472) by [@jakex7](https://github.com/jakex7))
+
### 🐛 Bug fixes
- Add missing project root to `watchFolders` in `metro.config.js` ([#43449](https://github.com/expo/expo/pull/43449) by [@kitten](https://github.com/kitten))
diff --git a/packages/expo-widgets/build/Widgets.d.ts b/packages/expo-widgets/build/Widgets.d.ts
index 83b792f66413c0..bf75a5b583e324 100644
--- a/packages/expo-widgets/build/Widgets.d.ts
+++ b/packages/expo-widgets/build/Widgets.d.ts
@@ -41,8 +41,11 @@ export declare class LiveActivity {
/**
* Ends the Live Activity.
* @param dismissalPolicy Controls when the Live Activity is removed from the Lock Screen after ending.
+ * Can be `'default'`, `'immediate'`, or `after(date)`.
+ * @param props Final content properties to update after the activity ends.
+ * @param contentDate The time the data in the payload was generated. If this is older than a previous update or push payload, the system ignores this update.
*/
- end(dismissalPolicy?: LiveActivityDismissalPolicy): Promise;
+ end(dismissalPolicy?: LiveActivityDismissalPolicy, props?: T, contentDate?: Date): Promise;
/**
* Returns the push token for this Live Activity, used to send push notification updates via APNs.
* Returns `null` if push notifications are not enabled or the token is not yet available.
@@ -75,6 +78,14 @@ export declare class LiveActivityFactory {
*/
getInstances(): LiveActivity[];
}
+/**
+ * Creates a dismissal policy that removes the Live Activity at the specified time within a four-hour window.
+ * @param date The date after which the Live Activity should be removed from the Lock Screen.
+ * @hidden
+ */
+export declare function after(date: Date): {
+ after: Date;
+};
/**
* Creates a Widget instance.
* @param name The widget name. Must match the `'name'` field in your widget configuration in the app config.
diff --git a/packages/expo-widgets/build/Widgets.d.ts.map b/packages/expo-widgets/build/Widgets.d.ts.map
index 27179df6a30f38..f8e9390fab90f6 100644
--- a/packages/expo-widgets/build/Widgets.d.ts.map
+++ b/packages/expo-widgets/build/Widgets.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Widgets.d.ts","sourceRoot":"","sources":["../src/Widgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,kBAAkB,EAGlB,cAAc,EACd,UAAU,EACV,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3C,cAAc;IACd,OAAO,CAAC,kBAAkB,CAAqB;gBACnC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO;IAIzE;;OAEG;IACH,MAAM;IAIN;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE;IAMhD;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,CAAC;IAIvB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;CAMvD;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACjD,cAAc;IACd,OAAO,CAAC,kBAAkB,CAAqB;gBACnC,kBAAkB,EAAE,kBAAkB;IAIlD;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B;;;OAGG;IACH,GAAG,CAAC,eAAe,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAItC;;;;;OAKG;IACH,oBAAoB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,iBAAiB;CAGnF;AAED;;GAEG;AACH,qBAAa,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACxD,cAAc;IACd,OAAO,CAAC,yBAAyB,CAA4B;gBACjD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAO1D;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM;IAI5B;;OAEG;IACH,YAAY;CAKb;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EACpD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,GAClD,MAAM,CAAC,CAAC,CAAC,CAEX;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAC1D,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACrC,mBAAmB,CAAC,CAAC,CAAC,CAExB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,GAC1D,iBAAiB,CAEnB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,iBAAiB,CAAC,uCAAuC,CAAC,GACnE,iBAAiB,CAEnB"}
\ No newline at end of file
+{"version":3,"file":"Widgets.d.ts","sourceRoot":"","sources":["../src/Widgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,kBAAkB,EAGlB,cAAc,EACd,UAAU,EACV,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3C,cAAc;IACd,OAAO,CAAC,kBAAkB,CAAqB;gBACnC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO;IAIzE;;OAEG;IACH,MAAM;IAIN;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE;IAMhD;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,CAAC;IAIvB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;CAMvD;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACjD,cAAc;IACd,OAAO,CAAC,kBAAkB,CAAqB;gBACnC,kBAAkB,EAAE,kBAAkB;IAIlD;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B;;;;;;OAMG;IACH,GAAG,CAAC,eAAe,CAAC,EAAE,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhG;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAItC;;;;;OAKG;IACH,oBAAoB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,iBAAiB;CAGnF;AAED;;GAEG;AACH,qBAAa,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACxD,cAAc;IACd,OAAO,CAAC,yBAAyB,CAA4B;gBACjD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAO1D;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM;IAI5B;;OAEG;IACH,YAAY;CAKb;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EACpD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,GAClD,MAAM,CAAC,CAAC,CAAC,CAEX;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAC1D,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC,GACrC,mBAAmB,CAAC,CAAC,CAAC,CAExB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,GAC1D,iBAAiB,CAEnB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,iBAAiB,CAAC,uCAAuC,CAAC,GACnE,iBAAiB,CAEnB"}
\ No newline at end of file
diff --git a/packages/expo-widgets/build/Widgets.js b/packages/expo-widgets/build/Widgets.js
index 984cfaff2ea1f0..cf74d11c593ccd 100644
--- a/packages/expo-widgets/build/Widgets.js
+++ b/packages/expo-widgets/build/Widgets.js
@@ -57,9 +57,18 @@ export class LiveActivity {
/**
* Ends the Live Activity.
* @param dismissalPolicy Controls when the Live Activity is removed from the Lock Screen after ending.
+ * Can be `'default'`, `'immediate'`, or `after(date)`.
+ * @param props Final content properties to update after the activity ends.
+ * @param contentDate The time the data in the payload was generated. If this is older than a previous update or push payload, the system ignores this update.
*/
- end(dismissalPolicy) {
- return this.nativeLiveActivity.end(dismissalPolicy);
+ end(dismissalPolicy, props, contentDate) {
+ const serializedProps = props ? JSON.stringify(props) : undefined;
+ if (typeof dismissalPolicy === 'object' &&
+ dismissalPolicy !== null &&
+ 'after' in dismissalPolicy) {
+ return this.nativeLiveActivity.end('after', dismissalPolicy.after?.getTime(), serializedProps, contentDate?.getTime());
+ }
+ return this.nativeLiveActivity.end(dismissalPolicy, undefined, serializedProps, contentDate?.getTime());
}
/**
* Returns the push token for this Live Activity, used to send push notification updates via APNs.
@@ -105,6 +114,14 @@ export class LiveActivityFactory {
.map((instance) => new LiveActivity(instance));
}
}
+/**
+ * Creates a dismissal policy that removes the Live Activity at the specified time within a four-hour window.
+ * @param date The date after which the Live Activity should be removed from the Lock Screen.
+ * @hidden
+ */
+export function after(date) {
+ return { after: date };
+}
/**
* Creates a Widget instance.
* @param name The widget name. Must match the `'name'` field in your widget configuration in the app config.
diff --git a/packages/expo-widgets/build/Widgets.js.map b/packages/expo-widgets/build/Widgets.js.map
index 4e98c94ad2a077..7ffec3a8300a8b 100644
--- a/packages/expo-widgets/build/Widgets.js.map
+++ b/packages/expo-widgets/build/Widgets.js.map
@@ -1 +1 @@
-{"version":3,"file":"Widgets.js","sourceRoot":"","sources":["../src/Widgets.ts"],"names":[],"mappings":"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","sourcesContent":["import { type EventSubscription } from 'expo-modules-core';\n\nimport ExpoWidgetsModule from './ExpoWidgets';\nimport type {\n ExpoWidgetsEvents,\n LiveActivityComponent,\n LiveActivityDismissalPolicy,\n NativeLiveActivity,\n NativeLiveActivityFactory,\n NativeWidgetObject,\n PushTokenEvent,\n WidgetBase,\n WidgetTimelineEntry,\n} from './Widgets.types';\n\n/**\n * Represents a widget instance. Provides methods to manage the widget's timeline.\n */\nexport class Widget {\n /** @hidden */\n private nativeWidgetObject: NativeWidgetObject;\n constructor(name: string, layout: (p: WidgetBase) => React.JSX.Element) {\n this.nativeWidgetObject = new ExpoWidgetsModule.Widget(name, layout as unknown as string);\n }\n\n /**\n * Force reloads the widget, causing it to refresh its content and timeline.\n */\n reload() {\n this.nativeWidgetObject.reload();\n }\n\n /**\n * Schedules a series of updates for the widget's content and reloads the widget.\n * @param entries Timeline entries, each specifying a date and the props to display at that time.\n */\n updateTimeline(entries: WidgetTimelineEntry[]) {\n this.nativeWidgetObject.updateTimeline(\n entries.map((entry) => ({ timestamp: entry.date.getTime(), props: entry.props }))\n );\n }\n\n /**\n * Sets the widget's content to the given props immediately, without scheduling a timeline.\n * @param props The properties to display in the widget.\n */\n updateSnapshot(props: T) {\n this.nativeWidgetObject.updateTimeline([{ timestamp: Date.now(), props }]);\n }\n\n /**\n * Returns the current timeline entries for the widget, including past and future entries.\n */\n async getTimeline(): Promise[]> {\n return (await this.nativeWidgetObject.getTimeline()).map((entry) => ({\n date: new Date(entry.timestamp),\n props: entry.props as T,\n }));\n }\n}\n\n/**\n * Represents a Live Activity instance. Provides methods to update its content and end it.\n */\nexport class LiveActivity {\n /** @hidden */\n private nativeLiveActivity: NativeLiveActivity;\n constructor(nativeLiveActivity: NativeLiveActivity) {\n this.nativeLiveActivity = nativeLiveActivity;\n }\n\n /**\n * Updates the Live Activity's content. The UI reflects the new properties immediately.\n * @param props The updated content properties.\n */\n update(props: T): Promise {\n return this.nativeLiveActivity.update(JSON.stringify(props));\n }\n\n /**\n * Ends the Live Activity.\n * @param dismissalPolicy Controls when the Live Activity is removed from the Lock Screen after ending.\n */\n end(dismissalPolicy?: LiveActivityDismissalPolicy): Promise {\n return this.nativeLiveActivity.end(dismissalPolicy);\n }\n\n /**\n * Returns the push token for this Live Activity, used to send push notification updates via APNs.\n * Returns `null` if push notifications are not enabled or the token is not yet available.\n */\n getPushToken(): Promise {\n return this.nativeLiveActivity.getPushToken();\n }\n\n /**\n * Adds a listener for push token update events on this Live Activity instance.\n * The token can be used to send content updates to this specific activity via APNs.\n * @param listener Callback invoked when a new push token is available.\n * @returns An event subscription that can be used to remove the listener.\n */\n addPushTokenListener(listener: (event: PushTokenEvent) => void): EventSubscription {\n return this.nativeLiveActivity.addListener('onExpoWidgetsTokenReceived', listener);\n }\n}\n\n/**\n * Manages Live Activity instances of a specific type. Use it to start new activities and retrieve currently active ones.\n */\nexport class LiveActivityFactory {\n /** @hidden */\n private nativeLiveActivityFactory: NativeLiveActivityFactory;\n constructor(name: string, layout: LiveActivityComponent) {\n this.nativeLiveActivityFactory = new ExpoWidgetsModule.LiveActivityFactory(\n name,\n layout as unknown as string\n );\n }\n\n /**\n * Starts a new Live Activity with the given properties.\n * @param props The initial content properties for the Live Activity.\n * @param url An optional URL to associate with the Live Activity, used for deep linking.\n * @returns The new Live Activity instance.\n */\n start(props: T, url?: string) {\n return new LiveActivity(this.nativeLiveActivityFactory.start(JSON.stringify(props), url));\n }\n\n /**\n * Returns all currently active instances of this Live Activity type.\n */\n getInstances() {\n return this.nativeLiveActivityFactory\n .getInstances()\n .map((instance) => new LiveActivity(instance));\n }\n}\n\n/**\n * Creates a Widget instance.\n * @param name The widget name. Must match the `'name'` field in your widget configuration in the app config.\n * @param widget The widget component, marked with the `'widget'` directive.\n */\nexport function createWidget(\n name: string,\n widget: (props: WidgetBase) => React.JSX.Element\n): Widget {\n return new Widget(name, widget);\n}\n\n/**\n * Creates a Live Activity Factory for managing Live Activities of a specific type.\n * @param name The Live Activity name. Must match the `'name'` field in your widget configuration in the app config.\n * @param liveActivity The Live Activity component, marked with the `'widget'` directive.\n */\nexport function createLiveActivity(\n name: string,\n liveActivity: LiveActivityComponent\n): LiveActivityFactory {\n return new LiveActivityFactory(name, liveActivity);\n}\n\n/**\n * Adds a listener for widget interaction events (for example, button taps).\n * @param listener Callback function to handle user interaction events.\n * @return An event subscription that can be used to remove the listener.\n */\nexport function addUserInteractionListener(\n listener: ExpoWidgetsEvents['onExpoWidgetsUserInteraction']\n): EventSubscription {\n return ExpoWidgetsModule.addListener('onExpoWidgetsUserInteraction', listener);\n}\n\n/**\n * Adds a listener for push-to-start token events.\n * This token can be used to start live activities remotely via APNs.\n * @param listener Callback function to handle push-to-start token events.\n * @return An event subscription that can be used to remove the listener.\n */\nexport function addPushToStartTokenListener(\n listener: ExpoWidgetsEvents['onExpoWidgetsPushToStartTokenReceived']\n): EventSubscription {\n return ExpoWidgetsModule.addListener('onExpoWidgetsPushToStartTokenReceived', listener);\n}\n"]}
\ No newline at end of file
+{"version":3,"file":"Widgets.js","sourceRoot":"","sources":["../src/Widgets.ts"],"names":[],"mappings":"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","sourcesContent":["import { type EventSubscription } from 'expo-modules-core';\n\nimport ExpoWidgetsModule from './ExpoWidgets';\nimport type {\n ExpoWidgetsEvents,\n LiveActivityComponent,\n LiveActivityDismissalPolicy,\n NativeLiveActivity,\n NativeLiveActivityFactory,\n NativeWidgetObject,\n PushTokenEvent,\n WidgetBase,\n WidgetTimelineEntry,\n} from './Widgets.types';\n\n/**\n * Represents a widget instance. Provides methods to manage the widget's timeline.\n */\nexport class Widget {\n /** @hidden */\n private nativeWidgetObject: NativeWidgetObject;\n constructor(name: string, layout: (p: WidgetBase) => React.JSX.Element) {\n this.nativeWidgetObject = new ExpoWidgetsModule.Widget(name, layout as unknown as string);\n }\n\n /**\n * Force reloads the widget, causing it to refresh its content and timeline.\n */\n reload() {\n this.nativeWidgetObject.reload();\n }\n\n /**\n * Schedules a series of updates for the widget's content and reloads the widget.\n * @param entries Timeline entries, each specifying a date and the props to display at that time.\n */\n updateTimeline(entries: WidgetTimelineEntry[]) {\n this.nativeWidgetObject.updateTimeline(\n entries.map((entry) => ({ timestamp: entry.date.getTime(), props: entry.props }))\n );\n }\n\n /**\n * Sets the widget's content to the given props immediately, without scheduling a timeline.\n * @param props The properties to display in the widget.\n */\n updateSnapshot(props: T) {\n this.nativeWidgetObject.updateTimeline([{ timestamp: Date.now(), props }]);\n }\n\n /**\n * Returns the current timeline entries for the widget, including past and future entries.\n */\n async getTimeline(): Promise[]> {\n return (await this.nativeWidgetObject.getTimeline()).map((entry) => ({\n date: new Date(entry.timestamp),\n props: entry.props as T,\n }));\n }\n}\n\n/**\n * Represents a Live Activity instance. Provides methods to update its content and end it.\n */\nexport class LiveActivity {\n /** @hidden */\n private nativeLiveActivity: NativeLiveActivity;\n constructor(nativeLiveActivity: NativeLiveActivity) {\n this.nativeLiveActivity = nativeLiveActivity;\n }\n\n /**\n * Updates the Live Activity's content. The UI reflects the new properties immediately.\n * @param props The updated content properties.\n */\n update(props: T): Promise {\n return this.nativeLiveActivity.update(JSON.stringify(props));\n }\n\n /**\n * Ends the Live Activity.\n * @param dismissalPolicy Controls when the Live Activity is removed from the Lock Screen after ending.\n * Can be `'default'`, `'immediate'`, or `after(date)`.\n * @param props Final content properties to update after the activity ends.\n * @param contentDate The time the data in the payload was generated. If this is older than a previous update or push payload, the system ignores this update.\n */\n end(dismissalPolicy?: LiveActivityDismissalPolicy, props?: T, contentDate?: Date): Promise {\n const serializedProps = props ? JSON.stringify(props) : undefined;\n if (\n typeof dismissalPolicy === 'object' &&\n dismissalPolicy !== null &&\n 'after' in dismissalPolicy\n ) {\n return this.nativeLiveActivity.end(\n 'after',\n dismissalPolicy.after?.getTime(),\n serializedProps,\n contentDate?.getTime()\n );\n }\n return this.nativeLiveActivity.end(\n dismissalPolicy,\n undefined,\n serializedProps,\n contentDate?.getTime()\n );\n }\n\n /**\n * Returns the push token for this Live Activity, used to send push notification updates via APNs.\n * Returns `null` if push notifications are not enabled or the token is not yet available.\n */\n getPushToken(): Promise {\n return this.nativeLiveActivity.getPushToken();\n }\n\n /**\n * Adds a listener for push token update events on this Live Activity instance.\n * The token can be used to send content updates to this specific activity via APNs.\n * @param listener Callback invoked when a new push token is available.\n * @returns An event subscription that can be used to remove the listener.\n */\n addPushTokenListener(listener: (event: PushTokenEvent) => void): EventSubscription {\n return this.nativeLiveActivity.addListener('onExpoWidgetsTokenReceived', listener);\n }\n}\n\n/**\n * Manages Live Activity instances of a specific type. Use it to start new activities and retrieve currently active ones.\n */\nexport class LiveActivityFactory {\n /** @hidden */\n private nativeLiveActivityFactory: NativeLiveActivityFactory;\n constructor(name: string, layout: LiveActivityComponent) {\n this.nativeLiveActivityFactory = new ExpoWidgetsModule.LiveActivityFactory(\n name,\n layout as unknown as string\n );\n }\n\n /**\n * Starts a new Live Activity with the given properties.\n * @param props The initial content properties for the Live Activity.\n * @param url An optional URL to associate with the Live Activity, used for deep linking.\n * @returns The new Live Activity instance.\n */\n start(props: T, url?: string) {\n return new LiveActivity(this.nativeLiveActivityFactory.start(JSON.stringify(props), url));\n }\n\n /**\n * Returns all currently active instances of this Live Activity type.\n */\n getInstances() {\n return this.nativeLiveActivityFactory\n .getInstances()\n .map((instance) => new LiveActivity(instance));\n }\n}\n\n/**\n * Creates a dismissal policy that removes the Live Activity at the specified time within a four-hour window.\n * @param date The date after which the Live Activity should be removed from the Lock Screen.\n * @hidden\n */\nexport function after(date: Date): { after: Date } {\n return { after: date };\n}\n\n/**\n * Creates a Widget instance.\n * @param name The widget name. Must match the `'name'` field in your widget configuration in the app config.\n * @param widget The widget component, marked with the `'widget'` directive.\n */\nexport function createWidget(\n name: string,\n widget: (props: WidgetBase) => React.JSX.Element\n): Widget {\n return new Widget(name, widget);\n}\n\n/**\n * Creates a Live Activity Factory for managing Live Activities of a specific type.\n * @param name The Live Activity name. Must match the `'name'` field in your widget configuration in the app config.\n * @param liveActivity The Live Activity component, marked with the `'widget'` directive.\n */\nexport function createLiveActivity(\n name: string,\n liveActivity: LiveActivityComponent\n): LiveActivityFactory {\n return new LiveActivityFactory(name, liveActivity);\n}\n\n/**\n * Adds a listener for widget interaction events (for example, button taps).\n * @param listener Callback function to handle user interaction events.\n * @return An event subscription that can be used to remove the listener.\n */\nexport function addUserInteractionListener(\n listener: ExpoWidgetsEvents['onExpoWidgetsUserInteraction']\n): EventSubscription {\n return ExpoWidgetsModule.addListener('onExpoWidgetsUserInteraction', listener);\n}\n\n/**\n * Adds a listener for push-to-start token events.\n * This token can be used to start live activities remotely via APNs.\n * @param listener Callback function to handle push-to-start token events.\n * @return An event subscription that can be used to remove the listener.\n */\nexport function addPushToStartTokenListener(\n listener: ExpoWidgetsEvents['onExpoWidgetsPushToStartTokenReceived']\n): EventSubscription {\n return ExpoWidgetsModule.addListener('onExpoWidgetsPushToStartTokenReceived', listener);\n}\n"]}
\ No newline at end of file
diff --git a/packages/expo-widgets/build/Widgets.types.d.ts b/packages/expo-widgets/build/Widgets.types.d.ts
index 74936617847df6..191bb00c6bb35e 100644
--- a/packages/expo-widgets/build/Widgets.types.d.ts
+++ b/packages/expo-widgets/build/Widgets.types.d.ts
@@ -1,5 +1,6 @@
import { SharedObject } from 'expo';
import { ReactNode } from 'react';
+import { after } from './Widgets';
/**
* The widget family (size).
* - `systemSmall` - Small square widget (2x2 grid).
@@ -128,8 +129,11 @@ export type PushToStartTokenEvent = {
};
/**
* Dismissal policy for ending a live activity.
+ * - `'default'` - The system’s default dismissal policy for the Live Activity.
+ * - `'immediate'` - The system immediately removes the Live Activity that ended.
+ * - `after(date)` - The system removes the Live Activity that ended at the specified time within a four-hour window.
*/
-export type LiveActivityDismissalPolicy = 'default' | 'immediate';
+export type LiveActivityDismissalPolicy = 'default' | 'immediate' | ReturnType;
export type ExpoWidgetsEvents = {
/**
* Function that is invoked when user interacts with a widget.
@@ -162,7 +166,7 @@ export declare class NativeLiveActivityFactory extends SharedObject {
}
export declare class NativeLiveActivity extends SharedObject {
update(props: string): Promise;
- end(dismissalPolicy?: LiveActivityDismissalPolicy): Promise;
+ end(dismissalPolicy?: string, afterDate?: number, state?: string, contentDate?: number): Promise;
getPushToken(): Promise;
}
//# sourceMappingURL=Widgets.types.d.ts.map
\ No newline at end of file
diff --git a/packages/expo-widgets/build/Widgets.types.d.ts.map b/packages/expo-widgets/build/Widgets.types.d.ts.map
index 5c95462a91f1ce..5cd1cdf35803fa 100644
--- a/packages/expo-widgets/build/Widgets.types.d.ts.map
+++ b/packages/expo-widgets/build/Widgets.types.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Widgets.types.d.ts","sourceRoot":"","sources":["../src/Widgets.types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Widgets.types.d.ts","sourceRoot":"","sources":["../src/Widgets.types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/expo-widgets/build/Widgets.types.js.map b/packages/expo-widgets/build/Widgets.types.js.map
index 9288e4930632e4..041bbb6d6ed0ec 100644
--- a/packages/expo-widgets/build/Widgets.types.js.map
+++ b/packages/expo-widgets/build/Widgets.types.js.map
@@ -1 +1 @@
-{"version":3,"file":"Widgets.types.js","sourceRoot":"","sources":["../src/Widgets.types.ts"],"names":[],"mappings":"","sourcesContent":["import { SharedObject } from 'expo';\nimport { ReactNode } from 'react';\n\n/**\n * The widget family (size).\n * - `systemSmall` - Small square widget (2x2 grid).\n * - `systemMedium` - Medium widget (4x2 grid).\n * - `systemLarge` - Large widget (4x4 grid).\n * - `systemExtraLarge` - Extra large widget (iPad only, 6x4 grid).\n * - `accessoryCircular` - Circular accessory widget for the Lock Screen.\n * - `accessoryRectangular` - Rectangular accessory widget for the Lock Screen.\n * - `accessoryInline` - Inline accessory widget for the Lock Screen.\n */\nexport type WidgetFamily =\n | 'systemSmall'\n | 'systemMedium'\n | 'systemLarge'\n | 'systemExtraLarge'\n | 'accessoryCircular'\n | 'accessoryRectangular'\n | 'accessoryInline';\n\n/**\n * Props passed to a widget component.\n */\nexport type WidgetBase = {\n /**\n * The date of this timeline entry.\n */\n date: Date;\n /**\n * The widget family.\n */\n family: WidgetFamily;\n} & T;\n\nexport type WidgetTimelineEntry = {\n /**\n * Date when widget should update.\n */\n date: Date;\n /**\n * Props to be passed to the widget.\n */\n props: T;\n};\n\nexport type ExpoTimelineEntry = {\n timestamp: number;\n props: Record;\n};\n\n/**\n * Defines the layout sections for an iOS Live Activity.\n */\nexport type LiveActivityLayout = {\n /**\n * The main banner content displayed in Notifications Center.\n */\n banner: ReactNode;\n /**\n * The small banner content displayed in CarPlay and WatchOS. Falls back to `banner` if not provided.\n */\n bannerSmall?: ReactNode;\n /**\n * The leading content in the compact Dynamic Island presentation.\n */\n compactLeading?: ReactNode;\n /**\n * The trailing content in the compact Dynamic Island presentation.\n */\n compactTrailing?: ReactNode;\n /**\n * The minimal content shown when the Dynamic Island is in its smallest form.\n */\n minimal?: ReactNode;\n /**\n * The center content in the expanded Dynamic Island presentation.\n */\n expandedCenter?: ReactNode;\n /**\n * The leading content in the expanded Dynamic Island presentation.\n */\n expandedLeading?: ReactNode;\n /**\n * The trailing content in the expanded Dynamic Island presentation.\n */\n expandedTrailing?: ReactNode;\n /**\n * The bottom content in the expanded Dynamic Island presentation.\n */\n expandedBottom?: ReactNode;\n};\n\n/**\n * A function that returns the layout for a Live Activity.\n */\nexport type LiveActivityComponent = (props?: T) => LiveActivityLayout;\n\n/**\n * Event emitted when a user interacts with a widget.\n */\nexport type UserInteractionEvent = {\n /**\n * Widget that triggered the interaction.\n */\n source: string;\n /**\n * Button/toggle that was pressed.\n */\n target: string;\n /**\n * Timestamp of the event.\n */\n timestamp: number;\n /**\n * The event type identifier.\n */\n type: 'ExpoWidgetsUserInteraction';\n};\n\n/**\n * Event emitted when a push token is received for a live activity.\n */\nexport type PushTokenEvent = {\n /**\n * The ID of the live activity.\n */\n activityId: string;\n /**\n * The push token for the live activity.\n */\n pushToken: string;\n};\n\n/**\n * Event emitted when a push-to-start token is received.\n */\nexport type PushToStartTokenEvent = {\n /**\n * The push-to-start token for starting live activities remotely.\n */\n activityPushToStartToken: string;\n};\n\n/**\n * Dismissal policy for ending a live activity.\n */\nexport type LiveActivityDismissalPolicy = 'default' | 'immediate';\n\nexport type ExpoWidgetsEvents = {\n /**\n * Function that is invoked when user interacts with a widget.\n * @param event Interaction event details.\n */\n onExpoWidgetsUserInteraction: (event: UserInteractionEvent) => void;\n /**\n * Function that is invoked when a push-to-start token is received.\n * @param event Token event details.\n */\n onExpoWidgetsPushToStartTokenReceived: (event: PushToStartTokenEvent) => void;\n};\n\nexport type LiveActivityEvents = {\n /**\n * Function that is invoked when a push token is received for a live activity.\n * @param event Token event details.\n */\n onExpoWidgetsTokenReceived: (event: PushTokenEvent) => void;\n};\n\nexport declare class NativeWidgetObject extends SharedObject {\n constructor(name: string, layout: string);\n reload(): void;\n updateTimeline(entries: ExpoTimelineEntry[]): void;\n getTimeline(): Promise;\n}\n\nexport declare class NativeLiveActivityFactory extends SharedObject {\n constructor(name: string, layout: string);\n start(props: string, url?: string): NativeLiveActivity;\n getInstances(): NativeLiveActivity[];\n}\n\nexport declare class NativeLiveActivity extends SharedObject {\n update(props: string): Promise;\n end(dismissalPolicy?: LiveActivityDismissalPolicy): Promise;\n getPushToken(): Promise;\n}\n"]}
\ No newline at end of file
+{"version":3,"file":"Widgets.types.js","sourceRoot":"","sources":["../src/Widgets.types.ts"],"names":[],"mappings":"","sourcesContent":["import { SharedObject } from 'expo';\nimport { ReactNode } from 'react';\n\nimport { after } from './Widgets';\n\n/**\n * The widget family (size).\n * - `systemSmall` - Small square widget (2x2 grid).\n * - `systemMedium` - Medium widget (4x2 grid).\n * - `systemLarge` - Large widget (4x4 grid).\n * - `systemExtraLarge` - Extra large widget (iPad only, 6x4 grid).\n * - `accessoryCircular` - Circular accessory widget for the Lock Screen.\n * - `accessoryRectangular` - Rectangular accessory widget for the Lock Screen.\n * - `accessoryInline` - Inline accessory widget for the Lock Screen.\n */\nexport type WidgetFamily =\n | 'systemSmall'\n | 'systemMedium'\n | 'systemLarge'\n | 'systemExtraLarge'\n | 'accessoryCircular'\n | 'accessoryRectangular'\n | 'accessoryInline';\n\n/**\n * Props passed to a widget component.\n */\nexport type WidgetBase = {\n /**\n * The date of this timeline entry.\n */\n date: Date;\n /**\n * The widget family.\n */\n family: WidgetFamily;\n} & T;\n\nexport type WidgetTimelineEntry = {\n /**\n * Date when widget should update.\n */\n date: Date;\n /**\n * Props to be passed to the widget.\n */\n props: T;\n};\n\nexport type ExpoTimelineEntry = {\n timestamp: number;\n props: Record;\n};\n\n/**\n * Defines the layout sections for an iOS Live Activity.\n */\nexport type LiveActivityLayout = {\n /**\n * The main banner content displayed in Notifications Center.\n */\n banner: ReactNode;\n /**\n * The small banner content displayed in CarPlay and WatchOS. Falls back to `banner` if not provided.\n */\n bannerSmall?: ReactNode;\n /**\n * The leading content in the compact Dynamic Island presentation.\n */\n compactLeading?: ReactNode;\n /**\n * The trailing content in the compact Dynamic Island presentation.\n */\n compactTrailing?: ReactNode;\n /**\n * The minimal content shown when the Dynamic Island is in its smallest form.\n */\n minimal?: ReactNode;\n /**\n * The center content in the expanded Dynamic Island presentation.\n */\n expandedCenter?: ReactNode;\n /**\n * The leading content in the expanded Dynamic Island presentation.\n */\n expandedLeading?: ReactNode;\n /**\n * The trailing content in the expanded Dynamic Island presentation.\n */\n expandedTrailing?: ReactNode;\n /**\n * The bottom content in the expanded Dynamic Island presentation.\n */\n expandedBottom?: ReactNode;\n};\n\n/**\n * A function that returns the layout for a Live Activity.\n */\nexport type LiveActivityComponent = (props?: T) => LiveActivityLayout;\n\n/**\n * Event emitted when a user interacts with a widget.\n */\nexport type UserInteractionEvent = {\n /**\n * Widget that triggered the interaction.\n */\n source: string;\n /**\n * Button/toggle that was pressed.\n */\n target: string;\n /**\n * Timestamp of the event.\n */\n timestamp: number;\n /**\n * The event type identifier.\n */\n type: 'ExpoWidgetsUserInteraction';\n};\n\n/**\n * Event emitted when a push token is received for a live activity.\n */\nexport type PushTokenEvent = {\n /**\n * The ID of the live activity.\n */\n activityId: string;\n /**\n * The push token for the live activity.\n */\n pushToken: string;\n};\n\n/**\n * Event emitted when a push-to-start token is received.\n */\nexport type PushToStartTokenEvent = {\n /**\n * The push-to-start token for starting live activities remotely.\n */\n activityPushToStartToken: string;\n};\n\n/**\n * Dismissal policy for ending a live activity.\n * - `'default'` - The system’s default dismissal policy for the Live Activity.\n * - `'immediate'` - The system immediately removes the Live Activity that ended.\n * - `after(date)` - The system removes the Live Activity that ended at the specified time within a four-hour window.\n */\nexport type LiveActivityDismissalPolicy = 'default' | 'immediate' | ReturnType;\n\nexport type ExpoWidgetsEvents = {\n /**\n * Function that is invoked when user interacts with a widget.\n * @param event Interaction event details.\n */\n onExpoWidgetsUserInteraction: (event: UserInteractionEvent) => void;\n /**\n * Function that is invoked when a push-to-start token is received.\n * @param event Token event details.\n */\n onExpoWidgetsPushToStartTokenReceived: (event: PushToStartTokenEvent) => void;\n};\n\nexport type LiveActivityEvents = {\n /**\n * Function that is invoked when a push token is received for a live activity.\n * @param event Token event details.\n */\n onExpoWidgetsTokenReceived: (event: PushTokenEvent) => void;\n};\n\nexport declare class NativeWidgetObject extends SharedObject {\n constructor(name: string, layout: string);\n reload(): void;\n updateTimeline(entries: ExpoTimelineEntry[]): void;\n getTimeline(): Promise;\n}\n\nexport declare class NativeLiveActivityFactory extends SharedObject {\n constructor(name: string, layout: string);\n start(props: string, url?: string): NativeLiveActivity;\n getInstances(): NativeLiveActivity[];\n}\n\nexport declare class NativeLiveActivity extends SharedObject {\n update(props: string): Promise;\n end(\n dismissalPolicy?: string,\n afterDate?: number,\n state?: string,\n contentDate?: number\n ): Promise;\n getPushToken(): Promise;\n}\n"]}
\ No newline at end of file
diff --git a/packages/expo-widgets/ios/LiveActivity.swift b/packages/expo-widgets/ios/LiveActivity.swift
index 71ab594a3f5294..a603765f9cc1ac 100644
--- a/packages/expo-widgets/ios/LiveActivity.swift
+++ b/packages/expo-widgets/ios/LiveActivity.swift
@@ -23,22 +23,25 @@ final class LiveActivity: SharedObject {
await activity.update(ActivityContent(state: newState, staleDate: nil))
}
- func end(dismissalPolicy: String?) async throws {
+ func end(dismissalPolicy: LiveActivityDismissalPolicy?, afterDate: Date?, props: String?, contentDate: Date?) async throws {
guard #available(iOS 16.2, *) else { throw LiveActivitiesNotSupportedException() }
guard let activity = Activity.activities.first(where: { $0.id == id }) else {
throw LiveActivityNotFoundException(id)
}
- let policy: ActivityUIDismissalPolicy
- switch dismissalPolicy {
- case "immediate":
- policy = .immediate
- default:
- policy = .default
+ let content: ActivityContent?
+ if let props {
+ content = ActivityContent(state: LiveActivityAttributes.ContentState(name: name, props: props), staleDate: nil)
+ } else {
+ content = nil
}
- await activity.end(dismissalPolicy: policy)
+ guard let contentDate, #available(iOS 17.2, *) else {
+ return await activity.end(content, dismissalPolicy: dismissalPolicy?.toDismissalPolicy(date: afterDate) ?? .default)
+ }
+
+ await activity.end(content, dismissalPolicy: dismissalPolicy?.toDismissalPolicy(date: afterDate) ?? .default, timestamp: contentDate)
}
func getPushToken() throws -> String? {
diff --git a/packages/expo-widgets/ios/WidgetsModule.swift b/packages/expo-widgets/ios/WidgetsModule.swift
index 064272c61eeeb4..9620b9a097d90e 100644
--- a/packages/expo-widgets/ios/WidgetsModule.swift
+++ b/packages/expo-widgets/ios/WidgetsModule.swift
@@ -86,8 +86,8 @@ public final class WidgetsModule: Module {
try await instance.update(props: props)
}
- AsyncFunction("end") { (instance: LiveActivity, dismissalPolicy: String?) in
- try await instance.end(dismissalPolicy: dismissalPolicy)
+ AsyncFunction("end") { (instance: LiveActivity, dismissalPolicy: LiveActivityDismissalPolicy?, afterDate: Date?, props: String?, contentDate: Date?) in
+ try await instance.end(dismissalPolicy: dismissalPolicy, afterDate: afterDate, props: props, contentDate: contentDate)
}
AsyncFunction("getPushToken") { (instance: LiveActivity) in
diff --git a/packages/expo-widgets/ios/WidgetsRecords.swift b/packages/expo-widgets/ios/WidgetsRecords.swift
index 0bb59b2b45e9ee..84260fe0a2407b 100644
--- a/packages/expo-widgets/ios/WidgetsRecords.swift
+++ b/packages/expo-widgets/ios/WidgetsRecords.swift
@@ -1,6 +1,22 @@
import ExpoModulesCore
+import ActivityKit
struct WidgetsJSTimelineEntry: Record {
@Field var timestamp: Int
@Field var props: [String: Any] = [:]
}
+
+internal enum LiveActivityDismissalPolicy: String, Enumerable {
+ case `default`
+ case immediate
+ case after
+
+ @available(iOS 16.1, *)
+ internal func toDismissalPolicy(date: Date?) -> ActivityUIDismissalPolicy {
+ return switch self {
+ case .default: .default
+ case .immediate: .immediate
+ case .after: .after(date ?? Date.now)
+ }
+ }
+}
diff --git a/packages/expo-widgets/src/Widgets.ts b/packages/expo-widgets/src/Widgets.ts
index 743cefee67f41e..64a7cc5d4e9dac 100644
--- a/packages/expo-widgets/src/Widgets.ts
+++ b/packages/expo-widgets/src/Widgets.ts
@@ -80,9 +80,30 @@ export class LiveActivity {
/**
* Ends the Live Activity.
* @param dismissalPolicy Controls when the Live Activity is removed from the Lock Screen after ending.
+ * Can be `'default'`, `'immediate'`, or `after(date)`.
+ * @param props Final content properties to update after the activity ends.
+ * @param contentDate The time the data in the payload was generated. If this is older than a previous update or push payload, the system ignores this update.
*/
- end(dismissalPolicy?: LiveActivityDismissalPolicy): Promise {
- return this.nativeLiveActivity.end(dismissalPolicy);
+ end(dismissalPolicy?: LiveActivityDismissalPolicy, props?: T, contentDate?: Date): Promise {
+ const serializedProps = props ? JSON.stringify(props) : undefined;
+ if (
+ typeof dismissalPolicy === 'object' &&
+ dismissalPolicy !== null &&
+ 'after' in dismissalPolicy
+ ) {
+ return this.nativeLiveActivity.end(
+ 'after',
+ dismissalPolicy.after?.getTime(),
+ serializedProps,
+ contentDate?.getTime()
+ );
+ }
+ return this.nativeLiveActivity.end(
+ dismissalPolicy,
+ undefined,
+ serializedProps,
+ contentDate?.getTime()
+ );
}
/**
@@ -137,6 +158,15 @@ export class LiveActivityFactory {
}
}
+/**
+ * Creates a dismissal policy that removes the Live Activity at the specified time within a four-hour window.
+ * @param date The date after which the Live Activity should be removed from the Lock Screen.
+ * @hidden
+ */
+export function after(date: Date): { after: Date } {
+ return { after: date };
+}
+
/**
* Creates a Widget instance.
* @param name The widget name. Must match the `'name'` field in your widget configuration in the app config.
diff --git a/packages/expo-widgets/src/Widgets.types.ts b/packages/expo-widgets/src/Widgets.types.ts
index d4d49d36989d3c..843ca3558e2b52 100644
--- a/packages/expo-widgets/src/Widgets.types.ts
+++ b/packages/expo-widgets/src/Widgets.types.ts
@@ -1,6 +1,8 @@
import { SharedObject } from 'expo';
import { ReactNode } from 'react';
+import { after } from './Widgets';
+
/**
* The widget family (size).
* - `systemSmall` - Small square widget (2x2 grid).
@@ -145,8 +147,11 @@ export type PushToStartTokenEvent = {
/**
* Dismissal policy for ending a live activity.
+ * - `'default'` - The system’s default dismissal policy for the Live Activity.
+ * - `'immediate'` - The system immediately removes the Live Activity that ended.
+ * - `after(date)` - The system removes the Live Activity that ended at the specified time within a four-hour window.
*/
-export type LiveActivityDismissalPolicy = 'default' | 'immediate';
+export type LiveActivityDismissalPolicy = 'default' | 'immediate' | ReturnType;
export type ExpoWidgetsEvents = {
/**
@@ -184,6 +189,11 @@ export declare class NativeLiveActivityFactory extends SharedObject {
export declare class NativeLiveActivity extends SharedObject {
update(props: string): Promise;
- end(dismissalPolicy?: LiveActivityDismissalPolicy): Promise;
+ end(
+ dismissalPolicy?: string,
+ afterDate?: number,
+ state?: string,
+ contentDate?: number
+ ): Promise;
getPushToken(): Promise;
}
diff --git a/packages/expo/bundledNativeModules.json b/packages/expo/bundledNativeModules.json
index 69e9da57b53755..7bcd4a36b4a57b 100644
--- a/packages/expo/bundledNativeModules.json
+++ b/packages/expo/bundledNativeModules.json
@@ -11,8 +11,6 @@
"@react-native-community/viewpager": "5.0.11",
"@react-native-picker/picker": "2.11.4",
"@react-native-segmented-control/segmented-control": "2.5.7",
- "@react-navigation/native": "^7.1.28",
- "@react-navigation/native-stack": "^7.10.1",
"@stripe/stripe-react-native": "0.58.0",
"eslint-config-expo": "~55.0.0",
"expo-analytics-amplitude": "~11.3.0",
@@ -41,6 +39,7 @@
"expo-dev-client": "~55.0.9",
"expo-device": "~55.0.9",
"expo-document-picker": "~55.0.8",
+ "expo-eas-observe": "~0.0.32",
"expo-file-system": "~55.0.9",
"expo-font": "~55.0.4",
"expo-gl": "~55.0.9",
diff --git a/tools/src/commands/SyncBundledNativeModules.ts b/tools/src/commands/SyncBundledNativeModules.ts
index f8e192ac44ad26..c99850aee43e28 100644
--- a/tools/src/commands/SyncBundledNativeModules.ts
+++ b/tools/src/commands/SyncBundledNativeModules.ts
@@ -144,6 +144,13 @@ async function compareAndConfirmAsync(
},
{} as Record
);
+ const nextMap = next.reduce(
+ (acc, i) => {
+ acc[i.npmPackage] = i;
+ return acc;
+ },
+ {} as Record
+ );
logger.info('Changes:');
let hasChanges = false;
@@ -157,6 +164,12 @@ async function compareAndConfirmAsync(
);
}
}
+ for (const { npmPackage, versionRange } of current) {
+ if (!nextMap[npmPackage]) {
+ hasChanges = true;
+ logger.info(` - ${npmPackage}: ${chalk.red(versionRange)} -> ${chalk.green('(removed)')}`);
+ }
+ }
if (!hasChanges) {
logger.info(chalk.gray('(no changes found)'));
// there's no need to proceed with the script