@office-iss/react-native-win32 0.74.4 → 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 (214) hide show
  1. package/.flowconfig +9 -4
  2. package/CHANGELOG.json +569 -51
  3. package/CHANGELOG.md +173 -30
  4. package/Libraries/Animated/AnimatedImplementation.js +2 -0
  5. package/Libraries/Animated/NativeAnimatedHelper.js +4 -0
  6. package/Libraries/Animated/NativeAnimatedHelper.win32.js +4 -0
  7. package/Libraries/Animated/createAnimatedComponent.js +10 -4
  8. package/Libraries/Animated/useAnimatedProps.js +56 -28
  9. package/Libraries/BatchedBridge/MessageQueue.js +1 -0
  10. package/Libraries/Components/Button.js +10 -5
  11. package/Libraries/Components/Button.win32.js +1 -0
  12. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +11 -2
  13. package/Libraries/Components/Pressable/Pressable.js +13 -6
  14. package/Libraries/Components/Pressable/Pressable.win32.js +13 -6
  15. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +4 -0
  16. package/Libraries/Components/ScrollView/ScrollView.js +109 -29
  17. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +6 -0
  18. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +13 -1
  19. package/Libraries/Components/StatusBar/StatusBar.js +1 -21
  20. package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +0 -15
  21. package/Libraries/Components/TextInput/InputAccessoryView.js +10 -1
  22. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +0 -12
  23. package/Libraries/Components/TextInput/TextInput.d.ts +0 -19
  24. package/Libraries/Components/TextInput/TextInput.js +14 -70
  25. package/Libraries/Components/TextInput/TextInput.win32.js +15 -72
  26. package/Libraries/Components/Touchable/Touchable.js +2 -2
  27. package/Libraries/Components/Touchable/TouchableHighlight.d.ts +4 -10
  28. package/Libraries/Components/Touchable/TouchableHighlight.js +3 -1
  29. package/Libraries/Components/Touchable/TouchableOpacity.d.ts +4 -32
  30. package/Libraries/Components/Touchable/TouchableOpacity.js +3 -1
  31. package/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts +8 -0
  32. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +117 -111
  33. package/Libraries/Components/View/ReactNativeStyleAttributes.js +6 -0
  34. package/Libraries/Components/View/ReactNativeViewAttributes.js +1 -0
  35. package/Libraries/Components/View/ReactNativeViewAttributes.win32.js +1 -0
  36. package/Libraries/Components/View/View.js +0 -11
  37. package/Libraries/Components/View/View.win32.js +0 -11
  38. package/Libraries/Components/View/ViewAccessibility.js +4 -4
  39. package/Libraries/Components/View/ViewAccessibility.win32.js +6 -6
  40. package/Libraries/Components/View/ViewPropTypes.d.ts +7 -49
  41. package/Libraries/Components/View/ViewPropTypes.js +7 -0
  42. package/Libraries/Components/View/ViewPropTypes.win32.js +7 -0
  43. package/Libraries/Core/Devtools/loadBundleFromServer.js +3 -3
  44. package/Libraries/Core/Devtools/loadBundleFromServer.win32.js +153 -0
  45. package/Libraries/Core/Devtools/parseErrorStack.js +5 -5
  46. package/Libraries/Core/Devtools/parseHermesStack.js +22 -16
  47. package/Libraries/Core/ErrorHandlers.js +116 -0
  48. package/Libraries/Core/ExceptionsManager.js +2 -2
  49. package/Libraries/Core/ReactNativeVersion.js +3 -3
  50. package/Libraries/Core/setUpDeveloperTools.js +3 -1
  51. package/Libraries/Core/setUpPerformance.js +6 -4
  52. package/Libraries/Core/setUpReactDevTools.js +70 -10
  53. package/Libraries/Core/setUpTimers.js +50 -31
  54. package/Libraries/Debugging/DebuggingOverlayRegistry.js +1 -1
  55. package/Libraries/Image/Image.android.js +23 -13
  56. package/Libraries/Image/Image.d.ts +14 -15
  57. package/Libraries/Image/Image.ios.js +21 -11
  58. package/Libraries/Image/Image.win32.js +5 -3
  59. package/Libraries/Image/ImageProps.js +16 -5
  60. package/Libraries/Image/ImageTypes.flow.js +7 -2
  61. package/Libraries/Image/ImageUtils.js +1 -0
  62. package/Libraries/Image/ImageViewNativeComponent.js +2 -1
  63. package/Libraries/Inspector/ElementBox.js +6 -3
  64. package/Libraries/Inspector/ElementProperties.js +1 -1
  65. package/Libraries/Interaction/TouchHistoryMath.js +4 -4
  66. package/Libraries/IntersectionObserver/IntersectionObserverManager.js +6 -26
  67. package/Libraries/JSInspector/NetworkAgent.js +1 -1
  68. package/Libraries/LogBox/Data/LogBoxData.js +39 -29
  69. package/Libraries/LogBox/Data/LogBoxLog.js +114 -2
  70. package/Libraries/LogBox/Data/parseLogBoxLog.js +168 -53
  71. package/Libraries/LogBox/LogBox.js +29 -12
  72. package/Libraries/LogBox/LogBoxNotificationContainer.js +4 -0
  73. package/Libraries/LogBox/UI/LogBoxInspector.js +8 -70
  74. package/Libraries/LogBox/UI/LogBoxInspectorBody.js +87 -0
  75. package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +6 -42
  76. package/Libraries/LogBox/UI/LogBoxInspectorFooterButton.js +58 -0
  77. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +5 -66
  78. package/Libraries/LogBox/UI/LogBoxInspectorHeader.win32.js +8 -52
  79. package/Libraries/LogBox/UI/LogBoxInspectorHeaderButton.js +76 -0
  80. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.js +8 -5
  81. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.win32.js +8 -5
  82. package/Libraries/LogBox/UI/LogBoxNotification.js +13 -152
  83. package/Libraries/LogBox/UI/LogBoxNotificationCountBadge.js +63 -0
  84. package/Libraries/LogBox/UI/LogBoxNotificationDismissButton.js +67 -0
  85. package/Libraries/LogBox/UI/LogBoxNotificationMessage.js +57 -0
  86. package/Libraries/NativeComponent/BaseViewConfig.android.js +5 -0
  87. package/Libraries/NativeComponent/BaseViewConfig.ios.js +5 -0
  88. package/Libraries/NativeComponent/BaseViewConfig.win32.js +5 -0
  89. package/Libraries/NativeComponent/NativeComponentRegistry.js +12 -5
  90. package/Libraries/NativeComponent/StaticViewConfigValidator.js +3 -0
  91. package/Libraries/Network/XMLHttpRequest.js +5 -1
  92. package/Libraries/NewAppScreen/components/LearnMoreLinks.js +3 -3
  93. package/Libraries/Pressability/Pressability.js +3 -51
  94. package/Libraries/Pressability/Pressability.win32.js +3 -51
  95. package/Libraries/ReactNative/AppContainer-dev.js +3 -2
  96. package/Libraries/ReactNative/AppContainer-prod.js +2 -1
  97. package/Libraries/ReactNative/AppContainer.js +2 -0
  98. package/Libraries/ReactNative/AppRegistry.d.ts +7 -0
  99. package/Libraries/ReactNative/AppRegistry.js +10 -4
  100. package/Libraries/ReactNative/BridgelessUIManager.js +1 -21
  101. package/Libraries/ReactNative/FabricUIManager.js +0 -51
  102. package/Libraries/ReactNative/ReactFabricPublicInstance/warnForStyleProps.js +1 -0
  103. package/Libraries/ReactNative/RendererImplementation.js +20 -2
  104. package/Libraries/ReactNative/UIManager.d.ts +0 -21
  105. package/Libraries/ReactNative/UIManagerProperties.js +0 -3
  106. package/Libraries/ReactNative/__mocks__/FabricUIManager.js +5 -341
  107. package/Libraries/ReactNative/getNativeComponentAttributes.js +8 -8
  108. package/Libraries/ReactNative/renderApplication.js +3 -0
  109. package/Libraries/Renderer/implementations/ReactFabric-dev.js +15682 -27088
  110. package/Libraries/Renderer/implementations/ReactFabric-prod.js +5082 -4381
  111. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3480 -2571
  112. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +15943 -27543
  113. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +5303 -4606
  114. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +3450 -2572
  115. package/Libraries/Renderer/shims/ReactFabric.js +2 -2
  116. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
  117. package/Libraries/Renderer/shims/ReactNative.js +2 -3
  118. package/Libraries/Renderer/shims/ReactNativeTypes.js +24 -3
  119. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +2 -2
  120. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
  121. package/Libraries/Share/Share.d.ts +16 -10
  122. package/Libraries/Share/Share.js +14 -15
  123. package/Libraries/StyleSheet/StyleSheet.d.ts +1 -1
  124. package/Libraries/StyleSheet/StyleSheet.js +3 -10
  125. package/Libraries/StyleSheet/StyleSheet.win32.js +3 -10
  126. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +21 -21
  127. package/Libraries/StyleSheet/StyleSheetTypes.js +24 -18
  128. package/Libraries/StyleSheet/flattenStyle.js +1 -0
  129. package/Libraries/StyleSheet/processFilter.js +132 -0
  130. package/Libraries/StyleSheet/processTransform.js +18 -3
  131. package/Libraries/Text/Text.js +151 -128
  132. package/Libraries/Text/Text.win32.js +163 -138
  133. package/Libraries/Text/TextNativeComponent.js +5 -4
  134. package/Libraries/Text/TextNativeComponent.win32.js +5 -4
  135. package/Libraries/Text/TextProps.js +6 -6
  136. package/Libraries/Text/TextProps.win32.js +6 -6
  137. package/Libraries/TurboModule/TurboModuleRegistry.js +2 -1
  138. package/Libraries/Types/CodegenTypes.js +3 -0
  139. package/Libraries/Utilities/{LoadingView.android.js → DevLoadingView.js} +33 -11
  140. package/Libraries/Utilities/Dimensions.js +1 -0
  141. package/Libraries/Utilities/Dimensions.win32.js +1 -0
  142. package/Libraries/Utilities/HMRClient.js +36 -8
  143. package/Libraries/Utilities/HMRClientProdShim.js +1 -0
  144. package/Libraries/Utilities/Platform.android.js +5 -5
  145. package/Libraries/Utilities/Platform.d.ts +1 -1
  146. package/Libraries/Utilities/Platform.flow.js +2 -2
  147. package/Libraries/Utilities/Platform.flow.win32.js +3 -3
  148. package/Libraries/Utilities/Platform.ios.js +1 -1
  149. package/Libraries/Utilities/Platform.win32.js +1 -1
  150. package/Libraries/Utilities/RCTLog.js +1 -0
  151. package/Libraries/Utilities/ReactNativeTestTools.js +12 -24
  152. package/Libraries/Utilities/verifyComponentAttributeEquivalence.js +11 -6
  153. package/Libraries/__tests__/ButtonWin32-test.js +7 -6
  154. package/Libraries/promiseRejectionTrackingOptions.js +1 -0
  155. package/jest/mockComponent.js +7 -0
  156. package/jest/renderer.js +25 -14
  157. package/jest/setup.js +19 -13
  158. package/jest.config.js +2 -1
  159. package/overrides.json +32 -31
  160. package/package.json +27 -25
  161. package/rn-get-polyfills.js +1 -0
  162. package/src/private/core/composeStyles.js +27 -0
  163. package/src/private/featureflags/ReactNativeFeatureFlags.js +93 -33
  164. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +23 -4
  165. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +56 -0
  166. package/src/private/fusebox/setUpFuseboxReactDevToolsDispatcher.js +108 -0
  167. package/src/private/specs/modules/NativeBlobModule.js +4 -2
  168. package/src/private/specs/modules/NativeDevSettings.js +1 -0
  169. package/src/private/specs/modules/NativePlatformConstantsAndroid.js +1 -1
  170. package/src/private/specs/modules/NativePlatformConstantsIOS.js +1 -1
  171. package/src/private/specs/modules/NativePlatformConstantsWin.js +1 -1
  172. package/src/private/specs/modules/NativePushNotificationManagerIOS.js +0 -4
  173. package/src/private/specs/modules/NativeUIManager.js +0 -7
  174. package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +24 -24
  175. package/src/private/webapis/dom/nodes/ReactNativeElement.js +11 -14
  176. package/src/private/webapis/dom/nodes/ReadOnlyCharacterData.js +2 -3
  177. package/src/private/webapis/dom/nodes/ReadOnlyElement.js +24 -54
  178. package/src/private/webapis/dom/nodes/ReadOnlyNode.js +5 -13
  179. package/src/private/webapis/dom/nodes/specs/NativeDOM.js +468 -0
  180. package/src/private/webapis/dom/nodes/specs/__mocks__/NativeDOMMock.js +413 -0
  181. package/src/private/webapis/dom/oldstylecollections/DOMRectList.js +4 -4
  182. package/src/private/webapis/dom/oldstylecollections/HTMLCollection.js +4 -4
  183. package/src/private/webapis/dom/oldstylecollections/NodeList.js +5 -5
  184. package/src/private/webapis/idlecallbacks/specs/NativeIdleCallbacks.js +34 -0
  185. package/src/private/webapis/microtasks/specs/NativeMicrotasks.js +21 -0
  186. package/src/private/webapis/performance/EventCounts.js +1 -1
  187. package/src/private/webapis/performance/MemoryInfo.js +9 -9
  188. package/src/private/webapis/performance/Performance.js +10 -56
  189. package/src/private/webapis/performance/PerformanceObserver.js +30 -22
  190. package/src/private/webapis/performance/RawPerformanceEntry.js +2 -7
  191. package/src/private/webapis/performance/ReactNativeStartupTiming.js +18 -18
  192. package/src/private/webapis/performance/UserTiming.js +63 -0
  193. package/src/private/webapis/performance/{NativePerformance.js → specs/NativePerformance.js} +3 -2
  194. package/src/private/webapis/performance/{NativePerformanceObserver.js → specs/NativePerformanceObserver.js} +2 -2
  195. package/src/private/webapis/performance/{__mocks__ → specs/__mocks__}/NativePerformance.js +1 -1
  196. package/src/private/webapis/performance/{__mocks__ → specs/__mocks__}/NativePerformanceObserver.js +3 -4
  197. package/src-win/Libraries/Components/View/ViewPropTypes.d.ts +7 -49
  198. package/types/modules/globals.d.ts +4 -0
  199. package/Libraries/Components/ScrollView/ScrollView.win32.js +0 -1915
  200. package/Libraries/NativeModules/specs/NativeAnimationsDebugModule.js +0 -13
  201. package/Libraries/Utilities/LoadingView.ios.js +0 -50
  202. package/Libraries/Utilities/LoadingView.js +0 -16
  203. package/jest/ReactNativeInternalFeatureFlagsMock.js +0 -13
  204. package/src/private/featureflags/NativeReactNativeFeatureFlags.js +0 -44
  205. package/src/private/featureflags/__tests__/ReactNativeFeatureFlags-test.js +0 -92
  206. package/src/private/specs/modules/NativeAnimationsDebugModule.js +0 -20
  207. package/src/private/webapis/dom/oldstylecollections/__tests__/DOMRectList-test.js +0 -85
  208. package/src/private/webapis/dom/oldstylecollections/__tests__/HTMLCollection-test.js +0 -80
  209. package/src/private/webapis/dom/oldstylecollections/__tests__/NodeList-test.js +0 -161
  210. package/src/private/webapis/performance/__tests__/EventCounts-test.js +0 -116
  211. package/src/private/webapis/performance/__tests__/NativePerformanceMock-test.js +0 -82
  212. package/src/private/webapis/performance/__tests__/NativePerformanceObserverMock-test.js +0 -108
  213. package/src/private/webapis/performance/__tests__/Performance-test.js +0 -117
  214. package/src/private/webapis/performance/__tests__/PerformanceObserver-test.js +0 -208
