expo-modules-core 1.11.13 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/CHANGELOG.md +77 -13
  2. package/ExpoModulesCore.podspec +7 -4
  3. package/android/ExpoModulesCorePlugin.gradle +40 -28
  4. package/android/build.gradle +12 -93
  5. package/android/proguard-rules.pro +0 -8
  6. package/android/src/main/cpp/Exceptions.cpp +1 -1
  7. package/android/src/main/cpp/Exceptions.h +1 -1
  8. package/android/src/main/cpp/ExpoModulesHostObject.cpp +7 -6
  9. package/android/src/main/cpp/ExpoModulesHostObject.h +3 -3
  10. package/android/src/main/cpp/JNIInjector.cpp +4 -2
  11. package/android/src/main/cpp/JSIContext.cpp +354 -0
  12. package/android/src/main/cpp/{JSIInteropModuleRegistry.h → JSIContext.h} +90 -9
  13. package/android/src/main/cpp/JavaCallback.cpp +210 -24
  14. package/android/src/main/cpp/JavaCallback.h +42 -7
  15. package/android/src/main/cpp/JavaScriptFunction.cpp +20 -6
  16. package/android/src/main/cpp/JavaScriptFunction.h +4 -1
  17. package/android/src/main/cpp/JavaScriptModuleObject.cpp +118 -82
  18. package/android/src/main/cpp/JavaScriptModuleObject.h +21 -18
  19. package/android/src/main/cpp/JavaScriptObject.cpp +7 -8
  20. package/android/src/main/cpp/JavaScriptObject.h +4 -2
  21. package/android/src/main/cpp/JavaScriptRuntime.cpp +18 -41
  22. package/android/src/main/cpp/JavaScriptRuntime.h +2 -8
  23. package/android/src/main/cpp/JavaScriptTypedArray.cpp +3 -3
  24. package/android/src/main/cpp/JavaScriptTypedArray.h +1 -1
  25. package/android/src/main/cpp/JavaScriptValue.cpp +7 -7
  26. package/android/src/main/cpp/JavaScriptValue.h +1 -1
  27. package/android/src/main/cpp/JavaScriptWeakObject.cpp +4 -4
  28. package/android/src/main/cpp/JavaScriptWeakObject.h +1 -1
  29. package/android/src/main/cpp/MethodMetadata.cpp +44 -120
  30. package/android/src/main/cpp/MethodMetadata.h +5 -11
  31. package/android/src/main/cpp/WeakRuntimeHolder.cpp +3 -3
  32. package/android/src/main/cpp/WeakRuntimeHolder.h +2 -2
  33. package/android/src/main/cpp/types/AnyType.cpp +1 -1
  34. package/android/src/main/cpp/types/AnyType.h +1 -1
  35. package/android/src/main/cpp/types/FrontendConverter.cpp +32 -43
  36. package/android/src/main/cpp/types/FrontendConverter.h +1 -23
  37. package/android/src/main/cpp/types/JNIToJSIConverter.cpp +5 -10
  38. package/android/src/main/cpp/types/JNIToJSIConverter.h +6 -2
  39. package/android/src/main/java/expo/modules/adapters/react/ModuleRegistryAdapter.java +3 -0
  40. package/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +14 -100
  41. package/android/src/main/java/expo/modules/adapters/react/ReactAdapterPackage.java +3 -5
  42. package/android/src/main/java/expo/modules/adapters/react/ReactModuleRegistryProvider.java +6 -22
  43. package/android/src/main/java/expo/modules/adapters/react/apploader/RNHeadlessAppLoader.kt +8 -4
  44. package/android/src/main/java/expo/modules/adapters/react/services/EventEmitterModule.java +0 -1
  45. package/android/src/main/java/expo/modules/adapters/react/services/UIManagerModuleWrapper.java +23 -8
  46. package/android/src/main/java/expo/modules/core/BasePackage.java +0 -10
  47. package/android/src/main/java/expo/modules/core/ModulePriorities.kt +1 -0
  48. package/android/src/main/java/expo/modules/core/ModuleRegistry.java +2 -32
  49. package/android/src/main/java/expo/modules/core/ModuleRegistryProvider.java +0 -18
  50. package/android/src/main/java/expo/modules/core/Promise.java +2 -0
  51. package/android/src/main/java/expo/modules/core/interfaces/Package.java +0 -17
  52. package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +0 -9
  53. package/android/src/main/java/expo/modules/core/interfaces/ReactNativeHostHandler.java +24 -31
  54. package/android/src/main/java/expo/modules/core/logging/LogHandler.kt +1 -7
  55. package/android/src/main/java/expo/modules/core/logging/LogHandlers.kt +11 -0
  56. package/android/src/main/java/expo/modules/core/logging/Logger.kt +18 -29
  57. package/android/src/main/java/expo/modules/core/logging/LoggerTimer.kt +11 -0
  58. package/android/src/main/java/expo/modules/core/logging/OSLogHandler.kt +2 -4
  59. package/android/src/main/java/expo/modules/core/logging/PersistentFileLogHandler.kt +1 -3
  60. package/android/src/main/java/expo/modules/interfaces/constants/ConstantsInterface.java +0 -2
  61. package/android/src/main/java/expo/modules/interfaces/permissions/PermissionsStatus.java +1 -1
  62. package/android/src/main/java/expo/modules/kotlin/AppContext.kt +44 -24
  63. package/android/src/main/java/expo/modules/kotlin/ArrayExtenstions.kt +15 -0
  64. package/android/src/main/java/expo/modules/kotlin/CoreLogger.kt +2 -2
  65. package/android/src/main/java/expo/modules/kotlin/DynamicExtenstions.kt +0 -3
  66. package/android/src/main/java/expo/modules/kotlin/ExpoBridgeModule.kt +41 -0
  67. package/android/src/main/java/expo/modules/kotlin/ExpoModulesHelper.kt +1 -2
  68. package/android/src/main/java/expo/modules/kotlin/KPromiseWrapper.kt +1 -2
  69. package/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt +1 -33
  70. package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +7 -6
  71. package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +12 -12
  72. package/android/src/main/java/expo/modules/kotlin/Promise.kt +10 -0
  73. package/android/src/main/java/expo/modules/kotlin/ReactExtensions.kt +14 -0
  74. package/android/src/main/java/expo/modules/kotlin/Utils.kt +4 -1
  75. package/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAwareHelper.kt +1 -1
  76. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultCaller.kt +1 -1
  77. package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultRegistry.kt +6 -6
  78. package/android/src/main/java/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +44 -15
  79. package/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt +31 -1
  80. package/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt +2 -4
  81. package/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt +11 -4
  82. package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +2 -3
  83. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt +136 -43
  84. package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionComponent.kt +71 -2
  85. package/android/src/main/java/expo/modules/kotlin/functions/FunctionBuilder.kt +39 -12
  86. package/android/src/main/java/expo/modules/kotlin/jni/ExpectedType.kt +2 -2
  87. package/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt +1 -1
  88. package/android/src/main/java/expo/modules/kotlin/jni/{JSIInteropModuleRegistry.kt → JSIContext.kt} +90 -14
  89. package/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt +51 -24
  90. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt +3 -3
  91. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +4 -1
  92. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +1 -0
  93. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +1 -0
  94. package/android/src/main/java/expo/modules/kotlin/jni/PromiseImpl.kt +20 -0
  95. package/android/src/main/java/expo/modules/kotlin/modules/Module.kt +0 -1
  96. package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt +1 -1
  97. package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +164 -65
  98. package/android/src/main/java/expo/modules/kotlin/objects/PropertyComponentBuilder.kt +3 -4
  99. package/android/src/main/java/expo/modules/kotlin/sharedobjects/ClassRegistry.kt +21 -0
  100. package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObject.kt +34 -1
  101. package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +23 -8
  102. package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedRef.kt +7 -1
  103. package/android/src/main/java/expo/modules/kotlin/tracing/ExpoTrace.kt +4 -0
  104. package/android/src/main/java/expo/modules/kotlin/types/AnyType.kt +134 -2
  105. package/android/src/main/java/expo/modules/kotlin/types/EnforceType.kt +60 -0
  106. package/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt +2 -2
  107. package/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt +0 -2
  108. package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +3 -27
  109. package/android/src/main/java/expo/modules/kotlin/types/UnitTypeConverter.kt +3 -7
  110. package/android/src/main/java/expo/modules/kotlin/types/io/PathTypeConverter.kt +3 -0
  111. package/android/src/main/java/expo/modules/kotlin/viewevent/ViewEvent.kt +2 -5
  112. package/android/src/main/java/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +137 -48
  113. package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinition.kt +2 -5
  114. package/build/EventEmitter.d.ts +2 -2
  115. package/build/EventEmitter.d.ts.map +1 -1
  116. package/build/EventEmitter.js +8 -8
  117. package/build/EventEmitter.js.map +1 -1
  118. package/build/NativeModule.d.ts +4 -0
  119. package/build/NativeModule.d.ts.map +1 -0
  120. package/build/NativeModule.js +4 -0
  121. package/build/NativeModule.js.map +1 -0
  122. package/build/NativeModulesProxy.native.d.ts.map +1 -1
  123. package/build/NativeModulesProxy.native.js +4 -0
  124. package/build/NativeModulesProxy.native.js.map +1 -1
  125. package/build/NativeModulesProxy.types.d.ts +2 -2
  126. package/build/NativeModulesProxy.types.d.ts.map +1 -1
  127. package/build/NativeModulesProxy.types.js.map +1 -1
  128. package/build/NativeViewManagerAdapter.native.d.ts.map +1 -1
  129. package/build/NativeViewManagerAdapter.native.js +20 -1
  130. package/build/NativeViewManagerAdapter.native.js.map +1 -1
  131. package/build/PermissionsHook.d.ts.map +1 -1
  132. package/build/PermissionsHook.js +2 -0
  133. package/build/PermissionsHook.js.map +1 -1
  134. package/build/Refs.d.ts +8 -0
  135. package/build/Refs.d.ts.map +1 -0
  136. package/build/Refs.js +10 -0
  137. package/build/Refs.js.map +1 -0
  138. package/build/SharedObject.d.ts +4 -0
  139. package/build/SharedObject.d.ts.map +1 -0
  140. package/build/SharedObject.js +4 -0
  141. package/build/SharedObject.js.map +1 -0
  142. package/build/createWebModule.d.ts +2 -0
  143. package/build/createWebModule.d.ts.map +1 -0
  144. package/build/createWebModule.js +6 -0
  145. package/build/createWebModule.js.map +1 -0
  146. package/build/createWebModule.web.d.ts +2 -0
  147. package/build/createWebModule.web.d.ts.map +1 -0
  148. package/build/createWebModule.web.js +6 -0
  149. package/build/createWebModule.web.js.map +1 -0
  150. package/build/ensureNativeModulesAreInstalled.d.ts +6 -0
  151. package/build/ensureNativeModulesAreInstalled.d.ts.map +1 -0
  152. package/build/ensureNativeModulesAreInstalled.js +26 -0
  153. package/build/ensureNativeModulesAreInstalled.js.map +1 -0
  154. package/build/hooks/useReleasingSharedObject.d.ts +7 -0
  155. package/build/hooks/useReleasingSharedObject.d.ts.map +1 -0
  156. package/build/hooks/useReleasingSharedObject.js +40 -0
  157. package/build/hooks/useReleasingSharedObject.js.map +1 -0
  158. package/build/index.d.ts +8 -1
  159. package/build/index.d.ts.map +1 -1
  160. package/build/index.js +8 -0
  161. package/build/index.js.map +1 -1
  162. package/build/requireNativeModule.d.ts +0 -17
  163. package/build/requireNativeModule.d.ts.map +1 -1
  164. package/build/requireNativeModule.js +2 -23
  165. package/build/requireNativeModule.js.map +1 -1
  166. package/build/ts-declarations/EventEmitter.d.ts +50 -0
  167. package/build/ts-declarations/EventEmitter.d.ts.map +1 -0
  168. package/build/ts-declarations/EventEmitter.js +2 -0
  169. package/build/ts-declarations/EventEmitter.js.map +1 -0
  170. package/build/ts-declarations/NativeModule.d.ts +14 -0
  171. package/build/ts-declarations/NativeModule.d.ts.map +1 -0
  172. package/build/ts-declarations/NativeModule.js +2 -0
  173. package/build/ts-declarations/NativeModule.js.map +1 -0
  174. package/build/ts-declarations/SharedObject.d.ts +14 -0
  175. package/build/ts-declarations/SharedObject.d.ts.map +1 -0
  176. package/build/ts-declarations/SharedObject.js +2 -0
  177. package/build/ts-declarations/SharedObject.js.map +1 -0
  178. package/build/ts-declarations/global.d.ts +49 -0
  179. package/build/ts-declarations/global.d.ts.map +1 -0
  180. package/build/ts-declarations/global.js +2 -0
  181. package/build/ts-declarations/global.js.map +1 -0
  182. package/build/web/CoreModule.d.ts +17 -0
  183. package/build/web/CoreModule.d.ts.map +1 -0
  184. package/build/web/CoreModule.js +51 -0
  185. package/build/web/CoreModule.js.map +1 -0
  186. package/build/web/index.d.ts +1 -0
  187. package/build/web/index.d.ts.map +1 -0
  188. package/build/web/index.js +1 -0
  189. package/build/web/index.js.map +1 -0
  190. package/build/web/index.web.d.ts +2 -0
  191. package/build/web/index.web.d.ts.map +1 -0
  192. package/build/web/index.web.js +2 -0
  193. package/build/web/index.web.js.map +1 -0
  194. package/common/cpp/BridgelessJSCallInvoker.h +41 -0
  195. package/common/cpp/EventEmitter.cpp +299 -0
  196. package/common/cpp/EventEmitter.h +111 -0
  197. package/common/cpp/JSIUtils.cpp +116 -11
  198. package/common/cpp/JSIUtils.h +54 -7
  199. package/common/cpp/LazyObject.cpp +15 -3
  200. package/common/cpp/LazyObject.h +13 -0
  201. package/common/cpp/NativeModule.cpp +16 -0
  202. package/common/cpp/NativeModule.h +34 -0
  203. package/common/cpp/ObjectDeallocator.cpp +3 -5
  204. package/common/cpp/ObjectDeallocator.h +2 -3
  205. package/common/cpp/SharedObject.cpp +69 -0
  206. package/common/cpp/SharedObject.h +59 -0
  207. package/common/cpp/TestingSyncJSCallInvoker.h +44 -0
  208. package/ios/Api/Builders/ClassComponentBuilder.swift +34 -0
  209. package/ios/{Objects → Api/Builders}/ObjectDefinitionBuilder.swift +3 -3
  210. package/ios/Api/Builders/ViewDefinitionBuilder.swift +53 -0
  211. package/ios/Api/Factories/AsyncFunctionFactories.swift +173 -0
  212. package/ios/{Classes/ClassComponentFactories.swift → Api/Factories/ClassFactories.swift} +19 -19
  213. package/ios/{Functions/ConcurrentFunctionDefinition.swift → Api/Factories/ConcurrentFunctionFactories.swift} +0 -113
  214. package/ios/{Modules/ModuleDefinitionComponents.swift → Api/Factories/EventListenersFactories.swift} +0 -20
  215. package/ios/Api/Factories/ModuleFactories.swift +6 -0
  216. package/ios/{Objects/ObjectDefinitionComponents.swift → Api/Factories/ObjectFactories.swift} +5 -5
  217. package/ios/Api/Factories/PropertyFactories.swift +50 -0
  218. package/ios/Api/Factories/SyncFunctionFactories.swift +173 -0
  219. package/ios/{Views/ViewManagerDefinitionComponents.swift → Api/Factories/ViewFactories.swift} +7 -6
  220. package/ios/AppDelegates/EXAppDelegateWrapper.h +0 -21
  221. package/ios/AppDelegates/EXAppDelegateWrapper.mm +37 -29
  222. package/ios/{AppContext.swift → Core/AppContext.swift} +34 -11
  223. package/ios/Core/Classes/AnyClassDefinitionElement.swift +37 -0
  224. package/ios/{Classes/ClassComponent.swift → Core/Classes/ClassDefinition.swift} +10 -10
  225. package/ios/{Conversions.swift → Core/Conversions.swift} +1 -1
  226. package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicSharedObjectType.swift +3 -3
  227. package/ios/Core/Events/EventObservingDefinition.swift +79 -0
  228. package/ios/Core/Events/LegacyEventEmitterCompat.swift +32 -0
  229. package/ios/Core/ExpoBridgeModule.h +18 -0
  230. package/ios/Core/ExpoBridgeModule.mm +88 -0
  231. package/ios/Core/ExpoRuntime.swift +6 -0
  232. package/ios/{Functions/AnyFunction.swift → Core/Functions/AnyFunctionDefinition.swift} +9 -2
  233. package/ios/Core/Functions/AsyncFunctionDefinition.swift +150 -0
  234. package/ios/Core/Functions/ConcurrentFunctionDefinition.swift +112 -0
  235. package/ios/Core/Functions/SyncFunctionDefinition.swift +108 -0
  236. package/ios/{JavaScriptUtils.swift → Core/JavaScriptUtils.swift} +4 -4
  237. package/ios/{Logging → Core/Logging}/LogHandlers.swift +12 -5
  238. package/ios/{Logging → Core/Logging}/Logger.swift +14 -92
  239. package/ios/Core/Logging/LoggerTimer.swift +22 -0
  240. package/ios/{ModuleHolder.swift → Core/ModuleHolder.swift} +2 -10
  241. package/ios/Core/Modules/CoreModule.swift +43 -0
  242. package/ios/{Modules → Core/Modules}/ModuleDefinition.swift +20 -12
  243. package/ios/{Modules → Core/Modules}/ModuleDefinitionBuilder.swift +1 -3
  244. package/ios/{Objects → Core/Objects}/ObjectDefinition.swift +9 -9
  245. package/ios/{Objects/PropertyComponent.swift → Core/Objects/PropertyDefinition.swift} +11 -64
  246. package/ios/Core/Protocols/AnyDefinition.swift +4 -0
  247. package/ios/Core/Protocols/AnyExpoView.swift +7 -0
  248. package/ios/Core/Protocols/AnyModule.swift +17 -0
  249. package/ios/Core/Protocols/AnyViewDefinition.swift +34 -0
  250. package/ios/Core/SharedObjects/SharedObject.swift +80 -0
  251. package/ios/{SharedObjects → Core/SharedObjects}/SharedObjectRegistry.swift +45 -19
  252. package/ios/{Views → Core/Views}/AnyViewProp.swift +1 -1
  253. package/ios/{Views → Core/Views}/ComponentData.swift +7 -7
  254. package/ios/{Views → Core/Views}/ExpoView.swift +1 -1
  255. package/ios/Core/Views/ViewDefinition.swift +97 -0
  256. package/ios/{Views → Core/Views}/ViewLifecycleMethod.swift +1 -1
  257. package/ios/{Views → Core/Views}/ViewModuleWrapper.swift +1 -1
  258. package/ios/Fabric/ExpoFabricView.swift +5 -6
  259. package/ios/FileSystemUtilities/FileSystemLegacyUtilities.swift +111 -0
  260. package/ios/JSI/EXJSIInstaller.h +28 -0
  261. package/ios/JSI/EXJSIInstaller.mm +54 -10
  262. package/ios/JSI/EXJSIUtils.h +15 -11
  263. package/ios/JSI/EXJSIUtils.mm +21 -49
  264. package/ios/JSI/EXJavaScriptObject.mm +2 -2
  265. package/ios/JSI/EXJavaScriptRuntime.h +15 -0
  266. package/ios/JSI/EXJavaScriptRuntime.mm +53 -26
  267. package/ios/JSI/EXSharedObjectUtils.h +15 -0
  268. package/ios/JSI/EXSharedObjectUtils.mm +18 -0
  269. package/ios/JSI/JavaScriptRuntime.swift +16 -0
  270. package/ios/Legacy/ModuleRegistry/EXModuleRegistry.m +1 -0
  271. package/ios/Legacy/ModuleRegistryProvider/EXModuleRegistryProvider.m +5 -0
  272. package/ios/Legacy/NativeModulesProxy/EXNativeModulesProxy.mm +5 -4
  273. package/ios/Legacy/Services/EXReactNativeAdapter.mm +34 -28
  274. package/ios/ReactDelegates/EXReactDelegateWrapper.h +4 -12
  275. package/ios/ReactDelegates/EXReactDelegateWrapper.mm +41 -0
  276. package/ios/ReactDelegates/EXReactRootViewFactory.h +38 -0
  277. package/ios/ReactDelegates/EXReactRootViewFactory.mm +54 -0
  278. package/ios/ReactDelegates/ExpoReactDelegate.swift +22 -15
  279. package/ios/ReactDelegates/ExpoReactDelegateHandler.swift +10 -21
  280. package/ios/ReactDelegates/RCTAppDelegate+Recreate.h +28 -0
  281. package/ios/ReactDelegates/RCTAppDelegate+Recreate.mm +47 -0
  282. package/ios/Tests/{ClassComponentSpec.swift → ClassDefinitionSpec.swift} +6 -6
  283. package/ios/Tests/ConvertiblesSpec.swift +6 -1
  284. package/ios/Tests/CoreModuleSpec.swift +0 -4
  285. package/ios/Tests/DynamicTypeSpec.swift +1 -1
  286. package/ios/Tests/EventEmitterSpec.swift +274 -0
  287. package/ios/Tests/ExceptionsSpec.swift +114 -54
  288. package/ios/Tests/ExpoModulesSpec.swift +4 -3
  289. package/ios/Tests/LoggerSpec.swift +80 -0
  290. package/ios/Tests/{PropertyComponentSpec.swift → PropertyDefinitionSpec.swift} +1 -1
  291. package/ios/Tests/SharedObjectRegistrySpec.swift +34 -28
  292. package/ios/Tests/SharedObjectSpec.swift +141 -0
  293. package/ios/Tests/ViewDefinitionSpec.swift +1 -1
  294. package/package.json +2 -2
  295. package/src/EventEmitter.ts +15 -18
  296. package/src/NativeModule.ts +6 -0
  297. package/src/NativeModulesProxy.native.ts +5 -0
  298. package/src/NativeModulesProxy.types.ts +2 -2
  299. package/src/NativeViewManagerAdapter.native.tsx +25 -1
  300. package/src/PermissionsHook.ts +4 -0
  301. package/src/Refs.ts +10 -0
  302. package/src/SharedObject.ts +6 -0
  303. package/src/createWebModule.ts +5 -0
  304. package/src/createWebModule.web.ts +6 -0
  305. package/src/ensureNativeModulesAreInstalled.ts +24 -0
  306. package/src/hooks/useReleasingSharedObject.ts +51 -0
  307. package/src/index.ts +13 -0
  308. package/src/requireNativeModule.ts +2 -51
  309. package/src/ts-declarations/EventEmitter.ts +65 -0
  310. package/src/ts-declarations/ExpoModules.d.ts +0 -5
  311. package/src/ts-declarations/NativeModule.ts +18 -0
  312. package/src/ts-declarations/SharedObject.ts +16 -0
  313. package/src/ts-declarations/global.ts +60 -0
  314. package/src/web/CoreModule.ts +83 -0
  315. package/src/web/index.ts +0 -0
  316. package/src/web/index.web.ts +1 -0
  317. package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +0 -196
  318. package/android/src/main/java/expo/modules/adapters/react/ArgumentsHelper.java +0 -48
  319. package/android/src/main/java/expo/modules/adapters/react/PromiseWrapper.java +0 -38
  320. package/android/src/main/java/expo/modules/adapters/react/services/CookieManagerModule.java +0 -53
  321. package/android/src/main/java/expo/modules/core/ArgumentsHelper.java +0 -44
  322. package/android/src/main/java/expo/modules/core/ExportedModule.java +0 -173
  323. package/android/src/main/java/expo/modules/core/ModuleRegistryDelegate.kt +0 -12
  324. package/android/src/main/java/expo/modules/core/ViewManager.java +0 -9
  325. package/android/src/main/java/expo/modules/core/interfaces/ExpoMethod.java +0 -12
  326. package/android/src/main/java/expo/modules/core/interfaces/ExpoProp.java +0 -10
  327. package/android/src/main/java/expo/modules/core/logging/LoggerOptions.kt +0 -29
  328. package/android-annotation/build.gradle +0 -48
  329. package/android-annotation/src/main/java/expo/modules/annotation/Config.kt +0 -7
  330. package/android-annotation/src/main/java/expo/modules/annotation/ConverterBinder.kt +0 -7
  331. package/android-annotation-processor/build.gradle +0 -54
  332. package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessor.kt +0 -175
  333. package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessorProvider.kt +0 -10
  334. package/android-annotation-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider +0 -1
  335. package/ios/Classes/ClassComponentElement.swift +0 -37
  336. package/ios/Classes/ClassComponentElementsBuilder.swift +0 -34
  337. package/ios/ExpoBridgeModule.m +0 -7
  338. package/ios/ExpoBridgeModule.swift +0 -108
  339. package/ios/ExpoRuntime.swift +0 -28
  340. package/ios/Functions/AsyncFunctionComponent.swift +0 -327
  341. package/ios/Functions/SyncFunctionComponent.swift +0 -282
  342. package/ios/Interfaces/Font/EXFontManagerInterface.h +0 -9
  343. package/ios/Interfaces/Font/EXFontProcessorInterface.h +0 -15
  344. package/ios/Interfaces/Font/EXFontScalerInterface.h +0 -9
  345. package/ios/Interfaces/Font/EXFontScalersManagerInterface.h +0 -9
  346. package/ios/Legacy/Services/EXReactFontManager.h +0 -6
  347. package/ios/Legacy/Services/EXReactFontManager.m +0 -130
  348. package/ios/Modules/AnyModule.swift +0 -53
  349. package/ios/Modules/CoreModule.swift +0 -17
  350. package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.h +0 -16
  351. package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.m +0 -49
  352. package/ios/ReactDelegates/EXReactCompatibleHelpers.h +0 -15
  353. package/ios/ReactDelegates/EXReactCompatibleHelpers.m +0 -25
  354. package/ios/ReactDelegates/EXReactDelegateWrapper.m +0 -53
  355. package/ios/SharedObjects/SharedObject.swift +0 -31
  356. package/ios/Views/ViewDefinition.swift +0 -114
  357. package/ios/Views/ViewFactory.swift +0 -16
  358. package/ios/Views/ViewManagerDefinition.swift +0 -77
  359. package/ios/Views/ViewManagerDefinitionBuilder.swift +0 -11
  360. /package/ios/{AppContextConfig.swift → Core/AppContextConfig.swift} +0 -0
  361. /package/ios/{Arguments → Core/Arguments}/AnyArgument.swift +0 -0
  362. /package/ios/{Arguments → Core/Arguments}/Convertible.swift +0 -0
  363. /package/ios/{Arguments → Core/Arguments}/Convertibles.swift +0 -0
  364. /package/ios/{Arguments → Core/Arguments}/Enumerable.swift +0 -0
  365. /package/ios/{Classes → Core/Classes}/ClassRegistry.swift +0 -0
  366. /package/ios/{Convertibles → Core/Convertibles}/Convertibles+Color.swift +0 -0
  367. /package/ios/{Convertibles → Core/Convertibles}/Either.swift +0 -0
  368. /package/ios/{DynamicTypes → Core/DynamicTypes}/AnyDynamicType.swift +0 -0
  369. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicArrayType.swift +0 -0
  370. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicConvertibleType.swift +0 -0
  371. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDataType.swift +0 -0
  372. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDictionaryType.swift +0 -0
  373. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicEnumType.swift +0 -0
  374. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicJavaScriptType.swift +0 -0
  375. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicOptionalType.swift +0 -0
  376. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicRawType.swift +0 -0
  377. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicType.swift +0 -0
  378. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicTypedArrayType.swift +0 -0
  379. /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicViewType.swift +0 -0
  380. /package/ios/{EventListener.swift → Core/EventListener.swift} +0 -0
  381. /package/ios/{Events → Core/Events}/Callback.swift +0 -0
  382. /package/ios/{Events → Core/Events}/EventDispatcher.swift +0 -0
  383. /package/ios/{Exceptions → Core/Exceptions}/ChainableException.swift +0 -0
  384. /package/ios/{Exceptions → Core/Exceptions}/CodedError.swift +0 -0
  385. /package/ios/{Exceptions → Core/Exceptions}/CommonExceptions.swift +0 -0
  386. /package/ios/{Exceptions → Core/Exceptions}/Exception.swift +0 -0
  387. /package/ios/{Exceptions → Core/Exceptions}/ExceptionOrigin.swift +0 -0
  388. /package/ios/{Exceptions → Core/Exceptions}/GenericException.swift +0 -0
  389. /package/ios/{Exceptions → Core/Exceptions}/UnexpectedException.swift +0 -0
  390. /package/ios/{JavaScriptFunction.swift → Core/JavaScriptFunction.swift} +0 -0
  391. /package/ios/{Logging → Core/Logging}/LogType.swift +0 -0
  392. /package/ios/{Logging → Core/Logging}/PersistentFileLog.swift +0 -0
  393. /package/ios/{ModuleRegistry.swift → Core/ModuleRegistry.swift} +0 -0
  394. /package/ios/{Modules → Core/Modules}/Module.swift +0 -0
  395. /package/ios/{ModulesProvider.swift → Core/ModulesProvider.swift} +0 -0
  396. /package/ios/{Objects → Core/Objects}/JavaScriptObjectBuilder.swift +0 -0
  397. /package/ios/{Promise.swift → Core/Promise.swift} +0 -0
  398. /package/ios/{Records → Core/Records}/AnyField.swift +0 -0
  399. /package/ios/{Records → Core/Records}/Field.swift +0 -0
  400. /package/ios/{Records → Core/Records}/FieldExtensions.swift +0 -0
  401. /package/ios/{Records → Core/Records}/FieldOption.swift +0 -0
  402. /package/ios/{Records → Core/Records}/Record.swift +0 -0
  403. /package/ios/{SharedObjects → Core/SharedObjects}/SharedRef.swift +0 -0
  404. /package/ios/{TypedArrays → Core/TypedArrays}/AnyTypedArray.swift +0 -0
  405. /package/ios/{TypedArrays → Core/TypedArrays}/ConcreteTypedArrays.swift +0 -0
  406. /package/ios/{TypedArrays → Core/TypedArrays}/GenericTypedArray.swift +0 -0
  407. /package/ios/{TypedArrays → Core/TypedArrays}/TypedArray.swift +0 -0
  408. /package/ios/{Views → Core/Views}/ConcreteViewProp.swift +0 -0
