@office-iss/react-native-win32 0.72.8 → 0.73.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 (277) hide show
  1. package/.flowconfig +15 -5
  2. package/CHANGELOG.json +530 -101
  3. package/CHANGELOG.md +213 -56
  4. package/IntegrationTests/PromiseTest.js +1 -0
  5. package/IntegrationTests/websocket_integration_test_server.js +1 -1
  6. package/Libraries/Animated/Animated.js +1 -1
  7. package/Libraries/Animated/AnimatedImplementation.js +1 -1
  8. package/Libraries/Animated/NativeAnimatedHelper.js +14 -10
  9. package/Libraries/Animated/NativeAnimatedHelper.win32.js +16 -12
  10. package/Libraries/Animated/NativeAnimatedModule.js +6 -2
  11. package/Libraries/Animated/NativeAnimatedTurboModule.js +7 -4
  12. package/Libraries/Animated/animations/Animation.js +57 -3
  13. package/Libraries/Animated/animations/DecayAnimation.js +9 -0
  14. package/Libraries/Animated/animations/SpringAnimation.js +8 -0
  15. package/Libraries/Animated/animations/TimingAnimation.js +8 -0
  16. package/Libraries/Animated/components/AnimatedFlatList.js +2 -1
  17. package/Libraries/Animated/components/AnimatedScrollView.js +2 -0
  18. package/Libraries/Animated/components/AnimatedSectionList.js +2 -1
  19. package/Libraries/Animated/createAnimatedComponent.js +1 -0
  20. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  21. package/Libraries/Animated/nodes/AnimatedObject.js +146 -0
  22. package/Libraries/Animated/nodes/AnimatedProps.js +19 -7
  23. package/Libraries/Animated/nodes/AnimatedStyle.js +29 -55
  24. package/Libraries/Animated/nodes/AnimatedValueXY.js +3 -17
  25. package/Libraries/Animated/shouldUseTurboAnimatedModule.js +17 -0
  26. package/Libraries/Animated/useAnimatedProps.js +9 -10
  27. package/Libraries/AppState/AppState.d.ts +1 -1
  28. package/Libraries/AppState/NativeAppState.js +8 -4
  29. package/Libraries/BatchedBridge/MessageQueue.js +45 -36
  30. package/Libraries/Blob/Blob.js +6 -2
  31. package/Libraries/Blob/BlobManager.js +9 -10
  32. package/Libraries/Blob/BlobRegistry.js +14 -9
  33. package/Libraries/Blob/File.js +1 -1
  34. package/Libraries/Blob/FileReader.js +1 -2
  35. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +1 -5
  36. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.win32.js +7 -48
  37. package/Libraries/Components/Button/ButtonWin32.Props.d.ts +1 -1
  38. package/Libraries/Components/Button/ButtonWin32.Props.js.map +1 -1
  39. package/Libraries/Components/Button/ButtonWin32.d.ts +1 -1
  40. package/Libraries/Components/Button/ButtonWin32.js +1 -4
  41. package/Libraries/Components/Button/ButtonWin32.js.map +1 -1
  42. package/Libraries/Components/Clipboard/Clipboard.d.ts +4 -4
  43. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +3 -1
  44. package/Libraries/Components/EnterString.win32.d.ts +1 -1
  45. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +26 -6
  46. package/Libraries/Components/Pressable/Pressable.js +3 -2
  47. package/Libraries/Components/Pressable/Pressable.win32.js +4 -3
  48. package/Libraries/Components/Pressable/useAndroidRippleForView.js +1 -1
  49. package/Libraries/Components/SafeAreaView/SafeAreaView.js +7 -7
  50. package/Libraries/Components/SafeAreaView/SafeAreaView.win32.js +7 -8
  51. package/Libraries/Components/ScrollView/ScrollView.js +3 -1
  52. package/Libraries/Components/ScrollView/ScrollView.win32.js +3 -1
  53. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +39 -46
  54. package/Libraries/Components/Switch/Switch.js +1 -0
  55. package/Libraries/Components/Text/TextWin32.d.ts +1 -1
  56. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +1 -0
  57. package/Libraries/Components/TextInput/TextInput.d.ts +49 -7
  58. package/Libraries/Components/TextInput/TextInput.flow.js +43 -10
  59. package/Libraries/Components/TextInput/TextInput.js +62 -10
  60. package/Libraries/Components/TextInput/TextInput.win32.js +953 -206
  61. package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +23 -0
  62. package/Libraries/Components/ToastAndroid/{ToastAndroid.ios.js → ToastAndroid.js} +9 -1
  63. package/Libraries/Components/ToastAndroid/ToastAndroid.win32.js +9 -1
  64. package/Libraries/Components/Touchable/Tests/TouchableWin32Test.js +2 -2
  65. package/Libraries/Components/Touchable/Tests/TouchableWin32Test.js.map +1 -1
  66. package/Libraries/Components/Touchable/TouchableBounce.js +1 -1
  67. package/Libraries/Components/Touchable/TouchableHighlight.js +1 -1
  68. package/Libraries/Components/Touchable/TouchableNativeFeedback.js +1 -1
  69. package/Libraries/Components/Touchable/TouchableOpacity.js +4 -1
  70. package/Libraries/Components/Touchable/TouchableWin32.d.ts +1 -1
  71. package/Libraries/Components/Touchable/TouchableWin32.js.map +1 -1
  72. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -0
  73. package/Libraries/Components/TraceUpdateOverlay/TraceUpdateOverlay.js +16 -6
  74. package/Libraries/Components/View/ReactNativeStyleAttributes.js +9 -0
  75. package/Libraries/Components/View/ReactNativeViewAttributes.js +1 -0
  76. package/Libraries/Components/View/ReactNativeViewAttributes.win32.js +1 -0
  77. package/Libraries/Components/View/View.js +46 -32
  78. package/Libraries/Components/View/View.win32.js +37 -6
  79. package/Libraries/Components/View/ViewAccessibility.d.ts +8 -2
  80. package/Libraries/Components/View/ViewNativeComponent.js +1 -0
  81. package/Libraries/Components/View/ViewPropTypes.js +18 -3
  82. package/Libraries/Components/View/ViewPropTypes.win32.js +30 -4
  83. package/Libraries/Components/View/ViewWin32.js +3 -2
  84. package/Libraries/Core/Devtools/loadBundleFromServer.js +152 -0
  85. package/Libraries/Core/Devtools/symbolicateStackTrace.js +2 -1
  86. package/Libraries/Core/ExceptionsManager.js +16 -7
  87. package/Libraries/Core/ExtendedError.js +12 -0
  88. package/Libraries/Core/ReactNativeVersion.js +3 -3
  89. package/Libraries/Core/ReactNativeVersionCheck.js +0 -2
  90. package/Libraries/Core/ReactNativeVersionCheck.win32.js +0 -2
  91. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +20 -0
  92. package/Libraries/Core/setUpDeveloperTools.js +5 -1
  93. package/Libraries/Core/setUpIntersectionObserver.js +16 -0
  94. package/Libraries/{Components/ProgressBarAndroid/ProgressBarAndroid.ios.js → Core/setUpMutationObserver.js} +6 -2
  95. package/Libraries/Core/setUpPerformance.js +6 -13
  96. package/Libraries/Core/setUpPerformanceObserver.js +16 -0
  97. package/Libraries/Core/setUpRegeneratorRuntime.js +4 -2
  98. package/Libraries/DOM/Nodes/ReactNativeElement.js +135 -18
  99. package/Libraries/DOM/Nodes/ReadOnlyCharacterData.js +72 -0
  100. package/Libraries/DOM/Nodes/ReadOnlyElement.js +209 -21
  101. package/Libraries/DOM/Nodes/ReadOnlyNode.js +206 -17
  102. package/Libraries/DOM/Nodes/ReadOnlyText.js +30 -0
  103. package/Libraries/DOM/Nodes/Utilities/Traversal.js +54 -0
  104. package/Libraries/EventEmitter/NativeEventEmitter.d.ts +0 -6
  105. package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +15 -4
  106. package/Libraries/Image/Image.android.js +8 -2
  107. package/Libraries/Image/Image.d.ts +1 -1
  108. package/Libraries/Image/Image.ios.js +4 -1
  109. package/Libraries/Image/Image.win32.js +6 -3
  110. package/Libraries/Image/ImageBackground.js +3 -0
  111. package/Libraries/Image/resolveAssetSource.win32.js +1 -1
  112. package/Libraries/Inspector/DevtoolsOverlay.js +6 -3
  113. package/Libraries/Inspector/NetworkOverlay.js +2 -2
  114. package/Libraries/Interaction/JSEventLoopWatchdog.js +1 -5
  115. package/Libraries/Interaction/PanResponder.js +1 -4
  116. package/Libraries/IntersectionObserver/IntersectionObserver.js +252 -0
  117. package/Libraries/IntersectionObserver/IntersectionObserverEntry.js +140 -0
  118. package/Libraries/IntersectionObserver/IntersectionObserverManager.js +221 -0
  119. package/Libraries/IntersectionObserver/NativeIntersectionObserver.js +41 -0
  120. package/Libraries/IntersectionObserver/__mocks__/NativeIntersectionObserver.js +162 -0
  121. package/Libraries/LayoutAnimation/LayoutAnimation.js +1 -1
  122. package/Libraries/Lists/FlatList.d.ts +2 -1
  123. package/Libraries/Lists/FlatList.js +15 -5
  124. package/Libraries/Lists/SectionList.js +4 -0
  125. package/Libraries/LogBox/Data/LogBoxData.js +2 -1
  126. package/Libraries/LogBox/Data/LogBoxLog.js +4 -1
  127. package/Libraries/LogBox/Data/LogBoxSymbolication.js +5 -2
  128. package/Libraries/LogBox/Data/parseLogBoxLog.js +57 -20
  129. package/Libraries/LogBox/UI/AnsiHighlight.js +1 -1
  130. package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +24 -31
  131. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  132. package/Libraries/LogBox/UI/LogBoxMessage.js +4 -7
  133. package/Libraries/MutationObserver/MutationObserver.js +184 -0
  134. package/Libraries/MutationObserver/MutationObserverManager.js +218 -0
  135. package/Libraries/MutationObserver/MutationRecord.js +82 -0
  136. package/Libraries/MutationObserver/NativeMutationObserver.js +58 -0
  137. package/Libraries/MutationObserver/__mocks__/NativeMutationObserver.js +327 -0
  138. package/Libraries/NativeComponent/BaseViewConfig.android.js +18 -3
  139. package/Libraries/NativeComponent/BaseViewConfig.ios.js +33 -0
  140. package/Libraries/NativeComponent/BaseViewConfig.win32.js +33 -0
  141. package/Libraries/NativeComponent/NativeComponentRegistry.js +13 -9
  142. package/Libraries/NativeModules/specs/NativeSourceCode.js +6 -6
  143. package/Libraries/Network/RCTNetworking.android.js +2 -1
  144. package/Libraries/Network/XMLHttpRequest.js +1 -1
  145. package/Libraries/NewAppScreen/components/DebugInstructions.js +4 -4
  146. package/Libraries/NewAppScreen/components/LearnMoreLinks.js +9 -2
  147. package/Libraries/Performance/QuickPerformanceLogger.js +1 -1
  148. package/Libraries/PermissionsAndroid/NativePermissionsAndroid.js +1 -0
  149. package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +1 -0
  150. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +3 -1
  151. package/Libraries/Pressability/Pressability.js +28 -3
  152. package/Libraries/Pressability/Pressability.win32.js +30 -5
  153. package/Libraries/ReactNative/AppContainer.js +2 -3
  154. package/Libraries/ReactNative/AppRegistry.d.ts +0 -5
  155. package/Libraries/ReactNative/AppRegistry.js +66 -53
  156. package/Libraries/ReactNative/BridgelessUIManager.js +38 -9
  157. package/Libraries/ReactNative/FabricUIManager.js +143 -34
  158. package/Libraries/ReactNative/I18nManager.js +5 -11
  159. package/Libraries/ReactNative/NativeI18nManager.js +7 -5
  160. package/Libraries/ReactNative/PaperUIManager.win32.js +2 -2
  161. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +151 -0
  162. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance.js +81 -0
  163. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactNativeAttributePayload.js +492 -0
  164. package/Libraries/ReactNative/ReactFabricPublicInstance/warnForStyleProps.js +32 -0
  165. package/Libraries/ReactNative/ReactNativeFeatureFlags.js +19 -3
  166. package/Libraries/ReactNative/UIManager.js +8 -0
  167. package/Libraries/ReactNative/__mocks__/FabricUIManager.js +648 -0
  168. package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +38 -2
  169. package/Libraries/Renderer/implementations/ReactFabric-dev.js +27 -27
  170. package/Libraries/Renderer/implementations/ReactFabric-prod.js +3 -3
  171. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3 -3
  172. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +27 -27
  173. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +3 -3
  174. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +3 -3
  175. package/Libraries/Renderer/shims/ReactFabric.js +5 -6
  176. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -3
  177. package/Libraries/Renderer/shims/ReactNative.js +2 -3
  178. package/Libraries/Renderer/shims/ReactNativeTypes.js +35 -17
  179. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +3 -3
  180. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -3
  181. package/Libraries/Settings/{Settings.android.js → Settings.js} +4 -4
  182. package/Libraries/Share/Share.d.ts +3 -9
  183. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +9 -4
  184. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +28 -13
  185. package/Libraries/StyleSheet/PlatformColorValueTypes.win32.js +14 -4
  186. package/Libraries/StyleSheet/PlatformColorValueTypesIOS.ios.js +1 -1
  187. package/Libraries/StyleSheet/PlatformColorValueTypesWin32.d.ts +1 -1
  188. package/Libraries/StyleSheet/StyleSheet.d.ts +10 -1
  189. package/Libraries/StyleSheet/StyleSheet.js +3 -0
  190. package/Libraries/StyleSheet/StyleSheet.win32.js +3 -0
  191. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +31 -17
  192. package/Libraries/StyleSheet/StyleSheetTypes.js +90 -6
  193. package/Libraries/StyleSheet/flattenStyle.js +4 -0
  194. package/Libraries/StyleSheet/private/_TransformStyle.js +16 -2
  195. package/Libraries/StyleSheet/processColor.js +1 -2
  196. package/Libraries/StyleSheet/processTransformOrigin.js +136 -0
  197. package/Libraries/StyleSheet/splitLayoutProps.js +1 -0
  198. package/Libraries/Text/Text.d.ts +5 -5
  199. package/Libraries/Text/Text.js +17 -10
  200. package/Libraries/Text/Text.win32.js +354 -0
  201. package/Libraries/Text/TextProps.win32.js +281 -0
  202. package/Libraries/TurboModule/TurboModuleRegistry.js +47 -7
  203. package/Libraries/TurboModule/samples/NativeSampleTurboModule.js +6 -0
  204. package/Libraries/Types/CoreEventTypes.d.ts +5 -2
  205. package/Libraries/Utilities/GlobalPerformanceLogger.js +2 -12
  206. package/Libraries/Utilities/NativeDeviceInfo.js +8 -9
  207. package/Libraries/Utilities/NativePlatformConstantsAndroid.js +23 -18
  208. package/Libraries/Utilities/NativePlatformConstantsIOS.js +16 -13
  209. package/Libraries/Utilities/NativePlatformConstantsWin.js +13 -10
  210. package/Libraries/Utilities/PerformanceLoggerContext.js +1 -1
  211. package/Libraries/Utilities/Platform.android.js +12 -8
  212. package/Libraries/Utilities/Platform.d.ts +1 -0
  213. package/Libraries/Utilities/Platform.flow.js +84 -0
  214. package/Libraries/Utilities/Platform.flow.win32.js +111 -0
  215. package/Libraries/Utilities/Platform.ios.js +12 -8
  216. package/Libraries/Utilities/Platform.win32.js +12 -8
  217. package/Libraries/Utilities/PolyfillFunctions.js +1 -1
  218. package/Libraries/Utilities/ReactNativeTestTools.js +1 -2
  219. package/Libraries/Utilities/SceneTracker.js +1 -1
  220. package/Libraries/Utilities/createPerformanceLogger.js +63 -32
  221. package/Libraries/Utilities/useColorScheme.js +7 -8
  222. package/Libraries/WebPerformance/MemoryInfo.js +1 -1
  223. package/Libraries/WebPerformance/NativePerformance.js +3 -8
  224. package/Libraries/WebPerformance/NativePerformanceObserver.js +4 -0
  225. package/Libraries/WebPerformance/Performance.js +42 -15
  226. package/Libraries/WebPerformance/PerformanceEntry.js +14 -6
  227. package/Libraries/WebPerformance/PerformanceEventTiming.js +18 -1
  228. package/Libraries/WebPerformance/ReactNativeStartupTiming.js +40 -14
  229. package/Libraries/WebPerformance/__mocks__/NativePerformance.js +4 -2
  230. package/Libraries/WebPerformance/__mocks__/NativePerformanceObserver.js +21 -3
  231. package/Libraries/promiseRejectionTrackingOptions.js +21 -9
  232. package/Libraries/vendor/emitter/EventEmitter.js +17 -17
  233. package/flow/global.js +1 -3
  234. package/flow/jest.js +5 -1
  235. package/{Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.ios.js → jest/ReactNativeInternalFeatureFlagsMock.js} +2 -1
  236. package/jest/__tests__/setup-test.js +18 -0
  237. package/jest/mockModal.js +6 -4
  238. package/jest/setup.js +61 -30
  239. package/jest.config.js +1 -1
  240. package/just-task.js +1 -0
  241. package/overrides.json +54 -60
  242. package/package.json +35 -33
  243. package/src/Libraries/Components/Button/ButtonWin32.Props.ts +1 -1
  244. package/src/Libraries/Components/Button/ButtonWin32.tsx +0 -2
  245. package/src/Libraries/Components/Touchable/Tests/TouchableWin32Test.tsx +2 -2
  246. package/src/Libraries/Components/Touchable/TouchableWin32.tsx +1 -1
  247. package/src/Libraries/Components/View/ViewAccessibility.d.ts +8 -2
  248. package/src/Libraries/StyleSheet/PlatformColorValueTypesWin32.d.ts +1 -1
  249. package/types/experimental.d.ts +44 -0
  250. package/types/index.d.ts +2 -1
  251. package/types/modules/Devtools.d.ts +1 -0
  252. package/types/modules/globals.d.ts +16 -1
  253. package/IntegrationTests/BUCK +0 -32
  254. package/IntegrationTests/PropertiesUpdateTest.js +0 -29
  255. package/IntegrationTests/RCTRootViewIntegrationTestApp.js +0 -86
  256. package/IntegrationTests/ReactContentSizeUpdateTest.js +0 -89
  257. package/IntegrationTests/SizeFlexibilityUpdateTest.js +0 -106
  258. package/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfoWin32.js +0 -37
  259. package/Libraries/Components/TextInput/TextInput.Types.win32.d.ts +0 -51
  260. package/Libraries/Components/TextInput/TextInput.Types.win32.js +0 -3
  261. package/Libraries/Components/TextInput/TextInput.Types.win32.js.map +0 -1
  262. package/Libraries/Utilities/AcessibilityMapping.js +0 -154
  263. package/Libraries/Utilities/AcessibilityMapping.win32.js +0 -156
  264. package/Libraries/Utilities/NativeDevSplitBundleLoader.js +0 -19
  265. package/Libraries/Utilities/useColorScheme.win32.js +0 -26
  266. package/flow/use-sync-external-store.js +0 -20
  267. package/flow-typed/npm/base64-js_v1.x.x.js +0 -12
  268. package/flow-typed/npm/glob_v7.x.x.js +0 -79
  269. package/flow-typed/npm/pretty-format_v26.x.x.js +0 -49
  270. package/flow-typed/npm/promise_v8.x.x.js +0 -30
  271. package/flow-typed/npm/react-dom_v17.x.x.js +0 -139
  272. package/flow-typed/npm/react-test-renderer_v16.x.x.js +0 -79
  273. package/flow-typed/npm/stacktrace-parser_v0.1.x.js +0 -17
  274. package/flow-typed/npm/yargs_v17.x.x.js +0 -341
  275. package/src/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +0 -161
  276. package/src/Libraries/Components/TextInput/TextInput.Types.win32.ts +0 -68
  277. /package/Libraries/{Renderer/public → ReactNative/ReactFabricPublicInstance}/ReactFabricPublicInstanceUtils.js +0 -0