@@ -26,6 +26,7 @@ let hmrUnavailableReason: string | null = null;
26
26
  let currentCompileErrorMessage: string | null = null;
27
27
  let didConnect: boolean = false;
28
28
  let pendingLogs: Array<[LogLevel, $ReadOnlyArray<mixed>]> = [];
29
+ let pendingFuseboxConsoleNotification = false;
29
30
 
30
31
  type LogLevel =
31
32
  | 'trace'
@@ -51,6 +52,7 @@ export type HMRClientNativeInterface = {|
51
52
  isEnabled: boolean,
52
53
  scheme?: string,
53
54
  ): void,
55
+ unstable_notifyFuseboxConsoleEnabled(): void,
54
56
  |};
55
57
 
56
58
  /**
@@ -68,7 +70,7 @@ const HMRClient: HMRClientNativeInterface = {
68
70
  }
69
71
 
70
72
  invariant(hmrClient, 'Expected HMRClient.setup() call at startup.');
71
- const LoadingView = require('./LoadingView');
73
+ const DevLoadingView = require('./DevLoadingView');
72
74
 
73
75
  // We use this for internal logging only.
74
76
  // It doesn't affect the logic.
@@ -79,13 +81,13 @@ const HMRClient: HMRClientNativeInterface = {
79
81
  const hasUpdates = hmrClient.hasPendingUpdates();
80
82
 
81
83
  if (hasUpdates) {
82
- LoadingView.showMessage('Refreshing...', 'refresh');
84
+ DevLoadingView.showMessage('Refreshing...', 'refresh');
83
85
  }
84
86
  try {
85
87
  hmrClient.enable();
86
88
  } finally {
87
89
  if (hasUpdates) {
88
- LoadingView.hide();
90
+ DevLoadingView.hide();
89
91
  }
90
92
  }
91
93
 
@@ -140,6 +142,29 @@ const HMRClient: HMRClientNativeInterface = {
140
142
  }
141
143
  },
142
144
 
145
+ unstable_notifyFuseboxConsoleEnabled() {
146
+ if (!hmrClient) {
147
+ pendingFuseboxConsoleNotification = true;
148
+ return;
149
+ }
150
+ hmrClient.send(
151
+ JSON.stringify({
152
+ type: 'log',
153
+ level: 'info',
154
+ data: [
155
+ '\n' +
156
+ '\x1b[7m' +
157
+ ' \x1b[1mJavaScript logs have moved!\x1b[22m They will now appear in the debugger console. ' +
158
+ 'Tip: Type \x1b[1mj\x1b[22m in the terminal to open the debugger (requires Google Chrome ' +
159
+ 'or Microsoft Edge).' +
160
+ '\x1b[27m' +
161
+ '\n',
162
+ ],
163
+ }),
164
+ );
165
+ pendingFuseboxConsoleNotification = false;
166
+ },
167
+
143
168
  // Called once by the bridge on startup, even if Fast Refresh is off.
144
169
  // It creates the HMR client but doesn't actually set up the socket yet.
145
170
  setup(
@@ -156,7 +181,7 @@ const HMRClient: HMRClientNativeInterface = {
156
181
  invariant(!hmrClient, 'Cannot initialize hmrClient twice');
157
182
 
158
183
  // Moving to top gives errors due to NativeModules not being initialized
159
- const LoadingView = require('./LoadingView');
184
+ const DevLoadingView = require('./DevLoadingView');
160
185
 
161
186
  const serverHost = port !== null && port !== '' ? `${host}:${port}` : host;
162
187
 
@@ -205,7 +230,7 @@ Error: ${e.message}`;
205
230
  didConnect = true;
206
231
 
207
232
  if (client.isEnabled() && !isInitialUpdate) {
208
- LoadingView.showMessage('Refreshing...', 'refresh');
233
+ DevLoadingView.showMessage('Refreshing...', 'refresh');
209
234
  }
210
235
  });
211
236
 
@@ -217,11 +242,11 @@ Error: ${e.message}`;
217
242
  });
218
243
 
219
244
  client.on('update-done', () => {
220
- LoadingView.hide();
245
+ DevLoadingView.hide();
221
246
  });
222
247
 
223
248
  client.on('error', data => {
224
- LoadingView.hide();
249
+ DevLoadingView.hide();
225
250
 
226
251
  if (data.type === 'GraphNotFoundError') {
227
252
  client.close();
@@ -242,7 +267,7 @@ Error: ${e.message}`;
242
267
  });
243
268
 
244
269
  client.on('close', closeEvent => {
245
- LoadingView.hide();
270
+ DevLoadingView.hide();
246
271
 
247
272
  // https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1
248
273
  // https://www.rfc-editor.org/rfc/rfc6455.html#section-7.1.5
@@ -316,6 +341,9 @@ function flushEarlyLogs(client: MetroHMRClient) {
316
341
  pendingLogs.forEach(([level, data]) => {
317
342
  HMRClient.log(level, data);
318
343
  });
344
+ if (pendingFuseboxConsoleNotification) {
345
+ HMRClient.unstable_notifyFuseboxConsoleEnabled();
346
+ }
319
347
  } finally {
320
348
  pendingLogs.length = 0;
321
349
  }
@@ -25,6 +25,7 @@ const HMRClientProdShim: HMRClientNativeInterface = {
25
25
  disable() {},
26
26
  registerBundle() {},
27
27
  log() {},
28
+ unstable_notifyFuseboxConsoleEnabled() {},
28
29
  };
29
30
 
30
31
  module.exports = HMRClientProdShim;
@@ -31,7 +31,7 @@ const Platform: PlatformType = {
31
31
  major: number,
32
32
  minor: number,
33
33
  patch: number,
34
- prerelease: ?number,
34
+ prerelease: ?string,
35
35
  |},
36
36
  Version: number,
37
37
  Release: string,
@@ -78,10 +78,10 @@ const Platform: PlatformType = {
78
78
  ? // $FlowFixMe[incompatible-return]
79
79
  spec.android
80
80
  : 'native' in spec
81
- ? // $FlowFixMe[incompatible-return]
82
- spec.native
83
- : // $FlowFixMe[incompatible-return]
84
- spec.default,
81
+ ? // $FlowFixMe[incompatible-return]
82
+ spec.native
83
+ : // $FlowFixMe[incompatible-return]
84
+ spec.default,
85
85
  };
86
86
 
87
87
  module.exports = Platform;
@@ -24,7 +24,7 @@ type PlatformConstants = {
24
24
  major: number;
25
25
  minor: number;
26
26
  patch: number;
27
- prerelease?: number | null | undefined;
27
+ prerelease?: string | null | undefined;
28
28
  };
29
29
  };
30
30
  interface PlatformStatic {
@@ -32,7 +32,7 @@ type IOSPlatform = {
32
32
  major: number,
33
33
  minor: number,
34
34
  patch: number,
35
- prerelease: ?number,
35
+ prerelease: ?string,
36
36
  |},
37
37
  systemName: string,
38
38
  isMacCatalyst?: boolean,
@@ -65,7 +65,7 @@ type AndroidPlatform = {
65
65
  major: number,
66
66
  minor: number,
67
67
  patch: number,
68
- prerelease: ?number,
68
+ prerelease: ?string,
69
69
  |},
70
70
  Version: number,
71
71
  Release: string,
@@ -34,7 +34,7 @@ type IOSPlatform = {
34
34
  major: number,
35
35
  minor: number,
36
36
  patch: number,
37
- prerelease: ?string | number,
37
+ prerelease: ?string,
38
38
  |},
39
39
  isMacCatalyst?: boolean,
40
40
  |},
@@ -66,7 +66,7 @@ type AndroidPlatform = {
66
66
  major: number,
67
67
  minor: number,
68
68
  patch: number,
69
- prerelease: ?number,
69
+ prerelease: ?string,
70
70
  |},
71
71
  Version: number,
72
72
  Release: string,
@@ -105,7 +105,7 @@ type Win32Platform = {
105
105
  major: number,
106
106
  minor: number,
107
107
  patch: number,
108
- prerelease: ?string | number,
108
+ prerelease: ?string,
109
109
  |},
110
110
  systemName: string,
111
111
  isMacCatalyst?: boolean,
@@ -34,7 +34,7 @@ const Platform: PlatformType = {
34
34
  major: number,
35
35
  minor: number,
36
36
  patch: number,
37
- prerelease: ?number,
37
+ prerelease: ?string,
38
38
  |},
39
39
  systemName: string,
40
40
  isMacCatalyst?: boolean,
@@ -32,7 +32,7 @@ const Platform: PlatformType = {
32
32
  major: number,
33
33
  minor: number,
34
34
  patch: number,
35
- prerelease: ?string | number,
35
+ prerelease: ?string,
36
36
  |},
37
37
  systemName: string,
38
38
  isMacCatalyst?: boolean,
@@ -38,6 +38,7 @@ const RCTLog = {
38
38
 
39
39
  // Log to console regardless of nativeLoggingHook
40
40
  logToConsole(level: string, ...args: Array<mixed>): void {
41
+ // $FlowFixMe[invalid-computed-prop]
41
42
  const logFn = levelsMap[level];
42
43
  invariant(
43
44
  logFn,
@@ -12,20 +12,16 @@
12
12
 
13
13
  import type {ReactTestRenderer as ReactTestRendererType} from 'react-test-renderer';
14
14
 
15
+ import TouchableWithoutFeedback from '../Components/Touchable/TouchableWithoutFeedback';
16
+
15
17
  const Switch = require('../Components/Switch/Switch').default;
16
18
  const TextInput = require('../Components/TextInput/TextInput');
17
19
  const View = require('../Components/View/View');
18
20
  const Text = require('../Text/Text');
19
21
  const {VirtualizedList} = require('@react-native/virtualized-lists');
20
22
  const React = require('react');
21
- const ShallowRenderer = require('react-shallow-renderer');
22
23
  const ReactTestRenderer = require('react-test-renderer');
23
24
 
24
- /* $FlowFixMe[not-a-function] (>=0.125.1 site=react_native_fb) This comment
25
- * suppresses an error found when Flow v0.125.1 was deployed. To see the error,
26
- * delete this comment and run Flow. */
27
- // $FlowFixMe[invalid-constructor]
28
- const shallowRenderer = new ShallowRenderer();
29
25
  export type ReactTestInstance = $PropertyType<ReactTestRendererType, 'root'>;
