1 | import React from 'react';
|
2 | import ReactDOM from 'react-dom';
|
3 |
|
4 | function getFiber(element) {
|
5 | const container = global.document.createElement('div');
|
6 | let inst = null;
|
7 | class Tester extends React.Component {
|
8 | render() {
|
9 | inst = this;
|
10 | return element;
|
11 | }
|
12 | }
|
13 | ReactDOM.render(React.createElement(Tester), container);
|
14 | return inst._reactInternalFiber.child;
|
15 | }
|
16 |
|
17 | module.exports = function detectFiberTags() {
|
18 | const supportsMode = typeof React.StrictMode !== 'undefined';
|
19 | const supportsContext = typeof React.createContext !== 'undefined';
|
20 | const supportsForwardRef = typeof React.forwardRef !== 'undefined';
|
21 |
|
22 | function Fn() {
|
23 | return null;
|
24 | }
|
25 |
|
26 | class Cls extends React.Component {
|
27 | render() {
|
28 | return null;
|
29 | }
|
30 | }
|
31 | let Ctx = null;
|
32 | let FwdRef = null;
|
33 | if (supportsContext) {
|
34 | Ctx = React.createContext();
|
35 | }
|
36 | if (supportsForwardRef) {
|
37 |
|
38 |
|
39 | FwdRef = React.forwardRef((props, ref) => null);
|
40 | }
|
41 |
|
42 | return {
|
43 | HostRoot: getFiber('test').return.return.tag,
|
44 | ClassComponent: getFiber(React.createElement(Cls)).tag,
|
45 | Fragment: getFiber([['nested']]).tag,
|
46 | FunctionalComponent: getFiber(React.createElement(Fn)).tag,
|
47 | HostPortal: getFiber(ReactDOM.createPortal(null, global.document.createElement('div'))).tag,
|
48 | HostComponent: getFiber(React.createElement('span')).tag,
|
49 | HostText: getFiber('text').tag,
|
50 | Mode: supportsMode
|
51 | ? getFiber(React.createElement(React.StrictMode)).tag
|
52 | : -1,
|
53 | ContextConsumer: supportsContext
|
54 | ? getFiber(React.createElement(Ctx.Consumer, null, () => null)).tag
|
55 | : -1,
|
56 | ContextProvider: supportsContext
|
57 | ? getFiber(React.createElement(Ctx.Provider, { value: null })).tag
|
58 | : -1,
|
59 | ForwardRef: supportsForwardRef
|
60 | ? getFiber(React.createElement(FwdRef)).tag
|
61 | : -1,
|
62 | };
|
63 | };
|