bippy 0.3.13 → 0.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/chunk-DWy1uDak.cjs +47 -0
- package/dist/core-BHLOH6E0.js +744 -0
- package/dist/core-BOYfIZ0s.d.cts +293 -0
- package/dist/core-C9jPbnEc.cjs +1164 -0
- package/dist/core-CmL25iLV.d.ts +293 -0
- package/dist/core.cjs +79 -286
- package/dist/core.d.cts +2 -221
- package/dist/core.d.ts +2 -221
- package/dist/core.js +11 -2
- package/dist/experiments/inspect.cjs +1109 -1400
- package/dist/experiments/inspect.d.cts +12 -10
- package/dist/experiments/inspect.d.ts +12 -10
- package/dist/experiments/inspect.js +1101 -1385
- package/dist/index-BtBZHVmz.d.cts +1 -0
- package/dist/index-D0E78WnU.d.ts +1 -0
- package/dist/index.cjs +80 -287
- package/dist/index.d.cts +3 -5
- package/dist/index.d.ts +3 -5
- package/dist/index.iife.js +9 -0
- package/dist/index.js +12 -3
- package/dist/jsx-dev-runtime.cjs +18 -33
- package/dist/jsx-dev-runtime.d.cts +7 -6
- package/dist/jsx-dev-runtime.d.ts +7 -6
- package/dist/jsx-dev-runtime.js +17 -28
- package/dist/jsx-runtime.cjs +16 -12
- package/dist/jsx-runtime.d.cts +3 -3
- package/dist/jsx-runtime.d.ts +3 -3
- package/dist/jsx-runtime.js +12 -4
- package/dist/source-C6Kcs2bv.cjs +2438 -0
- package/dist/source-CAKKlkON.js +2446 -0
- package/dist/source.cjs +84 -300
- package/dist/source.d.cts +8 -10
- package/dist/source.d.ts +8 -10
- package/dist/source.iife.js +14 -0
- package/dist/source.js +13 -4
- package/dist/src-BMy3jWE4.cjs +14 -0
- package/dist/{chunk-H6ZLR634.js → src-CAEV45VU.js} +5 -4
- package/package.json +6 -7
- package/dist/chunk-3DXHQSXK.js +0 -788
- package/dist/chunk-4N6XEHJD.cjs +0 -859
- package/dist/chunk-AQ674A4M.cjs +0 -38
- package/dist/chunk-EPG3GO3H.js +0 -35
- package/dist/chunk-FUZZZTS6.js +0 -2255
- package/dist/chunk-NKMRHYKS.cjs +0 -2259
- package/dist/chunk-TGUPYBYL.cjs +0 -15
- package/dist/index.global.js +0 -9
- package/dist/jsx-runtime-KafG0Y8O.d.cts +0 -72
- package/dist/jsx-runtime-KafG0Y8O.d.ts +0 -72
- package/dist/source.global.js +0 -9
|
@@ -0,0 +1,744 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license bippy
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) Aiden Bai
|
|
5
|
+
*
|
|
6
|
+
* This source code is licensed under the MIT license found in the
|
|
7
|
+
* LICENSE file in the root directory of this source tree.
|
|
8
|
+
*/
|
|
9
|
+
//#region src/rdt-hook.ts
|
|
10
|
+
const version = "0.3.15";
|
|
11
|
+
const BIPPY_INSTRUMENTATION_STRING = `bippy-${version}`;
|
|
12
|
+
const objectDefineProperty = Object.defineProperty;
|
|
13
|
+
const objectHasOwnProperty = Object.prototype.hasOwnProperty;
|
|
14
|
+
const NO_OP = () => {};
|
|
15
|
+
const checkDCE = (fn) => {
|
|
16
|
+
try {
|
|
17
|
+
const code = Function.prototype.toString.call(fn);
|
|
18
|
+
if (code.indexOf("^_^") > -1) setTimeout(() => {
|
|
19
|
+
throw new Error("React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build");
|
|
20
|
+
});
|
|
21
|
+
} catch {}
|
|
22
|
+
};
|
|
23
|
+
const isRealReactDevtools = (rdtHook = getRDTHook()) => {
|
|
24
|
+
return "getFiberRoots" in rdtHook;
|
|
25
|
+
};
|
|
26
|
+
let isReactRefreshOverride = false;
|
|
27
|
+
let injectFnStr = void 0;
|
|
28
|
+
const isReactRefresh = (rdtHook = getRDTHook()) => {
|
|
29
|
+
if (isReactRefreshOverride) return true;
|
|
30
|
+
if (typeof rdtHook.inject === "function") injectFnStr = rdtHook.inject.toString();
|
|
31
|
+
return Boolean(injectFnStr?.includes("(injected)"));
|
|
32
|
+
};
|
|
33
|
+
const onActiveListeners = new Set();
|
|
34
|
+
const _renderers = new Set();
|
|
35
|
+
const installRDTHook = (onActive) => {
|
|
36
|
+
const renderers = new Map();
|
|
37
|
+
let i = 0;
|
|
38
|
+
let rdtHook = {
|
|
39
|
+
checkDCE,
|
|
40
|
+
supportsFiber: true,
|
|
41
|
+
supportsFlight: true,
|
|
42
|
+
hasUnsupportedRendererAttached: false,
|
|
43
|
+
renderers,
|
|
44
|
+
onCommitFiberRoot: NO_OP,
|
|
45
|
+
onCommitFiberUnmount: NO_OP,
|
|
46
|
+
onPostCommitFiberRoot: NO_OP,
|
|
47
|
+
inject(renderer) {
|
|
48
|
+
const nextID = ++i;
|
|
49
|
+
renderers.set(nextID, renderer);
|
|
50
|
+
_renderers.add(renderer);
|
|
51
|
+
if (!rdtHook._instrumentationIsActive) {
|
|
52
|
+
rdtHook._instrumentationIsActive = true;
|
|
53
|
+
onActiveListeners.forEach((listener) => listener());
|
|
54
|
+
}
|
|
55
|
+
return nextID;
|
|
56
|
+
},
|
|
57
|
+
_instrumentationSource: BIPPY_INSTRUMENTATION_STRING,
|
|
58
|
+
_instrumentationIsActive: false
|
|
59
|
+
};
|
|
60
|
+
try {
|
|
61
|
+
objectDefineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
|
|
62
|
+
get() {
|
|
63
|
+
return rdtHook;
|
|
64
|
+
},
|
|
65
|
+
set(newHook) {
|
|
66
|
+
if (newHook && typeof newHook === "object") {
|
|
67
|
+
const ourRenderers = rdtHook.renderers;
|
|
68
|
+
rdtHook = newHook;
|
|
69
|
+
if (ourRenderers.size > 0) {
|
|
70
|
+
ourRenderers.forEach((renderer, id) => {
|
|
71
|
+
_renderers.add(renderer);
|
|
72
|
+
newHook.renderers.set(id, renderer);
|
|
73
|
+
});
|
|
74
|
+
patchRDTHook(onActive);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
configurable: true,
|
|
79
|
+
enumerable: true
|
|
80
|
+
});
|
|
81
|
+
const originalWindowHasOwnProperty = window.hasOwnProperty;
|
|
82
|
+
let hasRanHack = false;
|
|
83
|
+
objectDefineProperty(window, "hasOwnProperty", {
|
|
84
|
+
value: function() {
|
|
85
|
+
try {
|
|
86
|
+
if (!hasRanHack && arguments[0] === "__REACT_DEVTOOLS_GLOBAL_HOOK__") {
|
|
87
|
+
globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = void 0;
|
|
88
|
+
hasRanHack = true;
|
|
89
|
+
return -0;
|
|
90
|
+
}
|
|
91
|
+
} catch {}
|
|
92
|
+
return originalWindowHasOwnProperty.apply(this, arguments);
|
|
93
|
+
},
|
|
94
|
+
configurable: true,
|
|
95
|
+
writable: true
|
|
96
|
+
});
|
|
97
|
+
} catch {
|
|
98
|
+
patchRDTHook(onActive);
|
|
99
|
+
}
|
|
100
|
+
return rdtHook;
|
|
101
|
+
};
|
|
102
|
+
const patchRDTHook = (onActive) => {
|
|
103
|
+
if (onActive) onActiveListeners.add(onActive);
|
|
104
|
+
try {
|
|
105
|
+
const rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
106
|
+
if (!rdtHook) return;
|
|
107
|
+
if (!rdtHook._instrumentationSource) {
|
|
108
|
+
rdtHook.checkDCE = checkDCE;
|
|
109
|
+
rdtHook.supportsFiber = true;
|
|
110
|
+
rdtHook.supportsFlight = true;
|
|
111
|
+
rdtHook.hasUnsupportedRendererAttached = false;
|
|
112
|
+
rdtHook._instrumentationSource = BIPPY_INSTRUMENTATION_STRING;
|
|
113
|
+
rdtHook._instrumentationIsActive = false;
|
|
114
|
+
if (rdtHook.renderers.size) {
|
|
115
|
+
rdtHook._instrumentationIsActive = true;
|
|
116
|
+
onActiveListeners.forEach((listener) => listener());
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const prevInject = rdtHook.inject;
|
|
120
|
+
if (isReactRefresh(rdtHook) && !isRealReactDevtools()) {
|
|
121
|
+
isReactRefreshOverride = true;
|
|
122
|
+
const nextID = rdtHook.inject({ scheduleRefresh() {} });
|
|
123
|
+
if (nextID) rdtHook._instrumentationIsActive = true;
|
|
124
|
+
}
|
|
125
|
+
rdtHook.inject = (renderer) => {
|
|
126
|
+
const id = prevInject(renderer);
|
|
127
|
+
_renderers.add(renderer);
|
|
128
|
+
rdtHook._instrumentationIsActive = true;
|
|
129
|
+
onActiveListeners.forEach((listener) => listener());
|
|
130
|
+
return id;
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (rdtHook.renderers.size || rdtHook._instrumentationIsActive || isReactRefresh()) onActive?.();
|
|
134
|
+
} catch {}
|
|
135
|
+
};
|
|
136
|
+
const hasRDTHook = () => {
|
|
137
|
+
return objectHasOwnProperty.call(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__");
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Returns the current React DevTools global hook.
|
|
141
|
+
*/
|
|
142
|
+
const getRDTHook = (onActive) => {
|
|
143
|
+
if (!hasRDTHook()) return installRDTHook(onActive);
|
|
144
|
+
patchRDTHook(onActive);
|
|
145
|
+
return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
146
|
+
};
|
|
147
|
+
const isClientEnvironment = () => {
|
|
148
|
+
return Boolean(typeof window !== "undefined" && (window.document?.createElement || window.navigator?.product === "ReactNative"));
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Usually used purely for side effect
|
|
152
|
+
*/
|
|
153
|
+
const safelyInstallRDTHook = () => {
|
|
154
|
+
try {
|
|
155
|
+
if (isClientEnvironment()) getRDTHook();
|
|
156
|
+
} catch {}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/install-hook-script-string.ts
|
|
161
|
+
const INSTALL_HOOK_SCRIPT_STRING = "(()=>{try{var t=()=>{};const n=new Map;let o=0;globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__={checkDCE:t,supportsFiber:!0,supportsFlight:!0,hasUnsupportedRendererAttached:!1,renderers:n,onCommitFiberRoot:t,onCommitFiberUnmount:t,onPostCommitFiberRoot:t,inject(t){var e=++o;return n.set(e,t),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__._instrumentationIsActive=!0,e},_instrumentationIsActive:!1,_script:!0}}catch{}})()";
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/core.ts
|
|
165
|
+
const FunctionComponentTag = 0;
|
|
166
|
+
const ClassComponentTag = 1;
|
|
167
|
+
const HostRootTag = 3;
|
|
168
|
+
const HostComponentTag = 5;
|
|
169
|
+
const HostTextTag = 6;
|
|
170
|
+
const FragmentTag = 7;
|
|
171
|
+
const ContextConsumerTag = 9;
|
|
172
|
+
const ForwardRefTag = 11;
|
|
173
|
+
const SuspenseComponentTag = 13;
|
|
174
|
+
const MemoComponentTag = 14;
|
|
175
|
+
const SimpleMemoComponentTag = 15;
|
|
176
|
+
const DehydratedSuspenseComponentTag = 18;
|
|
177
|
+
const OffscreenComponentTag = 22;
|
|
178
|
+
const LegacyHiddenComponentTag = 23;
|
|
179
|
+
const HostHoistableTag = 26;
|
|
180
|
+
const HostSingletonTag = 27;
|
|
181
|
+
const CONCURRENT_MODE_NUMBER = 60111;
|
|
182
|
+
const ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.element)";
|
|
183
|
+
const TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.transitional.element)";
|
|
184
|
+
const CONCURRENT_MODE_SYMBOL_STRING = "Symbol(react.concurrent_mode)";
|
|
185
|
+
const DEPRECATED_ASYNC_MODE_SYMBOL_STRING = "Symbol(react.async_mode)";
|
|
186
|
+
const PerformedWork = 1;
|
|
187
|
+
const Placement = 2;
|
|
188
|
+
const Hydrating = 4096;
|
|
189
|
+
const Update = 4;
|
|
190
|
+
const Cloned = 8;
|
|
191
|
+
const ChildDeletion = 16;
|
|
192
|
+
const ContentReset = 32;
|
|
193
|
+
const Snapshot = 1024;
|
|
194
|
+
const Visibility = 8192;
|
|
195
|
+
const MutationMask = Placement | Update | ChildDeletion | ContentReset | Hydrating | Visibility | Snapshot;
|
|
196
|
+
/**
|
|
197
|
+
* Returns `true` if object is a React Element.
|
|
198
|
+
*
|
|
199
|
+
* @see https://react.dev/reference/react/isValidElement
|
|
200
|
+
*/
|
|
201
|
+
const isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && [ELEMENT_TYPE_SYMBOL_STRING, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING].includes(String(element.$$typeof));
|
|
202
|
+
/**
|
|
203
|
+
* Returns `true` if object is a React Fiber.
|
|
204
|
+
*/
|
|
205
|
+
const isValidFiber = (fiber) => typeof fiber === "object" && fiber != null && "tag" in fiber && "stateNode" in fiber && "return" in fiber && "child" in fiber && "sibling" in fiber && "flags" in fiber;
|
|
206
|
+
/**
|
|
207
|
+
* Returns `true` if fiber is a host fiber. Host fibers are DOM nodes in react-dom, `View` in react-native, etc.
|
|
208
|
+
*
|
|
209
|
+
* @see https://reactnative.dev/architecture/glossary#host-view-tree-and-host-view
|
|
210
|
+
*/
|
|
211
|
+
const isHostFiber = (fiber) => {
|
|
212
|
+
switch (fiber.tag) {
|
|
213
|
+
case HostComponentTag:
|
|
214
|
+
case HostHoistableTag:
|
|
215
|
+
case HostSingletonTag: return true;
|
|
216
|
+
default: return typeof fiber.type === "string";
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Returns `true` if fiber is a composite fiber. Composite fibers are fibers that can render (like functional components, class components, etc.)
|
|
221
|
+
*
|
|
222
|
+
* @see https://reactnative.dev/architecture/glossary#react-composite-components
|
|
223
|
+
*/
|
|
224
|
+
const isCompositeFiber = (fiber) => {
|
|
225
|
+
switch (fiber.tag) {
|
|
226
|
+
case FunctionComponentTag:
|
|
227
|
+
case ClassComponentTag:
|
|
228
|
+
case SimpleMemoComponentTag:
|
|
229
|
+
case MemoComponentTag:
|
|
230
|
+
case ForwardRefTag: return true;
|
|
231
|
+
default: return false;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Traverses up or down a {@link Fiber}'s contexts, return `true` to stop and select the current and previous context value.
|
|
236
|
+
*/
|
|
237
|
+
const traverseContexts = (fiber, selector) => {
|
|
238
|
+
try {
|
|
239
|
+
const nextDependencies = fiber.dependencies;
|
|
240
|
+
const prevDependencies = fiber.alternate?.dependencies;
|
|
241
|
+
if (!nextDependencies || !prevDependencies) return false;
|
|
242
|
+
if (typeof nextDependencies !== "object" || !("firstContext" in nextDependencies) || typeof prevDependencies !== "object" || !("firstContext" in prevDependencies)) return false;
|
|
243
|
+
let nextContext = nextDependencies.firstContext;
|
|
244
|
+
let prevContext = prevDependencies.firstContext;
|
|
245
|
+
while (nextContext && typeof nextContext === "object" && "memoizedValue" in nextContext || prevContext && typeof prevContext === "object" && "memoizedValue" in prevContext) {
|
|
246
|
+
if (selector(nextContext, prevContext) === true) return true;
|
|
247
|
+
nextContext = nextContext?.next;
|
|
248
|
+
prevContext = prevContext?.next;
|
|
249
|
+
}
|
|
250
|
+
} catch {}
|
|
251
|
+
return false;
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Traverses up or down a {@link Fiber}'s states, return `true` to stop and select the current and previous state value. This stores both state values and effects.
|
|
255
|
+
*/
|
|
256
|
+
const traverseState = (fiber, selector) => {
|
|
257
|
+
try {
|
|
258
|
+
let nextState = fiber.memoizedState;
|
|
259
|
+
let prevState = fiber.alternate?.memoizedState;
|
|
260
|
+
while (nextState || prevState) {
|
|
261
|
+
if (selector(nextState, prevState) === true) return true;
|
|
262
|
+
nextState = nextState?.next;
|
|
263
|
+
prevState = prevState?.next;
|
|
264
|
+
}
|
|
265
|
+
} catch {}
|
|
266
|
+
return false;
|
|
267
|
+
};
|
|
268
|
+
/**
|
|
269
|
+
* Traverses up or down a {@link Fiber}'s props, return `true` to stop and select the current and previous props value.
|
|
270
|
+
*/
|
|
271
|
+
const traverseProps = (fiber, selector) => {
|
|
272
|
+
try {
|
|
273
|
+
const nextProps = fiber.memoizedProps;
|
|
274
|
+
const prevProps = fiber.alternate?.memoizedProps || {};
|
|
275
|
+
const allKeys = new Set([...Object.keys(prevProps), ...Object.keys(nextProps)]);
|
|
276
|
+
for (const propName of allKeys) {
|
|
277
|
+
const prevValue = prevProps?.[propName];
|
|
278
|
+
const nextValue = nextProps?.[propName];
|
|
279
|
+
if (selector(propName, nextValue, prevValue) === true) return true;
|
|
280
|
+
}
|
|
281
|
+
} catch {}
|
|
282
|
+
return false;
|
|
283
|
+
};
|
|
284
|
+
/**
|
|
285
|
+
* Returns `true` if the {@link Fiber} has rendered. Note that this does not mean the fiber has rendered in the current commit, just that it has rendered in the past.
|
|
286
|
+
*/
|
|
287
|
+
const didFiberRender = (fiber) => {
|
|
288
|
+
const nextProps = fiber.memoizedProps;
|
|
289
|
+
const prevProps = fiber.alternate?.memoizedProps || {};
|
|
290
|
+
const flags = fiber.flags ?? fiber.effectTag ?? 0;
|
|
291
|
+
switch (fiber.tag) {
|
|
292
|
+
case ClassComponentTag:
|
|
293
|
+
case FunctionComponentTag:
|
|
294
|
+
case ContextConsumerTag:
|
|
295
|
+
case ForwardRefTag:
|
|
296
|
+
case MemoComponentTag:
|
|
297
|
+
case SimpleMemoComponentTag: return (flags & PerformedWork) === PerformedWork;
|
|
298
|
+
default:
|
|
299
|
+
if (!fiber.alternate) return true;
|
|
300
|
+
return prevProps !== nextProps || fiber.alternate.memoizedState !== fiber.memoizedState || fiber.alternate.ref !== fiber.ref;
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
/**
|
|
304
|
+
* Returns `true` if the {@link Fiber} has committed. Note that this does not mean the fiber has committed in the current commit, just that it has committed in the past.
|
|
305
|
+
*/
|
|
306
|
+
const didFiberCommit = (fiber) => {
|
|
307
|
+
return Boolean((fiber.flags & (MutationMask | Cloned)) !== 0 || (fiber.subtreeFlags & (MutationMask | Cloned)) !== 0);
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* Returns all host {@link Fiber}s that have committed and rendered.
|
|
311
|
+
*/
|
|
312
|
+
const getMutatedHostFibers = (fiber) => {
|
|
313
|
+
const mutations = [];
|
|
314
|
+
const stack = [fiber];
|
|
315
|
+
while (stack.length) {
|
|
316
|
+
const node = stack.pop();
|
|
317
|
+
if (!node) continue;
|
|
318
|
+
if (isHostFiber(node) && didFiberCommit(node) && didFiberRender(node)) mutations.push(node);
|
|
319
|
+
if (node.child) stack.push(node.child);
|
|
320
|
+
if (node.sibling) stack.push(node.sibling);
|
|
321
|
+
}
|
|
322
|
+
return mutations;
|
|
323
|
+
};
|
|
324
|
+
/**
|
|
325
|
+
* Returns the stack of {@link Fiber}s from the current fiber to the root fiber.
|
|
326
|
+
*
|
|
327
|
+
* @example
|
|
328
|
+
* ```ts
|
|
329
|
+
* [fiber, fiber.return, fiber.return.return, ...]
|
|
330
|
+
* ```
|
|
331
|
+
*/
|
|
332
|
+
const getFiberStack = (fiber) => {
|
|
333
|
+
const stack = [];
|
|
334
|
+
let currentFiber = fiber;
|
|
335
|
+
while (currentFiber.return) {
|
|
336
|
+
stack.push(currentFiber);
|
|
337
|
+
currentFiber = currentFiber.return;
|
|
338
|
+
}
|
|
339
|
+
return stack;
|
|
340
|
+
};
|
|
341
|
+
/**
|
|
342
|
+
* Returns `true` if the {@link Fiber} should be filtered out during reconciliation.
|
|
343
|
+
*/
|
|
344
|
+
const shouldFilterFiber = (fiber) => {
|
|
345
|
+
switch (fiber.tag) {
|
|
346
|
+
case DehydratedSuspenseComponentTag: return true;
|
|
347
|
+
case HostTextTag:
|
|
348
|
+
case FragmentTag:
|
|
349
|
+
case LegacyHiddenComponentTag:
|
|
350
|
+
case OffscreenComponentTag: return true;
|
|
351
|
+
case HostRootTag: return false;
|
|
352
|
+
default: {
|
|
353
|
+
const symbolOrNumber = typeof fiber.type === "object" && fiber.type !== null ? fiber.type.$$typeof : fiber.type;
|
|
354
|
+
const typeSymbol = typeof symbolOrNumber === "symbol" ? symbolOrNumber.toString() : symbolOrNumber;
|
|
355
|
+
switch (typeSymbol) {
|
|
356
|
+
case CONCURRENT_MODE_NUMBER:
|
|
357
|
+
case CONCURRENT_MODE_SYMBOL_STRING:
|
|
358
|
+
case DEPRECATED_ASYNC_MODE_SYMBOL_STRING: return true;
|
|
359
|
+
default: return false;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
/**
|
|
365
|
+
* Returns the nearest host {@link Fiber} to the current {@link Fiber}.
|
|
366
|
+
*/
|
|
367
|
+
const getNearestHostFiber = (fiber, ascending = false) => {
|
|
368
|
+
let hostFiber = traverseFiber(fiber, isHostFiber, ascending);
|
|
369
|
+
if (!hostFiber) hostFiber = traverseFiber(fiber, isHostFiber, !ascending);
|
|
370
|
+
return hostFiber;
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* Returns all host {@link Fiber}s in the tree that are associated with the current {@link Fiber}.
|
|
374
|
+
*/
|
|
375
|
+
const getNearestHostFibers = (fiber) => {
|
|
376
|
+
const hostFibers = [];
|
|
377
|
+
const stack = [];
|
|
378
|
+
if (isHostFiber(fiber)) hostFibers.push(fiber);
|
|
379
|
+
else if (fiber.child) stack.push(fiber.child);
|
|
380
|
+
while (stack.length) {
|
|
381
|
+
const currentNode = stack.pop();
|
|
382
|
+
if (!currentNode) break;
|
|
383
|
+
if (isHostFiber(currentNode)) hostFibers.push(currentNode);
|
|
384
|
+
else if (currentNode.child) stack.push(currentNode.child);
|
|
385
|
+
if (currentNode.sibling) stack.push(currentNode.sibling);
|
|
386
|
+
}
|
|
387
|
+
return hostFibers;
|
|
388
|
+
};
|
|
389
|
+
/**
|
|
390
|
+
* Traverses up or down a {@link Fiber}, return `true` to stop and select a node.
|
|
391
|
+
*/
|
|
392
|
+
const traverseFiber = (fiber, selector, ascending = false) => {
|
|
393
|
+
if (!fiber) return null;
|
|
394
|
+
if (selector(fiber) === true) return fiber;
|
|
395
|
+
let child = ascending ? fiber.return : fiber.child;
|
|
396
|
+
while (child) {
|
|
397
|
+
const match = traverseFiber(child, selector, ascending);
|
|
398
|
+
if (match) return match;
|
|
399
|
+
child = ascending ? null : child.sibling;
|
|
400
|
+
}
|
|
401
|
+
return null;
|
|
402
|
+
};
|
|
403
|
+
/**
|
|
404
|
+
* Returns the timings of the {@link Fiber}.
|
|
405
|
+
*
|
|
406
|
+
* @example
|
|
407
|
+
* ```ts
|
|
408
|
+
* const { selfTime, totalTime } = getTimings(fiber);
|
|
409
|
+
* console.log(selfTime, totalTime);
|
|
410
|
+
* ```
|
|
411
|
+
*/
|
|
412
|
+
const getTimings = (fiber) => {
|
|
413
|
+
const totalTime = fiber?.actualDuration ?? 0;
|
|
414
|
+
let selfTime = totalTime;
|
|
415
|
+
let child = fiber?.child ?? null;
|
|
416
|
+
while (totalTime > 0 && child != null) {
|
|
417
|
+
selfTime -= child.actualDuration ?? 0;
|
|
418
|
+
child = child.sibling;
|
|
419
|
+
}
|
|
420
|
+
return {
|
|
421
|
+
selfTime,
|
|
422
|
+
totalTime
|
|
423
|
+
};
|
|
424
|
+
};
|
|
425
|
+
/**
|
|
426
|
+
* Returns `true` if the {@link Fiber} uses React Compiler's memo cache.
|
|
427
|
+
*/
|
|
428
|
+
const hasMemoCache = (fiber) => {
|
|
429
|
+
return Boolean(fiber.updateQueue?.memoCache);
|
|
430
|
+
};
|
|
431
|
+
/**
|
|
432
|
+
* Returns the type (e.g. component definition) of the {@link Fiber}
|
|
433
|
+
*/
|
|
434
|
+
const getType = (type) => {
|
|
435
|
+
const currentType = type;
|
|
436
|
+
if (typeof currentType === "function") return currentType;
|
|
437
|
+
if (typeof currentType === "object" && currentType) return getType(currentType.type || currentType.render);
|
|
438
|
+
return null;
|
|
439
|
+
};
|
|
440
|
+
/**
|
|
441
|
+
* Returns the display name of the {@link Fiber} type.
|
|
442
|
+
*/
|
|
443
|
+
const getDisplayName = (type) => {
|
|
444
|
+
const currentType = type;
|
|
445
|
+
if (typeof currentType === "string") return currentType;
|
|
446
|
+
if (typeof currentType !== "function" && !(typeof currentType === "object" && currentType)) return null;
|
|
447
|
+
const name = currentType.displayName || currentType.name || null;
|
|
448
|
+
if (name) return name;
|
|
449
|
+
const unwrappedType = getType(currentType);
|
|
450
|
+
if (!unwrappedType) return null;
|
|
451
|
+
return unwrappedType.displayName || unwrappedType.name || null;
|
|
452
|
+
};
|
|
453
|
+
/**
|
|
454
|
+
* Returns the build type of the React renderer.
|
|
455
|
+
*/
|
|
456
|
+
const detectReactBuildType = (renderer) => {
|
|
457
|
+
try {
|
|
458
|
+
if (typeof renderer.version === "string" && renderer.bundleType > 0) return "development";
|
|
459
|
+
} catch {}
|
|
460
|
+
return "production";
|
|
461
|
+
};
|
|
462
|
+
/**
|
|
463
|
+
* Returns `true` if bippy's instrumentation is active.
|
|
464
|
+
*/
|
|
465
|
+
const isInstrumentationActive = () => {
|
|
466
|
+
const rdtHook = getRDTHook();
|
|
467
|
+
return Boolean(rdtHook._instrumentationIsActive) || isRealReactDevtools() || isReactRefresh();
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* Returns the latest fiber (since it may be double-buffered).
|
|
471
|
+
*/
|
|
472
|
+
const getLatestFiber = (fiber) => {
|
|
473
|
+
const alternate = fiber.alternate;
|
|
474
|
+
if (!alternate) return fiber;
|
|
475
|
+
if (alternate.actualStartTime && fiber.actualStartTime) return alternate.actualStartTime > fiber.actualStartTime ? alternate : fiber;
|
|
476
|
+
for (const root of _fiberRoots) {
|
|
477
|
+
const latestFiber = traverseFiber(root.current, (innerFiber) => {
|
|
478
|
+
if (innerFiber === fiber) return true;
|
|
479
|
+
});
|
|
480
|
+
if (latestFiber) return latestFiber;
|
|
481
|
+
}
|
|
482
|
+
return fiber;
|
|
483
|
+
};
|
|
484
|
+
let fiberId = 0;
|
|
485
|
+
const fiberIdMap = new WeakMap();
|
|
486
|
+
const setFiberId = (fiber, id = fiberId++) => {
|
|
487
|
+
fiberIdMap.set(fiber, id);
|
|
488
|
+
};
|
|
489
|
+
const getFiberId = (fiber) => {
|
|
490
|
+
let id = fiberIdMap.get(fiber);
|
|
491
|
+
if (!id && fiber.alternate) id = fiberIdMap.get(fiber.alternate);
|
|
492
|
+
if (!id) {
|
|
493
|
+
id = fiberId++;
|
|
494
|
+
setFiberId(fiber, id);
|
|
495
|
+
}
|
|
496
|
+
return id;
|
|
497
|
+
};
|
|
498
|
+
const mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
|
|
499
|
+
let fiber = firstChild;
|
|
500
|
+
while (fiber != null) {
|
|
501
|
+
if (!fiberIdMap.has(fiber)) getFiberId(fiber);
|
|
502
|
+
const shouldIncludeInTree = !shouldFilterFiber(fiber);
|
|
503
|
+
if (shouldIncludeInTree && didFiberRender(fiber)) onRender(fiber, "mount");
|
|
504
|
+
if (fiber.tag === SuspenseComponentTag) {
|
|
505
|
+
const isTimedOut = fiber.memoizedState !== null;
|
|
506
|
+
if (isTimedOut) {
|
|
507
|
+
const primaryChildFragment = fiber.child;
|
|
508
|
+
const fallbackChildFragment = primaryChildFragment ? primaryChildFragment.sibling : null;
|
|
509
|
+
if (fallbackChildFragment) {
|
|
510
|
+
const fallbackChild = fallbackChildFragment.child;
|
|
511
|
+
if (fallbackChild !== null) mountFiberRecursively(onRender, fallbackChild, false);
|
|
512
|
+
}
|
|
513
|
+
} else {
|
|
514
|
+
let primaryChild = null;
|
|
515
|
+
const areSuspenseChildrenConditionallyWrapped = OffscreenComponentTag === -1;
|
|
516
|
+
if (areSuspenseChildrenConditionallyWrapped) primaryChild = fiber.child;
|
|
517
|
+
else if (fiber.child !== null) primaryChild = fiber.child.child;
|
|
518
|
+
if (primaryChild !== null) mountFiberRecursively(onRender, primaryChild, false);
|
|
519
|
+
}
|
|
520
|
+
} else if (fiber.child != null) mountFiberRecursively(onRender, fiber.child, true);
|
|
521
|
+
fiber = traverseSiblings ? fiber.sibling : null;
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
const updateFiberRecursively = (onRender, nextFiber, prevFiber, parentFiber) => {
|
|
525
|
+
if (!fiberIdMap.has(nextFiber)) getFiberId(nextFiber);
|
|
526
|
+
if (!prevFiber) return;
|
|
527
|
+
if (!fiberIdMap.has(prevFiber)) getFiberId(prevFiber);
|
|
528
|
+
const isSuspense = nextFiber.tag === SuspenseComponentTag;
|
|
529
|
+
const shouldIncludeInTree = !shouldFilterFiber(nextFiber);
|
|
530
|
+
if (shouldIncludeInTree && didFiberRender(nextFiber)) onRender(nextFiber, "update");
|
|
531
|
+
const prevDidTimeout = isSuspense && prevFiber.memoizedState !== null;
|
|
532
|
+
const nextDidTimeOut = isSuspense && nextFiber.memoizedState !== null;
|
|
533
|
+
if (prevDidTimeout && nextDidTimeOut) {
|
|
534
|
+
const nextFallbackChildSet = nextFiber.child?.sibling ?? null;
|
|
535
|
+
const prevFallbackChildSet = prevFiber.child?.sibling ?? null;
|
|
536
|
+
if (nextFallbackChildSet !== null && prevFallbackChildSet !== null) updateFiberRecursively(onRender, nextFallbackChildSet, prevFallbackChildSet, nextFiber);
|
|
537
|
+
} else if (prevDidTimeout && !nextDidTimeOut) {
|
|
538
|
+
const nextPrimaryChildSet = nextFiber.child;
|
|
539
|
+
if (nextPrimaryChildSet !== null) mountFiberRecursively(onRender, nextPrimaryChildSet, true);
|
|
540
|
+
} else if (!prevDidTimeout && nextDidTimeOut) {
|
|
541
|
+
unmountFiberChildrenRecursively(onRender, prevFiber);
|
|
542
|
+
const nextFallbackChildSet = nextFiber.child?.sibling ?? null;
|
|
543
|
+
if (nextFallbackChildSet !== null) mountFiberRecursively(onRender, nextFallbackChildSet, true);
|
|
544
|
+
} else if (nextFiber.child !== prevFiber.child) {
|
|
545
|
+
let nextChild = nextFiber.child;
|
|
546
|
+
while (nextChild) {
|
|
547
|
+
if (nextChild.alternate) {
|
|
548
|
+
const prevChild = nextChild.alternate;
|
|
549
|
+
updateFiberRecursively(onRender, nextChild, prevChild, shouldIncludeInTree ? nextFiber : parentFiber);
|
|
550
|
+
} else mountFiberRecursively(onRender, nextChild, false);
|
|
551
|
+
nextChild = nextChild.sibling;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
const unmountFiber = (onRender, fiber) => {
|
|
556
|
+
const isRoot = fiber.tag === HostRootTag;
|
|
557
|
+
if (isRoot || !shouldFilterFiber(fiber)) onRender(fiber, "unmount");
|
|
558
|
+
};
|
|
559
|
+
const unmountFiberChildrenRecursively = (onRender, fiber) => {
|
|
560
|
+
const isTimedOutSuspense = fiber.tag === SuspenseComponentTag && fiber.memoizedState !== null;
|
|
561
|
+
let child = fiber.child;
|
|
562
|
+
if (isTimedOutSuspense) {
|
|
563
|
+
const primaryChildFragment = fiber.child;
|
|
564
|
+
const fallbackChildFragment = primaryChildFragment?.sibling ?? null;
|
|
565
|
+
child = fallbackChildFragment?.child ?? null;
|
|
566
|
+
}
|
|
567
|
+
while (child !== null) {
|
|
568
|
+
if (child.return !== null) {
|
|
569
|
+
unmountFiber(onRender, child);
|
|
570
|
+
unmountFiberChildrenRecursively(onRender, child);
|
|
571
|
+
}
|
|
572
|
+
child = child.sibling;
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
let commitId = 0;
|
|
576
|
+
const rootInstanceMap = new WeakMap();
|
|
577
|
+
/**
|
|
578
|
+
* Creates a fiber visitor function. Must pass a fiber root and a render handler.
|
|
579
|
+
* @example
|
|
580
|
+
* traverseRenderedFibers(root, (fiber, phase) => {
|
|
581
|
+
* console.log(phase)
|
|
582
|
+
* })
|
|
583
|
+
*/
|
|
584
|
+
const traverseRenderedFibers = (root, onRender) => {
|
|
585
|
+
const fiber = "current" in root ? root.current : root;
|
|
586
|
+
let rootInstance = rootInstanceMap.get(root);
|
|
587
|
+
if (!rootInstance) {
|
|
588
|
+
rootInstance = {
|
|
589
|
+
prevFiber: null,
|
|
590
|
+
id: commitId++
|
|
591
|
+
};
|
|
592
|
+
rootInstanceMap.set(root, rootInstance);
|
|
593
|
+
}
|
|
594
|
+
const { prevFiber } = rootInstance;
|
|
595
|
+
if (!fiber) unmountFiber(onRender, fiber);
|
|
596
|
+
else if (prevFiber !== null) {
|
|
597
|
+
const wasMounted = prevFiber && prevFiber.memoizedState != null && prevFiber.memoizedState.element != null && prevFiber.memoizedState.isDehydrated !== true;
|
|
598
|
+
const isMounted = fiber.memoizedState != null && fiber.memoizedState.element != null && fiber.memoizedState.isDehydrated !== true;
|
|
599
|
+
if (!wasMounted && isMounted) mountFiberRecursively(onRender, fiber, false);
|
|
600
|
+
else if (wasMounted && isMounted) updateFiberRecursively(onRender, fiber, fiber.alternate, null);
|
|
601
|
+
else if (wasMounted && !isMounted) unmountFiber(onRender, fiber);
|
|
602
|
+
} else mountFiberRecursively(onRender, fiber, true);
|
|
603
|
+
rootInstance.prevFiber = fiber;
|
|
604
|
+
};
|
|
605
|
+
/**
|
|
606
|
+
* @deprecated use `traverseRenderedFibers` instead
|
|
607
|
+
*/
|
|
608
|
+
const createFiberVisitor = ({ onRender }) => {
|
|
609
|
+
return (_rendererID, root, _state) => {
|
|
610
|
+
traverseRenderedFibers(root, onRender);
|
|
611
|
+
};
|
|
612
|
+
};
|
|
613
|
+
/**
|
|
614
|
+
* Instruments the DevTools hook.
|
|
615
|
+
* @example
|
|
616
|
+
* const hook = instrument({
|
|
617
|
+
* onActive() {
|
|
618
|
+
* console.log('initialized');
|
|
619
|
+
* },
|
|
620
|
+
* onCommitFiberRoot(rendererID, root) {
|
|
621
|
+
* console.log('fiberRoot', root.current)
|
|
622
|
+
* },
|
|
623
|
+
* });
|
|
624
|
+
*/
|
|
625
|
+
const instrument = (options) => {
|
|
626
|
+
return getRDTHook(() => {
|
|
627
|
+
const rdtHook = getRDTHook();
|
|
628
|
+
options.onActive?.();
|
|
629
|
+
rdtHook._instrumentationSource = options.name ?? BIPPY_INSTRUMENTATION_STRING;
|
|
630
|
+
const prevOnCommitFiberRoot = rdtHook.onCommitFiberRoot;
|
|
631
|
+
if (options.onCommitFiberRoot) rdtHook.onCommitFiberRoot = (rendererID, root, priority) => {
|
|
632
|
+
if (prevOnCommitFiberRoot) prevOnCommitFiberRoot(rendererID, root, priority);
|
|
633
|
+
options.onCommitFiberRoot?.(rendererID, root, priority);
|
|
634
|
+
};
|
|
635
|
+
const prevOnCommitFiberUnmount = rdtHook.onCommitFiberUnmount;
|
|
636
|
+
if (options.onCommitFiberUnmount) rdtHook.onCommitFiberUnmount = (rendererID, root) => {
|
|
637
|
+
if (prevOnCommitFiberUnmount) prevOnCommitFiberUnmount(rendererID, root);
|
|
638
|
+
options.onCommitFiberUnmount?.(rendererID, root);
|
|
639
|
+
};
|
|
640
|
+
const prevOnPostCommitFiberRoot = rdtHook.onPostCommitFiberRoot;
|
|
641
|
+
if (options.onPostCommitFiberRoot) rdtHook.onPostCommitFiberRoot = (rendererID, root) => {
|
|
642
|
+
if (prevOnPostCommitFiberRoot) prevOnPostCommitFiberRoot(rendererID, root);
|
|
643
|
+
options.onPostCommitFiberRoot?.(rendererID, root);
|
|
644
|
+
};
|
|
645
|
+
});
|
|
646
|
+
};
|
|
647
|
+
const getFiberFromHostInstance = (hostInstance) => {
|
|
648
|
+
const rdtHook = getRDTHook();
|
|
649
|
+
for (const renderer of rdtHook.renderers.values()) try {
|
|
650
|
+
const fiber = renderer.findFiberByHostInstance?.(hostInstance);
|
|
651
|
+
if (fiber) return fiber;
|
|
652
|
+
} catch {}
|
|
653
|
+
if (typeof hostInstance === "object" && hostInstance != null) {
|
|
654
|
+
if ("_reactRootContainer" in hostInstance) return hostInstance._reactRootContainer?._internalRoot?.current?.child;
|
|
655
|
+
for (const key in hostInstance) if (key.startsWith("__reactInternalInstance$") || key.startsWith("__reactFiber")) return hostInstance[key] || null;
|
|
656
|
+
}
|
|
657
|
+
return null;
|
|
658
|
+
};
|
|
659
|
+
const INSTALL_ERROR = new Error();
|
|
660
|
+
const _fiberRoots = new Set();
|
|
661
|
+
const secure = (options, secureOptions = {}) => {
|
|
662
|
+
const onActive = options.onActive;
|
|
663
|
+
const isRDTHookInstalled = hasRDTHook();
|
|
664
|
+
const isUsingRealReactDevtools = isRealReactDevtools();
|
|
665
|
+
const isUsingReactRefresh = isReactRefresh();
|
|
666
|
+
let timeout;
|
|
667
|
+
let isProduction = secureOptions.isProduction ?? false;
|
|
668
|
+
options.onActive = () => {
|
|
669
|
+
clearTimeout(timeout);
|
|
670
|
+
let isSecure = true;
|
|
671
|
+
try {
|
|
672
|
+
const rdtHook = getRDTHook();
|
|
673
|
+
for (const renderer of rdtHook.renderers.values()) {
|
|
674
|
+
const [majorVersion] = renderer.version.split(".");
|
|
675
|
+
if (Number(majorVersion) < (secureOptions.minReactMajorVersion ?? 17)) isSecure = false;
|
|
676
|
+
const buildType = detectReactBuildType(renderer);
|
|
677
|
+
if (buildType !== "development") {
|
|
678
|
+
isProduction = true;
|
|
679
|
+
if (!secureOptions.dangerouslyRunInProduction) isSecure = false;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
} catch (err) {
|
|
683
|
+
secureOptions.onError?.(err);
|
|
684
|
+
}
|
|
685
|
+
if (!isSecure) {
|
|
686
|
+
options.onCommitFiberRoot = void 0;
|
|
687
|
+
options.onCommitFiberUnmount = void 0;
|
|
688
|
+
options.onPostCommitFiberRoot = void 0;
|
|
689
|
+
options.onActive = void 0;
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
onActive?.();
|
|
693
|
+
try {
|
|
694
|
+
const onCommitFiberRoot$1 = options.onCommitFiberRoot;
|
|
695
|
+
if (onCommitFiberRoot$1) options.onCommitFiberRoot = (rendererID, root, priority) => {
|
|
696
|
+
if (!_fiberRoots.has(root)) _fiberRoots.add(root);
|
|
697
|
+
try {
|
|
698
|
+
onCommitFiberRoot$1(rendererID, root, priority);
|
|
699
|
+
} catch (err) {
|
|
700
|
+
secureOptions.onError?.(err);
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
const onCommitFiberUnmount = options.onCommitFiberUnmount;
|
|
704
|
+
if (onCommitFiberUnmount) options.onCommitFiberUnmount = (rendererID, root) => {
|
|
705
|
+
try {
|
|
706
|
+
onCommitFiberUnmount(rendererID, root);
|
|
707
|
+
} catch (err) {
|
|
708
|
+
secureOptions.onError?.(err);
|
|
709
|
+
}
|
|
710
|
+
};
|
|
711
|
+
const onPostCommitFiberRoot = options.onPostCommitFiberRoot;
|
|
712
|
+
if (onPostCommitFiberRoot) options.onPostCommitFiberRoot = (rendererID, root) => {
|
|
713
|
+
try {
|
|
714
|
+
onPostCommitFiberRoot(rendererID, root);
|
|
715
|
+
} catch (err) {
|
|
716
|
+
secureOptions.onError?.(err);
|
|
717
|
+
}
|
|
718
|
+
};
|
|
719
|
+
} catch (err) {
|
|
720
|
+
secureOptions.onError?.(err);
|
|
721
|
+
}
|
|
722
|
+
};
|
|
723
|
+
if (!isRDTHookInstalled && !isUsingRealReactDevtools && !isUsingReactRefresh) timeout = setTimeout(() => {
|
|
724
|
+
if (!isProduction) secureOptions.onError?.(INSTALL_ERROR);
|
|
725
|
+
stop();
|
|
726
|
+
}, secureOptions.installCheckTimeout ?? 100);
|
|
727
|
+
return options;
|
|
728
|
+
};
|
|
729
|
+
/**
|
|
730
|
+
* a wrapper around the {@link instrument} function that sets the `onCommitFiberRoot` hook.
|
|
731
|
+
*
|
|
732
|
+
* @example
|
|
733
|
+
* onCommitFiberRoot((root) => {
|
|
734
|
+
* console.log(root.current);
|
|
735
|
+
* });
|
|
736
|
+
*/
|
|
737
|
+
const onCommitFiberRoot = (handler) => {
|
|
738
|
+
return instrument(secure({ onCommitFiberRoot: (_, root) => {
|
|
739
|
+
handler(root);
|
|
740
|
+
} }));
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
//#endregion
|
|
744
|
+
export { BIPPY_INSTRUMENTATION_STRING, CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ClassComponentTag, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponentTag, ELEMENT_TYPE_SYMBOL_STRING, ForwardRefTag, FragmentTag, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRootTag, HostSingletonTag, HostTextTag, INSTALL_ERROR, INSTALL_HOOK_SCRIPT_STRING, LegacyHiddenComponentTag, MemoComponentTag, OffscreenComponentTag, SimpleMemoComponentTag, SuspenseComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, _fiberRoots, _renderers, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getLatestFiber, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getRDTHook, getTimings, getType, hasMemoCache, hasRDTHook, installRDTHook, instrument, isClientEnvironment, isCompositeFiber, isHostFiber, isInstrumentationActive, isReactRefresh, isRealReactDevtools, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, patchRDTHook, safelyInstallRDTHook, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively, version };
|