Add stable React.act export (#28160)
Starting in version 19, users can import the `act` testing API from the `react` package instead of using a renderer specific API, like `react-dom/test-utils`.
Andrew Clark committed
Feb 1, 2024 at 13:28 UTC
53b12e46a17549ec7644e13c126440ed2f3629fd
18 files changed
+26
-20
fixtures/dom/src/__tests__/nested-act-test.js
+2
-2
@@ -20,7 +20,7 @@ describe('unmocked scheduler', () => {
20
beforeEach(() => {
21
jest.resetModules();
22
React = require('react');
23
- DOMAct = React.unstable_act;
23
+ DOMAct = React.act;
24
TestRenderer = require('react-test-renderer');
25
TestAct = TestRenderer.act;
26
});
@@ -61,7 +61,7 @@ describe('mocked scheduler', () => {
61
require.requireActual('scheduler/unstable_mock')
62
);
63
React = require('react');
64
- DOMAct = React.unstable_act;
64
+ DOMAct = React.act;
65
TestRenderer = require('react-test-renderer');
66
TestAct = TestRenderer.act;
67
});
packages/react-devtools-shared/src/__tests__/storeComponentFilters-test.js
+3
-1
@@ -19,7 +19,9 @@ describe('Store component filters', () => {
19
let utils;
20
21
const act = async (callback: Function) => {
22
- if (React.unstable_act != null) {
22
+ if (React.act != null) {
23
+ await React.act(callback);
24
+ } else if (React.unstable_act != null) {
25
await React.unstable_act(callback);
26
} else {
27
callback();
packages/react-devtools-shared/src/__tests__/utils.js
+3
-1
@@ -21,7 +21,9 @@ export function act(
21
const {act: actTestRenderer} = require('react-test-renderer');
22
// Use `require('react-dom/test-utils').act` as a fallback for React 17, which can be used in integration tests for React DevTools.
23
const actDOM =
24
- require('react').unstable_act || require('react-dom/test-utils').act;
24
+ require('react').act ||
25
+ require('react').unstable_act ||
26
+ require('react-dom/test-utils').act;
27
28
actDOM(() => {
29
actTestRenderer(() => {
packages/react-dom/src/__tests__/ReactDOMHydrationDiff-test.js
+1
-1
@@ -25,7 +25,7 @@ describe('ReactDOMServerHydration', () => {
25
React = require('react');
26
ReactDOMClient = require('react-dom/client');
27
ReactDOMServer = require('react-dom/server');
28
- act = React.unstable_act;
28
+ act = React.act;
29
30
console.error = jest.fn();
31
container = document.createElement('div');
packages/react-dom/src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js
+1
-1
@@ -32,7 +32,7 @@ beforeEach(() => {
32
yields = [];
33
React = require('react');
34
ReactDOMClient = require('react-dom/client');
35
- act = React.unstable_act;
35
+ act = React.act;
36
container = document.createElement('div');
37
document.body.appendChild(container);
38
});
packages/react-dom/src/test-utils/ReactTestUtils.js
+3
-1
@@ -39,7 +39,9 @@ const getFiberCurrentPropsFromNode = EventInternals[2];
39
const enqueueStateRestore = EventInternals[3];
40
const restoreStateIfNeeded = EventInternals[4];
41
42
-const act = React.unstable_act;
42
+// TODO: Add a warning if this API is accessed with advice to switch to
43
+// importing directly from the React package instead.
44
+const act = React.act;
45
46
function Event(suffix) {}
47
packages/react-reconciler/src/__tests__/ReactActWarnings-test.js
+1
-1
@@ -28,7 +28,7 @@ describe('act warnings', () => {
28
React = require('react');
29
Scheduler = require('scheduler');
30
ReactNoop = require('react-noop-renderer');
31
- act = React.unstable_act;
31
+ act = React.act;
32
useState = React.useState;
33
Suspense = React.Suspense;
34
startTransition = React.startTransition;
packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.internal.js
+1
-1
@@ -20,7 +20,7 @@ describe('ReactFiberHostContext', () => {
20
beforeEach(() => {
21
jest.resetModules();
22
React = require('react');
23
- act = React.unstable_act;
23
+ act = React.act;
24
ReactFiberReconciler = require('react-reconciler');
25
ConcurrentRoot =
26
require('react-reconciler/src/ReactRootTags').ConcurrentRoot;
packages/react-reconciler/src/__tests__/ReactIsomorphicAct-test.js
+1
-1
@@ -28,7 +28,7 @@ describe('isomorphic act()', () => {
28
ReactNoop = require('react-noop-renderer');
29
DiscreteEventPriority =
30
require('react-reconciler/constants').DiscreteEventPriority;
31
- act = React.unstable_act;
31
+ act = React.act;
32
use = React.use;
33
Suspense = React.Suspense;
34
startTransition = React.startTransition;
packages/react-reconciler/src/__tests__/ReactSchedulerIntegration-test.js
+1
-1
@@ -370,7 +370,7 @@ describe('`act` bypasses Scheduler methods completely,', () => {
370
}
371
372
const root = ReactNoop.createRoot();
373
- const publicAct = React.unstable_act;
373
+ const publicAct = React.act;
374
const prevIsReactActEnvironment = global.IS_REACT_ACT_ENVIRONMENT;
375
try {
376
global.IS_REACT_ACT_ENVIRONMENT = true;
packages/react-refresh/src/__tests__/ReactFresh-test.js
+2
-2
@@ -34,7 +34,7 @@ describe('ReactFresh', () => {
34
ReactDOM = require('react-dom');
35
ReactDOMClient = require('react-dom/client');
36
Scheduler = require('scheduler');
37
- act = React.unstable_act;
37
+ act = React.act;
38
internalAct = require('internal-test-utils').act;
39
40
const InternalTestUtils = require('internal-test-utils');
@@ -3792,7 +3792,7 @@ describe('ReactFresh', () => {
3792
React = require('react');
3793
ReactDOM = require('react-dom');
3794
Scheduler = require('scheduler');
3795
- act = React.unstable_act;
3795
+ act = React.act;
3796
internalAct = require('internal-test-utils').act;
3797
3798
// Important! Inject into the global hook *after* ReactDOM runs:
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js
+1
-1
@@ -54,7 +54,7 @@ describe('ReactFlightDOMForm', () => {
54
ReactServerDOMClient = require('react-server-dom-webpack/client.edge');
55
ReactDOMServer = require('react-dom/server.edge');
56
ReactDOMClient = require('react-dom/client');
57
- act = React.unstable_act;
57
+ act = React.act;
58
useFormState = require('react-dom').useFormState;
59
container = document.createElement('div');
60
document.body.appendChild(container);
packages/react-test-renderer/src/ReactTestRenderer.js
+1
-1
@@ -54,7 +54,7 @@ import {getPublicInstance} from './ReactFiberConfigTestHost';
54
import {ConcurrentRoot, LegacyRoot} from 'react-reconciler/src/ReactRootTags';
55
import {allowConcurrentByDefault} from 'shared/ReactFeatureFlags';
56
57
-const act = React.unstable_act;
57
+const act = React.act;
58
59
// TODO: Remove from public bundle
60
packages/react/index.classic.fb.js
+1
-1
@@ -9,7 +9,7 @@
9
10
export {
11
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
12
- act as unstable_act,
12
+ act,
13
Children,
14
Component,
15
Fragment,
packages/react/index.experimental.js
+1
-1
@@ -9,7 +9,7 @@
9
10
export {
11
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
12
- act as unstable_act,
12
+ act,
13
Children,
14
Component,
15
Fragment,
packages/react/index.js
+1
-1
@@ -30,7 +30,7 @@ export type ChildrenArray<+T> = $ReadOnlyArray<ChildrenArray<T>> | T;
30
// We can't use export * from in Flow for some reason.
31
export {
32
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
33
- act as unstable_act,
33
+ act,
34
Children,
35
Component,
36
Fragment,
packages/react/index.modern.fb.js
+1
-1
@@ -9,7 +9,7 @@
9
10
export {
11
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
12
- act as unstable_act,
12
+ act,
13
Children,
14
Component,
15
Fragment,
packages/react/index.stable.js
+1
-1
@@ -9,7 +9,7 @@
9
10
export {
11
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
12
- act as unstable_act,
12
+ act,
13
Children,
14
Component,
15
Fragment,