30
26
  export type Predicate = (node: ReactTestInstance) => boolean;
31
27
  /* $FlowFixMe[value-as-type] (>=0.125.1 site=react_native_fb) This comment
@@ -49,6 +45,9 @@ function byClickable(): Predicate {
49
45
  (node.type === Switch && node.props && node.props.disabled !== true) ||
50
46
  (node.type === View &&
51
47
  node?.props?.onStartShouldSetResponder?.testOnly_pressabilityConfig) ||
48
+ (node.type === TouchableWithoutFeedback &&
49
+ node.props &&
50
+ typeof node.props.onPress === 'function') ||
52
51
  // HACK: Find components that use `Pressability`.
53
52
  node.instance?.state?.pressability != null ||
54
53
  // TODO: Remove this after deleting `Touchable`.
@@ -114,7 +113,7 @@ function expectNoConsoleError() {
114
113
  });
115
114
  }
116
115
 
117
- function expectRendersMatchingSnapshot(
116
+ async function expectRendersMatchingSnapshot(
118
117
  name: string,
119
118
  ComponentProvider: () => React.Element<any>,
120
119
  unmockComponent: () => mixed,
@@ -123,7 +122,9 @@ function expectRendersMatchingSnapshot(
123
122
 
124
123
  jest.resetAllMocks();
125
124
 
126
- instance = ReactTestRenderer.create(<ComponentProvider />);
125
+ await ReactTestRenderer.act(() => {
126
+ instance = ReactTestRenderer.create(<ComponentProvider />);
127
+ });
127
128
  expect(instance).toMatchSnapshot(
128
129
  'should deep render when mocked (please verify output manually)',
129
130
  );
@@ -131,22 +132,9 @@ function expectRendersMatchingSnapshot(
131
132
  jest.resetAllMocks();
132
133
  unmockComponent();
133
134
 
134
- instance = shallowRenderer.render(<ComponentProvider />);
135
- expect(instance).toMatchSnapshot(
136
- `should shallow render as <${name} /> when not mocked`,
137
- );
138
-
139
- jest.resetAllMocks();
140
-
141
- instance = shallowRenderer.render(<ComponentProvider />);
142
- expect(instance).toMatchSnapshot(
143
- `should shallow render as <${name} /> when mocked`,
144
- );
145
-
146
- jest.resetAllMocks();
147
- unmockComponent();
148
-
149
- instance = ReactTestRenderer.create(<ComponentProvider />);
135
+ await ReactTestRenderer.act(() => {
136
+ instance = ReactTestRenderer.create(<ComponentProvider />);
137
+ });
150
138
  expect(instance).toMatchSnapshot(
151
139
  'should deep render when not mocked (please verify output manually)',
152
140
  );
@@ -104,16 +104,21 @@ export function getConfigWithoutViewProps(
104
104
  viewConfig: ViewConfig,
105
105
  propName: string,
106
106
  ): {...} {
107
+ // $FlowFixMe[invalid-computed-prop]
107
108
  if (!viewConfig[propName]) {
108
109
  return {};
109
110
  }
110
111
 
111
- return Object.keys(viewConfig[propName])
112
- .filter(prop => !PlatformBaseViewConfig[propName][prop])
113
- .reduce<{[string]: any}>((obj, prop) => {
114
- obj[prop] = viewConfig[propName][prop];
115
- return obj;
116
- }, {});
112
+ return (
113
+ Object.keys(viewConfig[propName])
114
+ // $FlowFixMe[invalid-computed-prop]
115
+ .filter(prop => !PlatformBaseViewConfig[propName][prop])
116
+ .reduce<{[string]: any}>((obj, prop) => {
117
+ // $FlowFixMe[invalid-computed-prop]
118
+ obj[prop] = viewConfig[propName][prop];
119
+ return obj;
120
+ }, {})
121
+ );
117
122
  }
118
123
 
119
124
  export function stringifyViewConfig(viewConfig: any): string {
@@ -2,15 +2,16 @@
2
2
  'use strict';
3
3
 
4
4
  const React = require('react');
5
- const ReactTestRenderer = require('react-test-renderer');
5
+ const renderer = require('react-native/jest/renderer');
6
6
 
7
7
  const {ButtonWin32} = require('@office-iss/react-native-win32');
8
8
 
9
9
  describe('ButtonWin32', () => {
10
- it('renders native component', () => {
11
- const component = ReactTestRenderer.create(
12
- <ButtonWin32/>
13
- );
14
- expect(component).toMatchSnapshot();
10
+ it('renders native component', async () => {
11
+ expect(
12
+ await renderer.create(
13
+ <ButtonWin32/>,
14
+ ),
15
+ ).toMatchSnapshot();
15
16
  });
16
17
  });
@@ -52,6 +52,7 @@ let rejectionTrackingOptions: $NonMaybeType<Parameters<enable>[0]> = {
52
52
  substitutions: [],
53
53
  },
54
54
  componentStack: [],
55
+ componentStackType: null,
55
56
  stack,
56
57
  category: 'possible_unhandled_promise_rejection',
57
58
  });
@@ -50,6 +50,13 @@ module.exports = (moduleName, instanceMethods, isESModule) => {
50
50
  }
51
51
  };
52
52
 
53
+ Object.defineProperty(Component, 'name', {
54
+ value: name,
55
+ writable: false,
56
+ enumerable: false,
57
+ configurable: true,
58
+ });
59
+
53
60
  Component.displayName = nameWithoutPrefix;
54
61
 
55
62
  Object.keys(RealComponent).forEach(classStatic => {
package/jest/renderer.js CHANGED
@@ -9,22 +9,33 @@
9
9
  * @oncall react_native
10
10
  */
