bippy 0.7.3-dev.e2b879b → 0.7.3-dev.e910a3b

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
@@ -6,4 +6,4 @@
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
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("./rdt-hook.cjs");require("./install-hook-only.cjs");const l=require("./core.cjs");let u=require("react");u=s(u,1);const d=e=>e,f=()=>void 0,p=()=>{},m=()=>p,h=Reflect.get(u,`useSyncExternalStore`),g=e=>{let t=Function.prototype.bind,n=null,r=new Proxy(t,{apply:(e,t,r)=>{let i=r[1];return!n&&l.h(i)&&(n=i),Reflect.apply(e,t,r)}});Reflect.set(Function.prototype,`bind`,r);try{e()}finally{Function.prototype.bind===r&&Reflect.set(Function.prototype,`bind`,t)}return n},_=()=>{typeof h==`function`&&Reflect.apply(h,u,[m,f,f])},v=()=>{u.useReducer(d,void 0)},y=()=>g(_)??void 0,b=e=>typeof e==`object`&&!!e&&`create`in e&&`next`in e,x=(e,t)=>{let n=e.updateQueue?.lastEffect;if(!b(n))return!1;let r=n;do{if(r.create===t)return!0;if(!b(r.next))return!1;r=r.next}while(r!==n);return!1},S=typeof h==`function`?y:()=>{let e=u.useRef(null),t=()=>{};u.useEffect(t,[]);let n=g(v);if(n)return e.current=n,n;let r=e.current;if(r)return[r,r.alternate].find(e=>e!==null&&x(e,t))??void 0};exports.BIPPY_INSTRUMENTATION_STRING=c.t,exports.BippyError=l.S,exports.BippyHookInspectionError=l.C,exports.BippyHookRenderError=l.w,exports.BippySourceMapError=l.T,exports.BippyUnsupportedHookError=l.E,exports.MutationMask=l.D,exports.ReactBuildType=l.j,exports.ReactFiberFlags=l.M,exports.ReactSymbols=l.N,exports._fiberRoots=l.t,exports._renderers=c.n,exports.compareSemver=l.F,exports.detectReactBuildType=l.n,exports.didFiberRender=l.r,exports.getDisplayName=l.i,exports.getFiber=l.a,exports.getFiberById=l.o,exports.getFiberFromHostInstance=l.s,exports.getFiberId=l.c,exports.getLatestFiber=l.l,exports.getRDTHook=c.i,exports.getReactWorkTags=l.P,exports.getReactWorkTagsForFiber=l.O,exports.getReactWorkTagsForRenderer=l.k,exports.getRenderer=l.u,exports.getType=l.d,exports.hasMemoCache=l.f,exports.hasRDTHook=c.a,exports.installRDTHook=c.o,exports.instrument=l.p,exports.isCompositeFiber=l.m,exports.isFiber=l.h,exports.isFiberRootUnmounted=c.s,exports.isHostFiber=l.g,exports.isInstrumentationActive=l._,exports.isReactRefresh=c.c,exports.isRealReactDevtools=c.l,exports.isValidElement=l.v,exports.onRendererInject=c.f,exports.patchRDTHook=c.p,exports.setFiberId=l.y,exports.setReactWorkTagsForFiber=l.A,exports.traverseFiber=l.b,exports.traverseRenderedFibers=l.x,exports.useFiber=S,exports.version=c.h;
9
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("./rdt-hook.cjs");require("./install-hook-only.cjs");const l=require("./core.cjs");let u=require("react");u=s(u,1);const d=e=>typeof e==`object`&&!!e&&`lastRenderedReducer`in e,f=(e,t)=>{for(let n=e.memoizedState;n;n=n.next)if(Array.isArray(n.memoizedState)&&n.memoizedState[0]===t)return!0;return!1},p=(e,t)=>{for(let n=e.memoizedState;n;n=n.next)if(d(n.queue)&&n.queue.lastRenderedReducer===t)return n.queue;return null},m=e=>{for(let t of c.n)try{let n=t.getCurrentFiber?.();if(n&&l.h(n)&&f(n,e))return n}catch{}return null},h=(e,t)=>{let n;if(t)try{n=Function.prototype.bind}catch{}if(!n)return u.default.useReducer(e,void 0),null;let r=null,i=!0,a=new Proxy(n,{apply:(t,n,a)=>{if(i&&!r)try{let t=a.find(t=>d(t)&&t.lastRenderedReducer===e);if(t){let e=a.find(e=>l.h(e)&&l.h(e.return));e&&(r={fiber:e,queue:t})}}catch{}return Reflect.apply(t,n,a)}});try{try{Reflect.set(Function.prototype,`bind`,a)}catch{}return u.default.useReducer(e,void 0),r}finally{i=!1,r=null;try{Function.prototype.bind===a&&Reflect.set(Function.prototype,`bind`,n)}catch{}}},g=({fiber:e,queue:t},n)=>{if(t?.lastRenderedReducer!==n)return null;let r=e;for(;r.return;)r=r.return;let i=r.stateNode;if(typeof i!=`object`||!i||!(`current`in i)||!l.h(i.current))return null;let a=i.current.alternate;return l.b(a,t=>{if(t!==e&&t!==e.alternate)return!1;let n=t;for(;n.return;)n=n.return;return n===a})},_=()=>{"use no memo";let e=u.default.useRef(null),t=e=>e;u.default.useMemo(()=>t,[t]);let n=e.current?null:m(t),r=h(t,!e.current&&!n);if(n)return e.current={fiber:n,queue:p(n,t)},n;let i=r??e.current;if(!i)return;let a=i.fiber,o=r?.fiber??(f(a,t)?a:a.alternate&&f(a.alternate,t)?a.alternate:g(i,t));return o&&(e.current={fiber:o,queue:i.queue}),o??void 0};exports.BIPPY_INSTRUMENTATION_STRING=c.t,exports.BippyError=l.S,exports.BippyHookInspectionError=l.C,exports.BippyHookRenderError=l.w,exports.BippySourceMapError=l.T,exports.BippyUnsupportedHookError=l.E,exports.MutationMask=l.D,exports.ReactBuildType=l.j,exports.ReactFiberFlags=l.M,exports.ReactSymbols=l.N,exports._fiberRoots=l.t,exports._renderers=c.n,exports.compareSemver=l.F,exports.detectReactBuildType=l.n,exports.didFiberRender=l.r,exports.getDisplayName=l.i,exports.getFiber=l.a,exports.getFiberById=l.o,exports.getFiberFromHostInstance=l.s,exports.getFiberId=l.c,exports.getLatestFiber=l.l,exports.getRDTHook=c.i,exports.getReactWorkTags=l.P,exports.getReactWorkTagsForFiber=l.O,exports.getReactWorkTagsForRenderer=l.k,exports.getRenderer=l.u,exports.getType=l.d,exports.hasMemoCache=l.f,exports.hasRDTHook=c.a,exports.installRDTHook=c.o,exports.instrument=l.p,exports.isCompositeFiber=l.m,exports.isFiber=l.h,exports.isFiberRootUnmounted=c.s,exports.isHostFiber=l.g,exports.isInstrumentationActive=l._,exports.isReactRefresh=c.c,exports.isRealReactDevtools=c.l,exports.isValidElement=l.v,exports.onRendererInject=c.f,exports.patchRDTHook=c.p,exports.setFiberId=l.y,exports.setReactWorkTagsForFiber=l.A,exports.traverseFiber=l.b,exports.traverseRenderedFibers=l.x,exports.useFiber=_,exports.version=c.h;
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
9
  import { $ as getReactWorkTags, A as FiberUpdateQueue, B as ReactMemoCache, C as ContextDependency, D as Fiber, E as Dependencies, F as ReactContext, G as WorkTag, H as RendererDispatcherRef, I as ReactDebugInfo, J as ReactFiberFlags, K as HostWorkTag, L as ReactDevToolsEventHandler, M as LegacyDispatcherRef, N as MemoizedState, O as FiberDebugSource, P as Props, Q as ReactWorkTagVersion, R as ReactDevToolsGlobalHook, S as setReactWorkTagsForFiber, T as DebugThenableState, U as ServerComponentInfo, V as ReactRenderer, W as Source, X as ReactWorkTag, Y as ReactSymbols, Z as ReactWorkTagMap, _ as patchRDTHook, a as BippyUnsupportedHookError, b as getReactWorkTagsForFiber, c as Unsubscribe, d as hasRDTHook, f as installRDTHook, g as onRendererInject, h as isRealReactDevtools, i as BippySourceMapError, j as HostFiber, k as FiberRoot, l as _renderers, m as isReactRefresh, n as BippyHookInspectionError, o as BIPPY_INSTRUMENTATION_STRING, p as isFiberRootUnmounted, q as ReactBuildType, r as BippyHookRenderError, s as ReactDevToolsTarget, t as BippyError, u as getRDTHook, v as version, w as CurrentDispatcherRef, x as getReactWorkTagsForRenderer, y as MutationMask, z as ReactIOInfo } from "./errors.js";
