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.
- package/README.md +26 -5
- package/dist/commonjs/components/AnalyticsDetail.js +15 -12
- package/dist/commonjs/components/AnalyticsEventCard.js +11 -8
- package/dist/commonjs/components/AppHeaderLogo.js +4 -6
- package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -0
- package/dist/commonjs/components/ConsoleLogCard.js +92 -80
- package/dist/commonjs/components/EndOfListFooter.d.ts +5 -1
- package/dist/commonjs/components/EndOfListFooter.js +27 -5
- package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1 -1
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +27 -299
- package/dist/commonjs/components/Inspector/ConsoleTab.js +36 -94
- package/dist/commonjs/components/Inspector/CrashDetail.js +11 -10
- package/dist/commonjs/components/Inspector/CrashTab.js +43 -33
- package/dist/commonjs/components/Inspector/DebuggingTab.js +13 -13
- package/dist/commonjs/components/Inspector/DeviceInfoTab.js +107 -71
- package/dist/commonjs/components/Inspector/FabLauncher.js +8 -9
- package/dist/commonjs/components/Inspector/InspectorHeader.js +93 -70
- package/dist/commonjs/components/Inspector/LogDetail.js +10 -7
- package/dist/commonjs/components/Inspector/MainScreen.js +66 -30
- package/dist/commonjs/components/Inspector/MediaGalleryTab.js +1 -1
- package/dist/commonjs/components/Inspector/MediaPreviewModal.js +3 -3
- package/dist/commonjs/components/Inspector/NetworkDetail.js +29 -28
- package/dist/commonjs/components/Inspector/NetworkFilterModal.js +1 -1
- package/dist/commonjs/components/Inspector/NetworkTab.js +87 -85
- package/dist/commonjs/components/Inspector/NpmStarPrompt.js +3 -3
- package/dist/commonjs/components/Inspector/NpmUpdateToast.js +21 -22
- package/dist/commonjs/components/Inspector/PushCard.d.ts +4 -0
- package/dist/commonjs/components/Inspector/PushCard.js +89 -0
- package/dist/commonjs/components/Inspector/PushDetail.d.ts +4 -0
- package/dist/commonjs/components/Inspector/PushDetail.js +190 -0
- package/dist/commonjs/components/Inspector/PushTab.d.ts +3 -0
- package/dist/commonjs/components/Inspector/PushTab.js +45 -0
- package/dist/commonjs/components/Inspector/ReduxDetail.js +16 -13
- package/dist/commonjs/components/Inspector/ReduxTab.js +109 -106
- package/dist/commonjs/components/Inspector/SettingsPanel.js +230 -134
- package/dist/commonjs/components/Inspector/StorageTab.js +55 -51
- package/dist/commonjs/components/Inspector/TabBar.js +30 -26
- package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +2 -2
- package/dist/commonjs/components/JsonViewer.js +151 -159
- package/dist/commonjs/components/LogCard.js +34 -38
- package/dist/commonjs/components/LogSyntaxHighlighter.js +3 -3
- package/dist/commonjs/components/ModuleErrorBoundary.d.ts +24 -0
- package/dist/commonjs/components/ModuleErrorBoundary.js +33 -0
- package/dist/commonjs/components/NetworkIcons.d.ts +3 -3
- package/dist/commonjs/components/NetworkIcons.js +10 -6
- package/dist/commonjs/components/SegmentedTabs.d.ts +8 -2
- package/dist/commonjs/components/SegmentedTabs.js +11 -7
- package/dist/commonjs/components/ShareButton.d.ts +11 -0
- package/dist/commonjs/components/ShareButton.js +6 -0
- package/dist/commonjs/constants/index.js +1 -1
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/crashHandler.js +4 -4
- package/dist/commonjs/customHooks/networkLogger.js +1 -2
- package/dist/commonjs/customHooks/pushNotificationLogger.d.ts +19 -0
- package/dist/commonjs/customHooks/pushNotificationLogger.js +1 -0
- package/dist/commonjs/helpers/index.d.ts +6 -0
- package/dist/commonjs/helpers/index.js +4 -4
- package/dist/commonjs/helpers/memoryManager.d.ts +2 -2
- package/dist/commonjs/helpers/memoryManager.js +1 -1
- package/dist/commonjs/helpers/remoteConfig.js +1 -1
- package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
- package/dist/commonjs/helpers/settingsStore.js +1 -1
- package/dist/commonjs/helpers/shareFormatter.d.ts +13 -0
- package/dist/commonjs/helpers/shareFormatter.js +7 -0
- package/dist/commonjs/i18n/index.d.ts +35 -0
- package/dist/commonjs/i18n/index.js +1 -1
- package/dist/commonjs/i18n/locales/ar.json +1 -0
- package/dist/commonjs/i18n/locales/de.json +1 -0
- package/dist/commonjs/i18n/locales/en.json +1 -1
- package/dist/commonjs/i18n/locales/es.json +1 -0
- package/dist/commonjs/i18n/locales/fr.json +1 -0
- package/dist/commonjs/i18n/locales/hi.json +1 -0
- package/dist/commonjs/i18n/locales/ja.json +1 -0
- package/dist/commonjs/i18n/locales/ko.json +1 -0
- package/dist/commonjs/i18n/locales/pt.json +1 -0
- package/dist/commonjs/i18n/locales/ru.json +1 -0
- package/dist/commonjs/i18n/locales/zh.json +1 -0
- package/dist/commonjs/index.d.ts +6 -5
- package/dist/commonjs/index.js +4 -4
- package/dist/commonjs/push.d.ts +4 -0
- package/dist/commonjs/push.js +1 -0
- package/dist/commonjs/styles/AppColors.d.ts +40 -0
- package/dist/commonjs/styles/AppColors.js +1 -1
- package/dist/commonjs/styles/index.js +1 -1
- package/dist/commonjs/types/enums.d.ts +30 -20
- package/dist/commonjs/types/enums.js +1 -1
- package/dist/commonjs/types/index.d.ts +10 -0
- package/dist/commonjs/types/interfaces.d.ts +63 -7
- package/dist/esm/components/AnalyticsDetail.js +84 -81
- package/dist/esm/components/AnalyticsEventCard.js +20 -17
- package/dist/esm/components/AppHeaderLogo.js +5 -7
- package/dist/esm/components/ConsoleLogCard.d.ts +1 -0
- package/dist/esm/components/ConsoleLogCard.js +98 -86
- package/dist/esm/components/EndOfListFooter.d.ts +5 -1
- package/dist/esm/components/EndOfListFooter.js +36 -14
- package/dist/esm/components/Inspector/AnalyticsFilterModal.js +14 -14
- package/dist/esm/components/Inspector/AnalyticsTab.js +44 -316
- package/dist/esm/components/Inspector/ConsoleTab.js +55 -113
- package/dist/esm/components/Inspector/CrashDetail.js +53 -52
- package/dist/esm/components/Inspector/CrashTab.js +74 -64
- package/dist/esm/components/Inspector/DebuggingTab.js +33 -33
- package/dist/esm/components/Inspector/DeviceInfoTab.js +174 -138
- package/dist/esm/components/Inspector/FabLauncher.js +41 -42
- package/dist/esm/components/Inspector/InspectorHeader.js +138 -115
- package/dist/esm/components/Inspector/LogDetail.js +24 -21
- package/dist/esm/components/Inspector/MainScreen.js +98 -62
- package/dist/esm/components/Inspector/MediaGalleryTab.js +1 -1
- package/dist/esm/components/Inspector/MediaPreviewModal.js +31 -31
- package/dist/esm/components/Inspector/NetworkDetail.js +88 -87
- package/dist/esm/components/Inspector/NetworkFilterModal.js +8 -8
- package/dist/esm/components/Inspector/NetworkTab.js +132 -130
- package/dist/esm/components/Inspector/NpmStarPrompt.js +42 -42
- package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -46
- package/dist/esm/components/Inspector/PushCard.d.ts +4 -0
- package/dist/esm/components/Inspector/PushCard.js +89 -0
- package/dist/esm/components/Inspector/PushDetail.d.ts +4 -0
- package/dist/esm/components/Inspector/PushDetail.js +190 -0
- package/dist/esm/components/Inspector/PushTab.d.ts +3 -0
- package/dist/esm/components/Inspector/PushTab.js +45 -0
- package/dist/esm/components/Inspector/ReduxDetail.js +40 -37
- package/dist/esm/components/Inspector/ReduxTab.js +155 -152
- package/dist/esm/components/Inspector/SettingsPanel.js +380 -284
- package/dist/esm/components/Inspector/StorageTab.js +177 -173
- package/dist/esm/components/Inspector/TabBar.js +38 -34
- package/dist/esm/components/Inspector/UpdateAvailableModal.js +1 -1
- package/dist/esm/components/JsonViewer.js +161 -169
- package/dist/esm/components/LogCard.js +38 -42
- package/dist/esm/components/LogSyntaxHighlighter.js +1 -1
- package/dist/esm/components/ModuleErrorBoundary.d.ts +24 -0
- package/dist/esm/components/ModuleErrorBoundary.js +33 -0
- package/dist/esm/components/NetworkIcons.d.ts +3 -3
- package/dist/esm/components/NetworkIcons.js +7 -3
- package/dist/esm/components/SegmentedTabs.d.ts +8 -2
- package/dist/esm/components/SegmentedTabs.js +12 -8
- package/dist/esm/components/ShareButton.d.ts +11 -0
- package/dist/esm/components/ShareButton.js +6 -0
- package/dist/esm/constants/index.js +1 -1
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/crashHandler.js +6 -6
- package/dist/esm/customHooks/networkLogger.js +1 -2
- package/dist/esm/customHooks/pushNotificationLogger.d.ts +19 -0
- package/dist/esm/customHooks/pushNotificationLogger.js +1 -0
- package/dist/esm/helpers/index.d.ts +6 -0
- package/dist/esm/helpers/index.js +4 -4
- package/dist/esm/helpers/memoryManager.d.ts +2 -2
- package/dist/esm/helpers/memoryManager.js +1 -1
- package/dist/esm/helpers/remoteConfig.js +1 -1
- package/dist/esm/helpers/settingsStore.d.ts +1 -0
- package/dist/esm/helpers/settingsStore.js +1 -1
- package/dist/esm/helpers/shareFormatter.d.ts +13 -0
- package/dist/esm/helpers/shareFormatter.js +7 -0
- package/dist/esm/i18n/index.d.ts +35 -0
- package/dist/esm/i18n/index.js +1 -1
- package/dist/esm/i18n/locales/ar.json +1 -0
- package/dist/esm/i18n/locales/de.json +1 -0
- package/dist/esm/i18n/locales/en.json +1 -1
- package/dist/esm/i18n/locales/es.json +1 -0
- package/dist/esm/i18n/locales/fr.json +1 -0
- package/dist/esm/i18n/locales/hi.json +1 -0
- package/dist/esm/i18n/locales/ja.json +1 -0
- package/dist/esm/i18n/locales/ko.json +1 -0
- package/dist/esm/i18n/locales/pt.json +1 -0
- package/dist/esm/i18n/locales/ru.json +1 -0
- package/dist/esm/i18n/locales/zh.json +1 -0
- package/dist/esm/index.d.ts +6 -5
- package/dist/esm/index.js +7 -7
- package/dist/esm/push.d.ts +4 -0
- package/dist/esm/push.js +1 -0
- package/dist/esm/styles/AppColors.d.ts +40 -0
- package/dist/esm/styles/AppColors.js +1 -1
- package/dist/esm/styles/index.js +1 -1
- package/dist/esm/types/enums.d.ts +30 -20
- package/dist/esm/types/enums.js +1 -1
- package/dist/esm/types/index.d.ts +10 -0
- package/dist/esm/types/interfaces.d.ts +63 -7
- package/package.json +53 -24
- package/src/native/NativeInspector.ts +0 -1
- package/dist/commonjs/bundle.d.ts +0 -2
- package/dist/commonjs/bundle.js +0 -1
- package/dist/commonjs/components/BrandSquareIcon.d.ts +0 -5
- package/dist/commonjs/components/BrandSquareIcon.js +0 -112
- package/dist/commonjs/components/Inspector/BundleTab.d.ts +0 -48
- package/dist/commonjs/components/Inspector/BundleTab.js +0 -1297
- package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +0 -27
- package/dist/commonjs/components/Inspector/PerformanceTab.js +0 -454
- package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -115
- package/dist/commonjs/customHooks/bundleAnalyzer.js +0 -1
- package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -144
- package/dist/commonjs/customHooks/performanceTracker.js +0 -63
- package/dist/commonjs/performance.d.ts +0 -2
- package/dist/commonjs/performance.js +0 -1
- package/dist/esm/bundle.d.ts +0 -2
- package/dist/esm/bundle.js +0 -1
- package/dist/esm/components/BrandSquareIcon.d.ts +0 -5
- package/dist/esm/components/BrandSquareIcon.js +0 -112
- package/dist/esm/components/Inspector/BundleTab.d.ts +0 -48
- package/dist/esm/components/Inspector/BundleTab.js +0 -1297
- package/dist/esm/components/Inspector/PerformanceTab.d.ts +0 -27
- package/dist/esm/components/Inspector/PerformanceTab.js +0 -454
- package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -115
- package/dist/esm/customHooks/bundleAnalyzer.js +0 -1
- package/dist/esm/customHooks/performanceTracker.d.ts +0 -144
- package/dist/esm/customHooks/performanceTracker.js +0 -63
- package/dist/esm/performance.d.ts +0 -2
- package/dist/esm/performance.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getCachedBundleAnalysis=exports.clearCachedBundleAnalysis=exports.analyzeHostAppBundle=exports.getInitialBundleAnalysis=exports.parseBundleSource=exports.trackRuntimeDefine=exports.trackRuntimeModuleExecution=exports.getHostScriptURL=exports.getBundleModuleEnabled=exports.setBundleModuleEnabled=void 0;const AppColors_1=require("../styles/AppColors"),i18n_1=require("../i18n"),react_native_1=require("react-native");let cachedAnalysis=null,isAnalyzing=!1;const subscribers=[];let isBundleModuleEnabled=!1;const setBundleModuleEnabled=e=>{isBundleModuleEnabled=e};exports.setBundleModuleEnabled=setBundleModuleEnabled;const getBundleModuleEnabled=()=>isBundleModuleEnabled;exports.getBundleModuleEnabled=getBundleModuleEnabled;const getSourceCodeModule=()=>{try{const e=react_native_1.NativeModules?.SourceCode,o=e?.scriptURL||e?.getConstants?.()?.scriptURL;if(typeof o=="string"&&o.length>0)return{scriptURL:o}}catch{}try{const e=react_native_1.TurboModuleRegistry?.get?.("SourceCode"),o=e?.getConstants?.(),n=e?.scriptURL||o?.scriptURL;if(typeof n=="string"&&n.length>0)return{scriptURL:n}}catch{}return null},getHostScriptURL=()=>{try{const e=getSourceCodeModule()?.scriptURL;if(typeof e=="string"&&e.length>0)return e}catch{}try{const e=react_native_1.NativeModules?.PlatformConstants?.serverHost||react_native_1.NativeModules?.AndroidConstants?.serverHost||react_native_1.NativeModules?.DevSettings?.serverHost||react_native_1.NativeModules?.DevSettings?.getConstants?.()?.serverHost;if(typeof e=="string"&&e.length>0)return`${e.startsWith("http")?e:`http://${e}`}/index.bundle?platform=${react_native_1.Platform.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://${react_native_1.Platform.OS==="android"?"10.0.2.2":"localhost"}:${e}/index.bundle?platform=${react_native_1.Platform.OS}&dev=true`;if(typeof e=="string"&&e.length>0)return/^\d+$/.test(e)?`http://${react_native_1.Platform.OS==="android"?"10.0.2.2":"localhost"}:${e}/index.bundle?platform=${react_native_1.Platform.OS}&dev=true`:e.startsWith("http")?e:`http://${e}/index.bundle?platform=${react_native_1.Platform.OS}&dev=true`}catch{}return""};exports.getHostScriptURL=getHostScriptURL;const DYNAMIC_DEV_PORTS=[8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,19e3,19001,3e3],extractHostAndPort=e=>{if(!e||typeof e!="string")return{host:null,port:null};const o=e.match(/^https?:\/\/([^:/]+)(?::(\d+))?/);return o?{host:o[1]||null,port:o[2]?parseInt(o[2],10):null}:{host:null,port:null}},probeCandidateUrlsInParallel=async(e,o=3e3)=>{const{host:n,port:c}=extractHostAndPort(e);if(e&&e.startsWith("http"))try{const m=new AbortController,g=setTimeout(()=>m.abort(),o),b=await fetch(e,{signal:m.signal});if(clearTimeout(g),b.ok){const h=b.headers.get("content-length"),f=await b.text();if(f&&f.length>0){const x=h&&parseInt(h,10)||f.length;return{text:f,bytes:x,url:e}}}}catch{}const a=n?[n,"localhost","127.0.0.1",...react_native_1.Platform.OS==="android"?["10.0.2.2","10.0.3.2"]:[]]:["localhost","127.0.0.1",...react_native_1.Platform.OS==="android"?["10.0.2.2","10.0.3.2"]:[]],p=Array.from(new Set(a)),u=c?Array.from(new Set([c,...DYNAMIC_DEV_PORTS])):DYNAMIC_DEV_PORTS,i=[];for(const m of p)for(const g of u)i.push(new Promise(async(b,h)=>{const f=new AbortController,x=setTimeout(()=>f.abort(),700);try{const S=await fetch(`http://${m}:${g}/status`,{signal:f.signal});if(clearTimeout(x),S.ok){const M=await S.text();if(M&&M.includes("packager-status:running")){b({host:m,port:g});return}}}catch{clearTimeout(x)}h(new Error("unreachable"))}));let d=null;try{d=await new Promise((m,g)=>{let b=i.length;if(b===0){g(new Error("No candidate hosts"));return}i.forEach(h=>{h.then(m).catch(()=>{b--,b===0&&g(new Error("All probes failed"))})})})}catch{d=null}if(d){const m=`http://${d.host}:${d.port}/index.bundle?platform=${react_native_1.Platform.OS}&dev=true`;try{const g=new AbortController,b=setTimeout(()=>g.abort(),o),h=await fetch(m,{signal:g.signal});if(clearTimeout(b),h.ok){const f=h.headers.get("content-length"),x=await h.text();if(x&&x.length>0){const S=f&&parseInt(f,10)||x.length;return{text:x,bytes:S,url:m}}}}catch{}}return null},executedModuleIds=new Set,runtimeModules=new Map,trackRuntimeModuleExecution=()=>{try{const e=globalThis,o=e.__r;if(typeof o=="function"&&!o.__inspectorTracked){const n=function(c,...a){return executedModuleIds.add(Number(c)),o.call(this,c,...a)};Object.defineProperty(n,"__inspectorTracked",{value:!0,enumerable:!1}),e.__r=n}}catch{}};exports.trackRuntimeModuleExecution=trackRuntimeModuleExecution;const trackRuntimeDefine=()=>{try{const e=globalThis,o=e.__d;if(typeof o=="function"&&!o.__inspectorTracked){const n=function(c,a,p,u,...i){return typeof u=="string"&&u.length>0&&runtimeModules.set(Number(a),{id:Number(a),path:u}),o.call(this,c,a,p,u,...i)};Object.defineProperty(n,"__inspectorTracked",{value:!0,enumerable:!1}),e.__d=n}}catch{}};exports.trackRuntimeDefine=trackRuntimeDefine,(0,exports.trackRuntimeModuleExecution)(),(0,exports.trackRuntimeDefine)();const DEFAULT_BASELINE_MODULES=[{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"}],extractBundleModules=e=>{const o=[],n=new Set;if(e&&e.length>0){const c=/\/\/[#@]\s*sourceURL=(?:https?:\/\/[^\s\r\n/]+\/|file:\/\/)?([^\s\r\n?#]+)/g;let a,p=9e5;for(;(a=c.exec(e))!==null;){const d=a[1];if(d&&d.length>0&&!d.endsWith(".bundle")){const m=p++;n.has(m)||(n.add(m),o.push({id:m,deps:[],path:d}))}}const u=/,\s*(\d+)\s*,\s*(?:\[[^\]\r\n]{0,500}\]|\{[^}\r\n]{0,500}\})\s*,\s*["']([^"'\r\n]+)["']\s*\)/g;let i;for(;(i=u.exec(e))!==null;){const d=parseInt(i[1],10),m=i[2]||"";!n.has(d)&&m.length>0&&(n.add(d),o.push({id:d,deps:[],path:m}))}}return runtimeModules.forEach((c,a)=>{n.has(a)||(n.add(a),o.push({id:a,deps:[],path:c.path}))}),o.length===0?DEFAULT_BASELINE_MODULES:o},getStaticStartupModuleIds=e=>{const o=new Set;if(!e)return o;const n=/__r\s*\(\s*(\d+)\s*\)/g;let c;for(;(c=n.exec(e))!==null;)o.add(parseInt(c[1],10));return o},detectProjectRoot=e=>{const o=e.map(i=>i.replace(/\\/g,"/"));for(const i of o){const d=i.indexOf("/node_modules/");if(d!==-1)return i.slice(0,d+1)}for(const i of o){const d=i.match(/^(.*\/)(?:index\.[jt]sx?|app\.[jt]sx?|package\.json)(?:[?#].*)?$/i);if(d&&d[1])return d[1]}const n=o.filter(i=>i.startsWith("/")&&!i.includes("/node_modules/"));if(n.length===0)return"";if(n.length===1){const i=n[0].lastIndexOf("/");return i>0?n[0].slice(0,i+1):""}const c=n.map(i=>i.split("/"));let a=0;const p=c[0],u=Math.min(...c.map(i=>i.length));for(;a<u-1;){const i=p[a];if(c.every(d=>d[a]===i))a++;else break}return a>0?p.slice(0,a).join("/")+"/":""},normalizeProjectRelativePath=(e,o)=>{let n=e.replace(/\\/g,"/");const c=n.search(/[?#]/);return c!==-1&&(n=n.slice(0,c)),n=n.replace(/^(?:https?:\/\/[^/]+\/|file:\/\/)/,""),o&&n.startsWith(o)&&(n=n.slice(o.length)),n=n.replace(/^(\.\.\/)+/,"").replace(/^\.\//,"").replace(/^\/+/,""),n||(n=e.split("/").pop()||e),n},isExternalPackage=e=>{if(e.includes("node_modules/")){const o=e.match(/node_modules\/(?:@([^/]+)\/([^/]+)|([^/]+))/);return o?{isPkg:!0,pkgName:o[1]&&o[2]?`@${o[1]}/${o[2]}`:o[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}},isInternalModule=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"),parseBundleSource=(e,o,n,c=!0)=>{const a=!!globalThis.HermesInternal,p=Number((o/(1024*1024)).toFixed(2)),u=Math.round(o/1024),i=extractBundleModules(e),d=getStaticStartupModuleIds(e),m=new Map;for(const t of i)m.set(t.id,t);const g=new Set,b=[],h=t=>{g.has(t)||(g.add(t),b.push(t))};h(0),d.forEach(t=>h(t)),executedModuleIds.forEach(t=>h(t));for(const t of i){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"))&&h(t.id)}for(;b.length>0;){const t=b.shift(),s=m.get(t);if(s&&s.deps)for(const r of s.deps)h(r)}const f=new Map,x=[];for(const t of i){const s=t.path.replace(/\\/g,"/"),{isPkg:r,pkgName:v}=isExternalPackage(s);if(r){v&&!v.startsWith(".")&&f.set(v,(f.get(v)||0)+1);continue}isInternalModule(s)||x.push({mod:t,rawPath:s})}const S=detectProjectRoot(i.map(t=>t.path)),M=[];let oe=0;for(const{mod:t,rawPath:s}of x){const r=normalizeProjectRelativePath(s,S);if(!(r.endsWith(".tsx")||r.endsWith(".ts")||r.endsWith(".jsx")||r.endsWith(".js")||r.endsWith(".mjs")||r.endsWith(".cjs")||r.endsWith(".json")||r.endsWith(".png")||r.endsWith(".jpg")||r.endsWith(".jpeg")||r.endsWith(".gif")||r.endsWith(".webp")||r.endsWith(".svg")||r.endsWith(".bmp")||r.endsWith(".ico")||r.endsWith(".ttf")||r.endsWith(".otf")||r.endsWith(".woff")||r.endsWith(".woff2")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".html")||r.endsWith(".md")||r.endsWith(".graphql")||r.endsWith(".gql")))continue;const l=r.split(".").pop()?.toUpperCase()||"JS",j=r.split("/").pop()||r;let A="javascript",N=AppColors_1.AppColors.indigo500;l==="TSX"||l==="TS"?(A="typescript",N=AppColors_1.AppColors.sky500):l==="PNG"||l==="JPG"||l==="JPEG"||l==="GIF"||l==="WEBP"||l==="SVG"||l==="BMP"||l==="ICO"?(A="image",N=AppColors_1.AppColors.pink500):l==="TTF"||l==="OTF"||l==="WOFF"||l==="WOFF2"?(A="font",N=AppColors_1.AppColors.purple500):(l==="JSON"||l==="CSS"||l==="SCSS"||l==="HTML"||l==="MD"||l==="GRAPHQL"||l==="GQL")&&(A="json",N=AppColors_1.AppColors.emerald500);const X=Math.max(2,Math.round(u*.15/Math.max(i.length,20))),Y=!(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("__mocks__")||r.includes(".stories.")||r.includes("fixtures/"));M.push({id:`host-file-${oe++}`,name:j,path:r,ext:l,category:A,sizeKb:X,meta:`Active Host App Module \u2022 ${A.toUpperCase()}`,color:N,status:Y?"optimal":"warning",advice:Y?"In-Use: Bundled and active in host application dependency tree":"Not consumed: Test fixture or orphaned file packaged in bundle",isConsumed:Y})}const ne=t=>{const s=[AppColors_1.AppColors.indigo500,AppColors_1.AppColors.sky500,AppColors_1.AppColors.pink500,AppColors_1.AppColors.purple500,AppColors_1.AppColors.emerald500,AppColors_1.AppColors.amber500,AppColors_1.AppColors.red500,AppColors_1.AppColors.teal500,AppColors_1.AppColors.blue500,AppColors_1.AppColors.fuchsia500,AppColors_1.AppColors.orange500,AppColors_1.AppColors.lime500,AppColors_1.AppColors.cyan500,AppColors_1.AppColors.purple900,AppColors_1.AppColors.errorColor];let r=0;for(let v=0;v<t.length;v++)r=t.charCodeAt(v)+((r<<5)-r);return s[Math.abs(r)%s.length]},re=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"},ie=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,Z=Array.from(f.entries()),ae=Z.reduce((t,[,s])=>t+s,0)||1,k=[];Z.forEach(([t,s],r)=>{const v=re(t),l=ne(t),j=ie(t)||void 0,A=!j,N=Math.max(8,Math.round(u*.52*s/Math.max(ae,1))),X=Number((N/Math.max(u,1)*100).toFixed(1));k.push({id:`host-pkg-${r}`,name:t,version:"",latestVersion:"",sizeKb:N,percentage:X,type:A?"direct":"transitive",isDirectDefined:A,parentPackageName:j,subpackages:[],category:v,color:l,description:`${s} bundled ${s===1?"module":"modules"}`,npmUrl:`https://www.npmjs.com/package/${t}`,isDeprecated:!1,lastActive:`${s} modules`})});const E=new Map;k.forEach(t=>{t.isDirectDefined&&E.set(t.name,t)}),k.forEach(t=>{if(t.parentPackageName&&E.has(t.parentPackageName)){const s=E.get(t.parentPackageName);s.subpackages||(s.subpackages=[]),s.subpackages.push(t)}}),k.sort((t,s)=>s.sizeKb-t.sizeKb);let R=0;for(const t of k)R+=t.sizeKb||0;let B=0,I=0;for(const t of M)t.category==="image"||t.category==="font"?I+=t.sizeKb||0:B+=t.sizeKb||0;const T=B>0?B:Math.round(u*.18),w=R>0?R:Math.round(u*.58),P=I>0?I:Math.round(u*.08),ee=Math.max(0,u-T-w-P),C=Number((u*.38/1024).toFixed(2)),D=Number((w/1024).toFixed(2)),O=Number((P/1024).toFixed(2)),W=Math.min(k.length,55),z=Number((48+W*.35+D*.9).toFixed(1)),H=Number((38+W*.22+D*.6).toFixed(1)),L=Number((30+O*2.2).toFixed(1)),$=6.4,_=Number((C+z+H+L+$).toFixed(1)),ce=Number((_*.655).toFixed(1)),U=Number((20+W*.12+D*.4).toFixed(1)),K=Number((14+W*.08+D*.25).toFixed(1)),q=Number((16+O*1.5).toFixed(1)),y=Number((C+U+K+q+3.8).toFixed(1)),te=Number((y*.54).toFixed(1)),V=Number((195+W*.55+D*1.6).toFixed(1)),G=Number((54+W*.2+D*.6).toFixed(1)),J=Number((58+O*2.8).toFixed(1)),Q=8.5,F=Number((C+V+G+J+Q).toFixed(1)),de=Number(F.toFixed(1)),le=[{id:"ios-c1",name:(0,i18n_1.t)("bundle.iosComp1Name"),category:"frameworks",sizeMb:z,pct:Number((z/_*100).toFixed(1)),color:AppColors_1.AppColors.indigo500,description:(0,i18n_1.t)("bundle.iosComp1Desc",{count:k.length}),advice:(0,i18n_1.t)("bundle.iosComp1Advice")},{id:"ios-c2",name:(0,i18n_1.t)("bundle.iosComp2Name"),category:"native",sizeMb:H,pct:Number((H/_*100).toFixed(1)),color:AppColors_1.AppColors.sky500,description:(0,i18n_1.t)("bundle.iosComp2Desc"),advice:(0,i18n_1.t)("bundle.iosComp2Advice")},{id:"ios-c3",name:(0,i18n_1.t)("bundle.iosComp3Name"),category:"assets",sizeMb:L,pct:Number((L/_*100).toFixed(1)),color:AppColors_1.AppColors.pink500,description:(0,i18n_1.t)("bundle.iosComp3Desc"),advice:(0,i18n_1.t)("bundle.iosComp3Advice")},{id:"ios-c4",name:(0,i18n_1.t)("bundle.iosComp4Name"),category:"js",sizeMb:C,pct:Number((C/_*100).toFixed(1)),color:AppColors_1.AppColors.emerald500,description:(0,i18n_1.t)("bundle.iosComp4Desc",{count:M.length}),advice:(0,i18n_1.t)("bundle.iosComp4Advice")},{id:"ios-c5",name:(0,i18n_1.t)("bundle.iosComp5Name"),category:"meta",sizeMb:$,pct:Number(($/_*100).toFixed(1)),color:AppColors_1.AppColors.amber500,description:(0,i18n_1.t)("bundle.iosComp5Desc"),advice:(0,i18n_1.t)("bundle.iosComp5Advice")}],se=[{id:"and-c1",name:(0,i18n_1.t)("bundle.andComp1Name"),category:"native",sizeMb:U,pct:Number((U/y*100).toFixed(1)),color:AppColors_1.AppColors.sky500,description:(0,i18n_1.t)("bundle.andComp1Desc",{count:k.length}),advice:(0,i18n_1.t)("bundle.andComp1Advice")},{id:"and-c2",name:(0,i18n_1.t)("bundle.andComp2Name"),category:"frameworks",sizeMb:K,pct:Number((K/y*100).toFixed(1)),color:AppColors_1.AppColors.indigo500,description:(0,i18n_1.t)("bundle.andComp2Desc"),advice:(0,i18n_1.t)("bundle.andComp2Advice")},{id:"and-c3",name:(0,i18n_1.t)("bundle.andComp3Name"),category:"assets",sizeMb:q,pct:Number((q/y*100).toFixed(1)),color:AppColors_1.AppColors.pink500,description:(0,i18n_1.t)("bundle.andComp3Desc"),advice:(0,i18n_1.t)("bundle.andComp3Advice")},{id:"and-c4",name:(0,i18n_1.t)("bundle.andComp4Name"),category:"js",sizeMb:C,pct:Number((C/y*100).toFixed(1)),color:AppColors_1.AppColors.emerald500,description:(0,i18n_1.t)("bundle.andComp4Desc",{count:M.length}),advice:(0,i18n_1.t)("bundle.andComp4Advice")},{id:"and-c5",name:(0,i18n_1.t)("bundle.andComp5Name"),category:"meta",sizeMb:3.8,pct:Number((3.8/y*100).toFixed(1)),color:AppColors_1.AppColors.amber500,description:(0,i18n_1.t)("bundle.andComp5Desc"),advice:(0,i18n_1.t)("bundle.andComp5Advice")}],pe=[{id:"apk-c1",name:(0,i18n_1.t)("bundle.apkComp1Name"),category:"native",sizeMb:V,pct:Number((V/F*100).toFixed(1)),color:AppColors_1.AppColors.sky500,description:(0,i18n_1.t)("bundle.apkComp1Desc"),advice:(0,i18n_1.t)("bundle.apkComp1Advice")},{id:"apk-c2",name:(0,i18n_1.t)("bundle.apkComp2Name"),category:"frameworks",sizeMb:G,pct:Number((G/F*100).toFixed(1)),color:AppColors_1.AppColors.indigo500,description:(0,i18n_1.t)("bundle.apkComp2Desc"),advice:(0,i18n_1.t)("bundle.apkComp2Advice")},{id:"apk-c3",name:(0,i18n_1.t)("bundle.apkComp3Name"),category:"assets",sizeMb:J,pct:Number((J/F*100).toFixed(1)),color:AppColors_1.AppColors.pink500,description:(0,i18n_1.t)("bundle.apkComp3Desc"),advice:(0,i18n_1.t)("bundle.apkComp3Advice")},{id:"apk-c4",name:(0,i18n_1.t)("bundle.apkComp4Name"),category:"js",sizeMb:C,pct:Number((C/F*100).toFixed(1)),color:AppColors_1.AppColors.emerald500,description:(0,i18n_1.t)("bundle.apkComp4Desc",{count:M.length}),advice:(0,i18n_1.t)("bundle.apkComp4Advice")},{id:"apk-c5",name:(0,i18n_1.t)("bundle.apkComp5Name"),category:"meta",sizeMb:Q,pct:Number((Q/F*100).toFixed(1)),color:AppColors_1.AppColors.amber500,description:(0,i18n_1.t)("bundle.apkComp5Desc"),advice:(0,i18n_1.t)("bundle.apkComp5Advice")}];return{isLive:c,scriptURL:n,totalDevBytes:o,totalDevMb:p,totalDevKb:u,isHermes:a,moduleCount:i.length||M.length+k.length,packageCount:k.length,filesCount:M.length,splitUp:{appSource:{kb:T,mb:Number((T/1024).toFixed(2)),pct:15},nodeModules:{kb:w,mb:Number((w/1024).toFixed(2)),pct:52},assetsMedia:{kb:P,mb:Number((P/1024).toFixed(2)),pct:12},metroDevOverhead:{kb:ee,mb:Number((ee/1024).toFixed(2)),pct:21}},files:M,packages:k,production:{ios:{totalInstallMb:_,totalDownloadMb:ce,compressionRatioPct:Number(((p-C)/Math.max(p,1)*100).toFixed(1)),components:le},androidAab:{totalInstallMb:y,totalDownloadMb:te,compressionRatioPct:Number(((p-C)/Math.max(p,1)*100).toFixed(1)),components:se},androidApk:{totalInstallMb:F,totalDownloadMb:de,compressionRatioPct:Number(((p-C)/Math.max(p,1)*.7).toFixed(1)),components:pe},android:{totalInstallMb:y,totalDownloadMb:te,compressionRatioPct:Number(((p-C)/Math.max(p,1)*100).toFixed(1)),components:se}}}};exports.parseBundleSource=parseBundleSource;const getInitialBundleAnalysis=()=>{if(cachedAnalysis)return cachedAnalysis;const e=(0,exports.getHostScriptURL)();return(0,exports.parseBundleSource)("",684e4,e||"unknown",!1)};exports.getInitialBundleAnalysis=getInitialBundleAnalysis;const analyzeHostAppBundle=async(e=!1)=>{if(e&&(cachedAnalysis=null),cachedAnalysis&&!e)return cachedAnalysis;if(isAnalyzing)return new Promise(a=>{subscribers.push(a)});isAnalyzing=!0;const o=(0,exports.getHostScriptURL)();try{const a=await probeCandidateUrlsInParallel(o,2500);if(a&&a.text&&a.text.length>0){const p=(0,exports.parseBundleSource)(a.text,a.bytes,a.url);return cachedAnalysis=p,isAnalyzing=!1,subscribers.forEach(u=>u(p)),subscribers.length=0,p}}catch{}const c=(0,exports.parseBundleSource)("",684e4,o||"unknown",!1);return cachedAnalysis=c,isAnalyzing=!1,subscribers.forEach(a=>a(c)),subscribers.length=0,c};exports.analyzeHostAppBundle=analyzeHostAppBundle;const clearCachedBundleAnalysis=()=>{cachedAnalysis=null};exports.clearCachedBundleAnalysis=clearCachedBundleAnalysis;const getCachedBundleAnalysis=()=>cachedAnalysis;exports.getCachedBundleAnalysis=getCachedBundleAnalysis;
|
|
@@ -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
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getPerformanceEvents=exports.subscribePerformanceEvents=exports.clearPerformanceEvents=exports.logPerformanceEvent=exports.prunePerformanceEvents=exports.getMaxPerformanceEventsLimit=exports.setMaxPerformanceEventsLimit=exports.usePerformanceTracker=exports.useComponentProfiler=exports.measureAsync=exports.trackHeavyTask=exports.useNavigationProfiler=exports.trackNavigationTransition=exports.getHermesMemoryStats=exports.trackComponentRender=exports.registerComponentProfile=exports.getRenderProfiles=exports.subscribeRenderProfiles=exports.getPerformanceModuleEnabled=exports.setPerformanceModuleEnabled=exports.INITIAL_EVENTS=exports.getInitialPerformanceEvents=exports.getInitialRenderProfiles=exports.generateFixSnippet=void 0,exports.getCallerSourceFile=getCallerSourceFile;const AppColors_1=require("../styles/AppColors"),i18n_1=require("../i18n"),react_1=require("react"),generateFixSnippet=(e,r="Component",o)=>{const t=r||"Component",n=o?.propName||"onPress",a=o?.actionName||"handlePress",p=o?.itemHeight||72;switch(e){case"useCallback":return{keyName:"useCallback",title:(0,i18n_1.t)("performance.fixUseCallbackTitle"),explanation:(0,i18n_1.t)("performance.fixUseCallbackDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeUseCallback",{comp:t})}
|
|
2
|
-
<Button ${n}={() => ${a}(item.id)} />
|
|
3
|
-
|
|
4
|
-
${(0,i18n_1.t)("performance.afterUseCallback")}
|
|
5
|
-
const ${a}Memo = useCallback(() => {
|
|
6
|
-
${a}(item.id);
|
|
7
|
-
}, [item.id]);
|
|
8
|
-
<Button ${n}={${a}Memo} />`,impact:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"createSelector":case"useMemo":return{keyName:"createSelector",title:(0,i18n_1.t)("performance.fixCreateSelectorTitle"),explanation:(0,i18n_1.t)("performance.fixCreateSelectorDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeCreateSelector",{comp:t})}
|
|
9
|
-
const { items, total } = useSelector(state => ({
|
|
10
|
-
items: state.cart.items,
|
|
11
|
-
total: state.cart.total,
|
|
12
|
-
}));
|
|
13
|
-
|
|
14
|
-
${(0,i18n_1.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:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"memo":case"React.memo":return{keyName:"memo",title:(0,i18n_1.t)("performance.fixReactMemoTitle"),explanation:(0,i18n_1.t)("performance.fixReactMemoDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeMemo",{comp:t})}
|
|
20
|
-
export const ${t} = (props: ${t}Props) => {
|
|
21
|
-
return <View>...</View>;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
${(0,i18n_1.t)("performance.afterMemo")}
|
|
25
|
-
export const ${t} = React.memo((props: ${t}Props) => {
|
|
26
|
-
return <View>...</View>;
|
|
27
|
-
}, (prev, next) => prev.id === next.id && prev.updatedAt === next.updatedAt);`,impact:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"getItemLayout":return{keyName:"getItemLayout",title:(0,i18n_1.t)("performance.fixGetItemLayoutTitle"),explanation:(0,i18n_1.t)("performance.fixGetItemLayoutDesc"),codeSnippet:`${(0,i18n_1.t)("performance.flatListOptimization",{comp:t})}
|
|
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}) => <${t} item={item} />}
|
|
39
|
-
keyExtractor={item => String(item.id)}
|
|
40
|
-
/>`,impact:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"customComparator":return{keyName:"customComparator",title:(0,i18n_1.t)("performance.fixCustomComparatorTitle"),explanation:(0,i18n_1.t)("performance.fixCustomComparatorDesc"),codeSnippet:`${(0,i18n_1.t)("performance.customComparator",{comp:t})}
|
|
41
|
-
export const ${t} = React.memo(
|
|
42
|
-
${t}Component,
|
|
43
|
-
(prevProps, nextProps) => {
|
|
44
|
-
return prevProps.id === nextProps.id && prevProps.status === nextProps.status;
|
|
45
|
-
}
|
|
46
|
-
);`,impact:(0,i18n_1.t)("performance.mediumImpact"),impactColor:AppColors_1.AppColors.amber500};case"DebouncedInput":return{keyName:"DebouncedInput",title:(0,i18n_1.t)("performance.fixDebouncedInputTitle"),explanation:(0,i18n_1.t)("performance.fixDebouncedInputDesc"),codeSnippet:`${(0,i18n_1.t)("performance.debounceInput",{comp:t})}
|
|
47
|
-
const [localText, setLocalText] = useState('');
|
|
48
|
-
const debouncedSearch = useMemo(
|
|
49
|
-
() => debounce((query: string) => onSearch(query), 250),
|
|
50
|
-
[onSearch]
|
|
51
|
-
);`,impact:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"ComponentSplitting":return{keyName:"ComponentSplitting",title:(0,i18n_1.t)("performance.fixComponentSplittingTitle"),explanation:(0,i18n_1.t)("performance.fixComponentSplittingDesc"),codeSnippet:`${(0,i18n_1.t)("performance.isolateState",{comp:t})}
|
|
52
|
-
export const StickyKeyboard = React.memo(KeyboardStickyView);`,impact:(0,i18n_1.t)("performance.mediumImpact"),impactColor:AppColors_1.AppColors.purple500};case"InteractionManager":return{keyName:"InteractionManager",title:(0,i18n_1.t)("performance.fixInteractionManagerTitle"),explanation:(0,i18n_1.t)("performance.fixInteractionManagerDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeInteractionManager",{comp:t})}
|
|
53
|
-
|
|
54
|
-
${(0,i18n_1.t)("performance.afterInteractionManager")}`,impact:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"FlatListWindowing":return{keyName:"FlatListWindowing",title:(0,i18n_1.t)("performance.fixFlatListWindowingTitle"),explanation:(0,i18n_1.t)("performance.fixFlatListWindowingDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeFlatListWindowing",{comp:t})}`,impact:(0,i18n_1.t)("performance.mediumImpact"),impactColor:AppColors_1.AppColors.purple500};case"ImageCaching":return{keyName:"ImageCaching",title:(0,i18n_1.t)("performance.fixImageCachingTitle"),explanation:(0,i18n_1.t)("performance.fixImageCachingDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeImageCaching",{comp:t})}`,impact:(0,i18n_1.t)("performance.mediumImpact"),impactColor:AppColors_1.AppColors.purple500};case"ContextSplitting":return{keyName:"ContextSplitting",title:(0,i18n_1.t)("performance.fixContextSplittingTitle"),explanation:(0,i18n_1.t)("performance.fixContextSplittingDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeContextSplitting",{comp:t})}
|
|
55
|
-
|
|
56
|
-
${(0,i18n_1.t)("performance.afterContextSplitting")}`,impact:(0,i18n_1.t)("performance.highImpact"),impactColor:AppColors_1.AppColors.pink500};case"InlineStylesHoist":return{keyName:"InlineStylesHoist",title:(0,i18n_1.t)("performance.fixInlineStylesHoistTitle"),explanation:(0,i18n_1.t)("performance.fixInlineStylesHoistDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeInlineStyles",{comp:t})}
|
|
57
|
-
|
|
58
|
-
${(0,i18n_1.t)("performance.afterInlineStyles")}`,impact:(0,i18n_1.t)("performance.bestPractice"),impactColor:AppColors_1.AppColors.pink500};default:return{keyName:"useRefForTracking",title:(0,i18n_1.t)("performance.fixUseRefForTrackingTitle"),explanation:(0,i18n_1.t)("performance.fixUseRefForTrackingDesc"),codeSnippet:`${(0,i18n_1.t)("performance.beforeUseRef",{comp:t})}
|
|
59
|
-
const [eventCount, setEventCount] = useState(0);
|
|
60
|
-
|
|
61
|
-
${(0,i18n_1.t)("performance.afterUseRef")}
|
|
62
|
-
const eventCountRef = useRef(0);`,impact:(0,i18n_1.t)("performance.bestPractice"),impactColor:AppColors_1.AppColors.pink500}}};exports.generateFixSnippet=generateFixSnippet;function getCallerSourceFile(e){try{const r=new Error().stack;if(!r)return e||"React Native Runtime";const o=r.split(`
|
|
63
|
-
`);for(let t=0;t<o.length;t++){const n=o[t];if(n.includes("performanceTracker")||n.includes("node_modules")||n.includes("Error")||n.includes("regeneratorRuntime"))continue;const a=n.match(/(?:at\s+)?(?:.*?\((.*?)(?::\d+)?(?::\d+)?\)|(\S+:\d+:\d+))/);if(a){const f=(a[1]||a[2]||"").trim().replace(/^at\s+/,"");if(f&&!f.includes("performanceTracker"))return f}const p=n.trim().replace(/^at\s+/,"");if(p&&!p.includes("performanceTracker"))return p}}catch{}return e||"React Native Runtime"}const getInitialRenderProfiles=()=>[];exports.getInitialRenderProfiles=getInitialRenderProfiles;const getInitialPerformanceEvents=()=>[];exports.getInitialPerformanceEvents=getInitialPerformanceEvents,exports.INITIAL_EVENTS=[];let isPerformanceModuleEnabled=!1;const setPerformanceModuleEnabled=e=>{isPerformanceModuleEnabled=e};exports.setPerformanceModuleEnabled=setPerformanceModuleEnabled;const getPerformanceModuleEnabled=()=>isPerformanceModuleEnabled;exports.getPerformanceModuleEnabled=getPerformanceModuleEnabled;const globalRenderRegistry=new Map,renderListeners=new Set,notifyRenderListeners=()=>{const e=Array.from(globalRenderRegistry.values());renderListeners.forEach(r=>{try{r(e)}catch{}})},subscribeRenderProfiles=e=>(renderListeners.add(e),e(Array.from(globalRenderRegistry.values())),()=>{renderListeners.delete(e)});exports.subscribeRenderProfiles=subscribeRenderProfiles;const getRenderProfiles=()=>Array.from(globalRenderRegistry.values());exports.getRenderProfiles=getRenderProfiles;const registerComponentProfile=e=>{isPerformanceModuleEnabled&&(globalRenderRegistry.set(e.name,e),notifyRenderListeners())};exports.registerComponentProfile=registerComponentProfile;const trackComponentRender=e=>{if(!isPerformanceModuleEnabled)return;const r=globalRenderRegistry.get(e.name),o=Date.now(),t=e.renderTimeMs??1.5,n=e.isWasteful??!1;if(r){const a=r.renderCount+1,p=r.wastefulCount+(n?1:0),f=Number((p/a*100).toFixed(1)),g=Number((r.totalRenderTimeMs+t).toFixed(1)),b=Number((g/a).toFixed(1)),h=e.reason?Array.from(new Set([...r.reasons,e.reason])):r.reasons,M={...r,renderCount:a,wastefulCount:p,wastefulPercentage:f,avgRenderTimeMs:b,totalRenderTimeMs:g,lastRenderedAt:o,reasons:h,severity:f>70&&a>20?"critical":f>40&&a>10?"warning":"optimal"};globalRenderRegistry.set(e.name,M)}else{const a={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:n?1:0,wastefulPercentage:n?100:0,avgRenderTimeMs:t,totalRenderTimeMs:t,lastRenderedAt:o,reasons:e.reason?[e.reason]:[],fixKeys:e.fixKeys||[(0,exports.generateFixSnippet)("useCallback",e.name),(0,exports.generateFixSnippet)("memo",e.name)],severity:"optimal"};globalRenderRegistry.set(e.name,a)}notifyRenderListeners()};exports.trackComponentRender=trackComponentRender;const 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)),t=Number(((r.js_heap_capacity||r.allocated_bytes||64e6)/1048576).toFixed(1)),n=Number(r.num_gcs||0),a=Number(((r.gc_time_ms||0)/Math.max(1,n)).toFixed(1));return{heapUsedMb:o,heapTotalMb:t,gcCount:n,gcPauseMs:a,allocationRateMbPerSec:1.8}}}catch{}return{heapUsedMb:32.5,heapTotalMb:64,gcCount:0,gcPauseMs:1.5,allocationRateMbPerSec:1.2}};exports.getHermesMemoryStats=getHermesMemoryStats;const trackNavigationTransition=(e,r,o)=>{const t=Math.max(1,Number(r.toFixed(1))),n=o?.ttiMs?Number(o.ttiMs.toFixed(1)):t,a=o?.droppedFrames??(t>32?Math.round((t-16.67)/16.67):0),p=Math.min(60,Math.max(15,Math.round(1e3/Math.max(16.67,t))));return(0,exports.logPerformanceEvent)({type:"transition",category:"navigation",fps:p,durationMs:t,droppedFrames:a,frameTimeMs:t,frameBudgetPct:Number((t/16.67*100).toFixed(0)),bottleneckThread:t>32?"JS Thread":"Balanced",screenName:e,label:(0,i18n_1.t)("performance.transitionEventLabel",{screen:e}),detail:(0,i18n_1.t)("performance.transitionEventDetail",{duration:t,tti:n}),source:o?.source||getCallerSourceFile(e),advice:(0,i18n_1.t)("performance.transitionEventAdvice"),severity:t>50?"critical":t>25?"warning":"optimal"})};exports.trackNavigationTransition=trackNavigationTransition;const useNavigationProfiler=(e,r)=>{const o=(0,react_1.useRef)(Date.now());(0,react_1.useEffect)(()=>{const t=Date.now()-o.current;(0,exports.trackNavigationTransition)(e,t),r?.onTransitionEnd&&r.onTransitionEnd(t)},[e])};exports.useNavigationProfiler=useNavigationProfiler;const trackHeavyTask=(e,r,o)=>{const t=Date.now();try{return r()}finally{const n=Date.now()-t,a=o?.thresholdMs??16;n>=a&&(0,exports.logPerformanceEvent)({type:"slow_render",category:"render",fps:Math.min(60,Math.max(10,Math.round(1e3/n))),durationMs:n,frameTimeMs:n,frameBudgetPct:Number((n/16.67*100).toFixed(0)),bottleneckThread:"JS Thread",screenName:e,label:(0,i18n_1.t)("performance.heavyTaskEventLabel",{taskName:e}),detail:(0,i18n_1.t)("performance.heavyTaskEventDetail",{duration:n}),source:o?.source||getCallerSourceFile(e),advice:(0,i18n_1.t)("performance.heavyTaskEventAdvice"),severity:n>50?"critical":"warning"})}};exports.trackHeavyTask=trackHeavyTask;const measureAsync=async(e,r,o)=>{const t=Date.now();try{return await r()}finally{const n=Date.now()-t,a=o?.thresholdMs??100;n>=a&&(0,exports.logPerformanceEvent)({type:"network",category:"io",fps:60,durationMs:n,bottleneckThread:"Balanced",screenName:e,label:(0,i18n_1.t)("performance.asyncOpEventLabel",{opName:e}),detail:(0,i18n_1.t)("performance.asyncOpEventDetail",{duration:n}),source:o?.source||getCallerSourceFile(e),severity:n>1e3?"critical":n>300?"warning":"optimal"})}};exports.measureAsync=measureAsync;const useComponentProfiler=(e,r)=>{const o=(0,react_1.useRef)(0),t=(0,react_1.useRef)(r?.propsToCompare),n=(0,react_1.useRef)(Date.now()),a=(0,react_1.useRef)([]);n.current=Date.now(),(0,react_1.useEffect)(()=>{const p=Date.now()-n.current,f=Date.now();o.current+=1,a.current=[...a.current.filter(h=>f-h<=500),f],a.current.length>=10&&(0,exports.logPerformanceEvent)({type:"slow_render",category:"render",fps:20,durationMs:p,bottleneckThread:"JS Thread",screenName:e,label:(0,i18n_1.t)("performance.renderLoopWarningLabel",{comp:e}),detail:(0,i18n_1.t)("performance.renderLoopWarningDetail",{comp:e,count:a.current.length}),source:r?.sourceFile||getCallerSourceFile(e),advice:(0,i18n_1.t)("performance.renderLoopWarningAdvice"),severity:"critical"});let g=!1,b;if(o.current>1&&r?.propsToCompare){const h=t.current,M=r.propsToCompare;Object.keys(M).filter(y=>h[y]!==M[y]).length===0&&(g=!0,b="Re-rendered with identical props (memoization candidate)"),t.current=M}(0,exports.trackComponentRender)({name:e,type:r?.type||"component",sourceFile:r?.sourceFile||getCallerSourceFile(e),renderTimeMs:Math.max(.5,p),isWasteful:g,reason:b})})};exports.useComponentProfiler=useComponentProfiler;const usePerformanceTracker=(e=!0)=>{const r=e&&isPerformanceModuleEnabled,[o,t]=(0,react_1.useState)(!0),[n,a]=(0,react_1.useState)(60),[p,f]=(0,react_1.useState)(60),[g,b]=(0,react_1.useState)(60),[h,M]=(0,react_1.useState)(60),[v,F]=(0,react_1.useState)(0),[y,N]=(0,react_1.useState)(0),[S,A]=(0,react_1.useState)(0),[L,$]=(0,react_1.useState)(()=>Array(30).fill(60)),[_,I]=(0,react_1.useState)(()=>(0,exports.getHermesMemoryStats)()),[C,H]=(0,react_1.useState)(()=>(0,exports.getRenderProfiles)()),[E,w]=(0,react_1.useState)(()=>(0,exports.getPerformanceEvents)());(0,react_1.useEffect)(()=>{if(!r)return;const c=(0,exports.subscribeRenderProfiles)(i=>{H(i)}),s=(0,exports.subscribePerformanceEvents)(i=>{w(i)});return()=>{c(),s()}},[r]);const R=(0,react_1.useRef)(Date.now()),P=(0,react_1.useRef)(null),z=(0,react_1.useRef)(Date.now());(0,react_1.useEffect)(()=>{if(!r||!o)return;let c=!0,s=0,i=0,u=Date.now();const d=()=>{if(!c)return;const l=Date.now(),K=l-R.current;R.current=l;const D=Math.max(0,K-16.67);if(D>i&&(i=D),s++,l-u>=1e3){const J=l-u,x=Math.min(60,Math.max(0,Math.round(s*1e3/J)));a(x),f(m=>Math.min(m,x)),b(m=>Math.max(m,x)),F(m=>m+s),A(Number(i.toFixed(1))),x<55&&N(m=>m+1),$(m=>{const k=[...m.slice(-29),x],B=k.reduce((G,O)=>G+O,0);return M(Math.round(B/k.length)),k});const T=(0,exports.getHermesMemoryStats)();if(I(m=>({...m,heapUsedMb:T.heapUsedMb,heapTotalMb:T.heapTotalMb,gcCount:T.gcCount,gcPauseMs:T.gcPauseMs,allocationRateMbPerSec:T.allocationRateMbPerSec})),x<50){const m=Number((1e3/x).toFixed(1));(0,exports.logPerformanceEvent)({type:"fps_drop",category:"render",fps:x,durationMs:m,droppedFrames:Math.max(0,60-x),frameTimeMs:m,frameBudgetPct:Number((m/16.67*100).toFixed(0)),bottleneckThread:i>8?"JS Thread":"UI Thread",screenName:"Live Application Render",label:(0,i18n_1.t)("performance.liveFpsDropLabel",{fps:x}),detail:(0,i18n_1.t)("performance.liveFpsDropDetail",{duration:m}),source:"React Native UI Thread",breakdown:{jsTimeMs:Number((m*.65).toFixed(1)),uiTimeMs:Number((m*.35).toFixed(1))},advice:(0,i18n_1.t)("performance.liveFpsDropAdvice"),severity:x<30?"critical":"warning"})}s=0,i=0,u=l}P.current=requestAnimationFrame(d)};return R.current=Date.now(),P.current=requestAnimationFrame(d),()=>{c=!1,P.current&&cancelAnimationFrame(P.current)}},[o]);const U=(0,react_1.useMemo)(()=>{const c=v>0?Number((y/Math.max(1,v/60)*100).toFixed(1)):0,s=E.filter(l=>l.type==="slow_render").length,i=Math.min(100,Math.max(8,Number((S+12.5).toFixed(1)))),u=Math.max(120,Math.min(500,Math.round(150+s*25)));return{ttiMs:Math.max(280,Math.min(1200,Math.round(u+180+s*40))),fcpMs:u,inpMs:i,jankPercentage:c,grade:c<=2?"Optimal":c<=5?"Fair":"Poor"}},[v,y,S,E]),W=(0,react_1.useMemo)(()=>{const c=C.reduce((d,l)=>d+l.renderCount,0),s=C.reduce((d,l)=>d+l.wastefulCount,0),i=c>0?Number((s/c*100).toFixed(1)):0,u=[...C].sort((d,l)=>l.renderCount-d.renderCount)[0];return{totalRenders:c,totalWasteful:s,overallWastefulPct:i,topOffender:u,totalComponentsTracked:C.length}},[C]),V=()=>{(0,exports.clearPerformanceEvents)()},j=(0,react_1.useCallback)(()=>{globalRenderRegistry.forEach((c,s)=>{globalRenderRegistry.set(s,{...c,renderCount:1,wastefulCount:0,wastefulPercentage:0,totalRenderTimeMs:c.avgRenderTimeMs,lastRenderedAt:Date.now(),severity:"optimal"})}),notifyRenderListeners()},[]),q=(0,react_1.useCallback)(c=>{globalRenderRegistry.forEach((s,i)=>{if(s.id===c||s.name===c){const u=s.renderCount+1,d=s.wastefulCount+1,l=Number((d/u*100).toFixed(1));globalRenderRegistry.set(i,{...s,renderCount:u,wastefulCount:d,wastefulPercentage:l,totalRenderTimeMs:Number((s.totalRenderTimeMs+s.avgRenderTimeMs).toFixed(1)),lastRenderedAt:Date.now(),severity:u>30?"critical":u>15?"warning":"optimal"})}}),notifyRenderListeners()},[]);return{isRecording:o,setIsRecording:t,currentFps:n,minFps:p,maxFps:g,avgFps:h,totalFrames:v,jankyFrameCount:y,jsLagMs:S,fpsHistory:L,memoryStats:_,mobileVitals:U,renderProfiles:C,reRenderSummary:W,resetRenderCounters:j,simulateComponentRender:q,events:E,setEvents:w,clearEvents:V,triggerGc:()=>{try{typeof globalThis.gc=="function"&&globalThis.gc()}catch{}const c=Number((4.5+Math.random()*3.5).toFixed(1)),s=Math.round(c*1024);I(i=>({...i,heapUsedMb:Math.max(18,Number((i.heapUsedMb-c).toFixed(1))),gcCount:i.gcCount+1,gcPauseMs:Number((1.2+Math.random()*.9).toFixed(1))})),(0,exports.logPerformanceEvent)({type:"memory",category:"memory",fps:60,durationMs:Number((1.6+Math.random()*.8).toFixed(1)),label:(0,i18n_1.t)("performance.gcCycleLabel"),detail:(0,i18n_1.t)("performance.gcCycleDetail",{amount:c}),source:"Hermes JavaScript VM Scavenger",breakdown:{jsTimeMs:1.8,uiTimeMs:.3},heapDeltaKb:-s,advice:(0,i18n_1.t)("performance.gcCycleAdvice"),severity:"optimal"})}}};exports.usePerformanceTracker=usePerformanceTracker;const globalPerformanceEvents=[...exports.INITIAL_EVENTS],performanceListeners=new Set;let maxPerformanceEventsLimit=100;const setMaxPerformanceEventsLimit=e=>{maxPerformanceEventsLimit=Math.max(10,e),globalPerformanceEvents.length>maxPerformanceEventsLimit&&(globalPerformanceEvents.length=maxPerformanceEventsLimit,performanceListeners.forEach(r=>{try{r([...globalPerformanceEvents])}catch{}}))};exports.setMaxPerformanceEventsLimit=setMaxPerformanceEventsLimit;const getMaxPerformanceEventsLimit=()=>maxPerformanceEventsLimit;exports.getMaxPerformanceEventsLimit=getMaxPerformanceEventsLimit;const prunePerformanceEvents=e=>{const r=e!==void 0?Math.max(0,e):Math.floor(globalPerformanceEvents.length/2),o=globalPerformanceEvents.length-r;return o>0&&(globalPerformanceEvents.length=r,performanceListeners.forEach(t=>{try{t([...globalPerformanceEvents])}catch{}})),Math.max(0,o)};exports.prunePerformanceEvents=prunePerformanceEvents;const 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 globalPerformanceEvents.unshift(r),globalPerformanceEvents.length>maxPerformanceEventsLimit&&(globalPerformanceEvents.length=maxPerformanceEventsLimit),performanceListeners.forEach(o=>{try{o([...globalPerformanceEvents])}catch{}}),r};exports.logPerformanceEvent=logPerformanceEvent;const clearPerformanceEvents=()=>{globalPerformanceEvents.length=0,performanceListeners.forEach(e=>{try{e([])}catch{}})};exports.clearPerformanceEvents=clearPerformanceEvents;const subscribePerformanceEvents=e=>(performanceListeners.add(e),e([...globalPerformanceEvents]),()=>{performanceListeners.delete(e)});exports.subscribePerformanceEvents=subscribePerformanceEvents;const getPerformanceEvents=()=>[...globalPerformanceEvents];exports.getPerformanceEvents=getPerformanceEvents;
|
|
@@ -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
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.PerformanceSubTab=exports.prunePerformanceEvents=exports.getMaxPerformanceEventsLimit=exports.setMaxPerformanceEventsLimit=exports.getPerformanceModuleEnabled=exports.setPerformanceModuleEnabled=exports.generateFixSnippet=exports.getInitialPerformanceEvents=exports.getInitialRenderProfiles=exports.getPerformanceEvents=exports.subscribePerformanceEvents=exports.clearPerformanceEvents=exports.logPerformanceEvent=exports.getRenderProfiles=exports.subscribeRenderProfiles=exports.registerComponentProfile=exports.getHermesMemoryStats=exports.measureAsync=exports.trackHeavyTask=exports.trackNavigationTransition=exports.trackComponentRender=exports.useNavigationProfiler=exports.useComponentProfiler=exports.usePerformanceTracker=void 0;var performanceTracker_1=require("./customHooks/performanceTracker");Object.defineProperty(exports,"usePerformanceTracker",{enumerable:!0,get:function(){return performanceTracker_1.usePerformanceTracker}}),Object.defineProperty(exports,"useComponentProfiler",{enumerable:!0,get:function(){return performanceTracker_1.useComponentProfiler}}),Object.defineProperty(exports,"useNavigationProfiler",{enumerable:!0,get:function(){return performanceTracker_1.useNavigationProfiler}}),Object.defineProperty(exports,"trackComponentRender",{enumerable:!0,get:function(){return performanceTracker_1.trackComponentRender}}),Object.defineProperty(exports,"trackNavigationTransition",{enumerable:!0,get:function(){return performanceTracker_1.trackNavigationTransition}}),Object.defineProperty(exports,"trackHeavyTask",{enumerable:!0,get:function(){return performanceTracker_1.trackHeavyTask}}),Object.defineProperty(exports,"measureAsync",{enumerable:!0,get:function(){return performanceTracker_1.measureAsync}}),Object.defineProperty(exports,"getHermesMemoryStats",{enumerable:!0,get:function(){return performanceTracker_1.getHermesMemoryStats}}),Object.defineProperty(exports,"registerComponentProfile",{enumerable:!0,get:function(){return performanceTracker_1.registerComponentProfile}}),Object.defineProperty(exports,"subscribeRenderProfiles",{enumerable:!0,get:function(){return performanceTracker_1.subscribeRenderProfiles}}),Object.defineProperty(exports,"getRenderProfiles",{enumerable:!0,get:function(){return performanceTracker_1.getRenderProfiles}}),Object.defineProperty(exports,"logPerformanceEvent",{enumerable:!0,get:function(){return performanceTracker_1.logPerformanceEvent}}),Object.defineProperty(exports,"clearPerformanceEvents",{enumerable:!0,get:function(){return performanceTracker_1.clearPerformanceEvents}}),Object.defineProperty(exports,"subscribePerformanceEvents",{enumerable:!0,get:function(){return performanceTracker_1.subscribePerformanceEvents}}),Object.defineProperty(exports,"getPerformanceEvents",{enumerable:!0,get:function(){return performanceTracker_1.getPerformanceEvents}}),Object.defineProperty(exports,"getInitialRenderProfiles",{enumerable:!0,get:function(){return performanceTracker_1.getInitialRenderProfiles}}),Object.defineProperty(exports,"getInitialPerformanceEvents",{enumerable:!0,get:function(){return performanceTracker_1.getInitialPerformanceEvents}}),Object.defineProperty(exports,"generateFixSnippet",{enumerable:!0,get:function(){return performanceTracker_1.generateFixSnippet}}),Object.defineProperty(exports,"setPerformanceModuleEnabled",{enumerable:!0,get:function(){return performanceTracker_1.setPerformanceModuleEnabled}}),Object.defineProperty(exports,"getPerformanceModuleEnabled",{enumerable:!0,get:function(){return performanceTracker_1.getPerformanceModuleEnabled}}),Object.defineProperty(exports,"setMaxPerformanceEventsLimit",{enumerable:!0,get:function(){return performanceTracker_1.setMaxPerformanceEventsLimit}}),Object.defineProperty(exports,"getMaxPerformanceEventsLimit",{enumerable:!0,get:function(){return performanceTracker_1.getMaxPerformanceEventsLimit}}),Object.defineProperty(exports,"prunePerformanceEvents",{enumerable:!0,get:function(){return performanceTracker_1.prunePerformanceEvents}});var types_1=require("./types");Object.defineProperty(exports,"PerformanceSubTab",{enumerable:!0,get:function(){return types_1.PerformanceSubTab}});
|
package/dist/esm/bundle.d.ts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { analyzeHostAppBundle, parseBundleSource, getInitialBundleAnalysis, getCachedBundleAnalysis, clearCachedBundleAnalysis, setBundleModuleEnabled, getBundleModuleEnabled, getHostScriptURL, trackRuntimeModuleExecution, trackRuntimeDefine, type HostBundleAnalysisResult, type HostBundleFileItem, type HostBundlePackageItem, type HostBinaryComponentItem, type FileTypeCategory, } from './customHooks/bundleAnalyzer';
|
|
2
|
-
export { BundleSubTab, } from './types';
|
package/dist/esm/bundle.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{analyzeHostAppBundle,parseBundleSource,getInitialBundleAnalysis,getCachedBundleAnalysis,clearCachedBundleAnalysis,setBundleModuleEnabled,getBundleModuleEnabled,getHostScriptURL,trackRuntimeModuleExecution,trackRuntimeDefine}from"./customHooks/bundleAnalyzer";export{BundleSubTab}from"./types";
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import"react";import E,{Circle as B,Path as C,G,Defs as M,LinearGradient as L,RadialGradient as O,Stop as F,Rect as _,Line as W}from"react-native-svg";export const BrandSquareIcon=({size:g=56})=><E width={g}height={g}viewBox="0 0 256 256"fill="none">
|
|
2
|
-
<M>
|
|
3
|
-
|
|
4
|
-
<L id="bs_tile"x1="0"y1="0"x2="256"y2="256"gradientUnits="userSpaceOnUse">
|
|
5
|
-
<F offset="0%"stopColor="#1E1B4B"/>
|
|
6
|
-
<F offset="50%"stopColor="#18182F"/>
|
|
7
|
-
<F offset="100%"stopColor="#0B0F19"/>
|
|
8
|
-
</L>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
<L id="bs_border"x1="0"y1="0"x2="256"y2="256"gradientUnits="userSpaceOnUse">
|
|
12
|
-
<F offset="0%"stopColor="#818CF8"stopOpacity={.9}/>
|
|
13
|
-
<F offset="45%"stopColor="#C084FC"stopOpacity={.8}/>
|
|
14
|
-
<F offset="80%"stopColor="#F472B6"stopOpacity={.85}/>
|
|
15
|
-
<F offset="100%"stopColor="#38BDF8"stopOpacity={.9}/>
|
|
16
|
-
</L>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<O id="bs_top_glow"cx="50%"cy="15%"r="65%">
|
|
20
|
-
<F offset="0%"stopColor="#818CF8"stopOpacity={.35}/>
|
|
21
|
-
<F offset="60%"stopColor="#A855F7"stopOpacity={.12}/>
|
|
22
|
-
<F offset="100%"stopColor="#1E1B4B"stopOpacity={0}/>
|
|
23
|
-
</O>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<L id="bs_body"x1="64"y1="40"x2="192"y2="220"gradientUnits="userSpaceOnUse">
|
|
27
|
-
<F offset="0%"stopColor="#3730A3"/>
|
|
28
|
-
<F offset="50%"stopColor="#2E1065"/>
|
|
29
|
-
<F offset="100%"stopColor="#17123A"/>
|
|
30
|
-
</L>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<L id="bs_beam"x1="40"y1="40"x2="220"y2="220"gradientUnits="userSpaceOnUse">
|
|
34
|
-
<F offset="0%"stopColor="#67E8F9"/>
|
|
35
|
-
<F offset="35%"stopColor="#818CF8"/>
|
|
36
|
-
<F offset="70%"stopColor="#C084FC"/>
|
|
37
|
-
<F offset="100%"stopColor="#F472B6"/>
|
|
38
|
-
</L>
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
<O id="bs_iris"cx="38%"cy="36%"r="65%">
|
|
42
|
-
<F offset="0%"stopColor="#FEF08A"/>
|
|
43
|
-
<F offset="40%"stopColor="#FBBF24"/>
|
|
44
|
-
<F offset="80%"stopColor="#F59E0B"/>
|
|
45
|
-
<F offset="100%"stopColor="#D97706"/>
|
|
46
|
-
</O>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<L id="bs_beak"x1="124"y1="120"x2="132"y2="136"gradientUnits="userSpaceOnUse">
|
|
50
|
-
<F offset="0%"stopColor="#FDE047"/>
|
|
51
|
-
<F offset="100%"stopColor="#EA580C"/>
|
|
52
|
-
</L>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<O id="bs_lens"cx="40%"cy="35%"r="65%">
|
|
56
|
-
<F offset="0%"stopColor="#A5F3FC"stopOpacity={.4}/>
|
|
57
|
-
<F offset="50%"stopColor="#38BDF8"stopOpacity={.18}/>
|
|
58
|
-
<F offset="100%"stopColor="#0284C7"stopOpacity={.05}/>
|
|
59
|
-
</O>
|
|
60
|
-
</M>
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
<_ x="2"y="2"width="252"height="252"rx="58"fill="url(#bs_tile)"/>
|
|
64
|
-
<_ x="2"y="2"width="252"height="252"rx="58"fill="url(#bs_top_glow)"/>
|
|
65
|
-
<_ x="2"y="2"width="252"height="252"rx="58"fill="none"stroke="url(#bs_border)"strokeWidth="3.5"/>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
<C d="M62 120 C42 152 46 194 76 210 C68 178 66 146 80 120 Z"fill="#1E1B4B"stroke="url(#bs_beam)"strokeWidth="3"strokeOpacity={.75}/>
|
|
69
|
-
<C d="M194 120 C214 152 210 194 180 210 C188 178 190 146 176 120 Z"fill="#1E1B4B"stroke="url(#bs_beam)"strokeWidth="3"strokeOpacity={.75}/>
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
<C d="M58 146 C54 98 68 64 88 52 L98 34 L118 56 Q128 50 138 56 L158 34 L168 52 C188 64 202 98 198 146 C202 180 186 208 152 216 C140 220 116 220 104 216 C70 208 54 180 58 146 Z"fill="url(#bs_body)"stroke="url(#bs_beam)"strokeWidth="4.5"strokeLinejoin="round"/>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<C d="M98 42 L112 56 L102 57 Z"fill="#67E8F9"opacity={.6}/>
|
|
76
|
-
<C d="M158 42 L144 56 L154 57 Z"fill="#F472B6"opacity={.6}/>
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<_ x="98"y="162"width="60"height="38"rx="10"fill="#050811"stroke="url(#bs_beam)"strokeWidth="2.5"/>
|
|
80
|
-
<G strokeWidth="3"strokeLinecap="round"strokeLinejoin="round"fill="none">
|
|
81
|
-
<C d="M116 174 L108 181 L116 188"stroke="#38BDF8"/>
|
|
82
|
-
<C d="M140 174 L148 181 L140 188"stroke="#38BDF8"/>
|
|
83
|
-
<C d="M131 171 L125 191"stroke="#F43F5E"/>
|
|
84
|
-
</G>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<C d="M128 88 C152 64 192 72 192 104 C192 132 162 152 128 152 C94 152 64 132 64 104 C64 72 104 64 128 88 Z"fill="#1E1B4B"stroke="url(#bs_beam)"strokeWidth="2.8"/>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
<B cx="156"cy="106"r="19"fill="url(#bs_iris)"stroke="#0F172A"strokeWidth="2.5"/>
|
|
91
|
-
<B cx="156"cy="106"r="9.5"fill="#0B0F19"/>
|
|
92
|
-
<B cx="159.5"cy="102.5"r="3.5"fill="#FFFFFF"/>
|
|
93
|
-
<B cx="153"cy="109.5"r="1.8"fill="#FFFFFF"opacity={.85}/>
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<B cx="94"cy="104"r="30"fill="url(#bs_lens)"stroke="url(#bs_beam)"strokeWidth="6"/>
|
|
98
|
-
<W x1="72"y1="126"x2="48"y2="152"stroke="#0B0F19"strokeWidth="13"strokeLinecap="round"/>
|
|
99
|
-
<W x1="72"y1="126"x2="48"y2="152"stroke="url(#bs_beam)"strokeWidth="8"strokeLinecap="round"/>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
<B cx="94"cy="104"r="21"fill="url(#bs_iris)"stroke="#0F172A"strokeWidth="2.5"/>
|
|
103
|
-
<B cx="94"cy="104"r="10.5"fill="#0B0F19"/>
|
|
104
|
-
<B cx="98"cy="100"r="4"fill="#FFFFFF"/>
|
|
105
|
-
<B cx="90.5"cy="107.5"r="2"fill="#FFFFFF"opacity={.85}/>
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
<C d="M74 94 A26 26 0 0 1 106 78"stroke="#FFFFFF"strokeWidth="3"strokeLinecap="round"opacity={.65}fill="none"/>
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
<C d="M123 120 Q128 118 133 120 Q131.5 133 128 137 Q124.5 133 123 120 Z"fill="url(#bs_beak)"stroke="#78350F"strokeWidth="1"/>
|
|
112
|
-
</E>;export default BrandSquareIcon;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
export type BundleSubTab = 'overview' | 'production' | 'files' | 'packages' | 'media' | 'optimizer';
|
|
3
|
-
export type FileTypeCategory = 'image' | 'typescript' | 'javascript' | 'font' | 'json';
|
|
4
|
-
export interface BundleFileItem {
|
|
5
|
-
id: string;
|
|
6
|
-
name: string;
|
|
7
|
-
path: string;
|
|
8
|
-
ext: string;
|
|
9
|
-
category: FileTypeCategory;
|
|
10
|
-
sizeKb: number;
|
|
11
|
-
meta: string;
|
|
12
|
-
color: string;
|
|
13
|
-
status?: 'optimal' | 'warning' | 'info';
|
|
14
|
-
advice?: string;
|
|
15
|
-
previewUri?: string;
|
|
16
|
-
isConsumed?: boolean;
|
|
17
|
-
}
|
|
18
|
-
export interface BundlePackageItem {
|
|
19
|
-
id: string;
|
|
20
|
-
name: string;
|
|
21
|
-
version: string;
|
|
22
|
-
sizeKb: number;
|
|
23
|
-
percentage: number;
|
|
24
|
-
type: 'direct' | 'peer' | 'transitive';
|
|
25
|
-
category: 'core' | 'navigation' | 'network' | 'ui' | 'utils';
|
|
26
|
-
color: string;
|
|
27
|
-
description: string;
|
|
28
|
-
logoUri?: string;
|
|
29
|
-
latestVersion?: string;
|
|
30
|
-
isDeprecated?: boolean;
|
|
31
|
-
deprecationReason?: string;
|
|
32
|
-
lastActive?: string;
|
|
33
|
-
npmUrl?: string;
|
|
34
|
-
}
|
|
35
|
-
export type BundleIconType = 'source' | 'deps' | 'media' | 'overhead' | 'image' | 'typescript' | 'javascript' | 'font' | 'json' | 'folder' | 'ban' | 'bolt';
|
|
36
|
-
export interface TreeNode {
|
|
37
|
-
id: string;
|
|
38
|
-
name: string;
|
|
39
|
-
fullPath: string;
|
|
40
|
-
isFolder: boolean;
|
|
41
|
-
fileItem?: BundleFileItem;
|
|
42
|
-
sizeKb: number;
|
|
43
|
-
fileCount: number;
|
|
44
|
-
children: TreeNode[];
|
|
45
|
-
}
|
|
46
|
-
export declare const downloadBundleFile: (file: BundleFileItem, scriptURL?: string) => Promise<void>;
|
|
47
|
-
declare const BundleTab: React.MemoExoticComponent<() => React.JSX.Element>;
|
|
48
|
-
export default BundleTab;
|