bippy 0.7.2-dev.b756bd6 → 0.7.2-dev.e113600
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -68
- package/dist/core.cjs +1 -1
- package/dist/core.js +1 -1
- package/dist/errors.d.cts +34 -3
- package/dist/errors.d.ts +34 -3
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +8 -35
- package/dist/index.d.ts +8 -35
- package/dist/index.js +1 -1
- package/dist/install-hook-only.cjs +1 -1
- package/dist/install-hook-only.js +1 -1
- package/dist/rdt-hook.cjs +1 -1
- package/dist/rdt-hook.js +1 -1
- package/dist/source.cjs +8 -8
- package/dist/source.d.cts +35 -9
- package/dist/source.d.ts +35 -9
- package/dist/source.js +13 -13
- package/package.json +2 -2
- package/src/core.ts +133 -51
- package/src/rdt-hook.ts +126 -70
- package/src/react-internals/types.ts +10 -2
- package/src/source/get-display-name-from-source.ts +10 -3
- package/src/source/get-source.ts +39 -19
- package/src/source/index.ts +17 -3
- package/src/source/inspect-hooks.ts +133 -17
- package/src/source/owner-stack.ts +19 -11
- package/src/source/parse-hook-names.ts +15 -8
- package/src/source/renderer-dispatchers.ts +9 -4
- package/src/source/symbolication.ts +53 -32
package/dist/source.js
CHANGED
|
@@ -6,19 +6,19 @@
|
|
|
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{
|
|
10
|
-
`),n=[];for(let e of t)if(/^\s*at\s+/.test(e)){let t=
|
|
11
|
-
`).filter(e=>!!e.match(
|
|
12
|
-
`).filter(e=>!e.match(
|
|
13
|
-
`,t));return{frames:
|
|
14
|
-
`,a-1)+1,n=t.slice(e,a).match(
|
|
15
|
-
`),i=r===-1?t:t.slice(r+1);if(i.includes(e))return`\n${i}`}return M(`${e}${t?` [${t}]`:``}`)};let N=!1;const P=new WeakMap,F=(e,t)=>{if(!e||N)return``;let n=P.get(e);if(n!==void 0)return n;let r=
|
|
9
|
+
import{i as e,n as t,u as n}from"./rdt-hook.js";import{C as r,E as i,O as a,S as o,T as s,b as c,d as l,i as u,u as d,w as f}from"./core.js";const p=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,m=[`rsc://`,`file:///`,`webpack-internal://`,`webpack://`,`node:`,`turbopack://`,`metro://`,`/app-pages-browser/`,`/(app-pages-browser)/`],ee=[`rsc://`,`about://React/`],te=[`<anonymous>`,`eval`,``],ne=/\.(cjs|cts|js|jsx|mdx|mjs|mts|ts|tsx)$/,re=/(\.min|bundle|chunk|vendor|vendors|runtime|polyfill|polyfills)\.(js|mjs|cjs)$|(chunk|bundle|vendor|vendors|runtime|polyfill|polyfills|framework|app|main|index)[-_.][A-Za-z0-9_-]{4,}\.(js|mjs|cjs)$|[\da-f]{8,}\.(js|mjs|cjs)$|[-_.][\da-f]{20,}\.(js|mjs|cjs)$|\/dist\/|\/build\/|\/.next\/|\/out\/|\/node_modules\/|\.webpack\.|\.vite\.|\.turbopack\./i,ie=/^\?[\w~.-]+(?:=[^&#]*)?(?:&[\w~.-]+(?:=[^&#]*)?)*$/,ae=/\[[^\]]+\]$/,h=[`react_stack_bottom_frame`,`react-stack-bottom-frame`],oe=Error,se=()=>oe.prepareStackTrace,g=e=>{oe.prepareStackTrace=e},ce=/(^|@)\S+:\d+/,le=/^\s*at .*(\S+:\d+|\(native\))/m,ue=/^(eval@)?(\[native code\])?$/,_=(e,t)=>{if(t?.includeInElement!==!1){let t=e.split(`
|
|
10
|
+
`),n=[];for(let e of t)if(/^\s*at\s+/.test(e)){let t=fe(e)[0];t&&n.push(t)}else if(/^\s*in\s+/.test(e)){let t=e.replace(/^\s*in\s+/,``).replace(/\s*(?:\(at .*\)|\[[^\]]+\])$/,``);n.push({functionName:t,source:e})}else if(e.match(ce)){let t=pe(e)[0];t&&n.push(t)}return n}return e.match(le)?fe(e):pe(e)},de=e=>{if(!e.includes(`:`))return[e,void 0,void 0];let t=e.startsWith(`(`)&&/:\d+\)$/.test(e)?e.slice(1,-1):e,n=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(t);return n?[n[1],n[2]||void 0,n[3]||void 0]:[t,void 0,void 0]},fe=e=>e.split(`
|
|
11
|
+
`).filter(e=>!!e.match(le)).map(e=>{let t=e;t.includes(`(eval `)&&(t=t.replace(/eval code/g,`eval`).replace(/(\(eval at [^()]*)|(,.*$)/g,``));let n=t.replace(/^\s+/,``).replace(/\(eval code/g,`(`).replace(/^.*?\s+/,``),r=n.match(/ (\(.+\)$)/);n=r?n.replace(r[0],``):n;let i=de(r?r[1]:n);return{functionName:r&&n||void 0,fileName:[`eval`,`<anonymous>`,`(native)`].includes(i[0])?void 0:i[0],lineNumber:i[1]?+i[1]:void 0,columnNumber:i[2]?+i[2]:void 0,source:t}}),pe=e=>e.split(`
|
|
12
|
+
`).filter(e=>!e.match(ue)).map(e=>{let t=e;if(t.includes(` > eval`)&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,`:$1`)),!t.includes(`@`)&&!t.includes(`:`))return{functionName:t};{let e=/(([^\n\r"\u2028\u2029]*".[^\n\r"\u2028\u2029]*"[^\n\r@\u2028\u2029]*(?:@[^\n\r"\u2028\u2029]*"[^\n\r@\u2028\u2029]*)*(?:[\n\r\u2028\u2029][^@]*)?)?[^@]*)@/,n=t.match(e),r=n&&n[1]?n[1]:void 0,i=de(t.replace(e,``));return{functionName:r,fileName:i[0],lineNumber:i[1]?+i[1]:void 0,columnNumber:i[2]?+i[2]:void 0,source:t}}}),me=new WeakMap,he=e=>h.some(t=>e.includes(t)),ge=e=>{let t=e.getFunctionName?.()??``;if(t)return t;let n=e.getTypeName?.()??``,r=e.getMethodName?.()??``;return n&&r?`${n}.${r}`:r},_e=e=>{let t=[];for(let n=1;n<e.length;n++){let r=e[n],i=ge(r);if(he(i))return{frames:t,isTrusted:!0};if(r.isNative?.()){t.push({functionName:i||void 0});continue}let a=r.getScriptNameOrSourceURL?.()??``;!a&&r.isEval?.()&&(a=r.getEvalOrigin?.()??``),t.push({functionName:i&&i!==`<anonymous>`?i:void 0,fileName:a&&a!==`<anonymous>`?a:void 0,lineNumber:r.getLineNumber?.()??void 0,columnNumber:r.getColumnNumber?.()??void 0,enclosingLineNumber:r.getEnclosingLineNumber?.()??void 0,enclosingColumnNumber:r.getEnclosingColumnNumber?.()??void 0,source:` at ${r.toString()}`})}return{frames:t,isTrusted:!1}},ve=e=>{let t=-1;for(let n of h)if(t=e.indexOf(n),t!==-1)break;let n=t===-1?e:e.slice(0,e.lastIndexOf(`
|
|
13
|
+
`,t));return{frames:_(n).slice(1),isTrusted:t!==-1}},v=e=>{let t=me.get(e);if(t)return t;let n=null,r=(e,t)=>{n=_e(t);let r=`${e.name||`Error`}: ${e.message||``}`;for(let e of t)r+=`\n at ${e.toString()}`;return r},i=se();g(r);let a;try{a=String(e.stack)}finally{g(i)}let o=n??ve(a);return me.set(e,o),o},ye=(r=globalThis)=>{let i=e(void 0,r),a=n(i.renderers)?i.renderers.values():[],o=r===globalThis?new Set([...t,...a]):new Set(a),s=[],c=new Set;for(let e of o){let t=e.currentDispatcherRef;!t||c.has(t)||(c.add(t),s.push(t))}return s},be=e=>`H`in e?e.H:e.current,y=(e,t)=>{`H`in e?e.H=t:e.current=t};var xe=44,Se=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,Ce=new Uint8Array(64),we=new Uint8Array(128);for(let e=0;e<Se.length;e++){let t=Se.charCodeAt(e);Ce[e]=t,we[t]=e}function b(e,t){let n=0,r=0,i=0;do i=we[e.next()],n|=(i&31)<<r,r+=5;while(i&32);let a=n&1;return n>>>=1,a&&(n=-2147483648|-n),t+n}function Te(e,t){return e.pos>=t?!1:e.peek()!==xe}var Ee=class{constructor(e){this.pos=0,this.buffer=e}next(){return this.buffer.charCodeAt(this.pos++)}peek(){return this.buffer.charCodeAt(this.pos)}indexOf(e){let{buffer:t,pos:n}=this,r=t.indexOf(e,n);return r===-1?t.length:r}};function De(e){let{length:t}=e,n=new Ee(e),r=[],i=0,a=0,o=0,s=0,c=0;do{let e=n.indexOf(`;`),t=[],l=!0,u=0;for(i=0;n.pos<e;){let r;i=b(n,i),i<u&&(l=!1),u=i,Te(n,e)?(a=b(n,a),o=b(n,o),s=b(n,s),Te(n,e)?(c=b(n,c),r=[i,a,o,s,c]):r=[i,a,o,s]):r=[i],t.push(r),n.pos++}l||Oe(t),r.push(t),n.pos=e+1}while(n.pos<=t);return r}function Oe(e){e.sort(ke)}function ke(e,t){return e[0]-t[0]}const x=/^data:application\/json(?:;[^,]*)?,/i,Ae=/(?:\/\/[@#][ \t]+sourceMappingURL=([^\s'"]+?)[ \t]*$)|(?:\/\*[@#][ \t]+sourceMappingURL=([^*]+?)[ \t]*(?:\*\/)[ \t]*$)/,je=new Map,Me=new WeakMap;var Ne=class extends Error{};const Pe=new Map,Fe=new WeakMap,Ie=new Set([`chrome-extension:`,`moz-extension:`,`safari-web-extension:`]),Le=new Set([`http:`,`https:`,...Ie]),Re=(e,t,n,r)=>{let[,i,a,o,s]=e;if(i===void 0||a===void 0||o===void 0)return null;let c=t[i];return c?{columnNumber:o,fileName:c,functionName:s===void 0?void 0:r?.[s]||void 0,isIgnoreListed:n?.has(i)??!1,lineNumber:a+1}:null},ze=(e,t,n,r,i,a)=>{if(n<0||n>=e.length)return null;let o=e[n];if(!o||o.length===0)return null;let s=null,c=0,l=o.length-1;for(;c<=l;){let e=c+l>>1;o[e][0]<=r?(s=o[e],c=e+1):l=e-1}return!s||s.length<4?null:Re(s,t,i,a)},S=(e,t,n)=>{if(e.sections){let r=t-1,i=null;for(let t of e.sections)if(r>t.offset.line||r===t.offset.line&&n>=t.offset.column)i=t;else break;if(!i)return null;let a=r-i.offset.line,o=r===i.offset.line?n-i.offset.column:n;return ze(i.map.mappings,i.map.sources,a,o,i.map.ignoredSourceIndices,i.map.names)}return ze(e.mappings,e.sources,t-1,n,e.ignoredSourceIndices,e.names)},Be=(e,t,n,r,i)=>{if(!n)return null;let a=n.indexOf(r);if(a===-1)return null;let o=null;for(let r of e)for(let e of r){if(e[4]!==a)continue;let r=Re(e,t,i,n);if(r){if(!r.isIgnoreListed)return r;o??=r}}return o},Ve=(e,t)=>{if(e.sections){let n=null;for(let r of e.sections){let e=Be(r.map.mappings,r.map.sources,r.map.names,t,r.map.ignoredSourceIndices);if(e){if(!e.isIgnoreListed)return e;n??=e}}return n}return Be(e.mappings,e.sources,e.names,t,e.ignoredSourceIndices)},He=(e,t,n)=>{if(!t)return null;let r=e.indexOf(n);return r===-1?null:t[r]??null},C=(e,t)=>{let n=He(e.sources,e.sourcesContent,t);if(n!==null)return n;if(!e.sections)return null;for(let n of e.sections){let e=He(n.map.sources,n.map.sourcesContent,t);if(e!==null)return e}return null},w=(e,t)=>{if(x.test(e))return e;try{return new URL(e,t).toString()}catch{try{return new URL(e).toString()}catch{try{let n=new URL(e,new URL(t,`https://bippy.invalid/`));return`${n.pathname}${n.search}${n.hash}`}catch{return null}}}},Ue=e=>{try{let t=new URL(e),n=t.pathname.lastIndexOf(`.bundle`);if(n===-1)return null;let r=t.pathname.slice(n+7);if(r&&!r.startsWith(`//&`))return null;if(t.pathname=`${t.pathname.slice(0,n)}.map`,r){let e=new URLSearchParams(r.slice(3));for(let[n,r]of e)t.searchParams.set(n,r)}return t.hash=``,t.toString()}catch{return null}},We=(e,t,n)=>{let r=n.headers.get(`sourcemap`)??n.headers.get(`x-sourcemap`);if(r)return w(r.trim(),e);let i,a=t.length;for(;a>0&&!i;){let e=t.lastIndexOf(`
|
|
14
|
+
`,a-1)+1,n=t.slice(e,a).match(Ae);n&&(i=n[1]||n[2]),a=e-1}return i?w(i,e):Ue(e)},T=e=>{if(typeof e!=`object`||!e)return!1;let t=Reflect.get(e,`version`),n=Reflect.get(e,`mappings`),r=Reflect.get(e,`file`),i=Reflect.get(e,`names`),a=Reflect.get(e,`sourceRoot`),o=Reflect.get(e,`sources`),s=Reflect.get(e,`sourcesContent`),c=Reflect.get(e,`ignoreList`),l=Reflect.get(e,`x_google_ignoreList`);if(t!==3||typeof n!=`string`||r!==void 0&&typeof r!=`string`||i!==void 0&&(!Array.isArray(i)||i.some(e=>typeof e!=`string`))||a!==void 0&&typeof a!=`string`||s!==void 0&&(!Array.isArray(s)||s.some(e=>typeof e!=`string`&&e!==null))||c!==void 0&&(!Array.isArray(c)||c.some(e=>!Number.isInteger(e)||e<0))||l!==void 0&&(!Array.isArray(l)||l.some(e=>!Number.isInteger(e)||e<0))||!Array.isArray(o)||o.some(e=>typeof e!=`string`)||s&&s.length!==o.length)return!1;let u=o.length;return[...c??[],...l??[]].every(e=>e<u)},Ge=e=>{if(typeof e!=`object`||!e)return!1;let t=Reflect.get(e,`version`),n=Reflect.get(e,`sections`);return t!==3||!Array.isArray(n)?!1:n.every(e=>{if(typeof e!=`object`||!e)return!1;let t=Reflect.get(e,`map`),n=Reflect.get(e,`url`),r=Reflect.get(e,`offset`);if(typeof r!=`object`||!r)return!1;let i=Reflect.get(r,`column`),a=Reflect.get(r,`line`);return T(t)!==(typeof n==`string`&&n.length>0)&&typeof i==`number`&&Number.isInteger(i)&&i>=0&&typeof a==`number`&&Number.isInteger(a)&&a>=0})},Ke=e=>{let t=e.ignoreList??e.x_google_ignoreList;return t?.length?new Set(t):void 0},qe=(e,t,n)=>{if(!e||p.test(t)||t.startsWith(`/`))return t;let r=e.endsWith(`/`)?e:`${e}/`,i=t.replace(/^\.\//,``);try{let e=p.test(r)?r:new URL(r,n).toString();return new URL(i,e).toString()}catch{let e=`${r}${i}`.split(`/`),t=[];for(let n of e)n===`..`?t.pop():n!==`.`&&t.push(n);return t.join(`/`)}},Je=(e,t)=>e.sources.map(n=>qe(e.sourceRoot,n,t)),Ye=e=>x.test(e)?void 0:e,Xe=(e,t)=>{try{return{file:e.file,ignoredSourceIndices:Ke(e),mappings:De(e.mappings),names:e.names,sourceMapUrl:Ye(t),sourceRoot:e.sourceRoot,sources:Je(e,t),sourcesContent:e.sourcesContent,version:3}}catch{return null}},Ze=async(e,t,n)=>{let r=[],i=-1,a=-1;for(let o of e.sections){if(o.offset.line<i||o.offset.line===i&&o.offset.column<=a)return null;i=o.offset.line,a=o.offset.column;let e=o.url?w(o.url,t):null,s=o.map??(e?await n(e):null);if(!s)return null;let c=e??t;try{r.push({map:{...s,ignoredSourceIndices:Ke(s),mappings:De(s.mappings),sources:Je(s,c)},offset:o.offset})}catch{return null}}let o=new Set;for(let e of r)for(let t of e.map.sources)o.add(t);return{file:e.file,mappings:[],names:[],sections:r,sourceMapUrl:Ye(t),sourceRoot:void 0,sources:Array.from(o),sourcesContent:void 0,version:3}},Qe=(e,t=!1)=>{if(!e)return!1;let n=e.trim();if(!n)return!1;let r=n.match(p);if(!r)return!0;let i=r[0].toLowerCase();return t||Le.has(i)},$e=()=>typeof window>`u`&&typeof process<`u`&&typeof process.versions?.node==`string`,et=e=>{try{let t=new URL(e);return(t.protocol===`http:`||t.protocol===`https:`)&&!t.username&&!t.password}catch{return!1}},E=e=>{try{return new URL(e).protocol}catch{return null}},D=e=>{let t=E(e);return t!==null&&Ie.has(t)},tt=(e,t)=>{try{let n=new URL(e),r=new URL(t);return n.protocol===r.protocol&&n.host===r.host}catch{return!1}},nt=(e,t,n,r)=>{if(x.test(t))return!0;if(!Qe(t,r))return!1;let i=E(e),a=E(t),o=i!==null&&!Le.has(i)||a!==null&&!Le.has(a);return!(n||o||D(e)||D(t))||tt(e,t)},rt=e=>e===408||e===425||e===429||e>=500,it=e=>{if(e.ok)return!0;if(rt(e.status))throw new Ne;return!1},at=(e,t,n)=>!n||t.url.length===0||tt(e,t.url),ot=e=>{if(e.timeoutMs===void 0||e.timeoutMs<0)return{cleanup:()=>{},signal:e.signal};let t=new AbortController,n=()=>t.abort(e.signal?.reason);e.signal?.aborted?n():e.signal?.addEventListener(`abort`,n,{once:!0});let r=setTimeout(()=>t.abort(new s(`Source map request timed out`)),e.timeoutMs);return{cleanup:()=>{clearTimeout(r),e.signal?.removeEventListener(`abort`,n)},signal:t.signal}},st=async(e,t)=>{let n=Number(e.headers.get(`content-length`));if(Number.isFinite(n)&&n>t)return null;if(!e.body){let n=await e.text();return new TextEncoder().encode(n).byteLength>t?null:n}let r=e.body.getReader(),i=new TextDecoder,a=[],o=0;try{for(;;){let{done:e,value:n}=await r.read();if(e)break;if(o+=n.byteLength,o>t)return await r.cancel(),null;a.push(i.decode(n,{stream:!0}))}return a.push(i.decode()),a.join(``)}finally{r.releaseLock()}},ct=e=>{try{if(typeof globalThis.atob==`function`)return new TextDecoder().decode(Uint8Array.from(globalThis.atob(e),e=>e.charCodeAt(0)))}catch{return null}let t=e.replace(/\s/g,``).replace(/=+$/,``),n=[],r=0,i=0;for(let e of t){let t=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`.indexOf(e);if(t===-1)return null;r=r*64+t,i+=6,i>=8&&(i-=8,n.push(Math.floor(r/2**i)&255),r%=2**i)}return new TextDecoder().decode(Uint8Array.from(n))},lt=(e,t)=>{let n=e.indexOf(`,`);if(n===-1)return null;let r=e.slice(0,n),i=e.slice(n+1);if(i.length>t*2)return null;try{let e=r.toLowerCase().includes(`;base64`)?ct(i):decodeURIComponent(i);return e===null||new TextEncoder().encode(e).byteLength>t?null:JSON.parse(e)}catch{return null}},ut=async(e,t,n,r,i)=>{if(x.test(e))return lt(e,r);let a=await t(e,{redirect:i?`error`:`follow`,signal:n});if(!it(a)||!at(e,a,i))return null;let o=await st(a,r);if(o===null)return null;try{return JSON.parse(o)}catch{return null}},dt=async(e,t,n={})=>{let r=t!==void 0;if(!Qe(e,r))return null;let i=$e(),a=(i||D(e))&&!n.allowCrossOriginSourceMap;if(i&&!t&&(!n.allowUnsafeServerFetch||!et(e)))return null;let o=t??(typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):void 0);if(!o)return null;let s=n.maxBundleSizeBytes??26214400,c=n.maxSourceMapSizeBytes??104857600;if(s<0||c<0)return null;let l=ot(n);try{let t=await o(e,{redirect:a?`error`:`follow`,signal:l.signal});if(!it(t)||!at(e,t,a))return null;let n=await st(t,s);if(n===null)return null;let i=We(e,n,t);if(!i||!nt(e,i,a,r))return null;let u=await ut(i,o,l.signal,c,a);return T(u)?Xe(u,i):Ge(u)?Ze(u,i,async t=>{if(!nt(e,t,a,r))return null;let n=await ut(t,o,l.signal,c,a);return T(n)?n:null}):null}finally{l.cleanup()}},ft=(e,t,n)=>{if(!n)return t;let r=e.get(n);return r||(r=new Map,e.set(n,r)),r},pt=e=>ft(Me,je,e),mt=e=>ft(Fe,Pe,e),ht=(e,t)=>t.allowCrossOriginSourceMap===void 0&&t.allowUnsafeServerFetch===void 0&&t.maxBundleSizeBytes===void 0&&t.maxSourceMapSizeBytes===void 0&&t.timeoutMs===void 0?e:`${e}\0${t.allowCrossOriginSourceMap??``}\0${t.allowUnsafeServerFetch??``}\0${t.maxBundleSizeBytes??``}\0${t.maxSourceMapSizeBytes??``}\0${t.timeoutMs??``}`,O=async(e,t=!0,n,r={})=>{let i=t&&r.signal===void 0,a=pt(n),o=mt(n),s=ht(e,r);if(i&&a.has(s))return a.get(s)??null;let c=i?o.get(s):void 0;if(c)return(await c).sourceMap;let l=dt(e,n,r).then(e=>({sourceMap:e,isTransientFailure:!1}),()=>({sourceMap:null,isTransientFailure:!0}));i&&o.set(s,l);let{sourceMap:u,isTransientFailure:d}=await l;return i&&(o.delete(s),d||a.set(s,u)),u},k=async(e,t=!0,n,r={})=>Promise.all(e.map(async e=>{if(!e.fileName)return e;let i=await O(e.fileName,t,n,r);if(!i||typeof e.lineNumber!=`number`||typeof e.columnNumber!=`number`)return e;let a=S(i,e.lineNumber,e.columnNumber);return a?{...e,source:a.fileName&&e.source?e.source.replace(e.fileName,a.fileName):e.source,fileName:a.fileName,functionName:a.functionName??e.functionName,lineNumber:a.lineNumber,columnNumber:a.columnNumber,isIgnoreListed:a.isIgnoreListed,isSymbolicated:!0}:e})),A=e=>e._debugStack instanceof Error&&typeof e._debugStack?.stack==`string`,gt=e=>`tag`in e&&typeof e.tag==`number`,j=e=>{let t=null;if(c(e,n=>{if(n===e)return!1;let r=n._debugOwner;return(r===e||e.alternate!==null&&r===e.alternate)&&n._debugStack instanceof Error&&(t=n._debugStack,!0)}),!t)return null;let{frames:n,isTrusted:r}=v(t);if(!r)return null;for(let e=n.length-1;e>=0;e--){let t=n[e];if(t.fileName)return{...t,lineNumber:t.enclosingLineNumber||t.lineNumber,columnNumber:t.enclosingColumnNumber||t.columnNumber}}return null},_t=()=>{let e=[];for(let t of ye())e.push({currentDispatcherRef:t,value:be(t)}),y(t,null);return e},vt=e=>{for(let{currentDispatcherRef:t,value:n}of e)y(t,n)},M=e=>`\n in ${e}`,yt=(e,t,n)=>{if(n){let t=St(n.stack??``),r=t.lastIndexOf(`
|
|
15
|
+
`),i=r===-1?t:t.slice(r+1);if(i.includes(e))return`\n${i}`}return M(`${e}${t?` [${t}]`:``}`)};let N=!1;const P=new WeakMap,F=(e,t)=>{if(!e||N)return``;let n=P.get(e);if(n!==void 0)return n;let r=se();g(void 0),N=!0;let i=_t(),a=console.error,o=console.warn;console.error=()=>{},console.warn=()=>{};try{let n={DetermineComponentFrameRoot(){let n;try{if(t){let t=function(){throw Error()};Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}});try{Reflect.construct(t,[])}catch(e){n=e}Reflect.construct(e,[],t)}else{try{throw Error()}catch(e){n=e}let t=Function.prototype.apply.call(e,void 0,[]);typeof t==`object`&&t&&`catch`in t&&typeof t.catch==`function`&&t.catch(()=>void 0)}}catch(e){if(e instanceof Error&&n instanceof Error&&typeof e.stack==`string`)return[e.stack,n.stack]}return[null,null]}};Object.defineProperty(n.DetermineComponentFrameRoot,"displayName",{value:`DetermineComponentFrameRoot`}),Object.getOwnPropertyDescriptor(n.DetermineComponentFrameRoot,`name`)?.configurable&&Object.defineProperty(n.DetermineComponentFrameRoot,"name",{value:`DetermineComponentFrameRoot`});let[r,i]=n.DetermineComponentFrameRoot();if(r&&i){let t=r.split(`
|
|
16
16
|
`),n=i.split(`
|
|
17
|
-
`),a=0,o=0;for(;a<t.length&&!t[a].includes(`DetermineComponentFrameRoot`);)a++;for(;o<n.length&&!n[o].includes(`DetermineComponentFrameRoot`);)o++;if(a===t.length||o===n.length)for(a=t.length-1,o=n.length-1;a>=1&&o>=0&&t[a]!==n[o];)o--;for(;a>=1&&o>=0;a--,o--)if(t[a]!==n[o]){if(a!==1||o!==1)do if(a--,o--,o<0||t[a]!==n[o]){let n=`\n${t[a].replace(` at new `,` at `)}`,[r]=
|
|
17
|
+
`),a=0,o=0;for(;a<t.length&&!t[a].includes(`DetermineComponentFrameRoot`);)a++;for(;o<n.length&&!n[o].includes(`DetermineComponentFrameRoot`);)o++;if(a===t.length||o===n.length)for(a=t.length-1,o=n.length-1;a>=1&&o>=0&&t[a]!==n[o];)o--;for(;a>=1&&o>=0;a--,o--)if(t[a]!==n[o]){if(a!==1||o!==1)do if(a--,o--,o<0||t[a]!==n[o]){let n=`\n${t[a].replace(` at new `,` at `)}`,[r]=_(n);if(!r?.fileName)break;let i=u(e);return i&&n.includes(`<anonymous>`)&&(n=n.replace(`<anonymous>`,i)),P.set(e,n),n}while(a>=1&&o>=0);break}}}finally{N=!1,g(r),vt(i),console.error=a,console.warn=o}let s=u(e),c=s?M(s):``;return P.set(e,c),c},bt=(e,t)=>{let n=``,r=a(e);switch(e.tag){case r.ActivityComponent:n=M(`Activity`);break;case r.ClassComponent:n=F(e.type,!0);break;case r.ForwardRef:n=F(l(e.type)??e.type,!1);break;case r.FunctionComponent:case r.SimpleMemoComponent:n=F(l(e.type)??e.type,!1);break;case r.HostComponent:case r.HostHoistable:case r.HostSingleton:typeof e.type==`string`&&(n=M(e.type));break;case r.LazyComponent:n=M(`Lazy`);break;case r.SuspenseComponent:n=e.child!==t&&t!==null?M(`Suspense Fallback`):M(`Suspense`);break;case r.SuspenseListComponent:n=M(`SuspenseList`);break;case r.ViewTransitionComponent:n=M(`ViewTransition`);break;default:return``}return n},xt=e=>{try{let t=``,n=e,r=null;do{t+=bt(n,r);let e=n._debugInfo;if(e&&Array.isArray(e))for(let n=e.length-1;n>=0;n--){let r=e[n];typeof r.name==`string`&&(t+=yt(r.name,r.env,r.debugLocation))}r=n,n=n.return}while(n);return t}catch(e){return e instanceof Error?`\nBippy couldn’t generate the stack: ${e.message}\n${e.stack}`:``}},St=e=>{let t=e;if(!t)return``;t.startsWith(`Error: react-stack-top-frame
|
|
18
18
|
`)&&(t=t.slice(29));let n=t.indexOf(`
|
|
19
|
-
`);n!==-1&&(t=t.slice(n+1));let r=Math.max(...
|
|
20
|
-
`,r)),r!==-1)t=t.slice(0,r);else return``;return t},
|
|
21
|
-
`),r=t-1;if(r<0||r>=n.length)return null;for(let e=0;e<=5;e++){let t=e===0?[r]:[r-e,r+e];for(let e of t){if(e<0||e>=n.length)continue;let t=Bt(n[e]);if(t)return t}}return null},Ht=async(e,t=!0,n)=>{let r=j(e)??Ot(e).find(e=>e.fileName);if(!r?.fileName)return s(e.type);let i=await O(r.fileName,t,n);if(!i)return s(e.type);let a=null;if(typeof r.lineNumber==`number`&&typeof r.columnNumber==`number`&&(a=S(i,r.lineNumber,r.columnNumber)),!a?.fileName||!a.lineNumber)return s(e.type);let o=C(i,a.fileName);return(o?Vt(o,a.lineNumber):null)||(a.functionName??s(e.type))},Ut=Symbol.for(`react.context`),Wt=Symbol.for(`react.memo_cache_sentinel`),Gt=Symbol.for(`react.recoverable`);let R=[],z=null,B=null,V=null,H=null,U=0,W=null;const G=Error("Suspense interrupted this render. This error is an internal implementation detail of `use`."),K=e=>g(e.stack||``,{includeInElement:!1}),q=()=>{let e=V;return e!==null&&(V=e.next),e},J=e=>typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`,Kt=e=>typeof e==`object`&&!!e&&`current`in e,Y=e=>typeof e==`object`&&!!e&&`_currentValue`in e,qt=e=>typeof e==`object`&&!!e&&`context`in e&&`next`in e,Jt=e=>typeof e==`object`&&!!e&&`render`in e&&typeof e.render==`function`,X=e=>{if(B===null)return e._currentValue;if(H===null)throw new n(`Context reads don’t match context dependencies.`);if(Object.hasOwn(H,`memoizedValue`)){let e=H.memoizedValue;return H=H.next,e}return e._currentValue},Z=(e,t,n,r=null,i=null)=>{R.push({displayName:r,primitive:e,stackError:Error(),value:t,debugInfo:i,dispatcherHookName:n})},Yt=e=>{if(typeof e==`object`&&e){if(J(e)){let t=W!==null&&U<W.length?W[U++]:e,n=J(t)?t:e;switch(n.status){case`fulfilled`:return Z(`Promise`,n.value,`Use`,null,n._debugInfo??null),n.value;case`rejected`:throw n.reason}throw Z(`Unresolved`,n,`Use`,null,n._debugInfo??null),G}if(`$$typeof`in e&&e.$$typeof===Gt){Z(`Recoverable`,void 0,`Use`);return}if(`$$typeof`in e&&e.$$typeof===Ut&&Y(e)){let t={_currentValue:e._currentValue,displayName:typeof e.displayName==`string`?e.displayName:void 0},n=X(t);return Z(`Context (use)`,n,`Use`,t.displayName||`Context`),n}}throw new n(`use() received an unsupported value: `+String(e))},Xt=e=>{let t=X(e);return Z(`Context`,t,`Context`,e.displayName||null),t},Zt=e=>{let t=q(),n=t===null?typeof e==`function`?e():e:t.memoizedState;return Z(`State`,n,`State`),[n,()=>{}]},Qt=(e,t,n)=>{let r=q(),i=r===null?n===void 0?t:n(t):r.memoizedState;return Z(`Reducer`,i,`Reducer`),[i,()=>{}]},$t=e=>{let t=q(),n=Kt(t?.memoizedState)?t.memoizedState:{current:e};return Z(`Ref`,n.current,`Ref`),n},en=()=>{let e=q();return Z(`CacheRefresh`,e===null?()=>{}:e.memoizedState,`CacheRefresh`),()=>{}},tn=e=>{q(),Z(`LayoutEffect`,e,`LayoutEffect`)},nn=e=>{q(),Z(`InsertionEffect`,e,`InsertionEffect`)},rn=e=>{q(),Z(`Effect`,e,`Effect`)},an=e=>{q();let t=Kt(e)?e.current:void 0;Z(`ImperativeHandle`,t,`ImperativeHandle`)},on=(e,t)=>{Z(`DebugValue`,typeof t==`function`?t(e):e,`DebugValue`)},sn=e=>{let t=q();return Z(`Callback`,Array.isArray(t?.memoizedState)?t.memoizedState[0]:e,`Callback`),e},cn=e=>{let t=q(),n=Array.isArray(t?.memoizedState)?t.memoizedState[0]:e();return Z(`Memo`,n,`Memo`),n},ln=(e,t)=>{let n=q();q();let r=n===null?t():n.memoizedState;return Z(`SyncExternalStore`,r,`SyncExternalStore`),r},un=()=>{let e=q();q();let t=e?.memoizedState===!0;return Z(`Transition`,t,`Transition`),[t,()=>{}]},dn=e=>{let t=q(),n=t===null?e:t.memoizedState;return Z(`DeferredValue`,n,`DeferredValue`),n},fn=()=>{let e=q(),t=typeof e?.memoizedState==`string`?e.memoizedState:``;return Z(`Id`,t,`Id`),t},pn=e=>{let t=B;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},()=>Wt)),n.index++,r},mn=e=>{let t=q(),n=t===null?e:t.memoizedState;return Z(`Optimistic`,n,`Optimistic`),[n,()=>{}]},hn=(e,t)=>{let n,r=null,i=null;if(e!==null){let t=e.memoizedState;if(J(t))switch(t.status){case`fulfilled`:n=t.value,r=t._debugInfo??null;break;case`rejected`:i=t.reason;break;default:i=G,n=t,r=t._debugInfo??null}else n=t}else n=t;return{value:n,debugInfo:r,error:i}},gn=e=>(t,n)=>{let r=q();q(),q();let{value:i,debugInfo:a,error:o}=hn(r,n);if(Z(e,i,e,null,a),o!==null)throw o;return[i,()=>{},!1]},_n=gn(`ActionState`),Q={readContext:X,use:Yt,useCallback:sn,useContext:Xt,useEffect:rn,useImperativeHandle:an,useLayoutEffect:tn,useInsertionEffect:nn,useMemo:cn,useReducer:Qt,useRef:$t,useState:Zt,useDebugValue:on,useDeferredValue:dn,useTransition:un,useSyncExternalStore:ln,useId:fn,useHostTransitionStatus:()=>{let e=X({_currentValue:null});return Z(`HostTransitionStatus`,e,`HostTransitionStatus`),e},useFormState:gn(`FormState`),useActionState:_n,useOptimistic:mn,useMemoCache:pn,useCacheRefresh:en,useEffectEvent:e=>(q(),Z(`EffectEvent`,e,`EffectEvent`),e)},vn=new Proxy(Q,{get(e,t){if(Object.hasOwn(e,t))return Reflect.get(e,t);throw new r(`The React dispatcher is missing method `+t)}}),yn=()=>{if(z!==null)return z;let e=new Map,t;try{Q.useContext({_currentValue:null}),Q.useState(null),Q.useReducer(e=>e,null),Q.useRef(null),Q.useCacheRefresh(),Q.useLayoutEffect(()=>{}),Q.useInsertionEffect(()=>{}),Q.useEffect(()=>{}),Q.useImperativeHandle(void 0),Q.useDebugValue(null),Q.useCallback(()=>{}),Q.useTransition(),Q.useSyncExternalStore(()=>()=>{},()=>null),Q.useDeferredValue(null),Q.useMemo(()=>null),Q.useOptimistic(null),Q.useFormState(e=>e,null),Q.useActionState(e=>e,null),Q.useHostTransitionStatus(),Q.use({$$typeof:Ut,_currentValue:null}),Q.use({$$typeof:Gt});let e=Promise.resolve(null);Reflect.set(e,`status`,`fulfilled`),Reflect.set(e,`value`,null),Q.use(e);try{Q.use(new Promise(()=>{}))}catch{}Q.useId(),Q.useEffectEvent(()=>{})}finally{t=R,R=[]}for(let n of t)e.set(n.primitive,K(n.stackError));return z=e,z};let bn=0;const xn=(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},Sn=(e,t)=>{let n=xn(t,e,bn);if(n!==-1)return n;for(let r=0;r<e.length&&r<5;r++)if(n=xn(t,e,r),n!==-1)return bn=r,n;return-1},$=e=>{if(!e)return``;let t=e.lastIndexOf(`[as `);if(t!==-1)return $(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)},Cn=(e,t)=>{let n=$(e);return t===`HostTransitionStatus`?n===t||n===`FormStatus`:n===t},wn=(e,t)=>{let n=yn().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&&Cn(e[r].functionName,t.dispatcherHookName)&&r++,r<e.length-1&&Cn(e[r].functionName,t.dispatcherHookName)&&r++,r;return-1},Tn=(e,t)=>{let n=K(t.stackError),r=Sn(e,n),i=wn(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)]},En=new Set([`Context`,`Context (use)`,`DebugValue`,`Promise`,`Unresolved`,`HostTransitionStatus`]),Dn=(e,t)=>{let n=[],r=null,i=n,a=0,o=[];for(let s of t){let[t,c]=Tn(e,s),l=s.displayName;if(l===null&&t!==null&&(l=$(t.functionName)||$(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:$(c[t-1].functionName),value:void 0,subHooks:e,debugInfo:null,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=En.has(u)?null:a++,ee=u===`Reducer`||u===`State`,te=l||u,f=c?.[0],p={lineNumber:f?.lineNumber??null,columnNumber:f?.columnNumber??null,functionName:f?.functionName??null,fileName:f?.fileName??null};i.push({id:d,isStateEditable:ee,name:te,value:s.value,subHooks:[],debugInfo:s.debugInfo,hookSource:p})}return On(n,null),n},On=(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)):On(r.subHooks,r)}t!==null&&(n.length===1?t.value=n[0].value:n.length>1&&(t.value=n.map(({value:e})=>e)))},kn=(e,t)=>{let n=t;for(;n;){if(n.tag===i(n).ContextProvider){let t=n.type,r=typeof t==`object`&&t&&`_context`in t?t._context:void 0,i=Y(r)?r:Y(t)?t:null;i&&!e.has(i)&&(e.set(i,i._currentValue),i._currentValue=n.memoizedProps.value)}n=n.return}},An=e=>{e.forEach((e,t)=>{t._currentValue=e})},jn=e=>{if(e!==G)throw e instanceof r?e:new u(`Bippy couldn’t render the inspected component`,e)},Mn=(e,t)=>{if(e!==null&&(typeof e==`object`||typeof e==`function`)&&`defaultProps`in e&&typeof e.defaultProps==`object`&&e.defaultProps!==null){let n={...t},r=e.defaultProps;for(let[e,t]of Object.entries(r))n[e]===void 0&&(n[e]=t);return n}return t},Nn=()=>{let e={};for(let t in console)try{e[t]=Reflect.get(console,t),Reflect.set(console,t,()=>{})}catch{}return e},Pn=e=>{for(let t in e)try{Reflect.set(console,t,e[t])}catch{}},Fn=(e,t)=>{let n=ye(e);v(e,vn);let r=[],i;try{i=Error(),t()}catch(e){jn(e)}finally{r=R,R=[],v(e,n)}let a=i===void 0?[]:K(i);return Dn(a,r)},In=()=>{let e=ve()[0];if(!e)throw new n(`Bippy couldn’t find a React renderer. Load React and install Bippy’s hook.`);return e},Ln=e=>{let t=[`dependencies_old`,`dependencies_new`].find(t=>Object.hasOwn(e,t));if(Object.hasOwn(e,`dependencies`)){let t=e.dependencies;H=t===null?null:t.firstContext}else if(t){let n=Reflect.get(e,t),r=typeof n==`object`&&n&&`firstContext`in n?n.firstContext:null;H=qt(r)?r:null}else if(Object.hasOwn(e,`contextDependencies`)){let t=Reflect.get(e,`contextDependencies`),n=typeof t==`object`&&t&&`first`in t?t.first:null;H=qt(n)?n:null}else throw new n(`Bippy doesn’t support this React version.`)},Rn=e=>{let t=In(),r=i(e);if(e.tag!==r.FunctionComponent&&e.tag!==r.SimpleMemoComponent&&e.tag!==r.ForwardRef)throw new n(`Hook inspection requires a function component Fiber.`);yn(),V=e.memoizedState,B=e;let a=e.dependencies?._debugThenableState,o=Array.isArray(a)?a:a?.thenables;W=Array.isArray(o)?o:null,U=0,Ln(e);let s=e.type,c=e.memoizedProps;s!==e.elementType&&(c=Mn(s,c));let l=Nn(),u=new Map;try{if(H!==null&&!Object.hasOwn(H,`memoizedValue`)&&kn(u,e),e.tag===r.ForwardRef){if(!Jt(s))throw new n(`ForwardRef fiber is missing its render function.`);return Fn(t,()=>{s.render(c,e.ref)})}if(typeof s!=`function`)throw new n(`Function component fiber is missing its component function.`);return Fn(t,()=>{s(c)})}finally{B=null,V=null,H=null,W=null,U=0,An(u),Pn(l)}},zn=new Set([`Effect`,`LayoutEffect`,`InsertionEffect`,`ImperativeHandle`,`DebugValue`]),Bn=/(?:const|let|var)\s+((?:\[[\s\S]*?\]|\w+))\s*=\s*(?:[\w$.]+\.)*use[A-Z]\w*\s*(?:<[\s\S]*?>)?\s*\(/g,Vn=e=>`${e.fileName??``}:${e.lineNumber??0}:${e.columnNumber??0}`,Hn=e=>{let t=[],n=e=>{for(let r of e)zn.has(r.name)||(t.push(r),r.subHooks.length>0&&n(r.subHooks))};return n(e),t},Un=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},Wn=(e,t,n)=>{let r=e.split(`
|
|
19
|
+
`);n!==-1&&(t=t.slice(n+1));let r=Math.max(...h.map(e=>t.indexOf(e)));if(r!==-1&&(r=t.lastIndexOf(`
|
|
20
|
+
`,r)),r!==-1)t=t.slice(0,r);else return``;return t},Ct=e=>!!(e.functionName&&e.fileName&&Dt(e.fileName)),wt=(e,t)=>e.fileName===t.fileName&&e.lineNumber===t.lineNumber&&e.columnNumber===t.columnNumber,Tt=e=>{let t=new Map;for(let n of e){if(!Ct(n))continue;let e=n.functionName,r=t.get(e)??[];r.some(e=>wt(e,n))||(r.push(n),t.set(e,r))}return t},Et=(e,t,n)=>{if(!e.functionName)return{...e,isServer:!0};let r=t.get(e.functionName);if(!r||r.length===0)return{...e,isServer:!0};let i=n.get(e.functionName)??0,a=r[i%r.length];return n.set(e.functionName,i+1),{...e,isServer:!0,fileName:a.fileName,lineNumber:a.lineNumber,columnNumber:a.columnNumber,source:e.source?.replace(ae,`(${a.fileName}:${a.lineNumber}:${a.columnNumber})`)}},Dt=e=>ee.some(t=>e.startsWith(t)),Ot=e=>!e.isServer&&e.fileName&&Dt(e.fileName)?{...e,isServer:!0}:e,kt=e=>{let t=[],n=e;for(;n;)if(gt(n)){let e=n;if(n=e._debugOwner,n&&A(e)){let{frames:n,isTrusted:r}=v(e._debugStack);if(r)for(let e of n)t.push(Ot(e))}}else{let e=n;if(n=e.owner,n&&e.debugStack instanceof Error)for(let n of v(e.debugStack).frames)t.push({...n,isServer:!0})}return t},At=e=>{let t=[];return c(e,e=>{if(!A(e))return;let{frames:n,isTrusted:r}=v(e._debugStack);r&&t.push(...n)},!0),t},jt=e=>{let t=At(e),n=_(xt(e)),r=Tt(t),i=new Map;return n.map(e=>e.source!==void 0&&ae.test(e.source)?Et(e,r,i):e).filter((e,t,n)=>{if(t===0)return!0;let r=n[t-1];return e.functionName!==r.functionName})},I=async(e,t=!0,n,r={})=>k(jt(e),t,n,r),Mt=e=>!!e.fileName&&!e.isIgnoreListed,Nt=async(e,t=!0,n,r={})=>{let i=kt(e);if(i.length>0){let a=j(e)??{};a.functionName=u(e.type)??a.functionName;let o=await k([a,...i],t,n,r);if(o.some((e,t)=>t>0&&Mt(e)))return o}return I(e,t,n,r)},Pt=e=>{let t=e._debugSource;return t?typeof t==`object`&&typeof t.fileName==`string`&&t.fileName!==`(native)`&&typeof t.lineNumber==`number`:!1},L=e=>e.fileName?{fileName:e.fileName,lineNumber:e.lineNumber,columnNumber:e.columnNumber,functionName:e.functionName}:null,Ft=e=>{if(!A(e))return null;let{frames:t,isTrusted:n}=v(e._debugStack);if(!n)return null;for(let e of t)if(e.fileName)return e;return null},It=e=>{if(Pt(e))return e._debugSource;let t=Ft(e)??j(e);return t?L(t):null},Lt=async(e,t,n,r)=>{let i=u(e.type);if(!i)return null;let a=_(Error().stack??``),o=new Set;for(let e of a){let a=e.fileName;if(!a||o.has(a))continue;o.add(a);let s=await O(a,t,n,r);if(!s)continue;let c=Ve(s,i);if(c&&!c.isIgnoreListed)return L(c)}return null},Rt=async(e,t=!0,n,r={})=>{if(Pt(e))return e._debugSource;let i=It(e);if(i){let[e]=await k([{columnNumber:i.columnNumber,fileName:i.fileName,functionName:i.functionName,lineNumber:i.lineNumber}],t,n,r),a=L(e);if(a)return a}let a=await I(e,t,n,r);for(let e of a)if(e.fileName)return L(e);return Lt(e,t,n,r)},zt=e=>e.split(`/`).filter(Boolean).length,Bt=e=>{let t=e.indexOf(`/`,1);if(t===-1)return e;let n=e.slice(0,t);if(zt(n)!==1)return e;let r=e.slice(t);if(!ne.test(r))return e;let i=r.split(`/`).filter(Boolean);if(i.length<2)return e;let a=i[0];return a.startsWith(`@`)||a.length>4?e:r},Vt=e=>{if(!e||te.some(t=>t===e))return``;let t=e,n=/^[a-zA-Z]:[\\/]/.test(t);if(t.startsWith(`http://`)||t.startsWith(`https://`)){try{t=new URL(t).pathname}catch{}t=Bt(t)}if(t.startsWith(`about://React/`)){let e=t.slice(14),n=e.indexOf(`/`),r=e.indexOf(`:`);t=n!==-1&&(r===-1||n<r)?e.slice(n+1):e}let r=!0;for(;r;){r=!1;for(let e of m)if(t.startsWith(e)){t=t.slice(e.length),e===`file:///`&&(t=`/${t.replace(/^\/+/,``)}`),r=!0;break}}if(!n){let e=t.match(p);e&&(t=t.slice(e[0].length))}if(t.startsWith(`//`)){let e=t.indexOf(`/`,2);t=e===-1?``:t.slice(e)}let i=t.indexOf(`?`);if(i!==-1){let e=t.slice(i);ie.test(e)&&(t=t.slice(0,i))}return t},Ht=e=>{let t=Vt(e);return!(!t||!ne.test(t)||re.test(t))},Ut=[/(?:^|export\s+)(?:const|let|var)\s+(\w+)\s*=/,/(?:^|export\s+)function\s+(\w+)/,/(?:^|export\s+)class\s+(\w+)/],Wt=e=>{for(let t of Ut){let n=e.match(t);if(n?.[1])return n[1]}return null},Gt=(e,t)=>{let n=e.split(`
|
|
21
|
+
`),r=t-1;if(r<0||r>=n.length)return null;for(let e=0;e<=5;e++){let t=e===0?[r]:[r-e,r+e];for(let e of t){if(e<0||e>=n.length)continue;let t=Wt(n[e]);if(t)return t}}return null},Kt=async(e,t=!0,n,r={})=>{let i=j(e)??jt(e).find(e=>e.fileName);if(!i?.fileName)return u(e.type);let a=await O(i.fileName,t,n,r);if(!a)return u(e.type);let o=null;if(typeof i.lineNumber==`number`&&typeof i.columnNumber==`number`&&(o=S(a,i.lineNumber,i.columnNumber)),!o?.fileName||!o.lineNumber)return u(e.type);let s=C(a,o.fileName);return(s?Gt(s,o.lineNumber):null)||(o.functionName??u(e.type))},qt=Symbol.for(`react.context`),Jt=Symbol.for(`react.memo_cache_sentinel`),Yt=Symbol.for(`react.recoverable`);let R=[],z=null,B=null,V=null,H=null,U=0,W=null;const G=Error("Suspense interrupted this render. This error is an internal implementation detail of `use`."),K=e=>_(e.stack||``,{includeInElement:!1}),q=()=>{let e=V;return e!==null&&(V=e.next),e},J=e=>typeof e==`object`&&!!e&&`then`in e&&typeof e.then==`function`,Xt=e=>typeof e==`object`&&!!e&&`current`in e,Y=e=>typeof e==`object`&&!!e&&`_currentValue`in e,Zt=e=>typeof e==`object`&&!!e&&`context`in e&&`next`in e,Qt=e=>typeof e==`object`&&!!e&&`render`in e&&typeof e.render==`function`,X=e=>{if(B===null)return e._currentValue;if(H===null)throw new r(`Context reads don’t match context dependencies.`);if(Object.hasOwn(H,`memoizedValue`)){let e=H.memoizedValue;return H=H.next,e}return e._currentValue},Z=(e,t,n,r=null,i=null)=>{R.push({displayName:r,primitive:e,stackError:Error(),value:t,debugInfo:i,dispatcherHookName:n})},$t=e=>{if(typeof e==`object`&&e){if(J(e)){let t=W!==null&&U<W.length?W[U++]:e,n=J(t)?t:e;switch(n.status){case`fulfilled`:return Z(`Promise`,n.value,`Use`,null,n._debugInfo??null),n.value;case`rejected`:throw n.reason}throw Z(`Unresolved`,n,`Use`,null,n._debugInfo??null),G}if(`$$typeof`in e&&e.$$typeof===Yt){Z(`Recoverable`,void 0,`Use`);return}if(`$$typeof`in e&&e.$$typeof===qt&&Y(e)){let t={_currentValue:e._currentValue,displayName:typeof e.displayName==`string`?e.displayName:void 0},n=X(t);return Z(`Context (use)`,n,`Use`,t.displayName||`Context`),n}}throw new r(`use() received an unsupported value: `+String(e))},en=e=>{let t=X(e);return Z(`Context`,t,`Context`,e.displayName||null),t},tn=e=>{let t=q(),n=t===null?typeof e==`function`?e():e:t.memoizedState;return Z(`State`,n,`State`),[n,()=>{}]},nn=(e,t,n)=>{let r=q(),i=r===null?n===void 0?t:n(t):r.memoizedState;return Z(`Reducer`,i,`Reducer`),[i,()=>{}]},rn=e=>{let t=q(),n=Xt(t?.memoizedState)?t.memoizedState:{current:e};return Z(`Ref`,n.current,`Ref`),n},an=()=>{let e=q();return Z(`CacheRefresh`,e===null?()=>{}:e.memoizedState,`CacheRefresh`),()=>{}},on=e=>{q(),Z(`LayoutEffect`,e,`LayoutEffect`)},sn=e=>{q(),Z(`InsertionEffect`,e,`InsertionEffect`)},cn=e=>{q(),Z(`Effect`,e,`Effect`)},ln=e=>{q();let t=Xt(e)?e.current:void 0;Z(`ImperativeHandle`,t,`ImperativeHandle`)},un=(e,t)=>{Z(`DebugValue`,typeof t==`function`?t(e):e,`DebugValue`)},dn=e=>{let t=q();return Z(`Callback`,Array.isArray(t?.memoizedState)?t.memoizedState[0]:e,`Callback`),e},fn=e=>{let t=q(),n=Array.isArray(t?.memoizedState)?t.memoizedState[0]:e();return Z(`Memo`,n,`Memo`),n},pn=(e,t)=>{let n=q();q();let r=n===null?t():n.memoizedState;return Z(`SyncExternalStore`,r,`SyncExternalStore`),r},mn=()=>{let e=q();q();let t=e?.memoizedState===!0;return Z(`Transition`,t,`Transition`),[t,()=>{}]},hn=e=>{let t=q(),n=t===null?e:t.memoizedState;return Z(`DeferredValue`,n,`DeferredValue`),n},gn=()=>{let e=q(),t=typeof e?.memoizedState==`string`?e.memoizedState:``;return Z(`Id`,t,`Id`),t},_n=e=>{let t=B;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},()=>Jt)),n.index++,r},vn=e=>{let t=q(),n=t===null?e:t.memoizedState;return Z(`Optimistic`,n,`Optimistic`),[n,()=>{}]},yn=(e,t)=>{let n,r=null,i=null;if(e!==null){let t=e.memoizedState;if(J(t))switch(t.status){case`fulfilled`:n=t.value,r=t._debugInfo??null;break;case`rejected`:i=t.reason;break;default:i=G,n=t,r=t._debugInfo??null}else n=t}else n=t;return{value:n,debugInfo:r,error:i}},bn=e=>(t,n)=>{let r=q();q(),q();let{value:i,debugInfo:a,error:o}=yn(r,n);if(Z(e,i,e,null,a),o!==null)throw o;return[i,()=>{},!1]},xn=bn(`ActionState`),Q={readContext:X,use:$t,useCallback:dn,useContext:en,useEffect:cn,useImperativeHandle:ln,useLayoutEffect:on,useInsertionEffect:sn,useMemo:fn,useReducer:nn,useRef:rn,useState:tn,useDebugValue:un,useDeferredValue:hn,useTransition:mn,useSyncExternalStore:pn,useId:gn,useHostTransitionStatus:()=>{let e=X({_currentValue:null});return Z(`HostTransitionStatus`,e,`HostTransitionStatus`),e},useFormState:bn(`FormState`),useActionState:xn,useOptimistic:vn,useMemoCache:_n,useCacheRefresh:an,useEffectEvent:e=>(q(),Z(`EffectEvent`,e,`EffectEvent`),e)},Sn=new Proxy(Q,{get(e,t){if(Object.hasOwn(e,t))return Reflect.get(e,t);throw new i(`The React dispatcher is missing method `+t)}}),Cn=()=>{if(z!==null)return z;let e=new Map,t;try{Q.useContext({_currentValue:null}),Q.useState(null),Q.useReducer(e=>e,null),Q.useRef(null),Q.useCacheRefresh(),Q.useLayoutEffect(()=>{}),Q.useInsertionEffect(()=>{}),Q.useEffect(()=>{}),Q.useImperativeHandle(void 0),Q.useDebugValue(null),Q.useCallback(()=>{}),Q.useTransition(),Q.useSyncExternalStore(()=>()=>{},()=>null),Q.useDeferredValue(null),Q.useMemo(()=>null),Q.useOptimistic(null),Q.useFormState(e=>e,null),Q.useActionState(e=>e,null),Q.useHostTransitionStatus(),Q.use({$$typeof:qt,_currentValue:null}),Q.use({$$typeof:Yt});let e=Promise.resolve(null);Reflect.set(e,`status`,`fulfilled`),Reflect.set(e,`value`,null),Q.use(e);try{Q.use(new Promise(()=>{}))}catch{}Q.useId(),Q.useEffectEvent(()=>{})}finally{t=R,R=[]}for(let n of t)e.set(n.primitive,K(n.stackError));return z=e,z};let wn=0;const Tn=(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},En=(e,t)=>{let n=Tn(t,e,wn);if(n!==-1)return n;for(let r=0;r<e.length&&r<5;r++)if(n=Tn(t,e,r),n!==-1)return wn=r,n;return-1},$=e=>{if(!e)return``;let t=e.lastIndexOf(`[as `);if(t!==-1)return $(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)},Dn=new Set([Z,...Object.values(Q)].map(e=>$(e.name))),On=e=>e!==``&&Dn.has(e),kn=(e,t)=>{let n=$(e);return t===`HostTransitionStatus`?n===t||n===`FormStatus`:n===t},An=(e,t)=>{let n=Cn().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&&kn(e[r].functionName,t.dispatcherHookName)&&r++,r<e.length-1&&kn(e[r].functionName,t.dispatcherHookName)&&r++,r;return-1},jn=(e,t)=>{let n=K(t.stackError),r=En(e,n),i=An(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)]},Mn=new Set([`Context`,`Context (use)`,`DebugValue`,`Promise`,`Unresolved`,`HostTransitionStatus`]),Nn=(e,t)=>{let n=[],r=null,i=n,a=0,o=[];for(let s of t){let[t,c]=jn(e,s),l=s.displayName;if(l===null&&t!==null){let e=$(t.functionName);l=On(e)?null:e||$(s.dispatcherHookName)}if(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:$(c[t-1].functionName),value:void 0,subHooks:e,debugInfo:null,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=Mn.has(u)?null:a++,f=u===`Reducer`||u===`State`,p=l||u,m=c?.[0],ee={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:[],debugInfo:s.debugInfo,hookSource:ee})}return Fn(n,null),Pn(n,null),n},Pn=(e,t)=>{for(let n=0;n<e.length;n++){let r=e[n];On(r.name)?(t!==null&&r.value!==void 0&&(t.value=t.value===void 0?r.value:Array.isArray(t.value)?[...t.value,r.value]:[t.value,r.value]),e.splice(n,1,...r.subHooks),n--):Pn(r.subHooks,r)}},Fn=(e,t)=>{let n=[];for(let t=0;t<e.length;t++){let r=e[t];r.name===`DebugValue`?(e.splice(t,1,...r.subHooks),t--,r.value!==void 0&&n.push(r)):Fn(r.subHooks,r)}t!==null&&(n.length===1?t.value=n[0].value:n.length>1&&(t.value=n.map(({value:e})=>e)))},In=(e,t)=>{let n=t;for(;n;){if(n.tag===a(n).ContextProvider){let t=n.type,r=typeof t==`object`&&t&&`_context`in t?t._context:void 0,i=Y(r)?r:Y(t)?t:null;i&&!e.has(i)&&(e.set(i,i._currentValue),i._currentValue=n.memoizedProps.value)}n=n.return}},Ln=e=>{e.forEach((e,t)=>{t._currentValue=e})},Rn=e=>{if(e!==G)throw e instanceof i?e:new f(`Bippy couldn’t render the inspected component`,e)},zn=(e,t)=>{if(e!==null&&(typeof e==`object`||typeof e==`function`)&&`defaultProps`in e&&typeof e.defaultProps==`object`&&e.defaultProps!==null){let n={...t},r=e.defaultProps;for(let[e,t]of Object.entries(r))n[e]===void 0&&(n[e]=t);return n}return t},Bn=()=>{let e={};for(let t in console)try{e[t]=Reflect.get(console,t),Reflect.set(console,t,()=>{})}catch{}return e},Vn=e=>{for(let t in e)try{Reflect.set(console,t,e[t])}catch{}},Hn=(e,t,...n)=>{let r=be(e);y(e,Sn);let i=[],a;try{a=Error(),t(...n)}catch(e){Rn(e)}finally{i=R,R=[],y(e,r)}let o=a===void 0?[]:K(a);return Nn(o,i)},Un=(e,t=globalThis)=>{let n=(e?d(e,t)?.currentDispatcherRef:null)??ye(t)[0];if(!n)throw new r(`Bippy couldn’t find a React renderer. Load React and install Bippy’s hook.`);return n},Wn=e=>{let t=[`dependencies_old`,`dependencies_new`].find(t=>Object.hasOwn(e,t));if(Object.hasOwn(e,`dependencies`)){let t=e.dependencies;H=t===null?null:t.firstContext}else if(t){let n=Reflect.get(e,t),r=typeof n==`object`&&n&&`firstContext`in n?n.firstContext:null;H=Zt(r)?r:null}else if(Object.hasOwn(e,`contextDependencies`)){let t=Reflect.get(e,`contextDependencies`),n=typeof t==`object`&&t&&`first`in t?t.first:null;H=Zt(n)?n:null}else throw new r(`Bippy doesn’t support this React version.`)},Gn=e=>{let t=e=>{let n=e.subHooks.map(t);if(n.length===1){let t=n[0];if(e.name===`Context`&&t.id===null)return{...t,hookSource:e.hookSource};if(e.name===`FormStatus`&&t.name===`HostTransitionStatus`)return{...e,subHooks:[],value:t.value};if(e.name===`Use`){if(t.name===`Context`)return{...t,hookSource:e.hookSource};if(t.name===`Promise`||t.name===`Unresolved`)return{...e,debugInfo:t.debugInfo,subHooks:[],value:t.value}}if(e.id===null&&e.value===void 0&&(e.name===t.name||e.name===`<anonymous>`))return{...t,hookSource:e.hookSource}}return{...e,subHooks:n}};return e.map(t)},Kn=(e,t,n=globalThis)=>{let r=Un(void 0,n);Cn(),V=null,B=null,H=null,W=null,U=0;let i=Bn();try{return Gn(Hn(r,e,t))}finally{V=null,B=null,H=null,W=null,U=0,Vn(i)}},qn=e=>{let t=Un(e),n=a(e);if(e.tag!==n.FunctionComponent&&e.tag!==n.SimpleMemoComponent&&e.tag!==n.ForwardRef)throw new r(`Hook inspection requires a function component Fiber.`);Cn(),V=e.memoizedState,B=e;let i=e.dependencies?._debugThenableState,o=Array.isArray(i)?i:i?.thenables;W=Array.isArray(o)?o:null,U=0,Wn(e);let s=e.type,c=e.memoizedProps;s!==e.elementType&&(c=zn(s,c));let l=Bn(),u=new Map;try{if(H!==null&&!Object.hasOwn(H,`memoizedValue`)&&In(u,e),e.tag===n.ForwardRef){if(!Qt(s))throw new r(`ForwardRef fiber is missing its render function.`);let n=Gn(Hn(t,s.render,c,e.ref));for(let e of n)e.hookSource?.functionName===`Object.render`&&(e.hookSource.functionName=null);return n}if(typeof s!=`function`)throw new r(`Function component fiber is missing its component function.`);return Gn(Hn(t,s,c))}finally{B=null,V=null,H=null,W=null,U=0,Ln(u),Vn(l)}},Jn=new Set([`Effect`,`LayoutEffect`,`InsertionEffect`,`ImperativeHandle`,`DebugValue`]),Yn=/(?:const|let|var)\s+((?:\[[\s\S]*?\]|\w+))\s*=\s*(?:(?:[\w$]+|require\s*\([^)]*\))\.)*use[A-Z]\w*\s*(?:<[\s\S]*?>)?\s*\(/g,Xn=e=>`${e.fileName??``}:${e.lineNumber??0}:${e.columnNumber??0}`,Zn=e=>{let t=[],n=e=>{for(let r of e)Jn.has(r.name)||(t.push(r),r.subHooks.length>0&&n(r.subHooks))};return n(e),t},Qn=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},$n=(e,t,n)=>{let r=e.split(`
|
|
22
22
|
`),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(`
|
|
23
|
-
`),s=[...o.matchAll(
|
|
24
|
-
`)+1+n,
|
|
23
|
+
`),s=[...o.matchAll(Yn)],c=o.lastIndexOf(`
|
|
24
|
+
`)+1,l=c+n,u=s.filter(e=>e.index<=l).at(-1)??(n===0?s.find(e=>e.index>=c):void 0);return u?Qn(u[1]):null},er=async(e,t,n,r)=>{let{sourceContentCache:i,fetchFn:a,requestOptions:o}=r,s=await O(e,!0,a,o);if(s){let e=S(s,t,n);if(e?.fileName&&e.lineNumber!==void 0){let t=C(s,e.fileName);if(t)return{sourceCode:t,lineNumber:e.lineNumber,columnNumber:e.columnNumber??0}}}if(!i.has(e))try{let t=await(a??fetch)(e);i.set(e,t.ok?await t.text():null)}catch{i.set(e,null)}let c=i.get(e)??null;return c?{sourceCode:c,lineNumber:t,columnNumber:n}:null},tr=async(e,t,n)=>{let r=new Map,i=Zn(e);if(i.length===0)return r;let a={sourceContentCache:new Map,fetchFn:t,requestOptions:n};return await Promise.all(i.map(async e=>{let t=e.hookSource;if(!t||!t.fileName||t.lineNumber===null||t.columnNumber===null)return;let n=await er(t.fileName,t.lineNumber,t.columnNumber,a);if(!n)return;let i=$n(n.sourceCode,n.lineNumber,n.columnNumber);if(i){let e=Xn(t);r.set(e,i)}})),r};export{o as BippyError,r as BippyHookInspectionError,f as BippyHookRenderError,s as BippySourceMapError,i as BippyUnsupportedHookError,St as formatOwnerStack,j as getDefinitionFrameFromOwnedChild,Kt as getDisplayNameFromSource,xt as getFallbackParentStack,qn as getFiberHooks,Nt as getOwnerStack,I as getParentStack,kt as getRawOwnerStack,It as getRawSource,Rt as getSource,C as getSourceContentFromSourceMap,S as getSourceFromSourceMap,Ve as getSourceFromSourceMapByFunctionName,O as getSourceMap,A as hasDebugStack,Kn as inspectHooks,Ht as isSourceFile,Vt as normalizeFileName,tr as parseHookNames,_ as parseStack,k as symbolicateStack};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bippy",
|
|
3
|
-
"version": "0.7.2-dev.
|
|
3
|
+
"version": "0.7.2-dev.e113600",
|
|
4
4
|
"description": "hack into react internals",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bippy",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"zod": "^4.4.3"
|
|
119
119
|
},
|
|
120
120
|
"peerDependencies": {
|
|
121
|
-
"react": ">=
|
|
121
|
+
"react": ">=16.0.0"
|
|
122
122
|
},
|
|
123
123
|
"scripts": {
|
|
124
124
|
"build": "NODE_ENV=production vp pack && tsx scripts/check-react-entry.ts",
|
package/src/core.ts
CHANGED
|
@@ -10,19 +10,19 @@ import type {
|
|
|
10
10
|
} from "./react-internals/index.js";
|
|
11
11
|
|
|
12
12
|
import {
|
|
13
|
-
_onActiveListeners,
|
|
14
13
|
BIPPY_INSTRUMENTATION_STRING,
|
|
15
14
|
createUnsubscribe,
|
|
16
15
|
getRDTHook,
|
|
17
16
|
hasRDTHook,
|
|
17
|
+
isFiberRootUnmounted,
|
|
18
18
|
isReactRefresh,
|
|
19
19
|
isRealReactDevtools,
|
|
20
20
|
onRDTHookReplace,
|
|
21
|
+
removeActiveListener,
|
|
21
22
|
} from "./rdt-hook.js";
|
|
22
|
-
import type { Unsubscribe } from "./rdt-hook.js";
|
|
23
|
+
import type { ReactDevToolsTarget, Unsubscribe } from "./rdt-hook.js";
|
|
23
24
|
import {
|
|
24
25
|
getReactWorkTagsForFiber,
|
|
25
|
-
MutationMask,
|
|
26
26
|
ReactBuildType,
|
|
27
27
|
ReactFiberFlags,
|
|
28
28
|
ReactSymbols,
|
|
@@ -152,16 +152,6 @@ export const didFiberRender = (fiber: Fiber): boolean => {
|
|
|
152
152
|
}
|
|
153
153
|
};
|
|
154
154
|
|
|
155
|
-
/**
|
|
156
|
-
* Returns `true` if the {@link Fiber} has committed. Note that this does not mean the fiber has committed in the current commit, just that it has committed in the past.
|
|
157
|
-
*/
|
|
158
|
-
export const didFiberCommit = (fiber: Fiber): boolean => {
|
|
159
|
-
return Boolean(
|
|
160
|
-
(fiber.flags & (MutationMask | ReactFiberFlags.Cloned)) !== 0 ||
|
|
161
|
-
(fiber.subtreeFlags & (MutationMask | ReactFiberFlags.Cloned)) !== 0,
|
|
162
|
-
);
|
|
163
|
-
};
|
|
164
|
-
|
|
165
155
|
/**
|
|
166
156
|
* Returns `true` if the {@link Fiber} should be filtered out during reconciliation.
|
|
167
157
|
*/
|
|
@@ -322,8 +312,8 @@ export const detectReactBuildType = (renderer: ReactRenderer): "development" | "
|
|
|
322
312
|
/**
|
|
323
313
|
* Returns `true` if bippy's instrumentation is active.
|
|
324
314
|
*/
|
|
325
|
-
export const isInstrumentationActive = (): boolean => {
|
|
326
|
-
const rdtHook =
|
|
315
|
+
export const isInstrumentationActive = (target: ReactDevToolsTarget = globalThis): boolean => {
|
|
316
|
+
const rdtHook = target.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
327
317
|
return (
|
|
328
318
|
Boolean(rdtHook?._instrumentationIsActive) ||
|
|
329
319
|
isRealReactDevtools(rdtHook) ||
|
|
@@ -333,6 +323,7 @@ export const isInstrumentationActive = (): boolean => {
|
|
|
333
323
|
|
|
334
324
|
export const _fiberRoots = new Set<FiberRoot>();
|
|
335
325
|
const rootRendererIds = new WeakMap<FiberRoot, number>();
|
|
326
|
+
const rootHooks = new WeakMap<FiberRoot, ReactDevToolsGlobalHook>();
|
|
336
327
|
|
|
337
328
|
/**
|
|
338
329
|
* Returns the latest fiber (since it may be double-buffered).
|
|
@@ -367,29 +358,61 @@ export const getLatestFiber = (fiber: Fiber): Fiber => {
|
|
|
367
358
|
/**
|
|
368
359
|
* Returns the renderer that owns the {@link Fiber}.
|
|
369
360
|
*/
|
|
370
|
-
export const getRenderer = (
|
|
371
|
-
|
|
372
|
-
|
|
361
|
+
export const getRenderer = (
|
|
362
|
+
fiber: Fiber,
|
|
363
|
+
target: ReactDevToolsTarget = globalThis,
|
|
364
|
+
): ReactRenderer | null => {
|
|
373
365
|
let rootFiber = fiber;
|
|
374
|
-
while (rootFiber.return)
|
|
375
|
-
rootFiber = rootFiber.return;
|
|
376
|
-
}
|
|
377
|
-
|
|
366
|
+
while (rootFiber.return) rootFiber = rootFiber.return;
|
|
378
367
|
const fiberRoot = rootFiber.stateNode;
|
|
379
368
|
if (!isFiberRoot(fiberRoot)) return null;
|
|
380
369
|
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
370
|
+
const trackedRendererId = rootRendererIds.get(fiberRoot);
|
|
371
|
+
const trackedHook = rootHooks.get(fiberRoot);
|
|
372
|
+
if (trackedRendererId !== undefined && trackedHook) {
|
|
373
|
+
return trackedHook.renderers.get(trackedRendererId) ?? null;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const rdtHook = target.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
377
|
+
if (!rdtHook?.getFiberRoots) return null;
|
|
378
|
+
for (const [rendererId, renderer] of rdtHook.renderers) {
|
|
379
|
+
if (!rdtHook.getFiberRoots(rendererId).has(fiberRoot)) continue;
|
|
380
|
+
_fiberRoots.add(fiberRoot);
|
|
381
|
+
rootRendererIds.set(fiberRoot, rendererId);
|
|
382
|
+
rootHooks.set(fiberRoot, rdtHook);
|
|
383
|
+
setReactWorkTagsForFiber(fiberRoot.current, renderer);
|
|
384
|
+
return renderer;
|
|
385
|
+
}
|
|
386
|
+
return null;
|
|
384
387
|
};
|
|
385
388
|
|
|
386
389
|
export type RenderPhase = "mount" | "unmount" | "update";
|
|
387
390
|
|
|
391
|
+
interface FiberReference {
|
|
392
|
+
deref: () => Fiber | undefined;
|
|
393
|
+
}
|
|
394
|
+
|
|
388
395
|
let nextFiberId = 0;
|
|
389
396
|
const fiberIdMap = new WeakMap<Fiber, number>();
|
|
397
|
+
const fiberByIdMap = new Map<number, FiberReference>();
|
|
398
|
+
const fiberIdFinalizationRegistry =
|
|
399
|
+
typeof FinalizationRegistry === "function"
|
|
400
|
+
? new FinalizationRegistry<number>((fiberId) => {
|
|
401
|
+
if (!fiberByIdMap.get(fiberId)?.deref()) fiberByIdMap.delete(fiberId);
|
|
402
|
+
})
|
|
403
|
+
: null;
|
|
404
|
+
|
|
405
|
+
const createFiberReference = (fiber: Fiber): FiberReference =>
|
|
406
|
+
typeof WeakRef === "function" ? new WeakRef(fiber) : { deref: () => fiber };
|
|
390
407
|
|
|
391
408
|
export const setFiberId = (fiber: Fiber, fiberId: number = nextFiberId++): void => {
|
|
409
|
+
const previousFiberId = fiberIdMap.get(fiber);
|
|
410
|
+
if (previousFiberId !== undefined && previousFiberId !== fiberId) {
|
|
411
|
+
fiberByIdMap.delete(previousFiberId);
|
|
412
|
+
}
|
|
392
413
|
fiberIdMap.set(fiber, fiberId);
|
|
414
|
+
fiberByIdMap.set(fiberId, createFiberReference(fiber));
|
|
415
|
+
fiberIdFinalizationRegistry?.register(fiber, fiberId);
|
|
393
416
|
if (Number.isSafeInteger(fiberId) && fiberId >= nextFiberId) {
|
|
394
417
|
nextFiberId = fiberId + 1;
|
|
395
418
|
}
|
|
@@ -399,6 +422,7 @@ export const getFiberId = (fiber: Fiber): number => {
|
|
|
399
422
|
let currentFiberId = fiberIdMap.get(fiber);
|
|
400
423
|
if (currentFiberId === undefined && fiber.alternate) {
|
|
401
424
|
currentFiberId = fiberIdMap.get(fiber.alternate);
|
|
425
|
+
if (currentFiberId !== undefined) setFiberId(fiber, currentFiberId);
|
|
402
426
|
}
|
|
403
427
|
if (currentFiberId === undefined) {
|
|
404
428
|
currentFiberId = nextFiberId++;
|
|
@@ -407,6 +431,33 @@ export const getFiberId = (fiber: Fiber): number => {
|
|
|
407
431
|
return currentFiberId;
|
|
408
432
|
};
|
|
409
433
|
|
|
434
|
+
export const getFiberById = (fiberId: number): Fiber | null => {
|
|
435
|
+
const fiber = fiberByIdMap.get(fiberId)?.deref();
|
|
436
|
+
if (!fiber) {
|
|
437
|
+
fiberByIdMap.delete(fiberId);
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
return getLatestFiber(fiber);
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
const releaseFiberId = (fiber: Fiber): void => {
|
|
444
|
+
const relatedFibers = fiber.alternate ? [fiber, fiber.alternate] : [fiber];
|
|
445
|
+
const fiberIds = new Set<number>();
|
|
446
|
+
|
|
447
|
+
for (const relatedFiber of relatedFibers) {
|
|
448
|
+
const fiberId = fiberIdMap.get(relatedFiber);
|
|
449
|
+
if (fiberId !== undefined) fiberIds.add(fiberId);
|
|
450
|
+
fiberIdMap.delete(relatedFiber);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
for (const fiberId of fiberIds) {
|
|
454
|
+
const assignedFiber = fiberByIdMap.get(fiberId)?.deref();
|
|
455
|
+
if (!assignedFiber || relatedFibers.includes(assignedFiber)) {
|
|
456
|
+
fiberByIdMap.delete(fiberId);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
|
|
410
461
|
const mountFiberRecursively = (
|
|
411
462
|
onRender: RenderHandler,
|
|
412
463
|
firstChild: Fiber,
|
|
@@ -632,6 +683,7 @@ export const traverseRenderedFibers = (root: Fiber | FiberRoot, onRender: Render
|
|
|
632
683
|
|
|
633
684
|
export interface InstrumentationOptions {
|
|
634
685
|
name?: string;
|
|
686
|
+
target?: ReactDevToolsTarget;
|
|
635
687
|
onActive?: () => unknown;
|
|
636
688
|
onCommitFiberRoot?: (
|
|
637
689
|
rendererID: number,
|
|
@@ -646,6 +698,7 @@ export interface InstrumentationOptions {
|
|
|
646
698
|
|
|
647
699
|
interface InstrumentationSubscription {
|
|
648
700
|
options: InstrumentationOptions;
|
|
701
|
+
target: ReactDevToolsTarget;
|
|
649
702
|
}
|
|
650
703
|
|
|
651
704
|
const instrumentationSubscriptions = new Set<InstrumentationSubscription>();
|
|
@@ -658,6 +711,7 @@ interface HookDispatchers {
|
|
|
658
711
|
}
|
|
659
712
|
|
|
660
713
|
const hookDispatchers = new WeakMap<ReactDevToolsGlobalHook, Partial<HookDispatchers>>();
|
|
714
|
+
const hookTargets = new WeakMap<ReactDevToolsGlobalHook, ReactDevToolsTarget>();
|
|
661
715
|
let didSubscribeToHookReplacements = false;
|
|
662
716
|
|
|
663
717
|
// each hook event is dispatched from a single re-installable wrapper. If
|
|
@@ -687,20 +741,17 @@ const setHookEventDispatchers = (rdtHook: ReactDevToolsGlobalHook): void => {
|
|
|
687
741
|
setReactWorkTagsForFiber(root.current, rdtHook.renderers.get(rendererID));
|
|
688
742
|
// Custom renderers and test harnesses commit roots without a memoizedState;
|
|
689
743
|
// those must stay tracked, so only explicit unmount evidence removes a root.
|
|
690
|
-
|
|
691
|
-
const isUnmounting =
|
|
692
|
-
rootMemoizedState === null ||
|
|
693
|
-
(rootMemoizedState !== undefined &&
|
|
694
|
-
(rootMemoizedState.element === null || rootMemoizedState.element === undefined));
|
|
695
|
-
if (isUnmounting) {
|
|
744
|
+
if (isFiberRootUnmounted(root)) {
|
|
696
745
|
_fiberRoots.delete(root);
|
|
697
746
|
rootRendererIds.delete(root);
|
|
747
|
+
rootHooks.delete(root);
|
|
698
748
|
} else {
|
|
699
749
|
_fiberRoots.add(root);
|
|
700
750
|
rootRendererIds.set(root, rendererID);
|
|
751
|
+
rootHooks.set(root, rdtHook);
|
|
701
752
|
}
|
|
702
|
-
for (const { options } of instrumentationSubscriptions) {
|
|
703
|
-
if (options.onCommitFiberRoot) {
|
|
753
|
+
for (const { options, target } of instrumentationSubscriptions) {
|
|
754
|
+
if (target === hookTargets.get(rdtHook) && options.onCommitFiberRoot) {
|
|
704
755
|
options.onCommitFiberRoot(rendererID, root, priority, didError);
|
|
705
756
|
}
|
|
706
757
|
}
|
|
@@ -725,10 +776,14 @@ const setHookEventDispatchers = (rdtHook: ReactDevToolsGlobalHook): void => {
|
|
|
725
776
|
if (hookDispatchers.get(rdtHook)?.onCommitFiberUnmount !== dispatchCommitFiberUnmount) {
|
|
726
777
|
return;
|
|
727
778
|
}
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
options.onCommitFiberUnmount
|
|
779
|
+
try {
|
|
780
|
+
for (const { options, target } of instrumentationSubscriptions) {
|
|
781
|
+
if (target === hookTargets.get(rdtHook) && options.onCommitFiberUnmount) {
|
|
782
|
+
options.onCommitFiberUnmount(rendererID, fiber);
|
|
783
|
+
}
|
|
731
784
|
}
|
|
785
|
+
} finally {
|
|
786
|
+
releaseFiberId(fiber);
|
|
732
787
|
}
|
|
733
788
|
};
|
|
734
789
|
dispatchers.onCommitFiberUnmount = dispatchCommitFiberUnmount;
|
|
@@ -750,8 +805,8 @@ const setHookEventDispatchers = (rdtHook: ReactDevToolsGlobalHook): void => {
|
|
|
750
805
|
if (hookDispatchers.get(rdtHook)?.onPostCommitFiberRoot !== dispatchPostCommitFiberRoot) {
|
|
751
806
|
return;
|
|
752
807
|
}
|
|
753
|
-
for (const { options } of instrumentationSubscriptions) {
|
|
754
|
-
if (options.onPostCommitFiberRoot) {
|
|
808
|
+
for (const { options, target } of instrumentationSubscriptions) {
|
|
809
|
+
if (target === hookTargets.get(rdtHook) && options.onPostCommitFiberRoot) {
|
|
755
810
|
options.onPostCommitFiberRoot(rendererID, root);
|
|
756
811
|
}
|
|
757
812
|
}
|
|
@@ -774,8 +829,8 @@ const setHookEventDispatchers = (rdtHook: ReactDevToolsGlobalHook): void => {
|
|
|
774
829
|
prevOnScheduleFiberRoot.call(rdtHook, rendererID, root, children);
|
|
775
830
|
}
|
|
776
831
|
if (hookDispatchers.get(rdtHook)?.onScheduleFiberRoot !== dispatchScheduleFiberRoot) return;
|
|
777
|
-
for (const { options } of instrumentationSubscriptions) {
|
|
778
|
-
if (options.onScheduleFiberRoot) {
|
|
832
|
+
for (const { options, target } of instrumentationSubscriptions) {
|
|
833
|
+
if (target === hookTargets.get(rdtHook) && options.onScheduleFiberRoot) {
|
|
779
834
|
options.onScheduleFiberRoot(rendererID, root, children);
|
|
780
835
|
}
|
|
781
836
|
}
|
|
@@ -785,11 +840,23 @@ const setHookEventDispatchers = (rdtHook: ReactDevToolsGlobalHook): void => {
|
|
|
785
840
|
}
|
|
786
841
|
};
|
|
787
842
|
|
|
788
|
-
const
|
|
843
|
+
const handleHookReplacement = (
|
|
844
|
+
rdtHook: ReactDevToolsGlobalHook,
|
|
845
|
+
target: ReactDevToolsTarget,
|
|
846
|
+
): void => {
|
|
847
|
+
hookTargets.set(rdtHook, target);
|
|
848
|
+
setHookEventDispatchers(rdtHook);
|
|
849
|
+
};
|
|
850
|
+
|
|
851
|
+
const wireHookEventDispatchers = (
|
|
852
|
+
rdtHook: ReactDevToolsGlobalHook,
|
|
853
|
+
target: ReactDevToolsTarget = globalThis,
|
|
854
|
+
): void => {
|
|
789
855
|
if (!didSubscribeToHookReplacements) {
|
|
790
|
-
onRDTHookReplace(
|
|
856
|
+
onRDTHookReplace(handleHookReplacement);
|
|
791
857
|
didSubscribeToHookReplacements = true;
|
|
792
858
|
}
|
|
859
|
+
hookTargets.set(rdtHook, target);
|
|
793
860
|
setHookEventDispatchers(rdtHook);
|
|
794
861
|
};
|
|
795
862
|
|
|
@@ -819,15 +886,16 @@ try {
|
|
|
819
886
|
* unsubscribe();
|
|
820
887
|
*/
|
|
821
888
|
export const instrument = (options: InstrumentationOptions): Unsubscribe => {
|
|
822
|
-
const
|
|
889
|
+
const target = options.target ?? globalThis;
|
|
890
|
+
const rdtHook = getRDTHook(options.onActive, target);
|
|
823
891
|
rdtHook._instrumentationSource = options.name ?? BIPPY_INSTRUMENTATION_STRING;
|
|
824
892
|
|
|
825
|
-
wireHookEventDispatchers(rdtHook);
|
|
826
|
-
const subscription: InstrumentationSubscription = { options };
|
|
893
|
+
wireHookEventDispatchers(rdtHook, target);
|
|
894
|
+
const subscription: InstrumentationSubscription = { options, target };
|
|
827
895
|
instrumentationSubscriptions.add(subscription);
|
|
828
896
|
|
|
829
897
|
return createUnsubscribe(() => {
|
|
830
|
-
if (options.onActive)
|
|
898
|
+
if (options.onActive) removeActiveListener(options.onActive, target);
|
|
831
899
|
instrumentationSubscriptions.delete(subscription);
|
|
832
900
|
});
|
|
833
901
|
};
|
|
@@ -871,9 +939,12 @@ const getPublicHostInstance = (stateNode: unknown): unknown => {
|
|
|
871
939
|
return typeof nativeTag === "number" ? nativeTag : stateNode;
|
|
872
940
|
};
|
|
873
941
|
|
|
874
|
-
export const getFiber = <
|
|
875
|
-
|
|
876
|
-
|
|
942
|
+
export const getFiber = <HostInstance>(
|
|
943
|
+
hostInstance: HostInstance,
|
|
944
|
+
target: ReactDevToolsTarget = globalThis,
|
|
945
|
+
): Fiber | null => {
|
|
946
|
+
const rdtHook = target.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
947
|
+
if (rdtHook) {
|
|
877
948
|
for (const renderer of rdtHook.renderers.values()) {
|
|
878
949
|
try {
|
|
879
950
|
const fiber = renderer.findFiberByHostInstance?.(hostInstance);
|
|
@@ -908,7 +979,18 @@ export const getFiber = <T>(hostInstance: T): Fiber | null => {
|
|
|
908
979
|
hostInstance !== undefined &&
|
|
909
980
|
(typeof hostInstance === "object" || typeof hostInstance === "number")
|
|
910
981
|
) {
|
|
982
|
+
const targetFiberRoots = new Set<FiberRoot>();
|
|
983
|
+
if (rdtHook?.getFiberRoots) {
|
|
984
|
+
for (const rendererId of rdtHook.renderers.keys()) {
|
|
985
|
+
for (const fiberRoot of rdtHook.getFiberRoots(rendererId)) {
|
|
986
|
+
targetFiberRoots.add(fiberRoot);
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
}
|
|
911
990
|
for (const fiberRoot of _fiberRoots) {
|
|
991
|
+
if (rootHooks.get(fiberRoot) === rdtHook) targetFiberRoots.add(fiberRoot);
|
|
992
|
+
}
|
|
993
|
+
for (const fiberRoot of targetFiberRoots) {
|
|
912
994
|
const fiber = traverseFiber(
|
|
913
995
|
fiberRoot.current,
|
|
914
996
|
(candidateFiber) =>
|
|
@@ -925,16 +1007,16 @@ export const getFiberFromHostInstance = getFiber;
|
|
|
925
1007
|
|
|
926
1008
|
export {
|
|
927
1009
|
BIPPY_INSTRUMENTATION_STRING,
|
|
928
|
-
_onActiveListeners,
|
|
929
1010
|
_renderers,
|
|
930
1011
|
getRDTHook,
|
|
931
1012
|
hasRDTHook,
|
|
932
1013
|
installRDTHook,
|
|
1014
|
+
isFiberRootUnmounted,
|
|
933
1015
|
isReactRefresh,
|
|
934
1016
|
isRealReactDevtools,
|
|
935
1017
|
onRendererInject,
|
|
936
1018
|
patchRDTHook,
|
|
937
1019
|
version,
|
|
938
1020
|
} from "./rdt-hook.js";
|
|
939
|
-
export type { Unsubscribe } from "./rdt-hook.js";
|
|
1021
|
+
export type { ReactDevToolsTarget, Unsubscribe } from "./rdt-hook.js";
|
|
940
1022
|
export * from "./react-internals/index.js";
|