10
- import * as React from "react";
10
+ import * as React$1 from "react";
11
11
  //#region src/react-internals/semver.d.ts
12
12
  declare const compareSemver: (leftVersion: string, rightVersion: string) => -1 | 0 | 1 | null;
13
13
  //#endregion
@@ -23,7 +23,7 @@ interface RenderHandler {
23
23
  *
24
24
  * @see https://react.dev/reference/react/isValidElement
25
25
  */
26
- declare const isValidElement: (element: unknown) => element is React.ReactElement;
26
+ declare const isValidElement: (element: unknown) => element is React$1.ReactElement;
27
27
  /**
28
28
  * Returns `true` if object is a React Fiber.
29
29
  */
@@ -60,7 +60,7 @@ declare const hasMemoCache: (fiber: Fiber) => boolean;
60
60
  /**
61
61
  * Returns the type (e.g. component definition) of the {@link Fiber}
62
62
  */
63
- declare const getType: (type: unknown) => null | React.ComponentType<unknown>;
63
+ declare const getType: (type: unknown) => null | React$1.ComponentType<unknown>;
64
64
  /**
65
65
  * Returns the display name of the {@link Fiber} type.
66
66
  */
@@ -101,7 +101,7 @@ interface InstrumentationOptions {
101
101
  onCommitFiberRoot?: (rendererID: number, root: FiberRoot, priority: number | void, didError?: boolean) => unknown;
102
102
  onCommitFiberUnmount?: (rendererID: number, fiber: Fiber) => unknown;
103
103
  onPostCommitFiberRoot?: (rendererID: number, root: FiberRoot) => unknown;
104
- onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: React.ReactNode) => unknown;
104
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: React$1.ReactNode) => unknown;
105
105
  }
