@samitouri / QOS-React-2 / commits / 9ad40b1440

[react-dom] Remove `findDOMNode` from OSS builds (#28267)

In the next major `findDOMNode` is being removed. This PR removes the API from the react-dom entrypoints for OSS builds and re-exposes the implementation as part of internals. `findDOMNode` is being retained for Meta builds and so all tests that currently use it will continue to do so by accessing it from internals. Once the replacement API ships in an upcoming minor any tests that were using this API incidentally can be updated to use the new API and any tests asserting `findDOMNode`'s behavior directly can stick around until we remove it entirely (once Meta has moved away from it)

Josh Story committed Mar 27, 2024 at 14:43 UTC 9ad40b1440a2c0b61530f3710e5dae3847611b9c
25 files changed +114 -73
packages/react-dom/index.experimental.js
-1
@@ -12,7 +12,6 @@ export {
12 createPortal,
13 createRoot,
14 hydrateRoot,
15 - findDOMNode,
15 flushSync,
16 unstable_batchedUpdates,
17 unstable_runWithPriority, // DO NOT USE: Temporarily exposed to migrate off of Scheduler.runWithPriority.
packages/react-dom/index.js
-1
@@ -14,7 +14,6 @@ export {
14 createPortal,
15 createRoot,
16 hydrateRoot,
17 - findDOMNode,
17 flushSync,
18 render,
19 unmountComponentAtNode,
packages/react-dom/index.stable.js
-1
@@ -12,7 +12,6 @@ export {
12 createPortal,
13 createRoot,
14 hydrateRoot,
15 - findDOMNode,
15 flushSync,
16 render,
17 unmountComponentAtNode,
packages/react-dom/src/ReactDOMSharedInternals.js
+3
@@ -7,6 +7,7 @@
7 * @flow
8 */
9
10 +import type {FindDOMNodeType} from './client/ReactDOMLegacy.js';
11 import type {HostDispatcher} from './shared/ReactDOMTypes';
12
13 type InternalsType = {
@@ -15,6 +16,7 @@ type InternalsType = {
16 ReactDOMCurrentDispatcher: {
17 current: HostDispatcher,
18 },
19 + findDOMNode: null | FindDOMNodeType,
20 };
21
22 function noop() {}
@@ -35,6 +37,7 @@ const Internals: InternalsType = ({
37 ReactDOMCurrentDispatcher: {
38 current: DefaultDispatcher,
39 },
40 + findDOMNode: null,
41 }: any);
42
43 export default Internals;
packages/react-dom/src/__tests__/ReactComponentLifeCycle-test.js
+4 -1
@@ -15,6 +15,7 @@ let React;
15 let ReactDOM;
16 let ReactDOMClient;
17 let PropTypes;
18 +let findDOMNode;
19
20 const clone = function (o) {
21 return JSON.parse(JSON.stringify(o));
@@ -95,6 +96,8 @@ describe('ReactComponentLifeCycle', () => {
96
97 React = require('react');
98 ReactDOM = require('react-dom');
99 + findDOMNode =
100 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
101 ReactDOMClient = require('react-dom/client');
102 PropTypes = require('prop-types');
103 });
@@ -383,7 +386,7 @@ describe('ReactComponentLifeCycle', () => {
386 }
387 render() {
388 if (this.state.isMounted) {
386 - expect(ReactDOM.findDOMNode(this).tagName).toBe('DIV');
389 + expect(findDOMNode(this).tagName).toBe('DIV');
390 }
391 return <div />;
392 }
packages/react-dom/src/__tests__/ReactDOM-test.js
+4 -1
@@ -11,6 +11,7 @@
11
12 let React;
13 let ReactDOM;
14 +let findDOMNode;
15 let ReactDOMClient;
16 let ReactDOMServer;
17
@@ -21,6 +22,8 @@ describe('ReactDOM', () => {
22 jest.resetModules();
23 React = require('react');
24 ReactDOM = require('react-dom');
25 + findDOMNode =
26 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
27 ReactDOMClient = require('react-dom/client');
28 ReactDOMServer = require('react-dom/server');
29
@@ -494,7 +497,7 @@ describe('ReactDOM', () => {
497 });
498
499 const App = () => {
497 - ReactDOM.findDOMNode(instance);
500 + findDOMNode(instance);
501 return <div />;
502 };
503
packages/react-dom/src/__tests__/ReactDOMComponent-test.js
+5 -1
@@ -2121,7 +2121,11 @@ describe('ReactDOMComponent', () => {
2121
2122 componentWillUnmount() {
2123 // Should not throw
2124 - expect(ReactDOM.findDOMNode(this).nodeName).toBe('SPAN');
2124 + expect(
2125 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
2126 + this,
2127 + ).nodeName,
2128 + ).toBe('SPAN');
2129 }
2130 }
2131
packages/react-dom/src/__tests__/ReactDOMEventListener-test.js
+10 -2
@@ -114,10 +114,18 @@ describe('ReactDOMEventListener', () => {
114 this.setState({clicked: true});
115 };
116 componentDidMount() {
117 - expect(ReactDOM.findDOMNode(this)).toBe(container.firstChild);
117 + expect(
118 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
119 + this,
120 + ),
121 + ).toBe(container.firstChild);
122 }
123 componentDidUpdate() {
120 - expect(ReactDOM.findDOMNode(this)).toBe(container.firstChild);
124 + expect(
125 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
126 + this,
127 + ),
128 + ).toBe(container.firstChild);
129 }
130 render() {
131 if (this.state.clicked) {
packages/react-dom/src/__tests__/ReactDOMLegacyFiber-test.js
+24 -6
@@ -111,7 +111,10 @@ describe('ReactDOMLegacyFiber', () => {
111 container,
112 );
113
114 - const textNode = ReactDOM.findDOMNode(instance);
114 + const textNode =
115 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
116 + instance,
117 + );
118 expect(textNode).toBe(container.firstChild);
119 expect(textNode.nodeType).toBe(3);
120 expect(textNode.nodeValue).toBe('foo');
@@ -130,7 +133,10 @@ describe('ReactDOMLegacyFiber', () => {
133
134 expect(container.childNodes.length).toBe(2);
135
133 - const firstNode = ReactDOM.findDOMNode(instance);
136 + const firstNode =
137 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
138 + instance,
139 + );
140 expect(firstNode).toBe(container.firstChild);
141 expect(firstNode.tagName).toBe('DIV');
142 });
@@ -159,7 +165,10 @@ describe('ReactDOMLegacyFiber', () => {
165
166 expect(container.childNodes.length).toBe(2);
167
162 - const firstNode = ReactDOM.findDOMNode(instance);
168 + const firstNode =
169 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
170 + instance,
171 + );
172 expect(firstNode).toBe(container.firstChild);
173 expect(firstNode.tagName).toBe('DIV');
174 });
@@ -183,7 +192,10 @@ describe('ReactDOMLegacyFiber', () => {
192
193 expect(container.childNodes.length).toBe(2);
194
186 - const firstNode = ReactDOM.findDOMNode(instance);
195 + const firstNode =
196 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
197 + instance,
198 + );
199 expect(firstNode).toBe(container.firstChild);
200 expect(firstNode.tagName).toBe('DIV');
201 });
@@ -878,13 +890,19 @@ describe('ReactDOMLegacyFiber', () => {
890 }
891
892 const myNodeA = ReactDOM.render(<MyNode />, container);
881 - const a = ReactDOM.findDOMNode(myNodeA);
893 + const a =
894 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
895 + myNodeA,
896 + );
897 expect(a.tagName).toBe('DIV');
898
899 const myNodeB = ReactDOM.render(<MyNode flag={true} />, container);
900 expect(myNodeA === myNodeB).toBe(true);
901
887 - const b = ReactDOM.findDOMNode(myNodeB);
902 + const b =
903 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode(
904 + myNodeB,
905 + );
906 expect(b.tagName).toBe('SPAN');
907 });
908
packages/react-dom/src/__tests__/ReactDOMSuspensePlaceholder-test.js
+7 -4
@@ -11,6 +11,7 @@
11
12 let React;
13 let ReactDOM;
14 +let findDOMNode;
15 let ReactDOMClient;
16 let Suspense;
17 let Scheduler;
@@ -24,6 +25,8 @@ describe('ReactDOMSuspensePlaceholder', () => {
25 jest.resetModules();
26 React = require('react');
27 ReactDOM = require('react-dom');
28 + findDOMNode =
29 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
30 ReactDOMClient = require('react-dom/client');
31 Scheduler = require('scheduler');
32 act = require('internal-test-utils').act;
@@ -232,11 +235,11 @@ describe('ReactDOMSuspensePlaceholder', () => {
235 class Child extends React.Component {
236 componentDidMount() {
237 log.push('cDM ' + this.props.id);
235 - ReactDOM.findDOMNode(this);
238 + findDOMNode(this);
239 }
240 componentDidUpdate() {
241 log.push('cDU ' + this.props.id);
239 - ReactDOM.findDOMNode(this);
242 + findDOMNode(this);
243 }
244 render() {
245 return 'child';
@@ -291,12 +294,12 @@ describe('ReactDOMSuspensePlaceholder', () => {
294 class Child extends React.Component {
295 componentDidMount() {
296 log.push('cDM');
294 - ReactDOM.findDOMNode(this);
297 + findDOMNode(this);
298 }
299
300 componentDidUpdate() {
301 log.push('cDU');
299 - ReactDOM.findDOMNode(this);
302 + findDOMNode(this);
303 }
304
305 render() {
packages/react-dom/src/__tests__/ReactEmptyComponent-test.js
+7 -4
@@ -11,6 +11,7 @@
11
12 let React;
13 let ReactDOM;
14 +let findDOMNode;
15 let ReactDOMClient;
16 let TogglingComponent;
17 let act;
@@ -25,6 +26,8 @@ describe('ReactEmptyComponent', () => {
26
27 React = require('react');
28 ReactDOM = require('react-dom');
29 + findDOMNode =
30 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
31 ReactDOMClient = require('react-dom/client');
32 Scheduler = require('scheduler');
33 const InternalTestUtils = require('internal-test-utils');
@@ -37,12 +40,12 @@ describe('ReactEmptyComponent', () => {
40 state = {component: this.props.firstComponent};
41
42 componentDidMount() {
40 - Scheduler.log('mount ' + ReactDOM.findDOMNode(this)?.nodeName);
43 + Scheduler.log('mount ' + findDOMNode(this)?.nodeName);
44 this.setState({component: this.props.secondComponent});
45 }
46
47 componentDidUpdate() {
45 - Scheduler.log('update ' + ReactDOM.findDOMNode(this)?.nodeName);
48 + Scheduler.log('update ' + findDOMNode(this)?.nodeName);
49 }
50
51 render() {
@@ -244,13 +247,13 @@ describe('ReactEmptyComponent', () => {
247 componentDidMount() {
248 // Make sure the DOM node resolves properly even if we're replacing a
249 // `null` component
247 - expect(ReactDOM.findDOMNode(this)).not.toBe(null);
250 + expect(findDOMNode(this)).not.toBe(null);
251 }
252
253 componentWillUnmount() {
254 // Even though we're getting replaced by `null`, we haven't been
255 // replaced yet!
253 - expect(ReactDOM.findDOMNode(this)).not.toBe(null);
256 + expect(findDOMNode(this)).not.toBe(null);
257 }
258 }
259
packages/react-dom/src/__tests__/ReactLegacyCompositeComponent-test.js
+10 -7
@@ -11,6 +11,7 @@
11
12 let React;
13 let ReactDOM;
14 +let findDOMNode;
15 let ReactDOMClient;
16 let PropTypes;
17 let act;
@@ -20,6 +21,8 @@ describe('ReactLegacyCompositeComponent', () => {
21 jest.resetModules();
22 React = require('react');
23 ReactDOM = require('react-dom');
24 + findDOMNode =
25 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
26 ReactDOMClient = require('react-dom/client');
27 PropTypes = require('prop-types');
28 act = require('internal-test-utils').act;
@@ -115,7 +118,7 @@ describe('ReactLegacyCompositeComponent', () => {
118 await act(() => {
119 root.render(<Parent ref={current => (component = current)} />);
120 });
118 - expect(ReactDOM.findDOMNode(component).innerHTML).toBe('bar');
121 + expect(findDOMNode(component).innerHTML).toBe('bar');
122 });
123
124 // @gate !disableLegacyContext
@@ -661,14 +664,14 @@ describe('ReactLegacyCompositeComponent', () => {
664
665 const container = document.createElement('div');
666 const comp = ReactDOM.render(<Component flipped={false} />, container);
664 - expect(ReactDOM.findDOMNode(comp.static0Ref.current).textContent).toBe('A');
665 - expect(ReactDOM.findDOMNode(comp.static1Ref.current).textContent).toBe('B');
667 + expect(findDOMNode(comp.static0Ref.current).textContent).toBe('A');
668 + expect(findDOMNode(comp.static1Ref.current).textContent).toBe('B');
669
670 // When flipping the order, the refs should update even though the actual
671 // contents do not
672 ReactDOM.render(<Component flipped={true} />, container);
670 - expect(ReactDOM.findDOMNode(comp.static0Ref.current).textContent).toBe('B');
671 - expect(ReactDOM.findDOMNode(comp.static1Ref.current).textContent).toBe('A');
673 + expect(findDOMNode(comp.static0Ref.current).textContent).toBe('B');
674 + expect(findDOMNode(comp.static1Ref.current).textContent).toBe('A');
675 });
676
677 // @gate !disableLegacyMode
@@ -678,12 +681,12 @@ describe('ReactLegacyCompositeComponent', () => {
681
682 class Component extends React.Component {
683 componentDidMount() {
681 - a = ReactDOM.findDOMNode(this);
684 + a = findDOMNode(this);
685 expect(a).not.toBe(null);
686 }
687
688 componentWillUnmount() {
686 - b = ReactDOM.findDOMNode(this);
689 + b = findDOMNode(this);
690 expect(b).not.toBe(null);
691 }
692
packages/react-dom/src/__tests__/ReactLegacyUpdates-test.js
+8 -5
@@ -11,6 +11,7 @@
11
12 let React;
13 let ReactDOM;
14 +let findDOMNode;
15 let act;
16 let Scheduler;
17 let assertLog;
@@ -22,6 +23,8 @@ describe('ReactLegacyUpdates', () => {
23 jest.resetModules();
24 React = require('react');
25 ReactDOM = require('react-dom');
26 + findDOMNode =
27 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
28 act = require('internal-test-utils').act;
29 Scheduler = require('scheduler');
30
@@ -561,7 +564,7 @@ describe('ReactLegacyUpdates', () => {
564 state = {x: 0};
565
566 componentDidUpdate() {
564 - expect(ReactDOM.findDOMNode(b).textContent).toBe('B1');
567 + expect(findDOMNode(b).textContent).toBe('B1');
568 aUpdated = true;
569 }
570
@@ -699,7 +702,7 @@ describe('ReactLegacyUpdates', () => {
702 depth={this.props.depth + 1}
703 count={this.props.count}
704 />,
702 - ReactDOM.findDOMNode(this),
705 + findDOMNode(this),
706 );
707 }
708 }
@@ -770,10 +773,10 @@ describe('ReactLegacyUpdates', () => {
773 const x = ReactDOM.render(<X />, container);
774 container = document.createElement('div');
775 const y = ReactDOM.render(<Y />, container);
773 - expect(ReactDOM.findDOMNode(x).textContent).toBe('0');
776 + expect(findDOMNode(x).textContent).toBe('0');
777
778 y.forceUpdate();
776 - expect(ReactDOM.findDOMNode(x).textContent).toBe('1');
779 + expect(findDOMNode(x).textContent).toBe('1');
780 });
781
782 // @gate !disableLegacyMode
@@ -816,7 +819,7 @@ describe('ReactLegacyUpdates', () => {
819 });
820
821 expect(a.state.x).toBe(1);
819 - expect(ReactDOM.findDOMNode(a).textContent).toBe('A1');
822 + expect(findDOMNode(a).textContent).toBe('A1');
823 });
824
825 // @gate !disableLegacyMode
packages/react-dom/src/__tests__/ReactUpdates-test.js
+7 -4
@@ -11,6 +11,7 @@
11
12 let React;
13 let ReactDOM;
14 +let findDOMNode;
15 let ReactDOMClient;
16 let act;
17 let Scheduler;
@@ -23,6 +24,8 @@ describe('ReactUpdates', () => {
24 jest.resetModules();
25 React = require('react');
26 ReactDOM = require('react-dom');
27 + findDOMNode =
28 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
29 ReactDOMClient = require('react-dom/client');
30 act = require('internal-test-utils').act;
31 Scheduler = require('scheduler');
@@ -659,7 +662,7 @@ describe('ReactUpdates', () => {
662 a = this;
663 }
664 componentDidUpdate() {
662 - expect(ReactDOM.findDOMNode(b).textContent).toBe('B1');
665 + expect(findDOMNode(b).textContent).toBe('B1');
666 aUpdated = true;
667 }
668
@@ -801,7 +804,7 @@ describe('ReactUpdates', () => {
804 componentDidMount() {
805 instances.push(this);
806 if (this.props.depth < this.props.count) {
804 - const root = ReactDOMClient.createRoot(ReactDOM.findDOMNode(this));
807 + const root = ReactDOMClient.createRoot(findDOMNode(this));
808 root.render(
809 <MockComponent
810 depth={this.props.depth + 1}
@@ -889,12 +892,12 @@ describe('ReactUpdates', () => {
892 root.render(<Y ref={current => (y = current)} />);
893 });
894
892 - expect(ReactDOM.findDOMNode(x).textContent).toBe('0');
895 + expect(findDOMNode(x).textContent).toBe('0');
896
897 await act(() => {
898 y.forceUpdate();
899 });
897 - expect(ReactDOM.findDOMNode(x).textContent).toBe('1');
900 + expect(findDOMNode(x).textContent).toBe('1');
901 });
902
903 it('should queue updates from during mount', async () => {
packages/react-dom/src/__tests__/findDOMNode-test.js
+12 -10
@@ -11,11 +11,13 @@
11
12 const React = require('react');
13 const ReactDOM = require('react-dom');
14 +const findDOMNode =
15 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
16 const StrictMode = React.StrictMode;
17
18 describe('findDOMNode', () => {
19 it('findDOMNode should return null if passed null', () => {
18 - expect(ReactDOM.findDOMNode(null)).toBe(null);
20 + expect(findDOMNode(null)).toBe(null);
21 });
22
23 // @gate !disableLegacyMode
@@ -32,8 +34,8 @@ describe('findDOMNode', () => {
34
35 const container = document.createElement('div');
36 const myNode = ReactDOM.render(<MyNode />, container);
35 - const myDiv = ReactDOM.findDOMNode(myNode);
36 - const mySameDiv = ReactDOM.findDOMNode(myDiv);
37 + const myDiv = findDOMNode(myNode);
38 + const mySameDiv = findDOMNode(myDiv);
39 expect(myDiv.tagName).toBe('DIV');
40 expect(mySameDiv).toBe(myDiv);
41 });
@@ -55,19 +57,19 @@ describe('findDOMNode', () => {
57 const container = document.createElement('div');
58
59 const myNodeA = ReactDOM.render(<MyNode />, container);
58 - const a = ReactDOM.findDOMNode(myNodeA);
60 + const a = findDOMNode(myNodeA);
61 expect(a).toBe(null);
62
63 const myNodeB = ReactDOM.render(<MyNode flag={true} />, container);
64 expect(myNodeA === myNodeB).toBe(true);
65
64 - const b = ReactDOM.findDOMNode(myNodeB);
66 + const b = findDOMNode(myNodeB);
67 expect(b.tagName).toBe('SPAN');
68 });
69
70 it('findDOMNode should reject random objects', () => {
71 expect(function () {
70 - ReactDOM.findDOMNode({foo: 'bar'});
72 + findDOMNode({foo: 'bar'});
73 }).toThrowError('Argument appears to not be a ReactComponent. Keys: foo');
74 });
75
@@ -83,7 +85,7 @@ describe('findDOMNode', () => {
85 const inst = ReactDOM.render(<Foo />, container);
86 ReactDOM.unmountComponentAtNode(container);
87
86 - expect(() => ReactDOM.findDOMNode(inst)).toThrowError(
88 + expect(() => findDOMNode(inst)).toThrowError(
89 'Unable to find node on an unmounted component.',
90 );
91 });
@@ -92,7 +94,7 @@ describe('findDOMNode', () => {
94 it('findDOMNode should not throw an error when called within a component that is not mounted', () => {
95 class Bar extends React.Component {
96 UNSAFE_componentWillMount() {
95 - expect(ReactDOM.findDOMNode(this)).toBeNull();
97 + expect(findDOMNode(this)).toBeNull();
98 }
99
100 render() {
@@ -127,7 +129,7 @@ describe('findDOMNode', () => {
129 );
130
131 let match;
130 - expect(() => (match = ReactDOM.findDOMNode(parent))).toErrorDev([
132 + expect(() => (match = findDOMNode(parent))).toErrorDev([
133 'Warning: findDOMNode is deprecated in StrictMode. ' +
134 'findDOMNode was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
135 'Instead, add a ref directly to the element you want to reference. ' +
@@ -160,7 +162,7 @@ describe('findDOMNode', () => {
162 );
163
164 let match;
163 - expect(() => (match = ReactDOM.findDOMNode(parent))).toErrorDev([
165 + expect(() => (match = findDOMNode(parent))).toErrorDev([
166 'Warning: findDOMNode is deprecated in StrictMode. ' +
167 'findDOMNode was passed an instance of IsInStrictMode which is inside StrictMode. ' +
168 'Instead, add a ref directly to the element you want to reference. ' +
packages/react-dom/src/__tests__/react-dom-server-rendering-stub-test.js
+3
@@ -30,6 +30,9 @@ describe('react-dom-server-rendering-stub', () => {
30 expect(ReactDOM.createRoot).toBe(undefined);
31 expect(ReactDOM.hydrateRoot).toBe(undefined);
32 expect(ReactDOM.findDOMNode).toBe(undefined);
33 + expect(
34 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode,
35 + ).toBe(null);
36 expect(ReactDOM.hydrate).toBe(undefined);
37 expect(ReactDOM.render).toBe(undefined);
38 expect(ReactDOM.unmountComponentAtNode).toBe(undefined);
packages/react-dom/src/client/ReactDOM.js
+3
@@ -164,6 +164,9 @@ function flushSync<R>(fn: (() => R) | void): R | void {
164 return flushSyncWithoutWarningIfAlreadyRendering(fn);
165 }
166
167 +// Expose findDOMNode on internals
168 +Internals.findDOMNode = findDOMNode;
169 +
170 export {
171 createPortal,
172 batchedUpdates as unstable_batchedUpdates,
packages/react-dom/src/client/ReactDOMLegacy.js
+2
@@ -234,6 +234,8 @@ function legacyRenderSubtreeIntoContainer(
234 return getPublicRootInstance(root);
235 }
236
237 +export type FindDOMNodeType = typeof findDOMNode;
238 +
239 export function findDOMNode(
240 componentOrElement: Element | ?React$Component<any, any>,
241 ): null | Element | Text {
packages/react-dom/unstable_testing.experimental.js
-1
@@ -9,7 +9,6 @@
9
10 export {
11 createPortal,
12 - findDOMNode,
12 flushSync,
13 unstable_batchedUpdates,
14 useFormStatus,
packages/react-dom/unstable_testing.js
-1
@@ -9,7 +9,6 @@
9
10 export {
11 createPortal,
12 - findDOMNode,
12 flushSync,
13 render,
14 unmountComponentAtNode,
packages/react-dom/unstable_testing.stable.js
-1
@@ -9,7 +9,6 @@
9
10 export {
11 createPortal,
12 - findDOMNode,
12 flushSync,
13 render,
14 unmountComponentAtNode,
packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee
-6
@@ -562,10 +562,4 @@ describe 'ReactCoffeeScriptClass', ->
562 ]);
563 expect(ref.current.refs.inner.getName()).toBe 'foo'
564
565 - it 'supports drilling through to the DOM using findDOMNode', ->
566 - ref = React.createRef()
567 - test React.createElement(InnerComponent, name: 'foo', ref: ref), 'DIV', 'foo'
568 - node = ReactDOM.findDOMNode(ref.current)
569 - expect(node).toBe container.firstChild
570 -
565 undefined
packages/react/src/__tests__/ReactES6Class-test.js
-7
@@ -607,11 +607,4 @@ describe('ReactES6Class', () => {
607 expect(ref.current.refs.inner.getName()).toBe('foo');
608 });
609 }
610 -
611 - it('supports drilling through to the DOM using findDOMNode', () => {
612 - const ref = React.createRef();
613 - test(<Inner name="foo" ref={ref} />, 'DIV', 'foo');
614 - const node = ReactDOM.findDOMNode(ref.current);
615 - expect(node).toBe(container.firstChild);
616 - });
610 });
packages/react/src/__tests__/ReactJSXRuntime-test.js
+5 -2
@@ -15,6 +15,7 @@ let ReactDOMClient;
15 let JSXRuntime;
16 let JSXDEVRuntime;
17 let act;
18 +let findDOMNode;
19
20 // NOTE: Prefer to call the JSXRuntime directly in these tests so we can be
21 // certain that we are testing the runtime behavior, as opposed to the Babel
@@ -29,6 +30,8 @@ describe('ReactJSXRuntime', () => {
30 ReactDOM = require('react-dom');
31 ReactDOMClient = require('react-dom/client');
32 act = require('internal-test-utils').act;
33 + findDOMNode =
34 + ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.findDOMNode;
35 });
36
37 it('allows static methods to be called using the type property', () => {
@@ -130,9 +133,9 @@ describe('ReactJSXRuntime', () => {
133
134 const outer = container.firstChild;
135 if (__DEV__) {
133 - expect(ReactDOM.findDOMNode(outer).className).toBe('moo');
136 + expect(findDOMNode(outer).className).toBe('moo');
137 } else {
135 - expect(ReactDOM.findDOMNode(outer).className).toBe('quack');
138 + expect(findDOMNode(outer).className).toBe('quack');
139 }
140 });
141
packages/react/src/__tests__/ReactTypeScriptClass-test.ts
-7
@@ -709,11 +709,4 @@ describe('ReactTypeScriptClass', function() {
709 expect(ref.current.refs.inner.getName()).toBe('foo');
710 });
711 }
712 -
713 - it('supports drilling through to the DOM using findDOMNode', function() {
714 - const ref = React.createRef();
715 - test(React.createElement(Inner, {name: 'foo', ref: ref}), 'DIV', 'foo');
716 - const node = ReactDOM.findDOMNode(ref.current);
717 - expect(node).toBe(container.firstChild);
718 - });
712 });