@@ -0,0 +1,82 @@
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
+ * @flow strict-local
8
+ * @format
9
+ */
10
+
11
+ // flowlint unsafe-getters-setters:off
12
+
13
+ import type ReactNativeElement from '../DOM/Nodes/ReactNativeElement';
14
+ import type ReadOnlyNode from '../DOM/Nodes/ReadOnlyNode';
15
+ import type {NativeMutationRecord} from './NativeMutationObserver';
16
+
17
+ import NodeList, {createNodeList} from '../DOM/OldStyleCollections/NodeList';
18
+
19
+ export type MutationType = 'attributes' | 'characterData' | 'childList';
20
+
21
+ /**
22
+ * The `MutationRecord` is a read-only interface that represents an individual
23
+ * DOM mutation observed by a `MutationObserver`.
24
+ *
25
+ * It is the object inside the array passed to the callback of a `MutationObserver`.
26
+ */
27
+ export default class MutationRecord {
28
+ _target: ReactNativeElement;
29
+ _addedNodes: NodeList<ReadOnlyNode>;
30
+ _removedNodes: NodeList<ReadOnlyNode>;
31
+
32
+ constructor(nativeRecord: NativeMutationRecord) {
33
+ // $FlowExpectedError[incompatible-cast] the codegen doesn't support the actual type.
34
+ const target = (nativeRecord.target: ReactNativeElement);
35
+ this._target = target;
36
+ // $FlowExpectedError[incompatible-cast] the codegen doesn't support the actual type.
37
+ const addedNodes = (nativeRecord.addedNodes: $ReadOnlyArray<ReadOnlyNode>);
38
+ this._addedNodes = createNodeList(addedNodes);
39
+ const removedNodes =
40
+ // $FlowExpectedError[incompatible-cast] the codegen doesn't support the actual type.
41
+ (nativeRecord.removedNodes: $ReadOnlyArray<ReadOnlyNode>);
42
+ this._removedNodes = createNodeList(removedNodes);
43
+ }
44
+
45
+ get addedNodes(): NodeList<ReadOnlyNode> {
46
+ return this._addedNodes;
47
+ }
48
+
49
+ get attributeName(): string | null {
50
+ return null;
51
+ }
52
+
53
+ get nextSibling(): ReadOnlyNode | null {
54
+ return null;
55
+ }
56
+
57
+ get oldValue(): mixed | null {
58
+ return null;
59
+ }
60
+
61
+ get previousSibling(): ReadOnlyNode | null {
62
+ return null;
63
+ }
64
+
65
+ get removedNodes(): NodeList<ReadOnlyNode> {
66
+ return this._removedNodes;
67
+ }
68
+
69
+ get target(): ReactNativeElement {
70
+ return this._target;
71
+ }
72
+
73
+ get type(): MutationType {
74
+ return 'childList';
75
+ }
76
+ }
77
+
78
+ export function createMutationRecord(
79
+ entry: NativeMutationRecord,
80
+ ): MutationRecord {
81
+ return new MutationRecord(entry);
82
+ }
@@ -0,0 +1,58 @@
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
+ * @flow strict-local
8
+ * @format
9
+ */
10
+
11
+ import type {TurboModule} from '../TurboModule/RCTExport';
12
+
13
+ import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry';
14
+
15
+ export type MutationObserverId = number;
16
+
17
+ // These types are not supported by the codegen.
18
+ type ShadowNode = mixed;
19
+ type InstanceHandle = mixed;
20
+ type ReactNativeElement = mixed;
21
+ type ReadOnlyNode = mixed;
22
+
23
+ export type NativeMutationRecord = {
24
+ mutationObserverId: MutationObserverId,
25
+ target: ReactNativeElement,
26
+ addedNodes: $ReadOnlyArray<ReadOnlyNode>,
27
+ removedNodes: $ReadOnlyArray<ReadOnlyNode>,
28
+ ...
29
+ };
30
+
31
+ export type NativeMutationObserverObserveOptions = {
32
+ mutationObserverId: number,
33
+ targetShadowNode: ShadowNode,
34
+ subtree: boolean,
35
+ };
36
+
37
+ export interface Spec extends TurboModule {
38
+ +observe: (options: NativeMutationObserverObserveOptions) => void;
39
+ +unobserve: (
40
+ mutationObserverId: number,
41
+ targetShadowNode: ShadowNode,
42
+ ) => void;
43
+ +connect: (
44
+ notifyMutationObservers: () => void,
45
+ // We need this to retain the public instance before React removes the
46
+ // reference to it (which happen in mutations that remove nodes, or when
47
+ // nodes are removed between the change and the callback is executed in JS).
48
+ getPublicInstanceFromInstanceHandle: (
49
+ instanceHandle: InstanceHandle,
50
+ ) => ReadOnlyNode,
51
+ ) => void;
52
+ +disconnect: () => void;
53
+ +takeRecords: () => $ReadOnlyArray<NativeMutationRecord>;
54
+ }
55
+
56
+ export default (TurboModuleRegistry.get<Spec>(
57
+ 'NativeMutationObserverCxx',
58
+ ): ?Spec);
@@ -0,0 +1,327 @@
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
+ * @flow strict-local
8
+ * @format
9
+ */
10
+
11
+ /**
12
+ * This is a mock of `NativeMutationObserver` implementing the same logic as the
13
+ * native module and integrating with the existing mock for `FabricUIManager`.
14
+ * This allows us to test all the JavaScript code for IntersectionObserver in
15
+ * JavaScript as an integration test using only public APIs.
16
+ */
17
+
18
+ import type {NodeSet} from '../../ReactNative/FabricUIManager';
19
+ import type {RootTag} from '../../ReactNative/RootTag';
20
+ import type {
21
+ InternalInstanceHandle,
22
+ Node,
23
+ } from '../../Renderer/shims/ReactNativeTypes';
24
+ import type {
25
+ MutationObserverId,
26
+ NativeMutationObserverObserveOptions,
27
+ NativeMutationRecord,
28
+ Spec,
29
+ } from '../NativeMutationObserver';
30
+
31
+ import ReadOnlyNode from '../../DOM/Nodes/ReadOnlyNode';
32
+ import {
33
+ type NodeMock,
34
+ type UIManagerCommitHook,
35
+ fromNode,
36
+ getFabricUIManager,
37
+ getNodeInChildSet,
38
+ } from '../../ReactNative/__mocks__/FabricUIManager';
39
+ import invariant from 'invariant';
40
+ import nullthrows from 'nullthrows';
41
+
42
+ let pendingRecords: Array<NativeMutationRecord> = [];
43
+ let callback: ?() => void;
44
+ let getPublicInstance: ?(instanceHandle: InternalInstanceHandle) => mixed;
45
+ let observersByRootTag: Map<
46
+ RootTag,
47
+ Map<MutationObserverId, {deep: Set<Node>, shallow: Set<Node>}>,
48
+ > = new Map();
49
+
50
+ const FabricUIManagerMock = nullthrows(getFabricUIManager());
51
+
52
+ function getMockDataFromShadowNode(node: mixed): NodeMock {
53
+ // $FlowExpectedError[incompatible-call]
54
+ return fromNode(node);
55
+ }
56
+
57
+ function castToNode(node: mixed): Node {
58
+ // $FlowExpectedError[incompatible-return]
59
+ return node;
60
+ }
61
+
62
+ const NativeMutationMock = {
63
+ observe: (options: NativeMutationObserverObserveOptions): void => {
64
+ const targetShadowNode = castToNode(options.targetShadowNode);
65
+ const rootTag = getMockDataFromShadowNode(options.targetShadowNode).rootTag;
66
+
67
+ let observers = observersByRootTag.get(rootTag);
68
+ if (observers == null) {
69
+ observers = new Map();
70
+ observersByRootTag.set(rootTag, observers);
71
+ }
72
+ let observations = observers.get(options.mutationObserverId);
73
+ if (observations == null) {
74
+ observations = {deep: new Set(), shallow: new Set()};
75
+ observers.set(options.mutationObserverId, observations);
76
+ }
77
+
78
+ const isTargetBeingObserved =
79
+ observations.deep.has(targetShadowNode) ||
80
+ observations.shallow.has(targetShadowNode);
81
+ invariant(!isTargetBeingObserved, 'unexpected duplicate call to observe');
82
+
83
+ if (options.subtree) {
84
+ observations.deep.add(targetShadowNode);
85
+ } else {
86
+ observations.shallow.add(targetShadowNode);
87
+ }
88
+ },
89
+ unobserve: (mutationObserverId: number, target: mixed): void => {
90
+ const targetShadowNode = castToNode(target);
91
+
92
+ const observers = observersByRootTag.get(
93
+ getMockDataFromShadowNode(targetShadowNode).rootTag,
94
+ );
95
+ const observations = observers?.get(mutationObserverId);
96
+ invariant(observations != null, 'unexpected call to unobserve');
97
+
98
+ const isTargetBeingObserved =
99
+ observations.deep.has(targetShadowNode) ||
100
+ observations.shallow.has(targetShadowNode);
101
+ invariant(isTargetBeingObserved, 'unexpected call to unobserve');
102
+
103
+ observations.deep.delete(targetShadowNode);
104
+ observations.shallow.delete(targetShadowNode);
105
+ },
106
+ connect: (
107
+ notifyMutationObserversCallback: () => void,
108
+ getPublicInstanceFromInstanceHandle: (
109
+ instanceHandle: InternalInstanceHandle,
110
+ ) => mixed,
111
+ ): void => {
112
+ invariant(callback == null, 'unexpected call to connect');
113
+ callback = notifyMutationObserversCallback;
114
+ getPublicInstance = getPublicInstanceFromInstanceHandle;
115
+ FabricUIManagerMock.__addCommitHook(NativeMutationObserverCommitHook);
116
+ },
117
+ disconnect: (): void => {
118
+ invariant(callback != null, 'unexpected call to disconnect');
119
+ callback = null;
120
+ FabricUIManagerMock.__removeCommitHook(NativeMutationObserverCommitHook);
121
+ },
122
+ takeRecords: (): $ReadOnlyArray<NativeMutationRecord> => {
123
+ const currentRecords = pendingRecords;
124
+ pendingRecords = [];
125
+ return currentRecords;
126
+ },
127
+ };
128
+
129
+ (NativeMutationMock: Spec);
130
+
131
+ export default NativeMutationMock;
132
+
133
+ const NativeMutationObserverCommitHook: UIManagerCommitHook = {
134
+ shadowTreeWillCommit: (rootTag, oldChildSet, newChildSet) => {
135
+ runMutationObservations(rootTag, oldChildSet, newChildSet);
136
+ },
137
+ };
138
+
139
+ function runMutationObservations(
140
+ rootTag: RootTag,
141
+ oldChildSet: ?NodeSet,
142
+ newChildSet: NodeSet,
143
+ ): void {
144
+ const observers = observersByRootTag.get(rootTag);
145
+ if (!observers) {
146
+ return;
147
+ }
148
+
149
+ const newRecords: Array<NativeMutationRecord> = [];
150
+
151
+ for (const [mutationObserverId, observations] of observers) {
152
+ const processedNodes: Set<Node> = new Set();
153
+ for (const targetShadowNode of observations.deep) {
154
+ runMutationObservation({
155
+ mutationObserverId,
156
+ targetShadowNode,
157
+ subtree: true,
158
+ oldChildSet,
159
+ newChildSet,
160
+ newRecords,
161
+ processedNodes,
162
+ });
163
+ }
164
+ for (const targetShadowNode of observations.shallow) {
165
+ runMutationObservation({
166
+ mutationObserverId,
167
+ targetShadowNode,
168
+ subtree: false,
169
+ oldChildSet,
170
+ newChildSet,
171
+ newRecords,
172
+ processedNodes,
173
+ });
174
+ }
175
+ }
176
+
177
+ for (const record of newRecords) {
178
+ pendingRecords.push(record);
179
+ }
180
+
181
+ notifyObserversIfNecessary();
182
+ }
183
+
184
+ function findNodeOfSameFamily(list: NodeSet, node: Node): ?Node {
185
+ for (const current of list) {
186
+ if (fromNode(current).reactTag === fromNode(node).reactTag) {
187
+ return current;
188
+ }
189
+ }
190
+ return;
191
+ }
192
+
193
+ function recordMutations({
194
+ mutationObserverId,
195
+ targetShadowNode,
196
+ subtree,
197
+ oldNode,
198
+ newNode,
199
+ newRecords,
200
+ processedNodes,
201
+ }: {
202
+ mutationObserverId: MutationObserverId,
203
+ targetShadowNode: Node,
204
+ subtree: boolean,
205
+ oldNode: Node,
206
+ newNode: Node,
207
+ newRecords: Array<NativeMutationRecord>,
208
+ processedNodes: Set<Node>,
209
+ }): void {
210
+ // If the nodes are referentially equal, their children are also the same.
211
+ if (oldNode === newNode || processedNodes.has(newNode)) {
212
+ return;
213
+ }
214
+
215
+ processedNodes.add(newNode);
216
+
217
+ const oldChildren = fromNode(oldNode).children;
218
+ const newChildren = fromNode(newNode).children;
219
+
220
+ const addedNodes = [];
221
+ const removedNodes = [];
222
+
223
+ // Check for removed nodes (and equal nodes for further inspection later)
224
+ for (const oldChild of oldChildren) {
225
+ const newChild = findNodeOfSameFamily(newChildren, oldChild);
226
+ if (newChild == null) {
227
+ removedNodes.push(oldChild);
228
+ } else if (subtree) {
229
+ recordMutations({
230
+ mutationObserverId,
231
+ targetShadowNode,
232
+ subtree,
233
+ oldNode: oldChild,
234
+ newNode: newChild,
235
+ newRecords,
236
+ processedNodes,
237
+ });
238
+ }
239
+ }
240
+
241
+ // Check for added nodes
242
+ for (const newChild of newChildren) {
243
+ const oldChild = findNodeOfSameFamily(oldChildren, newChild);
244
+ if (oldChild == null) {
245
+ addedNodes.push(newChild);
246
+ }
247
+ }
248
+
249
+ if (addedNodes.length > 0 || removedNodes.length > 0) {
250
+ newRecords.push({
251
+ mutationObserverId: mutationObserverId,
252
+ target: nullthrows(getPublicInstance)(
253
+ getMockDataFromShadowNode(targetShadowNode).instanceHandle,
254
+ ),
255
+ addedNodes: addedNodes.map(node => {
256
+ const readOnlyNode = nullthrows(getPublicInstance)(
257
+ fromNode(node).instanceHandle,
258
+ );
259
+ invariant(
260
+ readOnlyNode instanceof ReadOnlyNode,
261
+ 'expected instance of ReadOnlyNode',
262
+ );
263
+ return readOnlyNode;
264
+ }),
265
+ removedNodes: removedNodes.map(node => {
266
+ const readOnlyNode = nullthrows(getPublicInstance)(
267
+ fromNode(node).instanceHandle,
268
+ );
269
+ invariant(
270
+ readOnlyNode instanceof ReadOnlyNode,
271
+ 'expected instance of ReadOnlyNode',
272
+ );
273
+ return readOnlyNode;
274
+ }),
275
+ });
276
+ }
277
+ }
278
+
279
+ function runMutationObservation({
280
+ mutationObserverId,
281
+ targetShadowNode,
282
+ subtree,
283
+ oldChildSet,
284
+ newChildSet,
285
+ newRecords,
286
+ processedNodes,
287
+ }: {
288
+ mutationObserverId: MutationObserverId,
289
+ targetShadowNode: Node,
290
+ subtree: boolean,
291
+ oldChildSet: ?NodeSet,
292
+ newChildSet: NodeSet,
293
+ newRecords: Array<NativeMutationRecord>,
294
+ processedNodes: Set<Node>,
295
+ }): void {
296
+ if (!oldChildSet) {
297
+ return;
298
+ }
299
+
300
+ const oldTargetShadowNode = getNodeInChildSet(targetShadowNode, oldChildSet);
301
+ if (oldTargetShadowNode == null) {
302
+ return;
303
+ }
304
+
305
+ const newTargetShadowNode = getNodeInChildSet(targetShadowNode, newChildSet);
306
+ if (newTargetShadowNode == null) {
307
+ return;
308
+ }
309
+
310
+ recordMutations({
311
+ mutationObserverId,
312
+ targetShadowNode,
313
+ subtree,
314
+ oldNode: oldTargetShadowNode,
315
+ newNode: newTargetShadowNode,
316
+ newRecords,
317
+ processedNodes,
318
+ });
319
+ }
320
+
321
+ function notifyObserversIfNecessary(): void {
322
+ if (pendingRecords.length > 0) {
323
+ // We schedule these using regular tasks in native because microtasks are
324
+ // still not properly supported.
325
+ setTimeout(() => callback?.(), 0);
326
+ }
327
+ }
@@ -103,6 +103,12 @@ const bubblingEventTypes = {
103
103
  bubbled: 'onPointerOver',
104
104
  },
