bippy
Version:
hack into react internals
14 lines • 13.1 kB
JavaScript
/**
* @license bippy
*
* Copyright (c) Aiden Bai
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import{i as e,r as t}from"./rdt-hook.js";import{getDisplayName as n}from"./core.js";import{a as r,c as i,d as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f,u as p}from"./get-source.js";const m=(e,t)=>{let n=e.split(`
`),r=t-1;if(r<0||r>=n.length)return null;let i=Math.max(0,r-5),a=Math.min(n.length,r+5),o=n.slice(i,a).join(`
`),s=/(?:^|export\s+)(?:const|let|var)\s+(\w+)\s*=/m,c=/(?:^|export\s+)function\s+(\w+)/m,l=/(?:^|export\s+)class\s+(\w+)/m,u=o.match(s);if(u?.[1])return u[1];let d=o.match(c);if(d?.[1])return d[1];let f=o.match(l);return f?.[1]?f[1]:null},h=async(e,t=!0,r)=>{let a=(await l(e,t,r)).filter(e=>e.fileName)[0];if(!a?.fileName)return n(e.type);let o=await s(a.fileName,t,r);if(!o)return n(e.type);let c=null;if(typeof a.lineNumber==`number`&&typeof a.columnNumber==`number`&&(c=i(o,a.lineNumber,a.columnNumber)),!c?.fileName||!c.lineNumber||!o.sourcesContent)return n(e.type);let u=o.sources.indexOf(c.fileName);if(u===-1||!o.sourcesContent[u])return n(e.type);let d=o.sourcesContent[u];return m(d,c.lineNumber)||n(e.type)},g=Symbol.for(`react.context`),ee=Symbol.for(`react.memo_cache_sentinel`);let _=[],v=null,y=null,b=null,x=null,S=0,C=null;const w=Error("Suspense Exception: This is not a real error! It's an implementation detail of `use` to interrupt the current render."),T=e=>a(e.stack||``,{includeInElement:!1}),E=()=>{let e=b;return e!==null&&(b=e.next),e},D=e=>{if(y===null)return e._currentValue;if(x===null)throw Error(`Context reads do not line up with context dependencies.`);if(Object.prototype.hasOwnProperty.call(x,`memoizedValue`)){let e=x.memoizedValue;return x=x.next,e}return e._currentValue},te=()=>{let n=e(),r=[...t,...n.renderers.values()];for(let e of r){let t=e.currentDispatcherRef;if(t&&typeof t==`object`)return t}return null},O=e=>`H`in e?e.H:e.current,k=(e,t)=>{`H`in e?e.H=t:e.current=t},A=(e,t,n,r=null)=>{_.push({displayName:r,primitive:e,stackError:Error(),value:t,dispatcherHookName:n})},ne=e=>{if(typeof e==`object`&&e){let t=e;if(typeof t.then==`function`){let e=C!==null&&S<C.length?C[S++]:t;switch(e.status){case`fulfilled`:return A(`Promise`,e.value,`Use`),e.value;case`rejected`:throw e.reason}throw A(`Unresolved`,e,`Use`),w}if(t.$$typeof===g&&`_currentValue`in t){let e=t,n=D(e);return A(`Context (use)`,n,`Use`,e.displayName||`Context`),n}}throw Error(`An unsupported type was passed to use(): `+String(e))},re=e=>{let t=D(e);return A(`Context`,t,`Context`,e.displayName||null),t},ie=e=>{let t=E(),n=t===null?typeof e==`function`?e():e:t.memoizedState;return A(`State`,n,`State`),[n,()=>{}]},ae=(e,t,n)=>{let r=E(),i=r===null?n===void 0?t:n(t):r.memoizedState;return A(`Reducer`,i,`Reducer`),[i,()=>{}]},oe=e=>{let t=E(),n=t===null?{current:e}:t.memoizedState;return A(`Ref`,n.current,`Ref`),n},se=()=>{let e=E();return A(`CacheRefresh`,e===null?()=>{}:e.memoizedState,`CacheRefresh`),()=>{}},ce=e=>{E(),A(`LayoutEffect`,e,`LayoutEffect`)},le=e=>{E(),A(`InsertionEffect`,e,`InsertionEffect`)},ue=e=>{E(),A(`Effect`,e,`Effect`)},j=e=>{E();let t;typeof e==`object`&&e&&`current`in e&&(t=e.current),A(`ImperativeHandle`,t,`ImperativeHandle`)},M=(e,t)=>{A(`DebugValue`,typeof t==`function`?t(e):e,`DebugValue`)},N=e=>{let t=E();return A(`Callback`,t===null?e:t.memoizedState[0],`Callback`),e},P=e=>{let t=E(),n=t===null?e():t.memoizedState[0];return A(`Memo`,n,`Memo`),n},F=(e,t)=>{let n=E();E();let r=n===null?t():n.memoizedState;return A(`SyncExternalStore`,r,`SyncExternalStore`),r},I=()=>{let e=E();E();let t=e===null?!1:e.memoizedState;return A(`Transition`,t,`Transition`),[t,()=>{}]},L=e=>{let t=E(),n=t===null?e:t.memoizedState;return A(`DeferredValue`,n,`DeferredValue`),n},R=()=>{let e=E(),t=e===null?``:e.memoizedState;return A(`Id`,t,`Id`),t},z=e=>{let t=y;if(t==null)return[];let n=t.updateQueue?.memoCache;if(n==null)return[];let r=n.data[n.index];return r===void 0&&(r=n.data[n.index]=Array.from({length:e},()=>ee)),n.index++,r},B=e=>{let t=E(),n=t===null?e:t.memoizedState;return A(`Optimistic`,n,`Optimistic`),[n,()=>{}]},V=(e,t)=>{let n,r=null;if(e!==null){let t=e.memoizedState;if(typeof t==`object`&&t&&`then`in t&&typeof t.then==`function`){let e=t;switch(e.status){case`fulfilled`:n=e.value;break;case`rejected`:r=e.reason;break;default:r=w,n=e}}else n=t}else n=t;return{value:n,error:r}},H=e=>(t,n)=>{let r=E();E(),E();let i=Error(),{value:a,error:o}=V(r,n);if(_.push({displayName:null,primitive:e,stackError:i,value:a,dispatcherHookName:e}),o!==null)throw o;return[a,()=>{},!1]},U=H(`ActionState`),W={readContext:D,use:ne,useCallback:N,useContext:re,useEffect:ue,useImperativeHandle:j,useLayoutEffect:ce,useInsertionEffect:le,useMemo:P,useReducer:ae,useRef:oe,useState:ie,useDebugValue:M,useDeferredValue:L,useTransition:I,useSyncExternalStore:F,useId:R,useHostTransitionStatus:()=>{let e=D({_currentValue:null});return A(`HostTransitionStatus`,e,`HostTransitionStatus`),e},useFormState:H(`FormState`),useActionState:U,useOptimistic:B,useMemoCache:z,useCacheRefresh:se,useEffectEvent:e=>(E(),A(`EffectEvent`,e,`EffectEvent`),e)},de=typeof Proxy>`u`?W:new Proxy(W,{get(e,t){if(Object.prototype.hasOwnProperty.call(e,t))return e[t];let n=Error(`Missing method in Dispatcher: `+t);throw n.name=`ReactDebugToolsUnsupportedHookError`,n}}),G=()=>{if(v!==null)return v;let e=new Map,t;try{if(W.useContext({_currentValue:null}),W.useState(null),W.useReducer(e=>e,null),W.useRef(null),typeof W.useCacheRefresh==`function`&&W.useCacheRefresh(),W.useLayoutEffect(()=>{}),W.useInsertionEffect(()=>{}),W.useEffect(()=>{}),W.useImperativeHandle(void 0,()=>null),W.useDebugValue(null),W.useCallback(()=>{}),W.useTransition(),W.useSyncExternalStore(()=>()=>{},()=>null,()=>null),W.useDeferredValue(null),W.useMemo(()=>null),W.useOptimistic(null,e=>e),W.useFormState(e=>e,null),W.useActionState(e=>e,null),W.useHostTransitionStatus(),typeof W.useMemoCache==`function`&&W.useMemoCache(0),typeof W.use==`function`){W.use({$$typeof:g,_currentValue:null}),W.use({then(){},status:`fulfilled`,value:null});try{W.use({then(){}})}catch{}}W.useId(),typeof W.useEffectEvent==`function`&&W.useEffectEvent(()=>{})}finally{t=_,_=[]}for(let n of t)e.set(n.primitive,T(n.stackError));return v=e,v};let K=0;const q=(e,t,n)=>{if(n>=t.length)return-1;let r=t[n].source;hookSearch:for(let i=0;i<e.length;i++)if(e[i].source===r){for(let r=n+1,a=i+1;r<t.length&&a<e.length;r++,a++)if(e[a].source!==t[r].source)continue hookSearch;return i}return-1},fe=(e,t)=>{let n=q(t,e,K);if(n!==-1)return n;for(let r=0;r<e.length&&r<5;r++)if(n=q(t,e,r),n!==-1)return K=r,n;return-1},J=e=>{if(!e)return``;let t=e.lastIndexOf(`[as `);if(t!==-1)return J(e.slice(t+4,-1));if(t=e.lastIndexOf(`.`),t=t===-1?0:t+1,e.slice(t).startsWith(`unstable_`)&&(t+=9),e.slice(t).startsWith(`experimental_`)&&(t+=13),e.slice(t,t+3)===`use`){if(e.length-t===3)return`Use`;t+=3}return e.slice(t)},Y=(e,t)=>{let n=J(e);return t===`HostTransitionStatus`?n===t||n===`FormStatus`:n===t},pe=(e,t)=>{let n=G().get(t.primitive);if(n===void 0)return-1;for(let r=0;r<n.length&&r<e.length;r++)if(n[r].source!==e[r].source)return r<e.length-1&&Y(e[r].functionName,t.dispatcherHookName)&&r++,r<e.length-1&&Y(e[r].functionName,t.dispatcherHookName)&&r++,r;return-1},me=(e,t)=>{let n=T(t.stackError),r=fe(e,n),i=pe(n,t);return r===-1||i===-1||r-i<2?i===-1?[null,null]:[n[i-1]??null,null]:[n[i-1]??null,n.slice(i,r-1)]},he=new Set([`Context`,`Context (use)`,`DebugValue`,`Promise`,`Unresolved`,`HostTransitionStatus`]),ge=(e,t)=>{let n=[],r=null,i=n,a=0,o=[];for(let s of t){let[t,c]=me(e,s),l=s.displayName;if(l===null&&t!==null&&(l=J(t.functionName)||J(s.dispatcherHookName)),c!==null){let e=0;if(r!==null){for(;e<c.length&&e<r.length&&c[c.length-e-1].source===r[r.length-e-1].source;)e++;for(let t=r.length-1;t>e;t--)i=o.pop()??n}for(let t=c.length-e-1;t>=1;t--){let e=[],n=c[t],r={id:null,isStateEditable:!1,name:J(c[t-1].functionName),value:void 0,subHooks:e,hookSource:{lineNumber:n.lineNumber??null,columnNumber:n.columnNumber??null,functionName:n.functionName??null,fileName:n.fileName??null}};i.push(r),o.push(i),i=e}r=c}let{primitive:u}=s,d=he.has(u)?null:a++,f=u===`Reducer`||u===`State`,p=l||u,m=c?.[0],h={lineNumber:m?.lineNumber??null,columnNumber:m?.columnNumber??null,functionName:m?.functionName??null,fileName:m?.fileName??null};i.push({id:d,isStateEditable:f,name:p,value:s.value,subHooks:[],hookSource:h})}return X(n,null),n},X=(e,t)=>{let n=[];for(let t=0;t<e.length;t++){let r=e[t];r.name===`DebugValue`&&r.subHooks.length===0?(e.splice(t,1),t--,n.push(r)):X(r.subHooks,r)}t!==null&&(n.length===1?t.value=n[0].value:n.length>1&&(t.value=n.map(({value:e})=>e)))},_e=(e,t)=>{let n=t;for(;n;){if(n.tag===10){let t=n.type;`_context`in t&&t._context!==void 0&&(t=t._context),e.has(t)||(e.set(t,t._currentValue),t._currentValue=n.memoizedProps.value)}n=n.return}},ve=e=>{e.forEach((e,t)=>{t._currentValue=e})},ye=e=>{if(e===w)return;if(e instanceof Error&&e.name===`ReactDebugToolsUnsupportedHookError`)throw e;let t=Error(`Error rendering inspected component`,{cause:e});throw t.name=`ReactDebugToolsRenderError`,t.cause=e,t},be=(e,t)=>{if(e&&typeof e==`object`&&`defaultProps`in e&&e.defaultProps){let n={...t},r=e.defaultProps;for(let e in r)n[e]===void 0&&(n[e]=r[e]);return n}return t},xe=()=>{let e={};for(let t in console)try{e[t]=console[t],console[t]=()=>{}}catch{}return e},Se=e=>{for(let t in e)try{console[t]=e[t]}catch{}},Z=(e,t)=>{let n=O(e);k(e,de);let r=[],i;try{i=Error(),t()}catch(e){ye(e)}finally{r=_,_=[],k(e,n)}return ge(i===void 0?[]:T(i),r)},Ce=()=>{let e=te();if(!e)throw Error(`No React renderer found. Make sure React is loaded and bippy's hook is installed.`);return e},we=e=>{if(Object.prototype.hasOwnProperty.call(e,`dependencies`)){let t=e.dependencies;x=t===null?null:t.firstContext}else if(Object.prototype.hasOwnProperty.call(e,`dependencies_old`)){let t=e.dependencies_old;x=t===null?null:t.firstContext}else if(Object.prototype.hasOwnProperty.call(e,`dependencies_new`)){let t=e.dependencies_new;x=t===null?null:t.firstContext}else if(Object.prototype.hasOwnProperty.call(e,`contextDependencies`)){let t=e.contextDependencies;x=t===null?null:t.first}else throw Error(`Unsupported React version.`)},Te=e=>{let t=Ce();if(e.tag!==0&&e.tag!==15&&e.tag!==11)throw Error(`Unknown Fiber. Needs to be a function component to inspect hooks.`);G(),b=e.memoizedState,y=e;let n=e.dependencies&&e.dependencies._debugThenableState,r=n?n.thenables||n:null;C=Array.isArray(r)?r:null,S=0,we(e);let i=e.type,a=e.memoizedProps;i!==e.elementType&&(a=be(i,a));let o=xe(),s=new Map;try{return x!==null&&!Object.prototype.hasOwnProperty.call(x,`memoizedValue`)&&_e(s,e),e.tag===11?Z(t,()=>{i.render(a,e.ref)}):Z(t,()=>{i(a)})}finally{y=null,b=null,x=null,C=null,S=0,ve(s),Se(o)}},Ee=new Set([`Effect`,`LayoutEffect`,`InsertionEffect`,`ImperativeHandle`,`DebugValue`]),De=/(?:const|let|var)\s+((?:\[[\s\S]*?\]|\w+))\s*=\s*(?:[\w$.]+\.)*use[A-Z]\w*\s*(?:<[\s\S]*?>)?\s*\(/g,Oe=e=>`${e.fileName??``}:${e.lineNumber??0}:${e.columnNumber??0}`,Q=e=>{let t=[],n=e=>{for(let r of e)Ee.has(r.name)||(t.push(r),r.subHooks.length>0&&n(r.subHooks))};return n(e),t},$=(e,t,n)=>{if(!t)return null;let r=e.indexOf(n);return r===-1?null:t[r]??null},ke=(e,t)=>{let n=$(e.sources,e.sourcesContent,t);if(n)return n;if(e.sections)for(let n of e.sections){let e=$(n.map.sources,n.map.sourcesContent,t);if(e)return e}return null},Ae=e=>{let t=e.trim();if(t.startsWith(`[`)){let e=t.match(/\[\s*(\w+)/);return e?e[1]:null}return/^\w+$/.test(t)?t:null},je=(e,t,n)=>{let r=e.split(`
`),i=t-1;if(i<0||i>=r.length)return null;let a=Math.max(0,i-10),o=r.slice(a,i+1).join(`
`),s=[...o.matchAll(De)],c=o.lastIndexOf(`
`)+1+n,l=s.filter(e=>e.index<=c).at(-1);return l?Ae(l[1]):null},Me=async(e,t,n,r)=>{let{sourceMapsByFile:a,sourceContentCache:o,fetchFn:c}=r;a.has(e)||a.set(e,await s(e,!0,c));let l=a.get(e)??null;if(l){let r=i(l,t,n);if(r?.fileName&&r.lineNumber!==void 0){let t=`sourcemap:${e}:${r.fileName}`;o.has(t)||o.set(t,ke(l,r.fileName));let n=o.get(t)??null;if(n)return{sourceCode:n,lineNumber:r.lineNumber,columnNumber:r.columnNumber??0}}}if(!o.has(e))try{let t=await(c??fetch)(e);o.set(e,t.ok?await t.text():null)}catch{o.set(e,null)}let u=o.get(e)??null;return u?{sourceCode:u,lineNumber:t,columnNumber:n}:null},Ne=async(e,t)=>{let n=new Map,r=Q(e);if(r.length===0)return n;let i={sourceMapsByFile:new Map,sourceContentCache:new Map,fetchFn:t};return await Promise.all(r.map(async e=>{let t=e.hookSource;if(!t||!t.fileName||t.lineNumber===null||t.columnNumber===null)return;let r=await Me(t.fileName,t.lineNumber,t.columnNumber,i);if(!r)return;let a=je(r.sourceCode,r.lineNumber,r.columnNumber);if(a){let e=Oe(t);n.set(e,a)}})),n};export{o as formatOwnerStack,h as getDisplayNameFromSource,Te as getFiberHooks,r as getOwnerStack,l as getParentStack,f as getSource,i as getSourceFromSourceMap,s as getSourceMap,d as hasDebugStack,c as isSourceFile,u as normalizeFileName,Ne as parseHookNames,a as parseStack,p as symbolicateStack};