106
106
  /**
107
107
  * Instruments the DevTools hook. Each hook event is patched once and
package/dist/index.js CHANGED
@@ -6,4 +6,4 @@
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
- import{a as e,c as t,f as n,h as r,i,l as a,n as o,o as s,p as c,s as l,t as u}from"./rdt-hook.js";import"./install-hook-only.js";import{A as ee,C as d,D as f,E as p,F as m,M as h,N as g,O as _,P as v,S as y,T as b,_ as x,a as S,b as C,c as w,d as T,f as E,g as D,h as O,i as k,j as A,k as te,l as j,m as M,n as N,o as P,p as F,r as I,s as L,t as R,u as z,v as B,w as V,x as H,y as U}from"./core.js";import*as W from"react";const G=e=>e,K=()=>void 0,q=()=>{},J=()=>q,Y=Reflect.get(W,`useSyncExternalStore`),X=e=>{let t=Function.prototype.bind,n=null,r=new Proxy(t,{apply:(e,t,r)=>{let i=r[1];return!n&&O(i)&&(n=i),Reflect.apply(e,t,r)}});Reflect.set(Function.prototype,`bind`,r);try{e()}finally{Function.prototype.bind===r&&Reflect.set(Function.prototype,`bind`,t)}return n},Z=()=>{typeof Y==`function`&&Reflect.apply(Y,W,[J,K,K])},Q=()=>{W.useReducer(G,void 0)},ne=()=>X(Z)??void 0,$=e=>typeof e==`object`&&!!e&&`create`in e&&`next`in e,re=(e,t)=>{let n=e.updateQueue?.lastEffect;if(!$(n))return!1;let r=n;do{if(r.create===t)return!0;if(!$(r.next))return!1;r=r.next}while(r!==n);return!1},ie=typeof Y==`function`?ne:()=>{let e=W.useRef(null),t=()=>{};W.useEffect(t,[]);let n=X(Q);if(n)return e.current=n,n;let r=e.current;if(r)return[r,r.alternate].find(e=>e!==null&&re(e,t))??void 0};export{u as BIPPY_INSTRUMENTATION_STRING,y as BippyError,d as BippyHookInspectionError,V as BippyHookRenderError,b as BippySourceMapError,p as BippyUnsupportedHookError,f as MutationMask,A as ReactBuildType,h as ReactFiberFlags,g as ReactSymbols,R as _fiberRoots,o as _renderers,m as compareSemver,N as detectReactBuildType,I as didFiberRender,k as getDisplayName,S as getFiber,P as getFiberById,L as getFiberFromHostInstance,w as getFiberId,j as getLatestFiber,i as getRDTHook,v as getReactWorkTags,_ as getReactWorkTagsForFiber,te as getReactWorkTagsForRenderer,z as getRenderer,T as getType,E as hasMemoCache,e as hasRDTHook,s as installRDTHook,F as instrument,M as isCompositeFiber,O as isFiber,l as isFiberRootUnmounted,D as isHostFiber,x as isInstrumentationActive,t as isReactRefresh,a as isRealReactDevtools,B as isValidElement,n as onRendererInject,c as patchRDTHook,U as setFiberId,ee as setReactWorkTagsForFiber,C as traverseFiber,H as traverseRenderedFibers,ie as useFiber,r as version};
9
+ import{a as e,c as t,f as n,h as r,i,l as a,n as o,o as s,p as c,s as l,t as u}from"./rdt-hook.js";import"./install-hook-only.js";import{A as d,C as f,D as p,E as m,F as h,M as g,N as _,O as v,P as y,S as b,T as x,_ as S,a as C,b as w,c as T,d as E,f as D,g as O,h as k,i as A,j,k as M,l as N,m as P,n as F,o as I,p as L,r as R,s as z,t as B,u as V,v as H,w as U,x as W,y as G}from"./core.js";import K from"react";const q=e=>typeof e==`object`&&!!e&&`lastRenderedReducer`in e,J=(e,t)=>{for(let n=e.memoizedState;n;n=n.next)if(Array.isArray(n.memoizedState)&&n.memoizedState[0]===t)return!0;return!1},Y=(e,t)=>{for(let n=e.memoizedState;n;n=n.next)if(q(n.queue)&&n.queue.lastRenderedReducer===t)return n.queue;return null},X=e=>{for(let t of o)try{let n=t.getCurrentFiber?.();if(n&&k(n)&&J(n,e))return n}catch{}return null},Z=(e,t)=>{let n;if(t)try{n=Function.prototype.bind}catch{}if(!n)return K.useReducer(e,void 0),null;let r=null,i=!0,a=new Proxy(n,{apply:(t,n,a)=>{if(i&&!r)try{let t=a.find(t=>q(t)&&t.lastRenderedReducer===e);if(t){let e=a.find(e=>k(e)&&k(e.return));e&&(r={fiber:e,queue:t})}}catch{}return Reflect.apply(t,n,a)}});try{try{Reflect.set(Function.prototype,`bind`,a)}catch{}return K.useReducer(e,void 0),r}finally{i=!1,r=null;try{Function.prototype.bind===a&&Reflect.set(Function.prototype,`bind`,n)}catch{}}},Q=({fiber:e,queue:t},n)=>{if(t?.lastRenderedReducer!==n)return null;let r=e;for(;r.return;)r=r.return;let i=r.stateNode;if(typeof i!=`object`||!i||!(`current`in i)||!k(i.current))return null;let a=i.current.alternate;return w(a,t=>{if(t!==e&&t!==e.alternate)return!1;let n=t;for(;n.return;)n=n.return;return n===a})},$=()=>{"use no memo";let e=K.useRef(null),t=e=>e;K.useMemo(()=>t,[t]);let n=e.current?null:X(t),r=Z(t,!e.current&&!n);if(n)return e.current={fiber:n,queue:Y(n,t)},n;let i=r??e.current;if(!i)return;let a=i.fiber,o=r?.fiber??(J(a,t)?a:a.alternate&&J(a.alternate,t)?a.alternate:Q(i,t));return o&&(e.current={fiber:o,queue:i.queue}),o??void 0};export{u as BIPPY_INSTRUMENTATION_STRING,b as BippyError,f as BippyHookInspectionError,U as BippyHookRenderError,x as BippySourceMapError,m as BippyUnsupportedHookError,p as MutationMask,j as ReactBuildType,g as ReactFiberFlags,_ as ReactSymbols,B as _fiberRoots,o as _renderers,h as compareSemver,F as detectReactBuildType,R as didFiberRender,A as getDisplayName,C as getFiber,I as getFiberById,z as getFiberFromHostInstance,T as getFiberId,N as getLatestFiber,i as getRDTHook,y as getReactWorkTags,v as getReactWorkTagsForFiber,M as getReactWorkTagsForRenderer,V as getRenderer,E as getType,D as hasMemoCache,e as hasRDTHook,s as installRDTHook,L as instrument,P as isCompositeFiber,k as isFiber,l as isFiberRootUnmounted,O as isHostFiber,S as isInstrumentationActive,t as isReactRefresh,a as isRealReactDevtools,H as isValidElement,n as onRendererInject,c as patchRDTHook,G as setFiberId,d as setReactWorkTagsForFiber,w as traverseFiber,W as traverseRenderedFibers,$ as useFiber,r as version};
package/dist/rdt-hook.cjs CHANGED
@@ -6,4 +6,4 @@
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
- const e=`0.7.3-dev.e2b879b`,t=`bippy-${e}`,n=Object.defineProperty,r=()=>{},i=e=>e.__REACT_DEVTOOLS_GLOBAL_HOOK__,a=e=>Object.assign(e,{[Symbol.dispose]:e}),o=e=>{let t=e.current.memoizedState;return t===null||t!==void 0&&(t.element===null||t.element===void 0)},s=e=>{if(!(typeof process<`u`&&process.versions?.node))try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://react.dev/link/perf-use-production-build`)})}catch{}},c=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e&&e._isBippyHook!==!0),l=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>{if(!e||typeof e.inject!=`function`||c(e))return!1;try{return Function.prototype.toString.call(e.inject).includes(`(injected)`)}catch{return!1}},u=new Set,d=new Set,f=new WeakMap,p=new Set,m=new Set,h=new WeakMap,g=(e,t)=>{u.add(e);let n=f.get(e)??new Set;n.add(t),f.set(e,n)},_=(e,t)=>{let n=f.get(e);n?.delete(t),(!n||n.size===0)&&(f.delete(e),u.delete(e))},v=e=>{for(let t of u)f.get(t)?.has(e)&&t()},y=(e,t)=>{for(let n of p)n.target===e&&n.listener(t)},b=(e,t)=>{for(let n of m)n(e,t)},x=(e,t=globalThis)=>{k(void 0,t);let n={listener:e,target:t};return p.add(n),a(()=>{p.delete(n)})},S=e=>(m.add(e),a(()=>{m.delete(e)})),C=e=>Object.prototype.toString.call(e)===`[object Map]`,w=e=>(C(e.renderers)||(e.renderers=new Map),e.renderers),T=(e,t,n,r,i)=>{n.set(r,i),d.add(i),e._instrumentationIsActive||(e._instrumentationIsActive=!0,v(t));let a=h.get(t)??new WeakSet;h.set(t,a),!a.has(i)&&(a.add(i),y(t,i))},E=(e,i=globalThis)=>{e&&g(e,i);let a=new Map,c=new Map,l=e=>{let t=c.get(e)??new Set;return c.set(e,t),t},u=0,f={_instrumentationIsActive:!1,_instrumentationSource:t,_isBippyHook:!0,checkDCE:s,getFiberRoots:l,hasUnsupportedRendererAttached:!1,inject:e=>{let t=++u;return T(f,i,a,t,e),t},on:r,onCommitFiberRoot:(e,t)=>{let n=l(e);o(t)?n.delete(t):n.add(t)},onCommitFiberUnmount:r,onPostCommitFiberRoot:r,renderers:a,supportsFiber:!0,supportsFlight:!0};try{if(n(i,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get:()=>f,set:t=>{if(t&&typeof t==`object`){let n=f.renderers;f=t;let r=w(f);n.forEach((e,t)=>{d.add(e),r.set(t,e)}),(n.size>0||m.size>0)&&D(e,i),b(f,i)}}}),i===globalThis&&typeof window<`u`){let e=window.hasOwnProperty.bind(window),t=Object.getOwnPropertyDescriptor(window,`hasOwnProperty`),r=!1,i=()=>{t?n(window,`hasOwnProperty`,t):Reflect.deleteProperty(window,`hasOwnProperty`)};n(window,`hasOwnProperty`,{configurable:!0,value:t=>!r&&t===`__REACT_DEVTOOLS_GLOBAL_HOOK__`?(r=!0,i(),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,!1):e(t),writable:!0})}}catch{D(e,i)}return f},D=(e,n=globalThis)=>{e&&g(e,n);let a=!1,o=i(n);if(!o)return;let u=w(o);if(!o._instrumentationSource){o.checkDCE=s,o.supportsFiber=!0,o.supportsFlight=!0,o.hasUnsupportedRendererAttached=!1,o._instrumentationSource=t,o._instrumentationIsActive=!1;let e=c(o);e||(o.on=r),u.size?(u.forEach(e=>d.add(e)),o._instrumentationIsActive=!0,v(n),a=!0):!e&&l(o)&&(o._instrumentationIsActive=!0,v(n),a=!0);let i=o.inject;o.inject=e=>{let t=i.call(o,e);return T(o,n,u,t,e),t}}!a&&(u.size||o._instrumentationIsActive)&&e?.()},O=(e=globalThis)=>Object.hasOwn(e,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),k=(e,t=globalThis)=>O(t)?(D(e,t),i(t)??E(e,t)):E(e,t);Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return C}});
9
+ const e=`0.7.3-dev.e910a3b`,t=`bippy-${e}`,n=Object.defineProperty,r=()=>{},i=e=>e.__REACT_DEVTOOLS_GLOBAL_HOOK__,a=e=>Object.assign(e,{[Symbol.dispose]:e}),o=e=>{let t=e.current.memoizedState;return t===null||t!==void 0&&(t.element===null||t.element===void 0)},s=e=>{if(!(typeof process<`u`&&process.versions?.node))try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://react.dev/link/perf-use-production-build`)})}catch{}},c=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e&&e._isBippyHook!==!0),l=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>{if(!e||typeof e.inject!=`function`||c(e))return!1;try{return Function.prototype.toString.call(e.inject).includes(`(injected)`)}catch{return!1}},u=new Set,d=new Set,f=new WeakMap,p=new Set,m=new Set,h=new WeakMap,g=(e,t)=>{u.add(e);let n=f.get(e)??new Set;n.add(t),f.set(e,n)},_=(e,t)=>{let n=f.get(e);n?.delete(t),(!n||n.size===0)&&(f.delete(e),u.delete(e))},v=e=>{for(let t of u)f.get(t)?.has(e)&&t()},y=(e,t)=>{for(let n of p)n.target===e&&n.listener(t)},b=(e,t)=>{for(let n of m)n(e,t)},x=(e,t=globalThis)=>{k(void 0,t);let n={listener:e,target:t};return p.add(n),a(()=>{p.delete(n)})},S=e=>(m.add(e),a(()=>{m.delete(e)})),C=e=>Object.prototype.toString.call(e)===`[object Map]`,w=e=>(C(e.renderers)||(e.renderers=new Map),e.renderers),T=(e,t,n,r,i)=>{n.set(r,i),d.add(i),e._instrumentationIsActive||(e._instrumentationIsActive=!0,v(t));let a=h.get(t)??new WeakSet;h.set(t,a),!a.has(i)&&(a.add(i),y(t,i))},E=(e,i=globalThis)=>{e&&g(e,i);let a=new Map,c=new Map,l=e=>{let t=c.get(e)??new Set;return c.set(e,t),t},u=0,f={_instrumentationIsActive:!1,_instrumentationSource:t,_isBippyHook:!0,checkDCE:s,getFiberRoots:l,hasUnsupportedRendererAttached:!1,inject:e=>{let t=++u;return T(f,i,a,t,e),t},on:r,onCommitFiberRoot:(e,t)=>{let n=l(e);o(t)?n.delete(t):n.add(t)},onCommitFiberUnmount:r,onPostCommitFiberRoot:r,renderers:a,supportsFiber:!0,supportsFlight:!0};try{if(n(i,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get:()=>f,set:t=>{if(t&&typeof t==`object`){let n=f.renderers;f=t;let r=w(f);n.forEach((e,t)=>{d.add(e),r.set(t,e)}),(n.size>0||m.size>0)&&D(e,i),b(f,i)}}}),i===globalThis&&typeof window<`u`){let e=window.hasOwnProperty.bind(window),t=Object.getOwnPropertyDescriptor(window,`hasOwnProperty`),r=!1,i=()=>{t?n(window,`hasOwnProperty`,t):Reflect.deleteProperty(window,`hasOwnProperty`)};n(window,`hasOwnProperty`,{configurable:!0,value:t=>!r&&t===`__REACT_DEVTOOLS_GLOBAL_HOOK__`?(r=!0,i(),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,!1):e(t),writable:!0})}}catch{D(e,i)}return f},D=(e,n=globalThis)=>{e&&g(e,n);let a=!1,o=i(n);if(!o)return;let u=w(o);if(!o._instrumentationSource){o.checkDCE=s,o.supportsFiber=!0,o.supportsFlight=!0,o.hasUnsupportedRendererAttached=!1,o._instrumentationSource=t,o._instrumentationIsActive=!1;let e=c(o);e||(o.on=r),u.size?(u.forEach(e=>d.add(e)),o._instrumentationIsActive=!0,v(n),a=!0):!e&&l(o)&&(o._instrumentationIsActive=!0,v(n),a=!0);let i=o.inject;o.inject=e=>{let t=i.call(o,e);return T(o,n,u,t,e),t}}!a&&(u.size||o._instrumentationIsActive)&&e?.()},O=(e=globalThis)=>Object.hasOwn(e,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),k=(e,t=globalThis)=>O(t)?(D(e,t),i(t)??E(e,t)):E(e,t);Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return C}});
package/dist/rdt-hook.js CHANGED
@@ -6,4 +6,4 @@
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
- const e=`0.7.3-dev.e2b879b`,t=`bippy-${e}`,n=Object.defineProperty,r=()=>{},i=e=>e.__REACT_DEVTOOLS_GLOBAL_HOOK__,a=e=>Object.assign(e,{[Symbol.dispose]:e}),o=e=>{let t=e.current.memoizedState;return t===null||t!==void 0&&(t.element===null||t.element===void 0)},s=e=>{if(!(typeof process<`u`&&process.versions?.node))try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://react.dev/link/perf-use-production-build`)})}catch{}},c=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e&&e._isBippyHook!==!0),l=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>{if(!e||typeof e.inject!=`function`||c(e))return!1;try{return Function.prototype.toString.call(e.inject).includes(`(injected)`)}catch{return!1}},u=new Set,d=new Set,f=new WeakMap,p=new Set,m=new Set,h=new WeakMap,g=(e,t)=>{u.add(e);let n=f.get(e)??new Set;n.add(t),f.set(e,n)},_=(e,t)=>{let n=f.get(e);n?.delete(t),(!n||n.size===0)&&(f.delete(e),u.delete(e))},v=e=>{for(let t of u)f.get(t)?.has(e)&&t()},y=(e,t)=>{for(let n of p)n.target===e&&n.listener(t)},b=(e,t)=>{for(let n of m)n(e,t)},x=(e,t=globalThis)=>{k(void 0,t);let n={listener:e,target:t};return p.add(n),a(()=>{p.delete(n)})},S=e=>(m.add(e),a(()=>{m.delete(e)})),C=e=>Object.prototype.toString.call(e)===`[object Map]`,w=e=>(C(e.renderers)||(e.renderers=new Map),e.renderers),T=(e,t,n,r,i)=>{n.set(r,i),d.add(i),e._instrumentationIsActive||(e._instrumentationIsActive=!0,v(t));let a=h.get(t)??new WeakSet;h.set(t,a),!a.has(i)&&(a.add(i),y(t,i))},E=(e,i=globalThis)=>{e&&g(e,i);let a=new Map,c=new Map,l=e=>{let t=c.get(e)??new Set;return c.set(e,t),t},u=0,f={_instrumentationIsActive:!1,_instrumentationSource:t,_isBippyHook:!0,checkDCE:s,getFiberRoots:l,hasUnsupportedRendererAttached:!1,inject:e=>{let t=++u;return T(f,i,a,t,e),t},on:r,onCommitFiberRoot:(e,t)=>{let n=l(e);o(t)?n.delete(t):n.add(t)},onCommitFiberUnmount:r,onPostCommitFiberRoot:r,renderers:a,supportsFiber:!0,supportsFlight:!0};try{if(n(i,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get:()=>f,set:t=>{if(t&&typeof t==`object`){let n=f.renderers;f=t;let r=w(f);n.forEach((e,t)=>{d.add(e),r.set(t,e)}),(n.size>0||m.size>0)&&D(e,i),b(f,i)}}}),i===globalThis&&typeof window<`u`){let e=window.hasOwnProperty.bind(window),t=Object.getOwnPropertyDescriptor(window,`hasOwnProperty`),r=!1,i=()=>{t?n(window,`hasOwnProperty`,t):Reflect.deleteProperty(window,`hasOwnProperty`)};n(window,`hasOwnProperty`,{configurable:!0,value:t=>!r&&t===`__REACT_DEVTOOLS_GLOBAL_HOOK__`?(r=!0,i(),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,!1):e(t),writable:!0})}}catch{D(e,i)}return f},D=(e,n=globalThis)=>{e&&g(e,n);let a=!1,o=i(n);if(!o)return;let u=w(o);if(!o._instrumentationSource){o.checkDCE=s,o.supportsFiber=!0,o.supportsFlight=!0,o.hasUnsupportedRendererAttached=!1,o._instrumentationSource=t,o._instrumentationIsActive=!1;let e=c(o);e||(o.on=r),u.size?(u.forEach(e=>d.add(e)),o._instrumentationIsActive=!0,v(n),a=!0):!e&&l(o)&&(o._instrumentationIsActive=!0,v(n),a=!0);let i=o.inject;o.inject=e=>{let t=i.call(o,e);return T(o,n,u,t,e),t}}!a&&(u.size||o._instrumentationIsActive)&&e?.()},O=(e=globalThis)=>Object.hasOwn(e,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),k=(e,t=globalThis)=>O(t)?(D(e,t),i(t)??E(e,t)):E(e,t);export{O as a,l as c,S as d,x as f,e as h,k as i,c as l,_ as m,d as n,E as o,D as p,a as r,o as s,t,C as u};
9
+ const e=`0.7.3-dev.e910a3b`,t=`bippy-${e}`,n=Object.defineProperty,r=()=>{},i=e=>e.__REACT_DEVTOOLS_GLOBAL_HOOK__,a=e=>Object.assign(e,{[Symbol.dispose]:e}),o=e=>{let t=e.current.memoizedState;return t===null||t!==void 0&&(t.element===null||t.element===void 0)},s=e=>{if(!(typeof process<`u`&&process.versions?.node))try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://react.dev/link/perf-use-production-build`)})}catch{}},c=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e&&e._isBippyHook!==!0),l=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>{if(!e||typeof e.inject!=`function`||c(e))return!1;try{return Function.prototype.toString.call(e.inject).includes(`(injected)`)}catch{return!1}},u=new Set,d=new Set,f=new WeakMap,p=new Set,m=new Set,h=new WeakMap,g=(e,t)=>{u.add(e);let n=f.get(e)??new Set;n.add(t),f.set(e,n)},_=(e,t)=>{let n=f.get(e);n?.delete(t),(!n||n.size===0)&&(f.delete(e),u.delete(e))},v=e=>{for(let t of u)f.get(t)?.has(e)&&t()},y=(e,t)=>{for(let n of p)n.target===e&&n.listener(t)},b=(e,t)=>{for(let n of m)n(e,t)},x=(e,t=globalThis)=>{k(void 0,t);let n={listener:e,target:t};return p.add(n),a(()=>{p.delete(n)})},S=e=>(m.add(e),a(()=>{m.delete(e)})),C=e=>Object.prototype.toString.call(e)===`[object Map]`,w=e=>(C(e.renderers)||(e.renderers=new Map),e.renderers),T=(e,t,n,r,i)=>{n.set(r,i),d.add(i),e._instrumentationIsActive||(e._instrumentationIsActive=!0,v(t));let a=h.get(t)??new WeakSet;h.set(t,a),!a.has(i)&&(a.add(i),y(t,i))},E=(e,i=globalThis)=>{e&&g(e,i);let a=new Map,c=new Map,l=e=>{let t=c.get(e)??new Set;return c.set(e,t),t},u=0,f={_instrumentationIsActive:!1,_instrumentationSource:t,_isBippyHook:!0,checkDCE:s,getFiberRoots:l,hasUnsupportedRendererAttached:!1,inject:e=>{let t=++u;return T(f,i,a,t,e),t},on:r,onCommitFiberRoot:(e,t)=>{let n=l(e);o(t)?n.delete(t):n.add(t)},onCommitFiberUnmount:r,onPostCommitFiberRoot:r,renderers:a,supportsFiber:!0,supportsFlight:!0};try{if(n(i,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get:()=>f,set:t=>{if(t&&typeof t==`object`){let n=f.renderers;f=t;let r=w(f);n.forEach((e,t)=>{d.add(e),r.set(t,e)}),(n.size>0||m.size>0)&&D(e,i),b(f,i)}}}),i===globalThis&&typeof window<`u`){let e=window.hasOwnProperty.bind(window),t=Object.getOwnPropertyDescriptor(window,`hasOwnProperty`),r=!1,i=()=>{t?n(window,`hasOwnProperty`,t):Reflect.deleteProperty(window,`hasOwnProperty`)};n(window,`hasOwnProperty`,{configurable:!0,value:t=>!r&&t===`__REACT_DEVTOOLS_GLOBAL_HOOK__`?(r=!0,i(),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,!1):e(t),writable:!0})}}catch{D(e,i)}return f},D=(e,n=globalThis)=>{e&&g(e,n);let a=!1,o=i(n);if(!o)return;let u=w(o);if(!o._instrumentationSource){o.checkDCE=s,o.supportsFiber=!0,o.supportsFlight=!0,o.hasUnsupportedRendererAttached=!1,o._instrumentationSource=t,o._instrumentationIsActive=!1;let e=c(o);e||(o.on=r),u.size?(u.forEach(e=>d.add(e)),o._instrumentationIsActive=!0,v(n),a=!0):!e&&l(o)&&(o._instrumentationIsActive=!0,v(n),a=!0);let i=o.inject;o.inject=e=>{let t=i.call(o,e);return T(o,n,u,t,e),t}}!a&&(u.size||o._instrumentationIsActive)&&e?.()},O=(e=globalThis)=>Object.hasOwn(e,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),k=(e,t=globalThis)=>O(t)?(D(e,t),i(t)??E(e,t)):E(e,t);export{O as a,l as c,S as d,x as f,e as h,k as i,c as l,_ as m,d as n,E as o,D as p,a as r,o as s,t,C as u};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bippy",
3
- "version": "0.7.3-dev.e2b879b",
3
+ "version": "0.7.3-dev.e910a3b",
4
4
  "description": "hack into react internals",
5
5
  "keywords": [
6
6
  "bippy",
package/src/react.ts CHANGED
@@ -1,98 +1,152 @@
1
1
  import "./install-hook-only.js";
2
- import * as React from "react";
3
- import { isFiber } from "./core.js";
2
+ import React from "react";
3
+ import { isFiber, traverseFiber } from "./core.js";
4
+ import { _renderers } from "./rdt-hook.js";
4
5
  import type { Fiber } from "./react-internals/index.js";
5
6
 
6
7
  export type { Fiber } from "./react-internals/index.js";
7
8
 
8
- interface FiberHookEffect {
9
- create: unknown;
10
- next: unknown;
9
+ interface RenderMarker {
10
+ (state: undefined): undefined;
11
11
  }
12
12
 
13
- const preserveState = (state: undefined): undefined => state;
14
- const readEmptySnapshot = (): undefined => undefined;
15
- const unsubscribeFromEmptyStore = (): void => {};
16
- const subscribeToEmptyStore = (): (() => void) => unsubscribeFromEmptyStore;
17
- const useSyncExternalStore: unknown = Reflect.get(React, "useSyncExternalStore");
13
+ interface ReducerQueue {
14
+ lastRenderedReducer: unknown;
15
+ }
18
16
 
19
- const captureFiberFromHook = (useCaptureHook: () => void): Fiber | null => {
20
- const originalBind = Function.prototype.bind;
21
- let capturedFiber: Fiber | null = null;
22
- // HACK: React binds hook callbacks to the rendering Fiber in production but exposes no public API for it.
23
- const bindProxy = new Proxy(originalBind, {
24
- apply: (bind, functionToBind, boundArguments) => {
25
- const fiber = boundArguments[1];
26
- if (!capturedFiber && isFiber(fiber)) {
27
- capturedFiber = fiber;
28
- }
29
- return Reflect.apply(bind, functionToBind, boundArguments);
30
- },
31
- });
32
- Reflect.set(Function.prototype, "bind", bindProxy);
17
+ interface FiberCapture {
18
+ fiber: Fiber;
19
+ queue: ReducerQueue | null;
20
+ }
33
21
 
34
- try {
35
- useCaptureHook();
36
- } finally {
37
- if (Function.prototype.bind === bindProxy) {
38
- Reflect.set(Function.prototype, "bind", originalBind);
39
- }
40
- }
22
+ const isReducerQueue = (value: unknown): value is ReducerQueue =>
23
+ typeof value === "object" && value !== null && "lastRenderedReducer" in value;
41
24
 
42
- return capturedFiber;
25
+ const hasRenderMarker = (fiber: Fiber, renderMarker: RenderMarker): boolean => {
26
+ for (let hook = fiber.memoizedState; hook; hook = hook.next) {
27
+ if (Array.isArray(hook.memoizedState) && hook.memoizedState[0] === renderMarker) return true;
28
+ }
29
+ return false;
43
30
  };
44
31
 
45
- const useExternalStoreCapture = (): void => {
46
- if (typeof useSyncExternalStore !== "function") return;
47
- Reflect.apply(useSyncExternalStore, React, [
48
- subscribeToEmptyStore,
49
- readEmptySnapshot,
50
- readEmptySnapshot,
51
- ]);
32
+ const getReducerQueue = (fiber: Fiber, renderMarker: RenderMarker): ReducerQueue | null => {
33
+ for (let hook = fiber.memoizedState; hook; hook = hook.next) {
34
+ if (isReducerQueue(hook.queue) && hook.queue.lastRenderedReducer === renderMarker)
35
+ return hook.queue;
36
+ }
37
+ return null;
52
38
  };
53
39
 
54
- const useReducerCapture = (): void => {
55
- React.useReducer(preserveState, undefined);
40
+ const getDevToolsFiber = (renderMarker: RenderMarker): Fiber | null => {
41
+ for (const renderer of _renderers) {
42
+ try {
43
+ const fiber = renderer.getCurrentFiber?.();
44
+ if (fiber && isFiber(fiber) && hasRenderMarker(fiber, renderMarker)) return fiber;
45
+ } catch {}
46
+ }
47
+ return null;
56
48
  };
57
49
 
58
- const useFiberWithExternalStore = (): Fiber | undefined =>
59
- captureFiberFromHook(useExternalStoreCapture) ?? undefined;
50
+ const captureReducerFiber = (
51
+ renderMarker: RenderMarker,
52
+ shouldCapture: boolean,
53
+ ): FiberCapture | null => {
54
+ let originalBind: typeof Function.prototype.bind | undefined;
55
+ if (shouldCapture) {
56
+ try {
57
+ originalBind = Function.prototype.bind;
58
+ } catch {}
59
+ }
60
+ if (!originalBind) {
61
+ React.useReducer(renderMarker, undefined);
62
+ return null;
63
+ }
60
64
 
61
- const isHookEffect = (value: unknown): value is FiberHookEffect =>
62
- typeof value === "object" && value !== null && "create" in value && "next" in value;
65
+ let capture: FiberCapture | null = null;
66
+ let isCapturing = true;
67
+ // HACK: Production React binds a new reducer's Fiber and queue; validate the private reducer marker, not argument positions.
68
+ const bindProxy = new Proxy(originalBind, {
69
+ apply: (bind, callback, boundArguments) => {
70
+ if (isCapturing && !capture) {
71
+ try {
72
+ const queue = boundArguments.find(
73
+ (argument): argument is ReducerQueue =>
74
+ isReducerQueue(argument) && argument.lastRenderedReducer === renderMarker,
75
+ );
76
+ if (queue) {
77
+ const fiber = boundArguments.find(
78
+ (argument): argument is Fiber => isFiber(argument) && isFiber(argument.return),
79
+ );
80
+ if (fiber) capture = { fiber, queue };
81
+ }
82
+ } catch {}
83
+ }
84
+ return Reflect.apply(bind, callback, boundArguments);
85
+ },
86
+ });
63
87
 
64
- const hasRenderMarker = (fiber: Fiber, renderMarker: () => void): boolean => {
65
- const lastEffect = fiber.updateQueue?.lastEffect;
66
- if (!isHookEffect(lastEffect)) return false;
67
- let effect = lastEffect;
68
- do {
69
- if (effect.create === renderMarker) return true;
70
- if (!isHookEffect(effect.next)) return false;
71
- effect = effect.next;
72
- } while (effect !== lastEffect);
73
- return false;
88
+ try {
89
+ try {
90
+ Reflect.set(Function.prototype, "bind", bindProxy);
91
+ } catch {}
92
+ React.useReducer(renderMarker, undefined);
93
+ return capture;
94
+ } finally {
95
+ isCapturing = false;
96
+ capture = null;
97
+ try {
98
+ if (Function.prototype.bind === bindProxy) {
99
+ Reflect.set(Function.prototype, "bind", originalBind);
100
+ }
101
+ } catch {}
102
+ }
74
103
  };
75
104
 
76
- // HACK: React 17 only binds the rendering Fiber on mount. Later renders are identified through
77
- // the effect list instead: renderWithHooks clears `updateQueue` on the work-in-progress Fiber,
78
- // so only the Fiber that is rendering right now holds this render's marker effect.
79
- const useFiberWithReducer = (): Fiber | undefined => {
80
- const fiberRef = React.useRef<Fiber | null>(null);
81
- const renderMarker = (): void => {};
82
- React.useEffect(renderMarker, []);
83
- const mountedFiber = captureFiberFromHook(useReducerCapture);
84
- if (mountedFiber) {
85
- fiberRef.current = mountedFiber;
86
- return mountedFiber;
105
+ // HACK: React <16.13 attaches hooks after render; the shared reducer queue validates the root-walk fallback.
106
+ const getRenderingFiberFromRoot = (
107
+ { fiber, queue }: FiberCapture,
108
+ renderMarker: RenderMarker,
109
+ ): Fiber | null => {
110
+ if (queue?.lastRenderedReducer !== renderMarker) return null;
111
+ let rootFiber = fiber;
112
+ while (rootFiber.return) rootFiber = rootFiber.return;
113
+ const root = rootFiber.stateNode;
114
+ if (typeof root !== "object" || root === null || !("current" in root) || !isFiber(root.current)) {
115
+ return null;
87
116
  }
88
- const knownFiber = fiberRef.current;
89
- if (!knownFiber) return undefined;
90
- return (
91
- [knownFiber, knownFiber.alternate].find(
92
- (candidate) => candidate !== null && hasRenderMarker(candidate, renderMarker),
93
- ) ?? undefined
94
- );
117
+ const renderingRoot = root.current.alternate;
118
+ return traverseFiber(renderingRoot, (candidate) => {
119
+ if (candidate !== fiber && candidate !== fiber.alternate) return false;
120
+ let parent = candidate;
121
+ while (parent.return) parent = parent.return;
122
+ return parent === renderingRoot;
123
+ });
95
124
  };
96
125
 
97
- export const useFiber =
98
- typeof useSyncExternalStore === "function" ? useFiberWithExternalStore : useFiberWithReducer;
126
+ export const useFiber = (): Fiber | undefined => {
127
+ "use no memo";
128
+ const fiberRef = React.useRef<FiberCapture | null>(null);
129
+ const renderMarker: RenderMarker = (state) => state;
130
+ React.useMemo(() => renderMarker, [renderMarker]);
131
+ const devToolsFiber = fiberRef.current ? null : getDevToolsFiber(renderMarker);
132
+ const capture = captureReducerFiber(renderMarker, !fiberRef.current && !devToolsFiber);
133
+ if (devToolsFiber) {
134
+ fiberRef.current = {
135
+ fiber: devToolsFiber,
136
+ queue: getReducerQueue(devToolsFiber, renderMarker),
137
+ };
138
+ return devToolsFiber;
139
+ }
140
+ const knownCapture = capture ?? fiberRef.current;
141
+ if (!knownCapture) return undefined;
142
+ const knownFiber = knownCapture.fiber;
143
+ const fiber =
144
+ capture?.fiber ??
145
+ (hasRenderMarker(knownFiber, renderMarker)
146
+ ? knownFiber
147
+ : knownFiber.alternate && hasRenderMarker(knownFiber.alternate, renderMarker)
148
+ ? knownFiber.alternate
149
+ : getRenderingFiberFromRoot(knownCapture, renderMarker));
150
+ if (fiber) fiberRef.current = { fiber, queue: knownCapture.queue };
151
+ return fiber ?? undefined;
152
+ };