11
11
 
12
+ import type {ReactTestRenderer} from 'react-test-renderer';
13
+
14
+ import nullthrows from 'nullthrows';
12
15
  import * as React from 'react';
13
- import ShallowRenderer from 'react-shallow-renderer';
14
16
  import TestRenderer from 'react-test-renderer';
15
17
 
16
- const renderer = new ShallowRenderer();
17
-
18
- export const shallow = (Component: React.Element<any>): any => {
19
- const Wrapper = (): React.Element<any> => Component;
20
-
21
- return renderer.render(<Wrapper />);
22
- };
18
+ export async function create(
19
+ Component: React.Element<any>,
20
+ ): Promise<ReactTestRenderer> {
21
+ let component;
22
+ await TestRenderer.act(async () => {
23
+ component = TestRenderer.create(Component);
24
+ });
25
+ return nullthrows(component);
26
+ }
23
27
 
24
- export const shallowRender = (Component: React.Element<any>): any => {
25
- return renderer.render(Component);
26
- };
28
+ export async function unmount(testRenderer: ReactTestRenderer) {
29
+ await TestRenderer.act(async () => {
30
+ testRenderer.unmount();
31
+ });
32
+ }
27
33
 
28
- export const create = (Component: React.Element<any>): any => {
29
- return TestRenderer.create(Component);
30
- };
34
+ export async function update(
35
+ testRenderer: ReactTestRenderer,
36
+ element: React.Element<any>,
37
+ ) {
38
+ await TestRenderer.act(async () => {
39
+ testRenderer.update(element);
40
+ });
41
+ }
package/jest/setup.js CHANGED
@@ -9,6 +9,11 @@
9
9
 
