From 53b12e46a17549ec7644e13c126440ed2f3629fd Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Thu, 1 Feb 2024 13:28:14 -0500 Subject: [PATCH] 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`. --- fixtures/dom/src/__tests__/nested-act-test.js | 4 ++-- .../src/__tests__/storeComponentFilters-test.js | 4 +++- packages/react-devtools-shared/src/__tests__/utils.js | 4 +++- .../react-dom/src/__tests__/ReactDOMHydrationDiff-test.js | 2 +- .../src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js | 2 +- packages/react-dom/src/test-utils/ReactTestUtils.js | 4 +++- .../react-reconciler/src/__tests__/ReactActWarnings-test.js | 2 +- .../src/__tests__/ReactFiberHostContext-test.internal.js | 2 +- .../react-reconciler/src/__tests__/ReactIsomorphicAct-test.js | 2 +- .../src/__tests__/ReactSchedulerIntegration-test.js | 2 +- packages/react-refresh/src/__tests__/ReactFresh-test.js | 4 ++-- .../src/__tests__/ReactFlightDOMForm-test.js | 2 +- packages/react-test-renderer/src/ReactTestRenderer.js | 2 +- packages/react/index.classic.fb.js | 2 +- packages/react/index.experimental.js | 2 +- packages/react/index.js | 2 +- packages/react/index.modern.fb.js | 2 +- packages/react/index.stable.js | 2 +- 18 files changed, 26 insertions(+), 20 deletions(-) diff --git a/fixtures/dom/src/__tests__/nested-act-test.js b/fixtures/dom/src/__tests__/nested-act-test.js index 4a4c63eaad105..6c7f60c2e2f13 100644 --- a/fixtures/dom/src/__tests__/nested-act-test.js +++ b/fixtures/dom/src/__tests__/nested-act-test.js @@ -20,7 +20,7 @@ describe('unmocked scheduler', () => { beforeEach(() => { jest.resetModules(); React = require('react'); - DOMAct = React.unstable_act; + DOMAct = React.act; TestRenderer = require('react-test-renderer'); TestAct = TestRenderer.act; }); @@ -61,7 +61,7 @@ describe('mocked scheduler', () => { require.requireActual('scheduler/unstable_mock') ); React = require('react'); - DOMAct = React.unstable_act; + DOMAct = React.act; TestRenderer = require('react-test-renderer'); TestAct = TestRenderer.act; }); diff --git a/packages/react-devtools-shared/src/__tests__/storeComponentFilters-test.js b/packages/react-devtools-shared/src/__tests__/storeComponentFilters-test.js index 44c7e85217cfd..e2a59177b687f 100644 --- a/packages/react-devtools-shared/src/__tests__/storeComponentFilters-test.js +++ b/packages/react-devtools-shared/src/__tests__/storeComponentFilters-test.js @@ -19,7 +19,9 @@ describe('Store component filters', () => { let utils; const act = async (callback: Function) => { - if (React.unstable_act != null) { + if (React.act != null) { + await React.act(callback); + } else if (React.unstable_act != null) { await React.unstable_act(callback); } else { callback(); diff --git a/packages/react-devtools-shared/src/__tests__/utils.js b/packages/react-devtools-shared/src/__tests__/utils.js index 1a74c1fee9c61..21a6314eebb57 100644 --- a/packages/react-devtools-shared/src/__tests__/utils.js +++ b/packages/react-devtools-shared/src/__tests__/utils.js @@ -21,7 +21,9 @@ export function act( const {act: actTestRenderer} = require('react-test-renderer'); // Use `require('react-dom/test-utils').act` as a fallback for React 17, which can be used in integration tests for React DevTools. const actDOM = - require('react').unstable_act || require('react-dom/test-utils').act; + require('react').act || + require('react').unstable_act || + require('react-dom/test-utils').act; actDOM(() => { actTestRenderer(() => { diff --git a/packages/react-dom/src/__tests__/ReactDOMHydrationDiff-test.js b/packages/react-dom/src/__tests__/ReactDOMHydrationDiff-test.js index 0b6d5dabffe42..76a8229e5a89f 100644 --- a/packages/react-dom/src/__tests__/ReactDOMHydrationDiff-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMHydrationDiff-test.js @@ -25,7 +25,7 @@ describe('ReactDOMServerHydration', () => { React = require('react'); ReactDOMClient = require('react-dom/client'); ReactDOMServer = require('react-dom/server'); - act = React.unstable_act; + act = React.act; console.error = jest.fn(); container = document.createElement('div'); diff --git a/packages/react-dom/src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js b/packages/react-dom/src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js index d7ed05673c67f..45babfd4032d3 100644 --- a/packages/react-dom/src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js +++ b/packages/react-dom/src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js @@ -32,7 +32,7 @@ beforeEach(() => { yields = []; React = require('react'); ReactDOMClient = require('react-dom/client'); - act = React.unstable_act; + act = React.act; container = document.createElement('div'); document.body.appendChild(container); }); diff --git a/packages/react-dom/src/test-utils/ReactTestUtils.js b/packages/react-dom/src/test-utils/ReactTestUtils.js index 568e8327198f1..daea520a61eca 100644 --- a/packages/react-dom/src/test-utils/ReactTestUtils.js +++ b/packages/react-dom/src/test-utils/ReactTestUtils.js @@ -39,7 +39,9 @@ const getFiberCurrentPropsFromNode = EventInternals[2]; const enqueueStateRestore = EventInternals[3]; const restoreStateIfNeeded = EventInternals[4]; -const act = React.unstable_act; +// TODO: Add a warning if this API is accessed with advice to switch to +// importing directly from the React package instead. +const act = React.act; function Event(suffix) {} diff --git a/packages/react-reconciler/src/__tests__/ReactActWarnings-test.js b/packages/react-reconciler/src/__tests__/ReactActWarnings-test.js index 4cf0fd4d3bd12..61cde5648a9e6 100644 --- a/packages/react-reconciler/src/__tests__/ReactActWarnings-test.js +++ b/packages/react-reconciler/src/__tests__/ReactActWarnings-test.js @@ -28,7 +28,7 @@ describe('act warnings', () => { React = require('react'); Scheduler = require('scheduler'); ReactNoop = require('react-noop-renderer'); - act = React.unstable_act; + act = React.act; useState = React.useState; Suspense = React.Suspense; startTransition = React.startTransition; diff --git a/packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.internal.js b/packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.internal.js index 63dc79e6f99d3..0711fb3adb3d0 100644 --- a/packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.internal.js +++ b/packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.internal.js @@ -20,7 +20,7 @@ describe('ReactFiberHostContext', () => { beforeEach(() => { jest.resetModules(); React = require('react'); - act = React.unstable_act; + act = React.act; ReactFiberReconciler = require('react-reconciler'); ConcurrentRoot = require('react-reconciler/src/ReactRootTags').ConcurrentRoot; diff --git a/packages/react-reconciler/src/__tests__/ReactIsomorphicAct-test.js b/packages/react-reconciler/src/__tests__/ReactIsomorphicAct-test.js index 28b5333e4cf4c..6b1c284a7eb9d 100644 --- a/packages/react-reconciler/src/__tests__/ReactIsomorphicAct-test.js +++ b/packages/react-reconciler/src/__tests__/ReactIsomorphicAct-test.js @@ -28,7 +28,7 @@ describe('isomorphic act()', () => { ReactNoop = require('react-noop-renderer'); DiscreteEventPriority = require('react-reconciler/constants').DiscreteEventPriority; - act = React.unstable_act; + act = React.act; use = React.use; Suspense = React.Suspense; startTransition = React.startTransition; diff --git a/packages/react-reconciler/src/__tests__/ReactSchedulerIntegration-test.js b/packages/react-reconciler/src/__tests__/ReactSchedulerIntegration-test.js index 17067638ac811..a29280b36c569 100644 --- a/packages/react-reconciler/src/__tests__/ReactSchedulerIntegration-test.js +++ b/packages/react-reconciler/src/__tests__/ReactSchedulerIntegration-test.js @@ -370,7 +370,7 @@ describe('`act` bypasses Scheduler methods completely,', () => { } const root = ReactNoop.createRoot(); - const publicAct = React.unstable_act; + const publicAct = React.act; const prevIsReactActEnvironment = global.IS_REACT_ACT_ENVIRONMENT; try { global.IS_REACT_ACT_ENVIRONMENT = true; diff --git a/packages/react-refresh/src/__tests__/ReactFresh-test.js b/packages/react-refresh/src/__tests__/ReactFresh-test.js index 8ce009ed72043..94e170e3346e6 100644 --- a/packages/react-refresh/src/__tests__/ReactFresh-test.js +++ b/packages/react-refresh/src/__tests__/ReactFresh-test.js @@ -34,7 +34,7 @@ describe('ReactFresh', () => { ReactDOM = require('react-dom'); ReactDOMClient = require('react-dom/client'); Scheduler = require('scheduler'); - act = React.unstable_act; + act = React.act; internalAct = require('internal-test-utils').act; const InternalTestUtils = require('internal-test-utils'); @@ -3792,7 +3792,7 @@ describe('ReactFresh', () => { React = require('react'); ReactDOM = require('react-dom'); Scheduler = require('scheduler'); - act = React.unstable_act; + act = React.act; internalAct = require('internal-test-utils').act; // Important! Inject into the global hook *after* ReactDOM runs: diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js index b95a6c824f092..dcab688b10c83 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js @@ -54,7 +54,7 @@ describe('ReactFlightDOMForm', () => { ReactServerDOMClient = require('react-server-dom-webpack/client.edge'); ReactDOMServer = require('react-dom/server.edge'); ReactDOMClient = require('react-dom/client'); - act = React.unstable_act; + act = React.act; useFormState = require('react-dom').useFormState; container = document.createElement('div'); document.body.appendChild(container); diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js index 4b19f599db5ac..c82c33811539c 100644 --- a/packages/react-test-renderer/src/ReactTestRenderer.js +++ b/packages/react-test-renderer/src/ReactTestRenderer.js @@ -54,7 +54,7 @@ import {getPublicInstance} from './ReactFiberConfigTestHost'; import {ConcurrentRoot, LegacyRoot} from 'react-reconciler/src/ReactRootTags'; import {allowConcurrentByDefault} from 'shared/ReactFeatureFlags'; -const act = React.unstable_act; +const act = React.act; // TODO: Remove from public bundle diff --git a/packages/react/index.classic.fb.js b/packages/react/index.classic.fb.js index a417f3e755cab..7c84775bb6cc3 100644 --- a/packages/react/index.classic.fb.js +++ b/packages/react/index.classic.fb.js @@ -9,7 +9,7 @@ export { __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, - act as unstable_act, + act, Children, Component, Fragment, diff --git a/packages/react/index.experimental.js b/packages/react/index.experimental.js index dd86090f093e1..c35fd1bd55157 100644 --- a/packages/react/index.experimental.js +++ b/packages/react/index.experimental.js @@ -9,7 +9,7 @@ export { __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, - act as unstable_act, + act, Children, Component, Fragment, diff --git a/packages/react/index.js b/packages/react/index.js index abce6537b5675..70f61f58e070b 100644 --- a/packages/react/index.js +++ b/packages/react/index.js @@ -30,7 +30,7 @@ export type ChildrenArray<+T> = $ReadOnlyArray> | T; // We can't use export * from in Flow for some reason. export { __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, - act as unstable_act, + act, Children, Component, Fragment, diff --git a/packages/react/index.modern.fb.js b/packages/react/index.modern.fb.js index 10ae150f64eef..4f73dded7f7eb 100644 --- a/packages/react/index.modern.fb.js +++ b/packages/react/index.modern.fb.js @@ -9,7 +9,7 @@ export { __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, - act as unstable_act, + act, Children, Component, Fragment, diff --git a/packages/react/index.stable.js b/packages/react/index.stable.js index 9f8e46063782a..2997a62b4a44a 100644 --- a/packages/react/index.stable.js +++ b/packages/react/index.stable.js @@ -9,7 +9,7 @@ export { __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, - act as unstable_act, + act, Children, Component, Fragment,