UNPKG

2.01 kBJavaScriptView Raw
1import React from 'react';
2import ReactDOM from 'react-dom';
3
4function 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
17module.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 // eslint-disable-next-line react/prefer-stateless-function
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 // React will warn if we don't have both arguments.
38 // eslint-disable-next-line no-unused-vars
39 FwdRef = React.forwardRef((props, ref) => null);
40 }
41
42 return {
43 HostRoot: getFiber('test').return.return.tag, // Go two levels above to find the root
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};