react-native-windows 0.74.12 → 0.75.0-preview.2

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 (335) hide show
  1. package/.flowconfig +8 -2
  2. package/Common/Utilities.cpp +2 -2
  3. package/Folly/TEMP_UntilFollyUpdate/ConstexprMath.h +970 -0
  4. package/Folly/TEMP_UntilFollyUpdate/json.cpp +1110 -0
  5. package/Folly/TEMP_UntilFollyUpdate/lang/ToAscii.cpp +4 -2
  6. package/Libraries/Animated/AnimatedImplementation.js +2 -0
  7. package/Libraries/Animated/NativeAnimatedHelper.js +4 -0
  8. package/Libraries/Animated/createAnimatedComponent.js +10 -4
  9. package/Libraries/Animated/useAnimatedProps.js +56 -28
  10. package/Libraries/BatchedBridge/MessageQueue.js +1 -0
  11. package/Libraries/Components/Button.js +10 -5
  12. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +11 -2
  13. package/Libraries/Components/Flyout/Flyout.js +10 -10
  14. package/Libraries/Components/Flyout/FlyoutNativeComponent.js +8 -7
  15. package/Libraries/Components/Pressable/Pressable.js +13 -6
  16. package/Libraries/Components/Pressable/Pressable.windows.js +13 -6
  17. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +4 -0
  18. package/Libraries/Components/ScrollView/ScrollView.js +109 -29
  19. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +6 -0
  20. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.windows.js +6 -0
  21. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +13 -1
  22. package/Libraries/Components/StatusBar/StatusBar.js +1 -21
  23. package/Libraries/Components/Switch/Switch.windows.js +2 -0
  24. package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +0 -15
  25. package/Libraries/Components/TextInput/InputAccessoryView.js +10 -1
  26. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +0 -12
  27. package/Libraries/Components/TextInput/TextInput.d.ts +0 -19
  28. package/Libraries/Components/TextInput/TextInput.js +14 -70
  29. package/Libraries/Components/TextInput/TextInput.windows.js +15 -72
  30. package/Libraries/Components/TextInput/WindowsTextInputNativeComponent.js +27 -12
  31. package/Libraries/Components/Touchable/Touchable.js +2 -2
  32. package/Libraries/Components/Touchable/TouchableHighlight.d.ts +4 -10
  33. package/Libraries/Components/Touchable/TouchableHighlight.js +3 -1
  34. package/Libraries/Components/Touchable/TouchableHighlight.windows.js +3 -1
  35. package/Libraries/Components/Touchable/TouchableOpacity.d.ts +4 -32
  36. package/Libraries/Components/Touchable/TouchableOpacity.js +3 -1
  37. package/Libraries/Components/Touchable/TouchableOpacity.windows.js +3 -1
  38. package/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts +8 -0
  39. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +117 -111
  40. package/Libraries/Components/Touchable/TouchableWithoutFeedback.windows.js +129 -110
  41. package/Libraries/Components/View/ReactNativeStyleAttributes.js +6 -0
  42. package/Libraries/Components/View/ReactNativeViewAttributes.js +1 -0
  43. package/Libraries/Components/View/ReactNativeViewAttributes.windows.js +1 -0
  44. package/Libraries/Components/View/View.js +0 -11
  45. package/Libraries/Components/View/View.windows.js +0 -11
  46. package/Libraries/Components/View/ViewAccessibility.js +4 -4
  47. package/Libraries/Components/View/ViewAccessibility.windows.js +4 -4
  48. package/Libraries/Components/View/ViewPropTypes.d.ts +21 -59
  49. package/Libraries/Components/View/ViewPropTypes.js +7 -0
  50. package/Libraries/Components/View/ViewPropTypes.windows.js +7 -0
  51. package/Libraries/Core/Devtools/loadBundleFromServer.js +3 -3
  52. package/Libraries/Core/Devtools/loadBundleFromServer.windows.js +153 -0
  53. package/Libraries/Core/Devtools/parseErrorStack.js +5 -5
  54. package/Libraries/Core/Devtools/parseHermesStack.js +22 -16
  55. package/Libraries/Core/ErrorHandlers.js +116 -0
  56. package/Libraries/Core/ExceptionsManager.js +2 -2
  57. package/Libraries/Core/ReactNativeVersion.js +3 -3
  58. package/Libraries/Core/setUpDeveloperTools.js +3 -1
  59. package/Libraries/Core/setUpPerformance.js +6 -4
  60. package/Libraries/Core/setUpReactDevTools.js +70 -10
  61. package/Libraries/Core/setUpTimers.js +50 -31
  62. package/Libraries/Debugging/DebuggingOverlayRegistry.js +1 -1
  63. package/Libraries/Image/Image.android.js +23 -13
  64. package/Libraries/Image/Image.d.ts +14 -15
  65. package/Libraries/Image/Image.ios.js +21 -11
  66. package/Libraries/Image/Image.windows.js +21 -11
  67. package/Libraries/Image/ImageProps.js +16 -5
  68. package/Libraries/Image/ImageTypes.flow.js +7 -2
  69. package/Libraries/Image/ImageUtils.js +1 -0
  70. package/Libraries/Image/ImageViewNativeComponent.js +2 -1
  71. package/Libraries/Inspector/ElementBox.js +6 -3
  72. package/Libraries/Inspector/ElementProperties.js +1 -1
  73. package/Libraries/Interaction/TouchHistoryMath.js +4 -4
  74. package/Libraries/IntersectionObserver/IntersectionObserverManager.js +6 -26
  75. package/Libraries/JSInspector/NetworkAgent.js +1 -1
  76. package/Libraries/LogBox/Data/LogBoxData.js +39 -29
  77. package/Libraries/LogBox/Data/LogBoxLog.js +114 -2
  78. package/Libraries/LogBox/Data/parseLogBoxLog.js +168 -53
  79. package/Libraries/LogBox/LogBox.js +29 -12
  80. package/Libraries/LogBox/LogBoxNotificationContainer.js +4 -0
  81. package/Libraries/LogBox/UI/LogBoxInspector.js +8 -70
  82. package/Libraries/LogBox/UI/LogBoxInspectorBody.js +87 -0
  83. package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +6 -42
  84. package/Libraries/LogBox/UI/LogBoxInspectorFooterButton.js +58 -0
  85. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +5 -66
  86. package/Libraries/LogBox/UI/LogBoxInspectorHeader.windows.js +5 -66
  87. package/Libraries/LogBox/UI/LogBoxInspectorHeaderButton.js +76 -0
  88. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.js +8 -5
  89. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.windows.js +8 -5
  90. package/Libraries/LogBox/UI/LogBoxNotification.js +13 -152
  91. package/Libraries/LogBox/UI/LogBoxNotificationCountBadge.js +63 -0
  92. package/Libraries/LogBox/UI/LogBoxNotificationDismissButton.js +67 -0
  93. package/Libraries/LogBox/UI/LogBoxNotificationMessage.js +57 -0
  94. package/Libraries/NativeComponent/BaseViewConfig.android.js +5 -0
  95. package/Libraries/NativeComponent/BaseViewConfig.ios.js +5 -0
  96. package/Libraries/NativeComponent/BaseViewConfig.windows.js +5 -0
  97. package/Libraries/NativeComponent/NativeComponentRegistry.js +12 -5
  98. package/Libraries/NativeComponent/StaticViewConfigValidator.js +3 -0
  99. package/Libraries/Network/XMLHttpRequest.js +5 -1
  100. package/Libraries/NewAppScreen/components/LearnMoreLinks.js +3 -3
  101. package/Libraries/Pressability/Pressability.js +3 -51
  102. package/Libraries/Pressability/Pressability.windows.js +3 -51
  103. package/Libraries/ReactNative/AppRegistry.d.ts +4 -0
  104. package/Libraries/ReactNative/AppRegistry.js +2 -4
  105. package/Libraries/ReactNative/BridgelessUIManager.js +1 -21
  106. package/Libraries/ReactNative/FabricUIManager.js +0 -51
  107. package/Libraries/ReactNative/ReactFabricPublicInstance/warnForStyleProps.js +1 -0
  108. package/Libraries/ReactNative/RendererImplementation.js +20 -2
  109. package/Libraries/ReactNative/UIManager.d.ts +0 -21
  110. package/Libraries/ReactNative/UIManagerProperties.js +0 -3
  111. package/Libraries/ReactNative/__mocks__/FabricUIManager.js +5 -341
  112. package/Libraries/ReactNative/getNativeComponentAttributes.js +8 -8
  113. package/Libraries/Renderer/implementations/ReactFabric-dev.js +15682 -27088
  114. package/Libraries/Renderer/implementations/ReactFabric-prod.js +5082 -4381
  115. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3480 -2571
  116. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +15943 -27543
  117. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +5303 -4606
  118. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +3450 -2572
  119. package/Libraries/Renderer/shims/ReactFabric.js +2 -2
  120. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
  121. package/Libraries/Renderer/shims/ReactNative.js +2 -3
  122. package/Libraries/Renderer/shims/ReactNativeTypes.js +24 -3
  123. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +2 -2
  124. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
  125. package/Libraries/Share/Share.d.ts +16 -10
  126. package/Libraries/Share/Share.js +14 -15
  127. package/Libraries/StyleSheet/StyleSheet.d.ts +1 -1
  128. package/Libraries/StyleSheet/StyleSheet.js +3 -10
  129. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +21 -21
  130. package/Libraries/StyleSheet/StyleSheetTypes.js +24 -18
  131. package/Libraries/StyleSheet/flattenStyle.js +1 -0
  132. package/Libraries/StyleSheet/processFilter.js +132 -0
  133. package/Libraries/StyleSheet/processTransform.js +18 -3
  134. package/Libraries/Text/Text.js +151 -128
  135. package/Libraries/Text/Text.windows.js +144 -128
  136. package/Libraries/Text/TextNativeComponent.js +5 -4
  137. package/Libraries/Text/TextProps.js +6 -6
  138. package/Libraries/Text/TextProps.windows.js +6 -6
  139. package/Libraries/TurboModule/TurboModuleRegistry.js +2 -1
  140. package/Libraries/Types/CodegenTypes.js +3 -0
  141. package/Libraries/Utilities/{LoadingView.android.js → DevLoadingView.js} +33 -11
  142. package/Libraries/Utilities/Dimensions.js +1 -0
  143. package/Libraries/Utilities/HMRClient.js +36 -8
  144. package/Libraries/Utilities/HMRClientProdShim.js +1 -0
  145. package/Libraries/Utilities/NativePlatformConstantsWin.js +2 -2
  146. package/Libraries/Utilities/Platform.android.js +4 -4
  147. package/Libraries/Utilities/RCTLog.js +1 -0
  148. package/Libraries/Utilities/ReactNativeTestTools.js +12 -24
  149. package/Libraries/Utilities/verifyComponentAttributeEquivalence.js +11 -6
  150. package/Libraries/__tests__/ViewWindows-test.js +6 -6
  151. package/Libraries/promiseRejectionTrackingOptions.js +1 -0
  152. package/Microsoft.ReactNative/Base/FollyIncludes.h +1 -1
  153. package/Microsoft.ReactNative/ComponentView.idl +0 -17
  154. package/Microsoft.ReactNative/Composition.Input.idl +3 -3
  155. package/Microsoft.ReactNative/CompositionSwitcher.idl +0 -1
  156. package/Microsoft.ReactNative/Fabric/AbiState.cpp +3 -45
  157. package/Microsoft.ReactNative/Fabric/AbiState.h +0 -6
  158. package/Microsoft.ReactNative/Fabric/Composition/ComponentViewRegistry.cpp +0 -3
  159. package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.cpp +2 -2
  160. package/Microsoft.ReactNative/Fabric/Composition/Composition.Input.h +4 -4
  161. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +0 -10
  162. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -16
  163. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +1 -1
  164. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +48 -85
  165. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.h +0 -4
  166. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.cpp +24 -24
  167. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.h +6 -8
  168. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +0 -10
  169. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.h +0 -3
  170. package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.cpp +29 -45
  171. package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.h +1 -3
  172. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +6 -43
  173. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +23 -34
  174. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.cpp +1 -2
  175. package/Microsoft.ReactNative/Fabric/Composition/UriImageManager.cpp +9 -3
  176. package/Microsoft.ReactNative/Fabric/Composition/UriImageManager.h +1 -1
  177. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +17 -48
  178. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.h +3 -7
  179. package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +23 -16
  180. package/Microsoft.ReactNative/Fabric/WindowsImageManager.h +5 -2
  181. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewEventEmitter.cpp +2 -10
  182. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.cpp +107 -36
  183. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/TextLayoutManager.h +18 -12
  184. package/Microsoft.ReactNative/Modules/DevSettingsModule.cpp +4 -0
  185. package/Microsoft.ReactNative/Modules/DevSettingsModule.h +1 -0
  186. package/Microsoft.ReactNative/Modules/ImageViewManagerModule.cpp +1 -2
  187. package/Microsoft.ReactNative/Modules/NativeUIManager.cpp +7 -4
  188. package/Microsoft.ReactNative/Modules/NativeUIManager.h +1 -1
  189. package/Microsoft.ReactNative/Modules/PlatformConstantsWinModule.cpp +2 -2
  190. package/Microsoft.ReactNative/Modules/PlatformConstantsWinModule.h +3 -3
  191. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +13 -20
  192. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.h +1 -1
  193. package/Microsoft.ReactNative/Timer.idl +1 -3
  194. package/Microsoft.ReactNative/Utils/BatchingEventEmitter.cpp +1 -1
  195. package/Microsoft.ReactNative/Utils/LocalBundleReader.cpp +2 -3
  196. package/Microsoft.ReactNative/Utils/ValueUtils.cpp +1 -1
  197. package/Microsoft.ReactNative/Views/DynamicAutomationPeer.cpp +2 -2
  198. package/Microsoft.ReactNative/Views/TextInputViewManager.cpp +1 -1
  199. package/Microsoft.ReactNative/packages.lock.json +41 -78
  200. package/Microsoft.ReactNative.Cxx/JSI/LongLivedJsiValue.h +1 -1
  201. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +5 -0
  202. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems.filters +1 -0
  203. package/Microsoft.ReactNative.Cxx/TurboModuleProvider.cpp +14 -6
  204. package/Microsoft.ReactNative.Cxx/TurboModuleProvider.h +2 -2
  205. package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +1 -1
  206. package/Microsoft.ReactNative.Managed/packages.lock.json +3 -3
  207. package/PropertySheets/External/Microsoft.ReactNative.WindowsSdk.Default.props +4 -4
  208. package/PropertySheets/Generated/PackageVersion.g.props +4 -4
  209. package/README.md +21 -21
  210. package/ReactCommon/ReactCommon.vcxproj +2 -0
  211. package/ReactCommon/ReactCommon.vcxproj.filters +3 -0
  212. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSExecutor.cpp +67 -0
  213. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSExecutor.h +180 -0
  214. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/NativeToJsBridge.cpp +351 -0
  215. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsi/jsi/test/testlib.cpp +6 -3
  216. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Base.h +152 -0
  217. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Bridging.h +2 -1
  218. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/CallbackWrapper.h +13 -15
  219. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/EventEmitter.h +137 -0
  220. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/bridging/Function.h +283 -0
  221. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModule.cpp +7 -10
  222. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModule.h +162 -0
  223. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModuleUtils.h +2 -4
  224. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/scrollview/ScrollViewProps.cpp +33 -8
  225. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/JSRuntimeFactory.cpp +45 -0
  226. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/JSRuntimeFactory.h +67 -0
  227. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/ReactInstance.cpp +104 -74
  228. package/Scripts/Tfs/Layout-MSRN-Headers.ps1 +4 -0
  229. package/Scripts/rnw-dependencies.ps1 +36 -23
  230. package/Shared/HermesRuntimeHolder.cpp +19 -1
  231. package/Shared/HermesRuntimeHolder.h +8 -1
  232. package/Shared/HermesSamplingProfiler.cpp +1 -2
  233. package/Shared/Networking/WinRTWebSocketResource.cpp +3 -3
  234. package/Shared/OInstance.cpp +1 -2
  235. package/Shared/Shared.vcxitems +21 -15
  236. package/Shared/Shared.vcxitems.filters +8 -3
  237. package/Shared/Threading/BatchingQueueThread.cpp +6 -2
  238. package/Shared/Threading/BatchingQueueThread.h +2 -2
  239. package/Shared/Utils/CppWinrtLessExceptions.h +2 -2
  240. package/codegen/NativeAppStateSpec.g.h +8 -8
  241. package/codegen/NativeBlobModuleSpec.g.h +0 -10
  242. package/codegen/NativeDOMSpec.g.h +136 -0
  243. package/codegen/NativeDevSettingsSpec.g.h +11 -5
  244. package/codegen/NativeIdleCallbacksSpec.g.h +64 -0
  245. package/codegen/NativeIntersectionObserverSpec.g.h +14 -14
  246. package/codegen/NativeMicrotasksSpec.g.h +34 -0
  247. package/codegen/NativePerformanceSpec.g.h +35 -7
  248. package/codegen/NativePlatformConstantsWindowsSpec.g.h +81 -0
  249. package/codegen/NativePushNotificationManagerIOSSpec.g.h +15 -19
  250. package/codegen/NativeReactNativeFeatureFlagsSpec.g.h +111 -39
  251. package/codegen/NativeUIManagerSpec.g.h +5 -17
  252. package/codegen/react/components/rnwcore/Props.cpp +1 -1
  253. package/codegen/react/components/rnwcore/Props.h +16 -12
  254. package/codegen/react/components/rnwcore/States.h +0 -26
  255. package/codegen/rnwcoreJSI-generated.cpp +688 -463
  256. package/codegen/rnwcoreJSI.h +1374 -2867
  257. package/fmt/TEMP_UntilFmtUpdate/core.h +2925 -0
  258. package/fmt/fmt.vcxproj +1 -1
  259. package/jest/mockComponent.js +7 -0
  260. package/jest/renderer.js +25 -14
  261. package/jest/setup.js +19 -13
  262. package/package.json +29 -27
  263. package/rn-get-polyfills.js +1 -0
  264. package/src/private/core/composeStyles.js +27 -0
  265. package/src/private/featureflags/ReactNativeFeatureFlags.js +93 -33
  266. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +23 -4
  267. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +56 -0
  268. package/src/private/fusebox/setUpFuseboxReactDevToolsDispatcher.js +108 -0
  269. package/src/private/specs/modules/NativeBlobModule.js +4 -2
  270. package/src/private/specs/modules/NativeDevSettings.js +1 -0
  271. package/src/private/specs/modules/NativePushNotificationManagerIOS.js +0 -4
  272. package/src/private/specs/modules/NativeUIManager.js +0 -7
  273. package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +24 -24
  274. package/src/private/webapis/dom/nodes/ReactNativeElement.js +11 -14
  275. package/src/private/webapis/dom/nodes/ReadOnlyCharacterData.js +2 -3
  276. package/src/private/webapis/dom/nodes/ReadOnlyElement.js +24 -54
  277. package/src/private/webapis/dom/nodes/ReadOnlyNode.js +5 -13
  278. package/src/private/webapis/dom/nodes/specs/NativeDOM.js +468 -0
  279. package/src/private/webapis/dom/nodes/specs/__mocks__/NativeDOMMock.js +413 -0
  280. package/src/private/webapis/dom/oldstylecollections/DOMRectList.js +4 -4
  281. package/src/private/webapis/dom/oldstylecollections/HTMLCollection.js +4 -4
  282. package/src/private/webapis/dom/oldstylecollections/NodeList.js +5 -5
  283. package/src/private/webapis/idlecallbacks/specs/NativeIdleCallbacks.js +34 -0
  284. package/src/private/webapis/microtasks/specs/NativeMicrotasks.js +21 -0
  285. package/src/private/webapis/performance/EventCounts.js +1 -1
  286. package/src/private/webapis/performance/MemoryInfo.js +9 -9
  287. package/src/private/webapis/performance/Performance.js +10 -56
  288. package/src/private/webapis/performance/PerformanceObserver.js +30 -22
  289. package/src/private/webapis/performance/RawPerformanceEntry.js +2 -7
  290. package/src/private/webapis/performance/ReactNativeStartupTiming.js +18 -18
  291. package/src/private/webapis/performance/UserTiming.js +63 -0
  292. package/src/private/webapis/performance/{NativePerformance.js → specs/NativePerformance.js} +3 -2
  293. package/src/private/webapis/performance/{NativePerformanceObserver.js → specs/NativePerformanceObserver.js} +2 -2
  294. package/src/private/webapis/performance/{__mocks__ → specs/__mocks__}/NativePerformance.js +1 -1
  295. package/src/private/webapis/performance/{__mocks__ → specs/__mocks__}/NativePerformanceObserver.js +3 -4
  296. package/stubs/glog/logging.h +1 -0
  297. package/template/cpp-lib/proj/MyLib.vcxproj +1 -1
  298. package/template/cs-lib/proj/MyLib.csproj +1 -1
  299. package/template/metro.config.js +13 -2
  300. package/templates/cpp-app/template.config.js +1 -1
  301. package/templates/cpp-lib/example/metro.config.js +2 -2
  302. package/templates/cpp-lib/template.config.js +1 -1
  303. package/templates/old/generateWrapper.js +4 -1
  304. package/types/modules/globals.d.ts +4 -0
  305. package/Libraries/Lists/FlatList.windows.js +0 -717
  306. package/Libraries/NativeModules/specs/NativeAnimationsDebugModule.js +0 -13
  307. package/Libraries/Utilities/LoadingView.ios.js +0 -50
  308. package/Libraries/Utilities/LoadingView.js +0 -16
  309. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp +0 -178
  310. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/utils/jsi-utils.cpp +0 -39
  311. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/utils/jsi-utils.h +0 -31
  312. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/YGEnums.h +0 -137
  313. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/algorithm/CalculateLayout.cpp +0 -2377
  314. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/config/Config.cpp +0 -140
  315. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/config/Config.h +0 -92
  316. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/enums/ExperimentalFeature.h +0 -40
  317. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/LayoutResults.cpp +0 -48
  318. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/LayoutResults.h +0 -122
  319. package/ReactCommon/TEMP_UntilReactCommonUpdate/yoga/yoga/node/Node.cpp +0 -366
  320. package/codegen/NativeAnimationsDebugModuleSpec.g.h +0 -40
  321. package/codegen/NativePlatformConstantsWinSpec.g.h +0 -81
  322. package/jest/ReactNativeInternalFeatureFlagsMock.js +0 -13
  323. package/src/private/featureflags/NativeReactNativeFeatureFlags.js +0 -44
  324. package/src/private/featureflags/__tests__/ReactNativeFeatureFlags-test.js +0 -92
  325. package/src/private/specs/modules/NativeAnimationsDebugModule.js +0 -20
  326. package/src/private/webapis/dom/oldstylecollections/__tests__/DOMRectList-test.js +0 -85
  327. package/src/private/webapis/dom/oldstylecollections/__tests__/HTMLCollection-test.js +0 -80
  328. package/src/private/webapis/dom/oldstylecollections/__tests__/NodeList-test.js +0 -161
  329. package/src/private/webapis/performance/__tests__/EventCounts-test.js +0 -116
  330. package/src/private/webapis/performance/__tests__/NativePerformanceMock-test.js +0 -82
  331. package/src/private/webapis/performance/__tests__/NativePerformanceObserverMock-test.js +0 -108
  332. package/src/private/webapis/performance/__tests__/Performance-test.js +0 -117
  333. package/src/private/webapis/performance/__tests__/PerformanceObserver-test.js +0 -208
  334. package/template/metro.devMode.config.js +0 -56
  335. /package/src/private/specs/modules/{NativePlatformConstantsWin.js → NativePlatformConstantsWindows.js} +0 -0
