react-native-inapp-inspector 2.3.24 → 2.4.0

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.
Files changed (207) hide show
  1. package/README.md +26 -5
  2. package/dist/commonjs/components/AnalyticsDetail.js +15 -12
  3. package/dist/commonjs/components/AnalyticsEventCard.js +11 -8
  4. package/dist/commonjs/components/AppHeaderLogo.js +4 -6
  5. package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -0
  6. package/dist/commonjs/components/ConsoleLogCard.js +92 -80
  7. package/dist/commonjs/components/EndOfListFooter.d.ts +5 -1
  8. package/dist/commonjs/components/EndOfListFooter.js +27 -5
  9. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1 -1
  10. package/dist/commonjs/components/Inspector/AnalyticsTab.js +27 -299
  11. package/dist/commonjs/components/Inspector/ConsoleTab.js +36 -94
  12. package/dist/commonjs/components/Inspector/CrashDetail.js +11 -10
  13. package/dist/commonjs/components/Inspector/CrashTab.js +43 -33
  14. package/dist/commonjs/components/Inspector/DebuggingTab.js +13 -13
  15. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +107 -71
  16. package/dist/commonjs/components/Inspector/FabLauncher.js +8 -9
  17. package/dist/commonjs/components/Inspector/InspectorHeader.js +93 -70
  18. package/dist/commonjs/components/Inspector/LogDetail.js +10 -7
  19. package/dist/commonjs/components/Inspector/MainScreen.js +66 -30
  20. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +1 -1
  21. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +3 -3
  22. package/dist/commonjs/components/Inspector/NetworkDetail.js +29 -28
  23. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +1 -1
  24. package/dist/commonjs/components/Inspector/NetworkTab.js +87 -85
  25. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +3 -3
  26. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +21 -22
  27. package/dist/commonjs/components/Inspector/PushCard.d.ts +4 -0
  28. package/dist/commonjs/components/Inspector/PushCard.js +89 -0
  29. package/dist/commonjs/components/Inspector/PushDetail.d.ts +4 -0
  30. package/dist/commonjs/components/Inspector/PushDetail.js +190 -0
  31. package/dist/commonjs/components/Inspector/PushTab.d.ts +3 -0
  32. package/dist/commonjs/components/Inspector/PushTab.js +45 -0
  33. package/dist/commonjs/components/Inspector/ReduxDetail.js +16 -13
  34. package/dist/commonjs/components/Inspector/ReduxTab.js +109 -106
  35. package/dist/commonjs/components/Inspector/SettingsPanel.js +230 -134
  36. package/dist/commonjs/components/Inspector/StorageTab.js +55 -51
  37. package/dist/commonjs/components/Inspector/TabBar.js +30 -26
  38. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +2 -2
  39. package/dist/commonjs/components/JsonViewer.js +151 -159
  40. package/dist/commonjs/components/LogCard.js +34 -38
  41. package/dist/commonjs/components/LogSyntaxHighlighter.js +3 -3
  42. package/dist/commonjs/components/ModuleErrorBoundary.d.ts +24 -0
  43. package/dist/commonjs/components/ModuleErrorBoundary.js +33 -0
  44. package/dist/commonjs/components/NetworkIcons.d.ts +3 -3
  45. package/dist/commonjs/components/NetworkIcons.js +10 -6
  46. package/dist/commonjs/components/SegmentedTabs.d.ts +8 -2
  47. package/dist/commonjs/components/SegmentedTabs.js +11 -7
  48. package/dist/commonjs/components/ShareButton.d.ts +11 -0
  49. package/dist/commonjs/components/ShareButton.js +6 -0
  50. package/dist/commonjs/constants/index.js +1 -1
  51. package/dist/commonjs/constants/version.d.ts +1 -1
  52. package/dist/commonjs/constants/version.js +1 -1
  53. package/dist/commonjs/customHooks/crashHandler.js +4 -4
  54. package/dist/commonjs/customHooks/networkLogger.js +1 -2
  55. package/dist/commonjs/customHooks/pushNotificationLogger.d.ts +19 -0
  56. package/dist/commonjs/customHooks/pushNotificationLogger.js +1 -0
  57. package/dist/commonjs/helpers/index.d.ts +6 -0
  58. package/dist/commonjs/helpers/index.js +4 -4
  59. package/dist/commonjs/helpers/memoryManager.d.ts +2 -2
  60. package/dist/commonjs/helpers/memoryManager.js +1 -1
  61. package/dist/commonjs/helpers/remoteConfig.js +1 -1
  62. package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
  63. package/dist/commonjs/helpers/settingsStore.js +1 -1
  64. package/dist/commonjs/helpers/shareFormatter.d.ts +13 -0
  65. package/dist/commonjs/helpers/shareFormatter.js +7 -0
  66. package/dist/commonjs/i18n/index.d.ts +35 -0
  67. package/dist/commonjs/i18n/index.js +1 -1
  68. package/dist/commonjs/i18n/locales/ar.json +1 -0
  69. package/dist/commonjs/i18n/locales/de.json +1 -0
  70. package/dist/commonjs/i18n/locales/en.json +1 -1
  71. package/dist/commonjs/i18n/locales/es.json +1 -0
  72. package/dist/commonjs/i18n/locales/fr.json +1 -0
  73. package/dist/commonjs/i18n/locales/hi.json +1 -0
  74. package/dist/commonjs/i18n/locales/ja.json +1 -0
  75. package/dist/commonjs/i18n/locales/ko.json +1 -0
  76. package/dist/commonjs/i18n/locales/pt.json +1 -0
  77. package/dist/commonjs/i18n/locales/ru.json +1 -0
  78. package/dist/commonjs/i18n/locales/zh.json +1 -0
  79. package/dist/commonjs/index.d.ts +6 -5
  80. package/dist/commonjs/index.js +4 -4
  81. package/dist/commonjs/push.d.ts +4 -0
  82. package/dist/commonjs/push.js +1 -0
  83. package/dist/commonjs/styles/AppColors.d.ts +40 -0
  84. package/dist/commonjs/styles/AppColors.js +1 -1
  85. package/dist/commonjs/styles/index.js +1 -1
  86. package/dist/commonjs/types/enums.d.ts +30 -20
  87. package/dist/commonjs/types/enums.js +1 -1
  88. package/dist/commonjs/types/index.d.ts +10 -0
  89. package/dist/commonjs/types/interfaces.d.ts +63 -7
  90. package/dist/esm/components/AnalyticsDetail.js +84 -81
  91. package/dist/esm/components/AnalyticsEventCard.js +20 -17
  92. package/dist/esm/components/AppHeaderLogo.js +5 -7
  93. package/dist/esm/components/ConsoleLogCard.d.ts +1 -0
  94. package/dist/esm/components/ConsoleLogCard.js +98 -86
  95. package/dist/esm/components/EndOfListFooter.d.ts +5 -1
  96. package/dist/esm/components/EndOfListFooter.js +36 -14
  97. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +14 -14
  98. package/dist/esm/components/Inspector/AnalyticsTab.js +44 -316
  99. package/dist/esm/components/Inspector/ConsoleTab.js +55 -113
  100. package/dist/esm/components/Inspector/CrashDetail.js +53 -52
  101. package/dist/esm/components/Inspector/CrashTab.js +74 -64
  102. package/dist/esm/components/Inspector/DebuggingTab.js +33 -33
  103. package/dist/esm/components/Inspector/DeviceInfoTab.js +174 -138
  104. package/dist/esm/components/Inspector/FabLauncher.js +41 -42
  105. package/dist/esm/components/Inspector/InspectorHeader.js +138 -115
  106. package/dist/esm/components/Inspector/LogDetail.js +24 -21
  107. package/dist/esm/components/Inspector/MainScreen.js +98 -62
  108. package/dist/esm/components/Inspector/MediaGalleryTab.js +1 -1
  109. package/dist/esm/components/Inspector/MediaPreviewModal.js +31 -31
  110. package/dist/esm/components/Inspector/NetworkDetail.js +88 -87
  111. package/dist/esm/components/Inspector/NetworkFilterModal.js +8 -8
  112. package/dist/esm/components/Inspector/NetworkTab.js +132 -130
  113. package/dist/esm/components/Inspector/NpmStarPrompt.js +42 -42
  114. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -46
  115. package/dist/esm/components/Inspector/PushCard.d.ts +4 -0
  116. package/dist/esm/components/Inspector/PushCard.js +89 -0
  117. package/dist/esm/components/Inspector/PushDetail.d.ts +4 -0
  118. package/dist/esm/components/Inspector/PushDetail.js +190 -0
  119. package/dist/esm/components/Inspector/PushTab.d.ts +3 -0
  120. package/dist/esm/components/Inspector/PushTab.js +45 -0
  121. package/dist/esm/components/Inspector/ReduxDetail.js +40 -37
  122. package/dist/esm/components/Inspector/ReduxTab.js +155 -152
  123. package/dist/esm/components/Inspector/SettingsPanel.js +380 -284
  124. package/dist/esm/components/Inspector/StorageTab.js +177 -173
  125. package/dist/esm/components/Inspector/TabBar.js +38 -34
  126. package/dist/esm/components/Inspector/UpdateAvailableModal.js +1 -1
  127. package/dist/esm/components/JsonViewer.js +161 -169
  128. package/dist/esm/components/LogCard.js +38 -42
  129. package/dist/esm/components/LogSyntaxHighlighter.js +1 -1
  130. package/dist/esm/components/ModuleErrorBoundary.d.ts +24 -0
  131. package/dist/esm/components/ModuleErrorBoundary.js +33 -0
  132. package/dist/esm/components/NetworkIcons.d.ts +3 -3
  133. package/dist/esm/components/NetworkIcons.js +7 -3
  134. package/dist/esm/components/SegmentedTabs.d.ts +8 -2
  135. package/dist/esm/components/SegmentedTabs.js +12 -8
  136. package/dist/esm/components/ShareButton.d.ts +11 -0
  137. package/dist/esm/components/ShareButton.js +6 -0
  138. package/dist/esm/constants/index.js +1 -1
  139. package/dist/esm/constants/version.d.ts +1 -1
  140. package/dist/esm/constants/version.js +1 -1
  141. package/dist/esm/customHooks/crashHandler.js +6 -6
  142. package/dist/esm/customHooks/networkLogger.js +1 -2
  143. package/dist/esm/customHooks/pushNotificationLogger.d.ts +19 -0
  144. package/dist/esm/customHooks/pushNotificationLogger.js +1 -0
  145. package/dist/esm/helpers/index.d.ts +6 -0
  146. package/dist/esm/helpers/index.js +4 -4
  147. package/dist/esm/helpers/memoryManager.d.ts +2 -2
  148. package/dist/esm/helpers/memoryManager.js +1 -1
  149. package/dist/esm/helpers/remoteConfig.js +1 -1
  150. package/dist/esm/helpers/settingsStore.d.ts +1 -0
  151. package/dist/esm/helpers/settingsStore.js +1 -1
  152. package/dist/esm/helpers/shareFormatter.d.ts +13 -0
  153. package/dist/esm/helpers/shareFormatter.js +7 -0
  154. package/dist/esm/i18n/index.d.ts +35 -0
  155. package/dist/esm/i18n/index.js +1 -1
  156. package/dist/esm/i18n/locales/ar.json +1 -0
  157. package/dist/esm/i18n/locales/de.json +1 -0
  158. package/dist/esm/i18n/locales/en.json +1 -1
  159. package/dist/esm/i18n/locales/es.json +1 -0
  160. package/dist/esm/i18n/locales/fr.json +1 -0
  161. package/dist/esm/i18n/locales/hi.json +1 -0
  162. package/dist/esm/i18n/locales/ja.json +1 -0
  163. package/dist/esm/i18n/locales/ko.json +1 -0
  164. package/dist/esm/i18n/locales/pt.json +1 -0
  165. package/dist/esm/i18n/locales/ru.json +1 -0
  166. package/dist/esm/i18n/locales/zh.json +1 -0
  167. package/dist/esm/index.d.ts +6 -5
  168. package/dist/esm/index.js +7 -7
  169. package/dist/esm/push.d.ts +4 -0
  170. package/dist/esm/push.js +1 -0
  171. package/dist/esm/styles/AppColors.d.ts +40 -0
  172. package/dist/esm/styles/AppColors.js +1 -1
  173. package/dist/esm/styles/index.js +1 -1
  174. package/dist/esm/types/enums.d.ts +30 -20
  175. package/dist/esm/types/enums.js +1 -1
  176. package/dist/esm/types/index.d.ts +10 -0
  177. package/dist/esm/types/interfaces.d.ts +63 -7
  178. package/package.json +53 -24
  179. package/src/native/NativeInspector.ts +0 -1
  180. package/dist/commonjs/bundle.d.ts +0 -2
  181. package/dist/commonjs/bundle.js +0 -1
  182. package/dist/commonjs/components/BrandSquareIcon.d.ts +0 -5
  183. package/dist/commonjs/components/BrandSquareIcon.js +0 -112
  184. package/dist/commonjs/components/Inspector/BundleTab.d.ts +0 -48
  185. package/dist/commonjs/components/Inspector/BundleTab.js +0 -1297
  186. package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +0 -27
  187. package/dist/commonjs/components/Inspector/PerformanceTab.js +0 -454
  188. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -115
  189. package/dist/commonjs/customHooks/bundleAnalyzer.js +0 -1
  190. package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -144
  191. package/dist/commonjs/customHooks/performanceTracker.js +0 -63
  192. package/dist/commonjs/performance.d.ts +0 -2
  193. package/dist/commonjs/performance.js +0 -1
  194. package/dist/esm/bundle.d.ts +0 -2
  195. package/dist/esm/bundle.js +0 -1
  196. package/dist/esm/components/BrandSquareIcon.d.ts +0 -5
  197. package/dist/esm/components/BrandSquareIcon.js +0 -112
  198. package/dist/esm/components/Inspector/BundleTab.d.ts +0 -48
  199. package/dist/esm/components/Inspector/BundleTab.js +0 -1297
  200. package/dist/esm/components/Inspector/PerformanceTab.d.ts +0 -27
  201. package/dist/esm/components/Inspector/PerformanceTab.js +0 -454
  202. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -115
  203. package/dist/esm/customHooks/bundleAnalyzer.js +0 -1
  204. package/dist/esm/customHooks/performanceTracker.d.ts +0 -144
  205. package/dist/esm/customHooks/performanceTracker.js +0 -63
  206. package/dist/esm/performance.d.ts +0 -2
  207. package/dist/esm/performance.js +0 -1
