bippy 0.0.19 → 0.0.21

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
+ ["Symbol(react.element)", "Symbol(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;
@@ -84,7 +87,11 @@ var traverseProps = (fiber, selector) => {
84
87
  try {
85
88
  const nextProps = fiber.memoizedProps;
86
89
  const prevProps = fiber.alternate?.memoizedProps || {};
87
- for (const propName in { ...prevProps, ...nextProps }) {
90
+ const allKeys = /* @__PURE__ */ new Set([
91
+ ...Object.keys(prevProps),
92
+ ...Object.keys(nextProps)
93
+ ]);
94
+ for (const propName of allKeys) {
88
95
  const prevValue = prevProps?.[propName];
89
96
  const nextValue = nextProps?.[propName];
90
97
  if (selector(prevValue, nextValue) === true) return true;
@@ -217,34 +224,74 @@ var getDisplayName = (type) => {
217
224
  if (!type) return null;
218
225
  return type.displayName || type.name || null;
219
226
  };
220
- var NO_OP = () => {
227
+ var isUsingRDT = () => globalThis.__REACT_DEVTOOLS_BACKEND_MANAGER_INJECTED__ != null;
228
+ var detectReactBuildType = (renderer) => {
229
+ try {
230
+ if (typeof renderer.version === "string" && renderer.bundleType > 0) {
231
+ return "development";
232
+ }
233
+ } catch {
234
+ }
235
+ return "production";
221
236
  };
222
- var getRDTHook = () => {
223
- let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
224
- const renderers = /* @__PURE__ */ new Map();
225
- let i = 0;
226
- rdtHook ??= {
227
- checkDCE: NO_OP,
228
- supportsFiber: true,
229
- supportsFlight: true,
230
- renderers,
231
- onCommitFiberRoot: NO_OP,
232
- onCommitFiberUnmount: NO_OP,
233
- onPostCommitFiberRoot: NO_OP,
234
- inject(renderer) {
235
- const nextID = ++i;
236
- renderers.set(nextID, renderer);
237
- return nextID;
238
- },
239
- _instrumentationSource: "bippy"
240
- };
237
+ var checkDCE = (fn) => {
241
238
  try {
242
- globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = rdtHook;
239
+ const code = Function.prototype.toString.call(fn);
240
+ if (code.indexOf("^_^") > -1) {
241
+ setTimeout(() => {
242
+ throw new Error(
243
+ "React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build"
244
+ );
245
+ });
246
+ }
243
247
  } catch {
244
248
  }
249
+ };
250
+ var NO_OP = () => {
251
+ };
252
+ var getRDTHook = (onActive) => {
253
+ let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
254
+ const isActive = rdtHook && !("_instrumentationSource" in rdtHook);
255
+ if (isActive) onActive?.();
256
+ if (!window.hasOwnProperty("__REACT_DEVTOOLS_GLOBAL_HOOK__")) {
257
+ const renderers = /* @__PURE__ */ new Map();
258
+ let i = 0;
259
+ rdtHook ??= {
260
+ checkDCE,
261
+ supportsFiber: true,
262
+ supportsFlight: true,
263
+ renderers,
264
+ onCommitFiberRoot: NO_OP,
265
+ onCommitFiberUnmount: NO_OP,
266
+ onPostCommitFiberRoot: NO_OP,
267
+ inject(renderer) {
268
+ const nextID = ++i;
269
+ renderers.set(nextID, renderer);
270
+ if (!rdtHook._instrumentationIsActive) {
271
+ rdtHook._instrumentationIsActive = true;
272
+ onActive?.();
273
+ }
274
+ return nextID;
275
+ },
276
+ _instrumentationSource: "bippy",
277
+ _instrumentationIsActive: isActive
278
+ };
279
+ try {
280
+ Object.defineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
281
+ configurable: true,
282
+ value: rdtHook
283
+ });
284
+ } catch {
285
+ }
286
+ }
245
287
  return rdtHook;
246
288
  };
289
+ var isInstrumentationActive = () => {
290
+ const rdtHook = getRDTHook();
291
+ return Boolean(rdtHook._instrumentationIsActive);
292
+ };
247
293
  if (typeof window !== "undefined") {
294
+ performance.now();
248
295
  getRDTHook();
249
296
  }
250
297
  var mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
@@ -397,9 +444,10 @@ var instrument = ({
397
444
  onCommitFiberRoot,
398
445
  onCommitFiberUnmount,
399
446
  onPostCommitFiberRoot,
447
+ onActive,
400
448
  name
401
449
  }) => {
402
- const devtoolsHook = getRDTHook();
450
+ const devtoolsHook = getRDTHook(onActive);
403
451
  devtoolsHook._instrumentationSource = name ?? "bippy";
404
452
  const prevOnCommitFiberRoot = devtoolsHook.onCommitFiberRoot;
405
453
  if (onCommitFiberRoot) {
@@ -460,6 +508,7 @@ exports.SuspenseComponentTag = SuspenseComponentTag;
460
508
  exports.Update = Update;
461
509
  exports.Visibility = Visibility;
462
510
  exports.createFiberVisitor = createFiberVisitor;
511
+ exports.detectReactBuildType = detectReactBuildType;
463
512
  exports.didFiberCommit = didFiberCommit;
464
513
  exports.didFiberRender = didFiberRender;
465
514
  exports.getDisplayName = getDisplayName;
@@ -473,6 +522,8 @@ exports.hasMemoCache = hasMemoCache;
473
522
  exports.instrument = instrument;
474
523
  exports.isCompositeFiber = isCompositeFiber;
475
524
  exports.isHostFiber = isHostFiber;
525
+ exports.isInstrumentationActive = isInstrumentationActive;
526
+ exports.isUsingRDT = isUsingRDT;
476
527
  exports.isValidElement = isValidElement;
477
528
  exports.mountFiberRecursively = mountFiberRecursively;
478
529
  exports.shouldFilterFiber = shouldFilterFiber;
package/dist/index.d.cts CHANGED
@@ -1,16 +1,21 @@
1
1
  import * as React from 'react';
2
2
  import { Fiber, FiberRoot } from 'react-reconciler';
3
3
 
4
+ interface ReactRenderer {
5
+ version: string;
6
+ bundleType: 0 | 1;
7
+ }
4
8
  interface ReactDevToolsGlobalHook {
5
- checkDCE: () => void;
9
+ checkDCE: (fn: any) => void;
6
10
  supportsFiber: boolean;
7
11
  supportsFlight: boolean;
8
- renderers: Map<number, unknown>;
12
+ renderers: Map<number, ReactRenderer>;
9
13
  onCommitFiberRoot: (rendererID: number, root: unknown, priority: void | number) => void;
10
14
  onCommitFiberUnmount: (rendererID: number, root: unknown) => void;
11
15
  onPostCommitFiberRoot: (rendererID: number, root: unknown) => void;
12
16
  inject: (renderer: unknown) => number;
13
17
  _instrumentationSource?: string;
18
+ _instrumentationIsActive?: boolean;
14
19
  }
15
20
  declare const ClassComponentTag = 1;
16
21
  declare const FunctionComponentTag = 0;
@@ -74,21 +79,25 @@ declare const getTimings: (fiber?: Fiber | null | undefined) => {
74
79
  declare const hasMemoCache: (fiber: Fiber) => boolean;
75
80
  declare const getType: (type: any) => any;
76
81
  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;
82
+ declare const isUsingRDT: () => boolean;
83
+ declare const detectReactBuildType: (renderer: ReactRenderer) => "development" | "production";
84
+ declare const getRDTHook: (onActive?: () => unknown) => ReactDevToolsGlobalHook;
85
+ declare const isInstrumentationActive: () => boolean;
86
+ type RenderHandler = <S>(fiber: Fiber, phase: 'mount' | 'update' | 'unmount', state?: S) => unknown;
79
87
  declare const mountFiberRecursively: (onRender: RenderHandler, firstChild: Fiber, traverseSiblings: boolean) => void;
80
88
  declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber, prevFiber: Fiber, parentFiber: Fiber | null) => void;
81
89
  declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber) => void;
82
90
  declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber) => void;
83
91
  declare const createFiberVisitor: ({ onRender: onRenderWithoutState, onError, }: {
84
92
  onRender: RenderHandler;
85
- onError?: (error: unknown) => void;
93
+ onError?: (error: unknown) => unknown;
86
94
  }) => <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;
95
+ declare const instrument: ({ onCommitFiberRoot, onCommitFiberUnmount, onPostCommitFiberRoot, onActive, name, }: {
96
+ onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => unknown;
97
+ onCommitFiberUnmount?: (rendererID: number, root: FiberRoot) => unknown;
98
+ onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
99
+ onActive?: () => unknown;
91
100
  name?: string;
92
101
  }) => ReactDevToolsGlobalHook;
93
102
 
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 };
103
+ 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, type ReactRenderer, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
package/dist/index.d.ts CHANGED
@@ -1,16 +1,21 @@
1
1
  import * as React from 'react';
2
2
  import { Fiber, FiberRoot } from 'react-reconciler';
3
3
 
4
+ interface ReactRenderer {
5
+ version: string;
6
+ bundleType: 0 | 1;
7
+ }
4
8
  interface ReactDevToolsGlobalHook {
5
- checkDCE: () => void;
9
+ checkDCE: (fn: any) => void;
6
10
  supportsFiber: boolean;
7
11
  supportsFlight: boolean;
8
- renderers: Map<number, unknown>;
12
+ renderers: Map<number, ReactRenderer>;
9
13
  onCommitFiberRoot: (rendererID: number, root: unknown, priority: void | number) => void;
10
14
  onCommitFiberUnmount: (rendererID: number, root: unknown) => void;
11
15
  onPostCommitFiberRoot: (rendererID: number, root: unknown) => void;
12
16
  inject: (renderer: unknown) => number;
13
17
  _instrumentationSource?: string;
18
+ _instrumentationIsActive?: boolean;
14
19
  }
15
20
  declare const ClassComponentTag = 1;
16
21
  declare const FunctionComponentTag = 0;
@@ -74,21 +79,25 @@ declare const getTimings: (fiber?: Fiber | null | undefined) => {
74
79
  declare const hasMemoCache: (fiber: Fiber) => boolean;
75
80
  declare const getType: (type: any) => any;
76
81
  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;
82
+ declare const isUsingRDT: () => boolean;
83
+ declare const detectReactBuildType: (renderer: ReactRenderer) => "development" | "production";
84
+ declare const getRDTHook: (onActive?: () => unknown) => ReactDevToolsGlobalHook;
85
+ declare const isInstrumentationActive: () => boolean;
86
+ type RenderHandler = <S>(fiber: Fiber, phase: 'mount' | 'update' | 'unmount', state?: S) => unknown;
79
87
  declare const mountFiberRecursively: (onRender: RenderHandler, firstChild: Fiber, traverseSiblings: boolean) => void;
80
88
  declare const updateFiberRecursively: (onRender: RenderHandler, nextFiber: Fiber, prevFiber: Fiber, parentFiber: Fiber | null) => void;
81
89
  declare const unmountFiber: (onRender: RenderHandler, fiber: Fiber) => void;
82
90
  declare const unmountFiberChildrenRecursively: (onRender: RenderHandler, fiber: Fiber) => void;
83
91
  declare const createFiberVisitor: ({ onRender: onRenderWithoutState, onError, }: {
84
92
  onRender: RenderHandler;
85
- onError?: (error: unknown) => void;
93
+ onError?: (error: unknown) => unknown;
86
94
  }) => <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;
95
+ declare const instrument: ({ onCommitFiberRoot, onCommitFiberUnmount, onPostCommitFiberRoot, onActive, name, }: {
96
+ onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: void | number) => unknown;
97
+ onCommitFiberUnmount?: (rendererID: number, root: FiberRoot) => unknown;
98
+ onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
99
+ onActive?: () => unknown;
91
100
  name?: string;
92
101
  }) => ReactDevToolsGlobalHook;
93
102
 
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 };
103
+ 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, type ReactRenderer, Ref, SimpleMemoComponentTag, Snapshot, SuspenseComponentTag, Update, Visibility, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, mountFiberRecursively, shouldFilterFiber, traverseContexts, traverseFiber, traverseProps, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively };
@@ -6,4 +6,5 @@ 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,o)=>{try{let n=e.dependencies,t=e.alternate?.dependencies;if(!n||!t||typeof n!="object"||!("firstContext"in n)||typeof t!="object"||!("firstContext"in t))return !1;let i=n.firstContext,l=t.firstContext;for(;i&&typeof i=="object"&&"memoizedValue"in i&&l&&typeof l=="object"&&"memoizedValue"in l;){if(o(i,l)===!0)return !0;i=i.next,l=l.next;}}catch{}return !1},le=(e,o)=>{try{let n=e.memoizedState,t=e.alternate?.memoizedState;for(;n&&t;){if(o(n,t)===!0)return !0;n=n.next,t=t.next;}}catch{}return !1},se=(e,o)=>{try{let n=e.memoizedProps,t=e.alternate?.memoizedProps||{};for(let i in {...t,...n}){let l=t?.[i],s=n?.[i];if(o(l,s)===!0)return !0}}catch{}return !1},g=e=>{let o=e.memoizedProps,n=e.alternate?.memoizedProps||{},t=e.flags??e.effectTag??0;switch(e.tag){case 1:case 0:case 9:case 11:case 14:case 15:return (t&1)===1;default:return e.alternate?n!==o||e.alternate.memoizedState!==e.memoizedState||e.alternate.ref!==e.ref:!0}},v=e=>!!(e.flags&22||e.subtreeFlags&22),ae=e=>{let o=[],n=[e];for(;n.length;){let t=n.pop();t&&(d(t)&&v(t)&&g(t)&&o.push(t),t.child&&n.push(t.child),t.sibling&&n.push(t.sibling));}return o},ue=e=>{let o=[];for(;e.return;)o.push(e),e=e.return;let n=new Array(o.length);for(let t=0;t<o.length;t++)n[t]=o[o.length-t-1];return n},h=e=>{switch(e.tag){case 18:return !0;case 6:case 7:case 23:case 22:return !0;case 3:return !1;default:{let o=typeof e.type=="object"&&e.type!==null?e.type.$$typeof:e.type;switch(typeof o=="symbol"?o.toString():o){case 60111:case T:case R:return !0;default:return !1}}}},ce=e=>{let o=b(e,d);return o||(o=b(e,d,!0)),o},b=(e,o,n=!1)=>{if(!e)return null;if(o(e)===!0)return e;let t=n?e.return:e.child;for(;t;){let i=b(t,o,n);if(i)return i;t=n?null:t.sibling;}return null},me=e=>{let o=e?.actualDuration??0,n=o,t=e?.child??null;for(;o>0&&t!=null;)n-=t.actualDuration??0,t=t.sibling;return {selfTime:n,totalTime:o}},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 o=e.displayName||e.name||null;return o||(e=F(e),e&&(e.displayName||e.name)||null)},p=()=>{},x=()=>{let e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__,o=new Map,n=0;e??={checkDCE:p,supportsFiber:!0,supportsFlight:!0,renderers:o,onCommitFiberRoot:p,onCommitFiberUnmount:p,onPostCommitFiberRoot:p,inject(t){let i=++n;return o.set(i,t),i},_instrumentationSource:"bippy"};try{globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=e;}catch{}return e};typeof window<"u"&&x();var m=(e,o,n)=>{let t=o;for(;t!=null;){if(!h(t)&&g(t)&&e(t,"mount"),t.tag===13)if(t.memoizedState!==null){let s=t.child,u=s?s.sibling:null;if(u){let r=u.child;r!==null&&m(e,r,!1);}}else {let s=null;t.child!==null&&(s=t.child.child),s!==null&&m(e,s,!1);}else t.child!=null&&m(e,t.child,!0);t=n?t.sibling:null;}},C=(e,o,n,t)=>{if(!n)return;let i=o.tag===13,l=!h(o);l&&g(o)&&e(o,"update");let s=i&&n.memoizedState!==null,u=i&&o.memoizedState!==null;if(s&&u){let r=o.child?.sibling??null,a=n.child?.sibling??null;r!==null&&a!==null&&C(e,r,a);}else if(s&&!u){let r=o.child;r!==null&&m(e,r,!0);}else if(!s&&u){y(e,n);let r=o.child?.sibling??null;r!==null&&m(e,r,!0);}else if(o.child!==n.child){let r=o.child;for(;r;){if(r.alternate){let a=r.alternate;C(e,r,a);}else m(e,r,!1);r=r.sibling;}}},S=(e,o)=>{(o.tag===3||!h(o))&&e(o,"unmount");},y=(e,o)=>{let n=o.tag===13&&o.memoizedState!==null,t=o.child;for(n&&(t=(o.child?.sibling??null)?.child??null);t!==null;)t.return!==null&&(S(e,t),y(e,t)),t=t.sibling;},w=0,f=new WeakMap,be=({onRender:e,onError:o})=>(n,t,i)=>{let l=t.current,s=(a,c)=>e(a,c,i),u=f.get(t);u||(u={prevFiber:null,id:w++},f.set(t,u));let{prevFiber:r}=u;try{if(r!==null){let a=r&&r.memoizedState!=null&&r.memoizedState.element!=null&&r.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(o)o(a);else throw a}u.prevFiber=l;},Ce=({onCommitFiberRoot:e,onCommitFiberUnmount:o,onPostCommitFiberRoot:n,name:t})=>{let i=x();i._instrumentationSource=t??"bippy";let l=i.onCommitFiberRoot;e&&(i.onCommitFiberRoot=(r,a,c)=>{l&&l(r,a,c),e(r,a,c);});let s=i.onCommitFiberUnmount;o&&(i.onCommitFiberUnmount=(r,a)=>{s&&s(r,a),o(r,a);});let u=i.onPostCommitFiberRoot;return n&&(i.onPostCommitFiberRoot=(r,a)=>{u&&u(r,a);}),i};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=h;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 O=1,D=0,H=9,E=13,P=22,M=11,z=14,I=15,A=5,N=26,V=27,U=18,j=6,L=7,B=23,G=22,W=3,$=60111,R="Symbol(react.concurrent_mode)",_="Symbol(react.async_mode)",K=1,Y=2,J=128,Q=4096,q=4,X=8,Z=16,ee=32,te=512,ne=1024,oe=8192,re=13366,ie=e=>typeof e=="object"&&e!=null&&"$$typeof"in e&&["Symbol(react.element)","Symbol(react.transitional.element)"].includes(String(e.$$typeof)),d=e=>e.tag===5||e.tag===26||e.tag===27,se=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 l=o.firstContext,r=n.firstContext;for(;l&&typeof l=="object"&&"memoizedValue"in l&&r&&typeof r=="object"&&"memoizedValue"in r;){if(t(l,r)===!0)return !0;l=l.next,r=r.next;}}catch{}return !1},ae=(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},ce=(e,t)=>{try{let o=e.memoizedProps,n=e.alternate?.memoizedProps||{},l=new Set([...Object.keys(n),...Object.keys(o)]);for(let r of l){let s=n?.[r],c=o?.[r];if(t(s,c)===!0)return !0}}catch{}return !1},C=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)&&C(n)&&t.push(n),n.child&&o.push(n.child),n.sibling&&o.push(n.sibling));}return t},me=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 _:return !0;default:return !1}}}},pe=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 l=b(n,t,o);if(l)return l;n=o?null:n.sibling;}return null},de=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}},be=e=>!!e.updateQueue?.memoCache,y=e=>typeof e=="function"?e:typeof e=="object"&&e?y(e.type||e.render):null,fe=e=>{if(typeof e!="function"&&!(typeof e=="object"&&e))return null;let t=e.displayName||e.name||null;return t||(e=y(e),e&&(e.displayName||e.name)||null)},Ce=()=>globalThis.__REACT_DEVTOOLS_BACKEND_MANAGER_INJECTED__!=null,ge=e=>{try{if(typeof e.version=="string"&&e.bundleType>0)return "development"}catch{}return "production"},k=e=>{try{Function.prototype.toString.call(e).indexOf("^_^")>-1&&setTimeout(()=>{throw new Error("React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build")});}catch{}},p=()=>{},h=e=>{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__,o=t&&!("_instrumentationSource"in t);if(o&&e?.(),!window.hasOwnProperty("__REACT_DEVTOOLS_GLOBAL_HOOK__")){let n=new Map,l=0;t??={checkDCE:k,supportsFiber:!0,supportsFlight:!0,renderers:n,onCommitFiberRoot:p,onCommitFiberUnmount:p,onPostCommitFiberRoot:p,inject(r){let s=++l;return n.set(s,r),t._instrumentationIsActive||(t._instrumentationIsActive=!0,e?.()),s},_instrumentationSource:"bippy",_instrumentationIsActive:o};try{Object.defineProperty(globalThis,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!0,value:t});}catch{}}return t},he=()=>!!h()._instrumentationIsActive;typeof window<"u"&&(performance.now(),h());var m=(e,t,o)=>{let n=t;for(;n!=null;){if(!g(n)&&C(n)&&e(n,"mount"),n.tag===13)if(n.memoizedState!==null){let s=n.child,c=s?s.sibling:null;if(c){let i=c.child;i!==null&&m(e,i,!1);}}else {let s=null;n.child!==null&&(s=n.child.child),s!==null&&m(e,s,!1);}else n.child!=null&&m(e,n.child,!0);n=o?n.sibling:null;}},f=(e,t,o,n)=>{if(!o)return;let l=t.tag===13,r=!g(t);r&&C(t)&&e(t,"update");let s=l&&o.memoizedState!==null,c=l&&t.memoizedState!==null;if(s&&c){let i=t.child?.sibling??null,a=o.child?.sibling??null;i!==null&&a!==null&&f(e,i,a);}else if(s&&!c){let i=t.child;i!==null&&m(e,i,!0);}else if(!s&&c){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;f(e,i,a);}else m(e,i,!1);i=i.sibling;}}},S=(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&&(S(e,n),T(e,n)),n=n.sibling;},v=0,F=new WeakMap,xe=({onRender:e,onError:t})=>(o,n,l)=>{let r=n.current,s=(a,u)=>e(a,u,l),c=F.get(n);c||(c={prevFiber:null,id:v++},F.set(n,c));let{prevFiber:i}=c;try{if(i!==null){let a=i&&i.memoizedState!=null&&i.memoizedState.element!=null&&i.memoizedState.isDehydrated!==!0,u=r.memoizedState!=null&&r.memoizedState.element!=null&&r.memoizedState.isDehydrated!==!0;!a&&u?m(s,r,!1):a&&u?f(s,r,r.alternate,null):a&&!u&&S(s,r);}else m(s,r,!1);}catch(a){if(t)t(a);else throw a}c.prevFiber=r;},Fe=({onCommitFiberRoot:e,onCommitFiberUnmount:t,onPostCommitFiberRoot:o,onActive:n,name:l})=>{let r=h(n);r._instrumentationSource=l??"bippy";let s=r.onCommitFiberRoot;e&&(r.onCommitFiberRoot=(a,u,x)=>{s&&s(a,u,x),e(a,u,x);});let c=r.onCommitFiberUnmount;t&&(r.onCommitFiberUnmount=(a,u)=>{c&&c(a,u),t(a,u);});let i=r.onPostCommitFiberRoot;return o&&(r.onPostCommitFiberRoot=(a,u)=>{i&&i(a,u);}),r};
10
+ exports.CONCURRENT_MODE_NUMBER=$;exports.CONCURRENT_MODE_SYMBOL_STRING=R;exports.ChildDeletion=Z;exports.ClassComponentTag=O;exports.Cloned=X;exports.ContentReset=ee;exports.ContextConsumerTag=H;exports.DEPRECATED_ASYNC_MODE_SYMBOL_STRING=_;exports.DehydratedSuspenseComponent=U;exports.DidCapture=J;exports.ForwardRefTag=M;exports.Fragment=L;exports.FunctionComponentTag=D;exports.HostComponentTag=A;exports.HostHoistableTag=N;exports.HostRoot=W;exports.HostSingletonTag=V;exports.HostText=j;exports.Hydrating=Q;exports.LegacyHiddenComponent=B;exports.MemoComponentTag=z;exports.MutationMask=re;exports.OffscreenComponent=G;exports.OffscreenComponentTag=P;exports.PerformedWork=K;exports.Placement=Y;exports.Ref=te;exports.SimpleMemoComponentTag=I;exports.Snapshot=ne;exports.SuspenseComponentTag=E;exports.Update=q;exports.Visibility=oe;exports.createFiberVisitor=xe;exports.detectReactBuildType=ge;exports.didFiberCommit=w;exports.didFiberRender=C;exports.getDisplayName=fe;exports.getFiberStack=me;exports.getMutatedHostFibers=ue;exports.getNearestHostFiber=pe;exports.getRDTHook=h;exports.getTimings=de;exports.getType=y;exports.hasMemoCache=be;exports.instrument=Fe;exports.isCompositeFiber=se;exports.isHostFiber=d;exports.isInstrumentationActive=he;exports.isUsingRDT=Ce;exports.isValidElement=ie;exports.mountFiberRecursively=m;exports.shouldFilterFiber=g;exports.traverseContexts=le;exports.traverseFiber=b;exports.traverseProps=ce;exports.traverseState=ae;exports.unmountFiber=S;exports.unmountFiberChildrenRecursively=T;exports.updateFiberRecursively=f;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
+ ["Symbol(react.element)", "Symbol(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;
@@ -82,7 +85,11 @@ var traverseProps = (fiber, selector) => {
82
85
  try {
83
86
  const nextProps = fiber.memoizedProps;
84
87
  const prevProps = fiber.alternate?.memoizedProps || {};
85
- for (const propName in { ...prevProps, ...nextProps }) {
88
+ const allKeys = /* @__PURE__ */ new Set([
89
+ ...Object.keys(prevProps),
90
+ ...Object.keys(nextProps)
91
+ ]);
92
+ for (const propName of allKeys) {
86
93
  const prevValue = prevProps?.[propName];
87
94
  const nextValue = nextProps?.[propName];
88
95
  if (selector(prevValue, nextValue) === true) return true;
@@ -215,34 +222,74 @@ var getDisplayName = (type) => {
215
222
  if (!type) return null;
216
223
  return type.displayName || type.name || null;
217
224
  };
218
- var NO_OP = () => {
225
+ var isUsingRDT = () => globalThis.__REACT_DEVTOOLS_BACKEND_MANAGER_INJECTED__ != null;
226
+ var detectReactBuildType = (renderer) => {
227
+ try {
228
+ if (typeof renderer.version === "string" && renderer.bundleType > 0) {
229
+ return "development";
230
+ }
231
+ } catch {
232
+ }
233
+ return "production";
219
234
  };
220
- var getRDTHook = () => {
221
- let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
222
- const renderers = /* @__PURE__ */ new Map();
223
- let i = 0;
224
- rdtHook ??= {
225
- checkDCE: NO_OP,
226
- supportsFiber: true,
227
- supportsFlight: true,
228
- renderers,
229
- onCommitFiberRoot: NO_OP,
230
- onCommitFiberUnmount: NO_OP,
231
- onPostCommitFiberRoot: NO_OP,
232
- inject(renderer) {
233
- const nextID = ++i;
234
- renderers.set(nextID, renderer);
235
- return nextID;
236
- },
237
- _instrumentationSource: "bippy"
238
- };
235
+ var checkDCE = (fn) => {
239
236
  try {
240
- globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = rdtHook;
237
+ const code = Function.prototype.toString.call(fn);
238
+ if (code.indexOf("^_^") > -1) {
239
+ setTimeout(() => {
240
+ throw new Error(
241
+ "React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build"
242
+ );
243
+ });
244
+ }
241
245
  } catch {
242
246
  }
247
+ };
248
+ var NO_OP = () => {
249
+ };
250
+ var getRDTHook = (onActive) => {
251
+ let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
252
+ const isActive = rdtHook && !("_instrumentationSource" in rdtHook);
253
+ if (isActive) onActive?.();
254
+ if (!window.hasOwnProperty("__REACT_DEVTOOLS_GLOBAL_HOOK__")) {
255
+ const renderers = /* @__PURE__ */ new Map();
256
+ let i = 0;
257
+ rdtHook ??= {
258
+ checkDCE,
259
+ supportsFiber: true,
260
+ supportsFlight: true,
261
+ renderers,
262
+ onCommitFiberRoot: NO_OP,
263
+ onCommitFiberUnmount: NO_OP,
264
+ onPostCommitFiberRoot: NO_OP,
265
+ inject(renderer) {
266
+ const nextID = ++i;
267
+ renderers.set(nextID, renderer);
268
+ if (!rdtHook._instrumentationIsActive) {
269
+ rdtHook._instrumentationIsActive = true;
270
+ onActive?.();
271
+ }
272
+ return nextID;
273
+ },
274
+ _instrumentationSource: "bippy",
275
+ _instrumentationIsActive: isActive
276
+ };
277
+ try {
278
+ Object.defineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
279
+ configurable: true,
280
+ value: rdtHook
281
+ });
282
+ } catch {
283
+ }
284
+ }
243
285
  return rdtHook;
244
286
  };
287
+ var isInstrumentationActive = () => {
288
+ const rdtHook = getRDTHook();
289
+ return Boolean(rdtHook._instrumentationIsActive);
290
+ };
245
291
  if (typeof window !== "undefined") {
292
+ performance.now();
246
293
  getRDTHook();
247
294
  }
248
295
  var mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
@@ -395,9 +442,10 @@ var instrument = ({
395
442
  onCommitFiberRoot,
396
443
  onCommitFiberUnmount,
397
444
  onPostCommitFiberRoot,
445
+ onActive,
398
446
  name
399
447
  }) => {
400
- const devtoolsHook = getRDTHook();
448
+ const devtoolsHook = getRDTHook(onActive);
401
449
  devtoolsHook._instrumentationSource = name ?? "bippy";
402
450
  const prevOnCommitFiberRoot = devtoolsHook.onCommitFiberRoot;
403
451
  if (onCommitFiberRoot) {
@@ -425,4 +473,4 @@ var instrument = ({
425
473
  return devtoolsHook;
426
474
  };
427
475
 
428
- 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 };
476
+ 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, detectReactBuildType, didFiberCommit, didFiberRender, getDisplayName, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getRDTHook, getTimings, getType, hasMemoCache, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, 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.19",
3
+ "version": "0.0.21",
4
4
  "description": "a hacky way to get fibers from react",
5
5
  "keywords": [
6
6
  "react",