/
getReactStack.js
59 lines (51 loc) · 1.3 KB
/
getReactStack.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* eslint-disable no-underscore-dangle */
import ReactDOM from 'react-dom'
import hydrateFiberStack from './stack/hydrateFiberStack'
import hydrateLegacyStack from './stack/hydrateLegacyStack'
import { getInternalInstance } from './reactUtils'
function getReactStack(instance) {
const rootNode = getInternalInstance(instance)
const stack = {}
if (rootNode) {
// React stack
const isFiber = typeof rootNode.tag === 'number'
if (isFiber) {
hydrateFiberStack(rootNode, stack)
} else {
hydrateLegacyStack(rootNode, stack)
}
} else {
// Non-React stack
// preact? // inferno?
// there is no known VDOM to get stack from
}
return stack
}
const markUpdate = ({ fiber }) => {
if (!fiber) {
return
}
fiber.expirationTime = 1
if (fiber.alternate) {
fiber.alternate.expirationTime = 1
fiber.alternate.type = fiber.type
}
if (fiber.memoizedProps && typeof fiber.memoizedProps === 'object') {
fiber.memoizedProps = {
cacheBusterProp: true,
...fiber.memoizedProps,
}
}
}
export const cleanupReact = () => {
if (ReactDOM.hotCleanup) {
ReactDOM.hotCleanup()
}
}
export const deepMarkUpdate = stack => {
markUpdate(stack)
if (stack.children) {
stack.children.forEach(deepMarkUpdate)
}
}
export default getReactStack