@@ -1 +0,0 @@
1
- import{AppColors as a}from"../styles/AppColors";import{t as r}from"../i18n";import{NativeModules as I,Platform as F,TurboModuleRegistry as ye}from"react-native";let A=null,z=!1;const T=[];let le=!1;export const setBundleModuleEnabled=e=>{le=e},getBundleModuleEnabled=()=>le;const Ne=()=>{try{const e=I?.SourceCode,n=e?.scriptURL||e?.getConstants?.()?.scriptURL;if(typeof n=="string"&&n.length>0)return{scriptURL:n}}catch{}try{const e=ye?.get?.("SourceCode"),n=e?.getConstants?.(),o=e?.scriptURL||n?.scriptURL;if(typeof o=="string"&&o.length>0)return{scriptURL:o}}catch{}return null};export const getHostScriptURL=()=>{try{const e=Ne()?.scriptURL;if(typeof e=="string"&&e.length>0)return e}catch{}try{const e=I?.PlatformConstants?.serverHost||I?.AndroidConstants?.serverHost||I?.DevSettings?.serverHost||I?.DevSettings?.getConstants?.()?.serverHost;if(typeof e=="string"&&e.length>0)return`${e.startsWith("http")?e:`http://${e}`}/index.bundle?platform=${F.OS}&dev=true`}catch{}try{const e=globalThis?.__DEV_SERVER_URL__||globalThis?.__METRO_SERVER_HOST__||globalThis?.__DEV_SERVER_PORT__||globalThis?.__METRO_PORT__;if(typeof e=="number")return`http://${F.OS==="android"?"10.0.2.2":"localhost"}:${e}/index.bundle?platform=${F.OS}&dev=true`;if(typeof e=="string"&&e.length>0)return/^\d+$/.test(e)?`http://${F.OS==="android"?"10.0.2.2":"localhost"}:${e}/index.bundle?platform=${F.OS}&dev=true`:e.startsWith("http")?e:`http://${e}/index.bundle?platform=${F.OS}&dev=true`}catch{}return""};const ue=[8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,19e3,19001,3e3],_e=e=>{if(!e||typeof e!="string")return{host:null,port:null};const n=e.match(/^https?:\/\/([^:/]+)(?::(\d+))?/);return n?{host:n[1]||null,port:n[2]?parseInt(n[2],10):null}:{host:null,port:null}},Fe=async(e,n=3e3)=>{const{host:o,port:l}=_e(e);if(e&&e.startsWith("http"))try{const b=new AbortController,k=setTimeout(()=>b.abort(),n),g=await fetch(e,{signal:b.signal});if(clearTimeout(k),g.ok){const f=g.headers.get("content-length"),x=await g.text();if(x&&x.length>0){const M=f&&parseInt(f,10)||x.length;return{text:x,bytes:M,url:e}}}}catch{}const d=o?[o,"localhost","127.0.0.1",...F.OS==="android"?["10.0.2.2","10.0.3.2"]:[]]:["localhost","127.0.0.1",...F.OS==="android"?["10.0.2.2","10.0.3.2"]:[]],m=Array.from(new Set(d)),h=l?Array.from(new Set([l,...ue])):ue,c=[];for(const b of m)for(const k of h)c.push(new Promise(async(g,f)=>{const x=new AbortController,M=setTimeout(()=>x.abort(),700);try{const j=await fetch(`http://${b}:${k}/status`,{signal:x.signal});if(clearTimeout(M),j.ok){const C=await j.text();if(C&&C.includes("packager-status:running")){g({host:b,port:k});return}}}catch{clearTimeout(M)}f(new Error("unreachable"))}));let u=null;try{u=await new Promise((b,k)=>{let g=c.length;if(g===0){k(new Error("No candidate hosts"));return}c.forEach(f=>{f.then(b).catch(()=>{g--,g===0&&k(new Error("All probes failed"))})})})}catch{u=null}if(u){const b=`http://${u.host}:${u.port}/index.bundle?platform=${F.OS}&dev=true`;try{const k=new AbortController,g=setTimeout(()=>k.abort(),n),f=await fetch(b,{signal:k.signal});if(clearTimeout(g),f.ok){const x=f.headers.get("content-length"),M=await f.text();if(M&&M.length>0){const j=x&&parseInt(x,10)||M.length;return{text:M,bytes:j,url:b}}}}catch{}}return null},pe=new Set,me=new Map;export const trackRuntimeModuleExecution=()=>{try{const e=globalThis,n=e.__r;if(typeof n=="function"&&!n.__inspectorTracked){const o=function(l,...d){return pe.add(Number(l)),n.call(this,l,...d)};Object.defineProperty(o,"__inspectorTracked",{value:!0,enumerable:!1}),e.__r=o}}catch{}},trackRuntimeDefine=()=>{try{const e=globalThis,n=e.__d;if(typeof n=="function"&&!n.__inspectorTracked){const o=function(l,d,m,h,...c){return typeof h=="string"&&h.length>0&&me.set(Number(d),{id:Number(d),path:h}),n.call(this,l,d,m,h,...c)};Object.defineProperty(o,"__inspectorTracked",{value:!0,enumerable:!1}),e.__d=o}}catch{}};trackRuntimeModuleExecution(),trackRuntimeDefine();const Ae=[{id:1,deps:[2,3,4],path:"index.js"},{id:2,deps:[4,5,13,14,15,16],path:"App.tsx"},{id:3,deps:[],path:"node_modules/react-native/index.js"},{id:4,deps:[],path:"node_modules/react/index.js"},{id:5,deps:[6,7],path:"node_modules/@react-navigation/native/src/index.ts"},{id:6,deps:[],path:"node_modules/react-native-screens/src/index.ts"},{id:7,deps:[],path:"node_modules/react-native-safe-area-context/src/index.ts"},{id:8,deps:[],path:"node_modules/react-native-svg/src/index.ts"},{id:9,deps:[],path:"node_modules/axios/index.js"},{id:10,deps:[],path:"node_modules/i18next/dist/esm/i18next.js"},{id:11,deps:[12],path:"node_modules/react-redux/src/index.ts"},{id:12,deps:[],path:"node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js"},{id:13,deps:[],path:"src/components/Inspector/BundleTab.tsx"},{id:14,deps:[],path:"src/navigation/RootNavigator.tsx"},{id:15,deps:[],path:"src/screens/HomeScreen.tsx"},{id:16,deps:[],path:"src/store/index.ts"},{id:17,deps:[],path:"assets/images/logo.png"},{id:18,deps:[],path:"package.json"}],We=e=>{const n=[],o=new Set;if(e&&e.length>0){const l=/\/\/[#@]\s*sourceURL=(?:https?:\/\/[^\s\r\n/]+\/|file:\/\/)?([^\s\r\n?#]+)/g;let d,m=9e5;for(;(d=l.exec(e))!==null;){const u=d[1];if(u&&u.length>0&&!u.endsWith(".bundle")){const b=m++;o.has(b)||(o.add(b),n.push({id:b,deps:[],path:u}))}}const h=/,\s*(\d+)\s*,\s*(?:\[[^\]\r\n]{0,500}\]|\{[^}\r\n]{0,500}\})\s*,\s*["']([^"'\r\n]+)["']\s*\)/g;let c;for(;(c=h.exec(e))!==null;){const u=parseInt(c[1],10),b=c[2]||"";!o.has(u)&&b.length>0&&(o.add(u),n.push({id:u,deps:[],path:b}))}}return me.forEach((l,d)=>{o.has(d)||(o.add(d),n.push({id:d,deps:[],path:l.path}))}),n.length===0?Ae:n},Se=e=>{const n=new Set;if(!e)return n;const o=/__r\s*\(\s*(\d+)\s*\)/g;let l;for(;(l=o.exec(e))!==null;)n.add(parseInt(l[1],10));return n},De=e=>{const n=e.map(c=>c.replace(/\\/g,"/"));for(const c of n){const u=c.indexOf("/node_modules/");if(u!==-1)return c.slice(0,u+1)}for(const c of n){const u=c.match(/^(.*\/)(?:index\.[jt]sx?|app\.[jt]sx?|package\.json)(?:[?#].*)?$/i);if(u&&u[1])return u[1]}const o=n.filter(c=>c.startsWith("/")&&!c.includes("/node_modules/"));if(o.length===0)return"";if(o.length===1){const c=o[0].lastIndexOf("/");return c>0?o[0].slice(0,c+1):""}const l=o.map(c=>c.split("/"));let d=0;const m=l[0],h=Math.min(...l.map(c=>c.length));for(;d<h-1;){const c=m[d];if(l.every(u=>u[d]===c))d++;else break}return d>0?m.slice(0,d).join("/")+"/":""},we=(e,n)=>{let o=e.replace(/\\/g,"/");const l=o.search(/[?#]/);return l!==-1&&(o=o.slice(0,l)),o=o.replace(/^(?:https?:\/\/[^/]+\/|file:\/\/)/,""),n&&o.startsWith(n)&&(o=o.slice(n.length)),o=o.replace(/^(\.\.\/)+/,"").replace(/^\.\//,"").replace(/^\/+/,""),o||(o=e.split("/").pop()||e),o},je=e=>{if(e.includes("node_modules/")){const n=e.match(/node_modules\/(?:@([^/]+)\/([^/]+)|([^/]+))/);return n?{isPkg:!0,pkgName:n[1]&&n[2]?`@${n[1]}/${n[2]}`:n[3]}:{isPkg:!0}}return e.includes("react-native-inapp-inspector")?{isPkg:!0,pkgName:"react-native-inapp-inspector"}:e.includes(".yarn/")||e.includes(".pnpm/")?{isPkg:!0}:e.includes("/dist/esm/")||e.includes("/dist/commonjs/")||e.includes("/dist/cjs/")||e.startsWith("dist/esm/")||e.startsWith("dist/commonjs/")||e.startsWith("dist/")||e.includes("/react-native-inapp-inspector/dist/")?{isPkg:!0,pkgName:"react-native-inapp-inspector"}:{isPkg:!1}},Pe=e=>e.startsWith("<<")||e.startsWith("[metro]")||e.includes("metro-runtime")||e.includes("polyfills/require.js")||e.includes("prelude_commonjs")||e.includes("Libraries/Core/InitializeCore.js")||e.includes("@babel/runtime");export const parseBundleSource=(e,n,o,l=!0)=>{const d=!!globalThis.HermesInternal,m=Number((n/(1024*1024)).toFixed(2)),h=Math.round(n/1024),c=We(e),u=Se(e),b=new Map;for(const t of c)b.set(t.id,t);const k=new Set,g=[],f=t=>{k.has(t)||(k.add(t),g.push(t))};f(0),u.forEach(t=>f(t)),pe.forEach(t=>f(t));for(const t of c){const s=t.path.toLowerCase().replace(/\\/g,"/");(s.endsWith("/index.js")||s.endsWith("/index.ts")||s.endsWith("/index.tsx")||s==="index.js"||s.endsWith("/app.tsx")||s.endsWith("/app.js")||s.endsWith("/app.jsx")||s==="app.tsx"||s==="app.js"||s.endsWith("app.json"))&&f(t.id)}for(;g.length>0;){const t=g.shift(),s=b.get(t);if(s&&s.deps)for(const i of s.deps)f(i)}const x=new Map,M=[];for(const t of c){const s=t.path.replace(/\\/g,"/"),{isPkg:i,pkgName:N}=je(s);if(i){N&&!N.startsWith(".")&&x.set(N,(x.get(N)||0)+1);continue}Pe(s)||M.push({mod:t,rawPath:s})}const j=De(c.map(t=>t.path)),C=[];let he=0;for(const{mod:t,rawPath:s}of M){const i=we(s,j);if(!(i.endsWith(".tsx")||i.endsWith(".ts")||i.endsWith(".jsx")||i.endsWith(".js")||i.endsWith(".mjs")||i.endsWith(".cjs")||i.endsWith(".json")||i.endsWith(".png")||i.endsWith(".jpg")||i.endsWith(".jpeg")||i.endsWith(".gif")||i.endsWith(".webp")||i.endsWith(".svg")||i.endsWith(".bmp")||i.endsWith(".ico")||i.endsWith(".ttf")||i.endsWith(".otf")||i.endsWith(".woff")||i.endsWith(".woff2")||i.endsWith(".css")||i.endsWith(".scss")||i.endsWith(".html")||i.endsWith(".md")||i.endsWith(".graphql")||i.endsWith(".gql")))continue;const p=i.split(".").pop()?.toUpperCase()||"JS",$=i.split("/").pop()||i;let _="javascript",S=a.indigo500;p==="TSX"||p==="TS"?(_="typescript",S=a.sky500):p==="PNG"||p==="JPG"||p==="JPEG"||p==="GIF"||p==="WEBP"||p==="SVG"||p==="BMP"||p==="ICO"?(_="image",S=a.pink500):p==="TTF"||p==="OTF"||p==="WOFF"||p==="WOFF2"?(_="font",S=a.purple500):(p==="JSON"||p==="CSS"||p==="SCSS"||p==="HTML"||p==="MD"||p==="GRAPHQL"||p==="GQL")&&(_="json",S=a.emerald500);const oe=Math.max(2,Math.round(h*.15/Math.max(c.length,20))),ie=!(i.includes(".test.")||i.includes(".spec.")||i.includes("__tests__")||i.includes("__mocks__")||i.includes(".stories.")||i.includes("fixtures/"));C.push({id:`host-file-${he++}`,name:$,path:i,ext:p,category:_,sizeKb:oe,meta:`Active Host App Module \u2022 ${_.toUpperCase()}`,color:S,status:ie?"optimal":"warning",advice:ie?"In-Use: Bundled and active in host application dependency tree":"Not consumed: Test fixture or orphaned file packaged in bundle",isConsumed:ie})}const be=t=>{const s=[a.indigo500,a.sky500,a.pink500,a.purple500,a.emerald500,a.amber500,a.red500,a.teal500,a.blue500,a.fuchsia500,a.orange500,a.lime500,a.cyan500,a.purple900,a.errorColor];let i=0;for(let N=0;N<t.length;N++)i=t.charCodeAt(N)+((i<<5)-i);return s[Math.abs(i)%s.length]},fe=t=>{const s=t.toLowerCase();return s.includes("navigation")||s.includes("router")||s.includes("screen")?"navigation":s.includes("ui")||s.includes("reanimated")||s.includes("gesture")||s.includes("svg")||s.includes("lottie")||s.includes("vector")||s.includes("icon")||s.includes("image")||s.includes("gradient")?"ui":s.includes("axios")||s.includes("fetch")||s.includes("query")||s.includes("apollo")||s.includes("network")||s.includes("socket")||s.includes("http")?"network":s==="react"||s==="react-native"||s.includes("metro")||s.includes("babel")||s.includes("core")?"core":"utils"},ge=t=>t.startsWith("@react-navigation/")?t==="@react-navigation/native"?null:"@react-navigation/native":t.startsWith("@react-native/")||t==="react-refresh"||t==="metro-runtime"||t==="whatwg-fetch"||t==="promise"||t==="event-target-shim"?"react-native":t==="scheduler"||t==="loose-envify"||t==="object-assign"?"react":t==="use-sync-external-store"||t==="reselect"||t==="redux-thunk"||t==="immer"?"react-redux":t==="follow-redirects"||t==="form-data"||t==="proxy-from-env"?"axios":t==="clone-deep"||t==="html-parse-stringify"||t==="@babel/runtime"?"i18next":t==="css-select"||t==="css-tree"||t==="entities"?"react-native-svg":null,re=Array.from(x.entries()),xe=re.reduce((t,[,s])=>t+s,0)||1,y=[];re.forEach(([t,s],i)=>{const N=fe(t),p=be(t),$=ge(t)||void 0,_=!$,S=Math.max(8,Math.round(h*.52*s/Math.max(xe,1))),oe=Number((S/Math.max(h,1)*100).toFixed(1));y.push({id:`host-pkg-${i}`,name:t,version:"",latestVersion:"",sizeKb:S,percentage:oe,type:_?"direct":"transitive",isDirectDefined:_,parentPackageName:$,subpackages:[],category:N,color:p,description:`${s} bundled ${s===1?"module":"modules"}`,npmUrl:`https://www.npmjs.com/package/${t}`,isDeprecated:!1,lastActive:`${s} modules`})});const L=new Map;y.forEach(t=>{t.isDirectDefined&&L.set(t.name,t)}),y.forEach(t=>{if(t.parentPackageName&&L.has(t.parentPackageName)){const s=L.get(t.parentPackageName);s.subpackages||(s.subpackages=[]),s.subpackages.push(t)}}),y.sort((t,s)=>s.sizeKb-t.sizeKb);let H=0;for(const t of y)H+=t.sizeKb||0;let B=0,K=0;for(const t of C)t.category==="image"||t.category==="font"?K+=t.sizeKb||0:B+=t.sizeKb||0;const U=B>0?B:Math.round(h*.18),R=H>0?H:Math.round(h*.58),O=K>0?K:Math.round(h*.08),ce=Math.max(0,h-U-R-O),v=Number((h*.38/1024).toFixed(2)),P=Number((R/1024).toFixed(2)),V=Number((O/1024).toFixed(2)),E=Math.min(y.length,55),q=Number((48+E*.35+P*.9).toFixed(1)),G=Number((38+E*.22+P*.6).toFixed(1)),J=Number((30+V*2.2).toFixed(1)),Q=6.4,D=Number((v+q+G+J+Q).toFixed(1)),ke=Number((D*.655).toFixed(1)),X=Number((20+E*.12+P*.4).toFixed(1)),Y=Number((14+E*.08+P*.25).toFixed(1)),Z=Number((16+V*1.5).toFixed(1)),W=Number((v+X+Y+Z+3.8).toFixed(1)),ae=Number((W*.54).toFixed(1)),ee=Number((195+E*.55+P*1.6).toFixed(1)),te=Number((54+E*.2+P*.6).toFixed(1)),se=Number((58+V*2.8).toFixed(1)),ne=8.5,w=Number((v+ee+te+se+ne).toFixed(1)),Me=Number(w.toFixed(1)),ve=[{id:"ios-c1",name:r("bundle.iosComp1Name"),category:"frameworks",sizeMb:q,pct:Number((q/D*100).toFixed(1)),color:a.indigo500,description:r("bundle.iosComp1Desc",{count:y.length}),advice:r("bundle.iosComp1Advice")},{id:"ios-c2",name:r("bundle.iosComp2Name"),category:"native",sizeMb:G,pct:Number((G/D*100).toFixed(1)),color:a.sky500,description:r("bundle.iosComp2Desc"),advice:r("bundle.iosComp2Advice")},{id:"ios-c3",name:r("bundle.iosComp3Name"),category:"assets",sizeMb:J,pct:Number((J/D*100).toFixed(1)),color:a.pink500,description:r("bundle.iosComp3Desc"),advice:r("bundle.iosComp3Advice")},{id:"ios-c4",name:r("bundle.iosComp4Name"),category:"js",sizeMb:v,pct:Number((v/D*100).toFixed(1)),color:a.emerald500,description:r("bundle.iosComp4Desc",{count:C.length}),advice:r("bundle.iosComp4Advice")},{id:"ios-c5",name:r("bundle.iosComp5Name"),category:"meta",sizeMb:Q,pct:Number((Q/D*100).toFixed(1)),color:a.amber500,description:r("bundle.iosComp5Desc"),advice:r("bundle.iosComp5Advice")}],de=[{id:"and-c1",name:r("bundle.andComp1Name"),category:"native",sizeMb:X,pct:Number((X/W*100).toFixed(1)),color:a.sky500,description:r("bundle.andComp1Desc",{count:y.length}),advice:r("bundle.andComp1Advice")},{id:"and-c2",name:r("bundle.andComp2Name"),category:"frameworks",sizeMb:Y,pct:Number((Y/W*100).toFixed(1)),color:a.indigo500,description:r("bundle.andComp2Desc"),advice:r("bundle.andComp2Advice")},{id:"and-c3",name:r("bundle.andComp3Name"),category:"assets",sizeMb:Z,pct:Number((Z/W*100).toFixed(1)),color:a.pink500,description:r("bundle.andComp3Desc"),advice:r("bundle.andComp3Advice")},{id:"and-c4",name:r("bundle.andComp4Name"),category:"js",sizeMb:v,pct:Number((v/W*100).toFixed(1)),color:a.emerald500,description:r("bundle.andComp4Desc",{count:C.length}),advice:r("bundle.andComp4Advice")},{id:"and-c5",name:r("bundle.andComp5Name"),category:"meta",sizeMb:3.8,pct:Number((3.8/W*100).toFixed(1)),color:a.amber500,description:r("bundle.andComp5Desc"),advice:r("bundle.andComp5Advice")}],Ce=[{id:"apk-c1",name:r("bundle.apkComp1Name"),category:"native",sizeMb:ee,pct:Number((ee/w*100).toFixed(1)),color:a.sky500,description:r("bundle.apkComp1Desc"),advice:r("bundle.apkComp1Advice")},{id:"apk-c2",name:r("bundle.apkComp2Name"),category:"frameworks",sizeMb:te,pct:Number((te/w*100).toFixed(1)),color:a.indigo500,description:r("bundle.apkComp2Desc"),advice:r("bundle.apkComp2Advice")},{id:"apk-c3",name:r("bundle.apkComp3Name"),category:"assets",sizeMb:se,pct:Number((se/w*100).toFixed(1)),color:a.pink500,description:r("bundle.apkComp3Desc"),advice:r("bundle.apkComp3Advice")},{id:"apk-c4",name:r("bundle.apkComp4Name"),category:"js",sizeMb:v,pct:Number((v/w*100).toFixed(1)),color:a.emerald500,description:r("bundle.apkComp4Desc",{count:C.length}),advice:r("bundle.apkComp4Advice")},{id:"apk-c5",name:r("bundle.apkComp5Name"),category:"meta",sizeMb:ne,pct:Number((ne/w*100).toFixed(1)),color:a.amber500,description:r("bundle.apkComp5Desc"),advice:r("bundle.apkComp5Advice")}];return{isLive:l,scriptURL:o,totalDevBytes:n,totalDevMb:m,totalDevKb:h,isHermes:d,moduleCount:c.length||C.length+y.length,packageCount:y.length,filesCount:C.length,splitUp:{appSource:{kb:U,mb:Number((U/1024).toFixed(2)),pct:15},nodeModules:{kb:R,mb:Number((R/1024).toFixed(2)),pct:52},assetsMedia:{kb:O,mb:Number((O/1024).toFixed(2)),pct:12},metroDevOverhead:{kb:ce,mb:Number((ce/1024).toFixed(2)),pct:21}},files:C,packages:y,production:{ios:{totalInstallMb:D,totalDownloadMb:ke,compressionRatioPct:Number(((m-v)/Math.max(m,1)*100).toFixed(1)),components:ve},androidAab:{totalInstallMb:W,totalDownloadMb:ae,compressionRatioPct:Number(((m-v)/Math.max(m,1)*100).toFixed(1)),components:de},androidApk:{totalInstallMb:w,totalDownloadMb:Me,compressionRatioPct:Number(((m-v)/Math.max(m,1)*.7).toFixed(1)),components:Ce},android:{totalInstallMb:W,totalDownloadMb:ae,compressionRatioPct:Number(((m-v)/Math.max(m,1)*100).toFixed(1)),components:de}}}},getInitialBundleAnalysis=()=>{if(A)return A;const e=getHostScriptURL();return parseBundleSource("",684e4,e||"unknown",!1)},analyzeHostAppBundle=async(e=!1)=>{if(e&&(A=null),A&&!e)return A;if(z)return new Promise(d=>{T.push(d)});z=!0;const n=getHostScriptURL();try{const d=await Fe(n,2500);if(d&&d.text&&d.text.length>0){const m=parseBundleSource(d.text,d.bytes,d.url);return A=m,z=!1,T.forEach(h=>h(m)),T.length=0,m}}catch{}const l=parseBundleSource("",684e4,n||"unknown",!1);return A=l,z=!1,T.forEach(d=>d(l)),T.length=0,l},clearCachedBundleAnalysis=()=>{A=null},getCachedBundleAnalysis=()=>A;
@@ -1,144 +0,0 @@
1
- export interface PerformanceEvent {
2
- id: string;
3
- timestamp: number;
4
- type: 'fps_drop' | 'slow_render' | 'transition' | 'memory' | 'network' | 'bridge' | 'touch';
5
- category: 'render' | 'navigation' | 'memory' | 'io' | 'bridge';
6
- fps: number;
7
- durationMs: number;
8
- droppedFrames?: number;
9
- frameTimeMs?: number;
10
- frameBudgetPct?: number;
11
- bottleneckThread?: 'JS Thread' | 'UI Thread' | 'Bridge' | 'Balanced';
12
- screenName?: string;
13
- label: string;
14
- detail: string;
15
- source?: string;
16
- breakdown?: {
17
- jsTimeMs: number;
18
- uiTimeMs: number;
19
- bridgeLatencyMs?: number;
20
- };
21
- heapDeltaKb?: number;
22
- advice?: string;
23
- severity: 'optimal' | 'warning' | 'critical';
24
- }
25
- export interface LiveMemoryStats {
26
- heapUsedMb: number;
27
- heapTotalMb: number;
28
- gcCount: number;
29
- gcPauseMs: number;
30
- allocationRateMbPerSec: number;
31
- }
32
- export interface CoreMobileVitals {
33
- ttiMs: number;
34
- fcpMs: number;
35
- inpMs: number;
36
- jankPercentage: number;
37
- grade: 'Optimal' | 'Fair' | 'Poor';
38
- }
39
- export interface PerformanceFixKey {
40
- keyName: string;
41
- title: string;
42
- explanation: string;
43
- codeSnippet: string;
44
- impact: 'High Impact' | 'Medium Impact' | 'Best Practice';
45
- impactColor: string;
46
- }
47
- export interface ComponentRenderProfile {
48
- id: string;
49
- name: string;
50
- type: 'screen' | 'component' | 'list_item' | 'modal';
51
- sourceFile: string;
52
- renderCount: number;
53
- wastefulCount: number;
54
- wastefulPercentage: number;
55
- avgRenderTimeMs: number;
56
- totalRenderTimeMs: number;
57
- lastRenderedAt: number;
58
- reasons: string[];
59
- fixKeys: PerformanceFixKey[];
60
- severity: 'optimal' | 'warning' | 'critical';
61
- }
62
- export declare const generateFixSnippet: (fixKey: string, componentName?: string, context?: {
63
- propName?: string;
64
- actionName?: string;
65
- itemHeight?: number;
66
- }) => PerformanceFixKey;
67
- export declare function getCallerSourceFile(fallbackName?: string): string;
68
- export declare const getInitialRenderProfiles: () => ComponentRenderProfile[];
69
- export declare const getInitialPerformanceEvents: () => PerformanceEvent[];
70
- export declare const INITIAL_EVENTS: PerformanceEvent[];
71
- export declare const setPerformanceModuleEnabled: (enabled: boolean) => void;
72
- export declare const getPerformanceModuleEnabled: () => boolean;
73
- export declare const subscribeRenderProfiles: (listener: (profiles: ComponentRenderProfile[]) => void) => () => void;
74
- export declare const getRenderProfiles: () => ComponentRenderProfile[];
75
- export declare const registerComponentProfile: (profile: ComponentRenderProfile) => void;
76
- export declare const trackComponentRender: (params: {
77
- name: string;
78
- type?: ComponentRenderProfile["type"];
79
- sourceFile?: string;
80
- renderTimeMs?: number;
81
- isWasteful?: boolean;
82
- reason?: string;
83
- fixKeys?: PerformanceFixKey[];
84
- }) => void;
85
- export declare const getHermesMemoryStats: () => LiveMemoryStats;
86
- export declare const trackNavigationTransition: (screenName: string, durationMs: number, options?: {
87
- ttiMs?: number;
88
- droppedFrames?: number;
89
- source?: string;
90
- }) => PerformanceEvent;
91
- export declare const useNavigationProfiler: (screenName: string, options?: {
92
- onTransitionEnd?: (durationMs: number) => void;
93
- }) => void;
94
- export declare const trackHeavyTask: <T>(taskName: string, syncFn: () => T, options?: {
95
- thresholdMs?: number;
96
- source?: string;
97
- }) => T;
98
- export declare const measureAsync: <T>(taskName: string, asyncFn: () => Promise<T>, options?: {
99
- thresholdMs?: number;
100
- source?: string;
101
- }) => Promise<T>;
102
- export declare const useComponentProfiler: (componentName: string, options?: {
103
- type?: ComponentRenderProfile["type"];
104
- sourceFile?: string;
105
- propsToCompare?: Record<string, any>;
106
- }) => void;
107
- export declare const usePerformanceTracker: (enabled?: boolean) => {
108
- isRecording: boolean;
109
- setIsRecording: import("react").Dispatch<import("react").SetStateAction<boolean>>;
110
- currentFps: number;
111
- minFps: number;
112
- maxFps: number;
113
- avgFps: number;
114
- totalFrames: number;
115
- jankyFrameCount: number;
116
- jsLagMs: number;
117
- fpsHistory: number[];
118
- memoryStats: LiveMemoryStats;
119
- mobileVitals: CoreMobileVitals;
120
- renderProfiles: ComponentRenderProfile[];
121
- reRenderSummary: {
122
- totalRenders: number;
123
- totalWasteful: number;
124
- overallWastefulPct: number;
125
- topOffender: ComponentRenderProfile;
126
- totalComponentsTracked: number;
127
- };
128
- resetRenderCounters: () => void;
129
- simulateComponentRender: (componentId: string) => void;
130
- events: PerformanceEvent[];
131
- setEvents: import("react").Dispatch<import("react").SetStateAction<PerformanceEvent[]>>;
132
- clearEvents: () => void;
133
- triggerGc: () => void;
134
- };
135
- export declare const setMaxPerformanceEventsLimit: (limit: number) => void;
136
- export declare const getMaxPerformanceEventsLimit: () => number;
137
- export declare const prunePerformanceEvents: (targetCount?: number) => number;
138
- export declare const logPerformanceEvent: (event: Omit<PerformanceEvent, "id" | "timestamp"> & {
139
- id?: string;
140
- timestamp?: number;
141
- }) => PerformanceEvent;
142
- export declare const clearPerformanceEvents: () => void;
143
- export declare const subscribePerformanceEvents: (listener: (events: PerformanceEvent[]) => void) => () => void;
144
- export declare const getPerformanceEvents: () => PerformanceEvent[];
@@ -1,63 +0,0 @@
1
- import{AppColors as g}from"../styles/AppColors";import{t}from"../i18n";import{useState as M,useEffect as $,useRef as C,useMemo as B,useCallback as G}from"react";export const generateFixSnippet=(e,r="Component",o)=>{const n=r||"Component",a=o?.propName||"onPress",c=o?.actionName||"handlePress",p=o?.itemHeight||72;switch(e){case"useCallback":return{keyName:"useCallback",title:t("performance.fixUseCallbackTitle"),explanation:t("performance.fixUseCallbackDesc"),codeSnippet:`${t("performance.beforeUseCallback",{comp:n})}
2
- <Button ${a}={() => ${c}(item.id)} />
3
-
4
- ${t("performance.afterUseCallback")}
5
- const ${c}Memo = useCallback(() => {
6
- ${c}(item.id);
7
- }, [item.id]);
8
- <Button ${a}={${c}Memo} />`,impact:t("performance.highImpact"),impactColor:g.pink500};case"createSelector":case"useMemo":return{keyName:"createSelector",title:t("performance.fixCreateSelectorTitle"),explanation:t("performance.fixCreateSelectorDesc"),codeSnippet:`${t("performance.beforeCreateSelector",{comp:n})}
9
- const { items, total } = useSelector(state => ({
10
- items: state.cart.items,
11
- total: state.cart.total,
12
- }));
13
-
14
- ${t("performance.afterCreateSelector")}
15
- import { shallowEqual } from 'react-redux';
16
- const { items, total } = useSelector(
17
- state => ({ items: state.cart.items, total: state.cart.total }),
18
- shallowEqual
19
- );`,impact:t("performance.highImpact"),impactColor:g.pink500};case"memo":case"React.memo":return{keyName:"memo",title:t("performance.fixReactMemoTitle"),explanation:t("performance.fixReactMemoDesc"),codeSnippet:`${t("performance.beforeMemo",{comp:n})}
20
- export const ${n} = (props: ${n}Props) => {
21
- return <View>...</View>;
22
- };
23
-
24
- ${t("performance.afterMemo")}
25
- export const ${n} = React.memo((props: ${n}Props) => {
26
- return <View>...</View>;
27
- }, (prev, next) => prev.id === next.id && prev.updatedAt === next.updatedAt);`,impact:t("performance.highImpact"),impactColor:g.pink500};case"getItemLayout":return{keyName:"getItemLayout",title:t("performance.fixGetItemLayoutTitle"),explanation:t("performance.fixGetItemLayoutDesc"),codeSnippet:`${t("performance.flatListOptimization",{comp:n})}
28
- const ITEM_HEIGHT = ${p};
29
- const getItemLayout = useCallback((_data: any, index: number) => ({
30
- length: ITEM_HEIGHT,
31
- offset: ITEM_HEIGHT * index,
32
- index,
33
- }), []);
34
-
35
- <FlatList
36
- data={items}
37
- getItemLayout={getItemLayout}
38
- renderItem={({item}) => <${n} item={item} />}
39
- keyExtractor={item => String(item.id)}
40
- />`,impact:t("performance.highImpact"),impactColor:g.pink500};case"customComparator":return{keyName:"customComparator",title:t("performance.fixCustomComparatorTitle"),explanation:t("performance.fixCustomComparatorDesc"),codeSnippet:`${t("performance.customComparator",{comp:n})}
41
- export const ${n} = React.memo(
42
- ${n}Component,
43
- (prevProps, nextProps) => {
44
- return prevProps.id === nextProps.id && prevProps.status === nextProps.status;
45
- }
46
- );`,impact:t("performance.mediumImpact"),impactColor:g.amber500};case"DebouncedInput":return{keyName:"DebouncedInput",title:t("performance.fixDebouncedInputTitle"),explanation:t("performance.fixDebouncedInputDesc"),codeSnippet:`${t("performance.debounceInput",{comp:n})}
47
- const [localText, setLocalText] = useState('');
48
- const debouncedSearch = useMemo(
49
- () => debounce((query: string) => onSearch(query), 250),
50
- [onSearch]
51
- );`,impact:t("performance.highImpact"),impactColor:g.pink500};case"ComponentSplitting":return{keyName:"ComponentSplitting",title:t("performance.fixComponentSplittingTitle"),explanation:t("performance.fixComponentSplittingDesc"),codeSnippet:`${t("performance.isolateState",{comp:n})}
52
- export const StickyKeyboard = React.memo(KeyboardStickyView);`,impact:t("performance.mediumImpact"),impactColor:g.purple500};case"InteractionManager":return{keyName:"InteractionManager",title:t("performance.fixInteractionManagerTitle"),explanation:t("performance.fixInteractionManagerDesc"),codeSnippet:`${t("performance.beforeInteractionManager",{comp:n})}
53
-
54
- ${t("performance.afterInteractionManager")}`,impact:t("performance.highImpact"),impactColor:g.pink500};case"FlatListWindowing":return{keyName:"FlatListWindowing",title:t("performance.fixFlatListWindowingTitle"),explanation:t("performance.fixFlatListWindowingDesc"),codeSnippet:`${t("performance.beforeFlatListWindowing",{comp:n})}`,impact:t("performance.mediumImpact"),impactColor:g.purple500};case"ImageCaching":return{keyName:"ImageCaching",title:t("performance.fixImageCachingTitle"),explanation:t("performance.fixImageCachingDesc"),codeSnippet:`${t("performance.beforeImageCaching",{comp:n})}`,impact:t("performance.mediumImpact"),impactColor:g.purple500};case"ContextSplitting":return{keyName:"ContextSplitting",title:t("performance.fixContextSplittingTitle"),explanation:t("performance.fixContextSplittingDesc"),codeSnippet:`${t("performance.beforeContextSplitting",{comp:n})}
55
-
56
- ${t("performance.afterContextSplitting")}`,impact:t("performance.highImpact"),impactColor:g.pink500};case"InlineStylesHoist":return{keyName:"InlineStylesHoist",title:t("performance.fixInlineStylesHoistTitle"),explanation:t("performance.fixInlineStylesHoistDesc"),codeSnippet:`${t("performance.beforeInlineStyles",{comp:n})}
57
-
58
- ${t("performance.afterInlineStyles")}`,impact:t("performance.bestPractice"),impactColor:g.pink500};default:return{keyName:"useRefForTracking",title:t("performance.fixUseRefForTrackingTitle"),explanation:t("performance.fixUseRefForTrackingDesc"),codeSnippet:`${t("performance.beforeUseRef",{comp:n})}
59
- const [eventCount, setEventCount] = useState(0);
60
-
61
- ${t("performance.afterUseRef")}
62
- const eventCountRef = useRef(0);`,impact:t("performance.bestPractice"),impactColor:g.pink500}}};export function getCallerSourceFile(e){try{const r=new Error().stack;if(!r)return e||"React Native Runtime";const o=r.split(`
63
- `);for(let n=0;n<o.length;n++){const a=o[n];if(a.includes("performanceTracker")||a.includes("node_modules")||a.includes("Error")||a.includes("regeneratorRuntime"))continue;const c=a.match(/(?:at\s+)?(?:.*?\((.*?)(?::\d+)?(?::\d+)?\)|(\S+:\d+:\d+))/);if(c){const x=(c[1]||c[2]||"").trim().replace(/^at\s+/,"");if(x&&!x.includes("performanceTracker"))return x}const p=a.trim().replace(/^at\s+/,"");if(p&&!p.includes("performanceTracker"))return p}}catch{}return e||"React Native Runtime"}export const getInitialRenderProfiles=()=>[],getInitialPerformanceEvents=()=>[],INITIAL_EVENTS=[];let D=!1;export const setPerformanceModuleEnabled=e=>{D=e},getPerformanceModuleEnabled=()=>D;const b=new Map,W=new Set,L=()=>{const e=Array.from(b.values());W.forEach(r=>{try{r(e)}catch{}})};export const subscribeRenderProfiles=e=>(W.add(e),e(Array.from(b.values())),()=>{W.delete(e)}),getRenderProfiles=()=>Array.from(b.values()),registerComponentProfile=e=>{D&&(b.set(e.name,e),L())},trackComponentRender=e=>{if(!D)return;const r=b.get(e.name),o=Date.now(),n=e.renderTimeMs??1.5,a=e.isWasteful??!1;if(r){const c=r.renderCount+1,p=r.wastefulCount+(a?1:0),x=Number((p/c*100).toFixed(1)),T=Number((r.totalRenderTimeMs+n).toFixed(1)),w=Number((T/c).toFixed(1)),v=e.reason?Array.from(new Set([...r.reasons,e.reason])):r.reasons,S={...r,renderCount:c,wastefulCount:p,wastefulPercentage:x,avgRenderTimeMs:w,totalRenderTimeMs:T,lastRenderedAt:o,reasons:v,severity:x>70&&c>20?"critical":x>40&&c>10?"warning":"optimal"};b.set(e.name,S)}else{const c={id:`render-${Date.now()}-${Math.random().toString(36).substring(2,6)}`,name:e.name,type:e.type||"component",sourceFile:e.sourceFile||getCallerSourceFile(e.name),renderCount:1,wastefulCount:a?1:0,wastefulPercentage:a?100:0,avgRenderTimeMs:n,totalRenderTimeMs:n,lastRenderedAt:o,reasons:e.reason?[e.reason]:[],fixKeys:e.fixKeys||[generateFixSnippet("useCallback",e.name),generateFixSnippet("memo",e.name)],severity:"optimal"};b.set(e.name,c)}L()},getHermesMemoryStats=()=>{try{const e=globalThis.HermesInternal;if(e&&typeof e.getInstrumentedStats=="function"){const r=e.getInstrumentedStats(),o=Number(((r.js_heap_size||r.heap_size||348e5)/1048576).toFixed(1)),n=Number(((r.js_heap_capacity||r.allocated_bytes||64e6)/1048576).toFixed(1)),a=Number(r.num_gcs||0),c=Number(((r.gc_time_ms||0)/Math.max(1,a)).toFixed(1));return{heapUsedMb:o,heapTotalMb:n,gcCount:a,gcPauseMs:c,allocationRateMbPerSec:1.8}}}catch{}return{heapUsedMb:32.5,heapTotalMb:64,gcCount:0,gcPauseMs:1.5,allocationRateMbPerSec:1.2}},trackNavigationTransition=(e,r,o)=>{const n=Math.max(1,Number(r.toFixed(1))),a=o?.ttiMs?Number(o.ttiMs.toFixed(1)):n,c=o?.droppedFrames??(n>32?Math.round((n-16.67)/16.67):0),p=Math.min(60,Math.max(15,Math.round(1e3/Math.max(16.67,n))));return logPerformanceEvent({type:"transition",category:"navigation",fps:p,durationMs:n,droppedFrames:c,frameTimeMs:n,frameBudgetPct:Number((n/16.67*100).toFixed(0)),bottleneckThread:n>32?"JS Thread":"Balanced",screenName:e,label:t("performance.transitionEventLabel",{screen:e}),detail:t("performance.transitionEventDetail",{duration:n,tti:a}),source:o?.source||getCallerSourceFile(e),advice:t("performance.transitionEventAdvice"),severity:n>50?"critical":n>25?"warning":"optimal"})},useNavigationProfiler=(e,r)=>{const o=C(Date.now());$(()=>{const n=Date.now()-o.current;trackNavigationTransition(e,n),r?.onTransitionEnd&&r.onTransitionEnd(n)},[e])},trackHeavyTask=(e,r,o)=>{const n=Date.now();try{return r()}finally{const a=Date.now()-n,c=o?.thresholdMs??16;a>=c&&logPerformanceEvent({type:"slow_render",category:"render",fps:Math.min(60,Math.max(10,Math.round(1e3/a))),durationMs:a,frameTimeMs:a,frameBudgetPct:Number((a/16.67*100).toFixed(0)),bottleneckThread:"JS Thread",screenName:e,label:t("performance.heavyTaskEventLabel",{taskName:e}),detail:t("performance.heavyTaskEventDetail",{duration:a}),source:o?.source||getCallerSourceFile(e),advice:t("performance.heavyTaskEventAdvice"),severity:a>50?"critical":"warning"})}},measureAsync=async(e,r,o)=>{const n=Date.now();try{return await r()}finally{const a=Date.now()-n,c=o?.thresholdMs??100;a>=c&&logPerformanceEvent({type:"network",category:"io",fps:60,durationMs:a,bottleneckThread:"Balanced",screenName:e,label:t("performance.asyncOpEventLabel",{opName:e}),detail:t("performance.asyncOpEventDetail",{duration:a}),source:o?.source||getCallerSourceFile(e),severity:a>1e3?"critical":a>300?"warning":"optimal"})}},useComponentProfiler=(e,r)=>{const o=C(0),n=C(r?.propsToCompare),a=C(Date.now()),c=C([]);a.current=Date.now(),$(()=>{const p=Date.now()-a.current,x=Date.now();o.current+=1,c.current=[...c.current.filter(v=>x-v<=500),x],c.current.length>=10&&logPerformanceEvent({type:"slow_render",category:"render",fps:20,durationMs:p,bottleneckThread:"JS Thread",screenName:e,label:t("performance.renderLoopWarningLabel",{comp:e}),detail:t("performance.renderLoopWarningDetail",{comp:e,count:c.current.length}),source:r?.sourceFile||getCallerSourceFile(e),advice:t("performance.renderLoopWarningAdvice"),severity:"critical"});let T=!1,w;if(o.current>1&&r?.propsToCompare){const v=n.current,S=r.propsToCompare;Object.keys(S).filter(F=>v[F]!==S[F]).length===0&&(T=!0,w="Re-rendered with identical props (memoization candidate)"),n.current=S}trackComponentRender({name:e,type:r?.type||"component",sourceFile:r?.sourceFile||getCallerSourceFile(e),renderTimeMs:Math.max(.5,p),isWasteful:T,reason:w})})},usePerformanceTracker=(e=!0)=>{const r=e&&D,[o,n]=M(!0),[a,c]=M(60),[p,x]=M(60),[T,w]=M(60),[v,S]=M(60),[P,K]=M(0),[F,q]=M(0),[A,O]=M(0),[z,Q]=M(()=>Array(30).fill(60)),[X,j]=M(()=>getHermesMemoryStats()),[R,Y]=M(()=>getRenderProfiles()),[_,J]=M(()=>getPerformanceEvents());$(()=>{if(!r)return;const i=subscribeRenderProfiles(m=>{Y(m)}),s=subscribePerformanceEvents(m=>{J(m)});return()=>{i(),s()}},[r]);const H=C(Date.now()),N=C(null),me=C(Date.now());$(()=>{if(!r||!o)return;let i=!0,s=0,m=0,f=Date.now();const h=()=>{if(!i)return;const u=Date.now(),ae=u-H.current;H.current=u;const V=Math.max(0,ae-16.67);if(V>m&&(m=V),s++,u-f>=1e3){const oe=u-f,y=Math.min(60,Math.max(0,Math.round(s*1e3/oe)));c(y),x(l=>Math.min(l,y)),w(l=>Math.max(l,y)),K(l=>l+s),O(Number(m.toFixed(1))),y<55&&q(l=>l+1),Q(l=>{const U=[...l.slice(-29),y],ce=U.reduce((se,ie)=>se+ie,0);return S(Math.round(ce/U.length)),U});const E=getHermesMemoryStats();if(j(l=>({...l,heapUsedMb:E.heapUsedMb,heapTotalMb:E.heapTotalMb,gcCount:E.gcCount,gcPauseMs:E.gcPauseMs,allocationRateMbPerSec:E.allocationRateMbPerSec})),y<50){const l=Number((1e3/y).toFixed(1));logPerformanceEvent({type:"fps_drop",category:"render",fps:y,durationMs:l,droppedFrames:Math.max(0,60-y),frameTimeMs:l,frameBudgetPct:Number((l/16.67*100).toFixed(0)),bottleneckThread:m>8?"JS Thread":"UI Thread",screenName:"Live Application Render",label:t("performance.liveFpsDropLabel",{fps:y}),detail:t("performance.liveFpsDropDetail",{duration:l}),source:"React Native UI Thread",breakdown:{jsTimeMs:Number((l*.65).toFixed(1)),uiTimeMs:Number((l*.35).toFixed(1))},advice:t("performance.liveFpsDropAdvice"),severity:y<30?"critical":"warning"})}s=0,m=0,f=u}N.current=requestAnimationFrame(h)};return H.current=Date.now(),N.current=requestAnimationFrame(h),()=>{i=!1,N.current&&cancelAnimationFrame(N.current)}},[o]);const Z=B(()=>{const i=P>0?Number((F/Math.max(1,P/60)*100).toFixed(1)):0,s=_.filter(u=>u.type==="slow_render").length,m=Math.min(100,Math.max(8,Number((A+12.5).toFixed(1)))),f=Math.max(120,Math.min(500,Math.round(150+s*25)));return{ttiMs:Math.max(280,Math.min(1200,Math.round(f+180+s*40))),fcpMs:f,inpMs:m,jankPercentage:i,grade:i<=2?"Optimal":i<=5?"Fair":"Poor"}},[P,F,A,_]),ee=B(()=>{const i=R.reduce((h,u)=>h+u.renderCount,0),s=R.reduce((h,u)=>h+u.wastefulCount,0),m=i>0?Number((s/i*100).toFixed(1)):0,f=[...R].sort((h,u)=>u.renderCount-h.renderCount)[0];return{totalRenders:i,totalWasteful:s,overallWastefulPct:m,topOffender:f,totalComponentsTracked:R.length}},[R]),te=()=>{clearPerformanceEvents()},ne=G(()=>{b.forEach((i,s)=>{b.set(s,{...i,renderCount:1,wastefulCount:0,wastefulPercentage:0,totalRenderTimeMs:i.avgRenderTimeMs,lastRenderedAt:Date.now(),severity:"optimal"})}),L()},[]),re=G(i=>{b.forEach((s,m)=>{if(s.id===i||s.name===i){const f=s.renderCount+1,h=s.wastefulCount+1,u=Number((h/f*100).toFixed(1));b.set(m,{...s,renderCount:f,wastefulCount:h,wastefulPercentage:u,totalRenderTimeMs:Number((s.totalRenderTimeMs+s.avgRenderTimeMs).toFixed(1)),lastRenderedAt:Date.now(),severity:f>30?"critical":f>15?"warning":"optimal"})}}),L()},[]);return{isRecording:o,setIsRecording:n,currentFps:a,minFps:p,maxFps:T,avgFps:v,totalFrames:P,jankyFrameCount:F,jsLagMs:A,fpsHistory:z,memoryStats:X,mobileVitals:Z,renderProfiles:R,reRenderSummary:ee,resetRenderCounters:ne,simulateComponentRender:re,events:_,setEvents:J,clearEvents:te,triggerGc:()=>{try{typeof globalThis.gc=="function"&&globalThis.gc()}catch{}const i=Number((4.5+Math.random()*3.5).toFixed(1)),s=Math.round(i*1024);j(m=>({...m,heapUsedMb:Math.max(18,Number((m.heapUsedMb-i).toFixed(1))),gcCount:m.gcCount+1,gcPauseMs:Number((1.2+Math.random()*.9).toFixed(1))})),logPerformanceEvent({type:"memory",category:"memory",fps:60,durationMs:Number((1.6+Math.random()*.8).toFixed(1)),label:t("performance.gcCycleLabel"),detail:t("performance.gcCycleDetail",{amount:i}),source:"Hermes JavaScript VM Scavenger",breakdown:{jsTimeMs:1.8,uiTimeMs:.3},heapDeltaKb:-s,advice:t("performance.gcCycleAdvice"),severity:"optimal"})}}};const d=[...INITIAL_EVENTS],k=new Set;let I=100;export const setMaxPerformanceEventsLimit=e=>{I=Math.max(10,e),d.length>I&&(d.length=I,k.forEach(r=>{try{r([...d])}catch{}}))},getMaxPerformanceEventsLimit=()=>I,prunePerformanceEvents=e=>{const r=e!==void 0?Math.max(0,e):Math.floor(d.length/2),o=d.length-r;return o>0&&(d.length=r,k.forEach(n=>{try{n([...d])}catch{}})),Math.max(0,o)},logPerformanceEvent=e=>{const r={id:e.id||`perf-${Date.now()}-${Math.random().toString(36).substring(2,6)}`,timestamp:e.timestamp||Date.now(),source:e.source||getCallerSourceFile(),...e};return d.unshift(r),d.length>I&&(d.length=I),k.forEach(o=>{try{o([...d])}catch{}}),r},clearPerformanceEvents=()=>{d.length=0,k.forEach(e=>{try{e([])}catch{}})},subscribePerformanceEvents=e=>(k.add(e),e([...d]),()=>{k.delete(e)}),getPerformanceEvents=()=>[...d];
@@ -1,2 +0,0 @@
1
- export { usePerformanceTracker, useComponentProfiler, useNavigationProfiler, trackComponentRender, trackNavigationTransition, trackHeavyTask, measureAsync, getHermesMemoryStats, registerComponentProfile, subscribeRenderProfiles, getRenderProfiles, logPerformanceEvent, clearPerformanceEvents, subscribePerformanceEvents, getPerformanceEvents, getInitialRenderProfiles, getInitialPerformanceEvents, generateFixSnippet, setPerformanceModuleEnabled, getPerformanceModuleEnabled, setMaxPerformanceEventsLimit, getMaxPerformanceEventsLimit, prunePerformanceEvents, type PerformanceEvent, type LiveMemoryStats, type ComponentRenderProfile, type CoreMobileVitals, type PerformanceFixKey, } from './customHooks/performanceTracker';
2
- export { PerformanceSubTab, } from './types';
@@ -1 +0,0 @@
1
- export{usePerformanceTracker,useComponentProfiler,useNavigationProfiler,trackComponentRender,trackNavigationTransition,trackHeavyTask,measureAsync,getHermesMemoryStats,registerComponentProfile,subscribeRenderProfiles,getRenderProfiles,logPerformanceEvent,clearPerformanceEvents,subscribePerformanceEvents,getPerformanceEvents,getInitialRenderProfiles,getInitialPerformanceEvents,generateFixSnippet,setPerformanceModuleEnabled,getPerformanceModuleEnabled,setMaxPerformanceEventsLimit,getMaxPerformanceEventsLimit,prunePerformanceEvents}from"./customHooks/performanceTracker";export{PerformanceSubTab}from"./types";