10
10
  'use strict';
11
11
 
12
+ global.IS_REACT_ACT_ENVIRONMENT = true;
13
+ // Suppress the `react-test-renderer` warnings until New Architecture and legacy
14
+ // mode are no longer supported by React Native.
15
+ global.IS_REACT_NATIVE_TEST_ENVIRONMENT = true;
16
+
12
17
  const MockNativeMethods = jest.requireActual('./MockNativeMethods');
13
18
  const mockComponent = jest.requireActual('./mockComponent');
14
19
 
@@ -112,17 +117,9 @@ jest
112
117
  Constants: {},
113
118
  },
114
119
  }))
115
- .mock('../Libraries/Image/Image', () => {
116
- const Image = mockComponent('../Libraries/Image/Image');
117
- Image.getSize = jest.fn();
118
- Image.getSizeWithHeaders = jest.fn();
119
- Image.prefetch = jest.fn();
120
- Image.prefetchWithMetadata = jest.fn();
121
- Image.queryCache = jest.fn();
122
- Image.resolveAssetSource = jest.fn();
123
-
124
- return Image;
125
- })
120
+ .mock('../Libraries/Image/Image', () =>
121
+ mockComponent('../Libraries/Image/Image'),
122
+ )
126
123
  .mock('../Libraries/Text/Text', () =>
127
124
  mockComponent('../Libraries/Text/Text', MockNativeMethods),
128
125
  )