105
105
  },
106
+ topClick: {
107
+ phasedRegistrationNames: {
108
+ captured: 'onClickCapture',
109
+ bubbled: 'onClick',
110
+ },
111
+ },
106
112
  };
107
113
 
108
114
  const directEventTypes = {
@@ -135,9 +141,6 @@ const directEventTypes = {
135
141
  topMomentumScrollEnd: {
136
142
  registrationName: 'onMomentumScrollEnd',
137
143
  },
138
- topClick: {
139
- registrationName: 'onClick',
140
- },
141
144
  topLoadingStart: {
142
145
  registrationName: 'onLoadingStart',
143
146
  },
@@ -162,6 +165,7 @@ const validAttributesForNonEventProps = {
162
165
  // @ReactProps from BaseViewManager
163
166
  backgroundColor: {process: require('../StyleSheet/processColor').default},
164
167
  transform: true,
168
+ transformOrigin: true,
165
169
  opacity: true,
166
170
  elevation: true,
167
171
  shadowColor: {process: require('../StyleSheet/processColor').default},
@@ -179,6 +183,7 @@ const validAttributesForNonEventProps = {
179
183
  accessibilityActions: true,
180
184
  accessibilityValue: true,
181
185
  importantForAccessibility: true,
186
+ role: true,
182
187
  rotation: true,
183
188
  scaleX: true,
184
189
  scaleY: true,
@@ -258,9 +263,19 @@ const validAttributesForNonEventProps = {
258
263
  top: true,
259
264
  bottom: true,
260
265
 
266
+ inset: true,
267
+ insetBlock: true,
268
+ insetBlockEnd: true,
269
+ insetBlockStart: true,
270
+ insetInline: true,
271
+ insetInlineEnd: true,
272
+ insetInlineStart: true,
273
+
261
274
  position: true,
262
275
 
263
276
  style: ReactNativeStyleAttributes,
277
+
278
+ experimental_layoutConformance: true,
264
279
  };
265
280
 
266
281
  // Props for bubbling and direct events
@@ -88,6 +88,12 @@ const bubblingEventTypes = {
88
88
  },
89
89
 
90
90
  // Experimental/Work in Progress Pointer Events (not yet ready for use)
91
+ topClick: {
92
+ phasedRegistrationNames: {
93
+ captured: 'onClickCapture',
94
+ bubbled: 'onClick',
95
+ },
96
+ },
91
97
  topPointerCancel: {
92
98
  phasedRegistrationNames: {
93
99
  captured: 'onPointerCancelCapture',
@@ -138,6 +144,18 @@ const bubblingEventTypes = {
138
144
  bubbled: 'onPointerOut',
139
145
  },
140
146
  },
147
+ topGotPointerCapture: {
148
+ phasedRegistrationNames: {
149
+ captured: 'onGotPointerCaptureCapture',
150
+ bubbled: 'onGotPointerCapture',
151
+ },
152
+ },
153
+ topLostPointerCapture: {
154
+ phasedRegistrationNames: {
155
+ captured: 'onLostPointerCaptureCapture',
156
+ bubbled: 'onLostPointerCapture',
157
+ },
158
+ },
141
159
  };
142
160
 
143
161
  const directEventTypes = {
@@ -187,11 +205,13 @@ const validAttributesForNonEventProps = {
187
205
  overflow: true,
188
206
  shouldRasterizeIOS: true,
189
207
  transform: {diff: require('../Utilities/differ/matricesDiffer')},
208
+ transformOrigin: true,
190
209
  accessibilityRole: true,
191
210
  accessibilityState: true,
192
211
  nativeID: true,
193
212
  pointerEvents: true,
194
213
  removeClippedSubviews: true,
214
+ role: true,
195
215
  borderRadius: true,
196
216
  borderColor: {process: require('../StyleSheet/processColor').default},
197
217
  borderCurve: true,
@@ -236,6 +256,14 @@ const validAttributesForNonEventProps = {
236
256
  bottom: true,
237
257
  left: true,
238
258
 
259
+ inset: true,
260
+ insetBlock: true,
261
+ insetBlockEnd: true,
262
+ insetBlockStart: true,
263
+ insetInline: true,
264
+ insetInlineEnd: true,
265
+ insetInlineStart: true,
266
+
239
267
  width: true,
240
268
  height: true,
241
269
 
@@ -308,6 +336,8 @@ const validAttributesForNonEventProps = {
308
336
  direction: true,
309
337
 
310
338
  style: ReactNativeStyleAttributes,
339
+
340
+ experimental_layoutConformance: true,
311
341
  };
312
342
 
313
343
  // Props for bubbling and direct events
@@ -342,6 +372,7 @@ const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({
342
372
  onTouchCancel: true,
343
373
 
344
374
  // Pointer events
375
+ onClick: true,
345
376
  onPointerUp: true,
346
377
  onPointerDown: true,
347
378
  onPointerCancel: true,
@@ -350,6 +381,8 @@ const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({
350
381
  onPointerLeave: true,
351
382
  onPointerOver: true,
352
383
  onPointerOut: true,
384
+ onGotPointerCapture: true,
385
+ onLostPointerCapture: true,
353
386
  });
354
387
 
355
388
  /**
@@ -88,6 +88,12 @@ const bubblingEventTypes = {
88
88
  },
89
89
 
90
90
  // Experimental/Work in Progress Pointer Events (not yet ready for use)
91
+ topClick: {
92
+ phasedRegistrationNames: {
93
+ captured: 'onClickCapture',
94
+ bubbled: 'onClick',
95
+ },
96
+ },
91
97
  topPointerCancel: {
92
98
  phasedRegistrationNames: {
93
99
  captured: 'onPointerCancelCapture',
@@ -138,6 +144,18 @@ const bubblingEventTypes = {
138
144
  bubbled: 'onPointerOut',
139
145
  },
140
146
  },
147
+ topGotPointerCapture: {
148
+ phasedRegistrationNames: {
149
+ captured: 'onGotPointerCaptureCapture',
150
+ bubbled: 'onGotPointerCapture',
151
+ },
152
+ },
153
+ topLostPointerCapture: {
154
+ phasedRegistrationNames: {
155
+ captured: 'onLostPointerCaptureCapture',
156
+ bubbled: 'onLostPointerCapture',
157
+ },
158
+ },
141
159
  };
142
160
 
143
161
  const directEventTypes = {
@@ -187,11 +205,13 @@ const validAttributesForNonEventProps = {
187
205
  overflow: true,
188
206
  shouldRasterizeIOS: true,
189
207
  transform: {diff: require('../Utilities/differ/matricesDiffer')},
208
+ transformOrigin: true,
190
209
  accessibilityRole: true,
191
210
  accessibilityState: true,
192
211
  nativeID: true,
193
212
  pointerEvents: true,
194
213
  removeClippedSubviews: true,
214
+ role: true,
195
215
  borderRadius: true,
196
216
  borderColor: {process: require('../StyleSheet/processColor').default},
197
217
  borderCurve: true,
@@ -236,6 +256,14 @@ const validAttributesForNonEventProps = {
236
256
  bottom: true,
237
257
  left: true,
238
258
 
259
+ inset: true,
260
+ insetBlock: true,
261
+ insetBlockEnd: true,
262
+ insetBlockStart: true,
263
+ insetInline: true,
264
+ insetInlineEnd: true,
265
+ insetInlineStart: true,
266
+
239
267
  width: true,
240
268
  height: true,
241
269
 
@@ -308,6 +336,8 @@ const validAttributesForNonEventProps = {
308
336
  direction: true,
309
337
 
310
338
  style: ReactNativeStyleAttributes,
339
+
340
+ experimental_layoutConformance: true,
311
341
  };
312
342
 
313
343
  // Props for bubbling and direct events
@@ -342,6 +372,7 @@ const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({
342
372
  onTouchCancel: true,
343
373
 
344
374
  // Pointer events
375
+ onClick: true,
345
376
  onPointerUp: true,
346
377
  onPointerDown: true,
347
378
  onPointerCancel: true,
@@ -350,6 +381,8 @@ const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({
350
381
  onPointerLeave: true,
351
382
  onPointerOver: true,
352
383
  onPointerOut: true,
384
+ onGotPointerCapture: true,
385
+ onLostPointerCapture: true,
353
386
  });
354
387
 
355
388
  /**