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 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.22";
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
- onActive?.();
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
- onActive?.();
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
- onActive?.();
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
- const newStack = new Array(stack.length);
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, traverseEffects, traverseFiber, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively, version };
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.22";
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
- onActive?.();
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
- onActive?.();
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
- onActive?.();
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
- const newStack = new Array(stack.length);
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 chunkA5CNTCS7_cjs = require('./chunk-A5CNTCS7.cjs');
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 (chunkA5CNTCS7_cjs.isClientEnvironment()) {
17
- chunkA5CNTCS7_cjs.getRDTHook();
16
+ if (chunkGVWERSAB_cjs.isClientEnvironment()) {
17
+ chunkGVWERSAB_cjs.getRDTHook();
18
18
  }
19
19
  } catch {
20
20
  }
@@ -1,4 +1,4 @@
1
- import { isClientEnvironment, getRDTHook } from './chunk-DE5T66AV.js';
1
+ import { isClientEnvironment, getRDTHook } from './chunk-347RWTP3.js';
2
2
 
3
3
  /**
4
4
  * @license bippy