@@ -48,9 +48,9 @@ ruleTester.run('no-deprecated', rule, {
48
48
// Not deprecated
49
49
'var element = React.createElement(\'p\', {}, null);' ,
50
50
'var clone = React.cloneElement(element);' ,
51
- 'ReactDOM.render(element, container);' ,
52
- 'ReactDOM.unmountComponentAtNode(container);' ,
51
+ 'ReactDOM.cloneElement(child, container);' ,
53
52
'ReactDOM.findDOMNode(instance);' ,
53
+ 'ReactDOM.createPortal(child, container);' ,
54
54
'ReactDOMServer.renderToString(element);' ,
55
55
'ReactDOMServer.renderToStaticMarkup(element);' ,
56
56
{
@@ -119,6 +119,29 @@ ruleTester.run('no-deprecated', rule, {
119
119
let { default: defaultReactExport, ...allReactExports } = React;
120
120
` ,
121
121
} ,
122
+ // React 18 API
123
+ {
124
+ code : `
125
+ import ReactDOM, { createRoot } from 'react-dom/client';
126
+ ReactDOM.createRoot(container);
127
+ const root = createRoot(container);
128
+ root.unmount();
129
+ ` ,
130
+ } ,
131
+ {
132
+ code : `
133
+ import ReactDOM, { hydrateRoot } from 'react-dom/client';
134
+ ReactDOM.hydrateRoot(container, <App/>);
135
+ hydrateRoot(container, <App/>);
136
+ ` ,
137
+ } ,
138
+ {
139
+ code : `
140
+ import ReactDOMServer, { renderToPipeableStream } from 'react-dom/server';
141
+ ReactDOMServer.renderToPipeableStream(<App />, {});
142
+ renderToPipeableStream(<App />, {});
143
+ ` ,
144
+ } ,
122
145
] ) ,
123
146
124
147
invalid : parsers . all ( [
@@ -454,5 +477,93 @@ ruleTester.run('no-deprecated', rule, {
454
477
) ,
455
478
] ,
456
479
} ,
480
+ {
481
+ code : `
482
+ import { render } from 'react-dom';
483
+ ReactDOM.render(<div></div>, container);
484
+ ` ,
485
+ errors : [
486
+ errorMessage (
487
+ 'ReactDOM.render' ,
488
+ '18.0.0' ,
489
+ 'createRoot' ,
490
+ 'https://reactjs.org/link/switch-to-createroot' ,
491
+ { type : 'ImportDeclaration' , line : 2 , column : 9 }
492
+ ) ,
493
+ errorMessage (
494
+ 'ReactDOM.render' ,
495
+ '18.0.0' ,
496
+ 'createRoot' ,
497
+ 'https://reactjs.org/link/switch-to-createroot' ,
498
+ { type : 'MemberExpression' , line : 3 , column : 9 }
499
+ ) ,
500
+ ] ,
501
+ } ,
502
+ {
503
+ code : `
504
+ import { hydrate } from 'react-dom';
505
+ ReactDOM.hydrate(<div></div>, container);
506
+ ` ,
507
+ errors : [
508
+ errorMessage (
509
+ 'ReactDOM.hydrate' ,
510
+ '18.0.0' ,
511
+ 'hydrateRoot' ,
512
+ 'https://reactjs.org/link/switch-to-createroot' ,
513
+ { type : 'ImportDeclaration' , line : 2 , column : 9 }
514
+ ) ,
515
+ errorMessage (
516
+ 'ReactDOM.hydrate' ,
517
+ '18.0.0' ,
518
+ 'hydrateRoot' ,
519
+ 'https://reactjs.org/link/switch-to-createroot' ,
520
+ { type : 'MemberExpression' , line : 3 , column : 9 }
521
+ ) ,
522
+ ] ,
523
+ } ,
524
+ {
525
+ code : `
526
+ import { unmountComponentAtNode } from 'react-dom';
527
+ ReactDOM.unmountComponentAtNode(container);
528
+ ` ,
529
+ errors : [
530
+ errorMessage (
531
+ 'ReactDOM.unmountComponentAtNode' ,
532
+ '18.0.0' ,
533
+ 'root.unmount' ,
534
+ 'https://reactjs.org/link/switch-to-createroot' ,
535
+ { type : 'ImportDeclaration' , line : 2 , column : 9 }
536
+ ) ,
537
+ errorMessage (
538
+ 'ReactDOM.unmountComponentAtNode' ,
539
+ '18.0.0' ,
540
+ 'root.unmount' ,
541
+ 'https://reactjs.org/link/switch-to-createroot' ,
542
+ { type : 'MemberExpression' , line : 3 , column : 9 }
543
+ ) ,
544
+ ] ,
545
+ } ,
546
+ {
547
+ code : `
548
+ import { renderToNodeStream } from 'react-dom/server';
549
+ ReactDOMServer.renderToNodeStream(element);
550
+ ` ,
551
+ errors : [
552
+ errorMessage (
553
+ 'ReactDOMServer.renderToNodeStream' ,
554
+ '18.0.0' ,
555
+ 'renderToPipeableStream' ,
556
+ 'https://reactjs.org/docs/react-dom-server.html#rendertonodestream' ,
557
+ { type : 'ImportDeclaration' , line : 2 , column : 9 }
558
+ ) ,
559
+ errorMessage (
560
+ 'ReactDOMServer.renderToNodeStream' ,
561
+ '18.0.0' ,
562
+ 'renderToPipeableStream' ,
563
+ 'https://reactjs.org/docs/react-dom-server.html#rendertonodestream' ,
564
+ { type : 'MemberExpression' , line : 3 , column : 9 }
565
+ ) ,
566
+ ] ,
567
+ } ,
457
568
] ) ,
458
569
} ) ;
0 commit comments