/
getReactStack.js
78 lines (67 loc) · 2.03 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* eslint-disable no-underscore-dangle */
import ReactDOM from 'react-dom';
import hydrateFiberStack from './stack/hydrateFiberStack';
import hydrateLegacyStack from './stack/hydrateLegacyStack';
import { getInternalInstance } from './reactUtils';
import { resolveType } from '../reconciler/resolver';
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 }) => {
// do not update what we should not
if (!fiber || typeof fiber.type === 'string') {
return;
}
const mostResentType = resolveType(fiber.type) || fiber.type;
if (fiber.elementType === fiber.type) {
// DO NOT update elementType - or will not be able to catch un update
// fiber.elementType = mostResentType;
}
fiber.type = mostResentType;
fiber.expirationTime = 1;
if (fiber.alternate) {
fiber.alternate.expirationTime = 1;
fiber.alternate.type = fiber.type;
// elementType might not exists in older react versions
if ('elementType' in fiber.alternate) {
// fiber.alternate.elementType = fiber.elementType;
}
}
if (fiber.memoizedProps && typeof fiber.memoizedProps === 'object') {
fiber.memoizedProps = {
cacheBusterProp: true,
...fiber.memoizedProps,
};
}
if (fiber.stateNode) {
// TODO: this might work better React 16, but breaking tests for React 15 changing "updates" counts.
// updateInstance(fiber.stateNode);
}
};
export const cleanupReact = () => {
if (ReactDOM.hotCleanup) {
ReactDOM.hotCleanup();
}
};
export const deepMarkUpdate = stack => {
markUpdate(stack);
if (stack.children) {
stack.children.forEach(deepMarkUpdate);
}
};
export default getReactStack;