@@ -13,8 +13,9 @@
13
13
  #include <react/bridging/Class.h>
14
14
  // #include <react/bridging/Dynamic.h> // Line causes Error C1083 Cannot open include file: 'double-conversion/double-conversion.h' #11644
15
15
  #include <react/bridging/Error.h>
16
+ #include <react/bridging/EventEmitter.h>
16
17
  #include <react/bridging/Function.h>
17
18
  #include <react/bridging/Number.h>
18
19
  #include <react/bridging/Object.h>
19
20
  #include <react/bridging/Promise.h>
20
- #include <react/bridging/Value.h>
21
+ #include <react/bridging/Value.h>
@@ -8,23 +8,24 @@
8
8
  #pragma once
9
9
 
10
10
  #include <jsi/jsi.h>
11
- #include <LongLivedObject.h>
12
11
 
13
12
  #include <memory>
14
13
 
15
- namespace facebook {
16
- namespace react {
14
+ #include <LongLivedObject.h> // [Windows]
15
+
16
+ namespace facebook::react {
17
+
18
+ class CallInvoker;
17
19
 
18
20
  // Helper for passing jsi::Function arg to other methods.
19
21
  class CallbackWrapper : public LongLivedObject {
20
22
  private:
21
23
  CallbackWrapper(
22
- jsi::Function &&callback,
23
- jsi::Runtime &runtime,
24
+ jsi::Function&& callback,
25
+ jsi::Runtime& runtime,
24
26
  std::shared_ptr<CallInvoker> jsInvoker)
25
- : longLivedObjectCollection_(),
27
+ : LongLivedObject(runtime),
26
28
  callback_(std::move(callback)),
27
- runtime_(runtime),
28
29
  jsInvoker_(std::move(jsInvoker)) {}
29
30
 
30
31
  CallbackWrapper(
@@ -32,9 +33,8 @@ class CallbackWrapper : public LongLivedObject {
32
33
  jsi::Function &&callback,
33
34
  jsi::Runtime &runtime,
34
35
  std::shared_ptr<CallInvoker> jsInvoker)
35
- : longLivedObjectCollection_(longLivedObjectCollection),
36
+ : LongLivedObject(runtime),
36
37
  callback_(std::move(callback)),
37
- runtime_(runtime),
38
38
  jsInvoker_(std::move(jsInvoker)) {}
39
39
 
40
40
  // Use a weak_ptr to avoid a retain cycle: LongLivedObjectCollection owns all
@@ -42,7 +42,6 @@ class CallbackWrapper : public LongLivedObject {
42
42
  // LongLivedObjectCollection.
43
43
  std::weak_ptr<LongLivedObjectCollection> longLivedObjectCollection_;
44
44
  jsi::Function callback_;
45
- jsi::Runtime &runtime_;
46
45
  std::shared_ptr<CallInvoker> jsInvoker_;
47
46
 
48
47
  public:
@@ -50,9 +49,9 @@ class CallbackWrapper : public LongLivedObject {
50
49
  jsi::Function &&callback,
51
50
  jsi::Runtime &runtime,
52
51
  std::shared_ptr<CallInvoker> jsInvoker) {
53
- auto wrapper = std::shared_ptr<CallbackWrapper>(
54
- new CallbackWrapper(std::move(callback), runtime, jsInvoker));
55
- LongLivedObjectCollection::get().add(wrapper);
52
+ auto wrapper = std::shared_ptr<CallbackWrapper>(new CallbackWrapper(
53
+ std::move(callback), runtime, std::move(jsInvoker)));
54
+ LongLivedObjectCollection::get(runtime).add(wrapper);
56
55
  return wrapper;
57
56
  }
58
57
 
@@ -99,5 +98,4 @@ class CallbackWrapper : public LongLivedObject {
99
98
  }
100
99
  };
101
100
 
102
- } // namespace react
103
- } // namespace facebook
101
+ } // namespace facebook::react
@@ -0,0 +1,137 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <Function.h> // [Windows]
11
+ #include <functional>
12
+ #include <memory>
13
+ #include <mutex>
14
+ #include <unordered_map>
15
+
16
+ #define FRIEND_TEST(test_case_name, test_name) \
17
+ friend class test_case_name##_##test_name##_Test
18
+
19
+ namespace facebook::react {
20
+
21
+ class EventSubscription {
22
+ public:
23
+ explicit EventSubscription(std::function<void()> remove)
24
+ : remove_(std::move(remove)) {}
25
+ ~EventSubscription() = default;
26
+ EventSubscription(EventSubscription&&) noexcept = default;
27
+ EventSubscription& operator=(EventSubscription&&) noexcept = default;
28
+ EventSubscription(const EventSubscription&) = delete;
29
+ EventSubscription& operator=(const EventSubscription&) = delete;
30
+
31
+ private:
32
+ friend Bridging<EventSubscription>;
33
+
34
+ std::function<void()> remove_;
35
+ };
36
+
37
+ template <>
38
+ struct Bridging<EventSubscription> {
39
+ static jsi::Object toJs(
40
+ jsi::Runtime& rt,
41
+ const EventSubscription& eventSubscription,
42
+ const std::shared_ptr<CallInvoker>& jsInvoker) {
43
+ auto result = jsi::Object(rt);
44
+ result.setProperty(
45
+ rt, "remove", bridging::toJs(rt, eventSubscription.remove_, jsInvoker));
46
+ return result;
47
+ }
48
+ };
49
+
50
+ class IAsyncEventEmitter {
51
+ public:
52
+ IAsyncEventEmitter() noexcept = default;
53
+ virtual ~IAsyncEventEmitter() noexcept = default;
54
+ IAsyncEventEmitter(IAsyncEventEmitter&&) noexcept = default;
55
+ IAsyncEventEmitter& operator=(IAsyncEventEmitter&&) noexcept = default;
56
+ IAsyncEventEmitter(const IAsyncEventEmitter&) = delete;
57
+ IAsyncEventEmitter& operator=(const IAsyncEventEmitter&) = delete;
58
+
59
+ virtual jsi::Object get(
60
+ jsi::Runtime& rt,
61
+ const std::shared_ptr<CallInvoker>& jsInvoker) const = 0;
62
+ };
63
+
64
+ template <typename... Args>
65
+ class AsyncEventEmitter : public IAsyncEventEmitter {
66
+ static_assert(
67
+ sizeof...(Args) <= 1,
68
+ "AsyncEventEmitter must have at most one argument");
69
+
70
+ public:
71
+ AsyncEventEmitter() : state_(std::make_shared<SharedState>()) {
72
+ listen_ = [state = state_](AsyncCallback<Args...> listener) {
73
+ std::lock_guard<std::mutex> lock(state->mutex);
74
+ auto listenerId = state->listenerId++;
75
+ state->listeners.emplace(listenerId, std::move(listener));
76
+ return EventSubscription([state, listenerId]() {
77
+ std::lock_guard<std::mutex> innerLock(state->mutex);
78
+ state->listeners.erase(listenerId);
79
+ });
80
+ };
81
+ }
82
+ ~AsyncEventEmitter() override = default;
83
+ AsyncEventEmitter(AsyncEventEmitter&&) noexcept = default;
84
+ AsyncEventEmitter& operator=(AsyncEventEmitter&&) noexcept = default;
85
+ AsyncEventEmitter(const AsyncEventEmitter&) = delete;
86
+ AsyncEventEmitter& operator=(const AsyncEventEmitter&) = delete;
87
+
88
+ void emit(std::function<jsi::Value(jsi::Runtime&)>&& converter) {
89
+ std::lock_guard<std::mutex> lock(state_->mutex);
90
+ for (auto& [_, listener] : state_->listeners) {
91
+ listener.call([converter](jsi::Runtime& rt, jsi::Function& jsFunction) {
92
+ jsFunction.call(rt, converter(rt));
93
+ });
94
+ }
95
+ }
96
+
97
+ void emit(Args... value) {
98
+ std::lock_guard<std::mutex> lock(state_->mutex);
99
+ for (const auto& [_, listener] : state_->listeners) {
100
+ listener.call(static_cast<Args>(value)...);
101
+ }
102
+ }
103
+
104
+ jsi::Object get(
105
+ jsi::Runtime& rt,
106
+ const std::shared_ptr<CallInvoker>& jsInvoker) const override {
107
+ auto result = jsi::Object(rt);
108
+ result.setProperty(
109
+ rt, "addListener", bridging::toJs(rt, listen_, jsInvoker));
110
+ return result;
111
+ }
112
+
113
+ private:
114
+ friend Bridging<AsyncEventEmitter>;
115
+ FRIEND_TEST(BridgingTest, eventEmitterTest);
116
+
117
+ struct SharedState {
118
+ std::mutex mutex;
119
+ std::unordered_map<size_t, AsyncCallback<Args...>> listeners;
120
+ size_t listenerId{};
121
+ };
122
+
123
+ std::function<EventSubscription(AsyncCallback<Args...>)> listen_;
124
+ std::shared_ptr<SharedState> state_;
125
+ };
126
+
127
+ template <typename... Args>
128
+ struct Bridging<AsyncEventEmitter<Args...>> {
129
+ static jsi::Object toJs(
130
+ jsi::Runtime& rt,
131
+ const AsyncEventEmitter<Args...>& eventEmitter,
132
+ const std::shared_ptr<CallInvoker>& jsInvoker) {
133
+ return eventEmitter.get(rt, jsInvoker);
134
+ }
135
+ };
136
+
137
+ } // namespace facebook::react
@@ -0,0 +1,283 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <Base.h> // [Windows]
11
+ #include <CallbackWrapper.h> // [Windows]
12
+
13
+ #include <ReactCommon/CallInvoker.h>
14
+ #include <ReactCommon/SchedulerPriority.h>
15
+
16
+ namespace facebook::react {
17
+
18
+ template <typename F>
19
+ class SyncCallback;
20
+
21
+ template <typename... Args>
22
+ class AsyncCallback {
23
+ public:
24
+ AsyncCallback(
25
+ jsi::Runtime& runtime,
26
+ jsi::Function function,
27
+ std::shared_ptr<CallInvoker> jsInvoker)
28
+ : callback_(std::make_shared<SyncCallback<void(Args...)>>(
29
+ runtime,
30
+ std::move(function),
31
+ std::move(jsInvoker))) {}
32
+
33
+ void operator()(Args... args) const noexcept {
34
+ call(std::forward<Args>(args)...);
35
+ }
36
+
37
+ void call(Args... args) const noexcept {
38
+ callWithArgs(std::nullopt, std::forward<Args>(args)...);
39
+ }
40
+
41
+ void callWithPriority(SchedulerPriority priority, Args... args)
42
+ const noexcept {
43
+ callWithArgs(priority, std::forward<Args>(args)...);
44
+ }
45
+
46
+ void call(std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
47
+ const noexcept {
48
+ callWithFunction(std::nullopt, std::move(callImpl));
49
+ }
50
+
51
+ void callWithPriority(
52
+ SchedulerPriority priority,
53
+ std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
54
+ const noexcept {
55
+ callWithFunction(priority, std::move(callImpl));
56
+ }
57
+
58
+ private:
59
+ friend Bridging<AsyncCallback>;
60
+
61
+ std::shared_ptr<SyncCallback<void(Args...)>> callback_;
62
+
63
+ void callWithArgs(std::optional<SchedulerPriority> priority, Args... args)
64
+ const noexcept {
65
+ if (auto wrapper = callback_->wrapper_.lock()) {
66
+ auto fn = [callback = callback_,
67
+ argsPtr = std::make_shared<std::tuple<Args...>>(
68
+ std::make_tuple(std::forward<Args>(args)...))](
69
+ jsi::Runtime&) { callback->apply(std::move(*argsPtr)); };
70
+
71
+ auto& jsInvoker = wrapper->jsInvoker();
72
+ if (priority) {
73
+ jsInvoker.invokeAsync(*priority, std::move(fn));
74
+ } else {
75
+ jsInvoker.invokeAsync(std::move(fn));
76
+ }
77
+ }
78
+ }
79
+
80
+ void callWithFunction(
81
+ std::optional<SchedulerPriority> priority,
82
+ std::function<void(jsi::Runtime&, jsi::Function&)>&& callImpl)
83
+ const noexcept {
84
+ if (auto wrapper = callback_->wrapper_.lock()) {
85
+ // Capture callback_ and not wrapper_. If callback_ is deallocated or the
86
+ // JSVM is shutdown before the async task is scheduled, the underlying
87
+ // function will have been deallocated.
88
+ auto fn = [callback = callback_,
89
+ callImpl = std::move(callImpl)](jsi::Runtime& rt) {
90
+ if (auto wrapper2 = callback->wrapper_.lock()) {
91
+ callImpl(rt, wrapper2->callback());
92
+ }
93
+ };
94
+
95
+ auto& jsInvoker = wrapper->jsInvoker();
96
+ if (priority) {
97
+ jsInvoker.invokeAsync(*priority, std::move(fn));
98
+ } else {
99
+ jsInvoker.invokeAsync(std::move(fn));
100
+ }
101
+ }
102
+ }
103
+ };
104
+
105
+ // You must ensure that when invoking this you're located on the JS thread, or
106
+ // have exclusive control of the JS VM context. If you cannot ensure this, use
107
+ // AsyncCallback instead.
108
+ template <typename R, typename... Args>
109
+ class SyncCallback<R(Args...)> {
110
+ public:
111
+ SyncCallback(
112
+ jsi::Runtime& rt,
113
+ jsi::Function function,
114
+ std::shared_ptr<CallInvoker> jsInvoker)
115
+ : wrapper_(CallbackWrapper::createWeak(
116
+ std::move(function),
117
+ rt,
118
+ std::move(jsInvoker))) {}
119
+
120
+ // Disallow copying, as we can no longer safely destroy the callback
121
+ // from the destructor if there's multiple copies
122
+ SyncCallback(const SyncCallback&) = delete;
123
+ SyncCallback& operator=(const SyncCallback&) = delete;
124
+
125
+ // Allow move
126
+ SyncCallback(SyncCallback&& other) noexcept
127
+ : wrapper_(std::move(other.wrapper_)) {}
128
+
129
+ SyncCallback& operator=(SyncCallback&& other) noexcept {
130
+ wrapper_ = std::move(other.wrapper_);
131
+ return *this;
132
+ }
133
+
134
+ ~SyncCallback() {
135
+ if (auto wrapper = wrapper_.lock()) {
136
+ wrapper->destroy();
137
+ }
138
+ }
139
+
140
+ R operator()(Args... args) const {
141
+ return call(std::forward<Args>(args)...);
142
+ }
143
+
144
+ R call(Args... args) const {
145
+ auto wrapper = wrapper_.lock();
146
+
147
+ // If the wrapper has been deallocated, we can no longer provide a return
148
+ // value consistently, so our only option is to throw
149
+ if (!wrapper) {
150
+ if constexpr (std::is_void_v<R>) {
151
+ return;
152
+ } else {
153
+ throw std::runtime_error("Failed to call invalidated sync callback");
154
+ }
155
+ }
156
+
157
+ auto& callback = wrapper->callback();
158
+ auto& rt = wrapper->runtime();
159
+ auto jsInvoker = wrapper->jsInvokerPtr();
160
+
161
+ if constexpr (std::is_void_v<R>) {
162
+ callback.call(
163
+ rt, bridging::toJs(rt, std::forward<Args>(args), jsInvoker)...);
164
+ } else {
165
+ return bridging::fromJs<R>(
166
+ rt,
167
+ callback.call(
168
+ rt, bridging::toJs(rt, std::forward<Args>(args), jsInvoker)...),
169
+ jsInvoker);
170
+ }
171
+ }
172
+
173
+ private:
174
+ friend AsyncCallback<Args...>;
175
+ friend Bridging<SyncCallback>;
176
+
177
+ R apply(std::tuple<Args...>&& args) const {
178
+ return apply(std::move(args), std::index_sequence_for<Args...>{});
179
+ }
180
+
181
+ template <size_t... Index>
182
+ R apply(std::tuple<Args...>&& args, std::index_sequence<Index...>) const {
183
+ return call(std::move(std::get<Index>(args))...);
184
+ }
185
+
186
+ // Held weakly so lifetime is managed by LongLivedObjectCollection.
187
+ std::weak_ptr<CallbackWrapper> wrapper_;
188
+ };
189
+
190
+ template <typename... Args>
191
+ struct Bridging<AsyncCallback<Args...>> {
192
+ static AsyncCallback<Args...> fromJs(
193
+ jsi::Runtime& rt,
194
+ jsi::Function&& value,
195
+ const std::shared_ptr<CallInvoker>& jsInvoker) {
196
+ return AsyncCallback<Args...>(rt, std::move(value), jsInvoker);
197
+ }
198
+
199
+ static jsi::Function toJs(
200
+ jsi::Runtime& rt,
201
+ const AsyncCallback<Args...>& value) {
202
+ return value.callback_->function_.getFunction(rt);
203
+ }
204
+ };
205
+
206
+ template <typename R, typename... Args>
207
+ struct Bridging<SyncCallback<R(Args...)>> {
208
+ static SyncCallback<R(Args...)> fromJs(
209
+ jsi::Runtime& rt,
210
+ jsi::Function&& value,
211
+ const std::shared_ptr<CallInvoker>& jsInvoker) {
212
+ return SyncCallback<R(Args...)>(rt, std::move(value), jsInvoker);
213
+ }
214
+
215
+ static jsi::Function toJs(
216
+ jsi::Runtime& rt,
217
+ const SyncCallback<R(Args...)>& value) {
218
+ return value.function_.getFunction(rt);
219
+ }
220
+ };
221
+
222
+ template <typename R, typename... Args>
223
+ struct Bridging<std::function<R(Args...)>> {
224
+ using Func = std::function<R(Args...)>;
225
+ using IndexSequence = std::index_sequence_for<Args...>;
226
+
227
+ static constexpr size_t kArgumentCount = sizeof...(Args);
228
+
229
+ static jsi::Function toJs(
230
+ jsi::Runtime& rt,
231
+ Func fn,
232
+ const std::shared_ptr<CallInvoker>& jsInvoker) {
233
+ return jsi::Function::createFromHostFunction(
234
+ rt,
235
+ jsi::PropNameID::forAscii(rt, "BridgedFunction"),
236
+ kArgumentCount,
237
+ [fn = std::make_shared<Func>(std::move(fn)), jsInvoker](
238
+ jsi::Runtime& rt,
239
+ const jsi::Value&,
240
+ const jsi::Value* args,
241
+ size_t count) -> jsi::Value {
242
+ if (count < kArgumentCount) {
243
+ throw jsi::JSError(rt, "Incorrect number of arguments");
244
+ }
245
+
246
+ if constexpr (std::is_void_v<R>) {
247
+ callFromJs(*fn, rt, args, jsInvoker, IndexSequence{});
248
+ return jsi::Value();
249
+ } else {
250
+ return bridging::toJs(
251
+ rt,
252
+ callFromJs(*fn, rt, args, jsInvoker, IndexSequence{}),
253
+ jsInvoker);
254
+ }
255
+ });
256
+ }
257
+
258
+ private:
259
+ template <size_t... Index>
260
+ static R callFromJs(
261
+ Func& fn,
262
+ jsi::Runtime& rt,
263
+ const jsi::Value* args,
264
+ const std::shared_ptr<CallInvoker>& jsInvoker,
265
+ std::index_sequence<Index...>) {
266
+ return fn(bridging::fromJs<Args>(rt, args[Index], jsInvoker)...);
267
+ }
268
+ };
269
+
270
+ template <typename R, typename... Args>
271
+ struct Bridging<
272
+ std::function<R(Args...)>,
273
+ std::enable_if_t<
274
+ !std::is_same_v<std::function<R(Args...)>, std::function<R(Args...)>>>>
275
+ : Bridging<std::function<R(Args...)>> {};
276
+
277
+ template <typename R, typename... Args>
278
+ struct Bridging<R(Args...)> : Bridging<std::function<R(Args...)>> {};
279
+
280
+ template <typename R, typename... Args>
281
+ struct Bridging<R (*)(Args...)> : Bridging<std::function<R(Args...)>> {};
282
+
283
+ } // namespace facebook::react
@@ -40,25 +40,22 @@ TurboModule::TurboModule(
40
40
  : name_(std::move(name)), jsInvoker_(std::move(jsInvoker)) {}
41
41
 
42
42
  void TurboModule::emitDeviceEvent(
43
- jsi::Runtime& runtime,
44
43
  const std::string& eventName,
45
44
  ArgFactory argFactory) {
46
- jsInvoker_->invokeAsync([&runtime, eventName, argFactory]() {
47
- jsi::Value emitter =
48
- runtime.global().getProperty(runtime, "__rctDeviceEventEmitter");
45
+ jsInvoker_->invokeAsync([eventName, argFactory](jsi::Runtime& rt) {
46
+ jsi::Value emitter = rt.global().getProperty(rt, "__rctDeviceEventEmitter");
49
47
  if (!emitter.isUndefined()) {
50
- jsi::Object emitterObject = emitter.asObject(runtime);
48
+ jsi::Object emitterObject = emitter.asObject(rt);
51
49
  // TODO: consider caching these
52
50
  jsi::Function emitFunction =
53
- emitterObject.getPropertyAsFunction(runtime, "emit");
51
+ emitterObject.getPropertyAsFunction(rt, "emit");
54
52
  std::vector<jsi::Value> args;
55
- args.emplace_back(
56
- jsi::String::createFromAscii(runtime, eventName.c_str()));
53
+ args.emplace_back(jsi::String::createFromAscii(rt, eventName.c_str()));
57
54
  if (argFactory) {
58
- argFactory(runtime, args);
55
+ argFactory(rt, args);
59
56
  }
60
57
  emitFunction.callWithThis(
61
- runtime, emitterObject, (const jsi::Value*)args.data(), args.size());
58
+ rt, emitterObject, (const jsi::Value*)args.data(), args.size());
62
59
  }
63
60
  });
64
61
  }
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <memory>
11
+ #include <string>
12
+ #include <unordered_map>
13
+
14
+ #include <jsi/jsi.h>
15
+
16
+ #include <ReactCommon/CallInvoker.h>
17
+ #include <EventEmitter.h> // [Windows]
18
+
19
+ namespace facebook::react {
20
+
21
+ /**
22
+ * For now, support the same set of return types as existing impl.
23
+ * This can be improved to support richer typed objects.
24
+ */
25
+ enum TurboModuleMethodValueKind {
26
+ VoidKind,
27
+ BooleanKind,
28
+ NumberKind,
29
+ StringKind,
30
+ ObjectKind,
31
+ ArrayKind,
32
+ FunctionKind,
33
+ PromiseKind,
34
+ };
35
+
36
+ /**
37
+ * Determines TurboModuleMethodValueKind based on the jsi::Value type.
38
+ */
39
+ TurboModuleMethodValueKind getTurboModuleMethodValueKind(
40
+ jsi::Runtime& rt,
41
+ const jsi::Value* value);
42
+
43
+ class TurboCxxModule;
44
+ class TurboModuleBinding;
45
+
46
+ /**
47
+ * Base HostObject class for every module to be exposed to JS
48
+ */
49
+ class JSI_EXPORT TurboModule : public facebook::jsi::HostObject {
50
+ public:
51
+ TurboModule(std::string name, std::shared_ptr<CallInvoker> jsInvoker);
52
+
53
+ // Note: keep this method declared inline to avoid conflicts
54
+ // between RTTI and non-RTTI compilation units
55
+ facebook::jsi::Value get(
56
+ facebook::jsi::Runtime& runtime,
57
+ const facebook::jsi::PropNameID& propName) override {
58
+ {
59
+ auto prop = create(runtime, propName);
60
+ // If we have a JS wrapper, cache the result of this lookup
61
+ // We don't cache misses, to allow for methodMap_ to dynamically be
62
+ // extended
63
+ if (jsRepresentation_ && !prop.isUndefined()) {
64
+ jsRepresentation_->lock(runtime).asObject(runtime).setProperty(
65
+ runtime, propName, prop);
66
+ }
67
+ return prop;
68
+ }
69
+ }
70
+
71
+ virtual std::vector<facebook::jsi::PropNameID> getPropertyNames(
72
+ facebook::jsi::Runtime& runtime) override {
73
+ std::vector<jsi::PropNameID> result;
74
+ result.reserve(methodMap_.size());
75
+ for (auto it = methodMap_.cbegin(); it != methodMap_.cend(); ++it) {
76
+ result.push_back(jsi::PropNameID::forUtf8(runtime, it->first));
77
+ }
78
+ return result;
79
+ }
80
+
81
+ protected:
82
+ const std::string name_;
83
+ std::shared_ptr<CallInvoker> jsInvoker_;
84
+
85
+ struct MethodMetadata {
86
+ size_t argCount;
87
+ facebook::jsi::Value (*invoker)(
88
+ facebook::jsi::Runtime& rt,
89
+ TurboModule& turboModule,
90
+ const facebook::jsi::Value* args,
91
+ size_t count);
92
+ };
93
+ std::unordered_map<std::string, MethodMetadata> methodMap_;
94
+ std::unordered_map<std::string, std::shared_ptr<IAsyncEventEmitter>>
95
+ eventEmitterMap_;
96
+
97
+ using ArgFactory =
98
+ std::function<void(jsi::Runtime& runtime, std::vector<jsi::Value>& args)>;
99
+
100
+ /**
101
+ * Calls RCTDeviceEventEmitter.emit to JavaScript, with given event name and
102
+ * an optional list of arguments.
103
+ * If present, argFactory is a callback used to construct extra arguments,
104
+ * e.g.
105
+ *
106
+ * emitDeviceEvent(rt, "myCustomEvent",
107
+ * [](jsi::Runtime& rt, std::vector<jsi::Value>& args) {
108
+ * args.emplace_back(jsi::Value(true));
109
+ * args.emplace_back(jsi::Value(42));
110
+ * });
111
+ */
112
+ void emitDeviceEvent(
113
+ const std::string& eventName,
114
+ ArgFactory argFactory = nullptr);
115
+
116
+ // Backwards compatibility version
117
+ void emitDeviceEvent(
118
+ jsi::Runtime& /*runtime*/,
119
+
120
+ const std::string& eventName,
121
+ ArgFactory argFactory = nullptr) {
122
+ emitDeviceEvent(eventName, std::move(argFactory));
123
+ }
124
+
125
+ virtual jsi::Value create(
126
+ jsi::Runtime& runtime,
127
+ const jsi::PropNameID& propName) {
128
+ std::string propNameUtf8 = propName.utf8(runtime);
129
+ if (auto methodIter = methodMap_.find(propNameUtf8);
130
+ methodIter != methodMap_.end()) {
131
+ const MethodMetadata& meta = methodIter->second;
132
+ return jsi::Function::createFromHostFunction(
133
+ runtime,
134
+ propName,
135
+ static_cast<unsigned int>(meta.argCount),
136
+ [this, meta](
137
+ jsi::Runtime& rt,
138
+ [[maybe_unused]] const jsi::Value& thisVal,
139
+ const jsi::Value* args,
140
+ size_t count) { return meta.invoker(rt, *this, args, count); });
141
+ } else if (auto eventEmitterIter = eventEmitterMap_.find(propNameUtf8);
142
+ eventEmitterIter != eventEmitterMap_.end()) {
143
+ return eventEmitterIter->second->get(runtime, jsInvoker_);
144
+ }
145
+ // Neither Method nor EventEmitter were not found, let JS decide what to do.
146
+ return facebook::jsi::Value::undefined();
147
+ }
148
+
149
+ private:
150
+ friend class TurboCxxModule;
151
+ friend class TurboModuleBinding;
152
+ std::unique_ptr<jsi::WeakObject> jsRepresentation_;
153
+ };
154
+
155
+ /**
156
+ * An app/platform-specific provider function to get an instance of a module
157
+ * given a name.
158
+ */
159
+ using TurboModuleProviderFunctionType =
160
+ std::function<std::shared_ptr<TurboModule>(const std::string& name)>;
161
+
162
+ } // namespace facebook::react