@buoy-gg/highlight-updates 7.0.56 → 7.0.57
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 +2 -0
- package/lib/commonjs/highlight-updates/components/HighlightUpdatesModal.js +1 -1
- package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +1 -1
- package/lib/commonjs/highlight-updates/utils/componentSource.js +1 -0
- package/lib/commonjs/highlight-updates/utils/screenElements.js +1 -1
- package/lib/commonjs/highlight-updates/utils/tapMatch.js +1 -1
- package/lib/commonjs/sync/highlightUpdatesSyncAdapter.js +1 -1
- package/lib/module/highlight-updates/components/HighlightUpdatesModal.js +1 -1
- package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +1 -1
- package/lib/module/highlight-updates/utils/componentSource.js +1 -0
- package/lib/module/highlight-updates/utils/screenElements.js +1 -1
- package/lib/module/highlight-updates/utils/tapMatch.js +1 -1
- package/lib/module/sync/highlightUpdatesSyncAdapter.js +1 -1
- package/lib/typescript/highlight-updates/utils/componentSource.d.ts +38 -0
- package/lib/typescript/highlight-updates/utils/screenElements.d.ts +8 -0
- package/lib/typescript/sync/highlightUpdatesSyncAdapter.d.ts +1 -0
- package/lib/web/index.mjs +12 -12
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
Highlight observed React component updates in development builds and inspect the available render details.
|
|
6
6
|
|
|
7
|
+
Your search stays in view when you leave a render.
|
|
8
|
+
|
|
7
9
|
<a href="https://buoy.gg/buoy/latest/docs/tools/highlight-updates"><b>Highlight Updates guide</b></a> · <a href="https://buoy.gg">buoy.gg</a> · <a href="https://github.com/Buoy-gg/buoy">All tools</a>
|
|
8
10
|
|
|
9
11
|
[](https://www.npmjs.com/package/@buoy-gg/highlight-updates) [](https://www.npmjs.com/package/@buoy-gg/highlight-updates)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.HighlightToolView=HighlightToolView;exports.HighlightUpdatesModal=HighlightUpdatesModal;exports.default=void 0;var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _license=require("@buoy-gg/license");var _HighlightUpdatesController=_interopRequireDefault(require("../utils/HighlightUpdatesController"));var _RenderTracker=require("../utils/RenderTracker");var _RenderDetailView=require("./RenderDetailView");var _HighlightFilterView=require("./HighlightFilterView");var _IsolatedRenderList=require("./IsolatedRenderList");var _ModalHeaderContent=require("./ModalHeaderContent");var _RenderHistoryViewer=require("./RenderHistoryViewer");var _RendersCopySettingsView=require("./RendersCopySettingsView");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(n){return n&&n.__esModule?n:{default:n}}function _interopRequireWildcard(n,k){if("function"==typeof WeakMap)var R=new WeakMap,F=new WeakMap;return(_interopRequireWildcard=function(a,p){if(!p&&a&&a.__esModule)return a;var l,u,g={__proto__:null,default:a};if(null===a||"object"!=typeof a&&"function"!=typeof a)return g;if(l=p?F:R){if(l.has(a))return l.get(a);l.set(a,g)}for(const o in a)"default"!==o&&{}.hasOwnProperty.call(a,o)&&((u=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(a,o))&&(u.get||u.set)?l(g,o,u):g[o]=a[o]);return g})(n,k)}const DisabledBanner=_react.default.memo(function n(){return(0,_jsxRuntime.jsxs)(_reactNative.View,{testID:"buoy-highlight-disabled-banner",style:styles.disabledBanner,children:[(0,_jsxRuntime.jsx)(_sharedUi.Power,{size:14,color:_sharedUi.night.color.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{testID:"buoy-highlight-disabled-text",style:styles.disabledText,children:"Render tracking is disabled"})]})});function HighlightUpdatesModal({visible:n,onClose:k,onBack:R,onMinimize:F,enableSharedModalDimensions:a=false,initialNativeTag:p,onInitialNativeTagHandled:l,onRenderSelect:u,inline:g=false}){const o=(0,_license.useIsPro)();const[w,de]=(0,_react.useState)(false);const[E,ue]=(0,_react.useState)(()=>_HighlightUpdatesController.default.getFrozen());const[q,z]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getStats().totalComponents>0);const[s,f]=(0,_react.useState)(null);const[h,T]=(0,_react.useState)(0);const[m,I]=(0,_react.useState)(false);const[P,N]=(0,_react.useState)(false);const[ge,fe]=(0,_react.useState)([]);const[V,he]=(0,_react.useState)("filters");const[x,M]=(0,_react.useState)("details");const[B,_]=(0,_react.useState)(0);const[y,Se]=(0,_react.useState)("");const[b,O]=(0,_react.useState)(false);const L=(0,_react.useRef)(null);const C=(0,_react.useRef)([]);const U=(0,_react.useRef)(_RenderTracker.RenderTracker.getFilters());const[D,K]=(0,_react.useState)(()=>{const e=_RenderTracker.RenderTracker.getFilters();return e.includePatterns.length+e.excludePatterns.length});const[i,W]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getFilters());const[j,J]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getSettings());const G=(0,_react.useRef)(false);const H=(0,_react.useRef)(false);const v=(0,_react.useRef)(false);(0,_react.useEffect)(()=>{if(!n||G.current)return;G.current=true},[n]);(0,_react.useEffect)(()=>{if(!n||H.current)return;const e=async()=>{try{const t=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters());if(t){const r=JSON.parse(t);const c={includeTestID:new Set(r.includeTestID||[]),includeNativeID:new Set(r.includeNativeID||[]),includeViewType:new Set(r.includeViewType||[]),includeComponent:new Set(r.includeComponent||[]),excludeTestID:new Set(r.excludeTestID||[]),excludeNativeID:new Set(r.excludeNativeID||[]),excludeViewType:new Set(r.excludeViewType||[]),excludeComponent:new Set(r.excludeComponent||[]),includePatterns:r.includePatterns||[],excludePatterns:r.excludePatterns||[]};_RenderTracker.RenderTracker.setFilters(c);const d=_RenderTracker.RenderTracker.getFilters();U.current=d;W(d);K(d.includePatterns.length+d.excludePatterns.length)}H.current=true}catch(t){}};e()},[n]);(0,_react.useEffect)(()=>{if(!H.current)return;const e=async()=>{try{const t={includeTestID:Array.from(i.includeTestID),includeNativeID:Array.from(i.includeNativeID),includeViewType:Array.from(i.includeViewType),includeComponent:Array.from(i.includeComponent),excludeTestID:Array.from(i.excludeTestID),excludeNativeID:Array.from(i.excludeNativeID),excludeViewType:Array.from(i.excludeViewType),excludeComponent:Array.from(i.excludeComponent),includePatterns:i.includePatterns,excludePatterns:i.excludePatterns};await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters(),JSON.stringify(t))}catch(t){}};e()},[i]);(0,_react.useEffect)(()=>{if(!n||v.current)return;const e=async()=>{try{const t=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings());if(t){const r=JSON.parse(t);const{performanceLogging:c,excludeDevTools:d,...S}=r;_RenderTracker.RenderTracker.setSettings(S);J(_RenderTracker.RenderTracker.getSettings())}v.current=true}catch(t){v.current=true}};e()},[n]);(0,_react.useEffect)(()=>{if(!v.current)return;const e=async()=>{try{const{performanceLogging:t,excludeDevTools:r,...c}=j;await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings(),JSON.stringify(c))}catch(t){}};e()},[j]);(0,_react.useEffect)(()=>{const e=_RenderTracker.RenderTracker.subscribeToState(t=>{de(t.isTracking)});return()=>{e()}},[]);(0,_react.useEffect)(()=>{const e=_HighlightUpdatesController.default.subscribeToFreeze(t=>{ue(t)});return()=>{e()}},[]);(0,_react.useEffect)(()=>{if(b){requestAnimationFrame(()=>{L.current?.focus()})}},[b]);(0,_react.useEffect)(()=>{if(!n){_HighlightUpdatesController.default.setSpotlight(null)}},[n]);(0,_react.useEffect)(()=>{if(n&&p!=null){const e=_RenderTracker.RenderTracker.getRender(String(p));if(e){f(e);T(0);I(false);_HighlightUpdatesController.default.setSpotlight(e.nativeTag)}l?.()}},[n,p,l]);const Q=(0,_react.useCallback)(()=>{if(!_HighlightUpdatesController.default.isInitialized()){_HighlightUpdatesController.default.initialize()}_HighlightUpdatesController.default.toggle()},[]);const X=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.toggleFreeze()},[]);const Y=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.clearRenderCounts();z(false)},[]);const Z=(0,_react.useCallback)(()=>{fe(_RenderTracker.RenderTracker.getFilteredRenders(y));N(true)},[y]);const $=(0,_react.useCallback)(()=>{N(false)},[]);const ee=(0,_react.useCallback)(e=>{Se(e)},[]);const pe=(0,_react.useCallback)((e,t,r)=>{f(e);T(t);M("details");_(0);C.current=r;_HighlightUpdatesController.default.setSpotlight(e.nativeTag)},[]);(0,_react.useEffect)(()=>{if(!s)return;const e=String(s.nativeTag);return _RenderTracker.RenderTracker.subscribe(()=>{const t=_RenderTracker.RenderTracker.getRender(e);if(t)f({...t})})},[s?.nativeTag]);const te=(0,_react.useRef)(null);(0,_react.useEffect)(()=>{if(!u||!s)return;if(te.current===s.nativeTag)return;te.current=s.nativeTag;u(s)},[s,u]);const Te=(0,_react.useCallback)(e=>{C.current=e},[]);const re=(0,_react.useCallback)(()=>{f(null);T(0);_HighlightUpdatesController.default.setSpotlight(null)},[]);const xe=(0,_react.useCallback)(()=>{const e=C.current;if(h>0){const t=h-1;const r=e[t];if(r){f(r);T(t);_HighlightUpdatesController.default.setSpotlight(r.nativeTag)}}},[h]);const ye=(0,_react.useCallback)(()=>{const e=C.current;if(h<e.length-1){const t=h+1;const r=e[t];if(r){f(r);T(t);_HighlightUpdatesController.default.setSpotlight(r.nativeTag)}}},[h]);const ne=(0,_react.useCallback)(()=>{I(false)},[]);const se=(0,_react.useCallback)(()=>{I(true)},[]);const ae=(0,_react.useCallback)(()=>{O(true)},[]);const ie=(0,_react.useCallback)(()=>{O(false)},[]);const A=(0,_react.useCallback)(e=>{_RenderTracker.RenderTracker.setFilters(e);const t=_RenderTracker.RenderTracker.getFilters();U.current=t;W(t);K(t.includePatterns.length+t.excludePatterns.length)},[]);const Ce=(0,_react.useCallback)((e,t)=>{const r=_RenderTracker.RenderTracker.getFilters();const c={};if(t==="include"){const d=r.includePatterns.some(S=>S.type===e.type&&S.value===e.value);if(!d){c.includePatterns=[...r.includePatterns,e]}}else{const d=r.excludePatterns.some(S=>S.type===e.type&&S.value===e.value);if(!d){c.excludePatterns=[...r.excludePatterns,e]}}if(Object.keys(c).length>0){A(c);f(null);T(0);_HighlightUpdatesController.default.setSpotlight(null)}},[A]);const Re=(0,_react.useCallback)(e=>{_RenderTracker.RenderTracker.setSettings(e);J(_RenderTracker.RenderTracker.getSettings())},[]);const we=(0,_react.useCallback)(e=>{z(e.totalComponents>0)},[]);const oe=(0,_react.useCallback)(()=>{if(P){return(0,_jsxRuntime.jsx)(_ModalHeaderContent.CopySettingsViewHeader,{onBack:$})}if(m){return(0,_jsxRuntime.jsx)(_ModalHeaderContent.FilterViewHeader,{onBack:ne,activeTab:V,onTabChange:he,activeFilterCount:D})}if(s){return(0,_jsxRuntime.jsx)(_ModalHeaderContent.DetailViewHeader,{onBack:re,activeTab:x,onTabChange:M,hasHistory:(s.renderHistory?.length??0)>0})}return(0,_jsxRuntime.jsx)(_ModalHeaderContent.MainListHeader,{onBack:R,isSearchActive:b,searchText:y,onSearchChange:ee,onSearchToggle:ae,onSearchClose:ie,onFilterToggle:se,onToggleTracking:Q,onToggleFreeze:X,onClear:Y,onOpenCopySettings:Z,isTracking:w,isFrozen:E,activeFilterCount:D,hasRenders:q,searchInputRef:L})},[P,m,s,R,b,y,w,E,D,q,V,x,ne,re,$,ee,ae,ie,se,Q,X,Y,Z]);const be=a?_sharedUi.devToolsStorageKeys.modal.root():_sharedUi.devToolsStorageKeys.highlightUpdates.modal();if(!n)return null;const ve=C.current.length;const le=s?x==="details"?(0,_jsxRuntime.jsx)(_sharedUi.EventStepperFooter,{currentIndex:h,totalItems:ve,onPrevious:xe,onNext:ye,itemLabel:"Component",subtitle:s.componentName||s.displayName||s.viewType}):(0,_jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryFooter,{render:s,selectedEventIndex:B,onEventIndexChange:_,isPro:o}):null;const ce=(0,_jsxRuntime.jsx)(_reactNative.View,{nativeID:"__rn_buoy__highlight-modal",testID:"buoy-highlight-body",style:styles.container,children:P?(0,_jsxRuntime.jsx)(_RendersCopySettingsView.RendersCopySettingsView,{renders:ge}):s?x==="details"?(0,_jsxRuntime.jsx)(_RenderDetailView.RenderDetailView,{render:s,disableInternalFooter:true,onAddFilter:Ce,isPro:o}):(0,_jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryViewer,{render:s,disableInternalFooter:true,selectedEventIndex:B,onEventIndexChange:_,isPro:o}):m?(0,_jsxRuntime.jsx)(_HighlightFilterView.HighlightFilterView,{filters:i,onFilterChange:A,settings:j,onSettingsChange:Re,availableProps:_RenderTracker.RenderTracker.getAvailableProps(),activeTab:V}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[!w&&(0,_jsxRuntime.jsx)(DisabledBanner,{}),(0,_jsxRuntime.jsx)(_IsolatedRenderList.IsolatedRenderList,{searchText:y,filters:i,onSelectRender:pe,onStatsChange:we,onRendersChange:Te,isTracking:w,isPro:o})]})});if(g){return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.inlineRoot,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.inlineHeader,..._sharedUi.windowDragProps,children:oe()}),ce,le]})})}return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:n,onClose:k,onMinimize:F,persistenceKey:be,header:{showToggleButton:true,customContent:oe()},enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:le,footerHeight:s?x==="details"?68:(s.renderHistory?.length??0)>1?68:0:0,children:ce})})}function HighlightToolView(n={}){return(0,_jsxRuntime.jsx)(HighlightUpdatesModal,{...n,inline:true,visible:true,onClose:()=>{}})}const styles=_reactNative.StyleSheet.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:_sharedUi.night.color.border,backgroundColor:"transparent"},container:{flex:1,backgroundColor:"transparent"},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.night.color.warningSoft,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.warning+"20"},disabledText:{color:_sharedUi.night.color.warning,fontSize:11,flex:1}});var _default=exports.default=HighlightUpdatesModal;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.HighlightToolView=HighlightToolView;exports.HighlightUpdatesModal=HighlightUpdatesModal;exports.default=void 0;var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _license=require("@buoy-gg/license");var _HighlightUpdatesController=_interopRequireDefault(require("../utils/HighlightUpdatesController"));var _RenderTracker=require("../utils/RenderTracker");var _RenderDetailView=require("./RenderDetailView");var _HighlightFilterView=require("./HighlightFilterView");var _IsolatedRenderList=require("./IsolatedRenderList");var _ModalHeaderContent=require("./ModalHeaderContent");var _RenderHistoryViewer=require("./RenderHistoryViewer");var _RendersCopySettingsView=require("./RendersCopySettingsView");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(n){return n&&n.__esModule?n:{default:n}}function _interopRequireWildcard(n,k){if("function"==typeof WeakMap)var R=new WeakMap,F=new WeakMap;return(_interopRequireWildcard=function(a,T){if(!T&&a&&a.__esModule)return a;var l,u,g={__proto__:null,default:a};if(null===a||"object"!=typeof a&&"function"!=typeof a)return g;if(l=T?F:R){if(l.has(a))return l.get(a);l.set(a,g)}for(const o in a)"default"!==o&&{}.hasOwnProperty.call(a,o)&&((u=(l=Object.defineProperty)&&Object.getOwnPropertyDescriptor(a,o))&&(u.get||u.set)?l(g,o,u):g[o]=a[o]);return g})(n,k)}const DisabledBanner=_react.default.memo(function n(){return(0,_jsxRuntime.jsxs)(_reactNative.View,{testID:"buoy-highlight-disabled-banner",style:styles.disabledBanner,children:[(0,_jsxRuntime.jsx)(_sharedUi.Power,{size:14,color:_sharedUi.night.color.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{testID:"buoy-highlight-disabled-text",style:styles.disabledText,children:"Render tracking is disabled"})]})});function HighlightUpdatesModal({visible:n,onClose:k,onBack:R,onMinimize:F,enableSharedModalDimensions:a=false,initialNativeTag:T,onInitialNativeTagHandled:l,onRenderSelect:u,inline:g=false}){const o=(0,_license.useIsPro)();const[w,de]=(0,_react.useState)(false);const[q,ue]=(0,_react.useState)(()=>_HighlightUpdatesController.default.getFrozen());const[z,N]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getStats().totalComponents>0);const[s,f]=(0,_react.useState)(null);const[h,x]=(0,_react.useState)(0);const[m,I]=(0,_react.useState)(false);const[P,M]=(0,_react.useState)(false);const[ge,fe]=(0,_react.useState)([]);const[V,he]=(0,_react.useState)("filters");const[y,B]=(0,_react.useState)("details");const[O,_]=(0,_react.useState)(0);const[S,Se]=(0,_react.useState)("");const[b,D]=(0,_react.useState)(false);const L=(0,_react.useRef)(null);const C=(0,_react.useRef)([]);const U=(0,_react.useRef)(_RenderTracker.RenderTracker.getFilters());const[j,K]=(0,_react.useState)(()=>{const e=_RenderTracker.RenderTracker.getFilters();return e.includePatterns.length+e.excludePatterns.length});const[i,W]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getFilters());const[H,J]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getSettings());const G=(0,_react.useRef)(false);const A=(0,_react.useRef)(false);const v=(0,_react.useRef)(false);(0,_react.useEffect)(()=>{if(!n||G.current)return;G.current=true},[n]);(0,_react.useEffect)(()=>{if(!n||A.current)return;const e=async()=>{try{const t=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters());if(t){const r=JSON.parse(t);const c={includeTestID:new Set(r.includeTestID||[]),includeNativeID:new Set(r.includeNativeID||[]),includeViewType:new Set(r.includeViewType||[]),includeComponent:new Set(r.includeComponent||[]),excludeTestID:new Set(r.excludeTestID||[]),excludeNativeID:new Set(r.excludeNativeID||[]),excludeViewType:new Set(r.excludeViewType||[]),excludeComponent:new Set(r.excludeComponent||[]),includePatterns:r.includePatterns||[],excludePatterns:r.excludePatterns||[]};_RenderTracker.RenderTracker.setFilters(c);const d=_RenderTracker.RenderTracker.getFilters();U.current=d;W(d);K(d.includePatterns.length+d.excludePatterns.length)}A.current=true}catch(t){}};e()},[n]);(0,_react.useEffect)(()=>{if(!A.current)return;const e=async()=>{try{const t={includeTestID:Array.from(i.includeTestID),includeNativeID:Array.from(i.includeNativeID),includeViewType:Array.from(i.includeViewType),includeComponent:Array.from(i.includeComponent),excludeTestID:Array.from(i.excludeTestID),excludeNativeID:Array.from(i.excludeNativeID),excludeViewType:Array.from(i.excludeViewType),excludeComponent:Array.from(i.excludeComponent),includePatterns:i.includePatterns,excludePatterns:i.excludePatterns};await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters(),JSON.stringify(t))}catch(t){}};e()},[i]);(0,_react.useEffect)(()=>{if(!n||v.current)return;const e=async()=>{try{const t=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings());if(t){const r=JSON.parse(t);const{performanceLogging:c,excludeDevTools:d,...p}=r;_RenderTracker.RenderTracker.setSettings(p);J(_RenderTracker.RenderTracker.getSettings())}v.current=true}catch(t){v.current=true}};e()},[n]);(0,_react.useEffect)(()=>{if(!v.current)return;const e=async()=>{try{const{performanceLogging:t,excludeDevTools:r,...c}=H;await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings(),JSON.stringify(c))}catch(t){}};e()},[H]);(0,_react.useEffect)(()=>{const e=_RenderTracker.RenderTracker.subscribeToState(t=>{de(t.isTracking)});return()=>{e()}},[]);(0,_react.useEffect)(()=>{const e=_HighlightUpdatesController.default.subscribeToFreeze(t=>{ue(t)});return()=>{e()}},[]);(0,_react.useEffect)(()=>{if(b){requestAnimationFrame(()=>{L.current?.focus()})}},[b]);(0,_react.useEffect)(()=>{if(!n){_HighlightUpdatesController.default.setSpotlight(null)}},[n]);(0,_react.useEffect)(()=>{if(n&&T!=null){const e=_RenderTracker.RenderTracker.getRender(String(T));if(e){f(e);x(0);I(false);_HighlightUpdatesController.default.setSpotlight(e.nativeTag)}l?.()}},[n,T,l]);const Q=(0,_react.useCallback)(()=>{if(!_HighlightUpdatesController.default.isInitialized()){_HighlightUpdatesController.default.initialize()}_HighlightUpdatesController.default.toggle()},[]);const X=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.toggleFreeze()},[]);const Y=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.clearRenderCounts();N(false)},[]);const Z=(0,_react.useCallback)(()=>{fe(_RenderTracker.RenderTracker.getFilteredRenders(S));M(true)},[S]);const $=(0,_react.useCallback)(()=>{M(false)},[]);const ee=(0,_react.useCallback)(e=>{Se(e)},[]);const pe=(0,_react.useCallback)((e,t,r)=>{f(e);x(t);B("details");_(0);C.current=r;_HighlightUpdatesController.default.setSpotlight(e.nativeTag)},[]);(0,_react.useEffect)(()=>{if(!s)return;const e=String(s.nativeTag);return _RenderTracker.RenderTracker.subscribe(()=>{const t=_RenderTracker.RenderTracker.getRender(e);if(t)f({...t})})},[s?.nativeTag]);const te=(0,_react.useRef)(null);(0,_react.useEffect)(()=>{if(!u||!s)return;if(te.current===s.nativeTag)return;te.current=s.nativeTag;u(s)},[s,u]);const Te=(0,_react.useCallback)(e=>{C.current=e},[]);const re=(0,_react.useCallback)(()=>{f(null);x(0);if(S)D(true);_HighlightUpdatesController.default.setSpotlight(null)},[S]);const xe=(0,_react.useCallback)(()=>{const e=C.current;if(h>0){const t=h-1;const r=e[t];if(r){f(r);x(t);_HighlightUpdatesController.default.setSpotlight(r.nativeTag)}}},[h]);const ye=(0,_react.useCallback)(()=>{const e=C.current;if(h<e.length-1){const t=h+1;const r=e[t];if(r){f(r);x(t);_HighlightUpdatesController.default.setSpotlight(r.nativeTag)}}},[h]);const ne=(0,_react.useCallback)(()=>{I(false)},[]);const se=(0,_react.useCallback)(()=>{I(true)},[]);const ae=(0,_react.useCallback)(()=>{D(true)},[]);const ie=(0,_react.useCallback)(()=>{D(false)},[]);const E=(0,_react.useCallback)(e=>{_RenderTracker.RenderTracker.setFilters(e);const t=_RenderTracker.RenderTracker.getFilters();U.current=t;W(t);K(t.includePatterns.length+t.excludePatterns.length)},[]);const Ce=(0,_react.useCallback)((e,t)=>{const r=_RenderTracker.RenderTracker.getFilters();const c={};if(t==="include"){const d=r.includePatterns.some(p=>p.type===e.type&&p.value===e.value);if(!d){c.includePatterns=[...r.includePatterns,e]}}else{const d=r.excludePatterns.some(p=>p.type===e.type&&p.value===e.value);if(!d){c.excludePatterns=[...r.excludePatterns,e]}}if(Object.keys(c).length>0){E(c);f(null);x(0);_HighlightUpdatesController.default.setSpotlight(null)}},[E]);const Re=(0,_react.useCallback)(e=>{_RenderTracker.RenderTracker.setSettings(e);J(_RenderTracker.RenderTracker.getSettings())},[]);const we=(0,_react.useCallback)(e=>{N(e.totalComponents>0)},[]);const oe=(0,_react.useCallback)(()=>{if(P){return(0,_jsxRuntime.jsx)(_ModalHeaderContent.CopySettingsViewHeader,{onBack:$})}if(m){return(0,_jsxRuntime.jsx)(_ModalHeaderContent.FilterViewHeader,{onBack:ne,activeTab:V,onTabChange:he,activeFilterCount:j})}if(s){return(0,_jsxRuntime.jsx)(_ModalHeaderContent.DetailViewHeader,{onBack:re,activeTab:y,onTabChange:B,hasHistory:(s.renderHistory?.length??0)>0})}return(0,_jsxRuntime.jsx)(_ModalHeaderContent.MainListHeader,{onBack:R,isSearchActive:b,searchText:S,onSearchChange:ee,onSearchToggle:ae,onSearchClose:ie,onFilterToggle:se,onToggleTracking:Q,onToggleFreeze:X,onClear:Y,onOpenCopySettings:Z,isTracking:w,isFrozen:q,activeFilterCount:j,hasRenders:z,searchInputRef:L})},[P,m,s,R,b,S,w,q,j,z,V,y,ne,re,$,ee,ae,ie,se,Q,X,Y,Z]);const be=a?_sharedUi.devToolsStorageKeys.modal.root():_sharedUi.devToolsStorageKeys.highlightUpdates.modal();if(!n)return null;const ve=C.current.length;const le=s?y==="details"?(0,_jsxRuntime.jsx)(_sharedUi.EventStepperFooter,{currentIndex:h,totalItems:ve,onPrevious:xe,onNext:ye,itemLabel:"Component",subtitle:s.componentName||s.displayName||s.viewType}):(0,_jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryFooter,{render:s,selectedEventIndex:O,onEventIndexChange:_,isPro:o}):null;const ce=(0,_jsxRuntime.jsx)(_reactNative.View,{nativeID:"__rn_buoy__highlight-modal",testID:"buoy-highlight-body",style:styles.container,children:P?(0,_jsxRuntime.jsx)(_RendersCopySettingsView.RendersCopySettingsView,{renders:ge}):s?y==="details"?(0,_jsxRuntime.jsx)(_RenderDetailView.RenderDetailView,{render:s,disableInternalFooter:true,onAddFilter:Ce,isPro:o}):(0,_jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryViewer,{render:s,disableInternalFooter:true,selectedEventIndex:O,onEventIndexChange:_,isPro:o}):m?(0,_jsxRuntime.jsx)(_HighlightFilterView.HighlightFilterView,{filters:i,onFilterChange:E,settings:H,onSettingsChange:Re,availableProps:_RenderTracker.RenderTracker.getAvailableProps(),activeTab:V}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[!w&&(0,_jsxRuntime.jsx)(DisabledBanner,{}),(0,_jsxRuntime.jsx)(_IsolatedRenderList.IsolatedRenderList,{searchText:S,filters:i,onSelectRender:pe,onStatsChange:we,onRendersChange:Te,isTracking:w,isPro:o})]})});if(g){return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.inlineRoot,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.inlineHeader,..._sharedUi.windowDragProps,children:oe()}),ce,le]})})}return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:n,onClose:k,onMinimize:F,persistenceKey:be,header:{showToggleButton:true,customContent:oe()},enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:le,footerHeight:s?y==="details"?68:(s.renderHistory?.length??0)>1?68:0:0,children:ce})})}function HighlightToolView(n={}){return(0,_jsxRuntime.jsx)(HighlightUpdatesModal,{...n,inline:true,visible:true,onClose:()=>{}})}const styles=_reactNative.StyleSheet.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:_sharedUi.night.color.border,backgroundColor:"transparent"},container:{flex:1,backgroundColor:"transparent"},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.night.color.warningSoft,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.warning+"20"},disabledText:{color:_sharedUi.night.color.warning,fontSize:11,flex:1}});var _default=exports.default=HighlightUpdatesModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _utils=require("@buoy-gg/shared-ui/utils");var _ProfilerInterceptor=require("./ProfilerInterceptor");var _reactNative=require("react-native");var _RenderTracker=require("./RenderTracker");var _screenElements=require("./screenElements");var _tapMatch=require("./tapMatch");var _PerformanceLogger=require("./PerformanceLogger");var _RenderCauseDetector=require("./RenderCauseDetector");var _sharedUi=require("@buoy-gg/shared-ui");var _devtoolsComponentNames=require("./devtoolsComponentNames");"use strict";let globalEnabled=false;let highlightsSuppressed=false;let backgroundTrackingEnabled=false;let initialized=false;let hook=null;let highlightCallback=null;let badgePressCallback=null;let traceUpdatesUnsubscribe=null;let isProcessing=false;let isFrozen=false;const freezeListeners=new Set;const stateListeners=new Set;const nodeRenderCounts=new Map;const COLORS=["#37afa9","#63b19e","#80b393","#97b488","#abb67d","#beb771","#cfb965","#dfba57","#efbb49","#febc38"];const DEBUG=false;function debugLog(e,n){if(!DEBUG)return;if(n!==void 0){console.log(`[HighlightUpdates] ${e}`,n)}else{console.log(`[HighlightUpdates] ${e}`)}}function getPublicInstance(e){const n=(0,_utils.getDOMPublicInstance)(e);if(n)return n;if(!e)return null;const i=e;if(i.canonical?.publicInstance){return i.canonical.publicInstance}if(i.canonical&&typeof i.canonical.measure==="function"){return i.canonical}if(typeof i.measure==="function"){return i}return null}function getNativeTag(e){const n=(0,_utils.getDOMNodeHandle)(e);if(n!==null)return n;if(e==null)return null;const i=e;if(i.__nativeTag!=null)return i.__nativeTag;if(i._nativeTag!=null)return i._nativeTag;if(i.nativeTag!=null)return i.nativeTag;if(i.canonical){if(i.canonical.__nativeTag!=null)return i.canonical.__nativeTag;if(i.canonical._nativeTag!=null)return i.canonical._nativeTag;if(i.canonical.nativeTag!=null)return i.canonical.nativeTag}return null}function extractComponentInfo(e){const n=e;const i={viewType:"Unknown"};if(n?.canonical?.viewConfig?.uiViewClassName){i.viewType=n.canonical.viewConfig.uiViewClassName}else if(n?.viewConfig?.uiViewClassName){i.viewType=n.viewConfig.uiViewClassName}const o=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(n);const r=n?.canonical?.currentProps;const a=n?.canonical?.pendingProps;const t=o?.pendingProps;const u=o?.memoizedProps;i.testID=r?.testID||a?.testID||t?.testID||u?.testID||void 0;i.nativeID=r?.nativeID||a?.nativeID||t?.nativeID||u?.nativeID||void 0;i.accessibilityLabel=r?.accessibilityLabel||a?.accessibilityLabel||t?.accessibilityLabel||u?.accessibilityLabel||void 0;i.componentName=getOwningComponentName(o)||void 0;return i}function describeNodeForLog(e){const n=e;const i=getPublicInstance(e);const o=getNativeTag(e)||getNativeTag(i);const r={nativeTag:o??"unknown",type:n?.canonical?"Fabric":"Legacy",hasMeasure:typeof i?.measure==="function"};if(n){r.stateNodeKeys=Object.keys(n).slice(0,20);if(n.node){r.nodeKeys=Object.keys(n.node).slice(0,20)}if(n.viewConfig){r.viewConfig={uiViewClassName:n.viewConfig.uiViewClassName,validAttributes:n.viewConfig.validAttributes?Object.keys(n.viewConfig.validAttributes).slice(0,10):void 0}}if(n.canonical){const a=n.canonical;r.canonicalKeys=Object.keys(a).slice(0,20);if(a.viewConfig){r.canonicalViewConfig={uiViewClassName:a.viewConfig.uiViewClassName}}if(a.nativeTag!=null){r.canonicalNativeTag=a.nativeTag}if(a.internalInstanceHandle){const t=a.internalInstanceHandle;r.fiberKeys=Object.keys(t).slice(0,30);if(t.type){r.fiberType=typeof t.type==="function"?t.type.name||t.type.displayName||"function":t.type}if(t.elementType){r.fiberElementType=typeof t.elementType==="function"?t.elementType.name||t.elementType.displayName||"function":t.elementType}if(t._debugOwner){const u=t._debugOwner;r.fiberDebugOwner=u.type?.name||u.type?.displayName||u.elementType?.name||"unknown"}if(t._debugSource){r.fiberDebugSource=t._debugSource}if(t.tag!=null){r.fiberTag=t.tag}if(t.pendingProps){if(t.pendingProps.nativeID)r.fiberPendingNativeID=t.pendingProps.nativeID;if(t.pendingProps.testID)r.fiberPendingTestID=t.pendingProps.testID}if(t.memoizedProps){if(t.memoizedProps.nativeID)r.fiberMemoizedNativeID=t.memoizedProps.nativeID;if(t.memoizedProps.testID)r.fiberMemoizedTestID=t.memoizedProps.testID}}if(a.publicInstance){const t=a.publicInstance;r.publicInstanceKeys=Object.keys(t).slice(0,20);if(t.nativeID!=null)r.nativeID=t.nativeID;if(t._nativeID!=null)r._nativeID=t._nativeID;if(t.props){r.publicInstanceProps=Object.keys(t.props).slice(0,15);if(t.props.nativeID)r.propsNativeID=t.props.nativeID;if(t.props.testID)r.propsTestID=t.props.testID;if(t.props.accessibilityLabel)r.accessibilityLabel=t.props.accessibilityLabel}}if(a.currentProps){r.currentPropsKeys=Object.keys(a.currentProps).slice(0,15);if(a.currentProps.nativeID!=null)r.currentPropsNativeID=a.currentProps.nativeID;if(a.currentProps.testID!=null)r.currentPropsTestID=a.currentProps.testID;if(a.currentProps.accessibilityLabel!=null)r.currentPropsAccessLabel=a.currentProps.accessibilityLabel}if(a.pendingProps){r.pendingPropsKeys=Object.keys(a.pendingProps).slice(0,15);if(a.pendingProps.nativeID!=null)r.pendingPropsNativeID=a.pendingProps.nativeID;if(a.pendingProps.testID!=null)r.pendingPropsTestID=a.pendingProps.testID}}if(n._debugOwner){const a=n._debugOwner;r.debugOwnerType=a.type?.name||a.type?.displayName||typeof a.type}if(n._debugSource){r.debugSource=n._debugSource}}return r}const DEBUG_LOGGING=false;let renderingLock=false;let renderingLockTimeout=null;const RENDER_LOCK_DURATION=350;const renderedOverlayTags=new Set;function isOurOverlayTag(e){if(e==null)return false;return renderedOverlayTags.has(e)}const HIGHLIGHT_OVERLAY_NATIVE_IDS=new Set(["highlight-updates-overlay","__rn_buoy__highlight-modal"]);const OTHER_DEV_TOOLS_NATIVE_IDS=new Set(["jsmodal-root","image-overlay-standalone","logbox_inspector","logbox"]);const devToolsNodeCache=new Map;const CACHE_MAX_SIZE=500;function clearDevToolsCache(){devToolsNodeCache.clear()}function isHighlightOverlayNativeID(e){if(!e)return false;if(HIGHLIGHT_OVERLAY_NATIVE_IDS.has(e))return true;if(e.startsWith("__highlight_"))return true;return false}function isOtherDevToolsNativeID(e){if(!e)return false;if(OTHER_DEV_TOOLS_NATIVE_IDS.has(e))return true;const n=e.charCodeAt(0);if(n===95){if(e.startsWith("__rn_buoy__"))return true}if(n===108&&e.startsWith("logbox")){return true}return false}function getComponentName(e){if(!e)return null;const n=e.type;if(n){if(typeof n==="string")return n;if(n.name)return n.name;if(n.displayName)return n.displayName}const i=e.elementType;if(i){if(i.name)return i.name;if(i.displayName)return i.displayName}return null}const INTERNAL_COMPONENT_NAMES=new Set(["View","Text","TextImpl","Image","ScrollView","FlatList","SectionList","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","Pressable","TextInput","Switch","ActivityIndicator","Modal","StatusBar","KeyboardAvoidingView","AnimatedComponent","AnimatedComponentWrapper","ScreenContainer","ScreenStack","Screen","ScreenContentWrapper","Svg","G","Path","Rect","Circle","Line","Polygon","Polyline","Ellipse","Text as SVGText","TSpan","TextPath","Use","Symbol","Defs","ClipPath","LinearGradient","RadialGradient","Stop","Mask","Pattern","Image as SVGImage","SafeAreaProvider","SafeAreaView","SafeAreaListener","GestureHandlerRootView","GestureDetector","ReanimatedView","ReanimatedText","ReanimatedImage","ReanimatedScrollView","Fragment","Suspense","Provider","Consumer","Context","ForwardRef"]);function isInternalComponent(e){if(!e)return true;if(INTERNAL_COMPONENT_NAMES.has(e))return true;if(e==="Unknown"||e==="Component")return true;if(e.startsWith("Animated"))return true;return false}function getOwningComponentName(e){if(!e)return null;let n=e._debugOwner||e.return;let i=0;let o=null;while(n&&i<30){const r=getComponentName(n);if(r&&typeof n.type!=="string"){if(!o){o=r}if(!isInternalComponent(r)){return r}}n=n.return;i++}return o}function isOurOverlayNode(e){const n=e;const i=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(n);const o=getNativeTag(e)||getNativeTag(n?.canonical?.publicInstance);const r=(0,_devtoolsComponentNames.isCapturingBuoyToolRenders)();const a=!r&&_RenderTracker.RenderTracker.getSettings().excludeDevTools;if(a&&(0,_utils.isDOMElement)(e)&&e.closest("[data-buoy-root]"))return true;if(o!=null&&a){const g=devToolsNodeCache.get(o);if(g!==void 0){return g}}let t=false;const u=i?.pendingProps?.nativeID||i?.memoizedProps?.nativeID||n?.canonical?.currentProps?.nativeID||null;if(isHighlightOverlayNativeID(u)){t=true}else if(a&&isOtherDevToolsNativeID(u)){t=true}if(!t&&i){let g=i;let m=0;while(g&&m<30){const s=getComponentName(g);if(s){if(_devtoolsComponentNames.HIGHLIGHT_OVERLAY_COMPONENTS.has(s)){t=true;break}for(const d of _devtoolsComponentNames.HIGHLIGHT_OVERLAY_PREFIXES){if(s.startsWith(d)){t=true;break}}if(t)break;if(r&&(0,_devtoolsComponentNames.isPerfMonitorComponentName)(s)){t=true;break}if(a){if(_devtoolsComponentNames.OTHER_DEV_TOOLS_COMPONENTS.has(s)||_devtoolsComponentNames.OTHER_DEV_TOOLS_EXACT.has(s)){t=true;break}for(const d of _devtoolsComponentNames.OTHER_DEV_TOOLS_PREFIXES){if(s.startsWith(d)){t=true;break}}if(t)break}}const f=g.pendingProps?.nativeID||g.memoizedProps?.nativeID;if(isHighlightOverlayNativeID(f)){t=true;break}if(a&&isOtherDevToolsNativeID(f)){t=true;break}g=g.return;m++}}if(t&&o!=null&&a){if(devToolsNodeCache.size>=CACHE_MAX_SIZE){const g=Array.from(devToolsNodeCache.keys());for(let m=0;m<CACHE_MAX_SIZE/2;m++){devToolsNodeCache.delete(g[m])}}devToolsNodeCache.set(o,t)}return t}function getColorForRenderCount(e){const n=Math.min(e-1,COLORS.length-1);return COLORS[Math.max(0,n)]}function handleTraceUpdates(e){if(e.size===0){return}if(!globalEnabled&&!backgroundTrackingEnabled){return}const n=_RenderTracker.RenderTracker.getState();if(n.isPaused){return}if(_PerformanceLogger.PerformanceLogger.isEnabled()){(0,_PerformanceLogger.markEventReceived)()}const i=_RenderTracker.RenderTracker.getBatchSize();const o=_PerformanceLogger.PerformanceLogger.startBatch(e.size,i);const r=[];let a=0;let t=0;const u=_RenderTracker.RenderTracker.hasActiveFilters();for(const s of e){if(s&&typeof s==="object"){try{if(isOurOverlayNode(s)){a++;continue}const f=getPublicInstance(s);const d=getNativeTag(s)||getNativeTag(f);if(d==null){continue}const y=extractComponentInfo(s);if(u&&!_RenderTracker.RenderTracker.passesFilters(y)){t++;continue}const I=_RenderTracker.RenderTracker.getSettings().showRenderCount;let p;let c;if(I){const l=nodeRenderCounts.get(d)||0;p=l+1;nodeRenderCounts.set(d,p);c=getColorForRenderCount(p)}else{p=0;c=COLORS[0]}r.push({node:s,color:c,count:p})}catch{}}}o.markFilteringComplete(a+t,r.length);if(r.length===0){o.finish();return}if(DEBUG_LOGGING){console.log(`[HighlightUpdates] ${r.length} component(s) re-rendered`)}const g=_RenderTracker.RenderTracker.getRenderEventCallbackCount()>0;if(!highlightCallback&&!g){if(DEBUG_LOGGING){console.log(`[HighlightUpdates] No highlightCallback and no event callbacks - skipping render`)}isProcessing=false;return}o.markMeasurementStart();const m=r.slice(0,i*4).map(({node:s,color:f,count:d})=>new Promise(y=>{let I=false;const p=b=>{if(I)return;I=true;clearTimeout(c);y(b)};const c=setTimeout(()=>p({rect:null,stateNode:s,color:f,count:d}),500);const l=getPublicInstance(s);const v=getNativeTag(s)||getNativeTag(l);if(v==null){p({rect:null,stateNode:s,color:f,count:d});return}const _=(b,T,h,D,w,C)=>{if(w==null||C==null||h==null||D==null){p({rect:null,stateNode:s,color:f,count:d});return}p({rect:{id:v,x:w,y:C,width:h,height:D,color:f,count:d},stateNode:s,color:f,count:d})};if(!l){const b=s.node;const T=globalThis.nativeFabricUIManager;if(b&&T?.measure){try{T.measure(b,_)}catch(h){p({rect:null,stateNode:s,color:f,count:d})}return}p({rect:null,stateNode:s,color:f,count:d});return}try{l.measure(_)}catch(b){p({rect:null,stateNode:s,color:f,count:d})}}));Promise.all(m).then(s=>{const f=s.filter(y=>y.rect!==null);const d=f.map(y=>y.rect);o.markMeasurementComplete(f.length,s.length-f.length);if(d.length>0&&highlightCallback&&globalEnabled&&!highlightsSuppressed){highlightCallback(d)}setTimeout(()=>{try{for(const c of f){if(c.rect)registerTrackedNode(c.rect.id,c.stateNode)}}catch(c){debugLog("registerTrackedNode batch failed",c)}const y=_RenderTracker.RenderTracker.getSettings();const I=y.trackRenderCauses&&y.showRenderCount;let p=null;if(I){p=new Set;for(const{rect:c}of f){if(c){p.add(c.id)}}}if(globalEnabled){_RenderTracker.RenderTracker.startBatch();for(const{rect:c,stateNode:l,color:v,count:_}of f){if(c){const b=extractComponentInfo(l);let T;if(I&&p){const h=l;const D=getFiberFromNode(h);T=(0,_RenderCauseDetector.detectRenderCause)(c.id,D,p,y.debugLogLevel)}_RenderTracker.RenderTracker.trackRender({nativeTag:c.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:c.x,y:c.y,width:c.width,height:c.height},color:v,count:_,renderCause:T})}}_RenderTracker.RenderTracker.endBatch()}else{for(const{rect:c,stateNode:l,color:v,count:_}of f){if(c){const b=extractComponentInfo(l);let T;if(I&&p){const h=l;const D=getFiberFromNode(h);T=(0,_RenderCauseDetector.detectRenderCause)(c.id,D,p,y.debugLogLevel)}_RenderTracker.RenderTracker.emitRenderEvent({nativeTag:c.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:c.x,y:c.y,width:c.width,height:c.height},color:v,count:_,renderCause:T})}}}o.markTrackingComplete();o.markCallbackComplete();o.finish()},0)}).catch(s=>{console.error("[HighlightUpdates] Error in measurement pipeline:",s);o.finish()})}const WeakRefCtor=globalThis.WeakRef;const nodeRegistry=new Map;function registerTrackedNode(e,n){if(e==null||n==null||typeof n!=="object"){return}try{nodeRegistry.set(e,WeakRefCtor?new WeakRefCtor(n):{deref:()=>n})}catch{nodeRegistry.set(e,{deref:()=>n})}}function derefNode(e){const n=nodeRegistry.get(e);const i=n?.deref();if(!i)nodeRegistry.delete(e);return i??null}function measureNode(e){return new Promise(n=>{try{e.measure((i,o,r,a,t,u)=>{if(t==null||u==null||r==null||a==null){n(null)}else{n({x:t,y:u,width:r,height:a})}})}catch{n(null)}})}function getFiberFromNode(e){const n=e;return n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(n)||null}function findScrollAncestor(e){let n=getFiberFromNode(e);let i=0;while(n&&i++<200){const o=n.stateNode;if(o&&typeof o.scrollTo==="function"){const r=typeof o.getNativeScrollRef==="function"&&o.getNativeScrollRef()||null;const a=typeof o.getInnerViewNode==="function"&&o.getInnerViewNode()||typeof o.getScrollableNode==="function"&&o.getScrollableNode()||o;return{instance:o,nativeRef:r,innerNode:a}}n=n.return}return null}async function scrollDescendantIntoView(e,n,i){try{const o=findScrollAncestor(e);if(!o)return false;const r=n;let a=null;const t=u=>new Promise(g=>{let m=false;const s=d=>{if(m)return;m=true;g(d)};const f=setTimeout(()=>s(null),600);try{u(d=>{clearTimeout(f);s(d)})}catch{clearTimeout(f);s(null)}});if(o.nativeRef&&typeof r.measureLayout==="function"){a=await t(u=>r.measureLayout(o.nativeRef,(g,m)=>u(m),()=>u(null)))}if(a==null){const u=(0,_reactNative.findNodeHandle)(n);const g=typeof o.innerNode==="number"?o.innerNode:(0,_reactNative.findNodeHandle)(o.innerNode);if(u!=null&&g!=null){a=await t(m=>_reactNative.UIManager.measureLayout(u,g,()=>m(null),(s,f)=>m(f)))}}if(a==null)return false;o.instance.scrollTo({y:Math.max(0,a-i),animated:false});await new Promise(u=>setTimeout(u,80));return true}catch{return false}}function matchScore(e,n){const i=[e.testID,e.nativeID,e.accessibilityLabel,e.componentName,e.viewType,String(e.nativeTag)];let o=0;for(const r of i){if(!r)continue;const a=r.toLowerCase();if(a===n)return 3;if(a.startsWith(n))o=Math.max(o,2);else if(a.includes(n))o=Math.max(o,1)}return o}async function locateComponent(e){const n=e.scrollIntoView!==false;const i=typeof e.margin==="number"?e.margin:12;const o=_RenderTracker.RenderTracker.getRenders();const r=async()=>{const l=await(0,_screenElements.describeScreen)();const v=(e.query??"").trim().toLowerCase();let _;for(const h of l.elements){if(e.nativeTag!=null&&h.nativeTag===e.nativeTag){_={el:h,score:1e3};break}const D=(0,_tapMatch.scoreTapMatch)({nativeTag:h.nativeTag,testID:h.testID,label:h.label,text:h.text,name:h.name,tap:h.tap},{query:v||void 0,nativeTag:e.nativeTag});if(D<=0)continue;if(!_||D>_.score)_={el:h,score:D}}if(!_?.el.frame){return{matched:false,reason:"no-match",candidates:[]}}const b=l.screen;const T=_.el.frame;return{matched:true,live:true,rect:{x:T.x*b.width,y:T.y*b.height,width:T.width*b.width,height:T.height*b.height},scale:_reactNative.PixelRatio.get(),screen:{width:b.width,height:b.height},nativeTag:_.el.nativeTag??void 0,componentName:_.el.name,testID:_.el.testID}};if(o.length===0)return r();const a=(e.query??"").trim().toLowerCase();const t=a?o.map(l=>({r:l,score:matchScore(l,a)})).filter(l=>l.score>0).sort((l,v)=>v.score-l.score||v.r.lastRenderTime-l.r.lastRenderTime):[];const u=t.slice(0,8).map(({r:l})=>({nativeTag:l.nativeTag,componentName:l.componentName,testID:l.testID,nativeID:l.nativeID,viewType:l.viewType,renderCount:l.renderCount}));const g=e.nativeTag??(t.length>0?t[0].r.nativeTag:void 0);if(g==null){const l=await r();return l.matched?l:{matched:false,reason:"no-match",candidates:u}}const m=o.find(l=>l.nativeTag===g);let s=null;let f=false;let d=false;const y=derefNode(g);if(y){const l=getPublicInstance(y);if(l){if(n){d=await scrollDescendantIntoView(y,l,i)}s=await measureNode(l);f=!!s}}if(!s&&m?.measurements){s={...m.measurements}}if(!s){return{matched:false,reason:"no-measurement",nativeTag:g,candidates:u}}const I=_reactNative.PixelRatio.get();const p=_reactNative.Dimensions.get("window");const c=s.x>=-1&&s.y>=-1&&s.x+s.width<=p.width+1&&s.y+s.height<=p.height+1;return{matched:true,live:f,scrolled:d,inView:c,rect:s,scale:I,screen:{width:p.width,height:p.height},nativeTag:g,componentName:m?.componentName,testID:m?.testID,candidates:u}}function setTraceUpdatesOnRenderers(e){if(!hook?.rendererInterfaces){debugLog("No rendererInterfaces available");return}let n=0;hook.rendererInterfaces.forEach((i,o)=>{if(typeof i.setTraceUpdatesEnabled==="function"){try{i.setTraceUpdatesEnabled(e);n++;debugLog(`Renderer ${o}: setTraceUpdatesEnabled(${e})`)}catch(r){debugLog(`Renderer ${o}: error setting trace updates`,r)}}else{debugLog(`Renderer ${o}: no setTraceUpdatesEnabled method`)}});debugLog(`Set trace updates ${e?"enabled":"disabled"} on ${n} renderer(s)`);if(hook.reactDevtoolsAgent?.setTraceUpdatesEnabled){try{hook.reactDevtoolsAgent.setTraceUpdatesEnabled(e);debugLog("Also set trace updates on agent")}catch(i){debugLog("Error setting trace updates on agent",i)}}}function subscribeToTraceUpdates(){if(!hook)return;if(traceUpdatesUnsubscribe)return;debugLog("Subscribing to traceUpdates event");if(typeof hook.sub==="function"){traceUpdatesUnsubscribe=hook.sub("traceUpdates",handleTraceUpdates);debugLog("Subscribed using hook.sub()")}else{debugLog("hook.sub not available, traceUpdates may not work")}setTraceUpdatesOnRenderers(true)}function unsubscribeFromTraceUpdates(){setTraceUpdatesOnRenderers(false);if(traceUpdatesUnsubscribe){traceUpdatesUnsubscribe();traceUpdatesUnsubscribe=null;debugLog("Unsubscribed from traceUpdates event")}}function setHighlightCallback(e){highlightCallback=e;debugLog(`Highlight callback ${e?"set":"cleared"}`)}function setBadgePressCallback(e){badgePressCallback=e;debugLog(`Badge press callback ${e?"set":"cleared"}`)}function getBadgePressCallback(){return badgePressCallback}function handleBadgePress(e){if(badgePressCallback){badgePressCallback(e)}}let spotlightCallback=null;let currentSpotlightTag=null;function setSpotlightCallback(e){spotlightCallback=e;if(e&¤tSpotlightTag!==null){e(currentSpotlightTag)}}function setSpotlight(e){if(remoteHandler){remoteHandler("setSpotlight",{nativeTag:e});return}currentSpotlightTag=e;if(spotlightCallback){spotlightCallback(e)}}let remoteHandler=null;function setRemoteHandler(e){remoteHandler=e}function replaceRemoteState(e){if(globalEnabled!==e.enabled){globalEnabled=e.enabled;notifyStateListeners()}if(isFrozen!==e.frozen){isFrozen=e.frozen;notifyFreezeListeners()}}function getSpotlight(){return currentSpotlightTag}function notifyStateListeners(){stateListeners.forEach(e=>{try{e(globalEnabled)}catch(n){console.error("[HighlightUpdates] Error in state listener:",n)}})}function subscribe(e){stateListeners.add(e);e(globalEnabled);return()=>{stateListeners.delete(e)}}function initialize(){if(typeof __DEV__!=="undefined"&&!__DEV__){debugLog("Only available in development builds");return false}if(remoteHandler){return true}if(initialized){return true}hook=window?.__REACT_DEVTOOLS_GLOBAL_HOOK__||null;if(!hook){debugLog("React DevTools hook not found");return false}debugLog("Hook found");debugLog(`Hook has sub: ${typeof hook.sub==="function"}`);debugLog(`Hook has on: ${typeof hook.on==="function"}`);debugLog(`Hook has emit: ${typeof hook.emit==="function"}`);(0,_ProfilerInterceptor.installProfilerInterceptor)();if(hook.rendererInterfaces&&hook.rendererInterfaces.size>0){initialized=true;debugLog(`Initialized with ${hook.rendererInterfaces.size} renderer(s)`);exposeGlobally();return true}const e=setInterval(()=>{if(hook?.rendererInterfaces&&hook.rendererInterfaces.size>0){clearInterval(e);initialized=true;debugLog(`Initialized with ${hook.rendererInterfaces.size} renderer(s) (delayed)`);exposeGlobally()}},100);setTimeout(()=>clearInterval(e),1e4);return false}function exposeGlobally(){if(typeof window!=="undefined"){window.__HIGHLIGHT_UPDATES_CONTROLLER__={enable,disable,toggle,isEnabled,setEnabled,subscribe,initialize,destroy,isInitialized:()=>initialized,setHighlightCallback}}}function enable(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!initialized){initialize()}if(highlightsSuppressed){highlightsSuppressed=false}if(globalEnabled){return}debugLog("Enabling highlights");if(!backgroundTrackingEnabled){subscribeToTraceUpdates()}_RenderTracker.RenderTracker.start();globalEnabled=true;notifyStateListeners();(0,_sharedUi.notifySubscriberCountChange)("render")}function disable(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!globalEnabled){return}debugLog("Disabling highlights");renderingLock=false;isProcessing=false;if(renderingLockTimeout){clearTimeout(renderingLockTimeout);renderingLockTimeout=null}renderedOverlayTags.clear();devToolsNodeCache.clear();(0,_RenderCauseDetector.clearRenderCauseState)();if(isFrozen){isFrozen=false;notifyFreezeListeners()}if(!backgroundTrackingEnabled){unsubscribeFromTraceUpdates()}_RenderTracker.RenderTracker.stop();globalEnabled=false;notifyStateListeners();(0,_sharedUi.notifySubscriberCountChange)("render")}function enableBackgroundTracking(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(backgroundTrackingEnabled){return}if(!initialized){initialize()}debugLog("Enabling background tracking");if(!globalEnabled){subscribeToTraceUpdates()}backgroundTrackingEnabled=true}function disableBackgroundTracking(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!backgroundTrackingEnabled){return}debugLog("Disabling background tracking");backgroundTrackingEnabled=false;if(!globalEnabled){unsubscribeFromTraceUpdates()}}function isBackgroundTrackingEnabled(){return backgroundTrackingEnabled}function toggle(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(remoteHandler){remoteHandler("toggle");return}if(globalEnabled){disable()}else{enable()}}function clearRenderCounts(){if(remoteHandler){remoteHandler("clearRenderCounts");return}nodeRenderCounts.clear();_RenderTracker.RenderTracker.clear();debugLog("Cleared render counts")}function isEnabled(){return globalEnabled}function setEnabled(e){if(remoteHandler){remoteHandler("setEnabled",{enabled:e});return}if(e)enable();else disable()}function setHighlightsSuppressed(e){if(highlightsSuppressed===e)return;highlightsSuppressed=e;if(e&&highlightCallback){highlightCallback([])}}function getHighlightsSuppressed(){return highlightsSuppressed}function setSilentTracking(e){if(remoteHandler){remoteHandler("setSilentTracking",{enabled:e});return}if(e){enable();setHighlightsSuppressed(true)}else{setHighlightsSuppressed(false);disable()}}function isInitialized(){return initialized}function notifyFreezeListeners(){freezeListeners.forEach(e=>{try{e(isFrozen)}catch(n){console.error("[HighlightUpdates] Error in freeze listener:",n)}})}function subscribeToFreeze(e){freezeListeners.add(e);e(isFrozen);return()=>{freezeListeners.delete(e)}}function freeze(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(isFrozen)return;isFrozen=true;debugLog("Freeze mode enabled");notifyFreezeListeners()}function unfreeze(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!isFrozen)return;isFrozen=false;debugLog("Freeze mode disabled");if(highlightCallback){highlightCallback([])}notifyFreezeListeners()}function toggleFreeze(){if(remoteHandler){remoteHandler("toggleFreeze");return}if(isFrozen){unfreeze()}else{freeze()}}function getFrozen(){return isFrozen}function destroy(){if(!initialized)return;unsubscribeFromTraceUpdates();(0,_ProfilerInterceptor.uninstallProfilerInterceptor)();(0,_ProfilerInterceptor.setComparisonCallback)(null);isFrozen=false;freezeListeners.clear();globalEnabled=false;hook=null;highlightCallback=null;initialized=false;if(typeof window!=="undefined"){delete window.__HIGHLIGHT_UPDATES_CONTROLLER__}debugLog("Destroyed")}const HighlightUpdatesController={subscribe,enable,disable,toggle,isEnabled,setEnabled,initialize,destroy,isInitialized,setHighlightCallback,clearRenderCounts,freeze,unfreeze,toggleFreeze,getFrozen,subscribeToFreeze,setBadgePressCallback,getBadgePressCallback,handleBadgePress,setSpotlightCallback,setSpotlight,getSpotlight,clearDevToolsCache,enableBackgroundTracking,disableBackgroundTracking,isBackgroundTrackingEnabled,setRemoteHandler,replaceRemoteState,locateComponent,setHighlightsSuppressed,getHighlightsSuppressed,setSilentTracking};var _default=exports.default=HighlightUpdatesController;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _utils=require("@buoy-gg/shared-ui/utils");var _ProfilerInterceptor=require("./ProfilerInterceptor");var _reactNative=require("react-native");var _RenderTracker=require("./RenderTracker");var _screenElements=require("./screenElements");var _tapMatch=require("./tapMatch");var _PerformanceLogger=require("./PerformanceLogger");var _RenderCauseDetector=require("./RenderCauseDetector");var _sharedUi=require("@buoy-gg/shared-ui");var _devtoolsComponentNames=require("./devtoolsComponentNames");"use strict";let globalEnabled=false;let highlightsSuppressed=false;let backgroundTrackingEnabled=false;let initialized=false;let hook=null;let highlightCallback=null;let badgePressCallback=null;let traceUpdatesUnsubscribe=null;let isProcessing=false;let isFrozen=false;const freezeListeners=new Set;const stateListeners=new Set;const nodeRenderCounts=new Map;const COLORS=["#37afa9","#63b19e","#80b393","#97b488","#abb67d","#beb771","#cfb965","#dfba57","#efbb49","#febc38"];const DEBUG=false;function debugLog(e,n){if(!DEBUG)return;if(n!==void 0){console.log(`[HighlightUpdates] ${e}`,n)}else{console.log(`[HighlightUpdates] ${e}`)}}function getPublicInstance(e){const n=(0,_utils.getDOMPublicInstance)(e);if(n)return n;if(!e)return null;const r=e;if(r.canonical?.publicInstance){return r.canonical.publicInstance}if(r.canonical&&typeof r.canonical.measure==="function"){return r.canonical}if(typeof r.measure==="function"){return r}return null}function getNativeTag(e){const n=(0,_utils.getDOMNodeHandle)(e);if(n!==null)return n;if(e==null)return null;const r=e;if(r.__nativeTag!=null)return r.__nativeTag;if(r._nativeTag!=null)return r._nativeTag;if(r.nativeTag!=null)return r.nativeTag;if(r.canonical){if(r.canonical.__nativeTag!=null)return r.canonical.__nativeTag;if(r.canonical._nativeTag!=null)return r.canonical._nativeTag;if(r.canonical.nativeTag!=null)return r.canonical.nativeTag}return null}function extractComponentInfo(e){const n=e;const r={viewType:"Unknown"};if(n?.canonical?.viewConfig?.uiViewClassName){r.viewType=n.canonical.viewConfig.uiViewClassName}else if(n?.viewConfig?.uiViewClassName){r.viewType=n.viewConfig.uiViewClassName}else if((0,_utils.isDOMElement)(n)){r.viewType=n.tagName.toLowerCase()}const o=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(n);const i=n?.canonical?.currentProps;const a=n?.canonical?.pendingProps;const t=o?.pendingProps;const c=o?.memoizedProps;r.testID=i?.testID||a?.testID||t?.testID||c?.testID||t?.["data-testid"]||c?.["data-testid"]||void 0;r.nativeID=i?.nativeID||a?.nativeID||t?.nativeID||c?.nativeID||t?.id||c?.id||void 0;r.accessibilityLabel=i?.accessibilityLabel||a?.accessibilityLabel||t?.accessibilityLabel||c?.accessibilityLabel||t?.["aria-label"]||c?.["aria-label"]||void 0;r.componentName=getOwningComponentName(o)||void 0;return r}function describeNodeForLog(e){const n=e;const r=getPublicInstance(e);const o=getNativeTag(e)||getNativeTag(r);const i={nativeTag:o??"unknown",type:n?.canonical?"Fabric":"Legacy",hasMeasure:typeof r?.measure==="function"};if(n){i.stateNodeKeys=Object.keys(n).slice(0,20);if(n.node){i.nodeKeys=Object.keys(n.node).slice(0,20)}if(n.viewConfig){i.viewConfig={uiViewClassName:n.viewConfig.uiViewClassName,validAttributes:n.viewConfig.validAttributes?Object.keys(n.viewConfig.validAttributes).slice(0,10):void 0}}if(n.canonical){const a=n.canonical;i.canonicalKeys=Object.keys(a).slice(0,20);if(a.viewConfig){i.canonicalViewConfig={uiViewClassName:a.viewConfig.uiViewClassName}}if(a.nativeTag!=null){i.canonicalNativeTag=a.nativeTag}if(a.internalInstanceHandle){const t=a.internalInstanceHandle;i.fiberKeys=Object.keys(t).slice(0,30);if(t.type){i.fiberType=typeof t.type==="function"?t.type.name||t.type.displayName||"function":t.type}if(t.elementType){i.fiberElementType=typeof t.elementType==="function"?t.elementType.name||t.elementType.displayName||"function":t.elementType}if(t._debugOwner){const c=t._debugOwner;i.fiberDebugOwner=c.type?.name||c.type?.displayName||c.elementType?.name||"unknown"}if(t._debugSource){i.fiberDebugSource=t._debugSource}if(t.tag!=null){i.fiberTag=t.tag}if(t.pendingProps){if(t.pendingProps.nativeID)i.fiberPendingNativeID=t.pendingProps.nativeID;if(t.pendingProps.testID)i.fiberPendingTestID=t.pendingProps.testID}if(t.memoizedProps){if(t.memoizedProps.nativeID)i.fiberMemoizedNativeID=t.memoizedProps.nativeID;if(t.memoizedProps.testID)i.fiberMemoizedTestID=t.memoizedProps.testID}}if(a.publicInstance){const t=a.publicInstance;i.publicInstanceKeys=Object.keys(t).slice(0,20);if(t.nativeID!=null)i.nativeID=t.nativeID;if(t._nativeID!=null)i._nativeID=t._nativeID;if(t.props){i.publicInstanceProps=Object.keys(t.props).slice(0,15);if(t.props.nativeID)i.propsNativeID=t.props.nativeID;if(t.props.testID)i.propsTestID=t.props.testID;if(t.props.accessibilityLabel)i.accessibilityLabel=t.props.accessibilityLabel}}if(a.currentProps){i.currentPropsKeys=Object.keys(a.currentProps).slice(0,15);if(a.currentProps.nativeID!=null)i.currentPropsNativeID=a.currentProps.nativeID;if(a.currentProps.testID!=null)i.currentPropsTestID=a.currentProps.testID;if(a.currentProps.accessibilityLabel!=null)i.currentPropsAccessLabel=a.currentProps.accessibilityLabel}if(a.pendingProps){i.pendingPropsKeys=Object.keys(a.pendingProps).slice(0,15);if(a.pendingProps.nativeID!=null)i.pendingPropsNativeID=a.pendingProps.nativeID;if(a.pendingProps.testID!=null)i.pendingPropsTestID=a.pendingProps.testID}}if(n._debugOwner){const a=n._debugOwner;i.debugOwnerType=a.type?.name||a.type?.displayName||typeof a.type}if(n._debugSource){i.debugSource=n._debugSource}}return i}const DEBUG_LOGGING=false;let renderingLock=false;let renderingLockTimeout=null;const RENDER_LOCK_DURATION=350;const renderedOverlayTags=new Set;function isOurOverlayTag(e){if(e==null)return false;return renderedOverlayTags.has(e)}const HIGHLIGHT_OVERLAY_NATIVE_IDS=new Set(["highlight-updates-overlay","__rn_buoy__highlight-modal"]);const OTHER_DEV_TOOLS_NATIVE_IDS=new Set(["jsmodal-root","image-overlay-standalone","logbox_inspector","logbox"]);const devToolsNodeCache=new Map;const CACHE_MAX_SIZE=500;function clearDevToolsCache(){devToolsNodeCache.clear()}function isHighlightOverlayNativeID(e){if(!e)return false;if(HIGHLIGHT_OVERLAY_NATIVE_IDS.has(e))return true;if(e.startsWith("__highlight_"))return true;return false}function isOtherDevToolsNativeID(e){if(!e)return false;if(OTHER_DEV_TOOLS_NATIVE_IDS.has(e))return true;const n=e.charCodeAt(0);if(n===95){if(e.startsWith("__rn_buoy__"))return true}if(n===108&&e.startsWith("logbox")){return true}return false}function getComponentName(e){if(!e)return null;const n=e.type;if(n){if(typeof n==="string")return n;if(n.name)return n.name;if(n.displayName)return n.displayName}const r=e.elementType;if(r){if(r.name)return r.name;if(r.displayName)return r.displayName}return null}const INTERNAL_COMPONENT_NAMES=new Set(["View","Text","TextImpl","Image","ScrollView","FlatList","SectionList","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","Pressable","TextInput","Switch","ActivityIndicator","Modal","StatusBar","KeyboardAvoidingView","AnimatedComponent","AnimatedComponentWrapper","ScreenContainer","ScreenStack","Screen","ScreenContentWrapper","Svg","G","Path","Rect","Circle","Line","Polygon","Polyline","Ellipse","Text as SVGText","TSpan","TextPath","Use","Symbol","Defs","ClipPath","LinearGradient","RadialGradient","Stop","Mask","Pattern","Image as SVGImage","SafeAreaProvider","SafeAreaView","SafeAreaListener","GestureHandlerRootView","GestureDetector","ReanimatedView","ReanimatedText","ReanimatedImage","ReanimatedScrollView","Fragment","Suspense","Provider","Consumer","Context","ForwardRef"]);function isInternalComponent(e){if(!e)return true;if(INTERNAL_COMPONENT_NAMES.has(e))return true;if(e==="Unknown"||e==="Component")return true;if(e.startsWith("Animated"))return true;return false}function getOwningComponentName(e){if(!e)return null;let n=e._debugOwner||e.return;let r=0;let o=null;while(n&&r<30){const i=getComponentName(n);if(i&&typeof n.type!=="string"){if(!o){o=i}if(!isInternalComponent(i)){return i}}n=n.return;r++}return o}function isOurOverlayNode(e){const n=e;const r=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(n);const o=getNativeTag(e)||getNativeTag(n?.canonical?.publicInstance);const i=(0,_devtoolsComponentNames.isCapturingBuoyToolRenders)();const a=!i&&_RenderTracker.RenderTracker.getSettings().excludeDevTools;if(a&&(0,_utils.isDOMElement)(e)&&e.closest("[data-buoy-root]"))return true;if(o!=null&&a){const g=devToolsNodeCache.get(o);if(g!==void 0){return g}}let t=false;const c=r?.pendingProps?.nativeID||r?.memoizedProps?.nativeID||n?.canonical?.currentProps?.nativeID||null;if(isHighlightOverlayNativeID(c)){t=true}else if(a&&isOtherDevToolsNativeID(c)){t=true}if(!t&&r){let g=r;let m=0;while(g&&m<30){const s=getComponentName(g);if(s){if(_devtoolsComponentNames.HIGHLIGHT_OVERLAY_COMPONENTS.has(s)){t=true;break}for(const d of _devtoolsComponentNames.HIGHLIGHT_OVERLAY_PREFIXES){if(s.startsWith(d)){t=true;break}}if(t)break;if(i&&(0,_devtoolsComponentNames.isPerfMonitorComponentName)(s)){t=true;break}if(a){if(_devtoolsComponentNames.OTHER_DEV_TOOLS_COMPONENTS.has(s)||_devtoolsComponentNames.OTHER_DEV_TOOLS_EXACT.has(s)){t=true;break}for(const d of _devtoolsComponentNames.OTHER_DEV_TOOLS_PREFIXES){if(s.startsWith(d)){t=true;break}}if(t)break}}const f=g.pendingProps?.nativeID||g.memoizedProps?.nativeID;if(isHighlightOverlayNativeID(f)){t=true;break}if(a&&isOtherDevToolsNativeID(f)){t=true;break}g=g.return;m++}}if(t&&o!=null&&a){if(devToolsNodeCache.size>=CACHE_MAX_SIZE){const g=Array.from(devToolsNodeCache.keys());for(let m=0;m<CACHE_MAX_SIZE/2;m++){devToolsNodeCache.delete(g[m])}}devToolsNodeCache.set(o,t)}return t}function getColorForRenderCount(e){const n=Math.min(e-1,COLORS.length-1);return COLORS[Math.max(0,n)]}function handleTraceUpdates(e){if(e.size===0){return}if(!globalEnabled&&!backgroundTrackingEnabled){return}const n=_RenderTracker.RenderTracker.getState();if(n.isPaused){return}if(_PerformanceLogger.PerformanceLogger.isEnabled()){(0,_PerformanceLogger.markEventReceived)()}const r=_RenderTracker.RenderTracker.getBatchSize();const o=_PerformanceLogger.PerformanceLogger.startBatch(e.size,r);const i=[];let a=0;let t=0;const c=_RenderTracker.RenderTracker.hasActiveFilters();for(const s of e){if(s&&typeof s==="object"){try{if(isOurOverlayNode(s)){a++;continue}const f=getPublicInstance(s);const d=getNativeTag(s)||getNativeTag(f);if(d==null){continue}const y=extractComponentInfo(s);if(c&&!_RenderTracker.RenderTracker.passesFilters(y)){t++;continue}const I=_RenderTracker.RenderTracker.getSettings().showRenderCount;let p;let u;if(I){const l=nodeRenderCounts.get(d)||0;p=l+1;nodeRenderCounts.set(d,p);u=getColorForRenderCount(p)}else{p=0;u=COLORS[0]}i.push({node:s,color:u,count:p})}catch{}}}o.markFilteringComplete(a+t,i.length);if(i.length===0){o.finish();return}if(DEBUG_LOGGING){console.log(`[HighlightUpdates] ${i.length} component(s) re-rendered`)}const g=_RenderTracker.RenderTracker.getRenderEventCallbackCount()>0;if(!highlightCallback&&!g){if(DEBUG_LOGGING){console.log(`[HighlightUpdates] No highlightCallback and no event callbacks - skipping render`)}isProcessing=false;return}o.markMeasurementStart();const m=i.slice(0,r*4).map(({node:s,color:f,count:d})=>new Promise(y=>{let I=false;const p=b=>{if(I)return;I=true;clearTimeout(u);y(b)};const u=setTimeout(()=>p({rect:null,stateNode:s,color:f,count:d}),500);const l=getPublicInstance(s);const v=getNativeTag(s)||getNativeTag(l);if(v==null){p({rect:null,stateNode:s,color:f,count:d});return}const T=(b,_,h,D,w,C)=>{if(w==null||C==null||h==null||D==null){p({rect:null,stateNode:s,color:f,count:d});return}p({rect:{id:v,x:w,y:C,width:h,height:D,color:f,count:d},stateNode:s,color:f,count:d})};if(!l){const b=s.node;const _=globalThis.nativeFabricUIManager;if(b&&_?.measure){try{_.measure(b,T)}catch(h){p({rect:null,stateNode:s,color:f,count:d})}return}p({rect:null,stateNode:s,color:f,count:d});return}try{l.measure(T)}catch(b){p({rect:null,stateNode:s,color:f,count:d})}}));Promise.all(m).then(s=>{const f=s.filter(y=>y.rect!==null);const d=f.map(y=>y.rect);o.markMeasurementComplete(f.length,s.length-f.length);if(d.length>0&&highlightCallback&&globalEnabled&&!highlightsSuppressed){highlightCallback(d)}setTimeout(()=>{try{for(const u of f){if(u.rect)registerTrackedNode(u.rect.id,u.stateNode)}}catch(u){debugLog("registerTrackedNode batch failed",u)}const y=_RenderTracker.RenderTracker.getSettings();const I=y.trackRenderCauses&&y.showRenderCount;let p=null;if(I){p=new Set;for(const{rect:u}of f){if(u){p.add(u.id)}}}if(globalEnabled){_RenderTracker.RenderTracker.startBatch();for(const{rect:u,stateNode:l,color:v,count:T}of f){if(u){const b=extractComponentInfo(l);let _;if(I&&p){const h=l;const D=getFiberFromNode(h);_=(0,_RenderCauseDetector.detectRenderCause)(u.id,D,p,y.debugLogLevel)}_RenderTracker.RenderTracker.trackRender({nativeTag:u.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:u.x,y:u.y,width:u.width,height:u.height},color:v,count:T,renderCause:_})}}_RenderTracker.RenderTracker.endBatch()}else{for(const{rect:u,stateNode:l,color:v,count:T}of f){if(u){const b=extractComponentInfo(l);let _;if(I&&p){const h=l;const D=getFiberFromNode(h);_=(0,_RenderCauseDetector.detectRenderCause)(u.id,D,p,y.debugLogLevel)}_RenderTracker.RenderTracker.emitRenderEvent({nativeTag:u.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:u.x,y:u.y,width:u.width,height:u.height},color:v,count:T,renderCause:_})}}}o.markTrackingComplete();o.markCallbackComplete();o.finish()},0)}).catch(s=>{console.error("[HighlightUpdates] Error in measurement pipeline:",s);o.finish()})}const WeakRefCtor=globalThis.WeakRef;const nodeRegistry=new Map;function registerTrackedNode(e,n){if(e==null||n==null||typeof n!=="object"){return}try{nodeRegistry.set(e,WeakRefCtor?new WeakRefCtor(n):{deref:()=>n})}catch{nodeRegistry.set(e,{deref:()=>n})}}function derefNode(e){const n=nodeRegistry.get(e);const r=n?.deref();if(!r)nodeRegistry.delete(e);return r??null}function measureNode(e){return new Promise(n=>{try{e.measure((r,o,i,a,t,c)=>{if(t==null||c==null||i==null||a==null){n(null)}else{n({x:t,y:c,width:i,height:a})}})}catch{n(null)}})}function getFiberFromNode(e){const n=e;return n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(n)||null}function findScrollAncestor(e){let n=getFiberFromNode(e);let r=0;while(n&&r++<200){const o=n.stateNode;if(o&&typeof o.scrollTo==="function"){const i=typeof o.getNativeScrollRef==="function"&&o.getNativeScrollRef()||null;const a=typeof o.getInnerViewNode==="function"&&o.getInnerViewNode()||typeof o.getScrollableNode==="function"&&o.getScrollableNode()||o;return{instance:o,nativeRef:i,innerNode:a}}n=n.return}return null}async function scrollDescendantIntoView(e,n,r){try{const o=findScrollAncestor(e);if(!o)return false;const i=n;let a=null;const t=c=>new Promise(g=>{let m=false;const s=d=>{if(m)return;m=true;g(d)};const f=setTimeout(()=>s(null),600);try{c(d=>{clearTimeout(f);s(d)})}catch{clearTimeout(f);s(null)}});if(o.nativeRef&&typeof i.measureLayout==="function"){a=await t(c=>i.measureLayout(o.nativeRef,(g,m)=>c(m),()=>c(null)))}if(a==null){const c=(0,_reactNative.findNodeHandle)(n);const g=typeof o.innerNode==="number"?o.innerNode:(0,_reactNative.findNodeHandle)(o.innerNode);if(c!=null&&g!=null){a=await t(m=>_reactNative.UIManager.measureLayout(c,g,()=>m(null),(s,f)=>m(f)))}}if(a==null)return false;o.instance.scrollTo({y:Math.max(0,a-r),animated:false});await new Promise(c=>setTimeout(c,80));return true}catch{return false}}function matchScore(e,n){const r=[e.testID,e.nativeID,e.accessibilityLabel,e.componentName,e.viewType,String(e.nativeTag)];let o=0;for(const i of r){if(!i)continue;const a=i.toLowerCase();if(a===n)return 3;if(a.startsWith(n))o=Math.max(o,2);else if(a.includes(n))o=Math.max(o,1)}return o}async function locateComponent(e){const n=e.scrollIntoView!==false;const r=typeof e.margin==="number"?e.margin:12;const o=_RenderTracker.RenderTracker.getRenders();const i=async()=>{const l=await(0,_screenElements.describeScreen)();const v=(e.query??"").trim().toLowerCase();let T;for(const h of l.elements){if(e.nativeTag!=null&&h.nativeTag===e.nativeTag){T={el:h,score:1e3};break}const D=(0,_tapMatch.scoreTapMatch)({nativeTag:h.nativeTag,testID:h.testID,label:h.label,text:h.text,name:h.name,tap:h.tap},{query:v||void 0,nativeTag:e.nativeTag});if(D<=0)continue;if(!T||D>T.score)T={el:h,score:D}}if(!T?.el.frame){return{matched:false,reason:"no-match",candidates:[]}}const b=l.screen;const _=T.el.frame;return{matched:true,live:true,rect:{x:_.x*b.width,y:_.y*b.height,width:_.width*b.width,height:_.height*b.height},scale:_reactNative.PixelRatio.get(),screen:{width:b.width,height:b.height},nativeTag:T.el.nativeTag??void 0,componentName:T.el.name,testID:T.el.testID}};if(o.length===0)return i();const a=(e.query??"").trim().toLowerCase();const t=a?o.map(l=>({r:l,score:matchScore(l,a)})).filter(l=>l.score>0).sort((l,v)=>v.score-l.score||v.r.lastRenderTime-l.r.lastRenderTime):[];const c=t.slice(0,8).map(({r:l})=>({nativeTag:l.nativeTag,componentName:l.componentName,testID:l.testID,nativeID:l.nativeID,viewType:l.viewType,renderCount:l.renderCount}));const g=e.nativeTag??(t.length>0?t[0].r.nativeTag:void 0);if(g==null){const l=await i();return l.matched?l:{matched:false,reason:"no-match",candidates:c}}const m=o.find(l=>l.nativeTag===g);let s=null;let f=false;let d=false;const y=derefNode(g);if(y){const l=getPublicInstance(y);if(l){if(n){d=await scrollDescendantIntoView(y,l,r)}s=await measureNode(l);f=!!s}}if(!s&&m?.measurements){s={...m.measurements}}if(!s){return{matched:false,reason:"no-measurement",nativeTag:g,candidates:c}}const I=_reactNative.PixelRatio.get();const p=_reactNative.Dimensions.get("window");const u=s.x>=-1&&s.y>=-1&&s.x+s.width<=p.width+1&&s.y+s.height<=p.height+1;return{matched:true,live:f,scrolled:d,inView:u,rect:s,scale:I,screen:{width:p.width,height:p.height},nativeTag:g,componentName:m?.componentName,testID:m?.testID,candidates:c}}function setTraceUpdatesOnRenderers(e){if(!hook?.rendererInterfaces){debugLog("No rendererInterfaces available");return}let n=0;hook.rendererInterfaces.forEach((r,o)=>{if(typeof r.setTraceUpdatesEnabled==="function"){try{r.setTraceUpdatesEnabled(e);n++;debugLog(`Renderer ${o}: setTraceUpdatesEnabled(${e})`)}catch(i){debugLog(`Renderer ${o}: error setting trace updates`,i)}}else{debugLog(`Renderer ${o}: no setTraceUpdatesEnabled method`)}});debugLog(`Set trace updates ${e?"enabled":"disabled"} on ${n} renderer(s)`);if(hook.reactDevtoolsAgent?.setTraceUpdatesEnabled){try{hook.reactDevtoolsAgent.setTraceUpdatesEnabled(e);debugLog("Also set trace updates on agent")}catch(r){debugLog("Error setting trace updates on agent",r)}}}function subscribeToTraceUpdates(){if(!hook)return;if(traceUpdatesUnsubscribe)return;debugLog("Subscribing to traceUpdates event");if(typeof hook.sub==="function"){traceUpdatesUnsubscribe=hook.sub("traceUpdates",handleTraceUpdates);debugLog("Subscribed using hook.sub()")}else{debugLog("hook.sub not available, traceUpdates may not work")}setTraceUpdatesOnRenderers(true)}function unsubscribeFromTraceUpdates(){setTraceUpdatesOnRenderers(false);if(traceUpdatesUnsubscribe){traceUpdatesUnsubscribe();traceUpdatesUnsubscribe=null;debugLog("Unsubscribed from traceUpdates event")}}function setHighlightCallback(e){highlightCallback=e;debugLog(`Highlight callback ${e?"set":"cleared"}`)}function setBadgePressCallback(e){badgePressCallback=e;debugLog(`Badge press callback ${e?"set":"cleared"}`)}function getBadgePressCallback(){return badgePressCallback}function handleBadgePress(e){if(badgePressCallback){badgePressCallback(e)}}let spotlightCallback=null;let currentSpotlightTag=null;function setSpotlightCallback(e){spotlightCallback=e;if(e&¤tSpotlightTag!==null){e(currentSpotlightTag)}}function setSpotlight(e){if(remoteHandler){remoteHandler("setSpotlight",{nativeTag:e});return}currentSpotlightTag=e;if(spotlightCallback){spotlightCallback(e)}}let remoteHandler=null;function setRemoteHandler(e){remoteHandler=e}function replaceRemoteState(e){if(globalEnabled!==e.enabled){globalEnabled=e.enabled;notifyStateListeners()}if(isFrozen!==e.frozen){isFrozen=e.frozen;notifyFreezeListeners()}}function getSpotlight(){return currentSpotlightTag}function notifyStateListeners(){stateListeners.forEach(e=>{try{e(globalEnabled)}catch(n){console.error("[HighlightUpdates] Error in state listener:",n)}})}function subscribe(e){stateListeners.add(e);e(globalEnabled);return()=>{stateListeners.delete(e)}}function initialize(){if(typeof __DEV__!=="undefined"&&!__DEV__){debugLog("Only available in development builds");return false}if(remoteHandler){return true}if(initialized){return true}hook=window?.__REACT_DEVTOOLS_GLOBAL_HOOK__||null;if(!hook){debugLog("React DevTools hook not found");return false}debugLog("Hook found");debugLog(`Hook has sub: ${typeof hook.sub==="function"}`);debugLog(`Hook has on: ${typeof hook.on==="function"}`);debugLog(`Hook has emit: ${typeof hook.emit==="function"}`);(0,_ProfilerInterceptor.installProfilerInterceptor)();if(hook.rendererInterfaces&&hook.rendererInterfaces.size>0){initialized=true;debugLog(`Initialized with ${hook.rendererInterfaces.size} renderer(s)`);exposeGlobally();return true}const e=setInterval(()=>{if(hook?.rendererInterfaces&&hook.rendererInterfaces.size>0){clearInterval(e);initialized=true;debugLog(`Initialized with ${hook.rendererInterfaces.size} renderer(s) (delayed)`);exposeGlobally()}},100);setTimeout(()=>clearInterval(e),1e4);return false}function exposeGlobally(){if(typeof window!=="undefined"){window.__HIGHLIGHT_UPDATES_CONTROLLER__={enable,disable,toggle,isEnabled,setEnabled,subscribe,initialize,destroy,isInitialized:()=>initialized,setHighlightCallback}}}function enable(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!initialized){initialize()}if(highlightsSuppressed){highlightsSuppressed=false}if(globalEnabled){return}debugLog("Enabling highlights");if(!backgroundTrackingEnabled){subscribeToTraceUpdates()}_RenderTracker.RenderTracker.start();globalEnabled=true;notifyStateListeners();(0,_sharedUi.notifySubscriberCountChange)("render")}function disable(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!globalEnabled){return}debugLog("Disabling highlights");renderingLock=false;isProcessing=false;if(renderingLockTimeout){clearTimeout(renderingLockTimeout);renderingLockTimeout=null}renderedOverlayTags.clear();devToolsNodeCache.clear();(0,_RenderCauseDetector.clearRenderCauseState)();if(isFrozen){isFrozen=false;notifyFreezeListeners()}if(!backgroundTrackingEnabled){unsubscribeFromTraceUpdates()}_RenderTracker.RenderTracker.stop();globalEnabled=false;notifyStateListeners();(0,_sharedUi.notifySubscriberCountChange)("render")}function enableBackgroundTracking(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(backgroundTrackingEnabled){return}if(!initialized){initialize()}debugLog("Enabling background tracking");if(!globalEnabled){subscribeToTraceUpdates()}backgroundTrackingEnabled=true}function disableBackgroundTracking(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!backgroundTrackingEnabled){return}debugLog("Disabling background tracking");backgroundTrackingEnabled=false;if(!globalEnabled){unsubscribeFromTraceUpdates()}}function isBackgroundTrackingEnabled(){return backgroundTrackingEnabled}function toggle(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(remoteHandler){remoteHandler("toggle");return}if(globalEnabled){disable()}else{enable()}}function clearRenderCounts(){if(remoteHandler){remoteHandler("clearRenderCounts");return}nodeRenderCounts.clear();_RenderTracker.RenderTracker.clear();debugLog("Cleared render counts")}function isEnabled(){return globalEnabled}function setEnabled(e){if(remoteHandler){remoteHandler("setEnabled",{enabled:e});return}if(e)enable();else disable()}function setHighlightsSuppressed(e){if(highlightsSuppressed===e)return;highlightsSuppressed=e;if(e&&highlightCallback){highlightCallback([])}}function getHighlightsSuppressed(){return highlightsSuppressed}function setSilentTracking(e){if(remoteHandler){remoteHandler("setSilentTracking",{enabled:e});return}if(e){enable();setHighlightsSuppressed(true)}else{setHighlightsSuppressed(false);disable()}}function isInitialized(){return initialized}function notifyFreezeListeners(){freezeListeners.forEach(e=>{try{e(isFrozen)}catch(n){console.error("[HighlightUpdates] Error in freeze listener:",n)}})}function subscribeToFreeze(e){freezeListeners.add(e);e(isFrozen);return()=>{freezeListeners.delete(e)}}function freeze(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(isFrozen)return;isFrozen=true;debugLog("Freeze mode enabled");notifyFreezeListeners()}function unfreeze(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!isFrozen)return;isFrozen=false;debugLog("Freeze mode disabled");if(highlightCallback){highlightCallback([])}notifyFreezeListeners()}function toggleFreeze(){if(remoteHandler){remoteHandler("toggleFreeze");return}if(isFrozen){unfreeze()}else{freeze()}}function getFrozen(){return isFrozen}function destroy(){if(!initialized)return;unsubscribeFromTraceUpdates();(0,_ProfilerInterceptor.uninstallProfilerInterceptor)();(0,_ProfilerInterceptor.setComparisonCallback)(null);isFrozen=false;freezeListeners.clear();globalEnabled=false;hook=null;highlightCallback=null;initialized=false;if(typeof window!=="undefined"){delete window.__HIGHLIGHT_UPDATES_CONTROLLER__}debugLog("Destroyed")}const HighlightUpdatesController={subscribe,enable,disable,toggle,isEnabled,setEnabled,initialize,destroy,isInitialized,setHighlightCallback,clearRenderCounts,freeze,unfreeze,toggleFreeze,getFrozen,subscribeToFreeze,setBadgePressCallback,getBadgePressCallback,handleBadgePress,setSpotlightCallback,setSpotlight,getSpotlight,clearDevToolsCache,enableBackgroundTracking,disableBackgroundTracking,isBackgroundTrackingEnabled,setRemoteHandler,replaceRemoteState,locateComponent,setHighlightsSuppressed,getHighlightsSuppressed,setSilentTracking};var _default=exports.default=HighlightUpdatesController;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.fiberFromStateNode=fiberFromStateNode;exports.getComponentSource=getComponentSource;exports.sourceFromFiber=sourceFromFiber;var _utils=require("@buoy-gg/shared-ui/utils");var _screenElements=require("./screenElements");var _tapMatch=require("./tapMatch");const INTERNAL_NAMES=new Set(["View","Text","TextImpl","Image","ScrollView","FlatList","SectionList","Pressable","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","TouchableNativeFeedback","TextInput","Switch","ActivityIndicator","Modal","SafeAreaView","SafeAreaProvider","KeyboardAvoidingView","VirtualizedList","Screen","ScreenContainer","ScreenStack","ScreenContentWrapper","GestureHandlerRootView","GestureDetector","Wrapper"]);function memoParent(e){const t=e.return;const o=t?.elementType??t?.type;return t&&o?.$$typeof===Symbol.for("react.memo")&&(o.type===e.type||o.type===e.elementType)?t:null}function typeInfo(e){let t="";let o=e.tag===14||e.tag===15;let r=e.tag===11;const n=new Set;const s=i=>{if(!i||n.has(i)||n.size>20)return;n.add(i);t||=i.displayName||(typeof i==="function"?i.name:"");if(i.$$typeof===Symbol.for("react.memo")){o=true;s(i.type)}if(i.$$typeof===Symbol.for("react.forward_ref")){r=true;s(i.render)}};s(e.elementType);s(e.type);const a=memoParent(e);if(a)s(a.elementType??a.type);return{name:t||"Anonymous",memo:o,forwardRef:r}}function isUserComponent(e){if(!e||typeof e.type==="string"||![0,1,2,11,14,15].includes(e.tag))return false;const{name:t}=typeInfo(e);const o=e._debugSource?.fileName??"";return!INTERNAL_NAMES.has(t)&&!/^(Animated|RCT|Reanimated|Buoy|DevTools|FloatingDevTools|HighlightUpdates)/.test(t)&&!/[@/]buoy-gg\/|\/react-native\//.test(o)&&!e.memoizedProps?.__buoyDevToolsRoot}function entry(e){const t=typeInfo(e);const o=memoParent(e);const r=e._debugSource??o?._debugSource;if(typeof r?.fileName==="string"&&r.fileName){t.source={fileName:r.fileName};if(Number.isFinite(r.lineNumber))t.source.lineNumber=r.lineNumber;if(Number.isFinite(r.columnNumber))t.source.columnNumber=r.columnNumber}else{const n=e._debugStack??o?._debugStack;if(typeof n?.stack==="string")t.rawStack=n.stack}return t}function definitionOf(e){const t=e.child?[e.child]:[];let o=0;while(t.length&&o++<300){const r=t.shift();if(r._debugOwner===e){const n=r._debugSource;if(typeof n?.fileName==="string"&&n.fileName){return{source:{fileName:n.fileName,...Number.isFinite(n.lineNumber)?{lineNumber:n.lineNumber}:{},...Number.isFinite(n.columnNumber)?{columnNumber:n.columnNumber}:{}}}}if(typeof r._debugStack?.stack==="string")return{rawStack:r._debugStack.stack}}if(r.child)t.push(r.child);if(r.sibling)t.push(r.sibling)}return void 0}function sourceFromFiber(e){const t=[];let o=null;const r=new Set;let n=e;while(n&&!r.has(n)&&r.size<400&&t.length<7){r.add(n);if(isUserComponent(n)){if(!t.length)o=n;t.push(entry(n))}const a=memoParent(n);n=n._debugOwner||a?._debugOwner||a?.return||n.return;if(a&&n===a)n=a._debugOwner||a.return}if(!t.length)return{found:false,reason:"No app component was found for this view."};const s=o?definitionOf(o):void 0;return{found:true,component:s?{...t[0],definedIn:s}:t[0],owners:t.slice(1)}}function fiberFromStateNode(e){return e?.canonical?.internalInstanceHandle||e?._internalInstanceHandle||e?._internalFiberInstanceHandleDEV||(0,_utils.getDOMFiber)(e)||null}function nativeTag(e){return(0,_utils.getDOMNodeHandle)(e)??e?.__nativeTag??e?._nativeTag??e?.nativeTag??e?.canonical?.__nativeTag??e?.canonical?._nativeTag??e?.canonical?.nativeTag??null}const MAX_FIBERS=1e5;function findLiveFiber(e){const t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;const o=[];const r=a=>{try{t?.getFiberRoots?.(a)?.forEach(i=>o.push(i.current))}catch{}};t?.renderers?.forEach((a,i)=>r(i));if(!o.length)r(1);const n=[...o];const s=new Set;while(n.length){if(s.size>=MAX_FIBERS)return{fiber:null,capped:true,any:true};const a=n.pop();if(!a||s.has(a))continue;s.add(a);if(a.sibling)n.push(a.sibling);const i=a.memoizedProps??{};if(a.tag===22&&a.memoizedState!=null||i.__buoyDevToolsRoot||i.activityState===0||i.activityState===1||i.isPageFocused===false||i["aria-hidden"]===true&&(i.activityState!==void 0||"shouldFreeze"in i)||i.isFocused===false&&(i.routeKey!==void 0||"freezeContents"in i))continue;if(e(a))return{fiber:a,capped:false,any:true};if(a.child)n.push(a.child)}return{fiber:null,capped:false,any:o.length>0}}async function getComponentSource(e={}){try{const{nativeTag:t,query:o}=e??{};if(t!==void 0&&(!Number.isInteger(t)||t<0)||o!==void 0&&typeof o!=="string"){return{found:false,reason:"Pass a valid nativeTag or a text query."}}const r=o?.trim();if(t==null&&!r)return{found:false,reason:"Pass a query or nativeTag."};let n=false;let s=false;const a=c=>{const u=findLiveFiber(c);n||=u.capped;s||=u.any;return u.fiber??void 0};const i=c=>a(u=>u.stateNode&&nativeTag(u.stateNode)===c);let l=t!=null?i(t):void 0;if(t==null&&r){l=a(c=>isUserComponent(c)&&typeInfo(c).name.toLowerCase()===r.toLowerCase());if(!l){const c=await(0,_screenElements.describeScreen)({});const u=c.elements.map(d=>({el:d,score:(0,_tapMatch.scoreTapMatch)(d,{query:r})})).filter(({score:d})=>d>0).sort((d,m)=>m.score-d.score);const f=u[0]?.el;if(f?.nativeTag!=null)l=i(f.nativeTag)}}if(!l&&!s)return{found:false,reason:"No React tree was found. Use a dev build."};if(!l){return{found:false,reason:n?"The React tree is too big to search fully, and no view matched in the part searched. Pass the nativeTag from describe_screen.":"No view matched. Check describe_screen for its name or tag."}}return sourceFromFiber(fiberFromStateNode(l.stateNode)??l)}catch{return{found:false,reason:"Could not read the React tree. Try again in a dev build."}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.describeScreen=describeScreen;exports.resolveTouchTarget=resolveTouchTarget;exports.tapElement=tapElement;exports.waitFor=waitFor;var _utils=require("@buoy-gg/shared-ui/utils");var _reactNative=require("react-native");var _tapMatch=require("./tapMatch");const HostComponent=5;const OffscreenComponent=22;const INTERNAL_NAMES=new Set(["View","RCTView","ScrollView","RCTScrollView","RCTScrollContentView","SafeAreaView","RCTSafeAreaView","AndroidHorizontalScrollContentView","KeyboardAvoidingView","Pressable","PlatformPressable","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","TouchableNativeFeedback","AnimatedComponent","Wrapper"]);function getReactDevToolsHook(){if(typeof global==="undefined")return null;return global.__REACT_DEVTOOLS_GLOBAL_HOOK__??null}let commitCount=0;let commitCounterInstalled=false;function ensureCommitCounter(){if(commitCounterInstalled)return;const e=getReactDevToolsHook();if(!e)return;const t=e.onCommitFiberRoot;e.onCommitFiberRoot=function(...n){commitCount++;return typeof t==="function"?t.apply(e,n):void 0};commitCounterInstalled=true}const TAP_SETTLE_MS=250;function makeChromeCheck(){const e=new Map;return t=>{const n=[];let i=t;let l=0;let s=false;while(i&&l<400){const a=e.get(i);if(a!==void 0){s=a;break}if(getProps(i)?.__buoyDevToolsRoot){s=true;e.set(i,true);break}n.push(i);i=i.return;l++}for(const a of n)e.set(a,s);return s}}function getAllFiberRoots(){const e=getReactDevToolsHook();if(!e)return[];const t=[];try{if(e.renderers&&typeof e.renderers.forEach==="function"){e.renderers.forEach((n,i)=>{try{const l=e.getFiberRoots?.(i);if(l)l.forEach(s=>t.push(s))}catch{}})}if(t.length===0&&e.getFiberRoots){const n=e.getFiberRoots(1);if(n)n.forEach(i=>t.push(i))}}catch{}return t}function isHiddenOffscreen(e){return e.tag===OffscreenComponent&&e.memoizedState!==null}function isInactiveScreen(e){const t=e.memoizedProps?.activityState;if(t===0||t===1)return true;if(e.memoizedProps?.isPageFocused===false)return true;return false}function traverseFiberTree(e,t,n=0,i=new Set){if(!e||i.has(e)||n>500)return;i.add(e);if(isHiddenOffscreen(e)||isInactiveScreen(e)){if(e.sibling)traverseFiberTree(e.sibling,t,n,i);return}t(e);if(e.child)traverseFiberTree(e.child,t,n+1,i);if(e.sibling)traverseFiberTree(e.sibling,t,n,i)}function getPublicInstance(e){const t=(0,_utils.getDOMPublicInstance)(e);if(t)return t;if(!e)return null;const n=e;if(n.canonical?.publicInstance)return n.canonical.publicInstance;if(n.canonical&&typeof n.canonical.measure==="function"){return n.canonical}if(typeof n.measure==="function"||typeof n.measureInWindow==="function"){return n}return null}function getNativeTag(e){const t=(0,_utils.getDOMNodeHandle)(e);if(t!==null)return t;if(e==null)return null;const n=e;if(typeof n.__nativeTag==="number")return n.__nativeTag;if(typeof n._nativeTag==="number")return n._nativeTag;if(typeof n.nativeTag==="number")return n.nativeTag;if(n.canonical){if(typeof n.canonical.__nativeTag==="number")return n.canonical.__nativeTag;if(typeof n.canonical._nativeTag==="number")return n.canonical._nativeTag;if(typeof n.canonical.nativeTag==="number")return n.canonical.nativeTag}return null}function findHostInstance(e){const t=getPublicInstance(e.stateNode);if(t){return{instance:t,nativeTag:getNativeTag(e.stateNode),stateNode:e.stateNode}}const n=[];if(e.child)n.push(e.child);let i=0;while(n.length>0&&i<4e3){i++;const l=n.pop();if(!l)continue;const s=getPublicInstance(l.stateNode);if(s)return{instance:s,nativeTag:getNativeTag(l.stateNode),stateNode:l.stateNode};if(l.child)n.push(l.child);if(l.sibling)n.push(l.sibling)}return null}function findScrollAncestor(e){let t=e;let n=0;while(t&&n++<200){const i=t.stateNode;if(i&&typeof i.scrollTo==="function"){const l=typeof i.getNativeScrollRef==="function"&&i.getNativeScrollRef()||null;const s=typeof i.getInnerViewNode==="function"&&i.getInnerViewNode()||typeof i.getScrollableNode==="function"&&i.getScrollableNode()||i;return{instance:i,nativeRef:l,innerNode:s}}t=t.return}return null}async function scrollIntoView(e,t,n,i){try{if((0,_utils.isDOMElement)(n)){n.scrollIntoView({block:"nearest",inline:"nearest",behavior:"instant"});await new Promise(u=>setTimeout(u,16));return true}const l=findScrollAncestor(e);if(!l)return false;const s=t;let a=null;const r=u=>new Promise(o=>{let f=false;const d=m=>{if(f)return;f=true;o(m)};const h=setTimeout(()=>d(null),600);try{u(m=>{clearTimeout(h);d(m)})}catch{clearTimeout(h);d(null)}});if(l.nativeRef&&typeof s.measureLayout==="function"){a=await r(u=>s.measureLayout(l.nativeRef,(o,f)=>u(f),()=>u(null)))}if(a==null){const u=(0,_reactNative.findNodeHandle)(t);const o=typeof l.innerNode==="number"?l.innerNode:(0,_reactNative.findNodeHandle)(l.innerNode);if(u!=null&&o!=null){a=await r(f=>_reactNative.UIManager.measureLayout(u,o,()=>f(null),(d,h)=>f(h)))}}if(a==null)return false;l.instance.scrollTo({y:Math.max(0,a-i),animated:false});await new Promise(u=>setTimeout(u,120));return true}catch{return false}}function getComponentName(e){const t=e?.type;if(!t)return null;if(typeof t==="string")return t;return t.displayName||t.name||null}function getOwningComponentName(e){let t=e?._debugOwner||e?.return;let n=0;while(t&&n<30){n++;const i=getComponentName(t);if(i&&!INTERNAL_NAMES.has(i)&&typeof t.type!=="string"){return i}t=t.return}return null}function getProps(e){return(0,_utils.getDOMControlProps)(e?.stateNode,e?.memoizedProps??e?.pendingProps??null)}function flattenText(e,t=0){if(typeof e==="string")return e;if(typeof e==="number"&&Number.isFinite(e))return String(e);if(Array.isArray(e)&&t<4){const n=[];for(const i of e){const l=flattenText(i,t+1);if(l)n.push(l)}return n.length>0?n.join(""):void 0}return void 0}function normalizeVisibleText(e){return e.replace(/\s+/g," ").trim()}function getVisibleText(e){if(!e)return void 0;const t=n=>{const i=flattenText(n);if(i===void 0)return void 0;const l=normalizeVisibleText(i);return l?l.slice(0,80):void 0};return t(e.children)??t(e.title)??t(e.label)??t(e.placeholder)??void 0}function collectDescendantText(e,t){const n=[];const i=(s,a)=>{if(!s||a>t||n.length>=4)return;if(s!==e){const u=getProps(s);if(u&&(typeof u.onPress==="function"||typeof u.onLongPress==="function"))return}const r=getVisibleText(getProps(s));if(r&&!n.includes(r))n.push(r);if(s.child)i(s.child,a+1);if(s!==e&&s.sibling)i(s.sibling,a)};if(e.child)i(e.child,1);const l=n.join(" ").trim();return l?l.slice(0,80):void 0}function findPressHandler(e){let t=e;let n=0;let i=null;let l=null;while(t&&n<25&&!(i&&l)){const s=getProps(t);if(s){if(!i&&typeof s.onPress==="function")i=s.onPress;if(!l&&typeof s.onLongPress==="function")l=s.onLongPress}t=t.return;n++}if(i)return{handler:i,kind:"onPress",longPress:l??void 0};return l?{handler:l,kind:"onLongPress"}:null}function measureInstance(e){return new Promise(t=>{let n=false;const i=l=>{if(n)return;n=true;t(l)};setTimeout(()=>i(null),1e3);try{if(typeof e.measureInWindow==="function"){e.measureInWindow((l,s,a,r)=>{if(a>0&&r>0)i({x:l,y:s,width:a,height:r});else i(null)})}else if(typeof e.measure==="function"){e.measure((l,s,a,r,u,o)=>{if(a>0&&r>0&&u!=null&&o!=null){i({x:u,y:o,width:a,height:r})}else{i(null)}})}else{i(null)}}catch{i(null)}})}const SPINNER_HOSTS=new Set(["RCTActivityIndicatorView","AndroidProgressBar"]);function collectCandidates(){const e=getAllFiberRoots();if(e.length===0)return[];const t=[];const n=new Map;const i=new Map;const l=makeChromeCheck();for(const s of e){traverseFiberTree(s.current,a=>{const r=getProps(a);if(!r)return;const u=typeof r.onPress==="function"||typeof r.onLongPress==="function";const o=typeof r.onValueChange==="function";const f=typeof r.onChangeText==="function";const d=r.testID||void 0;const h=r.accessibilityLabel||void 0;const m=r.accessibilityRole||r.role||void 0;let p=getVisibleText(r);const w=m==="button"||m==="link"||m==="menuitem"||m==="tab"||m==="switch"||m==="checkbox";const T=typeof a.type==="string"&&SPINNER_HOSTS.has(a.type)&&r.animating!==false;if(!u&&!o&&!f&&!d&&!h&&!p&&!w&&!T){return}let x=null;let c=null;let g=null;if(o){const _=r.value;const D=typeof _==="number"||typeof r.minimumValue==="number";c={handler:r.onValueChange,kind:D?"slider":"toggle",current:_,min:typeof r.minimumValue==="number"?r.minimumValue:void 0,max:typeof r.maximumValue==="number"?r.maximumValue:void 0}}else if(f){g={handler:r.onChangeText,current:typeof r.value==="string"?r.value:void 0}}else{x=findPressHandler(a)}const v=getComponentName(a);let I=v??"Unknown";if(!v||INTERNAL_NAMES.has(v)||typeof a.type==="string"){I=getOwningComponentName(a)??v??"Unknown"}const C=findHostInstance(a);if(!C&&!d)return;if(!p&&!h&&u){p=collectDescendantText(a,6)}const b=C?.instance??null;const P=C?.nativeTag??null;const y=(b?n.get(b):void 0)??(P!=null?i.get(P):void 0);if(y){if(!y.press&&x)y.press=x;else if(y.press&&x?.longPress&&!y.press.longPress){y.press.longPress=x.longPress}if(!y.valueControl&&c)y.valueControl=c;if(!y.textControl&&g)y.textControl=g;if(!y.testID&&d)y.testID=d;if(!y.label&&h)y.label=h;if(!y.text&&p)y.text=p;if(b&&!n.has(b))n.set(b,y);if(P!=null&&!i.has(P))i.set(P,y);return}const S={nativeTag:P,name:I,role:m??(T?"progressbar":void 0),testID:d,label:h,text:p,instance:b,stateNode:C?.stateNode??null,fiber:a,press:x,valueControl:c,textControl:g,rect:null,buoy:l(a)};t.push(S);if(b)n.set(b,S);if(P!=null)i.set(P,S)})}return t}function explicitlyTargets(e,t){if(t.nativeTag!=null)return e.nativeTag===t.nativeTag;if(t.testID&&e.testID)return e.testID.toLowerCase()===t.testID.toLowerCase();return false}function appCandidates(e){const t=collectCandidates();if(e.includeBuoy)return t;return t.filter(n=>!n.buoy||explicitlyTargets(n,e))}async function measureCandidates(e){await Promise.all(e.map(async t=>{if(t.instance)t.rect=await measureInstance(t.instance)}))}const LIST_WRAPPERS=/^(FlatList|SectionList|VirtualizedSectionList|VirtualizedList|Animated\(.*\)|AnimatedComponent.*)$/;async function collectLists(e,t){const n=[];const i=makeChromeCheck();for(const s of getAllFiberRoots()){traverseFiberTree(s.current,a=>{if(getComponentName(a)!=="VirtualizedList")return;const r=a.memoizedProps;if(!r||typeof r.getItemCount!=="function")return;if(!e&&i(a))return;let u;try{u=Number(r.getItemCount(r.data))}catch{return}if(!Number.isFinite(u)||u<=0)return;const o=[];const f=(m,p)=>{for(let w=m?.child;w;w=w.sibling){const T=getComponentName(w);if(T==="VirtualizedList")continue;if(T==="CellRenderer"){o.push(w);continue}if(p<40)f(w,p+1)}};f(a,0);let d=a;let h=getOwningComponentName(d);for(let m=0;m<6&&h&&LIST_WRAPPERS.test(h);m++){d=d._debugOwner||d.return;h=getOwningComponentName(d)}n.push({owner:h,items:u,cells:o})})}const l=[];for(const s of n){const a=await Promise.all(s.cells.map(async u=>{const o=findHostInstance(u);return o?measureInstance(o.instance):null}));const r=a.filter(t).length;if(r>0&&s.items>r)l.push({owner:s.owner,items:s.items,listed:r})}return l}async function describeScreen(e={}){const t=collectCandidates();const n=e.includeBuoy?t:t.filter(o=>!o.buoy);const i=t.length-n.length;await measureCandidates(n);const l=_reactNative.Dimensions.get("window");const s=Math.round(l.width)||1;const a=Math.round(l.height)||1;const r=[];for(const o of n){const f=o.rect;if(!f&&!o.testID)continue;let d;let h;if(f){const w=f.x+f.width/2;const T=f.y+f.height/2;if(T<-a*.1||T>a*1.1||w<-s*.1||w>s*1.1){continue}d={x:round2(w/s),y:round2(T/a)};h={x:round2(f.x/s),y:round2(f.y/a),width:round2(f.width/s),height:round2(f.height/a)}}const m=o.valueControl?o.valueControl.kind:o.textControl?"text":void 0;const p=o.valueControl?o.valueControl.current:o.textControl?.current;r.push({nativeTag:o.nativeTag,name:o.name,role:o.role,testID:o.testID,label:o.label,text:o.text,interactive:!!(o.press||o.valueControl||o.textControl),longPressable:o.press&&(o.press.kind==="onLongPress"||o.press.longPress)?true:void 0,control:m,value:p,tap:d,frame:h})}r.sort((o,f)=>{const d=o.tap?.y??2;const h=f.tap?.y??2;if(Math.abs(d-h)>.02)return d-h;return(o.tap?.x??2)-(f.tap?.x??2)});const u=await collectLists(!!e.includeBuoy,o=>{if(!o)return false;const f=o.x+o.width/2;return o.y<=a*1.1&&o.y+o.height>=-a*.1&&f>=-s*.1&&f<=s*1.1});return{screen:{width:s,height:a},count:r.length,elements:r,...i>0?{hiddenBuoy:i}:{},...u.length?{lists:u}:{}}}function round2(e){return Math.round(e*100)/100}function fieldsOf(e){return{nativeTag:e.nativeTag,testID:e.testID,label:e.label,text:e.text,name:e.name}}function matchScore(e,t){return(0,_tapMatch.scoreTapMatch)(fieldsOf(e),t)}function tapPoint(e,t,n){if(!e||!t||!n)return void 0;return{x:(e.x+e.width/2)/t,y:(e.y+e.height/2)/n}}function makeSyntheticPressEvent(e){const t=e?e.x+e.width/2:0;const n=e?e.y+e.height/2:0;const i={locationX:e?e.width/2:0,locationY:e?e.height/2:0,pageX:t,pageY:n,timestamp:0,target:null,identifier:1,touches:[],changedTouches:[]};return{nativeEvent:i,persist:()=>{},preventDefault:()=>{},stopPropagation:()=>{},isDefaultPrevented:()=>false,isPropagationStopped:()=>false,target:null,currentTarget:null,type:"press",timeStamp:0}}async function tapElement(e){const t=appCandidates(e);if(t.length===0){return{tapped:false,reason:"No React fiber roots / elements found on screen."}}const n=t.map(c=>({c,score:matchScore(c,e)})).filter(c=>c.score>0).sort((c,g)=>g.score-c.score);const i=c=>!!(c.press||c.valueControl||c.textControl);if(n.length===0){return{tapped:false,reason:"No element matched. Call describe_screen to see available elements (match by testID, text, or name).",candidates:t.filter(i).slice(0,12).map(c=>({nativeTag:c.nativeTag,name:c.name,testID:c.testID,text:c.text}))}}const l=_reactNative.Dimensions.get("window");const s=l.width||1;const a=l.height||1;const r=n.slice(0,15);await Promise.all(r.map(async c=>{if(c.c.instance&&!c.c.rect)c.c.rect=await measureInstance(c.c.instance)}));for(const c of r){c.score=(0,_tapMatch.scoreTapMatch)({...fieldsOf(c.c),tap:tapPoint(c.c.rect,s,a)},e)}r.sort((c,g)=>g.score-c.score);const u=r.find(c=>i(c.c))??n.find(c=>i(c.c))??r[0];const o=u.c;const f=(c,g)=>c.press&&c.press.handler===g.press?.handler||c.valueControl&&c.valueControl.handler===g.valueControl?.handler||c.textControl&&c.textControl.handler===g.textControl?.handler;const d=r.filter(c=>c!==u&&i(c.c)&&c.score===u.score).filter(c=>!f(c.c,o)).filter((c,g,v)=>v.findIndex(I=>f(I.c,c.c))===g).slice(0,3).map(c=>({nativeTag:c.c.nativeTag,name:c.c.name,testID:c.c.testID,text:c.c.text,tap:tapPoint(c.c.rect,s,a)}));if(!i(o)){return{tapped:false,reason:`Matched "${o.name}"${o.text?` ("${o.text}")`:""} but it has no onPress / onValueChange / onChangeText handler (e.g. a react-native-gesture-handler GestureDetector). This element can't be driven in JS.`,matched:{nativeTag:o.nativeTag,name:o.name,testID:o.testID,label:o.label,text:o.text,via:"onPress"}}}if(o.instance&&!o.rect)o.rect=await measureInstance(o.instance);let h=false;const m=o.rect==null||!(0,_tapMatch.isRectCenterOnScreen)(o.rect,s,a);if(m&&e.scrollIntoView!==false&&o.instance){h=await scrollIntoView(o.fiber,o.instance,o.stateNode,80);if(h)o.rect=await measureInstance(o.instance)}const p={nativeTag:o.nativeTag,name:o.name,testID:o.testID,label:o.label,text:o.text};ensureCommitCounter();const w=commitCount;const T=Date.now();const x=async c=>{await new Promise(g=>setTimeout(g,TAP_SETTLE_MS));return{tapped:true,scrolled:h,matched:c,effect:{commits:commitCount-w,observedMs:Date.now()-T},...d.length?{alsoMatched:d}:{}}};try{if(o.press){if(e.longPress){const g=o.press.kind==="onLongPress"?o.press.handler:o.press.longPress;if(!g){return{tapped:false,scrolled:h,reason:`Matched "${o.name}"${o.text?` ("${o.text}")`:""} but it has no onLongPress handler \u2014 call tap_element without longPress to tap it normally.`,matched:{...p,via:"onPress"}}}g(makeSyntheticPressEvent(o.rect));return await x({...p,via:"onLongPress"})}o.press.handler(makeSyntheticPressEvent(o.rect));return await x({...p,via:o.press.kind})}if(o.valueControl){const g=o.valueControl;let v;if(g.kind==="toggle"){v=typeof e.value==="boolean"?e.value:!g.current}else{const I=g.min??0;const C=g.max??1;if(typeof e.value==="number"){v=Math.min(C,Math.max(I,e.value))}else{v=g.current===C?I:C}}g.handler(v);return await x({...p,via:"onValueChange",value:v})}const c=e.text??(typeof e.value==="string"?e.value:"");o.textControl.handler(c);return await x({...p,via:"onChangeText",value:c})}catch(c){return{tapped:false,scrolled:h,reason:`handler threw: ${c instanceof Error?c.message:String(c)}`,matched:{...p,via:o.press?o.press.kind:o.valueControl?"onValueChange":"onChangeText"}}}}const WAIT_DEFAULT_MS=5e3;const WAIT_MAX_MS=3e4;const WAIT_MIN_POLL_MS=50;const WAIT_DEFAULT_POLL_MS=150;async function waitFor(e){const t=e.nativeTag!=null||!!String(e.testID??"").trim()||!!String(e.query??"").trim();if(!t){return{ok:false,waitedMs:0,polls:0,reason:"Nothing to wait for \u2014 pass nativeTag, testID or query."}}const n=Math.min(Math.max(e.timeoutMs??WAIT_DEFAULT_MS,0),WAIT_MAX_MS);const i=Math.max(e.pollMs??WAIT_DEFAULT_POLL_MS,WAIT_MIN_POLL_MS);const l=e.gone===true;const s=Date.now();let a=0;for(;;){a+=1;const{hit:r,closest:u}=await findOnScreen(e);if(l?!r:!!r){return{ok:true,waitedMs:Date.now()-s,polls:a,matched:r??void 0}}if(Date.now()-s>=n){const o=u?.length?u:void 0;const f=l?`Still on screen after ${n}ms.`:o?`Not on screen after ${n}ms \u2014 ${o.length===1?"one element":`${o.length} elements`} matched but ${o.some(d=>d.onScreen)?"not well enough":"none is visible"}. See \`closest\`; do not retry with different words, call describeScreen.`:`Not on screen after ${n}ms, and nothing matched those words at all. Call describeScreen to see what is there.`;return{ok:false,waitedMs:Date.now()-s,polls:a,reason:f,matched:r??void 0,closest:o}}await new Promise(o=>setTimeout(o,i))}}async function findOnScreen(e){const t=appCandidates(e).map(r=>({c:r,score:matchScore(r,e)})).filter(r=>r.score>0).sort((r,u)=>u.score-r.score).slice(0,8);if(t.length===0)return{hit:null,closest:void 0};await measureCandidates(t.map(r=>r.c));const n=_reactNative.Dimensions.get("window");const i=Math.round(n.width)||1;const l=Math.round(n.height)||1;let s=null;for(const{c:r}of t){if(!(0,_tapMatch.isRectCenterOnScreen)(r.rect,i,l))continue;s={nativeTag:r.nativeTag,name:r.name,testID:r.testID,label:r.label,text:r.text,interactive:!!(r.press||r.valueControl||r.textControl)};break}const a=t.slice(0,3).map(({c:r})=>({name:r.name,testID:r.testID,text:r.text,onScreen:(0,_tapMatch.isRectCenterOnScreen)(r.rect,i,l)}));return{hit:s,closest:a}}function isBuoyChrome(e){let t=e;let n=0;while(t&&n<400){if(getProps(t)?.__buoyDevToolsRoot)return true;t=t.return;n++}return false}function preferHandlerOwner(e,t){const n=getProps(e.fiber);if(typeof n?.onPress==="function"||typeof n?.onValueChange==="function"||typeof n?.onChangeText==="function"){return e}let i=null;let l=e.fiber?.return;let s=0;while(l&&s<25){if(typeof getProps(l)?.onPress==="function"){i=l;break}l=l.return;s++}if(!i)return e;let a=i;for(let r=0;r<6&&a;r++){const u=t.get(a);if(u)return u;a=a.return}return e}function resolveTouchTarget(e){const t=collectCandidates();if(t.length===0)return null;const n=new Map;for(const r of t)n.set(r.fiber,r);const i=t.find(r=>r.nativeTag===e);let l=null;if(!i){for(const r of getAllFiberRoots()){traverseFiberTree(r.current,u=>{if(l)return;if(u.stateNode&&getNativeTag(u.stateNode)===e){l=u}});if(l)break}}let s=i??null;if(!s&&l){let r=l;let u=0;let o=null;while(r&&u<25){const f=n.get(r);if(f){if(f.press||f.valueControl||f.textControl){s=f;break}if(!o)o=f}r=r.return;u++}if(!s)s=o}if(!s)return null;s=preferHandlerOwner(s,n);if(!s.press&&!s.valueControl&&!s.textControl)return null;if(isBuoyChrome(s.fiber))return null;const a=s.valueControl?s.valueControl.kind:s.textControl?"text":"press";return{nativeTag:s.nativeTag,name:s.name,role:s.role,testID:s.testID,label:s.label,text:s.text,control:a,value:s.valueControl?s.valueControl.current:s.textControl?s.textControl.current:void 0}}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.describeScreen=describeScreen;exports.resolveTouchTarget=resolveTouchTarget;exports.tapElement=tapElement;exports.waitFor=waitFor;var _utils=require("@buoy-gg/shared-ui/utils");var _reactNative=require("react-native");var _tapMatch=require("./tapMatch");const HostComponent=5;const OffscreenComponent=22;const INTERNAL_NAMES=new Set(["View","RCTView","ScrollView","RCTScrollView","RCTScrollContentView","SafeAreaView","RCTSafeAreaView","AndroidHorizontalScrollContentView","KeyboardAvoidingView","Pressable","PlatformPressable","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","TouchableNativeFeedback","AnimatedComponent","Wrapper"]);function getReactDevToolsHook(){if(typeof global==="undefined")return null;return global.__REACT_DEVTOOLS_GLOBAL_HOOK__??null}let commitCount=0;let commitCounterInstalled=false;function ensureCommitCounter(){if(commitCounterInstalled)return;const e=getReactDevToolsHook();if(!e)return;const t=e.onCommitFiberRoot;e.onCommitFiberRoot=function(...n){commitCount++;return typeof t==="function"?t.apply(e,n):void 0};commitCounterInstalled=true}const TAP_SETTLE_MS=250;function makeChromeCheck(){const e=new Map;return t=>{const n=[];let r=t;let a=0;let s=false;while(r&&a<400){const c=e.get(r);if(c!==void 0){s=c;break}if(getProps(r)?.__buoyDevToolsRoot){s=true;e.set(r,true);break}n.push(r);r=r.return;a++}for(const c of n)e.set(c,s);return s}}function getAllFiberRoots(){const e=getReactDevToolsHook();if(!e)return[];const t=[];try{if(e.renderers&&typeof e.renderers.forEach==="function"){e.renderers.forEach((n,r)=>{try{const a=e.getFiberRoots?.(r);if(a)a.forEach(s=>t.push(s))}catch{}})}if(t.length===0&&e.getFiberRoots){const n=e.getFiberRoots(1);if(n)n.forEach(r=>t.push(r))}}catch{}return t}function isHiddenOffscreen(e){return e.tag===OffscreenComponent&&e.memoizedState!==null}let includeHiddenScreens=false;let prunedHiddenScreens=0;let fullVisibleText=false;function withHiddenScreens(e,t){const n=includeHiddenScreens;includeHiddenScreens=e;try{return t()}finally{includeHiddenScreens=n}}function isNotShowingScreen(e){const t=e.memoizedProps;if(!t)return false;if(t["aria-hidden"]===true&&(t.activityState!==void 0||"shouldFreeze"in t))return true;if(t.isFocused===false&&(t.routeKey!==void 0||"freezeContents"in t))return true;return false}function isInactiveScreen(e){const t=e.memoizedProps?.activityState;if(t===0||t===1)return true;if(e.memoizedProps?.isPageFocused===false)return true;if(!includeHiddenScreens&&isNotShowingScreen(e)){prunedHiddenScreens++;return true}return false}function traverseFiberTree(e,t,n=0,r=new Set){if(!e||r.has(e)||n>500)return;r.add(e);if(isHiddenOffscreen(e)||isInactiveScreen(e)){if(e.sibling)traverseFiberTree(e.sibling,t,n,r);return}t(e);if(e.child)traverseFiberTree(e.child,t,n+1,r);if(e.sibling)traverseFiberTree(e.sibling,t,n,r)}function getPublicInstance(e){const t=(0,_utils.getDOMPublicInstance)(e);if(t)return t;if(!e)return null;const n=e;if(n.canonical?.publicInstance)return n.canonical.publicInstance;if(n.canonical&&typeof n.canonical.measure==="function"){return n.canonical}if(typeof n.measure==="function"||typeof n.measureInWindow==="function"){return n}return null}function getNativeTag(e){const t=(0,_utils.getDOMNodeHandle)(e);if(t!==null)return t;if(e==null)return null;const n=e;if(typeof n.__nativeTag==="number")return n.__nativeTag;if(typeof n._nativeTag==="number")return n._nativeTag;if(typeof n.nativeTag==="number")return n.nativeTag;if(n.canonical){if(typeof n.canonical.__nativeTag==="number")return n.canonical.__nativeTag;if(typeof n.canonical._nativeTag==="number")return n.canonical._nativeTag;if(typeof n.canonical.nativeTag==="number")return n.canonical.nativeTag}return null}function findHostInstance(e){const t=getPublicInstance(e.stateNode);if(t){return{instance:t,nativeTag:getNativeTag(e.stateNode),stateNode:e.stateNode}}const n=[];if(e.child)n.push(e.child);let r=0;while(n.length>0&&r<4e3){r++;const a=n.pop();if(!a)continue;const s=getPublicInstance(a.stateNode);if(s)return{instance:s,nativeTag:getNativeTag(a.stateNode),stateNode:a.stateNode};if(a.child)n.push(a.child);if(a.sibling)n.push(a.sibling)}return null}function findScrollAncestor(e){let t=e;let n=0;while(t&&n++<200){const r=t.stateNode;if(r&&typeof r.scrollTo==="function"){const a=typeof r.getNativeScrollRef==="function"&&r.getNativeScrollRef()||null;const s=typeof r.getInnerViewNode==="function"&&r.getInnerViewNode()||typeof r.getScrollableNode==="function"&&r.getScrollableNode()||r;return{instance:r,nativeRef:a,innerNode:s}}t=t.return}return null}async function scrollIntoView(e,t,n,r){try{if((0,_utils.isDOMElement)(n)){n.scrollIntoView({block:"nearest",inline:"nearest",behavior:"instant"});await new Promise(f=>setTimeout(f,16));return true}const a=findScrollAncestor(e);if(!a)return false;const s=t;let c=null;const o=f=>new Promise(i=>{let u=false;const d=g=>{if(u)return;u=true;i(g)};const m=setTimeout(()=>d(null),600);try{f(g=>{clearTimeout(m);d(g)})}catch{clearTimeout(m);d(null)}});if(a.nativeRef&&typeof s.measureLayout==="function"){c=await o(f=>s.measureLayout(a.nativeRef,(i,u)=>f(u),()=>f(null)))}if(c==null){const f=(0,_reactNative.findNodeHandle)(t);const i=typeof a.innerNode==="number"?a.innerNode:(0,_reactNative.findNodeHandle)(a.innerNode);if(f!=null&&i!=null){c=await o(u=>_reactNative.UIManager.measureLayout(f,i,()=>u(null),(d,m)=>u(m)))}}if(c==null)return false;a.instance.scrollTo({y:Math.max(0,c-r),animated:false});await new Promise(f=>setTimeout(f,120));return true}catch{return false}}function getComponentName(e){const t=e?.type;if(!t)return null;if(typeof t==="string")return t;return t.displayName||t.name||null}function getOwningComponentName(e){let t=e?._debugOwner||e?.return;let n=0;while(t&&n<30){n++;const r=getComponentName(t);if(r&&!INTERNAL_NAMES.has(r)&&typeof t.type!=="string"){return r}t=t.return}return null}function getProps(e){return(0,_utils.getDOMControlProps)(e?.stateNode,e?.memoizedProps??e?.pendingProps??null)}function flattenText(e,t=0){if(typeof e==="string")return e;if(typeof e==="number"&&Number.isFinite(e))return String(e);if(Array.isArray(e)&&t<4){const n=[];for(const r of e){const a=flattenText(r,t+1);if(a)n.push(a)}return n.length>0?n.join(""):void 0}return void 0}function normalizeVisibleText(e){return e.replace(/\s+/g," ").trim()}function getVisibleText(e){if(!e)return void 0;const t=n=>{const r=flattenText(n);if(r===void 0)return void 0;const a=normalizeVisibleText(r);return a?fullVisibleText?a:a.slice(0,80):void 0};return t(e.children)??t(e.title)??t(e.label)??t(e.placeholder)??void 0}function collectDescendantText(e,t){const n=[];const r=(s,c)=>{if(!s||c>t||n.length>=4)return;if(s!==e){const f=getProps(s);if(f&&(typeof f.onPress==="function"||typeof f.onLongPress==="function"))return}const o=getVisibleText(getProps(s));if(o&&!n.includes(o))n.push(o);if(s.child)r(s.child,c+1);if(s!==e&&s.sibling)r(s.sibling,c)};if(e.child)r(e.child,1);const a=n.join(" ").trim();return a?a.slice(0,80):void 0}function findPressHandler(e){let t=e;let n=0;let r=null;let a=null;while(t&&n<25&&!(r&&a)){const s=getProps(t);if(s){if(!r&&typeof s.onPress==="function")r=s.onPress;if(!a&&typeof s.onLongPress==="function")a=s.onLongPress}t=t.return;n++}if(r)return{handler:r,kind:"onPress",longPress:a??void 0};return a?{handler:a,kind:"onLongPress"}:null}function measureInstance(e){return new Promise(t=>{let n=false;const r=a=>{if(n)return;n=true;t(a)};setTimeout(()=>r(null),1e3);try{if(typeof e.measureInWindow==="function"){e.measureInWindow((a,s,c,o)=>{if(c>0&&o>0)r({x:a,y:s,width:c,height:o});else r(null)})}else if(typeof e.measure==="function"){e.measure((a,s,c,o,f,i)=>{if(c>0&&o>0&&f!=null&&i!=null){r({x:f,y:i,width:c,height:o})}else{r(null)}})}else{r(null)}}catch{r(null)}})}const SPINNER_HOSTS=new Set(["RCTActivityIndicatorView","AndroidProgressBar"]);function collectCandidates(){const e=getAllFiberRoots();if(e.length===0)return[];const t=[];const n=new Map;const r=new Map;const a=makeChromeCheck();for(const s of e){traverseFiberTree(s.current,c=>{const o=getProps(c);if(!o)return;const f=typeof o.onPress==="function"||typeof o.onLongPress==="function";const i=typeof o.onValueChange==="function";const u=typeof o.onChangeText==="function";const d=o.testID||void 0;const m=o.accessibilityLabel||void 0;const g=o.accessibilityRole||o.role||void 0;let y=getVisibleText(o);const x=g==="button"||g==="link"||g==="menuitem"||g==="tab"||g==="switch"||g==="checkbox";const w=typeof c.type==="string"&&SPINNER_HOSTS.has(c.type)&&o.animating!==false;if(!f&&!i&&!u&&!d&&!m&&!y&&!x&&!w){return}let C=null;let P=null;let I=null;if(i){const D=o.value;const _=typeof D==="number"||typeof o.minimumValue==="number";P={handler:o.onValueChange,kind:_?"slider":"toggle",current:D,min:typeof o.minimumValue==="number"?o.minimumValue:void 0,max:typeof o.maximumValue==="number"?o.maximumValue:void 0}}else if(u){I={handler:o.onChangeText,current:typeof o.value==="string"?o.value:void 0}}else{C=findPressHandler(c)}const l=getComponentName(c);let h=l??"Unknown";if(!l||INTERNAL_NAMES.has(l)||typeof c.type==="string"){h=getOwningComponentName(c)??l??"Unknown"}const v=findHostInstance(c);if(!v&&!d)return;if(!y&&!m&&f){y=collectDescendantText(c,6)}const T=v?.instance??null;const b=v?.nativeTag??null;const p=(T?n.get(T):void 0)??(b!=null?r.get(b):void 0);if(p){if(!p.press&&C)p.press=C;else if(p.press&&C?.longPress&&!p.press.longPress){p.press.longPress=C.longPress}if(!p.valueControl&&P)p.valueControl=P;if(!p.textControl&&I)p.textControl=I;if(!p.testID&&d)p.testID=d;if(!p.label&&m)p.label=m;if(!p.text&&y)p.text=y;if(T&&!n.has(T))n.set(T,p);if(b!=null&&!r.has(b))r.set(b,p);return}const S={nativeTag:b,name:h,role:g??(w?"progressbar":void 0),testID:d,label:m,text:y,instance:T,stateNode:v?.stateNode??null,fiber:c,press:C,valueControl:P,textControl:I,rect:null,buoy:a(c)};t.push(S);if(T)n.set(T,S);if(b!=null)r.set(b,S)})}return t}function explicitlyTargets(e,t){if(t.nativeTag!=null)return e.nativeTag===t.nativeTag;if(t.testID&&e.testID)return e.testID.toLowerCase()===t.testID.toLowerCase();return false}function appCandidates(e){const t=collectCandidates();if(e.includeBuoy)return t;return t.filter(n=>!n.buoy||explicitlyTargets(n,e))}async function measureCandidates(e){await Promise.all(e.map(async t=>{if(t.instance)t.rect=await measureInstance(t.instance)}))}const LIST_WRAPPERS=/^(FlatList|SectionList|VirtualizedSectionList|VirtualizedList|Animated\(.*\)|AnimatedComponent.*)$/;async function collectLists(e,t){const n=[];const r=makeChromeCheck();for(const s of getAllFiberRoots()){traverseFiberTree(s.current,c=>{if(getComponentName(c)!=="VirtualizedList")return;const o=c.memoizedProps;if(!o||typeof o.getItemCount!=="function")return;if(!e&&r(c))return;let f;try{f=Number(o.getItemCount(o.data))}catch{return}if(!Number.isFinite(f)||f<=0)return;const i=[];const u=(g,y)=>{for(let x=g?.child;x;x=x.sibling){const w=getComponentName(x);if(w==="VirtualizedList")continue;if(w==="CellRenderer"){i.push(x);continue}if(y<40)u(x,y+1)}};u(c,0);let d=c;let m=getOwningComponentName(d);for(let g=0;g<6&&m&&LIST_WRAPPERS.test(m);g++){d=d._debugOwner||d.return;m=getOwningComponentName(d)}n.push({owner:m,items:f,cells:i})})}const a=[];for(const s of n){const c=await Promise.all(s.cells.map(async f=>{const i=findHostInstance(f);return i?measureInstance(i.instance):null}));const o=c.filter(t).length;if(o>0&&s.items>o)a.push({owner:s.owner,items:s.items,listed:o})}return a}async function describeScreen(e={}){const t=includeHiddenScreens;const n=fullVisibleText;includeHiddenScreens=!!e.includeHidden;fullVisibleText=!!e.fullText;try{return await describeScreenInner(e)}finally{includeHiddenScreens=t;fullVisibleText=n}}async function describeScreenInner(e){prunedHiddenScreens=0;const t=collectCandidates();const n=prunedHiddenScreens;const r=e.includeBuoy?t:t.filter(u=>!u.buoy);const a=t.length-r.length;await measureCandidates(r);const s=_reactNative.Dimensions.get("window");const c=Math.round(s.width)||1;const o=Math.round(s.height)||1;const f=[];for(const u of r){const d=u.rect;if(!d&&!u.testID)continue;let m;let g;if(d){const w=d.x+d.width/2;const C=d.y+d.height/2;if(C<-o*.1||C>o*1.1||w<-c*.1||w>c*1.1){continue}m={x:round2(w/c),y:round2(C/o)};g={x:round2(d.x/c),y:round2(d.y/o),width:round2(d.width/c),height:round2(d.height/o)}}const y=u.valueControl?u.valueControl.kind:u.textControl?"text":void 0;const x=u.valueControl?u.valueControl.current:u.textControl?.current;f.push({nativeTag:u.nativeTag,name:u.name,role:u.role,testID:u.testID,label:u.label,text:u.text,interactive:!!(u.press||u.valueControl||u.textControl),longPressable:u.press&&(u.press.kind==="onLongPress"||u.press.longPress)?true:void 0,control:y,value:x,tap:m,frame:g})}f.sort((u,d)=>{const m=u.tap?.y??2;const g=d.tap?.y??2;if(Math.abs(m-g)>.02)return m-g;return(u.tap?.x??2)-(d.tap?.x??2)});const i=await collectLists(!!e.includeBuoy,u=>{if(!u)return false;const d=u.x+u.width/2;return u.y<=o*1.1&&u.y+u.height>=-o*.1&&d>=-c*.1&&d<=c*1.1});return{screen:{width:c,height:o},count:f.length,elements:f,...a>0?{hiddenBuoy:a}:{},...n>0?{hiddenScreens:n}:{},...i.length?{lists:i}:{}}}function round2(e){return Math.round(e*100)/100}function fieldsOf(e){return{nativeTag:e.nativeTag,testID:e.testID,label:e.label,text:e.text,name:e.name}}function matchScore(e,t){return(0,_tapMatch.scoreTapMatch)(fieldsOf(e),t)}function tapPoint(e,t,n){if(!e||!t||!n)return void 0;return{x:(e.x+e.width/2)/t,y:(e.y+e.height/2)/n}}function makeSyntheticPressEvent(e){const t=e?e.x+e.width/2:0;const n=e?e.y+e.height/2:0;const r={locationX:e?e.width/2:0,locationY:e?e.height/2:0,pageX:t,pageY:n,timestamp:0,target:null,identifier:1,touches:[],changedTouches:[]};return{nativeEvent:r,persist:()=>{},preventDefault:()=>{},stopPropagation:()=>{},isDefaultPrevented:()=>false,isPropagationStopped:()=>false,target:null,currentTarget:null,type:"press",timeStamp:0}}async function tapElement(e){const t=withHiddenScreens(!!e.includeHidden,()=>appCandidates(e));if(t.length===0){return{tapped:false,reason:"No React fiber roots / elements found on screen."}}const n=t.map(l=>({c:l,score:matchScore(l,e)})).filter(l=>l.score>0).sort((l,h)=>h.score-l.score);const r=l=>!!(l.press||l.valueControl||l.textControl);if(n.length===0&&!e.includeHidden){const l=withHiddenScreens(true,()=>appCandidates(e)).map(h=>({c:h,score:matchScore(h,e)})).filter(h=>h.score>0);if(l.length>0){return{tapped:false,reason:"That element is only on a screen that isn't showing (another tab, or a screen under the current one). Navigate to it first, or pass includeHidden:true if you really mean the hidden one."}}}if(n.length===0){return{tapped:false,reason:"No element matched. Call describe_screen to see available elements (match by testID, text, or name).",candidates:t.filter(r).slice(0,12).map(l=>({nativeTag:l.nativeTag,name:l.name,testID:l.testID,text:l.text}))}}const a=_reactNative.Dimensions.get("window");const s=a.width||1;const c=a.height||1;const o=n.slice(0,15);await Promise.all(o.map(async l=>{if(l.c.instance&&!l.c.rect)l.c.rect=await measureInstance(l.c.instance)}));for(const l of o){l.score=(0,_tapMatch.scoreTapMatch)({...fieldsOf(l.c),tap:tapPoint(l.c.rect,s,c)},e)}o.sort((l,h)=>h.score-l.score);const f=o.find(l=>r(l.c))??n.find(l=>r(l.c))??o[0];const i=f.c;const u=(l,h)=>l.press&&l.press.handler===h.press?.handler||l.valueControl&&l.valueControl.handler===h.valueControl?.handler||l.textControl&&l.textControl.handler===h.textControl?.handler;const d=o.filter(l=>l!==f&&r(l.c)&&l.score===f.score).filter(l=>!u(l.c,i)).filter((l,h,v)=>v.findIndex(T=>u(T.c,l.c))===h).slice(0,3).map(l=>({nativeTag:l.c.nativeTag,name:l.c.name,testID:l.c.testID,text:l.c.text,tap:tapPoint(l.c.rect,s,c)}));const m=e.nativeTag==null&&!(e.testID&&!e.query);if(m&&d.length>0){const l=[i,...d.map(h=>o.find(v=>v.c.nativeTag===h.nativeTag)?.c).filter(Boolean)];return{tapped:false,reason:`"${e.query}" matches ${l.length} different controls equally well, so nothing was tapped. Tap one by its nativeTag.`,candidates:l.map(h=>({nativeTag:h.nativeTag,name:h.name,testID:h.testID,text:h.text}))}}const g=o[0];if(m&&g&&g!==f&&!r(g.c)&&g.score>=90&&f.score<g.score-40){return{tapped:false,reason:`The best match for "${e.query}" is "${g.c.text??g.c.label??g.c.name}", which has no JS press handler (it may be native, like a tab bar button). The closest pressable match, "${i.text??i.label??i.name}", is a much weaker match, so nothing was tapped. Use navigate, or tap a specific element by nativeTag.`,candidates:[{nativeTag:i.nativeTag,name:i.name,testID:i.testID,text:i.text}]}}if(!r(i)){return{tapped:false,reason:`Matched "${i.name}"${i.text?` ("${i.text}")`:""} but it has no onPress / onValueChange / onChangeText handler (e.g. a react-native-gesture-handler GestureDetector). This element can't be driven in JS.`,matched:{nativeTag:i.nativeTag,name:i.name,testID:i.testID,label:i.label,text:i.text,via:"onPress"}}}if(i.instance&&!i.rect)i.rect=await measureInstance(i.instance);let y=false;const x=i.rect==null||!(0,_tapMatch.isRectCenterOnScreen)(i.rect,s,c);if(x&&e.scrollIntoView!==false&&i.instance){y=await scrollIntoView(i.fiber,i.instance,i.stateNode,80);if(y)i.rect=await measureInstance(i.instance)}const w={nativeTag:i.nativeTag,name:i.name,testID:i.testID,label:i.label,text:i.text};ensureCommitCounter();const C=commitCount;const P=Date.now();const I=async l=>{await new Promise(h=>setTimeout(h,TAP_SETTLE_MS));return{tapped:true,scrolled:y,matched:l,effect:{commits:commitCount-C,observedMs:Date.now()-P},...d.length?{alsoMatched:d}:{}}};try{if(i.press){if(e.longPress){const h=i.press.kind==="onLongPress"?i.press.handler:i.press.longPress;if(!h){return{tapped:false,scrolled:y,reason:`Matched "${i.name}"${i.text?` ("${i.text}")`:""} but it has no onLongPress handler \u2014 call tap_element without longPress to tap it normally.`,matched:{...w,via:"onPress"}}}h(makeSyntheticPressEvent(i.rect));return await I({...w,via:"onLongPress"})}i.press.handler(makeSyntheticPressEvent(i.rect));return await I({...w,via:i.press.kind})}if(i.valueControl){const h=i.valueControl;let v;if(h.kind==="toggle"){v=typeof e.value==="boolean"?e.value:!h.current}else{const T=h.min??0;const b=h.max??1;if(typeof e.value==="number"){v=Math.min(b,Math.max(T,e.value))}else{v=h.current===b?T:b}}h.handler(v);return await I({...w,via:"onValueChange",value:v})}const l=e.text??(typeof e.value==="string"?e.value:"");i.textControl.handler(l);return await I({...w,via:"onChangeText",value:l})}catch(l){return{tapped:false,scrolled:y,reason:`handler threw: ${l instanceof Error?l.message:String(l)}`,matched:{...w,via:i.press?i.press.kind:i.valueControl?"onValueChange":"onChangeText"}}}}const WAIT_DEFAULT_MS=5e3;const WAIT_MAX_MS=3e4;const WAIT_MIN_POLL_MS=50;const WAIT_DEFAULT_POLL_MS=150;async function waitFor(e){const t=e.nativeTag!=null||!!String(e.testID??"").trim()||!!String(e.query??"").trim();if(!t){return{ok:false,waitedMs:0,polls:0,reason:"Nothing to wait for \u2014 pass nativeTag, testID or query."}}const n=Math.min(Math.max(e.timeoutMs??WAIT_DEFAULT_MS,0),WAIT_MAX_MS);const r=Math.max(e.pollMs??WAIT_DEFAULT_POLL_MS,WAIT_MIN_POLL_MS);const a=e.gone===true;const s=Date.now();let c=0;for(;;){c+=1;const{hit:o,closest:f}=await findOnScreen(e);if(a?!o:!!o){return{ok:true,waitedMs:Date.now()-s,polls:c,matched:o??void 0}}if(Date.now()-s>=n){const i=f?.length?f:void 0;const u=a?`Still on screen after ${n}ms.`:i?`Not on screen after ${n}ms \u2014 ${i.length===1?"one element":`${i.length} elements`} matched but ${i.some(d=>d.onScreen)?"not well enough":"none is visible"}. See \`closest\`; do not retry with different words, call describeScreen.`:`Not on screen after ${n}ms, and nothing matched those words at all. Call describeScreen to see what is there.`;return{ok:false,waitedMs:Date.now()-s,polls:c,reason:u,matched:o??void 0,closest:i}}await new Promise(i=>setTimeout(i,r))}}async function findOnScreen(e){const t=appCandidates(e).map(o=>({c:o,score:matchScore(o,e)})).filter(o=>o.score>0).sort((o,f)=>f.score-o.score).slice(0,8);if(t.length===0)return{hit:null,closest:void 0};await measureCandidates(t.map(o=>o.c));const n=_reactNative.Dimensions.get("window");const r=Math.round(n.width)||1;const a=Math.round(n.height)||1;let s=null;for(const{c:o}of t){if(!(0,_tapMatch.isRectCenterOnScreen)(o.rect,r,a))continue;s={nativeTag:o.nativeTag,name:o.name,testID:o.testID,label:o.label,text:o.text,interactive:!!(o.press||o.valueControl||o.textControl)};break}const c=t.slice(0,3).map(({c:o})=>({name:o.name,testID:o.testID,text:o.text,onScreen:(0,_tapMatch.isRectCenterOnScreen)(o.rect,r,a)}));return{hit:s,closest:c}}function isBuoyChrome(e){let t=e;let n=0;while(t&&n<400){if(getProps(t)?.__buoyDevToolsRoot)return true;t=t.return;n++}return false}function preferHandlerOwner(e,t){const n=getProps(e.fiber);if(typeof n?.onPress==="function"||typeof n?.onValueChange==="function"||typeof n?.onChangeText==="function"){return e}let r=null;let a=e.fiber?.return;let s=0;while(a&&s<25){if(typeof getProps(a)?.onPress==="function"){r=a;break}a=a.return;s++}if(!r)return e;let c=r;for(let o=0;o<6&&c;o++){const f=t.get(c);if(f)return f;c=c.return}return e}function resolveTouchTarget(e){const t=collectCandidates();if(t.length===0)return null;const n=new Map;for(const o of t)n.set(o.fiber,o);const r=t.find(o=>o.nativeTag===e);let a=null;if(!r){for(const o of getAllFiberRoots()){traverseFiberTree(o.current,f=>{if(a)return;if(f.stateNode&&getNativeTag(f.stateNode)===e){a=f}});if(a)break}}let s=r??null;if(!s&&a){let o=a;let f=0;let i=null;while(o&&f<25){const u=n.get(o);if(u){if(u.press||u.valueControl||u.textControl){s=u;break}if(!i)i=u}o=o.return;f++}if(!s)s=i}if(!s)return null;s=preferHandlerOwner(s,n);if(!s.press&&!s.valueControl&&!s.textControl)return null;if(isBuoyChrome(s.fiber))return null;const c=s.valueControl?s.valueControl.kind:s.textControl?"text":"press";return{nativeTag:s.nativeTag,name:s.name,role:s.role,testID:s.testID,label:s.label,text:s.text,control:c,value:s.valueControl?s.valueControl.current:s.textControl?s.textControl.current:void 0}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.isOnScreenTap=isOnScreenTap;exports.isRectCenterOnScreen=isRectCenterOnScreen;exports.looseText=looseText;exports.scoreTapMatch=scoreTapMatch;function isOnScreenTap(t){if(!t)return false;return t.x>=-.1&&t.x<=1.1&&t.y>=-.1&&t.y<=1.1}function isRectCenterOnScreen(t,s,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.isOnScreenTap=isOnScreenTap;exports.isRectCenterOnScreen=isRectCenterOnScreen;exports.looseText=looseText;exports.scoreTapMatch=scoreTapMatch;function isOnScreenTap(t){if(!t)return false;return t.x>=-.1&&t.x<=1.1&&t.y>=-.1&&t.y<=1.1}function isRectCenterOnScreen(t,s,i){if(!t||s<=0||i<=0)return false;const r=t.x+t.width/2;const e=t.y+t.height/2;const n=s*.1;const a=i*.1;return r>=-n&&r<=s+n&&e>=-a&&e<=i+a}function looseText(t){return String(t??"").toLowerCase().replace(/\s+/g," ").replace(/(\d)[,\u00a0\u202f](?=\d{3}\b)/g,"$1").trim()}function scoreTapMatch(t,s){if(s.nativeTag!=null&&t.nativeTag===s.nativeTag)return 1e3;if(s.testID&&!s.query){if(!t.testID||t.testID.toLowerCase()!==s.testID.trim().toLowerCase())return 0;let o=200;if(t.tap)o+=isOnScreenTap(t.tap)?20:-40;return o}const i=String(s.query??s.testID??"").trim().toLowerCase();if(!i)return 0;const r=[t.testID,t.label,t.text,t.name].filter(Boolean).map(o=>o.toLowerCase());let e=0;for(const o of r){if(o===i)e=Math.max(e,100);else if(o.startsWith(i))e=Math.max(e,50);else if(o.includes(i))e=Math.max(e,25)}const n=looseText(i);if(n){for(const o of r){const f=looseText(o);if(f===n)e=Math.max(e,90);else if(f.startsWith(n))e=Math.max(e,45);else if(f.includes(n))e=Math.max(e,22)}}if(s.testID&&t.testID&&t.testID.toLowerCase()===s.testID.toLowerCase()){e=Math.max(e,200)}if(e===0)return 0;const a=(t.testID??"").toLowerCase();if(a.startsWith("buoy-dial-"))e+=40;if(t.tap){if(isOnScreenTap(t.tap))e+=20;else e-=40}return e}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.highlightUpdatesSyncAdapter=void 0;var _HighlightUpdatesController=_interopRequireDefault(require("../highlight-updates/utils/HighlightUpdatesController"));var _RenderTracker=require("../highlight-updates/utils/RenderTracker");var _screenElements=require("../highlight-updates/utils/screenElements");var _touchCapture=require("../highlight-updates/utils/touchCapture");var _CommitProfiler=require("../highlight-updates/utils/CommitProfiler");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ensureInitialized(){if(!_HighlightUpdatesController.default.isInitialized()){_HighlightUpdatesController.default.initialize()}}function toWireCause(e){if(!e)return void 0;const{hookChanges:t,...r}=e;return r}function toWireRender(e){const{renderHistory:t,lastRenderCause:r,...
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.highlightUpdatesSyncAdapter=void 0;var _HighlightUpdatesController=_interopRequireDefault(require("../highlight-updates/utils/HighlightUpdatesController"));var _componentSource=require("../highlight-updates/utils/componentSource");var _RenderTracker=require("../highlight-updates/utils/RenderTracker");var _screenElements=require("../highlight-updates/utils/screenElements");var _touchCapture=require("../highlight-updates/utils/touchCapture");var _CommitProfiler=require("../highlight-updates/utils/CommitProfiler");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function ensureInitialized(){if(!_HighlightUpdatesController.default.isInitialized()){_HighlightUpdatesController.default.initialize()}}function toWireCause(e){if(!e)return void 0;const{hookChanges:t,...r}=e;return r}function toWireRender(e){const{renderHistory:t,lastRenderCause:r,...n}=e;return{...n,lastRenderCause:toWireCause(r),historyCount:t?.length??0}}function jsonSafeRender(e){try{JSON.stringify(e);return e}catch{return{...e,lastRenderCause:toWireCause(e.lastRenderCause),renderHistory:e.renderHistory?.map(t=>({...t,capturedProps:void 0,capturedState:void 0,cause:toWireCause(t.cause)??t.cause}))}}}function beginMeasurement(){if(!_CommitProfiler.CommitProfiler.isSupported()){return{ok:false,reason:"render capture needs a dev build with the React DevTools hook available"}}_CommitProfiler.CommitProfiler.startCapture({detail:true});return{ok:true}}function endMeasurement(){return{summary:_CommitProfiler.CommitProfiler.stopCapture()}}const highlightUpdatesSyncAdapter=exports.highlightUpdatesSyncAdapter={version:3,getSnapshot:()=>({enabled:_HighlightUpdatesController.default.isEnabled(),frozen:_HighlightUpdatesController.default.getFrozen(),highlightsSuppressed:_HighlightUpdatesController.default.getHighlightsSuppressed(),renders:_RenderTracker.RenderTracker.getRenders().map(toWireRender),trackerState:_RenderTracker.RenderTracker.getState()}),subscribe:e=>{const t=_HighlightUpdatesController.default.subscribe(e);const r=_HighlightUpdatesController.default.subscribeToFreeze(e);const n=_RenderTracker.RenderTracker.subscribe(e);const a=_RenderTracker.RenderTracker.subscribeToState(e);return()=>{t();r();n();a()}},actions:{getComponentSource:async e=>{try{return await(0,_componentSource.getComponentSource)(e)}catch(t){return{found:false,reason:`Could not read the component's source: ${t instanceof Error?t.message:String(t)}`}}},beginMeasurement:()=>beginMeasurement(),endMeasurement:()=>endMeasurement(),getRenderDetail:e=>{const{nativeTag:t}=e??{};if(t==null){return{found:false,reason:"missing nativeTag"}}const r=_RenderTracker.RenderTracker.getRender(String(t));if(!r)return{found:false,reason:"unknown nativeTag"};return{found:true,nativeTag:t,render:jsonSafeRender(r)}},toggle:()=>{ensureInitialized();_HighlightUpdatesController.default.toggle()},setEnabled:e=>{ensureInitialized();_HighlightUpdatesController.default.setEnabled(e.enabled)},toggleFreeze:()=>{_HighlightUpdatesController.default.toggleFreeze()},clearRenderCounts:()=>{_HighlightUpdatesController.default.clearRenderCounts()},setSpotlight:e=>{_HighlightUpdatesController.default.setSpotlight(e.nativeTag)},locateComponent:e=>{ensureInitialized();return _HighlightUpdatesController.default.locateComponent(e??{})},setSilentTracking:e=>{ensureInitialized();_HighlightUpdatesController.default.setSilentTracking(e.enabled??false)},describeScreen:e=>(0,_screenElements.describeScreen)(e??{}),tapElement:e=>(0,_screenElements.tapElement)(e??{}),waitFor:e=>(0,_screenElements.waitFor)(e??{}),startTouchCapture:()=>(0,_touchCapture.startTouchCapture)(),stopTouchCapture:()=>{(0,_touchCapture.stopTouchCapture)();return(0,_touchCapture.getTouchCaptureStatus)()},clearTouchCapture:()=>{(0,_touchCapture.clearTouchCapture)();return{ok:true}},readTouchCapture:e=>(0,_touchCapture.readTouchCapture)(e?.sinceSeq??0)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import Le,{useState as l,useEffect as g,useRef as
|
|
1
|
+
"use strict";import Le,{useState as l,useEffect as g,useRef as T,useCallback as s}from"react";import{View as D,Text as Oe,StyleSheet as Ue}from"react-native";import{Power as je,JsModal as Je,devToolsStorageKeys as x,persistentStorage as V,night as F,TickProvider as ye,windowDragProps as Me}from"@buoy-gg/shared-ui";import{useIsPro as Ke}from"@buoy-gg/license";import c from"../utils/HighlightUpdatesController";import{RenderTracker as o}from"../utils/RenderTracker";import{RenderDetailView as We}from"./RenderDetailView";import{EventStepperFooter as qe}from"@buoy-gg/shared-ui";import{HighlightFilterView as Ge}from"./HighlightFilterView";import{IsolatedRenderList as Qe}from"./IsolatedRenderList";import{MainListHeader as Xe,FilterViewHeader as Ye,DetailViewHeader as Ze,CopySettingsViewHeader as $e}from"./ModalHeaderContent";import{RenderHistoryViewer as et,RenderHistoryFooter as tt}from"./RenderHistoryViewer";import{RendersCopySettingsView as nt}from"./RendersCopySettingsView";import{jsx as i,jsxs as J,Fragment as rt}from"react/jsx-runtime";const st=Le.memo(function a(){return J(D,{testID:"buoy-highlight-disabled-banner",style:b.disabledBanner,children:[i(je,{size:14,color:F.color.warning}),i(Oe,{testID:"buoy-highlight-disabled-text",style:b.disabledText,children:"Render tracking is disabled"})]})});export function HighlightUpdatesModal({visible:a,onClose:xe,onBack:M,onMinimize:we,enableSharedModalDimensions:Ce=false,initialNativeTag:k,onInitialNativeTagHandled:K,onRenderSelect:H,inline:Fe=false}){const I=Ke();const[v,be]=l(false);const[W,Ie]=l(()=>c.getFrozen());const[q,G]=l(()=>o.getStats().totalComponents>0);const[r,f]=l(null);const[p,y]=l(0);const[A,z]=l(false);const[N,Q]=l(false);const[ve,Re]=l([]);const[B,Pe]=l("filters");const[w,X]=l("details");const[Y,_]=l(0);const[m,De]=l("");const[R,E]=l(false);const Z=T(null);const C=T([]);const $=T(o.getFilters());const[L,ee]=l(()=>{const e=o.getFilters();return e.includePatterns.length+e.excludePatterns.length});const[d,te]=l(()=>o.getFilters());const[O,ne]=l(()=>o.getSettings());const re=T(false);const U=T(false);const P=T(false);g(()=>{if(!a||re.current)return;re.current=true},[a]);g(()=>{if(!a||U.current)return;const e=async()=>{try{const t=await V.getItem(x.highlightUpdates.filters());if(t){const n=JSON.parse(t);const u={includeTestID:new Set(n.includeTestID||[]),includeNativeID:new Set(n.includeNativeID||[]),includeViewType:new Set(n.includeViewType||[]),includeComponent:new Set(n.includeComponent||[]),excludeTestID:new Set(n.excludeTestID||[]),excludeNativeID:new Set(n.excludeNativeID||[]),excludeViewType:new Set(n.excludeViewType||[]),excludeComponent:new Set(n.excludeComponent||[]),includePatterns:n.includePatterns||[],excludePatterns:n.excludePatterns||[]};o.setFilters(u);const h=o.getFilters();$.current=h;te(h);ee(h.includePatterns.length+h.excludePatterns.length)}U.current=true}catch(t){}};e()},[a]);g(()=>{if(!U.current)return;const e=async()=>{try{const t={includeTestID:Array.from(d.includeTestID),includeNativeID:Array.from(d.includeNativeID),includeViewType:Array.from(d.includeViewType),includeComponent:Array.from(d.includeComponent),excludeTestID:Array.from(d.excludeTestID),excludeNativeID:Array.from(d.excludeNativeID),excludeViewType:Array.from(d.excludeViewType),excludeComponent:Array.from(d.excludeComponent),includePatterns:d.includePatterns,excludePatterns:d.excludePatterns};await V.setItem(x.highlightUpdates.filters(),JSON.stringify(t))}catch(t){}};e()},[d]);g(()=>{if(!a||P.current)return;const e=async()=>{try{const t=await V.getItem(x.highlightUpdates.settings());if(t){const n=JSON.parse(t);const{performanceLogging:u,excludeDevTools:h,...S}=n;o.setSettings(S);ne(o.getSettings())}P.current=true}catch(t){P.current=true}};e()},[a]);g(()=>{if(!P.current)return;const e=async()=>{try{const{performanceLogging:t,excludeDevTools:n,...u}=O;await V.setItem(x.highlightUpdates.settings(),JSON.stringify(u))}catch(t){}};e()},[O]);g(()=>{const e=o.subscribeToState(t=>{be(t.isTracking)});return()=>{e()}},[]);g(()=>{const e=c.subscribeToFreeze(t=>{Ie(t)});return()=>{e()}},[]);g(()=>{if(R){requestAnimationFrame(()=>{Z.current?.focus()})}},[R]);g(()=>{if(!a){c.setSpotlight(null)}},[a]);g(()=>{if(a&&k!=null){const e=o.getRender(String(k));if(e){f(e);y(0);z(false);c.setSpotlight(e.nativeTag)}K?.()}},[a,k,K]);const se=s(()=>{if(!c.isInitialized()){c.initialize()}c.toggle()},[]);const oe=s(()=>{c.toggleFreeze()},[]);const ie=s(()=>{c.clearRenderCounts();G(false)},[]);const le=s(()=>{Re(o.getFilteredRenders(m));Q(true)},[m]);const ae=s(()=>{Q(false)},[]);const ce=s(e=>{De(e)},[]);const Ve=s((e,t,n)=>{f(e);y(t);X("details");_(0);C.current=n;c.setSpotlight(e.nativeTag)},[]);g(()=>{if(!r)return;const e=String(r.nativeTag);return o.subscribe(()=>{const t=o.getRender(e);if(t)f({...t})})},[r?.nativeTag]);const de=T(null);g(()=>{if(!H||!r)return;if(de.current===r.nativeTag)return;de.current=r.nativeTag;H(r)},[r,H]);const ke=s(e=>{C.current=e},[]);const ge=s(()=>{f(null);y(0);if(m)E(true);c.setSpotlight(null)},[m]);const He=s(()=>{const e=C.current;if(p>0){const t=p-1;const n=e[t];if(n){f(n);y(t);c.setSpotlight(n.nativeTag)}}},[p]);const Ae=s(()=>{const e=C.current;if(p<e.length-1){const t=p+1;const n=e[t];if(n){f(n);y(t);c.setSpotlight(n.nativeTag)}}},[p]);const ue=s(()=>{z(false)},[]);const he=s(()=>{z(true)},[]);const fe=s(()=>{E(true)},[]);const pe=s(()=>{E(false)},[]);const j=s(e=>{o.setFilters(e);const t=o.getFilters();$.current=t;te(t);ee(t.includePatterns.length+t.excludePatterns.length)},[]);const ze=s((e,t)=>{const n=o.getFilters();const u={};if(t==="include"){const h=n.includePatterns.some(S=>S.type===e.type&&S.value===e.value);if(!h){u.includePatterns=[...n.includePatterns,e]}}else{const h=n.excludePatterns.some(S=>S.type===e.type&&S.value===e.value);if(!h){u.excludePatterns=[...n.excludePatterns,e]}}if(Object.keys(u).length>0){j(u);f(null);y(0);c.setSpotlight(null)}},[j]);const Ne=s(e=>{o.setSettings(e);ne(o.getSettings())},[]);const Be=s(e=>{G(e.totalComponents>0)},[]);const me=s(()=>{if(N){return i($e,{onBack:ae})}if(A){return i(Ye,{onBack:ue,activeTab:B,onTabChange:Pe,activeFilterCount:L})}if(r){return i(Ze,{onBack:ge,activeTab:w,onTabChange:X,hasHistory:(r.renderHistory?.length??0)>0})}return i(Xe,{onBack:M,isSearchActive:R,searchText:m,onSearchChange:ce,onSearchToggle:fe,onSearchClose:pe,onFilterToggle:he,onToggleTracking:se,onToggleFreeze:oe,onClear:ie,onOpenCopySettings:le,isTracking:v,isFrozen:W,activeFilterCount:L,hasRenders:q,searchInputRef:Z})},[N,A,r,M,R,m,v,W,L,q,B,w,ue,ge,ae,ce,fe,pe,he,se,oe,ie,le]);const _e=Ce?x.modal.root():x.highlightUpdates.modal();if(!a)return null;const Ee=C.current.length;const Se=r?w==="details"?i(qe,{currentIndex:p,totalItems:Ee,onPrevious:He,onNext:Ae,itemLabel:"Component",subtitle:r.componentName||r.displayName||r.viewType}):i(tt,{render:r,selectedEventIndex:Y,onEventIndexChange:_,isPro:I}):null;const Te=i(D,{nativeID:"__rn_buoy__highlight-modal",testID:"buoy-highlight-body",style:b.container,children:N?i(nt,{renders:ve}):r?w==="details"?i(We,{render:r,disableInternalFooter:true,onAddFilter:ze,isPro:I}):i(et,{render:r,disableInternalFooter:true,selectedEventIndex:Y,onEventIndexChange:_,isPro:I}):A?i(Ge,{filters:d,onFilterChange:j,settings:O,onSettingsChange:Ne,availableProps:o.getAvailableProps(),activeTab:B}):J(rt,{children:[!v&&i(st,{}),i(Qe,{searchText:m,filters:d,onSelectRender:Ve,onStatsChange:Be,onRendersChange:ke,isTracking:v,isPro:I})]})});if(Fe){return i(ye,{children:J(D,{style:b.inlineRoot,children:[i(D,{style:b.inlineHeader,...Me,children:me()}),Te,Se]})})}return i(ye,{children:i(Je,{visible:a,onClose:xe,onMinimize:we,persistenceKey:_e,header:{showToggleButton:true,customContent:me()},enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:Se,footerHeight:r?w==="details"?68:(r.renderHistory?.length??0)>1?68:0:0,children:Te})})}export function HighlightToolView(a={}){return i(HighlightUpdatesModal,{...a,inline:true,visible:true,onClose:()=>{}})}const b=Ue.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:F.color.border,backgroundColor:"transparent"},container:{flex:1,backgroundColor:"transparent"},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:F.color.warningSoft,borderRadius:8,borderWidth:1,borderColor:F.color.warning+"20"},disabledText:{color:F.color.warning,fontSize:11,flex:1}});export default HighlightUpdatesModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{getDOMFiber as W,getDOMNodeHandle as Se,getDOMPublicInstance as Ne,isDOMElement as Oe}from"@buoy-gg/shared-ui/utils";"use strict";import{installProfilerInterceptor as Le,uninstallProfilerInterceptor as Re,setComparisonCallback as He}from"./ProfilerInterceptor";import{findNodeHandle as ae,UIManager as Ve,Dimensions as ze,PixelRatio as oe}from"react-native";import{RenderTracker as v}from"./RenderTracker";import{describeScreen as xe}from"./screenElements";import{scoreTapMatch as Ue}from"./tapMatch";import{PerformanceLogger as se,markEventReceived as Ae}from"./PerformanceLogger";import{detectRenderCause as le,clearRenderCauseState as Fe}from"./RenderCauseDetector";import{notifySubscriberCountChange as ce}from"@buoy-gg/shared-ui";import{HIGHLIGHT_OVERLAY_COMPONENTS as Me,HIGHLIGHT_OVERLAY_PREFIXES as Ge,OTHER_DEV_TOOLS_COMPONENTS as Be,OTHER_DEV_TOOLS_EXACT as $e,OTHER_DEV_TOOLS_PREFIXES as je,isCapturingBuoyToolRenders as We,isPerfMonitorComponentName as Ke}from"./devtoolsComponentNames";let w=false;let V=false;let L=false;let N=false;let y=null;let O=null;let A=null;let z=null;let ue=false;let k=false;const F=new Set;const K=new Set;const q=new Map;const X=["#37afa9","#63b19e","#80b393","#97b488","#abb67d","#beb771","#cfb965","#dfba57","#efbb49","#febc38"];const qe=false;function u(e,n){if(!qe)return;if(n!==void 0){console.log(`[HighlightUpdates] ${e}`,n)}else{console.log(`[HighlightUpdates] ${e}`)}}function M(e){const n=Ne(e);if(n)return n;if(!e)return null;const r=e;if(r.canonical?.publicInstance){return r.canonical.publicInstance}if(r.canonical&&typeof r.canonical.measure==="function"){return r.canonical}if(typeof r.measure==="function"){return r}return null}function R(e){const n=Se(e);if(n!==null)return n;if(e==null)return null;const r=e;if(r.__nativeTag!=null)return r.__nativeTag;if(r._nativeTag!=null)return r._nativeTag;if(r.nativeTag!=null)return r.nativeTag;if(r.canonical){if(r.canonical.__nativeTag!=null)return r.canonical.__nativeTag;if(r.canonical._nativeTag!=null)return r.canonical._nativeTag;if(r.canonical.nativeTag!=null)return r.canonical.nativeTag}return null}function Y(e){const n=e;const r={viewType:"Unknown"};if(n?.canonical?.viewConfig?.uiViewClassName){r.viewType=n.canonical.viewConfig.uiViewClassName}else if(n?.viewConfig?.uiViewClassName){r.viewType=n.viewConfig.uiViewClassName}const o=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||W(n);const i=n?.canonical?.currentProps;const a=n?.canonical?.pendingProps;const t=o?.pendingProps;const f=o?.memoizedProps;r.testID=i?.testID||a?.testID||t?.testID||f?.testID||void 0;r.nativeID=i?.nativeID||a?.nativeID||t?.nativeID||f?.nativeID||void 0;r.accessibilityLabel=i?.accessibilityLabel||a?.accessibilityLabel||t?.accessibilityLabel||f?.accessibilityLabel||void 0;r.componentName=nn(o)||void 0;return r}function Gn(e){const n=e;const r=M(e);const o=R(e)||R(r);const i={nativeTag:o??"unknown",type:n?.canonical?"Fabric":"Legacy",hasMeasure:typeof r?.measure==="function"};if(n){i.stateNodeKeys=Object.keys(n).slice(0,20);if(n.node){i.nodeKeys=Object.keys(n.node).slice(0,20)}if(n.viewConfig){i.viewConfig={uiViewClassName:n.viewConfig.uiViewClassName,validAttributes:n.viewConfig.validAttributes?Object.keys(n.viewConfig.validAttributes).slice(0,10):void 0}}if(n.canonical){const a=n.canonical;i.canonicalKeys=Object.keys(a).slice(0,20);if(a.viewConfig){i.canonicalViewConfig={uiViewClassName:a.viewConfig.uiViewClassName}}if(a.nativeTag!=null){i.canonicalNativeTag=a.nativeTag}if(a.internalInstanceHandle){const t=a.internalInstanceHandle;i.fiberKeys=Object.keys(t).slice(0,30);if(t.type){i.fiberType=typeof t.type==="function"?t.type.name||t.type.displayName||"function":t.type}if(t.elementType){i.fiberElementType=typeof t.elementType==="function"?t.elementType.name||t.elementType.displayName||"function":t.elementType}if(t._debugOwner){const f=t._debugOwner;i.fiberDebugOwner=f.type?.name||f.type?.displayName||f.elementType?.name||"unknown"}if(t._debugSource){i.fiberDebugSource=t._debugSource}if(t.tag!=null){i.fiberTag=t.tag}if(t.pendingProps){if(t.pendingProps.nativeID)i.fiberPendingNativeID=t.pendingProps.nativeID;if(t.pendingProps.testID)i.fiberPendingTestID=t.pendingProps.testID}if(t.memoizedProps){if(t.memoizedProps.nativeID)i.fiberMemoizedNativeID=t.memoizedProps.nativeID;if(t.memoizedProps.testID)i.fiberMemoizedTestID=t.memoizedProps.testID}}if(a.publicInstance){const t=a.publicInstance;i.publicInstanceKeys=Object.keys(t).slice(0,20);if(t.nativeID!=null)i.nativeID=t.nativeID;if(t._nativeID!=null)i._nativeID=t._nativeID;if(t.props){i.publicInstanceProps=Object.keys(t.props).slice(0,15);if(t.props.nativeID)i.propsNativeID=t.props.nativeID;if(t.props.testID)i.propsTestID=t.props.testID;if(t.props.accessibilityLabel)i.accessibilityLabel=t.props.accessibilityLabel}}if(a.currentProps){i.currentPropsKeys=Object.keys(a.currentProps).slice(0,15);if(a.currentProps.nativeID!=null)i.currentPropsNativeID=a.currentProps.nativeID;if(a.currentProps.testID!=null)i.currentPropsTestID=a.currentProps.testID;if(a.currentProps.accessibilityLabel!=null)i.currentPropsAccessLabel=a.currentProps.accessibilityLabel}if(a.pendingProps){i.pendingPropsKeys=Object.keys(a.pendingProps).slice(0,15);if(a.pendingProps.nativeID!=null)i.pendingPropsNativeID=a.pendingProps.nativeID;if(a.pendingProps.testID!=null)i.pendingPropsTestID=a.pendingProps.testID}}if(n._debugOwner){const a=n._debugOwner;i.debugOwnerType=a.type?.name||a.type?.displayName||typeof a.type}if(n._debugSource){i.debugSource=n._debugSource}}return i}const fe=false;let Xe=false;let Z=null;const Bn=350;const de=new Set;function $n(e){if(e==null)return false;return de.has(e)}const Ye=new Set(["highlight-updates-overlay","__rn_buoy__highlight-modal"]);const Ze=new Set(["jsmodal-root","image-overlay-standalone","logbox_inspector","logbox"]);const H=new Map;const ge=500;function Je(){H.clear()}function pe(e){if(!e)return false;if(Ye.has(e))return true;if(e.startsWith("__highlight_"))return true;return false}function me(e){if(!e)return false;if(Ze.has(e))return true;const n=e.charCodeAt(0);if(n===95){if(e.startsWith("__rn_buoy__"))return true}if(n===108&&e.startsWith("logbox")){return true}return false}function be(e){if(!e)return null;const n=e.type;if(n){if(typeof n==="string")return n;if(n.name)return n.name;if(n.displayName)return n.displayName}const r=e.elementType;if(r){if(r.name)return r.name;if(r.displayName)return r.displayName}return null}const Qe=new Set(["View","Text","TextImpl","Image","ScrollView","FlatList","SectionList","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","Pressable","TextInput","Switch","ActivityIndicator","Modal","StatusBar","KeyboardAvoidingView","AnimatedComponent","AnimatedComponentWrapper","ScreenContainer","ScreenStack","Screen","ScreenContentWrapper","Svg","G","Path","Rect","Circle","Line","Polygon","Polyline","Ellipse","Text as SVGText","TSpan","TextPath","Use","Symbol","Defs","ClipPath","LinearGradient","RadialGradient","Stop","Mask","Pattern","Image as SVGImage","SafeAreaProvider","SafeAreaView","SafeAreaListener","GestureHandlerRootView","GestureDetector","ReanimatedView","ReanimatedText","ReanimatedImage","ReanimatedScrollView","Fragment","Suspense","Provider","Consumer","Context","ForwardRef"]);function en(e){if(!e)return true;if(Qe.has(e))return true;if(e==="Unknown"||e==="Component")return true;if(e.startsWith("Animated"))return true;return false}function nn(e){if(!e)return null;let n=e._debugOwner||e.return;let r=0;let o=null;while(n&&r<30){const i=be(n);if(i&&typeof n.type!=="string"){if(!o){o=i}if(!en(i)){return i}}n=n.return;r++}return o}function tn(e){const n=e;const r=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||W(n);const o=R(e)||R(n?.canonical?.publicInstance);const i=We();const a=!i&&v.getSettings().excludeDevTools;if(a&&Oe(e)&&e.closest("[data-buoy-root]"))return true;if(o!=null&&a){const p=H.get(o);if(p!==void 0){return p}}let t=false;const f=r?.pendingProps?.nativeID||r?.memoizedProps?.nativeID||n?.canonical?.currentProps?.nativeID||null;if(pe(f)){t=true}else if(a&&me(f)){t=true}if(!t&&r){let p=r;let h=0;while(p&&h<30){const s=be(p);if(s){if(Me.has(s)){t=true;break}for(const g of Ge){if(s.startsWith(g)){t=true;break}}if(t)break;if(i&&Ke(s)){t=true;break}if(a){if(Be.has(s)||$e.has(s)){t=true;break}for(const g of je){if(s.startsWith(g)){t=true;break}}if(t)break}}const d=p.pendingProps?.nativeID||p.memoizedProps?.nativeID;if(pe(d)){t=true;break}if(a&&me(d)){t=true;break}p=p.return;h++}}if(t&&o!=null&&a){if(H.size>=ge){const p=Array.from(H.keys());for(let h=0;h<ge/2;h++){H.delete(p[h])}}H.set(o,t)}return t}function rn(e){const n=Math.min(e-1,X.length-1);return X[Math.max(0,n)]}function an(e){if(e.size===0){return}if(!w&&!L){return}const n=v.getState();if(n.isPaused){return}if(se.isEnabled()){Ae()}const r=v.getBatchSize();const o=se.startBatch(e.size,r);const i=[];let a=0;let t=0;const f=v.hasActiveFilters();for(const s of e){if(s&&typeof s==="object"){try{if(tn(s)){a++;continue}const d=M(s);const g=R(s)||R(d);if(g==null){continue}const T=Y(s);if(f&&!v.passesFilters(T)){t++;continue}const P=v.getSettings().showRenderCount;let m;let c;if(P){const l=q.get(g)||0;m=l+1;q.set(g,m);c=rn(m)}else{m=0;c=X[0]}i.push({node:s,color:c,count:m})}catch{}}}o.markFilteringComplete(a+t,i.length);if(i.length===0){o.finish();return}if(fe){console.log(`[HighlightUpdates] ${i.length} component(s) re-rendered`)}const p=v.getRenderEventCallbackCount()>0;if(!O&&!p){if(fe){console.log(`[HighlightUpdates] No highlightCallback and no event callbacks - skipping render`)}ue=false;return}o.markMeasurementStart();const h=i.slice(0,r*4).map(({node:s,color:d,count:g})=>new Promise(T=>{let P=false;const m=b=>{if(P)return;P=true;clearTimeout(c);T(b)};const c=setTimeout(()=>m({rect:null,stateNode:s,color:d,count:g}),500);const l=M(s);const E=R(s)||R(l);if(E==null){m({rect:null,stateNode:s,color:d,count:g});return}const I=(b,D,_,S,ie,re)=>{if(ie==null||re==null||_==null||S==null){m({rect:null,stateNode:s,color:d,count:g});return}m({rect:{id:E,x:ie,y:re,width:_,height:S,color:d,count:g},stateNode:s,color:d,count:g})};if(!l){const b=s.node;const D=globalThis.nativeFabricUIManager;if(b&&D?.measure){try{D.measure(b,I)}catch(_){m({rect:null,stateNode:s,color:d,count:g})}return}m({rect:null,stateNode:s,color:d,count:g});return}try{l.measure(I)}catch(b){m({rect:null,stateNode:s,color:d,count:g})}}));Promise.all(h).then(s=>{const d=s.filter(T=>T.rect!==null);const g=d.map(T=>T.rect);o.markMeasurementComplete(d.length,s.length-d.length);if(g.length>0&&O&&w&&!V){O(g)}setTimeout(()=>{try{for(const c of d){if(c.rect)on(c.rect.id,c.stateNode)}}catch(c){u("registerTrackedNode batch failed",c)}const T=v.getSettings();const P=T.trackRenderCauses&&T.showRenderCount;let m=null;if(P){m=new Set;for(const{rect:c}of d){if(c){m.add(c.id)}}}if(w){v.startBatch();for(const{rect:c,stateNode:l,color:E,count:I}of d){if(c){const b=Y(l);let D;if(P&&m){const _=l;const S=J(_);D=le(c.id,S,m,T.debugLogLevel)}v.trackRender({nativeTag:c.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:c.x,y:c.y,width:c.width,height:c.height},color:E,count:I,renderCause:D})}}v.endBatch()}else{for(const{rect:c,stateNode:l,color:E,count:I}of d){if(c){const b=Y(l);let D;if(P&&m){const _=l;const S=J(_);D=le(c.id,S,m,T.debugLogLevel)}v.emitRenderEvent({nativeTag:c.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:c.x,y:c.y,width:c.width,height:c.height},color:E,count:I,renderCause:D})}}}o.markTrackingComplete();o.markCallbackComplete();o.finish()},0)}).catch(s=>{console.error("[HighlightUpdates] Error in measurement pipeline:",s);o.finish()})}const he=globalThis.WeakRef;const G=new Map;function on(e,n){if(e==null||n==null||typeof n!=="object"){return}try{G.set(e,he?new he(n):{deref:()=>n})}catch{G.set(e,{deref:()=>n})}}function sn(e){const n=G.get(e);const r=n?.deref();if(!r)G.delete(e);return r??null}function ln(e){return new Promise(n=>{try{e.measure((r,o,i,a,t,f)=>{if(t==null||f==null||i==null||a==null){n(null)}else{n({x:t,y:f,width:i,height:a})}})}catch{n(null)}})}function J(e){const n=e;return n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||W(n)||null}function cn(e){let n=J(e);let r=0;while(n&&r++<200){const o=n.stateNode;if(o&&typeof o.scrollTo==="function"){const i=typeof o.getNativeScrollRef==="function"&&o.getNativeScrollRef()||null;const a=typeof o.getInnerViewNode==="function"&&o.getInnerViewNode()||typeof o.getScrollableNode==="function"&&o.getScrollableNode()||o;return{instance:o,nativeRef:i,innerNode:a}}n=n.return}return null}async function un(e,n,r){try{const o=cn(e);if(!o)return false;const i=n;let a=null;const t=f=>new Promise(p=>{let h=false;const s=g=>{if(h)return;h=true;p(g)};const d=setTimeout(()=>s(null),600);try{f(g=>{clearTimeout(d);s(g)})}catch{clearTimeout(d);s(null)}});if(o.nativeRef&&typeof i.measureLayout==="function"){a=await t(f=>i.measureLayout(o.nativeRef,(p,h)=>f(h),()=>f(null)))}if(a==null){const f=ae(n);const p=typeof o.innerNode==="number"?o.innerNode:ae(o.innerNode);if(f!=null&&p!=null){a=await t(h=>Ve.measureLayout(f,p,()=>h(null),(s,d)=>h(d)))}}if(a==null)return false;o.instance.scrollTo({y:Math.max(0,a-r),animated:false});await new Promise(f=>setTimeout(f,80));return true}catch{return false}}function fn(e,n){const r=[e.testID,e.nativeID,e.accessibilityLabel,e.componentName,e.viewType,String(e.nativeTag)];let o=0;for(const i of r){if(!i)continue;const a=i.toLowerCase();if(a===n)return 3;if(a.startsWith(n))o=Math.max(o,2);else if(a.includes(n))o=Math.max(o,1)}return o}async function dn(e){const n=e.scrollIntoView!==false;const r=typeof e.margin==="number"?e.margin:12;const o=v.getRenders();const i=async()=>{const l=await xe();const E=(e.query??"").trim().toLowerCase();let I;for(const _ of l.elements){if(e.nativeTag!=null&&_.nativeTag===e.nativeTag){I={el:_,score:1e3};break}const S=Ue({nativeTag:_.nativeTag,testID:_.testID,label:_.label,text:_.text,name:_.name,tap:_.tap},{query:E||void 0,nativeTag:e.nativeTag});if(S<=0)continue;if(!I||S>I.score)I={el:_,score:S}}if(!I?.el.frame){return{matched:false,reason:"no-match",candidates:[]}}const b=l.screen;const D=I.el.frame;return{matched:true,live:true,rect:{x:D.x*b.width,y:D.y*b.height,width:D.width*b.width,height:D.height*b.height},scale:oe.get(),screen:{width:b.width,height:b.height},nativeTag:I.el.nativeTag??void 0,componentName:I.el.name,testID:I.el.testID}};if(o.length===0)return i();const a=(e.query??"").trim().toLowerCase();const t=a?o.map(l=>({r:l,score:fn(l,a)})).filter(l=>l.score>0).sort((l,E)=>E.score-l.score||E.r.lastRenderTime-l.r.lastRenderTime):[];const f=t.slice(0,8).map(({r:l})=>({nativeTag:l.nativeTag,componentName:l.componentName,testID:l.testID,nativeID:l.nativeID,viewType:l.viewType,renderCount:l.renderCount}));const p=e.nativeTag??(t.length>0?t[0].r.nativeTag:void 0);if(p==null){const l=await i();return l.matched?l:{matched:false,reason:"no-match",candidates:f}}const h=o.find(l=>l.nativeTag===p);let s=null;let d=false;let g=false;const T=sn(p);if(T){const l=M(T);if(l){if(n){g=await un(T,l,r)}s=await ln(l);d=!!s}}if(!s&&h?.measurements){s={...h.measurements}}if(!s){return{matched:false,reason:"no-measurement",nativeTag:p,candidates:f}}const P=oe.get();const m=ze.get("window");const c=s.x>=-1&&s.y>=-1&&s.x+s.width<=m.width+1&&s.y+s.height<=m.height+1;return{matched:true,live:d,scrolled:g,inView:c,rect:s,scale:P,screen:{width:m.width,height:m.height},nativeTag:p,componentName:h?.componentName,testID:h?.testID,candidates:f}}function ye(e){if(!y?.rendererInterfaces){u("No rendererInterfaces available");return}let n=0;y.rendererInterfaces.forEach((r,o)=>{if(typeof r.setTraceUpdatesEnabled==="function"){try{r.setTraceUpdatesEnabled(e);n++;u(`Renderer ${o}: setTraceUpdatesEnabled(${e})`)}catch(i){u(`Renderer ${o}: error setting trace updates`,i)}}else{u(`Renderer ${o}: no setTraceUpdatesEnabled method`)}});u(`Set trace updates ${e?"enabled":"disabled"} on ${n} renderer(s)`);if(y.reactDevtoolsAgent?.setTraceUpdatesEnabled){try{y.reactDevtoolsAgent.setTraceUpdatesEnabled(e);u("Also set trace updates on agent")}catch(r){u("Error setting trace updates on agent",r)}}}function _e(){if(!y)return;if(z)return;u("Subscribing to traceUpdates event");if(typeof y.sub==="function"){z=y.sub("traceUpdates",an);u("Subscribed using hook.sub()")}else{u("hook.sub not available, traceUpdates may not work")}ye(true)}function Q(){ye(false);if(z){z();z=null;u("Unsubscribed from traceUpdates event")}}function Te(e){O=e;u(`Highlight callback ${e?"set":"cleared"}`)}function gn(e){A=e;u(`Badge press callback ${e?"set":"cleared"}`)}function pn(){return A}function mn(e){if(A){A(e)}}let ee=null;let B=null;function bn(e){ee=e;if(e&&B!==null){e(B)}}function hn(e){if(C){C("setSpotlight",{nativeTag:e});return}B=e;if(ee){ee(e)}}let C=null;function yn(e){C=e}function _n(e){if(w!==e.enabled){w=e.enabled;ne()}if(k!==e.frozen){k=e.frozen;j()}}function Tn(){return B}function ne(){K.forEach(e=>{try{e(w)}catch(n){console.error("[HighlightUpdates] Error in state listener:",n)}})}function Ie(e){K.add(e);e(w);return()=>{K.delete(e)}}function $(){if(typeof __DEV__!=="undefined"&&!__DEV__){u("Only available in development builds");return false}if(C){return true}if(N){return true}y=window?.__REACT_DEVTOOLS_GLOBAL_HOOK__||null;if(!y){u("React DevTools hook not found");return false}u("Hook found");u(`Hook has sub: ${typeof y.sub==="function"}`);u(`Hook has on: ${typeof y.on==="function"}`);u(`Hook has emit: ${typeof y.emit==="function"}`);Le();if(y.rendererInterfaces&&y.rendererInterfaces.size>0){N=true;u(`Initialized with ${y.rendererInterfaces.size} renderer(s)`);ve();return true}const e=setInterval(()=>{if(y?.rendererInterfaces&&y.rendererInterfaces.size>0){clearInterval(e);N=true;u(`Initialized with ${y.rendererInterfaces.size} renderer(s) (delayed)`);ve()}},100);setTimeout(()=>clearInterval(e),1e4);return false}function ve(){if(typeof window!=="undefined"){window.__HIGHLIGHT_UPDATES_CONTROLLER__={enable:x,disable:U,toggle:we,isEnabled:De,setEnabled:Ce,subscribe:Ie,initialize:$,destroy:Pe,isInitialized:()=>N,setHighlightCallback:Te}}}function x(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!N){$()}if(V){V=false}if(w){return}u("Enabling highlights");if(!L){_e()}v.start();w=true;ne();ce("render")}function U(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!w){return}u("Disabling highlights");Xe=false;ue=false;if(Z){clearTimeout(Z);Z=null}de.clear();H.clear();Fe();if(k){k=false;j()}if(!L){Q()}v.stop();w=false;ne();ce("render")}function In(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(L){return}if(!N){$()}u("Enabling background tracking");if(!w){_e()}L=true}function vn(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!L){return}u("Disabling background tracking");L=false;if(!w){Q()}}function wn(){return L}function we(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(C){C("toggle");return}if(w){U()}else{x()}}function Dn(){if(C){C("clearRenderCounts");return}q.clear();v.clear();u("Cleared render counts")}function De(){return w}function Ce(e){if(C){C("setEnabled",{enabled:e});return}if(e)x();else U()}function te(e){if(V===e)return;V=e;if(e&&O){O([])}}function Cn(){return V}function kn(e){if(C){C("setSilentTracking",{enabled:e});return}if(e){x();te(true)}else{te(false);U()}}function En(){return N}function j(){F.forEach(e=>{try{e(k)}catch(n){console.error("[HighlightUpdates] Error in freeze listener:",n)}})}function Pn(e){F.add(e);e(k);return()=>{F.delete(e)}}function ke(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(k)return;k=true;u("Freeze mode enabled");j()}function Ee(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!k)return;k=false;u("Freeze mode disabled");if(O){O([])}j()}function Sn(){if(C){C("toggleFreeze");return}if(k){Ee()}else{ke()}}function Nn(){return k}function Pe(){if(!N)return;Q();Re();He(null);k=false;F.clear();w=false;y=null;O=null;N=false;if(typeof window!=="undefined"){delete window.__HIGHLIGHT_UPDATES_CONTROLLER__}u("Destroyed")}const On={subscribe:Ie,enable:x,disable:U,toggle:we,isEnabled:De,setEnabled:Ce,initialize:$,destroy:Pe,isInitialized:En,setHighlightCallback:Te,clearRenderCounts:Dn,freeze:ke,unfreeze:Ee,toggleFreeze:Sn,getFrozen:Nn,subscribeToFreeze:Pn,setBadgePressCallback:gn,getBadgePressCallback:pn,handleBadgePress:mn,setSpotlightCallback:bn,setSpotlight:hn,getSpotlight:Tn,clearDevToolsCache:Je,enableBackgroundTracking:In,disableBackgroundTracking:vn,isBackgroundTrackingEnabled:wn,setRemoteHandler:yn,replaceRemoteState:_n,locateComponent:dn,setHighlightsSuppressed:te,getHighlightsSuppressed:Cn,setSilentTracking:kn};export default On;
|
|
1
|
+
"use strict";import{getDOMFiber as W,getDOMNodeHandle as Ne,getDOMPublicInstance as Oe,isDOMElement as ae}from"@buoy-gg/shared-ui/utils";"use strict";import{installProfilerInterceptor as Le,uninstallProfilerInterceptor as Re,setComparisonCallback as He}from"./ProfilerInterceptor";import{findNodeHandle as oe,UIManager as Ve,Dimensions as ze,PixelRatio as se}from"react-native";import{RenderTracker as v}from"./RenderTracker";import{describeScreen as xe}from"./screenElements";import{scoreTapMatch as Ue}from"./tapMatch";import{PerformanceLogger as le,markEventReceived as Ae}from"./PerformanceLogger";import{detectRenderCause as ce,clearRenderCauseState as Fe}from"./RenderCauseDetector";import{notifySubscriberCountChange as ue}from"@buoy-gg/shared-ui";import{HIGHLIGHT_OVERLAY_COMPONENTS as Me,HIGHLIGHT_OVERLAY_PREFIXES as Ge,OTHER_DEV_TOOLS_COMPONENTS as Be,OTHER_DEV_TOOLS_EXACT as $e,OTHER_DEV_TOOLS_PREFIXES as je,isCapturingBuoyToolRenders as We,isPerfMonitorComponentName as Ke}from"./devtoolsComponentNames";let w=false;let V=false;let L=false;let N=false;let y=null;let O=null;let A=null;let z=null;let fe=false;let k=false;const F=new Set;const K=new Set;const q=new Map;const X=["#37afa9","#63b19e","#80b393","#97b488","#abb67d","#beb771","#cfb965","#dfba57","#efbb49","#febc38"];const qe=false;function f(e,n){if(!qe)return;if(n!==void 0){console.log(`[HighlightUpdates] ${e}`,n)}else{console.log(`[HighlightUpdates] ${e}`)}}function M(e){const n=Oe(e);if(n)return n;if(!e)return null;const i=e;if(i.canonical?.publicInstance){return i.canonical.publicInstance}if(i.canonical&&typeof i.canonical.measure==="function"){return i.canonical}if(typeof i.measure==="function"){return i}return null}function R(e){const n=Ne(e);if(n!==null)return n;if(e==null)return null;const i=e;if(i.__nativeTag!=null)return i.__nativeTag;if(i._nativeTag!=null)return i._nativeTag;if(i.nativeTag!=null)return i.nativeTag;if(i.canonical){if(i.canonical.__nativeTag!=null)return i.canonical.__nativeTag;if(i.canonical._nativeTag!=null)return i.canonical._nativeTag;if(i.canonical.nativeTag!=null)return i.canonical.nativeTag}return null}function Y(e){const n=e;const i={viewType:"Unknown"};if(n?.canonical?.viewConfig?.uiViewClassName){i.viewType=n.canonical.viewConfig.uiViewClassName}else if(n?.viewConfig?.uiViewClassName){i.viewType=n.viewConfig.uiViewClassName}else if(ae(n)){i.viewType=n.tagName.toLowerCase()}const o=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||W(n);const r=n?.canonical?.currentProps;const a=n?.canonical?.pendingProps;const t=o?.pendingProps;const c=o?.memoizedProps;i.testID=r?.testID||a?.testID||t?.testID||c?.testID||t?.["data-testid"]||c?.["data-testid"]||void 0;i.nativeID=r?.nativeID||a?.nativeID||t?.nativeID||c?.nativeID||t?.id||c?.id||void 0;i.accessibilityLabel=r?.accessibilityLabel||a?.accessibilityLabel||t?.accessibilityLabel||c?.accessibilityLabel||t?.["aria-label"]||c?.["aria-label"]||void 0;i.componentName=nn(o)||void 0;return i}function Gn(e){const n=e;const i=M(e);const o=R(e)||R(i);const r={nativeTag:o??"unknown",type:n?.canonical?"Fabric":"Legacy",hasMeasure:typeof i?.measure==="function"};if(n){r.stateNodeKeys=Object.keys(n).slice(0,20);if(n.node){r.nodeKeys=Object.keys(n.node).slice(0,20)}if(n.viewConfig){r.viewConfig={uiViewClassName:n.viewConfig.uiViewClassName,validAttributes:n.viewConfig.validAttributes?Object.keys(n.viewConfig.validAttributes).slice(0,10):void 0}}if(n.canonical){const a=n.canonical;r.canonicalKeys=Object.keys(a).slice(0,20);if(a.viewConfig){r.canonicalViewConfig={uiViewClassName:a.viewConfig.uiViewClassName}}if(a.nativeTag!=null){r.canonicalNativeTag=a.nativeTag}if(a.internalInstanceHandle){const t=a.internalInstanceHandle;r.fiberKeys=Object.keys(t).slice(0,30);if(t.type){r.fiberType=typeof t.type==="function"?t.type.name||t.type.displayName||"function":t.type}if(t.elementType){r.fiberElementType=typeof t.elementType==="function"?t.elementType.name||t.elementType.displayName||"function":t.elementType}if(t._debugOwner){const c=t._debugOwner;r.fiberDebugOwner=c.type?.name||c.type?.displayName||c.elementType?.name||"unknown"}if(t._debugSource){r.fiberDebugSource=t._debugSource}if(t.tag!=null){r.fiberTag=t.tag}if(t.pendingProps){if(t.pendingProps.nativeID)r.fiberPendingNativeID=t.pendingProps.nativeID;if(t.pendingProps.testID)r.fiberPendingTestID=t.pendingProps.testID}if(t.memoizedProps){if(t.memoizedProps.nativeID)r.fiberMemoizedNativeID=t.memoizedProps.nativeID;if(t.memoizedProps.testID)r.fiberMemoizedTestID=t.memoizedProps.testID}}if(a.publicInstance){const t=a.publicInstance;r.publicInstanceKeys=Object.keys(t).slice(0,20);if(t.nativeID!=null)r.nativeID=t.nativeID;if(t._nativeID!=null)r._nativeID=t._nativeID;if(t.props){r.publicInstanceProps=Object.keys(t.props).slice(0,15);if(t.props.nativeID)r.propsNativeID=t.props.nativeID;if(t.props.testID)r.propsTestID=t.props.testID;if(t.props.accessibilityLabel)r.accessibilityLabel=t.props.accessibilityLabel}}if(a.currentProps){r.currentPropsKeys=Object.keys(a.currentProps).slice(0,15);if(a.currentProps.nativeID!=null)r.currentPropsNativeID=a.currentProps.nativeID;if(a.currentProps.testID!=null)r.currentPropsTestID=a.currentProps.testID;if(a.currentProps.accessibilityLabel!=null)r.currentPropsAccessLabel=a.currentProps.accessibilityLabel}if(a.pendingProps){r.pendingPropsKeys=Object.keys(a.pendingProps).slice(0,15);if(a.pendingProps.nativeID!=null)r.pendingPropsNativeID=a.pendingProps.nativeID;if(a.pendingProps.testID!=null)r.pendingPropsTestID=a.pendingProps.testID}}if(n._debugOwner){const a=n._debugOwner;r.debugOwnerType=a.type?.name||a.type?.displayName||typeof a.type}if(n._debugSource){r.debugSource=n._debugSource}}return r}const de=false;let Xe=false;let Z=null;const Bn=350;const ge=new Set;function $n(e){if(e==null)return false;return ge.has(e)}const Ye=new Set(["highlight-updates-overlay","__rn_buoy__highlight-modal"]);const Ze=new Set(["jsmodal-root","image-overlay-standalone","logbox_inspector","logbox"]);const H=new Map;const pe=500;function Je(){H.clear()}function me(e){if(!e)return false;if(Ye.has(e))return true;if(e.startsWith("__highlight_"))return true;return false}function be(e){if(!e)return false;if(Ze.has(e))return true;const n=e.charCodeAt(0);if(n===95){if(e.startsWith("__rn_buoy__"))return true}if(n===108&&e.startsWith("logbox")){return true}return false}function he(e){if(!e)return null;const n=e.type;if(n){if(typeof n==="string")return n;if(n.name)return n.name;if(n.displayName)return n.displayName}const i=e.elementType;if(i){if(i.name)return i.name;if(i.displayName)return i.displayName}return null}const Qe=new Set(["View","Text","TextImpl","Image","ScrollView","FlatList","SectionList","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","Pressable","TextInput","Switch","ActivityIndicator","Modal","StatusBar","KeyboardAvoidingView","AnimatedComponent","AnimatedComponentWrapper","ScreenContainer","ScreenStack","Screen","ScreenContentWrapper","Svg","G","Path","Rect","Circle","Line","Polygon","Polyline","Ellipse","Text as SVGText","TSpan","TextPath","Use","Symbol","Defs","ClipPath","LinearGradient","RadialGradient","Stop","Mask","Pattern","Image as SVGImage","SafeAreaProvider","SafeAreaView","SafeAreaListener","GestureHandlerRootView","GestureDetector","ReanimatedView","ReanimatedText","ReanimatedImage","ReanimatedScrollView","Fragment","Suspense","Provider","Consumer","Context","ForwardRef"]);function en(e){if(!e)return true;if(Qe.has(e))return true;if(e==="Unknown"||e==="Component")return true;if(e.startsWith("Animated"))return true;return false}function nn(e){if(!e)return null;let n=e._debugOwner||e.return;let i=0;let o=null;while(n&&i<30){const r=he(n);if(r&&typeof n.type!=="string"){if(!o){o=r}if(!en(r)){return r}}n=n.return;i++}return o}function tn(e){const n=e;const i=n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||W(n);const o=R(e)||R(n?.canonical?.publicInstance);const r=We();const a=!r&&v.getSettings().excludeDevTools;if(a&&ae(e)&&e.closest("[data-buoy-root]"))return true;if(o!=null&&a){const p=H.get(o);if(p!==void 0){return p}}let t=false;const c=i?.pendingProps?.nativeID||i?.memoizedProps?.nativeID||n?.canonical?.currentProps?.nativeID||null;if(me(c)){t=true}else if(a&&be(c)){t=true}if(!t&&i){let p=i;let h=0;while(p&&h<30){const s=he(p);if(s){if(Me.has(s)){t=true;break}for(const g of Ge){if(s.startsWith(g)){t=true;break}}if(t)break;if(r&&Ke(s)){t=true;break}if(a){if(Be.has(s)||$e.has(s)){t=true;break}for(const g of je){if(s.startsWith(g)){t=true;break}}if(t)break}}const d=p.pendingProps?.nativeID||p.memoizedProps?.nativeID;if(me(d)){t=true;break}if(a&&be(d)){t=true;break}p=p.return;h++}}if(t&&o!=null&&a){if(H.size>=pe){const p=Array.from(H.keys());for(let h=0;h<pe/2;h++){H.delete(p[h])}}H.set(o,t)}return t}function rn(e){const n=Math.min(e-1,X.length-1);return X[Math.max(0,n)]}function an(e){if(e.size===0){return}if(!w&&!L){return}const n=v.getState();if(n.isPaused){return}if(le.isEnabled()){Ae()}const i=v.getBatchSize();const o=le.startBatch(e.size,i);const r=[];let a=0;let t=0;const c=v.hasActiveFilters();for(const s of e){if(s&&typeof s==="object"){try{if(tn(s)){a++;continue}const d=M(s);const g=R(s)||R(d);if(g==null){continue}const T=Y(s);if(c&&!v.passesFilters(T)){t++;continue}const P=v.getSettings().showRenderCount;let m;let u;if(P){const l=q.get(g)||0;m=l+1;q.set(g,m);u=rn(m)}else{m=0;u=X[0]}r.push({node:s,color:u,count:m})}catch{}}}o.markFilteringComplete(a+t,r.length);if(r.length===0){o.finish();return}if(de){console.log(`[HighlightUpdates] ${r.length} component(s) re-rendered`)}const p=v.getRenderEventCallbackCount()>0;if(!O&&!p){if(de){console.log(`[HighlightUpdates] No highlightCallback and no event callbacks - skipping render`)}fe=false;return}o.markMeasurementStart();const h=r.slice(0,i*4).map(({node:s,color:d,count:g})=>new Promise(T=>{let P=false;const m=b=>{if(P)return;P=true;clearTimeout(u);T(b)};const u=setTimeout(()=>m({rect:null,stateNode:s,color:d,count:g}),500);const l=M(s);const E=R(s)||R(l);if(E==null){m({rect:null,stateNode:s,color:d,count:g});return}const I=(b,D,_,S,ie,re)=>{if(ie==null||re==null||_==null||S==null){m({rect:null,stateNode:s,color:d,count:g});return}m({rect:{id:E,x:ie,y:re,width:_,height:S,color:d,count:g},stateNode:s,color:d,count:g})};if(!l){const b=s.node;const D=globalThis.nativeFabricUIManager;if(b&&D?.measure){try{D.measure(b,I)}catch(_){m({rect:null,stateNode:s,color:d,count:g})}return}m({rect:null,stateNode:s,color:d,count:g});return}try{l.measure(I)}catch(b){m({rect:null,stateNode:s,color:d,count:g})}}));Promise.all(h).then(s=>{const d=s.filter(T=>T.rect!==null);const g=d.map(T=>T.rect);o.markMeasurementComplete(d.length,s.length-d.length);if(g.length>0&&O&&w&&!V){O(g)}setTimeout(()=>{try{for(const u of d){if(u.rect)on(u.rect.id,u.stateNode)}}catch(u){f("registerTrackedNode batch failed",u)}const T=v.getSettings();const P=T.trackRenderCauses&&T.showRenderCount;let m=null;if(P){m=new Set;for(const{rect:u}of d){if(u){m.add(u.id)}}}if(w){v.startBatch();for(const{rect:u,stateNode:l,color:E,count:I}of d){if(u){const b=Y(l);let D;if(P&&m){const _=l;const S=J(_);D=ce(u.id,S,m,T.debugLogLevel)}v.trackRender({nativeTag:u.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:u.x,y:u.y,width:u.width,height:u.height},color:E,count:I,renderCause:D})}}v.endBatch()}else{for(const{rect:u,stateNode:l,color:E,count:I}of d){if(u){const b=Y(l);let D;if(P&&m){const _=l;const S=J(_);D=ce(u.id,S,m,T.debugLogLevel)}v.emitRenderEvent({nativeTag:u.id,viewType:b.viewType,testID:b.testID,nativeID:b.nativeID,accessibilityLabel:b.accessibilityLabel,componentName:b.componentName,measurements:{x:u.x,y:u.y,width:u.width,height:u.height},color:E,count:I,renderCause:D})}}}o.markTrackingComplete();o.markCallbackComplete();o.finish()},0)}).catch(s=>{console.error("[HighlightUpdates] Error in measurement pipeline:",s);o.finish()})}const ye=globalThis.WeakRef;const G=new Map;function on(e,n){if(e==null||n==null||typeof n!=="object"){return}try{G.set(e,ye?new ye(n):{deref:()=>n})}catch{G.set(e,{deref:()=>n})}}function sn(e){const n=G.get(e);const i=n?.deref();if(!i)G.delete(e);return i??null}function ln(e){return new Promise(n=>{try{e.measure((i,o,r,a,t,c)=>{if(t==null||c==null||r==null||a==null){n(null)}else{n({x:t,y:c,width:r,height:a})}})}catch{n(null)}})}function J(e){const n=e;return n?.canonical?.internalInstanceHandle||n?._internalInstanceHandle||n?._internalFiberInstanceHandleDEV||W(n)||null}function cn(e){let n=J(e);let i=0;while(n&&i++<200){const o=n.stateNode;if(o&&typeof o.scrollTo==="function"){const r=typeof o.getNativeScrollRef==="function"&&o.getNativeScrollRef()||null;const a=typeof o.getInnerViewNode==="function"&&o.getInnerViewNode()||typeof o.getScrollableNode==="function"&&o.getScrollableNode()||o;return{instance:o,nativeRef:r,innerNode:a}}n=n.return}return null}async function un(e,n,i){try{const o=cn(e);if(!o)return false;const r=n;let a=null;const t=c=>new Promise(p=>{let h=false;const s=g=>{if(h)return;h=true;p(g)};const d=setTimeout(()=>s(null),600);try{c(g=>{clearTimeout(d);s(g)})}catch{clearTimeout(d);s(null)}});if(o.nativeRef&&typeof r.measureLayout==="function"){a=await t(c=>r.measureLayout(o.nativeRef,(p,h)=>c(h),()=>c(null)))}if(a==null){const c=oe(n);const p=typeof o.innerNode==="number"?o.innerNode:oe(o.innerNode);if(c!=null&&p!=null){a=await t(h=>Ve.measureLayout(c,p,()=>h(null),(s,d)=>h(d)))}}if(a==null)return false;o.instance.scrollTo({y:Math.max(0,a-i),animated:false});await new Promise(c=>setTimeout(c,80));return true}catch{return false}}function fn(e,n){const i=[e.testID,e.nativeID,e.accessibilityLabel,e.componentName,e.viewType,String(e.nativeTag)];let o=0;for(const r of i){if(!r)continue;const a=r.toLowerCase();if(a===n)return 3;if(a.startsWith(n))o=Math.max(o,2);else if(a.includes(n))o=Math.max(o,1)}return o}async function dn(e){const n=e.scrollIntoView!==false;const i=typeof e.margin==="number"?e.margin:12;const o=v.getRenders();const r=async()=>{const l=await xe();const E=(e.query??"").trim().toLowerCase();let I;for(const _ of l.elements){if(e.nativeTag!=null&&_.nativeTag===e.nativeTag){I={el:_,score:1e3};break}const S=Ue({nativeTag:_.nativeTag,testID:_.testID,label:_.label,text:_.text,name:_.name,tap:_.tap},{query:E||void 0,nativeTag:e.nativeTag});if(S<=0)continue;if(!I||S>I.score)I={el:_,score:S}}if(!I?.el.frame){return{matched:false,reason:"no-match",candidates:[]}}const b=l.screen;const D=I.el.frame;return{matched:true,live:true,rect:{x:D.x*b.width,y:D.y*b.height,width:D.width*b.width,height:D.height*b.height},scale:se.get(),screen:{width:b.width,height:b.height},nativeTag:I.el.nativeTag??void 0,componentName:I.el.name,testID:I.el.testID}};if(o.length===0)return r();const a=(e.query??"").trim().toLowerCase();const t=a?o.map(l=>({r:l,score:fn(l,a)})).filter(l=>l.score>0).sort((l,E)=>E.score-l.score||E.r.lastRenderTime-l.r.lastRenderTime):[];const c=t.slice(0,8).map(({r:l})=>({nativeTag:l.nativeTag,componentName:l.componentName,testID:l.testID,nativeID:l.nativeID,viewType:l.viewType,renderCount:l.renderCount}));const p=e.nativeTag??(t.length>0?t[0].r.nativeTag:void 0);if(p==null){const l=await r();return l.matched?l:{matched:false,reason:"no-match",candidates:c}}const h=o.find(l=>l.nativeTag===p);let s=null;let d=false;let g=false;const T=sn(p);if(T){const l=M(T);if(l){if(n){g=await un(T,l,i)}s=await ln(l);d=!!s}}if(!s&&h?.measurements){s={...h.measurements}}if(!s){return{matched:false,reason:"no-measurement",nativeTag:p,candidates:c}}const P=se.get();const m=ze.get("window");const u=s.x>=-1&&s.y>=-1&&s.x+s.width<=m.width+1&&s.y+s.height<=m.height+1;return{matched:true,live:d,scrolled:g,inView:u,rect:s,scale:P,screen:{width:m.width,height:m.height},nativeTag:p,componentName:h?.componentName,testID:h?.testID,candidates:c}}function _e(e){if(!y?.rendererInterfaces){f("No rendererInterfaces available");return}let n=0;y.rendererInterfaces.forEach((i,o)=>{if(typeof i.setTraceUpdatesEnabled==="function"){try{i.setTraceUpdatesEnabled(e);n++;f(`Renderer ${o}: setTraceUpdatesEnabled(${e})`)}catch(r){f(`Renderer ${o}: error setting trace updates`,r)}}else{f(`Renderer ${o}: no setTraceUpdatesEnabled method`)}});f(`Set trace updates ${e?"enabled":"disabled"} on ${n} renderer(s)`);if(y.reactDevtoolsAgent?.setTraceUpdatesEnabled){try{y.reactDevtoolsAgent.setTraceUpdatesEnabled(e);f("Also set trace updates on agent")}catch(i){f("Error setting trace updates on agent",i)}}}function Te(){if(!y)return;if(z)return;f("Subscribing to traceUpdates event");if(typeof y.sub==="function"){z=y.sub("traceUpdates",an);f("Subscribed using hook.sub()")}else{f("hook.sub not available, traceUpdates may not work")}_e(true)}function Q(){_e(false);if(z){z();z=null;f("Unsubscribed from traceUpdates event")}}function Ie(e){O=e;f(`Highlight callback ${e?"set":"cleared"}`)}function gn(e){A=e;f(`Badge press callback ${e?"set":"cleared"}`)}function pn(){return A}function mn(e){if(A){A(e)}}let ee=null;let B=null;function bn(e){ee=e;if(e&&B!==null){e(B)}}function hn(e){if(C){C("setSpotlight",{nativeTag:e});return}B=e;if(ee){ee(e)}}let C=null;function yn(e){C=e}function _n(e){if(w!==e.enabled){w=e.enabled;ne()}if(k!==e.frozen){k=e.frozen;j()}}function Tn(){return B}function ne(){K.forEach(e=>{try{e(w)}catch(n){console.error("[HighlightUpdates] Error in state listener:",n)}})}function ve(e){K.add(e);e(w);return()=>{K.delete(e)}}function $(){if(typeof __DEV__!=="undefined"&&!__DEV__){f("Only available in development builds");return false}if(C){return true}if(N){return true}y=window?.__REACT_DEVTOOLS_GLOBAL_HOOK__||null;if(!y){f("React DevTools hook not found");return false}f("Hook found");f(`Hook has sub: ${typeof y.sub==="function"}`);f(`Hook has on: ${typeof y.on==="function"}`);f(`Hook has emit: ${typeof y.emit==="function"}`);Le();if(y.rendererInterfaces&&y.rendererInterfaces.size>0){N=true;f(`Initialized with ${y.rendererInterfaces.size} renderer(s)`);we();return true}const e=setInterval(()=>{if(y?.rendererInterfaces&&y.rendererInterfaces.size>0){clearInterval(e);N=true;f(`Initialized with ${y.rendererInterfaces.size} renderer(s) (delayed)`);we()}},100);setTimeout(()=>clearInterval(e),1e4);return false}function we(){if(typeof window!=="undefined"){window.__HIGHLIGHT_UPDATES_CONTROLLER__={enable:x,disable:U,toggle:De,isEnabled:Ce,setEnabled:ke,subscribe:ve,initialize:$,destroy:Se,isInitialized:()=>N,setHighlightCallback:Ie}}}function x(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!N){$()}if(V){V=false}if(w){return}f("Enabling highlights");if(!L){Te()}v.start();w=true;ne();ue("render")}function U(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!w){return}f("Disabling highlights");Xe=false;fe=false;if(Z){clearTimeout(Z);Z=null}ge.clear();H.clear();Fe();if(k){k=false;j()}if(!L){Q()}v.stop();w=false;ne();ue("render")}function In(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(L){return}if(!N){$()}f("Enabling background tracking");if(!w){Te()}L=true}function vn(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!L){return}f("Disabling background tracking");L=false;if(!w){Q()}}function wn(){return L}function De(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(C){C("toggle");return}if(w){U()}else{x()}}function Dn(){if(C){C("clearRenderCounts");return}q.clear();v.clear();f("Cleared render counts")}function Ce(){return w}function ke(e){if(C){C("setEnabled",{enabled:e});return}if(e)x();else U()}function te(e){if(V===e)return;V=e;if(e&&O){O([])}}function Cn(){return V}function kn(e){if(C){C("setSilentTracking",{enabled:e});return}if(e){x();te(true)}else{te(false);U()}}function En(){return N}function j(){F.forEach(e=>{try{e(k)}catch(n){console.error("[HighlightUpdates] Error in freeze listener:",n)}})}function Pn(e){F.add(e);e(k);return()=>{F.delete(e)}}function Ee(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(k)return;k=true;f("Freeze mode enabled");j()}function Pe(){if(typeof __DEV__!=="undefined"&&!__DEV__)return;if(!k)return;k=false;f("Freeze mode disabled");if(O){O([])}j()}function Sn(){if(C){C("toggleFreeze");return}if(k){Pe()}else{Ee()}}function Nn(){return k}function Se(){if(!N)return;Q();Re();He(null);k=false;F.clear();w=false;y=null;O=null;N=false;if(typeof window!=="undefined"){delete window.__HIGHLIGHT_UPDATES_CONTROLLER__}f("Destroyed")}const On={subscribe:ve,enable:x,disable:U,toggle:De,isEnabled:Ce,setEnabled:ke,initialize:$,destroy:Se,isInitialized:En,setHighlightCallback:Ie,clearRenderCounts:Dn,freeze:Ee,unfreeze:Pe,toggleFreeze:Sn,getFrozen:Nn,subscribeToFreeze:Pn,setBadgePressCallback:gn,getBadgePressCallback:pn,handleBadgePress:mn,setSpotlightCallback:bn,setSpotlight:hn,getSpotlight:Tn,clearDevToolsCache:Je,enableBackgroundTracking:In,disableBackgroundTracking:vn,isBackgroundTrackingEnabled:wn,setRemoteHandler:yn,replaceRemoteState:_n,locateComponent:dn,setHighlightsSuppressed:te,getHighlightsSuppressed:Cn,setSilentTracking:kn};export default On;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{getDOMFiber as b,getDOMNodeHandle as y}from"@buoy-gg/shared-ui/utils";import{describeScreen as N}from"./screenElements";import{scoreTapMatch as S}from"./tapMatch";const T=new Set(["View","Text","TextImpl","Image","ScrollView","FlatList","SectionList","Pressable","TouchableOpacity","TouchableHighlight","TouchableWithoutFeedback","TouchableNativeFeedback","TextInput","Switch","ActivityIndicator","Modal","SafeAreaView","SafeAreaProvider","KeyboardAvoidingView","VirtualizedList","Screen","ScreenContainer","ScreenStack","ScreenContentWrapper","GestureHandlerRootView","GestureDetector","Wrapper"]);function d(e){const t=e.return;const o=t?.elementType??t?.type;return t&&o?.$$typeof===Symbol.for("react.memo")&&(o.type===e.type||o.type===e.elementType)?t:null}function m(e){let t="";let o=e.tag===14||e.tag===15;let r=e.tag===11;const n=new Set;const s=i=>{if(!i||n.has(i)||n.size>20)return;n.add(i);t||=i.displayName||(typeof i==="function"?i.name:"");if(i.$$typeof===Symbol.for("react.memo")){o=true;s(i.type)}if(i.$$typeof===Symbol.for("react.forward_ref")){r=true;s(i.render)}};s(e.elementType);s(e.type);const a=d(e);if(a)s(a.elementType??a.type);return{name:t||"Anonymous",memo:o,forwardRef:r}}function p(e){if(!e||typeof e.type==="string"||![0,1,2,11,14,15].includes(e.tag))return false;const{name:t}=m(e);const o=e._debugSource?.fileName??"";return!T.has(t)&&!/^(Animated|RCT|Reanimated|Buoy|DevTools|FloatingDevTools|HighlightUpdates)/.test(t)&&!/[@/]buoy-gg\/|\/react-native\//.test(o)&&!e.memoizedProps?.__buoyDevToolsRoot}function _(e){const t=m(e);const o=d(e);const r=e._debugSource??o?._debugSource;if(typeof r?.fileName==="string"&&r.fileName){t.source={fileName:r.fileName};if(Number.isFinite(r.lineNumber))t.source.lineNumber=r.lineNumber;if(Number.isFinite(r.columnNumber))t.source.columnNumber=r.columnNumber}else{const n=e._debugStack??o?._debugStack;if(typeof n?.stack==="string")t.rawStack=n.stack}return t}function v(e){const t=e.child?[e.child]:[];let o=0;while(t.length&&o++<300){const r=t.shift();if(r._debugOwner===e){const n=r._debugSource;if(typeof n?.fileName==="string"&&n.fileName){return{source:{fileName:n.fileName,...Number.isFinite(n.lineNumber)?{lineNumber:n.lineNumber}:{},...Number.isFinite(n.columnNumber)?{columnNumber:n.columnNumber}:{}}}}if(typeof r._debugStack?.stack==="string")return{rawStack:r._debugStack.stack}}if(r.child)t.push(r.child);if(r.sibling)t.push(r.sibling)}return void 0}export function sourceFromFiber(e){const t=[];let o=null;const r=new Set;let n=e;while(n&&!r.has(n)&&r.size<400&&t.length<7){r.add(n);if(p(n)){if(!t.length)o=n;t.push(_(n))}const a=d(n);n=n._debugOwner||a?._debugOwner||a?.return||n.return;if(a&&n===a)n=a._debugOwner||a.return}if(!t.length)return{found:false,reason:"No app component was found for this view."};const s=o?v(o):void 0;return{found:true,component:s?{...t[0],definedIn:s}:t[0],owners:t.slice(1)}}export function fiberFromStateNode(e){return e?.canonical?.internalInstanceHandle||e?._internalInstanceHandle||e?._internalFiberInstanceHandleDEV||b(e)||null}function w(e){return y(e)??e?.__nativeTag??e?._nativeTag??e?.nativeTag??e?.canonical?.__nativeTag??e?.canonical?._nativeTag??e?.canonical?.nativeTag??null}const F=1e5;function k(e){const t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;const o=[];const r=a=>{try{t?.getFiberRoots?.(a)?.forEach(i=>o.push(i.current))}catch{}};t?.renderers?.forEach((a,i)=>r(i));if(!o.length)r(1);const n=[...o];const s=new Set;while(n.length){if(s.size>=F)return{fiber:null,capped:true,any:true};const a=n.pop();if(!a||s.has(a))continue;s.add(a);if(a.sibling)n.push(a.sibling);const i=a.memoizedProps??{};if(a.tag===22&&a.memoizedState!=null||i.__buoyDevToolsRoot||i.activityState===0||i.activityState===1||i.isPageFocused===false||i["aria-hidden"]===true&&(i.activityState!==void 0||"shouldFreeze"in i)||i.isFocused===false&&(i.routeKey!==void 0||"freezeContents"in i))continue;if(e(a))return{fiber:a,capped:false,any:true};if(a.child)n.push(a.child)}return{fiber:null,capped:false,any:o.length>0}}export async function getComponentSource(e={}){try{const{nativeTag:t,query:o}=e??{};if(t!==void 0&&(!Number.isInteger(t)||t<0)||o!==void 0&&typeof o!=="string"){return{found:false,reason:"Pass a valid nativeTag or a text query."}}const r=o?.trim();if(t==null&&!r)return{found:false,reason:"Pass a query or nativeTag."};let n=false;let s=false;const a=c=>{const u=k(c);n||=u.capped;s||=u.any;return u.fiber??void 0};const i=c=>a(u=>u.stateNode&&w(u.stateNode)===c);let l=t!=null?i(t):void 0;if(t==null&&r){l=a(c=>p(c)&&m(c).name.toLowerCase()===r.toLowerCase());if(!l){const c=await N({});const u=c.elements.map(f=>({el:f,score:S(f,{query:r})})).filter(({score:f})=>f>0).sort((f,h)=>h.score-f.score);const g=u[0]?.el;if(g?.nativeTag!=null)l=i(g.nativeTag)}}if(!l&&!s)return{found:false,reason:"No React tree was found. Use a dev build."};if(!l){return{found:false,reason:n?"The React tree is too big to search fully, and no view matched in the part searched. Pass the nativeTag from describe_screen.":"No view matched. Check describe_screen for its name or tag."}}return sourceFromFiber(fiberFromStateNode(l.stateNode)??l)}catch{return{found:false,reason:"Could not read the React tree. Try again in a dev build."}}}
|