bippy 0.0.18 → 0.0.20

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/dist/index.cjs CHANGED
@@ -42,7 +42,10 @@ var Ref = 512;
42
42
  var Snapshot = 1024;
43
43
  var Visibility = 8192;
44
44
  var MutationMask = Placement | Update | ChildDeletion | ContentReset | Hydrating | Visibility | Snapshot;
45
- var isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && String(element.$$typeof) === "Symbol(react.element)";
45
+ var isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && // react 18 uses Symbol.for('react.element'), react 19 uses Symbol.for('react.transitional.element')
46
+ ["react.element", "react.transitional.element"].includes(
47
+ String(element.$$typeof)
48
+ );
46
49
  var isHostFiber = (fiber) => fiber.tag === HostComponentTag || // @ts-expect-error: it exists
47
50
  fiber.tag === HostHoistableTag || // @ts-expect-error: it exists
48
51
  fiber.tag === HostSingletonTag;
@@ -118,21 +121,16 @@ var didFiberCommit = (fiber) => {
118
121
  };
119
122
  var getMutatedHostFibers = (fiber) => {
120
123
  const mutations = [];
121
- const visited = /* @__PURE__ */ new WeakSet();
122
- const traverse = (node) => {
123
- if (!node || visited.has(node)) return;
124
- visited.add(node);
124
+ const stack = [fiber];
125
+ while (stack.length) {
126
+ const node = stack.pop();
127
+ if (!node) continue;
125
128
  if (isHostFiber(node) && didFiberCommit(node) && didFiberRender(node)) {
126
129
  mutations.push(node);
127
130
  }
128
- if (node.child) {
129
- traverse(node.child);
130
- }
131
- if (node.sibling) {
132
- traverse(node.sibling);
133
- }
134
- };
135
- traverse(fiber);
131
+ if (node.child) stack.push(node.child);
132
+ if (node.sibling) stack.push(node.sibling);
133
+ }
136
134
  return mutations;
137
135
  };
