bippy 0.1.1 → 0.2.0

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
@@ -18,15 +18,13 @@ by default, you cannot access react internals. bippy bypasses this by "pretendin
18
18
  - no prior react source code knowledge required
19
19
 
20
20
  ```jsx
21
- import { instrument, traverseFiber } from 'bippy';
22
-
23
- instrument({
24
- onCommitFiberRoot(_, root) {
25
- traverseFiber(root.current, (fiber) => {
26
- // will print every fiber in the current React tree
27
- console.log('fiber:', fiber);
28
- });
29
- },
21
+ import { onCommitFiberRoot, traverseFiber } from 'bippy';
22
+
23
+ onCommitFiberRoot((root) => {
24
+ traverseFiber(root.current, (fiber) => {
25
+ // prints every fiber in the current React tree
26
+ console.log('fiber:', fiber);
27
+ });
30
28
  });
31
29
  ```
32
30
 
@@ -87,7 +85,7 @@ additionally, `memoizedProps`, `memoizedState`, and `dependencies` are the fiber
87
85
 
88
86
  while all of the information is there, it's not super easy to work with, and changes frequently across different versions of react. bippy simplifies this by providing utility functions like:
89
87
 
90
- - `createFiberVisitor` to detect renders and `traverseFiber` to traverse the overall fiber tree
88
+ - `traverseRenderedFibers` to detect renders and `traverseFiber` to traverse the overall fiber tree
91
89
  - _(instead of `child`, `sibling`, and `return` pointers)_
92
90
  - `traverseProps`, `traverseState`, and `traverseContexts` to traverse the fiber's props, state, and contexts
93
91
  - _(instead of `memoizedProps`, `memoizedState`, and `dependencies`)_
@@ -125,7 +123,7 @@ bippy works by monkey-patching `window.__REACT_DEVTOOLS_GLOBAL_HOOK__` with our
125
123
  - _(instead of directly mutating `onCommitFiberRoot`, ...)_
126
124
  - `secure` to wrap your handlers in a try/catch and determine if handlers are safe to run
127
125
  - _(instead of rawdogging `window.__REACT_DEVTOOLS_GLOBAL_HOOK__` handlers, which may crash your app)_
128
- - `createFiberVisitor` to traverse the fiber tree and determine which fibers have actually rendered
126
+ - `traverseRenderedFibers` to traverse the fiber tree and determine which fibers have actually rendered
129
127
  - _(instead of `child`, `sibling`, and `return` pointers)_
130
128
  - `traverseFiber` to traverse the fiber tree, regardless of whether it has rendered
131
129
  - _(instead of `child`, `sibling`, and `return` pointers)_
@@ -142,7 +140,7 @@ this package should be imported before a React app runs. this will add a special
142
140
  npm install bippy
143
141
  ```
144
142
 
145
- or, use via script tag. must be added before any other scripts run:
143
+ or, use via script tag:
146
144
 
147
145
  ```html
148
146
  <script src="https://unpkg.com/bippy"></script>
@@ -152,8 +150,23 @@ or, use via script tag. must be added before any other scripts run:
152
150
 
153
151
  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).
154
152
 
153
+
154
+ ### onCommitFiberRoot
155
+
156
+ a utility function that wraps the `instrument` function and sets the `onCommitFiberRoot` hook.
157
+
158
+ ```typescript
159
+ import { onCommitFiberRoot } from 'bippy';
160
+
161
+ onCommitFiberRoot((root) => {
162
+ console.log('root ready to commit', root);
163
+ });
164
+ ```
165
+
155
166
  ### instrument
156
167
 
168
+ > the underlying implementation for the `onCommitFiberRoot()` function. this is optional, unless you want to plug into more less common, advanced functionality.
169
+
157
170
  patches `window.__REACT_DEVTOOLS_GLOBAL_HOOK__` with your handlers. must be imported before react, and must be initialized to properly run any other methods.
158
171
 
159
172
  > use with the `secure` function to prevent uncaught errors from crashing your app.
@@ -177,24 +190,31 @@ instrument(
177
190
  );
