bippy 0.2.22 → 0.2.24
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/README.md +2 -34
- package/dist/{chunk-DE5T66AV.js → chunk-347RWTP3.js} +13 -35
- package/dist/{chunk-A5CNTCS7.cjs → chunk-GVWERSAB.cjs} +12 -35
- package/dist/{chunk-HC7ECRJC.cjs → chunk-HQYIPSLJ.cjs} +3 -3
- package/dist/{chunk-DPLW5GUM.js → chunk-N23WFCSF.js} +1 -1
- package/dist/core.cjs +67 -71
- package/dist/core.d.cts +3 -6
- package/dist/core.d.ts +3 -6
- package/dist/core.js +1 -1
- package/dist/experiments/inspect.cjs +1748 -0
- package/dist/experiments/inspect.d.cts +11 -0
- package/dist/experiments/inspect.d.ts +11 -0
- package/dist/experiments/inspect.js +1737 -0
- package/dist/index.cjs +68 -72
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.global.js +1 -1
- package/dist/index.js +2 -2
- package/package.json +14 -12
- package/dist/inspect.cjs +0 -5978
- package/dist/inspect.d.cts +0 -10
- package/dist/inspect.d.ts +0 -10
- package/dist/inspect.js +0 -5969
package/README.md
CHANGED
|
@@ -28,24 +28,6 @@ onCommitFiberRoot((root) => {
|
|
|
28
28
|
});
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
or, use the `/inspect` subpackage to graphically visualize the fiber tree:
|
|
32
|
-
|
|
33
|
-
```jsx
|
|
34
|
-
import { Inspector } from 'bippy/inspect';
|
|
35
|
-
|
|
36
|
-
<Inspector enabled={true} />
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
<table>
|
|
40
|
-
<tbody>
|
|
41
|
-
<tr>
|
|
42
|
-
<td>
|
|
43
|
-
<a href="https://bippy.dev"><b>open live demo ↗</b></a>
|
|
44
|
-
</td>
|
|
45
|
-
</tr>
|
|
46
|
-
</tbody>
|
|
47
|
-
</table>
|
|
48
|
-
|
|
49
31
|
## how it works & motivation
|
|
50
32
|
|
|
51
33
|
bippy allows you to **access** and **use** react fibers **outside** of react components.
|
|
@@ -158,7 +140,6 @@ or, use via script tag:
|
|
|
158
140
|
|
|
159
141
|
next, you can use the api to get data about the fiber tree. below is a (useful) subset of the api. for the full api, read the [source code](https://github.com/aidenybai/bippy/blob/main/src/core.ts).
|
|
160
142
|
|
|
161
|
-
|
|
162
143
|
### onCommitFiberRoot
|
|
163
144
|
|
|
164
145
|
a utility function that wraps the `instrument` function and sets the `onCommitFiberRoot` hook.
|
|
@@ -275,20 +256,6 @@ traverseState(fiber, (next, prev) => {
|
|
|
275
256
|
});
|
|
276
257
|
```
|
|
277
258
|
|
|
278
|
-
### traverseEffects
|
|
279
|
-
|
|
280
|
-
traverses the effects (useEffect, useLayoutEffect, etc.) of a fiber.
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
import { traverseEffects } from 'bippy';
|
|
284
|
-
|
|
285
|
-
// ...
|
|
286
|
-
|
|
287
|
-
traverseEffects(fiber, (effect) => {
|
|
288
|
-
console.log(effect);
|
|
289
|
-
});
|
|
290
|
-
```
|
|
291
|
-
|
|
292
259
|
### traverseContexts
|
|
293
260
|
|
|
294
261
|
traverses the contexts (useContext) of a fiber.
|
|
@@ -303,7 +270,6 @@ traverseContexts(fiber, (next, prev) => {
|
|
|
303
270
|
});
|
|
304
271
|
```
|
|
305
272
|
|
|
306
|
-
|
|
307
273
|
### setFiberId / getFiberId
|
|
308
274
|
|
|
309
275
|
set and get a persistent identity for a fiber. by default, fibers are anonymous and have no identity.
|
|
@@ -621,6 +587,8 @@ instrument(
|
|
|
621
587
|
|
|
622
588
|
## development
|
|
623
589
|
|
|
590
|
+
pre-requisite: you should understand how react works internally. if you don't, please give this [series of articles](https://jser.dev/series/react-source-code-walkthrough) a read.
|
|
591
|
+
|
|
624
592
|
we use a pnpm monorepo, get started by running:
|
|
625
593
|
|
|
626
594
|
```shell
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
// src/rdt-hook.ts
|
|
11
|
-
var version = "0.2.
|
|
11
|
+
var version = "0.2.24";
|
|
12
12
|
var BIPPY_INSTRUMENTATION_STRING = `bippy-${version}`;
|
|
13
13
|
var objectDefineProperty = Object.defineProperty;
|
|
14
14
|
var objectHasOwnProperty = Object.prototype.hasOwnProperty;
|
|
@@ -39,6 +39,7 @@ var isReactRefresh = (rdtHook = getRDTHook()) => {
|
|
|
39
39
|
}
|
|
40
40
|
return Boolean(injectFnStr?.includes("(injected)"));
|
|
41
41
|
};
|
|
42
|
+
var onActiveListeners = /* @__PURE__ */ new Set();
|
|
42
43
|
var installRDTHook = (onActive) => {
|
|
43
44
|
const renderers = /* @__PURE__ */ new Map();
|
|
44
45
|
let i = 0;
|
|
@@ -56,7 +57,7 @@ var installRDTHook = (onActive) => {
|
|
|
56
57
|
renderers.set(nextID, renderer);
|
|
57
58
|
if (!rdtHook._instrumentationIsActive) {
|
|
58
59
|
rdtHook._instrumentationIsActive = true;
|
|
59
|
-
|
|
60
|
+
onActiveListeners.forEach((listener) => listener());
|
|
60
61
|
}
|
|
61
62
|
return nextID;
|
|
62
63
|
},
|
|
@@ -89,6 +90,9 @@ var installRDTHook = (onActive) => {
|
|
|
89
90
|
return rdtHook;
|
|
90
91
|
};
|
|
91
92
|
var patchRDTHook = (onActive) => {
|
|
93
|
+
if (onActive) {
|
|
94
|
+
onActiveListeners.add(onActive);
|
|
95
|
+
}
|
|
92
96
|
try {
|
|
93
97
|
const rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
94
98
|
if (!rdtHook) return;
|
|
@@ -102,11 +106,11 @@ var patchRDTHook = (onActive) => {
|
|
|
102
106
|
rdtHook._instrumentationIsActive = false;
|
|
103
107
|
if (rdtHook.renderers.size) {
|
|
104
108
|
rdtHook._instrumentationIsActive = true;
|
|
105
|
-
|
|
109
|
+
onActiveListeners.forEach((listener) => listener());
|
|
106
110
|
return;
|
|
107
111
|
}
|
|
108
112
|
const prevInject = rdtHook.inject;
|
|
109
|
-
if (isReactRefresh(rdtHook)) {
|
|
113
|
+
if (isReactRefresh(rdtHook) && !isRealReactDevtools()) {
|
|
110
114
|
isReactRefreshOverride = true;
|
|
111
115
|
let nextID = rdtHook.inject(null);
|
|
112
116
|
if (nextID) {
|
|
@@ -117,7 +121,7 @@ var patchRDTHook = (onActive) => {
|
|
|
117
121
|
rdtHook.inject = (renderer) => {
|
|
118
122
|
const id = prevInject(renderer);
|
|
119
123
|
rdtHook._instrumentationIsActive = true;
|
|
120
|
-
|
|
124
|
+
onActiveListeners.forEach((listener) => listener());
|
|
121
125
|
return id;
|
|
122
126
|
};
|
|
123
127
|
}
|
|
@@ -245,28 +249,6 @@ var traverseState = (fiber, selector) => {
|
|
|
245
249
|
}
|
|
246
250
|
return false;
|
|
247
251
|
};
|
|
248
|
-
var traverseEffects = (fiber, selector) => {
|
|
249
|
-
try {
|
|
250
|
-
let nextState = (
|
|
251
|
-
// biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
|
|
252
|
-
fiber.updateQueue?.lastEffect
|
|
253
|
-
);
|
|
254
|
-
let prevState = (
|
|
255
|
-
// biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
|
|
256
|
-
fiber.alternate?.updateQueue?.lastEffect
|
|
257
|
-
);
|
|
258
|
-
while (nextState || prevState) {
|
|
259
|
-
if (selector(nextState, prevState) === true) return true;
|
|
260
|
-
if (nextState?.next === nextState || prevState?.next === prevState) {
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
nextState = nextState?.next;
|
|
264
|
-
prevState = prevState?.next;
|
|
265
|
-
}
|
|
266
|
-
} catch {
|
|
267
|
-
}
|
|
268
|
-
return false;
|
|
269
|
-
};
|
|
270
252
|
var traverseProps = (fiber, selector) => {
|
|
271
253
|
try {
|
|
272
254
|
const nextProps = fiber.memoizedProps;
|
|
@@ -328,11 +310,7 @@ var getFiberStack = (fiber) => {
|
|
|
328
310
|
stack.push(currentFiber);
|
|
329
311
|
currentFiber = currentFiber.return;
|
|
330
312
|
}
|
|
331
|
-
|
|
332
|
-
for (let i = 0; i < stack.length; i++) {
|
|
333
|
-
newStack[i] = stack[stack.length - i - 1];
|
|
334
|
-
}
|
|
335
|
-
return newStack;
|
|
313
|
+
return stack;
|
|
336
314
|
};
|
|
337
315
|
var shouldFilterFiber = (fiber) => {
|
|
338
316
|
switch (fiber.tag) {
|
|
@@ -670,12 +648,11 @@ var secure = (options, secureOptions = {}) => {
|
|
|
670
648
|
const isUsingRealReactDevtools = isRealReactDevtools();
|
|
671
649
|
const isUsingReactRefresh = isReactRefresh();
|
|
672
650
|
let timeout;
|
|
673
|
-
let isProduction = false;
|
|
651
|
+
let isProduction = secureOptions.isProduction ?? false;
|
|
674
652
|
options.onActive = () => {
|
|
675
653
|
clearTimeout(timeout);
|
|
676
654
|
let isSecure = true;
|
|
677
655
|
try {
|
|
678
|
-
onActive?.();
|
|
679
656
|
const rdtHook = getRDTHook();
|
|
680
657
|
for (const renderer of rdtHook.renderers.values()) {
|
|
681
658
|
const [majorVersion] = renderer.version.split(".");
|
|
@@ -700,6 +677,7 @@ var secure = (options, secureOptions = {}) => {
|
|
|
700
677
|
options.onActive = void 0;
|
|
701
678
|
return;
|
|
702
679
|
}
|
|
680
|
+
onActive?.();
|
|
703
681
|
try {
|
|
704
682
|
const onCommitFiberRoot2 = options.onCommitFiberRoot;
|
|
705
683
|
if (onCommitFiberRoot2) {
|
|
@@ -755,4 +733,4 @@ var onCommitFiberRoot = (handler) => {
|
|
|
755
733
|
);
|
|
756
734
|
};
|
|
757
735
|
|
|
758
|
-
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, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getRDTHook, getTimings, getType, hasMemoCache, hasRDTHook, installRDTHook, instrument, isClientEnvironment, isCompositeFiber, isHostFiber, isInstrumentationActive, isReactRefresh, isRealReactDevtools, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, patchRDTHook, secure, setFiberId, shouldFilterFiber, traverseContexts,
|
|
736
|
+
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, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getRDTHook, getTimings, getType, hasMemoCache, hasRDTHook, installRDTHook, instrument, isClientEnvironment, isCompositeFiber, isHostFiber, isInstrumentationActive, isReactRefresh, isRealReactDevtools, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, patchRDTHook, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively, version };
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
// src/rdt-hook.ts
|
|
13
|
-
var version = "0.2.
|
|
13
|
+
var version = "0.2.24";
|
|
14
14
|
var BIPPY_INSTRUMENTATION_STRING = `bippy-${version}`;
|
|
15
15
|
var objectDefineProperty = Object.defineProperty;
|
|
16
16
|
var objectHasOwnProperty = Object.prototype.hasOwnProperty;
|
|
@@ -41,6 +41,7 @@ var isReactRefresh = (rdtHook = getRDTHook()) => {
|
|
|
41
41
|
}
|
|
42
42
|
return Boolean(injectFnStr?.includes("(injected)"));
|
|
43
43
|
};
|
|
44
|
+
var onActiveListeners = /* @__PURE__ */ new Set();
|
|
44
45
|
var installRDTHook = (onActive) => {
|
|
45
46
|
const renderers = /* @__PURE__ */ new Map();
|
|
46
47
|
let i = 0;
|
|
@@ -58,7 +59,7 @@ var installRDTHook = (onActive) => {
|
|
|
58
59
|
renderers.set(nextID, renderer);
|
|
59
60
|
if (!rdtHook._instrumentationIsActive) {
|
|
60
61
|
rdtHook._instrumentationIsActive = true;
|
|
61
|
-
|
|
62
|
+
onActiveListeners.forEach((listener) => listener());
|
|
62
63
|
}
|
|
63
64
|
return nextID;
|
|
64
65
|
},
|
|
@@ -91,6 +92,9 @@ var installRDTHook = (onActive) => {
|
|
|
91
92
|
return rdtHook;
|
|
92
93
|
};
|
|
93
94
|
var patchRDTHook = (onActive) => {
|
|
95
|
+
if (onActive) {
|
|
96
|
+
onActiveListeners.add(onActive);
|
|
97
|
+
}
|
|
94
98
|
try {
|
|
95
99
|
const rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
96
100
|
if (!rdtHook) return;
|
|
@@ -104,11 +108,11 @@ var patchRDTHook = (onActive) => {
|
|
|
104
108
|
rdtHook._instrumentationIsActive = false;
|
|
105
109
|
if (rdtHook.renderers.size) {
|
|
106
110
|
rdtHook._instrumentationIsActive = true;
|
|
107
|
-
|
|
111
|
+
onActiveListeners.forEach((listener) => listener());
|
|
108
112
|
return;
|
|
109
113
|
}
|
|
110
114
|
const prevInject = rdtHook.inject;
|
|
111
|
-
if (isReactRefresh(rdtHook)) {
|
|
115
|
+
if (isReactRefresh(rdtHook) && !isRealReactDevtools()) {
|
|
112
116
|
isReactRefreshOverride = true;
|
|
113
117
|
let nextID = rdtHook.inject(null);
|
|
114
118
|
if (nextID) {
|
|
@@ -119,7 +123,7 @@ var patchRDTHook = (onActive) => {
|
|
|
119
123
|
rdtHook.inject = (renderer) => {
|
|
120
124
|
const id = prevInject(renderer);
|
|
121
125
|
rdtHook._instrumentationIsActive = true;
|
|
122
|
-
|
|
126
|
+
onActiveListeners.forEach((listener) => listener());
|
|
123
127
|
return id;
|
|
124
128
|
};
|
|
125
129
|
}
|
|
@@ -247,28 +251,6 @@ var traverseState = (fiber, selector) => {
|
|
|
247
251
|
}
|
|
248
252
|
return false;
|
|
249
253
|
};
|
|
250
|
-
var traverseEffects = (fiber, selector) => {
|
|
251
|
-
try {
|
|
252
|
-
let nextState = (
|
|
253
|
-
// biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
|
|
254
|
-
fiber.updateQueue?.lastEffect
|
|
255
|
-
);
|
|
256
|
-
let prevState = (
|
|
257
|
-
// biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
|
|
258
|
-
fiber.alternate?.updateQueue?.lastEffect
|
|
259
|
-
);
|
|
260
|
-
while (nextState || prevState) {
|
|
261
|
-
if (selector(nextState, prevState) === true) return true;
|
|
262
|
-
if (nextState?.next === nextState || prevState?.next === prevState) {
|
|
263
|
-
break;
|
|
264
|
-
}
|
|
265
|
-
nextState = nextState?.next;
|
|
266
|
-
prevState = prevState?.next;
|
|
267
|
-
}
|
|
268
|
-
} catch {
|
|
269
|
-
}
|
|
270
|
-
return false;
|
|
271
|
-
};
|
|
272
254
|
var traverseProps = (fiber, selector) => {
|
|
273
255
|
try {
|
|
274
256
|
const nextProps = fiber.memoizedProps;
|
|
@@ -330,11 +312,7 @@ var getFiberStack = (fiber) => {
|
|
|
330
312
|
stack.push(currentFiber);
|
|
331
313
|
currentFiber = currentFiber.return;
|
|
332
314
|
}
|
|
333
|
-
|
|
334
|
-
for (let i = 0; i < stack.length; i++) {
|
|
335
|
-
newStack[i] = stack[stack.length - i - 1];
|
|
336
|
-
}
|
|
337
|
-
return newStack;
|
|
315
|
+
return stack;
|
|
338
316
|
};
|
|
339
317
|
var shouldFilterFiber = (fiber) => {
|
|
340
318
|
switch (fiber.tag) {
|
|
@@ -672,12 +650,11 @@ var secure = (options, secureOptions = {}) => {
|
|
|
672
650
|
const isUsingRealReactDevtools = isRealReactDevtools();
|
|
673
651
|
const isUsingReactRefresh = isReactRefresh();
|
|
674
652
|
let timeout;
|
|
675
|
-
let isProduction = false;
|
|
653
|
+
let isProduction = secureOptions.isProduction ?? false;
|
|
676
654
|
options.onActive = () => {
|
|
677
655
|
clearTimeout(timeout);
|
|
678
656
|
let isSecure = true;
|
|
679
657
|
try {
|
|
680
|
-
onActive?.();
|
|
681
658
|
const rdtHook = getRDTHook();
|
|
682
659
|
for (const renderer of rdtHook.renderers.values()) {
|
|
683
660
|
const [majorVersion] = renderer.version.split(".");
|
|
@@ -702,6 +679,7 @@ var secure = (options, secureOptions = {}) => {
|
|
|
702
679
|
options.onActive = void 0;
|
|
703
680
|
return;
|
|
704
681
|
}
|
|
682
|
+
onActive?.();
|
|
705
683
|
try {
|
|
706
684
|
const onCommitFiberRoot2 = options.onCommitFiberRoot;
|
|
707
685
|
if (onCommitFiberRoot2) {
|
|
@@ -815,7 +793,6 @@ exports.secure = secure;
|
|
|
815
793
|
exports.setFiberId = setFiberId;
|
|
816
794
|
exports.shouldFilterFiber = shouldFilterFiber;
|
|
817
795
|
exports.traverseContexts = traverseContexts;
|
|
818
|
-
exports.traverseEffects = traverseEffects;
|
|
819
796
|
exports.traverseFiber = traverseFiber;
|
|
820
797
|
exports.traverseProps = traverseProps;
|
|
821
798
|
exports.traverseRenderedFibers = traverseRenderedFibers;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkGVWERSAB_cjs = require('./chunk-GVWERSAB.cjs');
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @license bippy
|
|
@@ -13,8 +13,8 @@ var chunkA5CNTCS7_cjs = require('./chunk-A5CNTCS7.cjs');
|
|
|
13
13
|
|
|
14
14
|
// src/index.ts
|
|
15
15
|
try {
|
|
16
|
-
if (
|
|
17
|
-
|
|
16
|
+
if (chunkGVWERSAB_cjs.isClientEnvironment()) {
|
|
17
|
+
chunkGVWERSAB_cjs.getRDTHook();
|
|
18
18
|
}
|
|
19
19
|
} catch {
|
|
20
20
|
}
|