@@ -145,7 +142,9 @@ jest
145
142
  .mock('../Libraries/Components/AccessibilityInfo/AccessibilityInfo', () => ({
146
143
  __esModule: true,
147
144
  default: {
148
- addEventListener: jest.fn(),
145
+ addEventListener: jest.fn(() => ({
146
+ remove: jest.fn(),
147
+ })),
149
148
  announceForAccessibility: jest.fn(),
150
149
  isAccessibilityServiceEnabled: jest.fn(),
151
150
  isBoldTextEnabled: jest.fn(),
@@ -208,7 +207,9 @@ jest
208
207
  openURL: jest.fn(),
209
208
  canOpenURL: jest.fn(() => Promise.resolve(true)),
210
209
  openSettings: jest.fn(),
211
- addEventListener: jest.fn(),
210
+ addEventListener: jest.fn(() => ({
211
+ remove: jest.fn(),
212
+ })),
212
213
  getInitialURL: jest.fn(() => Promise.resolve()),
213
214
  sendIntent: jest.fn(),
214
215
  }))
@@ -261,7 +262,12 @@ jest
261
262
  },
262
263
  ImageLoader: {
263
264
  getSize: jest.fn(url => Promise.resolve([320, 240])),
265
+ getSizeWithHeaders: jest.fn((url, headers) =>
266
+ Promise.resolve({height: 222, width: 333}),
267
+ ),
264
268
  prefetchImage: jest.fn(),
269
+ prefetchImageWithMetadata: jest.fn(),
270
+ queryCache: jest.fn(),
265
271
  },
266
272
  ImageViewManager: {
267
273
  getSize: jest.fn((uri, success) =>
package/jest.config.js CHANGED
@@ -1,4 +1,5 @@
1
- module.exports = require('@rnx-kit/jest-preset')("win32", {
1
+ module.exports = ("win32", {
2
+ preset: '@rnx-kit/jest-preset',
2
3
  verbose: true,
3
4
  snapshotResolver: './jest-snapshot-resolver.js',
4
5
  transform: {