138
136
  var getFiberStack = (fiber) => {
@@ -224,8 +222,10 @@ var getDisplayName = (type) => {
224
222
  };
225
223
  var NO_OP = () => {
226
224
  };
227
- var getRDTHook = () => {
225
+ var getRDTHook = (onActive) => {
228
226
  let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
227
+ const isActive = rdtHook && !("_instrumentationSource" in rdtHook);
228
+ if (isActive) onActive?.();
229
229
  const renderers = /* @__PURE__ */ new Map();
230
230
  let i = 0;
231
231
  rdtHook ??= {
@@ -239,17 +239,30 @@ var getRDTHook = () => {
239
239
  inject(renderer) {
240
240
  const nextID = ++i;
241
241
  renderers.set(nextID, renderer);
242
+ if (!rdtHook._instrumentationIsActive) {
243
+ rdtHook._instrumentationIsActive = true;
244
+ onActive?.();
245
+ }
242
246
  return nextID;
243
247
  },
244
- _instrumentationSource: "bippy"
248
+ _instrumentationSource: "bippy",
249
+ _instrumentationIsActive: isActive
245
250
  };
246
251
  try {
247
- globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = rdtHook;
252
+ Object.defineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
253
+ configurable: true,
254
+ value: rdtHook
255
+ });
248
256
  } catch {
249
257
  }
250
258
  return rdtHook;
251
259
  };
260
+ var isInstrumentationActive = (onActive) => {
261
+ const rdtHook = getRDTHook(onActive);
262
+ return Boolean(rdtHook._instrumentationIsActive);
263
+ };
252
264
  if (typeof window !== "undefined") {
265
+ performance.now();
253
266
  getRDTHook();
254
267
  }
255
268
  var mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
@@ -402,9 +415,10 @@ var instrument = ({
402
415
  onCommitFiberRoot,
403
416
  onCommitFiberUnmount,
404
417
  onPostCommitFiberRoot,
418
+ onActive,
405
419
  name
406
420
  }) => {
407
- const devtoolsHook = getRDTHook();
421
+ const devtoolsHook = getRDTHook(onActive);
408
422
  devtoolsHook._instrumentationSource = name ?? "bippy";
409
423
  const prevOnCommitFiberRoot = devtoolsHook.onCommitFiberRoot;
410
424
  if (onCommitFiberRoot) {
@@ -478,6 +492,7 @@ exports.hasMemoCache = hasMemoCache;
478
492
  exports.instrument = instrument;
479
493
  exports.isCompositeFiber = isCompositeFiber;
480
494
  exports.isHostFiber = isHostFiber;
495
+ exports.isInstrumentationActive = isInstrumentationActive;
481
496
  exports.isValidElement = isValidElement;
482
497
  exports.mountFiberRecursively = mountFiberRecursively;
483
498
  exports.shouldFilterFiber = shouldFilterFiber;
package/dist/index.d.cts CHANGED
@@ -11,6 +11,7 @@ interface ReactDevToolsGlobalHook {
11
11
  onPostCommitFiberRoot: (rendererID: number, root: unknown) => void;
12
12
  inject: (renderer: unknown) => number;
13
13
  _instrumentationSource?: string;
14
+ _instrumentationIsActive?: boolean;
14
15
  }
15
16
  declare const ClassComponentTag = 1;
16
17
  declare const FunctionComponentTag = 0;
@@ -74,21 +75,23 @@ declare const getTimings: (fiber?: Fiber | null | undefined) => {
74
75
  declare const hasMemoCache: (fiber: Fiber) => boolean;
75
76
  declare const getType: (type: any) => any;
76
77
  declare const getDisplayName: (type: any) => string | null;
77
- declare const getRDTHook: () => ReactDevToolsGlobalHook;
78
- type RenderHandler = <S>(fiber: Fiber, phase: 'mount' | 'update' | 'unmount', state?: S) => void;
78
+ declare const getRDTHook: (onActive?: () => unknown) => ReactDevToolsGlobalHook;
79
+ declare const isInstrumentationActive: (onActive?: () => unknown) => boolean;
80
+ type RenderHandler = <S>(fiber: Fiber, phase: 'mount' | 'update' | 'unmount', state?: S) => unknown;
79
81
  declare const mountFiberRecursively: (onRender: RenderHandler, firstChild: Fiber, traverseSiblings: boolean) => void;
80
82
  declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber, prevFiber: Fiber, parentFiber: Fiber | null) => void;
81
83
  declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber) => void;
82
84
  declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber) => void;
83
85
  declare const createFiberVisitor: ({ onRender: onRenderWithoutState, onError, }: {
84
86
  onRender: RenderHandler;
85
- onError?: (error: unknown) => void;
87
+ onError?: (error: unknown) => unknown;
86
88
  }) => <S>(_rendererID: number, root: FiberRoot, state?: S) => void;
87
- declare const instrument: ({ onCommitFiberRoot, onCommitFiberUnmount, onPostCommitFiberRoot, name, }: {
88
- onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => void;
89
- onCommitFiberUnmount?: (rendererID: number, root: FiberRoot) => void;
90
- onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => void;
89
+ declare const instrument: ({ onCommitFiberRoot, onCommitFiberUnmount, onPostCommitFiberRoot, onActive, name, }: {
90
+ onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => unknown;
91
+ onCommitFiberUnmount?: (rendererID: number, root: FiberRoot) => unknown;
92
+ onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
93
+ onActive?: () => unknown;
91
94
  name?: string;
92
95
  }) => ReactDevToolsGlobalHook;
93
96
 
94
- export { CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ChildDeletion, ClassComponentTag, Cloned, ContentReset, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponent, DidCapture, ForwardRefTag, Fragment, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRoot, HostSingletonTag, HostText, Hydrating, LegacyHiddenComponent, MemoComponentTag, MutationMask, OffscreenComponent, OffscreenComponentTag, PerformedWork, Placement, type ReactDevToolsGlobalHook, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
97
+ export { CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ChildDeletion, ClassComponentTag, Cloned, ContentReset, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponent, DidCapture, ForwardRefTag, Fragment, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRoot, HostSingletonTag, HostText, Hydrating, LegacyHiddenComponent, MemoComponentTag, MutationMask, OffscreenComponent, OffscreenComponentTag, PerformedWork, Placement, type ReactDevToolsGlobalHook, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ interface ReactDevToolsGlobalHook {
11
11
  onPostCommitFiberRoot: (rendererID: number, root: unknown) => void;
12
12
  inject: (renderer: unknown) => number;
13
13
  _instrumentationSource?: string;
14
+ _instrumentationIsActive?: boolean;
14
15
  }
15
16
  declare const ClassComponentTag = 1;
16
17
  declare const FunctionComponentTag = 0;
@@ -74,21 +75,23 @@ declare const getTimings: (fiber?: Fiber | null | undefined) => {
74
75
  declare const hasMemoCache: (fiber: Fiber) => boolean;
75
76
  declare const getType: (type: any) => any;
76
77
  declare const getDisplayName: (type: any) => string | null;
77
- declare const getRDTHook: () => ReactDevToolsGlobalHook;
78
- type RenderHandler = <S>(fiber: Fiber, phase: 'mount' | 'update' | 'unmount', state?: S) => void;
78
+ declare const getRDTHook: (onActive?: () => unknown) => ReactDevToolsGlobalHook;
79
+ declare const isInstrumentationActive: (onActive?: () => unknown) => boolean;
80
+ type RenderHandler = <S>(fiber: Fiber, phase: 'mount' | 'update' | 'unmount', state?: S) => unknown;
79
81
  declare const mountFiberRecursively: (onRender: RenderHandler, firstChild: Fiber, traverseSiblings: boolean) => void;
80
82
  declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber, prevFiber: Fiber, parentFiber: Fiber | null) => void;
81
83
  declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber) => void;
82
84
  declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber) => void;
83
85
  declare const createFiberVisitor: ({ onRender: onRenderWithoutState, onError, }: {
84
86
  onRender: RenderHandler;
85
- onError?: (error: unknown) => void;
87
+ onError?: (error: unknown) => unknown;
86
88
  }) => <S>(_rendererID: number, root: FiberRoot, state?: S) => void;
87
- declare const instrument: ({ onCommitFiberRoot, onCommitFiberUnmount, onPostCommitFiberRoot, name, }: {
88
- onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => void;
89
- onCommitFiberUnmount?: (rendererID: number, root: FiberRoot) => void;
90
- onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => void;
89
+ declare const instrument: ({ onCommitFiberRoot, onCommitFiberUnmount, onPostCommitFiberRoot, onActive, name, }: {
90
+ onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => unknown;
91
+ onCommitFiberUnmount?: (rendererID: number, root: FiberRoot) => unknown;
92
+ onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
93
+ onActive?: () => unknown;
91
94
  name?: string;
92
95
  }) => ReactDevToolsGlobalHook;
93
96
 
94
- export { CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ChildDeletion, ClassComponentTag, Cloned, ContentReset, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponent, DidCapture, ForwardRefTag, Fragment, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRoot, HostSingletonTag, HostText, Hydrating, LegacyHiddenComponent, MemoComponentTag, MutationMask, OffscreenComponent, OffscreenComponentTag, PerformedWork, Placement, type ReactDevToolsGlobalHook, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
97
+ export { CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ChildDeletion, ClassComponentTag, Cloned, ContentReset, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponent, DidCapture, ForwardRefTag, Fragment, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRoot, HostSingletonTag, HostText, Hydrating, LegacyHiddenComponent, MemoComponentTag, MutationMask, OffscreenComponent, OffscreenComponentTag, PerformedWork, Placement, type ReactDevToolsGlobalHook, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
@@ -6,4 +6,4 @@ var Bippy=(function(exports){'use strict';/**
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- var k=1,D=0,O=9,H=13,_=22,P=11,z=14,M=15,E=5,N=26,V=27,I=18,U=6,j=7,A=23,L=22,B=3,W=60111,T="Symbol(react.concurrent_mode)",R="Symbol(react.async_mode)",$=1,G=2,Y=128,K=4096,Q=4,q=8,J=16,X=32,Z=512,ee=1024,te=8192,oe=13366,ne=e=>typeof e=="object"&&e!=null&&"$$typeof"in e&&String(e.$$typeof)==="Symbol(react.element)",d=e=>e.tag===5||e.tag===26||e.tag===27,re=e=>e.tag===0||e.tag===1||e.tag===15||e.tag===14||e.tag===11,ie=(e,t)=>{try{let n=e.dependencies,o=e.alternate?.dependencies;if(!n||!o||typeof n!="object"||!("firstContext"in n)||typeof o!="object"||!("firstContext"in o))return !1;let r=n.firstContext,l=o.firstContext;for(;r&&typeof r=="object"&&"memoizedValue"in r&&l&&typeof l=="object"&&"memoizedValue"in l;){if(t(r,l)===!0)return !0;r=r.next,l=l.next;}}catch{}return !1},le=(e,t)=>{try{let n=e.memoizedState,o=e.alternate?.memoizedState;for(;n&&o;){if(t(n,o)===!0)return !0;n=n.next,o=o.next;}}catch{}return !1},se=(e,t)=>{try{let n=e.memoizedProps,o=e.alternate?.memoizedProps||{};for(let r in {...o,...n}){let l=o?.[r],s=n?.[r];if(t(l,s)===!0)return !0}}catch{}return !1},g=e=>{let t=e.memoizedProps,n=e.alternate?.memoizedProps||{},o=e.flags??e.effectTag??0;switch(e.tag){case 1:case 0:case 9:case 11:case 14:case 15:return (o&1)===1;default:return e.alternate?n!==t||e.alternate.memoizedState!==e.memoizedState||e.alternate.ref!==e.ref:!0}},v=e=>!!(e.flags&22||e.subtreeFlags&22),ae=e=>{let t=[],n=new WeakSet,o=r=>{!r||n.has(r)||(n.add(r),d(r)&&v(r)&&g(r)&&t.push(r),r.child&&o(r.child),r.sibling&&o(r.sibling));};return o(e),t},ue=e=>{let t=[];for(;e.return;)t.push(e),e=e.return;let n=new Array(t.length);for(let o=0;o<t.length;o++)n[o]=t[t.length-o-1];return n},f=e=>{switch(e.tag){case 18:return !0;case 6:case 7:case 23:case 22:return !0;case 3:return !1;default:{let t=typeof e.type=="object"&&e.type!==null?e.type.$$typeof:e.type;switch(typeof t=="symbol"?t.toString():t){case 60111:case T:case R:return !0;default:return !1}}}},ce=e=>{let t=b(e,d);return t||(t=b(e,d,!0)),t},b=(e,t,n=!1)=>{if(!e)return null;if(t(e)===!0)return e;let o=n?e.return:e.child;for(;o;){let r=b(o,t,n);if(r)return r;o=n?null:o.sibling;}return null},me=e=>{let t=e?.actualDuration??0,n=t,o=e?.child??null;for(;t>0&&o!=null;)n-=o.actualDuration??0,o=o.sibling;return {selfTime:n,totalTime:t}},pe=e=>!!e.updateQueue?.memoCache,F=e=>typeof e=="function"?e:typeof e=="object"&&e?F(e.type||e.render):null,de=e=>{if(typeof e!="function"&&!(typeof e=="object"&&e))return null;let t=e.displayName||e.name||null;return t||(e=F(e),e&&(e.displayName||e.name)||null)},p=()=>{},x=()=>{let e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__,t=new Map,n=0;e??={checkDCE:p,supportsFiber:!0,supportsFlight:!0,renderers:t,onCommitFiberRoot:p,onCommitFiberUnmount:p,onPostCommitFiberRoot:p,inject(o){let r=++n;return t.set(r,o),r},_instrumentationSource:"bippy"};try{globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=e;}catch{}return e};typeof window<"u"&&x();var m=(e,t,n)=>{let o=t;for(;o!=null;){if(!f(o)&&g(o)&&e(o,"mount"),o.tag===13)if(o.memoizedState!==null){let s=o.child,u=s?s.sibling:null;if(u){let i=u.child;i!==null&&m(e,i,!1);}}else {let s=null;o.child!==null&&(s=o.child.child),s!==null&&m(e,s,!1);}else o.child!=null&&m(e,o.child,!0);o=n?o.sibling:null;}},C=(e,t,n,o)=>{if(!n)return;let r=t.tag===13,l=!f(t);l&&g(t)&&e(t,"update");let s=r&&n.memoizedState!==null,u=r&&t.memoizedState!==null;if(s&&u){let i=t.child?.sibling??null,a=n.child?.sibling??null;i!==null&&a!==null&&C(e,i,a);}else if(s&&!u){let i=t.child;i!==null&&m(e,i,!0);}else if(!s&&u){y(e,n);let i=t.child?.sibling??null;i!==null&&m(e,i,!0);}else if(t.child!==n.child){let i=t.child;for(;i;){if(i.alternate){let a=i.alternate;C(e,i,a);}else m(e,i,!1);i=i.sibling;}}},S=(e,t)=>{(t.tag===3||!f(t))&&e(t,"unmount");},y=(e,t)=>{let n=t.tag===13&&t.memoizedState!==null,o=t.child;for(n&&(o=(t.child?.sibling??null)?.child??null);o!==null;)o.return!==null&&(S(e,o),y(e,o)),o=o.sibling;},w=0,h=new WeakMap,be=({onRender:e,onError:t})=>(n,o,r)=>{let l=o.current,s=(a,c)=>e(a,c,r),u=h.get(o);u||(u={prevFiber:null,id:w++},h.set(o,u));let{prevFiber:i}=u;try{if(i!==null){let a=i&&i.memoizedState!=null&&i.memoizedState.element!=null&&i.memoizedState.isDehydrated!==!0,c=l.memoizedState!=null&&l.memoizedState.element!=null&&l.memoizedState.isDehydrated!==!0;!a&&c?m(s,l,!1):a&&c?C(s,l,l.alternate,null):a&&!c&&S(s,l);}else m(s,l,!1);}catch(a){if(t)t(a);else throw a}u.prevFiber=l;},Ce=({onCommitFiberRoot:e,onCommitFiberUnmount:t,onPostCommitFiberRoot:n,name:o})=>{let r=x();r._instrumentationSource=o??"bippy";let l=r.onCommitFiberRoot;e&&(r.onCommitFiberRoot=(i,a,c)=>{l&&l(i,a,c),e(i,a,c);});let s=r.onCommitFiberUnmount;t&&(r.onCommitFiberUnmount=(i,a)=>{s&&s(i,a),t(i,a);});let u=r.onPostCommitFiberRoot;return n&&(r.onPostCommitFiberRoot=(i,a)=>{u&&u(i,a);}),r};exports.CONCURRENT_MODE_NUMBER=W;exports.CONCURRENT_MODE_SYMBOL_STRING=T;exports.ChildDeletion=J;exports.ClassComponentTag=k;exports.Cloned=q;exports.ContentReset=X;exports.ContextConsumerTag=O;exports.DEPRECATED_ASYNC_MODE_SYMBOL_STRING=R;exports.DehydratedSuspenseComponent=I;exports.DidCapture=Y;exports.ForwardRefTag=P;exports.Fragment=j;exports.FunctionComponentTag=D;exports.HostComponentTag=E;exports.HostHoistableTag=N;exports.HostRoot=B;exports.HostSingletonTag=V;exports.HostText=U;exports.Hydrating=K;exports.LegacyHiddenComponent=A;exports.MemoComponentTag=z;exports.MutationMask=oe;exports.OffscreenComponent=L;exports.OffscreenComponentTag=_;exports.PerformedWork=$;exports.Placement=G;exports.Ref=Z;exports.SimpleMemoComponentTag=M;exports.Snapshot=ee;exports.SuspenseComponentTag=H;exports.Update=Q;exports.Visibility=te;exports.createFiberVisitor=be;exports.didFiberCommit=v;exports.didFiberRender=g;exports.getDisplayName=de;exports.getFiberStack=ue;exports.getMutatedHostFibers=ae;exports.getNearestHostFiber=ce;exports.getRDTHook=x;exports.getTimings=me;exports.getType=F;exports.hasMemoCache=pe;exports.instrument=Ce;exports.isCompositeFiber=re;exports.isHostFiber=d;exports.isValidElement=ne;exports.mountFiberRecursively=m;exports.shouldFilterFiber=f;exports.traverseContexts=ie;exports.traverseFiber=b;exports.traverseProps=se;exports.traverseState=le;exports.unmountFiber=S;exports.unmountFiberChildrenRecursively=y;exports.updateFiberRecursively=C;return exports;})({});
9
+ var _=1,D=0,H=9,O=13,P=22,z=11,M=14,I=15,E=5,N=26,V=27,A=18,U=6,j=7,L=23,B=22,W=3,$=60111,R="Symbol(react.concurrent_mode)",k="Symbol(react.async_mode)",G=1,Y=2,K=128,Q=4096,q=4,J=8,X=16,Z=32,ee=512,te=1024,ne=8192,oe=13366,re=e=>typeof e=="object"&&e!=null&&"$$typeof"in e&&["react.element","react.transitional.element"].includes(String(e.$$typeof)),d=e=>e.tag===5||e.tag===26||e.tag===27,ie=e=>e.tag===0||e.tag===1||e.tag===15||e.tag===14||e.tag===11,le=(e,t)=>{try{let o=e.dependencies,n=e.alternate?.dependencies;if(!o||!n||typeof o!="object"||!("firstContext"in o)||typeof n!="object"||!("firstContext"in n))return !1;let s=o.firstContext,r=n.firstContext;for(;s&&typeof s=="object"&&"memoizedValue"in s&&r&&typeof r=="object"&&"memoizedValue"in r;){if(t(s,r)===!0)return !0;s=s.next,r=r.next;}}catch{}return !1},se=(e,t)=>{try{let o=e.memoizedState,n=e.alternate?.memoizedState;for(;o&&n;){if(t(o,n)===!0)return !0;o=o.next,n=n.next;}}catch{}return !1},ae=(e,t)=>{try{let o=e.memoizedProps,n=e.alternate?.memoizedProps||{};for(let s in {...n,...o}){let r=n?.[s],l=o?.[s];if(t(r,l)===!0)return !0}}catch{}return !1},f=e=>{let t=e.memoizedProps,o=e.alternate?.memoizedProps||{},n=e.flags??e.effectTag??0;switch(e.tag){case 1:case 0:case 9:case 11:case 14:case 15:return (n&1)===1;default:return e.alternate?o!==t||e.alternate.memoizedState!==e.memoizedState||e.alternate.ref!==e.ref:!0}},w=e=>!!(e.flags&22||e.subtreeFlags&22),ue=e=>{let t=[],o=[e];for(;o.length;){let n=o.pop();n&&(d(n)&&w(n)&&f(n)&&t.push(n),n.child&&o.push(n.child),n.sibling&&o.push(n.sibling));}return t},ce=e=>{let t=[];for(;e.return;)t.push(e),e=e.return;let o=new Array(t.length);for(let n=0;n<t.length;n++)o[n]=t[t.length-n-1];return o},g=e=>{switch(e.tag){case 18:return !0;case 6:case 7:case 23:case 22:return !0;case 3:return !1;default:{let t=typeof e.type=="object"&&e.type!==null?e.type.$$typeof:e.type;switch(typeof t=="symbol"?t.toString():t){case 60111:case R:case k:return !0;default:return !1}}}},me=e=>{let t=b(e,d);return t||(t=b(e,d,!0)),t},b=(e,t,o=!1)=>{if(!e)return null;if(t(e)===!0)return e;let n=o?e.return:e.child;for(;n;){let s=b(n,t,o);if(s)return s;n=o?null:n.sibling;}return null},pe=e=>{let t=e?.actualDuration??0,o=t,n=e?.child??null;for(;t>0&&n!=null;)o-=n.actualDuration??0,n=n.sibling;return {selfTime:o,totalTime:t}},de=e=>!!e.updateQueue?.memoCache,S=e=>typeof e=="function"?e:typeof e=="object"&&e?S(e.type||e.render):null,be=e=>{if(typeof e!="function"&&!(typeof e=="object"&&e))return null;let t=e.displayName||e.name||null;return t||(e=S(e),e&&(e.displayName||e.name)||null)},p=()=>{},h=e=>{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__,o=t&&!("_instrumentationSource"in t);o&&e?.();let n=new Map,s=0;t??={checkDCE:p,supportsFiber:!0,supportsFlight:!0,renderers:n,onCommitFiberRoot:p,onCommitFiberUnmount:p,onPostCommitFiberRoot:p,inject(r){let l=++s;return n.set(l,r),t._instrumentationIsActive||(t._instrumentationIsActive=!0,e?.()),l},_instrumentationSource:"bippy",_instrumentationIsActive:o};try{Object.defineProperty(globalThis,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!0,value:t});}catch{}return t},Ce=e=>!!h(e)._instrumentationIsActive;typeof window<"u"&&(performance.now(),h());var m=(e,t,o)=>{let n=t;for(;n!=null;){if(!g(n)&&f(n)&&e(n,"mount"),n.tag===13)if(n.memoizedState!==null){let l=n.child,u=l?l.sibling:null;if(u){let i=u.child;i!==null&&m(e,i,!1);}}else {let l=null;n.child!==null&&(l=n.child.child),l!==null&&m(e,l,!1);}else n.child!=null&&m(e,n.child,!0);n=o?n.sibling:null;}},C=(e,t,o,n)=>{if(!o)return;let s=t.tag===13,r=!g(t);r&&f(t)&&e(t,"update");let l=s&&o.memoizedState!==null,u=s&&t.memoizedState!==null;if(l&&u){let i=t.child?.sibling??null,a=o.child?.sibling??null;i!==null&&a!==null&&C(e,i,a);}else if(l&&!u){let i=t.child;i!==null&&m(e,i,!0);}else if(!l&&u){T(e,o);let i=t.child?.sibling??null;i!==null&&m(e,i,!0);}else if(t.child!==o.child){let i=t.child;for(;i;){if(i.alternate){let a=i.alternate;C(e,i,a);}else m(e,i,!1);i=i.sibling;}}},y=(e,t)=>{(t.tag===3||!g(t))&&e(t,"unmount");},T=(e,t)=>{let o=t.tag===13&&t.memoizedState!==null,n=t.child;for(o&&(n=(t.child?.sibling??null)?.child??null);n!==null;)n.return!==null&&(y(e,n),T(e,n)),n=n.sibling;},v=0,x=new WeakMap,fe=({onRender:e,onError:t})=>(o,n,s)=>{let r=n.current,l=(a,c)=>e(a,c,s),u=x.get(n);u||(u={prevFiber:null,id:v++},x.set(n,u));let{prevFiber:i}=u;try{if(i!==null){let a=i&&i.memoizedState!=null&&i.memoizedState.element!=null&&i.memoizedState.isDehydrated!==!0,c=r.memoizedState!=null&&r.memoizedState.element!=null&&r.memoizedState.isDehydrated!==!0;!a&&c?m(l,r,!1):a&&c?C(l,r,r.alternate,null):a&&!c&&y(l,r);}else m(l,r,!1);}catch(a){if(t)t(a);else throw a}u.prevFiber=r;},ge=({onCommitFiberRoot:e,onCommitFiberUnmount:t,onPostCommitFiberRoot:o,onActive:n,name:s})=>{let r=h(n);r._instrumentationSource=s??"bippy";let l=r.onCommitFiberRoot;e&&(r.onCommitFiberRoot=(a,c,F)=>{l&&l(a,c,F),e(a,c,F);});let u=r.onCommitFiberUnmount;t&&(r.onCommitFiberUnmount=(a,c)=>{u&&u(a,c),t(a,c);});let i=r.onPostCommitFiberRoot;return o&&(r.onPostCommitFiberRoot=(a,c)=>{i&&i(a,c);}),r};exports.CONCURRENT_MODE_NUMBER=$;exports.CONCURRENT_MODE_SYMBOL_STRING=R;exports.ChildDeletion=X;exports.ClassComponentTag=_;exports.Cloned=J;exports.ContentReset=Z;exports.ContextConsumerTag=H;exports.DEPRECATED_ASYNC_MODE_SYMBOL_STRING=k;exports.DehydratedSuspenseComponent=A;exports.DidCapture=K;exports.ForwardRefTag=z;exports.Fragment=j;exports.FunctionComponentTag=D;exports.HostComponentTag=E;exports.HostHoistableTag=N;exports.HostRoot=W;exports.HostSingletonTag=V;exports.HostText=U;exports.Hydrating=Q;exports.LegacyHiddenComponent=L;exports.MemoComponentTag=M;exports.MutationMask=oe;exports.OffscreenComponent=B;exports.OffscreenComponentTag=P;exports.PerformedWork=G;exports.Placement=Y;exports.Ref=ee;exports.SimpleMemoComponentTag=I;exports.Snapshot=te;exports.SuspenseComponentTag=O;exports.Update=q;exports.Visibility=ne;exports.createFiberVisitor=fe;exports.didFiberCommit=w;exports.didFiberRender=f;exports.getDisplayName=be;exports.getFiberStack=ce;exports.getMutatedHostFibers=ue;exports.getNearestHostFiber=me;exports.getRDTHook=h;exports.getTimings=pe;exports.getType=S;exports.hasMemoCache=de;exports.instrument=ge;exports.isCompositeFiber=ie;exports.isHostFiber=d;exports.isInstrumentationActive=Ce;exports.isValidElement=re;exports.mountFiberRecursively=m;exports.shouldFilterFiber=g;exports.traverseContexts=le;exports.traverseFiber=b;exports.traverseProps=ae;exports.traverseState=se;exports.unmountFiber=y;exports.unmountFiberChildrenRecursively=T;exports.updateFiberRecursively=C;return exports;})({});
package/dist/index.js CHANGED
@@ -40,7 +40,10 @@ var Ref = 512;
40
40
  var Snapshot = 1024;
41
41
  var Visibility = 8192;
42
42
  var MutationMask = Placement | Update | ChildDeletion | ContentReset | Hydrating | Visibility | Snapshot;
43
- var isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && String(element.$$typeof) === "Symbol(react.element)";
43
+ var isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && // react 18 uses Symbol.for('react.element'), react 19 uses Symbol.for('react.transitional.element')
44
+ ["react.element", "react.transitional.element"].includes(
45
+ String(element.$$typeof)
46
+ );
44
47
  var isHostFiber = (fiber) => fiber.tag === HostComponentTag || // @ts-expect-error: it exists
45
48
  fiber.tag === HostHoistableTag || // @ts-expect-error: it exists
46
49
  fiber.tag === HostSingletonTag;
@@ -116,21 +119,16 @@ var didFiberCommit = (fiber) => {
116
119
  };
117
120
  var getMutatedHostFibers = (fiber) => {
118
121
  const mutations = [];
119
- const visited = /* @__PURE__ */ new WeakSet();
120
- const traverse = (node) => {
121
- if (!node || visited.has(node)) return;
122
- visited.add(node);
122
+ const stack = [fiber];
123
+ while (stack.length) {
124
+ const node = stack.pop();
125
+ if (!node) continue;
123
126
  if (isHostFiber(node) && didFiberCommit(node) && didFiberRender(node)) {
124
127
  mutations.push(node);
125
128
  }
126
- if (node.child) {
127
- traverse(node.child);
128
- }
129
- if (node.sibling) {
130
- traverse(node.sibling);
131
- }
132
- };
133
- traverse(fiber);
129
+ if (node.child) stack.push(node.child);
130
+ if (node.sibling) stack.push(node.sibling);
131
+ }
134
132
  return mutations;
135
133
  };
136
134
  var getFiberStack = (fiber) => {
@@ -222,8 +220,10 @@ var getDisplayName = (type) => {
222
220
  };
223
221
  var NO_OP = () => {
224
222
  };
225
- var getRDTHook = () => {
223
+ var getRDTHook = (onActive) => {
226
224
  let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
225
+ const isActive = rdtHook && !("_instrumentationSource" in rdtHook);
226
+ if (isActive) onActive?.();
227
227
  const renderers = /* @__PURE__ */ new Map();
228
228
  let i = 0;
229
229
  rdtHook ??= {
@@ -237,17 +237,30 @@ var getRDTHook = () => {
237
237
  inject(renderer) {
238
238
  const nextID = ++i;
239
239
  renderers.set(nextID, renderer);
240
+ if (!rdtHook._instrumentationIsActive) {
241
+ rdtHook._instrumentationIsActive = true;
242
+ onActive?.();
243
+ }
240
244
  return nextID;
241
245
  },
242
- _instrumentationSource: "bippy"
246
+ _instrumentationSource: "bippy",
247
+ _instrumentationIsActive: isActive
243
248
  };
244
249
  try {
245
- globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = rdtHook;
250
+ Object.defineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
251
+ configurable: true,
252
+ value: rdtHook
253
+ });
246
254
  } catch {
247
255
  }
248
256
  return rdtHook;
249
257
  };
258
+ var isInstrumentationActive = (onActive) => {
259
+ const rdtHook = getRDTHook(onActive);
260
+ return Boolean(rdtHook._instrumentationIsActive);
261
+ };
250
262
  if (typeof window !== "undefined") {
263
+ performance.now();
251
264
  getRDTHook();
252
265
  }
253
266
  var mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
@@ -400,9 +413,10 @@ var instrument = ({
400
413
  onCommitFiberRoot,
401
414
  onCommitFiberUnmount,
402
415
  onPostCommitFiberRoot,
416
+ onActive,
403
417
  name
404
418
  }) => {
405
- const devtoolsHook = getRDTHook();
419
+ const devtoolsHook = getRDTHook(onActive);
406
420
  devtoolsHook._instrumentationSource = name ?? "bippy";
407
421
  const prevOnCommitFiberRoot = devtoolsHook.onCommitFiberRoot;
408
422
  if (onCommitFiberRoot) {
@@ -430,4 +444,4 @@ var instrument = ({
430
444
  return devtoolsHook;
431
445
  };
432
446
 
433
- export { CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ChildDeletion, ClassComponentTag, Cloned, ContentReset, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponent, DidCapture, ForwardRefTag, Fragment, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRoot, HostSingletonTag, HostText, Hydrating, LegacyHiddenComponent, MemoComponentTag, MutationMask, OffscreenComponent, OffscreenComponentTag, PerformedWork, Placement, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
447
+ export { CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ChildDeletion, ClassComponentTag, Cloned, ContentReset, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponent, DidCapture, ForwardRefTag, Fragment, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRoot, HostSingletonTag, HostText, Hydrating, LegacyHiddenComponent, MemoComponentTag, MutationMask, OffscreenComponent, OffscreenComponentTag, PerformedWork, Placement, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bippy",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "description": "a hacky way to get fibers from react",
5
5
  "keywords": [
6
6
  "react",