@@ -8,51 +8,57 @@ final class SharedObjectRegistrySpec: ExpoSpec {
8
8
  override class func spec() {
9
9
  let appContext = AppContext.create()
10
10
  let runtime = try! appContext.runtime
11
+ let sharedObjectRegistry = appContext.sharedObjectRegistry
11
12
 
12
13
  describe("pullNextId") {
13
14
  it("returns nextId") {
14
- let id = SharedObjectRegistry.nextId
15
- expect(SharedObjectRegistry.pullNextId()) == id
15
+ let id = sharedObjectRegistry.nextId
16
+ expect(sharedObjectRegistry.pullNextId()) == id
16
17
  }
17
18
  it("increments nextId") {
18
- let id = SharedObjectRegistry.nextId
19
- SharedObjectRegistry.pullNextId()
20
- expect(SharedObjectRegistry.nextId) == id + 1
19
+ let id = sharedObjectRegistry.nextId
20
+ sharedObjectRegistry.pullNextId()
21
+ expect(sharedObjectRegistry.nextId) == id + 1
21
22
  }
22
23
  it("is not increasing size") {
23
- let size = SharedObjectRegistry.size
24
- SharedObjectRegistry.pullNextId()
25
- expect(SharedObjectRegistry.size) == size
24
+ let size = sharedObjectRegistry.size
25
+ sharedObjectRegistry.pullNextId()
26
+ expect(sharedObjectRegistry.size) == size
26
27
  }
27
28
  }
28
29
 
29
30
  describe("add") {
30
31
  it("adds using nextId") {
31
- let nextId = SharedObjectRegistry.nextId
32
- let id = SharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
32
+ let nextId = sharedObjectRegistry.nextId
33
+ let id = sharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
33
34
  expect(nextId) == id
34
35
  }
35
36
  it("is increasing size") {
36
- let size = SharedObjectRegistry.size
37
- SharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
38
- expect(SharedObjectRegistry.size) == size + 1
37
+ let size = sharedObjectRegistry.size
38
+ sharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
39
+ expect(sharedObjectRegistry.size) == size + 1
39
40
  }
40
41
  it("assigns id on native object") {
41
42
  let nativeObject = TestSharedObject()
42
- let id = SharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
43
+ let id = sharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
43
44
  expect(nativeObject.sharedObjectId) == id
44
45
  }
46
+ it("assigns the app context on native object") {
47
+ let nativeObject = TestSharedObject()
48
+ sharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
49
+ expect(nativeObject.appContext) == appContext
50
+ }
45
51
  it("assigns id on JS object") {
46
52
  let jsObject = runtime.createObject()
47
- let id = SharedObjectRegistry.add(native: TestSharedObject(), javaScript: jsObject)
53
+ let id = sharedObjectRegistry.add(native: TestSharedObject(), javaScript: jsObject)
48
54
  expect(jsObject.hasProperty(sharedObjectIdPropertyName)) == true
49
55
  expect(try! jsObject.getProperty(sharedObjectIdPropertyName).asInt()) == id
50
56
  }
51
57
  it("saves objects pair") {
52
58
  let nativeObject = TestSharedObject()
53
59
  let jsObject = runtime.createObject()
54
- let id = SharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
55
- let pair = SharedObjectRegistry.get(id)
60
+ let id = sharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
61
+ let pair = sharedObjectRegistry.get(id)
56
62
  expect(pair?.native) === nativeObject
57
63
  expect(pair?.javaScript.lock()) == jsObject
58
64
  }
@@ -60,14 +66,14 @@ final class SharedObjectRegistrySpec: ExpoSpec {
60
66
 
61
67
  describe("delete") {
62
68
  it("deletes objects pair") {
63
- let id = SharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
64
- SharedObjectRegistry.delete(id)
65
- expect(SharedObjectRegistry.get(id)).to(beNil())
69
+ let id = sharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
70
+ sharedObjectRegistry.delete(id)
71
+ expect(sharedObjectRegistry.get(id)).to(beNil())
66
72
  }
67
73
  it("resets id on native object") {
68
74
  let nativeObject = TestSharedObject()
69
- let id = SharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
70
- SharedObjectRegistry.delete(id)
75
+ let id = sharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
76
+ sharedObjectRegistry.delete(id)
71
77
  expect(nativeObject.sharedObjectId).toEventually(equal(0))
72
78
  }
73
79
  }
@@ -76,12 +82,12 @@ final class SharedObjectRegistrySpec: ExpoSpec {
76
82
  it("returns native object") {
77
83
  let nativeObject = TestSharedObject()
78
84
  let jsObject = runtime.createObject()
79
- SharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
80
- expect(SharedObjectRegistry.toNativeObject(jsObject)) === nativeObject
85
+ sharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
86
+ expect(sharedObjectRegistry.toNativeObject(jsObject)) === nativeObject
81
87
  }
82
88
  it("returns nil") {
83
89
  let jsObject = runtime.createObject()
84
- expect(SharedObjectRegistry.toNativeObject(jsObject)).to(beNil())
90
+ expect(sharedObjectRegistry.toNativeObject(jsObject)).to(beNil())
85
91
  }
86
92
  }
87
93
 
@@ -89,12 +95,12 @@ final class SharedObjectRegistrySpec: ExpoSpec {
89
95
  it("returns JS object") {
90
96
  let nativeObject = TestSharedObject()
91
97
  let jsObject = runtime.createObject()
92
- SharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
93
- expect(SharedObjectRegistry.toJavaScriptObject(nativeObject)) == jsObject
98
+ sharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
99
+ expect(sharedObjectRegistry.toJavaScriptObject(nativeObject)) == jsObject
94
100
  }
95
101
  it("returns nil") {
96
102
  let nativeObject = TestSharedObject()
97
- expect(SharedObjectRegistry.toJavaScriptObject(nativeObject)).to(beNil())
103
+ expect(sharedObjectRegistry.toJavaScriptObject(nativeObject)).to(beNil())
98
104
  }
99
105
  }
100
106
  }
@@ -0,0 +1,141 @@
1
+ import ExpoModulesTestCore
2
+
3
+ @testable import ExpoModulesCore
4
+
5
+ final class SharedObjectSpec: ExpoSpec {
6
+ override class func spec() {
7
+ let appContext = AppContext.create()
8
+ let runtime = try! appContext.runtime
9
+
10
+ beforeSuite {
11
+ appContext.moduleRegistry.register(moduleType: SharedObjectModule.self)
12
+ }
13
+
14
+ describe("Base JS class") {
15
+ it("exists") {
16
+ let baseSharedObjectClass = try runtime.eval("expo.SharedObject")
17
+ expect(baseSharedObjectClass.kind) == .function
18
+ }
19
+
20
+ it("has release function in prototype") {
21
+ let releaseFunction = try runtime.eval("expo.SharedObject.prototype.release")
22
+ expect(releaseFunction.kind) == .function
23
+ }
24
+
25
+ it("initializes") {
26
+ let sharedObject = try runtime.eval("new expo.SharedObject()")
27
+ expect(sharedObject.kind) == .object
28
+ }
29
+
30
+ it("does not register") {
31
+ let registrySizeBefore = appContext.sharedObjectRegistry.size
32
+ try runtime.eval("new expo.SharedObject()")
33
+ expect(appContext.sharedObjectRegistry.size) == registrySizeBefore
34
+ }
35
+
36
+ it("inherits from EventEmitter") {
37
+ let isEventEmitter = try runtime.eval("new expo.SharedObject() instanceof expo.EventEmitter")
38
+ expect(isEventEmitter.kind) == .bool
39
+ expect(try isEventEmitter.asBool()) == true
40
+ }
41
+ }
42
+
43
+ describe("Concrete JS class") {
44
+ it("exists") {
45
+ let sharedObjectClass = try runtime.eval("expo.modules.SharedObjectModule.SharedObjectExample")
46
+ expect(sharedObjectClass.kind) == .function
47
+ }
48
+
49
+ it("has base class prototype") {
50
+ let hasBaseClassPrototype = try runtime.eval("expo.modules.SharedObjectModule.SharedObjectExample.prototype instanceof expo.SharedObject")
51
+ expect(hasBaseClassPrototype.kind) == .bool
52
+ expect(try hasBaseClassPrototype.asBool()) == true
53
+ }
54
+
55
+ it("creates new instance") {
56
+ let sharedObject = try runtime.eval("new expo.modules.SharedObjectModule.SharedObjectExample()")
57
+ expect(sharedObject.kind) == .object
58
+ }
59
+
60
+ it("registers") {
61
+ let registrySizeBefore = appContext.sharedObjectRegistry.size
62
+ try runtime.eval("new expo.modules.SharedObjectModule.SharedObjectExample()")
63
+ expect(appContext.sharedObjectRegistry.size) == registrySizeBefore + 1
64
+ }
65
+
66
+ it("is instance of") {
67
+ let isInstanceOf = try runtime.eval([
68
+ "sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()",
69
+ "sharedObject instanceof expo.modules.SharedObjectModule.SharedObjectExample"
70
+ ])
71
+ expect(isInstanceOf.kind) == .bool
72
+ expect(try isInstanceOf.asBool()) == true
73
+ }
74
+
75
+ it("is instance of base class") {
76
+ let isInstanceOfBaseClass = try runtime.eval([
77
+ "sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()",
78
+ "sharedObject instanceof expo.SharedObject"
79
+ ])
80
+ expect(isInstanceOfBaseClass.kind) == .bool
81
+ expect(try isInstanceOfBaseClass.asBool()) == true
82
+ }
83
+
84
+ it("has function from base class") {
85
+ let releaseFunction = try runtime.eval([
86
+ "sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()",
87
+ "sharedObject.release"
88
+ ])
89
+ expect(releaseFunction.kind) == .function
90
+ }
91
+ }
92
+
93
+ describe("Native object") {
94
+ // Event emitting requires Xcode 15.0, but we're still using Xcode 14
95
+ // to run these tests on GitHub Actions due to some performance issues.
96
+ #if swift(>=5.9)
97
+ it("emits events") {
98
+ // Create the shared object
99
+ let jsObject = try runtime
100
+ .eval("sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()")
101
+ .asObject()
102
+
103
+ // Add a listener that adds three arguments
104
+ try runtime.eval([
105
+ "result = null",
106
+ "sharedObject.addListener('test event', (number, string, record) => { result = { number, string, record } })"
107
+ ])
108
+
109
+ // Get the native instance
110
+ let nativeObject = appContext.sharedObjectRegistry.toNativeObject(jsObject)
111
+
112
+ struct EventRecord: Record {
113
+ @Field var boolean: Bool = true
114
+ }
115
+
116
+ // Emit an event from the native object to JS
117
+ nativeObject?.emit(event: "test event", arguments: 123, "test", EventRecord())
118
+
119
+ // Check the value that is set by the listener
120
+ let result = try runtime.eval("result").asObject()
121
+
122
+ expect(try result.getProperty("number").asInt()) == 123
123
+ expect(try result.getProperty("string").asString()) == "test"
124
+ expect(try result.getProperty("record").asObject().getProperty("boolean").asBool()) == true
125
+ }
126
+ #endif // swift(>=5.9)
127
+ }
128
+ }
129
+ }
130
+
131
+ private class SharedObjectModule: Module {
132
+ public func definition() -> ModuleDefinition {
133
+ Class(SharedObjectExample.self) {
134
+ Constructor {
135
+ return SharedObjectExample()
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ private final class SharedObjectExample: SharedObject {}
@@ -33,7 +33,7 @@ final class ViewDefinitionSpec: ExpoSpec {
33
33
  let textView = UITextView()
34
34
  let content = "hello"
35
35
  let definition = View(UITextView.self) {
36
- // The type of `view` is inferred and equals to the type passed to `View` component.
36
+ // The type of `view` is inferred and equals to the type passed to `View`.
37
37
  Prop("content") { (view, _: String) in
38
38
  expect(view).to(beAKindOf(UITextView.self))
39
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-modules-core",
3
- "version": "1.11.13",
3
+ "version": "1.12.1",
4
4
  "description": "The core of Expo Modules architecture",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -44,5 +44,5 @@
44
44
  "@testing-library/react-hooks": "^7.0.1",
45
45
  "expo-module-scripts": "^3.0.0"
46
46
  },
47
- "gitHead": "2ad93407e82a11504d6cc2412cf3d76858782619"
47
+ "gitHead": "0897aeadb926491a457bcd67d83360956994ee82"
48
48
  }
@@ -1,5 +1,5 @@
1
1
  import invariant from 'invariant';
2
- import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
2
+ import { NativeEventEmitter, Platform } from 'react-native';
3
3
 
4
4
  const nativeEmitterSubscriptionKey = '@@nativeEmitterSubscription@@';
5
5
 
@@ -7,8 +7,11 @@ type NativeModule = {
7
7
  __expo_module_name__?: string;
8
8
  startObserving?: () => void;
9
9
  stopObserving?: () => void;
10
- addListener: (eventName: string) => void;
11
- removeListeners: (count: number) => void;
10
+
11
+ // Erase these types as they would conflict with the new NativeModule type.
12
+ // This EventEmitter is deprecated anyway.
13
+ addListener?: any;
14
+ removeListeners?: any;
12
15
  };
13
16
 
14
17
  // @needsAudit
@@ -21,25 +24,19 @@ export type Subscription = {
21
24
 
22
25
  export class EventEmitter {
23
26
  _listenerCount = 0;
27
+
28
+ // @ts-expect-error
24
29
  _nativeModule: NativeModule;
30
+
31
+ // @ts-expect-error
25
32
  _eventEmitter: NativeEventEmitter;
26
33
 
27
34
  constructor(nativeModule: NativeModule) {
28
- // Expo modules installed through the JSI don't have `addListener` and `removeListeners` set,
29
- // so if someone wants to use them with `EventEmitter`, make sure to provide these functions
30
- // as they are required by `NativeEventEmitter`. This is only temporary — in the future
31
- // JSI modules will have event emitter built in.
32
- if (nativeModule.__expo_module_name__ && NativeModules.EXReactNativeEventEmitter) {
33
- nativeModule.addListener = (...args) =>
34
- NativeModules.EXReactNativeEventEmitter.addProxiedListener(
35
- nativeModule.__expo_module_name__,
36
- ...args
37
- );
38
- nativeModule.removeListeners = (...args) =>
39
- NativeModules.EXReactNativeEventEmitter.removeProxiedListeners(
40
- nativeModule.__expo_module_name__,
41
- ...args
42
- );
35
+ // If the native module is a new module, just return it back as it's already an event emitter.
36
+ // This is for backwards compatibility until we stop using this legacy class in other packages.
37
+ if (nativeModule.__expo_module_name__) {
38
+ // @ts-expect-error
39
+ return nativeModule;
43
40
  }
44
41
  this._nativeModule = nativeModule;
45
42
  this._eventEmitter = new NativeEventEmitter(nativeModule as any);
@@ -0,0 +1,6 @@
1
+ import { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';
2
+ import type { NativeModule } from './ts-declarations/NativeModule';
3
+
4
+ ensureNativeModulesAreInstalled();
5
+
6
+ export default globalThis.expo.NativeModule as typeof NativeModule;
@@ -1,3 +1,8 @@
1
+ // Copyright © 2024 650 Industries.
2
+ // NOTE: Forcing this to be a client boundary so the errors are a bit clearer. In the future we can
3
+ // make this a shim on the server by ignoring the globals that are missing in React Server contexts (Node.js).
4
+ 'use client';
5
+
1
6
  import { NativeModules } from 'react-native';
2
7
 
3
8
  import { ProxyNativeModule } from './NativeModulesProxy.types';
@@ -1,5 +1,5 @@
1
1
  export type ProxyNativeModule = {
2
2
  [propertyName: string]: any;
3
- addListener: (eventName: string) => void;
4
- removeListeners: (count: number) => void;
3
+ addListener?: (eventName: string) => void;
4
+ removeListeners?: (count: number) => void;
5
5
  };
@@ -1,5 +1,10 @@
1
+ // Copyright © 2024 650 Industries.
2
+
3
+ 'use client';
4
+
1
5
  import React from 'react';
2
- import { findNodeHandle, NativeModules, requireNativeComponent, HostComponent } from 'react-native';
6
+ import { findNodeHandle, NativeModules, HostComponent } from 'react-native';
7
+ import * as NativeComponentRegistry from 'react-native/Libraries/NativeComponent/NativeComponentRegistry';
3
8
 
4
9
  import { requireNativeModule } from './requireNativeModule';
5
10
 
@@ -17,6 +22,25 @@ import { requireNativeModule } from './requireNativeModule';
17
22
  */
18
23
  const nativeComponentsCache = new Map<string, HostComponent<any>>();
19
24
 
25
+ /**
26
+ * Requires a React Native component using the static view config from an Expo module.
27
+ */
28
+ function requireNativeComponent<Props>(viewName: string): HostComponent<Props> {
29
+ return NativeComponentRegistry.get<Props>(viewName, () => {
30
+ const viewModuleName = viewName.replace('ViewManagerAdapter_', '');
31
+ const expoViewConfig = globalThis.expo?.getViewConfig(viewModuleName);
32
+
33
+ if (!expoViewConfig) {
34
+ console.warn('Unable to get the view config for %s', viewModuleName);
35
+ }
36
+
37
+ return {
38
+ uiViewClassName: viewName,
39
+ ...expoViewConfig,
40
+ };
41
+ });
42
+ }
43
+
20
44
  /**
21
45
  * Requires a React Native component from cache if possible. This prevents
22
46
  * "Tried to register two views with the same name" errors on fast refresh, but
@@ -1,3 +1,7 @@
1
+ // Copyright © 2024 650 Industries.
2
+
3
+ 'use client';
4
+
1
5
  import { useCallback, useEffect, useRef, useState } from 'react';
2
6
 
3
7
  import { PermissionResponse } from './PermissionsInterface';
package/src/Refs.ts ADDED
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Create a React ref object that is friendly for snapshots.
5
+ * It will be represented as `[React.ref]` in snapshots.
6
+ * @returns a React ref object.
7
+ */
8
+ export function createSnapshotFriendlyRef<T>(): React.RefObject<T> {
9
+ return React.createRef<T>();
10
+ }
@@ -0,0 +1,6 @@
1
+ import { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';
2
+ import type { SharedObject } from './ts-declarations/SharedObject';
3
+
4
+ ensureNativeModulesAreInstalled();
5
+
6
+ export default globalThis.expo.SharedObject as typeof SharedObject;
@@ -0,0 +1,5 @@
1
+ // It is a no-op function that returns the module implementation without importing CoreModule.
2
+ // Actual implementation is located in `createWebModule.web.ts`.
3
+ export function createWebModule<ModuleType = any>(moduleImplementation: ModuleType): ModuleType {
4
+ return moduleImplementation;
5
+ }
@@ -0,0 +1,6 @@
1
+ import { NativeModule } from './web/CoreModule';
2
+
3
+ export function createWebModule<ModuleType = any>(moduleImplementation: ModuleType): ModuleType {
4
+ const module = new NativeModule();
5
+ return Object.assign(module, moduleImplementation);
6
+ }
@@ -0,0 +1,24 @@
1
+ import { NativeModules, Platform } from 'react-native';
2
+
3
+ /**
4
+ * Ensures that the native modules are installed in the current runtime.
5
+ * Otherwise, it synchronously calls a native function that installs them.
6
+ */
7
+ export function ensureNativeModulesAreInstalled(): void {
8
+ if (globalThis.expo) {
9
+ return;
10
+ }
11
+ try {
12
+ if (Platform.OS === 'web') {
13
+ // Requiring web folder sets up the `globalThis.expo` object.
14
+ require('./web');
15
+ } else {
16
+ // TODO: ExpoModulesCore shouldn't be optional here,
17
+ // but to keep backwards compatibility let's just ignore it in SDK 50.
18
+ // In most cases the modules were already installed from the native side.
19
+ NativeModules.ExpoModulesCore?.installModules();
20
+ }
21
+ } catch (error) {
22
+ console.error(`Unable to install Expo modules: ${error}`);
23
+ }
24
+ }
@@ -0,0 +1,51 @@
1
+ import { DependencyList, useRef, useMemo, useEffect } from 'react';
2
+
3
+ import type { SharedObject } from '../ts-declarations/SharedObject';
4
+
5
+ /**
6
+ * Returns a shared object, which is automatically cleaned up when the component is unmounted.
7
+ */
8
+ export function useReleasingSharedObject<TSharedObject extends SharedObject>(
9
+ factory: () => TSharedObject,
10
+ dependencies: DependencyList
11
+ ): TSharedObject {
12
+ const objectRef = useRef<TSharedObject | null>(null);
13
+ const isFastRefresh = useRef(false);
14
+ const previousDependencies = useRef<DependencyList>(dependencies);
15
+
16
+ if (objectRef.current == null) {
17
+ objectRef.current = factory();
18
+ }
19
+
20
+ const object = useMemo(() => {
21
+ let newObject = objectRef.current;
22
+ const dependenciesAreEqual =
23
+ previousDependencies.current?.length === dependencies.length &&
24
+ dependencies.every((value, index) => value === previousDependencies.current[index]);
25
+
26
+ // If the dependencies have changed, release the previous object and create a new one, otherwise this has been called
27
+ // because of a fast refresh, and we don't want to release the object.
28
+ if (!newObject || !dependenciesAreEqual) {
29
+ objectRef.current?.release();
30
+ newObject = factory();
31
+ objectRef.current = newObject;
32
+ previousDependencies.current = dependencies;
33
+ } else {
34
+ isFastRefresh.current = true;
35
+ }
36
+ return newObject;
37
+ }, dependencies);
38
+
39
+ useEffect(() => {
40
+ isFastRefresh.current = false;
41
+
42
+ return () => {
43
+ // This will be called on every fast refresh and on unmount, but we only want to release the object on unmount.
44
+ if (!isFastRefresh.current && objectRef.current) {
45
+ objectRef.current.release();
46
+ }
47
+ };
48
+ }, []);
49
+
50
+ return object;
51
+ }
package/src/index.ts CHANGED
@@ -1,14 +1,19 @@
1
1
  import { DeviceEventEmitter } from 'react-native';
2
2
 
3
3
  import { EventEmitter, Subscription } from './EventEmitter';
4
+ import NativeModule from './NativeModule';
4
5
  import NativeModulesProxy from './NativeModulesProxy';
5
6
  import { ProxyNativeModule } from './NativeModulesProxy.types';
6
7
  import { requireNativeViewManager } from './NativeViewManagerAdapter';
7
8
  import Platform from './Platform';
9
+ import SharedObject from './SharedObject';
8
10
  import { CodedError } from './errors/CodedError';
9
11
  import { UnavailabilityError } from './errors/UnavailabilityError';
10
12
 
11
13
  import './sweet/setUpErrorManager.fx';
14
+ import './web/index';
15
+
16
+ export type * from './ts-declarations/global';
12
17
 
13
18
  export { default as uuid } from './uuid';
14
19
 
@@ -20,12 +25,16 @@ export {
20
25
  Platform,
21
26
  Subscription,
22
27
  requireNativeViewManager,
28
+ // Globals
29
+ SharedObject,
30
+ NativeModule,
23
31
  // Errors
24
32
  CodedError,
25
33
  UnavailabilityError,
26
34
  };
27
35
 
28
36
  export * from './requireNativeModule';
37
+ export * from './createWebModule';
29
38
  export * from './TypedArrays.types';
30
39
 
31
40
  /**
@@ -35,3 +44,7 @@ export const SyntheticPlatformEmitter = DeviceEventEmitter;
35
44
 
36
45
  export * from './PermissionsInterface';
37
46
  export * from './PermissionsHook';
47
+
48
+ export * from './Refs';
49
+
50
+ export * from './hooks/useReleasingSharedObject';
@@ -1,31 +1,5 @@
1
- import { NativeModules } from 'react-native';
2
-
3
1
  import NativeModulesProxy from './NativeModulesProxy';
4
-
5
- type ExpoObject = {
6
- modules:
7
- | undefined
8
- | {
9
- [key: string]: any;
10
- };
11
- uuidv4: () => string;
12
- uuidv5: (name: string, namespace: string) => string;
13
- };
14
-
15
- declare global {
16
- // eslint-disable-next-line no-var
17
- var expo: ExpoObject | undefined;
18
-
19
- /**
20
- * @deprecated `global.ExpoModules` is deprecated, use `global.expo.modules` instead.
21
- */
22
- // eslint-disable-next-line no-var
23
- var ExpoModules:
24
- | undefined
25
- | {
26
- [key: string]: any;
27
- };
28
- }
2
+ import { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';
29
3
 
30
4
  /**
31
5
  * Imports the native module registered with given name. In the first place it tries to load
@@ -57,28 +31,5 @@ export function requireOptionalNativeModule<ModuleType = any>(
57
31
  ): ModuleType | null {
58
32
  ensureNativeModulesAreInstalled();
59
33
 
60
- return (
61
- globalThis.expo?.modules?.[moduleName] ??
62
- globalThis.ExpoModules?.[moduleName] ??
63
- NativeModulesProxy[moduleName] ??
64
- null
65
- );
66
- }
67
-
68
- /**
69
- * Ensures that the native modules are installed in the current runtime.
70
- * Otherwise, it synchronously calls a native function that installs them.
71
- */
72
- function ensureNativeModulesAreInstalled(): void {
73
- if (globalThis.expo) {
74
- return;
75
- }
76
- try {
77
- // TODO: ExpoModulesCore shouldn't be optional here,
78
- // but to keep backwards compatibility let's just ignore it in SDK 50.
79
- // In most cases the modules were already installed from the native side.
80
- NativeModules.ExpoModulesCore?.installModules();
81
- } catch (error) {
82
- console.error(`Unable to install Expo modules: ${error}`);
83
- }
34
+ return globalThis.expo?.modules?.[moduleName] ?? NativeModulesProxy[moduleName] ?? null;
84
35
  }