178
191
  ```
179
192
 
180
- ### createFiberVisitor
193
+ ### getRDTHook
181
194
 
182
- not every fiber in the fiber tree renders. `createFiberVisitor` allows you to traverse the fiber tree and determine which fibers have actually rendered.
195
+ returns the `window.__REACT_DEVTOOLS_GLOBAL_HOOK__` object. great for advanced use cases, such as accessing or modifying the `renderers` property.
183
196
 
184
197
  ```typescript
185
- import { instrument, secure, createFiberVisitor } from 'bippy'; // must be imported BEFORE react
186
- import * as React from 'react';
198
+ import { getRDTHook } from 'bippy';
187
199
 
188
- const visit = createFiberVisitor({
189
- onRender(fiber) {
190
- console.log('fiber rendered', fiber);
191
- },
192
- });
200
+ const hook = getRDTHook();
201
+ console.log(hook);
202
+ ```
203
+
204
+ ### traverseRenderedFibers
205
+
206
+ not every fiber in the fiber tree renders. `traverseRenderedFibers` allows you to traverse the fiber tree and determine which fibers have actually rendered.
207
+
208
+ ```typescript
209
+ import { instrument, secure, traverseRenderedFibers } from 'bippy'; // must be imported BEFORE react
210
+ import * as React from 'react';
193
211
 
194
212
  instrument(
195
213
  secure({
196
214
  onCommitFiberRoot(rendererID, root) {
197
- visit(rendererID, root);
215
+ traverseRenderedFibers(root, (fiber) => {
216
+ console.log('fiber rendered', fiber);
217
+ });
198
218
  },
199
219
  })
200
220
  );
@@ -275,6 +295,7 @@ traverseContexts(fiber, (next, prev) => {
275
295
  });
276
296
  ```
277
297
 
298
+
278
299
  ### setFiberId / getFiberId
279
300
 
280
301
  set and get a persistent identity for a fiber. by default, fibers are anonymous and have no identity.
@@ -415,7 +436,7 @@ import {
415
436
  instrument,
416
437
  isHostFiber,
417
438
  getNearestHostFiber,
418
- createFiberVisitor,
439
+ traverseRenderedFibers,
419
440
  } from 'bippy'; // must be imported BEFORE react
420
441
 
421
442
  const highlightFiber = (fiber) => {
@@ -436,29 +457,6 @@ const highlightFiber = (fiber) => {
436
457
  }, 100);
437
458
  };
438
459
 
439
- /**
440
- * `createFiberVisitor` traverses the fiber tree and determines which
441
- * fibers have actually rendered.
442
- *
443
- * A fiber tree contains many fibers that may have not rendered. this
444
- * can be because it bailed out (e.g. `useMemo`) or because it wasn't
445
- * actually rendered (if <Child> re-rendered, then <Parent> didn't
446
- * actually render, but exists in the fiber tree).
447
- */
448
- const visit = createFiberVisitor({
449
- onRender(fiber) {
450
- /**
451
- * `getNearestHostFiber` is a utility function that finds the
452
- * nearest host fiber to a given fiber.
453
- *
454
- * a host fiber for `react-dom` is a fiber that has a DOM element
455
- * as its `stateNode`.
456
- */
457
- const hostFiber = getNearestHostFiber(fiber);
458
- highlightFiber(hostFiber);
459
- },
460
- });
461
-
462
460
  /**
463
461
  * `instrument` is a function that installs the react DevTools global
464
462
  * hook and allows you to set up custom handlers for react fiber events.
@@ -480,7 +478,26 @@ instrument(
480
478
  * the host tree (e.g. via DOM mutations).
481
479
  */
482
480
  onCommitFiberRoot(rendererID, root) {
483
- visit(rendererID, root);
481
+ /**
482
+ * `traverseRenderedFibers` traverses the fiber tree and determines which
483
+ * fibers have actually rendered.
484
+ *
485
+ * A fiber tree contains many fibers that may have not rendered. this
486
+ * can be because it bailed out (e.g. `useMemo`) or because it wasn't
487
+ * actually rendered (if <Child> re-rendered, then <Parent> didn't
488
+ * actually render, but exists in the fiber tree).
489
+ */
490
+ traverseRenderedFibers(root, (fiber) => {
491
+ /**
492
+ * `getNearestHostFiber` is a utility function that finds the
493
+ * nearest host fiber to a given fiber.
494
+ *
495
+ * a host fiber for `react-dom` is a fiber that has a DOM element
496
+ * as its `stateNode`.
497
+ */
498
+ const hostFiber = getNearestHostFiber(fiber);
499
+ highlightFiber(hostFiber);
500
+ });
484
501
  },
485
502
  })
486
503
  );
@@ -494,7 +511,7 @@ here's a mini toy version of [`why-did-you-render`](https://github.com/welldone-
494
511
  import {
495
512
  instrument,
496
513
  isHostFiber,
497
- createFiberVisitor,
514
+ traverseRenderedFibers,
498
515
  isCompositeFiber,
499
516
  getDisplayName,
500
517
  traverseProps,
@@ -502,84 +519,80 @@ import {
502
519
  traverseState,
503
520
  } from 'bippy'; // must be imported BEFORE react
504
521
 
505
- const visit = createFiberVisitor({
506
- onRender(fiber) {
507
- /**
508
- * `isCompositeFiber` is a utility function that checks if a fiber is a composite fiber.
509
- * a composite fiber is a fiber that represents a function or class component.
510
- */
511
- if (!isCompositeFiber(fiber)) return;
512
-
513
- /**
514
- * `getDisplayName` is a utility function that gets the display name of a fiber.
515
- */
516
- const displayName = getDisplayName(fiber);
517
- if (!displayName) return;
518
-
519
- const changes = [];
520
-
521
- /**
522
- * `traverseProps` is a utility function that traverses the props of a fiber.
523
- */
524
- traverseProps(fiber, (propName, next, prev) => {
525
- if (next !== prev) {
526
- changes.push({
527
- name: `prop ${propName}`,
528
- prev,
529
- next,
522
+ instrument(
523
+ secure({
524
+ onCommitFiberRoot(rendererID, root) {
525
+ traverseRenderedFibers(root, (fiber) => {
526
+ /**
527
+ * `isCompositeFiber` is a utility function that checks if a fiber is a composite fiber.
528
+ * a composite fiber is a fiber that represents a function or class component.
529
+ */
530
+ if (!isCompositeFiber(fiber)) return;
531
+
532
+ /**
533
+ * `getDisplayName` is a utility function that gets the display name of a fiber.
534
+ */
535
+ const displayName = getDisplayName(fiber);
536
+ if (!displayName) return;
537
+
538
+ const changes = [];
539
+
540
+ /**
541
+ * `traverseProps` is a utility function that traverses the props of a fiber.
542
+ */
543
+ traverseProps(fiber, (propName, next, prev) => {
544
+ if (next !== prev) {
545
+ changes.push({
546
+ name: `prop ${propName}`,
547
+ prev,
548
+ next,
549
+ });
550
+ }
530
551
  });
531
- }
532
- });
533
552
 
534
- let contextId = 0;
535
- /**
536
- * `traverseContexts` is a utility function that traverses the contexts of a fiber.
537
- * Contexts don't have a "name" like props, so we use an id to identify them.
538
- */
539
- traverseContexts(fiber, (next, prev) => {
540
- if (next !== prev) {
541
- changes.push({
542
- name: `context ${contextId}`,
543
- prev,
544
- next,
545
- contextId,
553
+ let contextId = 0;
554
+ /**
555
+ * `traverseContexts` is a utility function that traverses the contexts of a fiber.
556
+ * Contexts don't have a "name" like props, so we use an id to identify them.
557
+ */
558
+ traverseContexts(fiber, (next, prev) => {
559
+ if (next !== prev) {
560
+ changes.push({
561
+ name: `context ${contextId}`,
562
+ prev,
563
+ next,
564
+ contextId,
565
+ });
566
+ }
567
+ contextId++;
546
568
  });
547
- }
548
- contextId++;
549
- });
550
569
 
551
- let stateId = 0;
552
- /**
553
- * `traverseState` is a utility function that traverses the state of a fiber.
554
- *
555
- * State don't have a "name" like props, so we use an id to identify them.
556
- */
557
- traverseState(fiber, (value, prevValue) => {
558
- if (next !== prev) {
559
- changes.push({
560
- name: `state ${stateId}`,
561
- prev,
562
- next,
570
+ let stateId = 0;
571
+ /**
572
+ * `traverseState` is a utility function that traverses the state of a fiber.
573
+ *
574
+ * State don't have a "name" like props, so we use an id to identify them.
575
+ */
576
+ traverseState(fiber, (value, prevValue) => {
577
+ if (next !== prev) {
578
+ changes.push({
579
+ name: `state ${stateId}`,
580
+ prev,
581
+ next,
582
+ });
583
+ }
584
+ stateId++;
563
585
  });
564
- }
565
- stateId++;
566
- });
567
-
568
- console.group(
569
- `%c${displayName}`,
570
- 'background: hsla(0,0%,70%,.3); border-radius:3px; padding: 0 2px;'
571
- );
572
- for (const { name, prev, next } of changes) {
573
- console.log(`${name}:`, prev, '!==', next);
574
- }
575
- console.groupEnd();
576
- },
577
- });
578
586
 
579
- instrument(
580
- secure({
581
- onCommitFiberRoot(rendererID, root) {
582
- visit(rendererID, root);
587
+ console.group(
588
+ `%c${displayName}`,
589
+ 'background: hsla(0,0%,70%,.3); border-radius:3px; padding: 0 2px;'
590
+ );
591
+ for (const { name, prev, next } of changes) {
592
+ console.log(`${name}:`, prev, '!==', next);
593
+ }
594
+ console.groupEnd();
595
+ });
583
596
  },
584
597
  })
585
598
  );
package/dist/core.cjs CHANGED
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  // src/rdt-hook.ts
13
- var version = "0.1.0";
13
+ var version = "0.2.0";
14
14
  var BIPPY_INSTRUMENTATION_STRING = `bippy-${version}`;
15
15
  var NO_OP = () => {
16
16
  };
@@ -510,46 +510,38 @@ var unmountFiberChildrenRecursively = (onRender, fiber) => {
510
510
  };
511
511
  var commitId = 0;
512
512
  var rootInstanceMap = /* @__PURE__ */ new WeakMap();
513
+ var traverseRenderedFibers = (root, onRender) => {
514
+ const fiber = "current" in root ? root.current : root;
515
+ let rootInstance = rootInstanceMap.get(root);
516
+ if (!rootInstance) {
517
+ rootInstance = { prevFiber: null, id: commitId++ };
518
+ rootInstanceMap.set(root, rootInstance);
519
+ }
520
+ const { prevFiber } = rootInstance;
521
+ if (!fiber) {
522
+ unmountFiber(onRender, fiber);
523
+ } else if (prevFiber !== null) {
524
+ const wasMounted = prevFiber && prevFiber.memoizedState != null && prevFiber.memoizedState.element != null && // A dehydrated root is not considered mounted
525
+ prevFiber.memoizedState.isDehydrated !== true;
526
+ const isMounted = fiber.memoizedState != null && fiber.memoizedState.element != null && // A dehydrated root is not considered mounted
527
+ fiber.memoizedState.isDehydrated !== true;
528
+ if (!wasMounted && isMounted) {
529
+ mountFiberRecursively(onRender, fiber, false);
530
+ } else if (wasMounted && isMounted) {
531
+ updateFiberRecursively(onRender, fiber, fiber.alternate);
532
+ } else if (wasMounted && !isMounted) {
533
+ unmountFiber(onRender, fiber);
534
+ }
535
+ } else {
536
+ mountFiberRecursively(onRender, fiber, true);
537
+ }
538
+ rootInstance.prevFiber = fiber;
539
+ };
513
540
  var createFiberVisitor = ({
514
- onRender: onRenderWithoutState,
515
- onError
541
+ onRender
516
542
  }) => {
517
- return (_rendererID, root, state) => {
518
- const rootFiber = "current" in root ? root.current : root;
519
- const onRender = (fiber, phase) => onRenderWithoutState(fiber, phase, state);
520
- let rootInstance = rootInstanceMap.get(root);
521
- if (!rootInstance) {
522
- rootInstance = { prevFiber: null, id: commitId++ };
523
- rootInstanceMap.set(root, rootInstance);
524
- }
525
- const { prevFiber } = rootInstance;
526
- try {
527
- if (!rootFiber) {
528
- unmountFiber(onRender, root);
529
- } else if (prevFiber !== null) {
530
- const wasMounted = prevFiber && prevFiber.memoizedState != null && prevFiber.memoizedState.element != null && // A dehydrated root is not considered mounted
531
- prevFiber.memoizedState.isDehydrated !== true;
532
- const isMounted = rootFiber.memoizedState != null && rootFiber.memoizedState.element != null && // A dehydrated root is not considered mounted
533
- rootFiber.memoizedState.isDehydrated !== true;
534
- if (!wasMounted && isMounted) {
535
- mountFiberRecursively(onRender, rootFiber, false);
536
- } else if (wasMounted && isMounted) {
537
- updateFiberRecursively(
538
- onRender,
539
- rootFiber,
540
- rootFiber.alternate,
541
- null
542
- );
543
- } else if (wasMounted && !isMounted) {
544
- unmountFiber(onRender, rootFiber);
545
- }
546
- } else {
547
- mountFiberRecursively(onRender, rootFiber, true);
548
- }
549
- } catch (error) {
550
- onError(error);
551
- }
552
- rootInstance.prevFiber = rootFiber;
543
+ return (_rendererID, root, _state) => {
544
+ traverseRenderedFibers(root, onRender);
553
545
  };
554
546
  };
555
547
  var instrument = (options) => {
@@ -640,11 +632,11 @@ var secure = (options, secureOptions = {}) => {
640
632
  return;
641
633
  }
642
634
  try {
643
- const onCommitFiberRoot = options.onCommitFiberRoot;
644
- if (onCommitFiberRoot) {
635
+ const onCommitFiberRoot2 = options.onCommitFiberRoot;
636
+ if (onCommitFiberRoot2) {
645
637
  options.onCommitFiberRoot = (rendererID, root, priority) => {
646
638
  try {
647
- onCommitFiberRoot(rendererID, root, priority);
639
+ onCommitFiberRoot2(rendererID, root, priority);
648
640
  } catch (err) {
649
641
  secureOptions.onError?.(err);
650
642
  }
@@ -684,6 +676,15 @@ var secure = (options, secureOptions = {}) => {
684
676
  }
685
677
  return options;
686
678
  };
679
+ var onCommitFiberRoot = (handler) => {
680
+ instrument(
681
+ secure({
682
+ onCommitFiberRoot: (_, root) => {
683
+ handler(root);
684
+ }
685
+ })
686
+ );
687
+ };
687
688
 
688
689
  exports.CONCURRENT_MODE_NUMBER = CONCURRENT_MODE_NUMBER;
689
690
  exports.CONCURRENT_MODE_SYMBOL_STRING = CONCURRENT_MODE_SYMBOL_STRING;
@@ -729,6 +730,7 @@ exports.isUsingRDT = isUsingRDT;
729
730
  exports.isValidElement = isValidElement;
730
731
  exports.isValidFiber = isValidFiber;
731
732
  exports.mountFiberRecursively = mountFiberRecursively;
733
+ exports.onCommitFiberRoot = onCommitFiberRoot;
732
734
  exports.secure = secure;
733
735
  exports.setFiberId = setFiberId;
734
736
  exports.shouldFilterFiber = shouldFilterFiber;
@@ -736,6 +738,7 @@ exports.traverseContexts = traverseContexts;
736
738
  exports.traverseEffects = traverseEffects;
737
739
  exports.traverseFiber = traverseFiber;
738
740
  exports.traverseProps = traverseProps;
741
+ exports.traverseRenderedFibers = traverseRenderedFibers;
739
742
  exports.traverseState = traverseState;
740
743
  exports.unmountFiber = unmountFiber;
741
744
  exports.unmountFiberChildrenRecursively = unmountFiberChildrenRecursively;
package/dist/core.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { F as Fiber, C as ContextDependency, M as MemoizedState, E as Effect, a as ReactRenderer, R as ReactDevToolsGlobalHook } from './types-CxxtX49h.cjs';
1
+ import { F as Fiber, C as ContextDependency, M as MemoizedState, E as Effect, a as ReactRenderer, R as ReactDevToolsGlobalHook } from './types-BqcvCznx.cjs';
2
2
  import * as React from 'react';
3
3
  import { FiberRoot } from 'react-reconciler';
4
4
 
@@ -132,7 +132,7 @@ declare const detectReactBuildType: (renderer: ReactRenderer) => "development" |
132
132
  * Returns `true` if bippy's instrumentation is active.
133
133
  */
134
134
  declare const isInstrumentationActive: () => boolean;
135
- type RenderPhase = "mount" | "update" | "unmount";
135
+ type RenderPhase = 'mount' | 'update' | 'unmount';
136
136
  type RenderHandler = <S>(fiber: Fiber, phase: RenderPhase, state?: S) => unknown;
137
137
  declare const fiberIdMap: WeakMap<Fiber, number>;
138
138
  declare const setFiberId: (fiber: Fiber, id?: number) => void;
@@ -142,18 +142,20 @@ declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber
142
142
  declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber) => void;
143
143
  declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber) => void;
144
144
  /**
145
- * Creates a fiber visitor function.
145
+ * Creates a fiber visitor function. Must pass a fiber root and a render handler.
146
146
  * @example
147
- * const visitor = createFiberVisitor({
148
- * onRender(fiber, phase) {
149
- * console.log(phase)
150
- * },
151
- * });
147
+ * traverseRenderedFibers(root, (fiber, phase) => {
148
+ * console.log(phase)
149
+ * })
152
150
  */
153
- declare const createFiberVisitor: ({ onRender: onRenderWithoutState, onError, }: {
151
+ declare const traverseRenderedFibers: (root: FiberRoot, onRender: RenderHandler) => void;
152
+ /**
153
+ * @deprecated use `traverseRenderedFibers` instead
154
+ */
155
+ declare const createFiberVisitor: ({ onRender, }: {
154
156
  onRender: RenderHandler;
155
157
  onError: (error: unknown) => unknown;
156
- }) => <S>(_rendererID: number, root: FiberRoot | Fiber, state?: S) => void;
158
+ }) => <S>(_rendererID: number, root: FiberRoot | Fiber, _state?: S) => void;
157
159
  interface InstrumentationOptions {
158
160
  onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => unknown;
159
161
  onCommitFiberUnmount?: (rendererID: number, fiber: Fiber) => unknown;
@@ -174,12 +176,21 @@ interface InstrumentationOptions {
174
176
  * });
175
177
  */
176
178
  declare const instrument: (options: InstrumentationOptions) => ReactDevToolsGlobalHook;
177
- declare const getFiberFromHostInstance: <T>(hostInstance: T) => any;
179
+ declare const getFiberFromHostInstance: <T>(hostInstance: T) => Fiber | null | undefined;
178
180
  declare const secure: (options: InstrumentationOptions, secureOptions?: {
179
181
  minReactMajorVersion?: number;
180
182
  dangerouslyRunInProduction?: boolean;
181
183
  onError?: (error?: unknown) => unknown;
182
184
  installCheckTimeout?: number;
183
185
  }) => InstrumentationOptions;
186
+ /**
187
+ * a wrapper around the {@link instrument} function that sets the `onCommitFiberRoot` hook.
188
+ *
189
+ * @example
190
+ * onCommitFiberRoot((root) => {
191
+ * console.log(root.current);
192
+ * });
193
+ */
194
+ declare const onCommitFiberRoot: (handler: (root: FiberRoot) => void) => void;
184
195
 
185
- export { 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, type InstrumentationOptions, LegacyHiddenComponentTag, MemoComponentTag, OffscreenComponentTag, type RenderHandler, type RenderPhase, SimpleMemoComponentTag, SuspenseComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, isValidFiber, mountFiberRecursively, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseEffects, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
196
+ export { 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, type InstrumentationOptions, LegacyHiddenComponentTag, MemoComponentTag, OffscreenComponentTag, type RenderHandler, type RenderPhase, SimpleMemoComponentTag, SuspenseComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseEffects, traverseFiber, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
package/dist/core.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { F as Fiber, C as ContextDependency, M as MemoizedState, E as Effect, a as ReactRenderer, R as ReactDevToolsGlobalHook } from './types-CxxtX49h.js';
1
+ import { F as Fiber, C as ContextDependency, M as MemoizedState, E as Effect, a as ReactRenderer, R as ReactDevToolsGlobalHook } from './types-BqcvCznx.js';
2
2
  import * as React from 'react';
3
3
  import { FiberRoot } from 'react-reconciler';
4
4
 
@@ -132,7 +132,7 @@ declare const detectReactBuildType: (renderer: ReactRenderer) => "development" |
132
132
  * Returns `true` if bippy's instrumentation is active.
133
133
  */
134
134
  declare const isInstrumentationActive: () => boolean;
135
- type RenderPhase = "mount" | "update" | "unmount";
135
+ type RenderPhase = 'mount' | 'update' | 'unmount';
136
136
  type RenderHandler = <S>(fiber: Fiber, phase: RenderPhase, state?: S) => unknown;
137
137
  declare const fiberIdMap: WeakMap<Fiber, number>;
138
138
  declare const setFiberId: (fiber: Fiber, id?: number) => void;
@@ -142,18 +142,20 @@ declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber
142
142
  declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber) => void;
143
143
  declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber) => void;
144
144
  /**
145
- * Creates a fiber visitor function.
145
+ * Creates a fiber visitor function. Must pass a fiber root and a render handler.
146
146
  * @example
147
- * const visitor = createFiberVisitor({
148
- * onRender(fiber, phase) {
149
- * console.log(phase)
150
- * },
151
- * });
147
+ * traverseRenderedFibers(root, (fiber, phase) => {
148
+ * console.log(phase)
149
+ * })
152
150
  */
153
- declare const createFiberVisitor: ({ onRender: onRenderWithoutState, onError, }: {
151
+ declare const traverseRenderedFibers: (root: FiberRoot, onRender: RenderHandler) => void;
152
+ /**
153
+ * @deprecated use `traverseRenderedFibers` instead
154
+ */
155
+ declare const createFiberVisitor: ({ onRender, }: {
154
156
  onRender: RenderHandler;
155
157
  onError: (error: unknown) => unknown;
156
- }) => <S>(_rendererID: number, root: FiberRoot | Fiber, state?: S) => void;
158
+ }) => <S>(_rendererID: number, root: FiberRoot | Fiber, _state?: S) => void;
157
159
  interface InstrumentationOptions {
158
160
  onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => unknown;
159
161
  onCommitFiberUnmount?: (rendererID: number, fiber: Fiber) => unknown;
@@ -174,12 +176,21 @@ interface InstrumentationOptions {
174
176
  * });
175
177
  */
176
178
  declare const instrument: (options: InstrumentationOptions) => ReactDevToolsGlobalHook;
177
- declare const getFiberFromHostInstance: <T>(hostInstance: T) => any;
179
+ declare const getFiberFromHostInstance: <T>(hostInstance: T) => Fiber | null | undefined;
178
180
  declare const secure: (options: InstrumentationOptions, secureOptions?: {
179
181
  minReactMajorVersion?: number;
180
182
  dangerouslyRunInProduction?: boolean;
181
183
  onError?: (error?: unknown) => unknown;
182
184
  installCheckTimeout?: number;
183
185
  }) => InstrumentationOptions;
186
+ /**
187
+ * a wrapper around the {@link instrument} function that sets the `onCommitFiberRoot` hook.
188
+ *
189
+ * @example
190
+ * onCommitFiberRoot((root) => {
191
+ * console.log(root.current);
192
+ * });
193
+ */
194
+ declare const onCommitFiberRoot: (handler: (root: FiberRoot) => void) => void;
184
195
 
185
- export { 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, type InstrumentationOptions, LegacyHiddenComponentTag, MemoComponentTag, OffscreenComponentTag, type RenderHandler, type RenderPhase, SimpleMemoComponentTag, SuspenseComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, isValidFiber, mountFiberRecursively, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseEffects, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
196
+ export { 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, type InstrumentationOptions, LegacyHiddenComponentTag, MemoComponentTag, OffscreenComponentTag, type RenderHandler, type RenderPhase, SimpleMemoComponentTag, SuspenseComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseEffects, traverseFiber, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };