react-native-inapp-inspector 2.5.10 → 2.5.12

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 (134) hide show
  1. package/README.ar.md +0 -8
  2. package/README.de.md +0 -8
  3. package/README.es.md +0 -8
  4. package/README.fr.md +0 -8
  5. package/README.hi.md +0 -8
  6. package/README.ja.md +0 -8
  7. package/README.ko.md +0 -8
  8. package/README.md +54 -26
  9. package/README.pt-BR.md +0 -8
  10. package/README.ru.md +0 -8
  11. package/README.zh-CN.md +0 -8
  12. package/dist/commonjs/components/ConsoleLogCard.js +32 -26
  13. package/dist/commonjs/components/ErrorBoundary.js +1 -1
  14. package/dist/commonjs/components/Inspector/ConsoleTab.js +19 -14
  15. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +4 -4
  16. package/dist/commonjs/components/Inspector/InspectorHeader.js +73 -65
  17. package/dist/commonjs/components/Inspector/MainScreen.js +9 -6
  18. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +187 -90
  19. package/dist/commonjs/components/Inspector/NetworkDetail.js +11 -8
  20. package/dist/commonjs/components/Inspector/NetworkTab.js +33 -31
  21. package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +2 -0
  22. package/dist/commonjs/components/Inspector/PerformanceTab.js +652 -0
  23. package/dist/commonjs/components/Inspector/SettingsPanel.js +346 -245
  24. package/dist/commonjs/components/Inspector/TabBar.js +17 -16
  25. package/dist/commonjs/components/LogCard.js +11 -8
  26. package/dist/commonjs/components/ModuleErrorBoundary.js +1 -1
  27. package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
  28. package/dist/commonjs/components/NetworkIcons.js +51 -6
  29. package/dist/commonjs/constants/index.d.ts +1 -0
  30. package/dist/commonjs/constants/index.js +1 -1
  31. package/dist/commonjs/constants/version.d.ts +1 -1
  32. package/dist/commonjs/constants/version.js +1 -1
  33. package/dist/commonjs/customHooks/crashHandler.d.ts +9 -1
  34. package/dist/commonjs/customHooks/crashHandler.js +4 -4
  35. package/dist/commonjs/helpers/index.d.ts +3 -0
  36. package/dist/commonjs/helpers/index.js +8 -6
  37. package/dist/commonjs/helpers/performanceSampler.d.ts +88 -0
  38. package/dist/commonjs/helpers/performanceSampler.js +1 -0
  39. package/dist/commonjs/helpers/remoteConfig.d.ts +6 -0
  40. package/dist/commonjs/helpers/remoteConfig.js +1 -1
  41. package/dist/commonjs/helpers/telemetry.js +1 -1
  42. package/dist/commonjs/i18n/locales/ar.json +1 -1
  43. package/dist/commonjs/i18n/locales/bn.json +1 -1
  44. package/dist/commonjs/i18n/locales/de.json +1 -1
  45. package/dist/commonjs/i18n/locales/en.json +1 -1
  46. package/dist/commonjs/i18n/locales/es.json +1 -1
  47. package/dist/commonjs/i18n/locales/fr.json +1 -1
  48. package/dist/commonjs/i18n/locales/gu.json +1 -1
  49. package/dist/commonjs/i18n/locales/hi.json +1 -1
  50. package/dist/commonjs/i18n/locales/id.json +1 -1
  51. package/dist/commonjs/i18n/locales/it.json +1 -1
  52. package/dist/commonjs/i18n/locales/ja.json +1 -1
  53. package/dist/commonjs/i18n/locales/kn.json +1 -1
  54. package/dist/commonjs/i18n/locales/ko.json +1 -1
  55. package/dist/commonjs/i18n/locales/ml.json +1 -1
  56. package/dist/commonjs/i18n/locales/mr.json +1 -1
  57. package/dist/commonjs/i18n/locales/nl.json +1 -1
  58. package/dist/commonjs/i18n/locales/pa.json +1 -1
  59. package/dist/commonjs/i18n/locales/pl.json +1 -1
  60. package/dist/commonjs/i18n/locales/pt.json +1 -1
  61. package/dist/commonjs/i18n/locales/ru.json +1 -1
  62. package/dist/commonjs/i18n/locales/ta.json +1 -1
  63. package/dist/commonjs/i18n/locales/te.json +1 -1
  64. package/dist/commonjs/i18n/locales/tr.json +1 -1
  65. package/dist/commonjs/i18n/locales/vi.json +1 -1
  66. package/dist/commonjs/i18n/locales/zh.json +1 -1
  67. package/dist/commonjs/index.d.ts +4 -2
  68. package/dist/commonjs/index.js +3 -3
  69. package/dist/commonjs/styles/index.js +1 -1
  70. package/dist/commonjs/types/enums.d.ts +1 -0
  71. package/dist/commonjs/types/enums.js +1 -1
  72. package/dist/commonjs/types/interfaces.d.ts +28 -0
  73. package/dist/esm/components/ConsoleLogCard.js +67 -61
  74. package/dist/esm/components/ErrorBoundary.js +10 -10
  75. package/dist/esm/components/Inspector/ConsoleTab.js +33 -28
  76. package/dist/esm/components/Inspector/FloatingCaptureWidget.js +22 -22
  77. package/dist/esm/components/Inspector/InspectorHeader.js +194 -186
  78. package/dist/esm/components/Inspector/MainScreen.js +61 -58
  79. package/dist/esm/components/Inspector/MediaGalleryTab.js +254 -157
  80. package/dist/esm/components/Inspector/NetworkDetail.js +62 -59
  81. package/dist/esm/components/Inspector/NetworkTab.js +39 -37
  82. package/dist/esm/components/Inspector/PerformanceTab.d.ts +2 -0
  83. package/dist/esm/components/Inspector/PerformanceTab.js +652 -0
  84. package/dist/esm/components/Inspector/SettingsPanel.js +407 -306
  85. package/dist/esm/components/Inspector/TabBar.js +4 -3
  86. package/dist/esm/components/LogCard.js +37 -34
  87. package/dist/esm/components/ModuleErrorBoundary.js +1 -1
  88. package/dist/esm/components/NetworkIcons.d.ts +9 -0
  89. package/dist/esm/components/NetworkIcons.js +48 -3
  90. package/dist/esm/constants/index.d.ts +1 -0
  91. package/dist/esm/constants/index.js +1 -1
  92. package/dist/esm/constants/version.d.ts +1 -1
  93. package/dist/esm/constants/version.js +1 -1
  94. package/dist/esm/customHooks/crashHandler.d.ts +9 -1
  95. package/dist/esm/customHooks/crashHandler.js +6 -6
  96. package/dist/esm/helpers/index.d.ts +3 -0
  97. package/dist/esm/helpers/index.js +8 -6
  98. package/dist/esm/helpers/performanceSampler.d.ts +88 -0
  99. package/dist/esm/helpers/performanceSampler.js +1 -0
  100. package/dist/esm/helpers/remoteConfig.d.ts +6 -0
  101. package/dist/esm/helpers/remoteConfig.js +1 -1
  102. package/dist/esm/helpers/telemetry.js +1 -1
  103. package/dist/esm/i18n/locales/ar.json +1 -1
  104. package/dist/esm/i18n/locales/bn.json +1 -1
  105. package/dist/esm/i18n/locales/de.json +1 -1
  106. package/dist/esm/i18n/locales/en.json +1 -1
  107. package/dist/esm/i18n/locales/es.json +1 -1
  108. package/dist/esm/i18n/locales/fr.json +1 -1
  109. package/dist/esm/i18n/locales/gu.json +1 -1
  110. package/dist/esm/i18n/locales/hi.json +1 -1
  111. package/dist/esm/i18n/locales/id.json +1 -1
  112. package/dist/esm/i18n/locales/it.json +1 -1
  113. package/dist/esm/i18n/locales/ja.json +1 -1
  114. package/dist/esm/i18n/locales/kn.json +1 -1
  115. package/dist/esm/i18n/locales/ko.json +1 -1
  116. package/dist/esm/i18n/locales/ml.json +1 -1
  117. package/dist/esm/i18n/locales/mr.json +1 -1
  118. package/dist/esm/i18n/locales/nl.json +1 -1
  119. package/dist/esm/i18n/locales/pa.json +1 -1
  120. package/dist/esm/i18n/locales/pl.json +1 -1
  121. package/dist/esm/i18n/locales/pt.json +1 -1
  122. package/dist/esm/i18n/locales/ru.json +1 -1
  123. package/dist/esm/i18n/locales/ta.json +1 -1
  124. package/dist/esm/i18n/locales/te.json +1 -1
  125. package/dist/esm/i18n/locales/tr.json +1 -1
  126. package/dist/esm/i18n/locales/vi.json +1 -1
  127. package/dist/esm/i18n/locales/zh.json +1 -1
  128. package/dist/esm/index.d.ts +4 -2
  129. package/dist/esm/index.js +8 -8
  130. package/dist/esm/styles/index.js +1 -1
  131. package/dist/esm/types/enums.d.ts +1 -0
  132. package/dist/esm/types/enums.js +1 -1
  133. package/dist/esm/types/interfaces.d.ts +28 -0
  134. package/package.json +24 -1
@@ -1,8 +1,10 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(e,t,o,r){r===void 0&&(r=o);var n=Object.getOwnPropertyDescriptor(t,o);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(e,r,n)}):(function(e,t,o,r){r===void 0&&(r=o),e[r]=t[o]})),__exportStar=this&&this.__exportStar||function(e,t){for(var o in e)o!=="default"&&!Object.prototype.hasOwnProperty.call(t,o)&&__createBinding(t,e,o)},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getRuntimeDiagnostics=exports.getCategoryColors=exports.registerGAPlugin=exports.getEventCategory=exports.getEventColor=exports.ANALYTICS_EVENT_PALETTE=exports.openInVSCode=exports.getCleanCallerDisplay=exports.parseStackLine=exports.getJsonPreviewText=exports.getJsonContent=exports.formatGap=exports.formatTime=exports.formatTimeShort=exports.handleOpenExternalLink=exports.getAppVersionAndBuild=exports.getAppName=exports.getBundleIdentifier=exports.formatDateTimeToAnalytics=exports.isAllValuesEmpty=exports.getLocalizedFilePathWithSlash=exports.getLocalizedFilePath=exports.formatDisplayUrl=exports.getDiff=exports.flattenObject=exports.getLogPageName=exports.getNavigationInfo=exports.escapeRegex=exports.deduplicateLogs=exports.getFetchCommand=exports.getCurlCommand=exports.getBaseUrl=exports.getPath=exports.copyImageOrMediaToClipboard=exports.copyToClipboard=exports.formatByteSize=exports.formatBytes=exports.getSize=exports.getDurationColor=exports.getStatusColor=exports.formatTimestamp=exports.formatDateTime=exports.getDomainColor=exports.isLocalDebugEnvironment=void 0;const react_native_1=require("react-native"),clipboard_1=__importDefault(require("@react-native-clipboard/clipboard")),toast_1=require("./toast"),NativeInspector_1=require("../native/NativeInspector"),AppColors_1=require("../styles/AppColors"),constants_1=require("../constants");__exportStar(require("./searchQueryParser"),exports),__exportStar(require("./memoryManager"),exports),__exportStar(require("./toast"),exports);const isLocalDebugEnvironment=()=>{const e=typeof __DEV__<"u"&&!!__DEV__,t=react_native_1.NativeModules.SourceCode?.scriptURL||"",o=t.startsWith("http://")||t.startsWith("https://")||t.includes(":8081")||t.includes(":8082");return e||o};exports.isLocalDebugEnvironment=isLocalDebugEnvironment;const getDomainColor=e=>{if(!e)return constants_1.DOMAIN_COLORS[0];let t=0;for(let o=0;o<e.length;o++)t=e.charCodeAt(o)+((t<<5)-t);return constants_1.DOMAIN_COLORS[Math.abs(t)%constants_1.DOMAIN_COLORS.length]};exports.getDomainColor=getDomainColor;const formatDateTime=e=>{const t=new Date(e),o=(d,c=2)=>String(d).padStart(c,"0"),r=o(t.getDate()),n=o(t.getMonth()+1),i=t.getFullYear(),s=o(t.getHours()),a=o(t.getMinutes()),l=o(t.getSeconds());return`${r}/${n}/${i} ${s}:${a}:${l}`};exports.formatDateTime=formatDateTime;const formatTimestamp=e=>{try{const t=new Date(e),o=t.getHours().toString().padStart(2,"0"),r=t.getMinutes().toString().padStart(2,"0"),n=t.getSeconds().toString().padStart(2,"0"),i=t.getMilliseconds().toString().padStart(3,"0");return`${o}:${r}:${n}.${i}`}catch{return"\u2014"}};exports.formatTimestamp=formatTimestamp;const getStatusColor=e=>!e||e===0||e>=500?AppColors_1.AppColors.errorColor:e>=400?AppColors_1.AppColors.darkOrange:e>=300?AppColors_1.AppColors.warningIconGold:AppColors_1.AppColors.greenColor;exports.getStatusColor=getStatusColor;const getDurationColor=e=>e==null?AppColors_1.AppColors.grayTextWeak:e<constants_1.DURATION_FAST_MS?AppColors_1.AppColors.greenColor:e<constants_1.DURATION_SLOW_MS?AppColors_1.AppColors.lightOrange:AppColors_1.AppColors.errorColor;exports.getDurationColor=getDurationColor;const getSize=e=>{try{const t=JSON.stringify(e)?.length??0;return t<1024?`${t} B`:`${(t/1024).toFixed(1)} KB`}catch{return"\u2014"}};exports.getSize=getSize;const formatBytes=e=>{if(e===0||!e||isNaN(e))return"0 B";const t=1024,o=["B","KB","MB","GB"],r=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,r)).toFixed(1))} ${o[r]||"B"}`};exports.formatBytes=formatBytes;const formatByteSize=e=>!e||e<=0?"0 B":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`;exports.formatByteSize=formatByteSize;const copyToClipboard=(e,t)=>{const o=typeof e=="function"?e():e;let r="";if(typeof o=="string")r=o;else try{r=JSON.stringify(o,null,2)}catch{r=String(o)}try{typeof clipboard_1.default?.setString=="function"?clipboard_1.default.setString(r):typeof clipboard_1.default?.default?.setString=="function"&&clipboard_1.default.default.setString(r)}catch(n){__DEV__&&console.warn("[NetworkInspector] Clipboard.setString failed:",n)}try{(0,toast_1.showToast)(t?`${t} copied to clipboard`:"Copied to clipboard")}catch{}try{react_native_1.Platform.OS==="android"&&react_native_1.ToastAndroid?.show&&react_native_1.ToastAndroid.show(t?`${t} copied to clipboard`:"Copied to clipboard",react_native_1.ToastAndroid.SHORT)}catch{}};exports.copyToClipboard=copyToClipboard;const copyImageOrMediaToClipboard=async(e,t="Image")=>{if(!e)return;let o=!1;try{o=await(0,NativeInspector_1.copyMediaToClipboard)(e)}catch{o=!1}if(!o){(0,exports.copyToClipboard)(e,t);return}try{(0,toast_1.showToast)(`${t} copied to clipboard`)}catch{}try{react_native_1.Platform.OS==="android"&&react_native_1.ToastAndroid?.show&&react_native_1.ToastAndroid.show(`${t} copied to clipboard`,react_native_1.ToastAndroid.SHORT)}catch{}};exports.copyImageOrMediaToClipboard=copyImageOrMediaToClipboard;const getPath=e=>{try{const t=new URL(e);return t.pathname+(t.search?t.search:"")}catch{return e.replace(/^https?:\/\/[^/?#]+/,"")||"/"}};exports.getPath=getPath;const getBaseUrl=e=>{try{const t=new URL(e);return`${t.protocol}//${t.host}`}catch{const t=e.match(/^(https?:\/\/[^/]+)/);return t?t[1]:""}};exports.getBaseUrl=getBaseUrl;const getCurlCommand=e=>{let t=`curl -X ${e.method} "${e.url}"`;if(e.requestHeaders&&Object.entries(e.requestHeaders).forEach(([o,r])=>{t+=` \\
2
- -H "${o}: ${r}"`}),e.request&&e.method!=="GET"){const o=typeof e.request=="string"?e.request:JSON.stringify(e.request);t+=` \\
3
- -d '${o.replace(/'/g,"'\\''")}'`}return t};exports.getCurlCommand=getCurlCommand;const getFetchCommand=e=>{const t={method:e.method};return e.requestHeaders&&Object.keys(e.requestHeaders).length>0&&(t.headers=e.requestHeaders),e.request&&e.method!=="GET"&&(t.body=JSON.stringify(e.request)),`fetch("${e.url}", ${JSON.stringify(t,null,2)})`};exports.getFetchCommand=getFetchCommand;const deduplicateLogs=e=>{const t=new Map;return e.forEach(o=>{if(!t.has(o.id))t.set(o.id,o);else{const r=t.get(o.id);(r.status==null&&o.status!=null||(o.startTime??0)>=(r.startTime??0))&&t.set(o.id,o)}}),Array.from(t.values()).sort((o,r)=>r.id-o.id)};exports.deduplicateLogs=deduplicateLogs;const escapeRegex=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");exports.escapeRegex=escapeRegex;const getNavigationInfo=(e,t=[])=>{if(!e)return{path:t.length>0?t.join(" \u2794 "):"",params:null};if(e.name&&!e.routes)return{path:t.length>0?[...t,e.name].join(" \u2794 "):e.name,params:e.params||null};if(!e.routes||!Array.isArray(e.routes)||e.routes.length===0)return{path:t.length>0?t.join(" \u2794 "):"",params:null};const o=typeof e.index=="number"&&e.index>=0&&e.index<e.routes.length?e.index:0,r=e.routes[o];if(!r)return{path:t.length>0?t.join(" \u2794 "):"",params:null};const n=r.name?[...t,r.name]:t;return r?.state?(0,exports.getNavigationInfo)(r.state,n):{path:n.length>0?n.join(" \u2794 "):r.name||"",params:r.params||null}};exports.getNavigationInfo=getNavigationInfo;const getLogPageName=(e,t)=>{const o=t||e?.routeInfo;if(o&&o.path&&o.path!=="Navigators"){const r=o.path.split(" \u2794 ").map(n=>n.trim()).filter(Boolean);return r.length>0?r[r.length-1]:o.path}if(e.caller&&e.caller!=="Unknown")try{const r=e.caller.match(/([^/\\]+)\.(tsx|jsx|ts|js)/i);if(r&&r[1]){const n=r[1];if(!["networklogger","fetch","axios","apiclient","request","http","index","nativeinspector","inappinspector","bundleanalyzer"].includes(n.toLowerCase()))return n}}catch{}if(e.url)try{const n=e.url.split("?")[0].split("#")[0].replace(/^https?:\/\//i,""),i=n.indexOf("/");if(i!==-1){const a=n.substring(i+1).split("/").filter(Boolean),l=["api","v1","v2","v3","v4","rest","graphql","json","data","service","app"],d=a.filter(c=>!l.includes(c.toLowerCase()));if(d.length>0){const c=d[0];return c.charAt(0).toUpperCase()+c.slice(1)}}const s=n.split("/")[0];if(s)return s}catch{}return"General"};exports.getLogPageName=getLogPageName;const flattenObject=(e,t="")=>{let o={};return typeof e=="object"&&e!==null?Array.isArray(e)?e.forEach((r,n)=>{Object.assign(o,(0,exports.flattenObject)(r,t?`${t}[${n}]`:`[${n}]`))}):Object.keys(e).forEach(r=>{Object.assign(o,(0,exports.flattenObject)(e[r],t?`${t}.${r}`:r))}):o[t||"root"]=e,o};exports.flattenObject=flattenObject;const getDiff=(e,t)=>{const o=(0,exports.flattenObject)(e),r=(0,exports.flattenObject)(t),n=[];return new Set([...Object.keys(o),...Object.keys(r)]).forEach(s=>{s in o?s in r?o[s]!==r[s]&&n.push({type:"changed",path:s,oldVal:o[s],newVal:r[s]}):n.push({type:"removed",path:s,oldVal:o[s]}):n.push({type:"added",path:s,newVal:r[s]})}),n.sort((s,a)=>s.path.localeCompare(a.path))};exports.getDiff=getDiff;const formatDisplayUrl=e=>e?e.startsWith("http://")||e.startsWith("https://")?e:`https://${e}`:"";exports.formatDisplayUrl=formatDisplayUrl;const getLocalizedFilePath=(e,t,o)=>e.replace("country-language",`${t?.toLowerCase()}-${o?.toLowerCase()}`);exports.getLocalizedFilePath=getLocalizedFilePath;const getLocalizedFilePathWithSlash=(e,t,o)=>e.replace("country/language",`${t?.toLowerCase()}/${o?.toLowerCase()}`);exports.getLocalizedFilePathWithSlash=getLocalizedFilePathWithSlash;const isAllValuesEmpty=e=>!e||typeof e!="object"?!0:Object.values(e).every(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0);exports.isAllValuesEmpty=isAllValuesEmpty;const formatDateTimeToAnalytics=e=>new Date(e)?.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"});exports.formatDateTimeToAnalytics=formatDateTimeToAnalytics;const getBundleIdentifier=()=>{const e=react_native_1.NativeModules.RNDeviceInfo;if(e&&typeof e.bundleId=="string")return e.bundleId;if(e&&typeof e.getBundleId=="function")try{const n=e.getBundleId();if(typeof n=="string")return n}catch{}const t=react_native_1.NativeModules.ExponentConstants;if(t&&t.manifest){const n=t.manifest;if(n.ios&&n.ios.bundleIdentifier)return n.ios.bundleIdentifier;if(n.android&&n.android.package)return n.android.package}const o=react_native_1.NativeModules.ExpoApplication;if(o&&typeof o.applicationId=="string")return o.applicationId;const r=react_native_1.NativeModules.SourceCode;if(r&&typeof r.scriptURL=="string"){const n=r.scriptURL;if(n.includes("assets/"))try{const i=n.match(/assets\/([^/?#]+)/);if(i&&i[1])return i[1]}catch{}}return"org.reactjs.native.example"};exports.getBundleIdentifier=getBundleIdentifier;const getAppName=()=>{const e=react_native_1.NativeModules.PlatformConstants;e&&e.interfaceIdiom;const t=react_native_1.NativeModules.RNDeviceInfo;if(t&&typeof t.appName=="string")return t.appName;const o=react_native_1.NativeModules.NetworkInspectorModule;if(o&&typeof o.appName=="string"&&o.appName.length>0&&o.appName!=="App")return o.appName;const r=react_native_1.NativeModules.ExpoApplication;if(r&&typeof r.applicationName=="string")return r.applicationName;const n=react_native_1.NativeModules.ExponentConstants;if(n&&n.manifest){const a=n.manifest;if(a.name)return a.name}const i=react_native_1.NativeModules.AppInfo;if(i&&typeof i.appName=="string")return i.appName;const s=(0,exports.getBundleIdentifier)();if(s&&s!=="org.reactjs.native.example"){const a=s.split("."),l=a[a.length-1];return l?l.charAt(0).toUpperCase()+l.slice(1):"App"}return"App"};exports.getAppName=getAppName;const getAppVersionAndBuild=()=>{let e="",t="";const o=react_native_1.NativeModules.NetworkInspectorModule;if(o&&(typeof o.appVersion=="string"&&o.appVersion.length>0&&(e=o.appVersion),typeof o.appBuild=="string"&&o.appBuild.length>0&&(t=o.appBuild)),!e||!t){const r=react_native_1.NativeModules.ExpoApplication;r&&(!e&&typeof r.nativeAppVersion=="string"&&(e=r.nativeAppVersion),!t&&typeof r.nativeBuildVersion=="string"&&(t=r.nativeBuildVersion))}if(!e||!t){const r=react_native_1.NativeModules.ExponentConstants;if(r){const n=r.manifest||r.expoConfig;n&&(!e&&n.version&&(e=String(n.version)),t||(n.ios?.buildNumber?t=String(n.ios.buildNumber):n.android?.versionCode&&(t=String(n.android.versionCode))))}}if(!e||!t){const r=react_native_1.NativeModules.RNDeviceInfo;if(r){if(!e){if(typeof r.appVersion=="string")e=r.appVersion;else if(typeof r.getVersion=="function")try{e=r.getVersion()}catch{}}if(!t){if(typeof r.buildNumber=="string")t=r.buildNumber;else if(typeof r.getBuildNumber=="function")try{t=r.getBuildNumber()}catch{}}}}if(!e||!t){const r=react_native_1.NativeModules.AppInfo;r&&(!e&&typeof r.versionName=="string"&&(e=r.versionName),!t&&typeof r.versionCode=="string"&&(t=r.versionCode))}if(!e){const r=react_native_1.Platform.constants||react_native_1.NativeModules.PlatformConstants;r&&r.Version&&typeof r.Version=="string"&&r.Version.includes(".")&&(e=r.Version)}return e||(e="1.0"),t||(t="1"),{version:e,build:t,formatted:`${e} (${t})`}};exports.getAppVersionAndBuild=getAppVersionAndBuild;const handleOpenExternalLink=e=>{if(!e)return;const t=(0,exports.formatDisplayUrl)(e);react_native_1.Alert.alert("Open Link",`Do you want to open this link in your web browser?
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(e,t,r,o){o===void 0&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}):(function(e,t,r,o){o===void 0&&(o=r),e[o]=t[r]})),__exportStar=this&&this.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&__createBinding(t,e,r)},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.isUrlHidden=exports.getRuntimeDiagnostics=exports.getCategoryColors=exports.registerGAPlugin=exports.getEventCategory=exports.getEventColor=exports.ANALYTICS_EVENT_PALETTE=exports.openInVSCode=exports.getCleanCallerDisplay=exports.parseStackLine=exports.getJsonPreviewText=exports.getJsonContent=exports.formatGap=exports.formatTime=exports.formatTimeShort=exports.handleOpenExternalLink=exports.getAppVersionAndBuild=exports.getAppName=exports.getBundleIdentifier=exports.formatDateTimeToAnalytics=exports.isAllValuesEmpty=exports.getLocalizedFilePathWithSlash=exports.getLocalizedFilePath=exports.formatDisplayUrl=exports.getDiff=exports.flattenObject=exports.getLogPageName=exports.getNavigationInfo=exports.escapeRegex=exports.deduplicateLogs=exports.openWithPostman=exports.getPostmanRequestJson=exports.getFetchCommand=exports.getCurlCommand=exports.getBaseUrl=exports.getPath=exports.copyImageOrMediaToClipboard=exports.copyToClipboard=exports.formatByteSize=exports.formatBytes=exports.getSize=exports.getDurationColor=exports.getStatusColor=exports.formatTimestamp=exports.formatDateTime=exports.getDomainColor=exports.isLocalDebugEnvironment=void 0;const react_native_1=require("react-native"),clipboard_1=__importDefault(require("@react-native-clipboard/clipboard")),toast_1=require("./toast"),NativeInspector_1=require("../native/NativeInspector"),AppColors_1=require("../styles/AppColors"),constants_1=require("../constants");__exportStar(require("./searchQueryParser"),exports),__exportStar(require("./memoryManager"),exports),__exportStar(require("./toast"),exports);const isLocalDebugEnvironment=()=>{const e=typeof __DEV__<"u"&&!!__DEV__,t=react_native_1.NativeModules.SourceCode?.scriptURL||"",r=t.startsWith("http://")||t.startsWith("https://")||t.includes(":8081")||t.includes(":8082");return e||r};exports.isLocalDebugEnvironment=isLocalDebugEnvironment;const getDomainColor=e=>{if(!e)return constants_1.DOMAIN_COLORS[0];let t=0;for(let r=0;r<e.length;r++)t=e.charCodeAt(r)+((t<<5)-t);return constants_1.DOMAIN_COLORS[Math.abs(t)%constants_1.DOMAIN_COLORS.length]};exports.getDomainColor=getDomainColor;const formatDateTime=e=>{const t=new Date(e),r=(u,c=2)=>String(u).padStart(c,"0"),o=r(t.getDate()),n=r(t.getMonth()+1),s=t.getFullYear(),i=r(t.getHours()),a=r(t.getMinutes()),p=r(t.getSeconds());return`${o}/${n}/${s} ${i}:${a}:${p}`};exports.formatDateTime=formatDateTime;const formatTimestamp=e=>{try{const t=new Date(e),r=t.getHours().toString().padStart(2,"0"),o=t.getMinutes().toString().padStart(2,"0"),n=t.getSeconds().toString().padStart(2,"0"),s=t.getMilliseconds().toString().padStart(3,"0");return`${r}:${o}:${n}.${s}`}catch{return"\u2014"}};exports.formatTimestamp=formatTimestamp;const getStatusColor=e=>!e||e===0||e>=500?AppColors_1.AppColors.errorColor:e>=400?AppColors_1.AppColors.darkOrange:e>=300?AppColors_1.AppColors.warningIconGold:AppColors_1.AppColors.greenColor;exports.getStatusColor=getStatusColor;const getDurationColor=e=>e==null?AppColors_1.AppColors.grayTextWeak:e<constants_1.DURATION_FAST_MS?AppColors_1.AppColors.greenColor:e<constants_1.DURATION_SLOW_MS?AppColors_1.AppColors.lightOrange:AppColors_1.AppColors.errorColor;exports.getDurationColor=getDurationColor;const getSize=e=>{try{const t=JSON.stringify(e)?.length??0;return t<1024?`${t} B`:`${(t/1024).toFixed(1)} KB`}catch{return"\u2014"}};exports.getSize=getSize;const formatBytes=e=>{if(e===0||!e||isNaN(e))return"0 B";const t=1024,r=["B","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,o)).toFixed(1))} ${r[o]||"B"}`};exports.formatBytes=formatBytes;const formatByteSize=e=>!e||e<=0?"0 B":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`;exports.formatByteSize=formatByteSize;const copyToClipboard=(e,t)=>{const r=typeof e=="function"?e():e;let o="";if(typeof r=="string")o=r;else try{o=JSON.stringify(r,null,2)}catch{o=String(r)}try{typeof clipboard_1.default?.setString=="function"?clipboard_1.default.setString(o):typeof clipboard_1.default?.default?.setString=="function"&&clipboard_1.default.default.setString(o)}catch(n){__DEV__&&console.warn("[NetworkInspector] Clipboard.setString failed:",n)}try{(0,toast_1.showToast)(t?`${t} copied to clipboard`:"Copied to clipboard")}catch{}try{react_native_1.Platform.OS==="android"&&react_native_1.ToastAndroid?.show&&react_native_1.ToastAndroid.show(t?`${t} copied to clipboard`:"Copied to clipboard",react_native_1.ToastAndroid.SHORT)}catch{}};exports.copyToClipboard=copyToClipboard;const copyImageOrMediaToClipboard=async(e,t="Image")=>{if(!e)return;let r=!1;try{r=await(0,NativeInspector_1.copyMediaToClipboard)(e)}catch{r=!1}if(!r){(0,exports.copyToClipboard)(e,t);return}try{(0,toast_1.showToast)(`${t} copied to clipboard`)}catch{}try{react_native_1.Platform.OS==="android"&&react_native_1.ToastAndroid?.show&&react_native_1.ToastAndroid.show(`${t} copied to clipboard`,react_native_1.ToastAndroid.SHORT)}catch{}};exports.copyImageOrMediaToClipboard=copyImageOrMediaToClipboard;const getPath=e=>{try{const t=new URL(e);return t.pathname+(t.search?t.search:"")}catch{return e.replace(/^https?:\/\/[^/?#]+/,"")||"/"}};exports.getPath=getPath;const getBaseUrl=e=>{try{const t=new URL(e);return`${t.protocol}//${t.host}`}catch{const t=e.match(/^(https?:\/\/[^/]+)/);return t?t[1]:""}};exports.getBaseUrl=getBaseUrl;const getCurlCommand=e=>{let t=`curl -X ${e.method} "${e.url}"`;if(e.requestHeaders&&Object.entries(e.requestHeaders).forEach(([r,o])=>{t+=` \\
2
+ -H "${r}: ${o}"`}),e.request&&e.method!=="GET"){const r=typeof e.request=="string"?e.request:JSON.stringify(e.request);t+=` \\
3
+ -d '${r.replace(/'/g,"'\\''")}'`}return t};exports.getCurlCommand=getCurlCommand;const getFetchCommand=e=>{const t={method:e.method};return e.requestHeaders&&Object.keys(e.requestHeaders).length>0&&(t.headers=e.requestHeaders),e.request&&e.method!=="GET"&&(t.body=JSON.stringify(e.request)),`fetch("${e.url}", ${JSON.stringify(t,null,2)})`};exports.getFetchCommand=getFetchCommand;const getPostmanRequestJson=e=>{let t;try{const s=new URL(e.url),i=s.hostname.split("."),a=s.pathname.replace(/^\//,"").split("/").filter(Boolean),p=[];s.searchParams.forEach((u,c)=>{p.push({key:c,value:u})}),t={raw:e.url,host:i,path:a,query:p.length>0?p:void 0}}catch{t={raw:e.url}}const r=[];e.requestHeaders&&typeof e.requestHeaders=="object"&&Object.entries(e.requestHeaders).forEach(([s,i])=>{r.push({key:s,value:String(i),type:"text"})});let o;if(e.request){const s=e.request;let i="";if(typeof s=="object")try{i=JSON.stringify(s,null,2)}catch{i=String(s)}else i=String(s);o={mode:"raw",raw:i,options:{raw:{language:"json"}}}}const n={info:{name:`${e.method} ${(0,exports.getPath)(e.url)||e.url}`,schema:"https://schema.getpostman.com/json/collection/v2.1.0/collection.json",_exporter_id:"inapp-inspector"},item:[{name:`${e.method} ${(0,exports.getPath)(e.url)||e.url}`,request:{method:e.method||"GET",header:r,body:o,url:t,description:"Captured by React Native In-App Inspector"},response:[]}]};return JSON.stringify(n,null,2)};exports.getPostmanRequestJson=getPostmanRequestJson;const openWithPostman=async(e,t)=>{const r=(0,exports.getCurlCommand)(e);clipboard_1.default.setString(r);const o="postman://";try{if(await react_native_1.Linking.canOpenURL(o)){await react_native_1.Linking.openURL(o),t?t("Opened Postman (cURL copied to clipboard)"):(0,toast_1.showToast)("Opened Postman (cURL copied to clipboard)");return}}catch{}react_native_1.Alert.alert("Open with Postman",`cURL for "${e.method} ${(0,exports.getPath)(e.url)||e.url}" copied to clipboard!
4
4
 
5
- ${t}`,[{text:"Cancel",style:"cancel"},{text:"Open",onPress:()=>{react_native_1.Linking.openURL(t).catch(()=>{})}}])};exports.handleOpenExternalLink=handleOpenExternalLink;const formatTimeShort=e=>{const t=new Date(e),o=String(t.getHours()).padStart(2,"0"),r=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}:${r}:${n}`};exports.formatTimeShort=formatTimeShort;const formatTime=e=>{const t=new Date(e),o=String(t.getHours()).padStart(2,"0"),r=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0"),i=String(t.getMilliseconds()).padStart(3,"0");return`${o}:${r}:${n}.${i}`};exports.formatTime=formatTime;const formatGap=e=>{if(e<1e3)return`+${e}ms`;const t=Math.round(e/1e3);if(t<60)return`+${t}s`;const o=Math.floor(t/60),r=t%60;return r>0?`+${o}m ${r}s`:`+${o}m`};exports.formatGap=formatGap;const getJsonContent=e=>{if(!e)return null;const t=[];for(let o=0;o<e.length;o++)(e[o]==="{"||e[o]==="[")&&t.push(o);for(const o of t){const r=e.substring(o).trim();try{const n=JSON.parse(r);if(n!==null&&typeof n=="object")return{header:e.substring(0,o).trim(),data:n}}catch{}}return null};exports.getJsonContent=getJsonContent;const getJsonPreviewText=(e,t=4)=>{try{const o=JSON.stringify(e,null,2),r=o.split(`
6
- `);return r.length>t?{text:r.slice(0,t).join(`
5
+ In Postman: Click "Import" > paste the cURL to load this request.`,[{text:"Done",style:"cancel"},{text:"Open Postman Web",onPress:()=>{react_native_1.Linking.openURL("https://web.postman.co/").catch(()=>{})}}])};exports.openWithPostman=openWithPostman;const deduplicateLogs=e=>{const t=new Map;return e.forEach(r=>{if(!t.has(r.id))t.set(r.id,r);else{const o=t.get(r.id);(o.status==null&&r.status!=null||(r.startTime??0)>=(o.startTime??0))&&t.set(r.id,r)}}),Array.from(t.values()).sort((r,o)=>o.id-r.id)};exports.deduplicateLogs=deduplicateLogs;const escapeRegex=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");exports.escapeRegex=escapeRegex;const getNavigationInfo=(e,t=[])=>{if(!e)return{path:t.length>0?t.join(" \u2794 "):"",params:null};if(e.name&&!e.routes)return{path:t.length>0?[...t,e.name].join(" \u2794 "):e.name,params:e.params||null};if(!e.routes||!Array.isArray(e.routes)||e.routes.length===0)return{path:t.length>0?t.join(" \u2794 "):"",params:null};const r=typeof e.index=="number"&&e.index>=0&&e.index<e.routes.length?e.index:0,o=e.routes[r];if(!o)return{path:t.length>0?t.join(" \u2794 "):"",params:null};const n=o.name?[...t,o.name]:t;return o?.state?(0,exports.getNavigationInfo)(o.state,n):{path:n.length>0?n.join(" \u2794 "):o.name||"",params:o.params||null}};exports.getNavigationInfo=getNavigationInfo;const getLogPageName=(e,t)=>{const r=t||e?.routeInfo;if(r&&r.path&&r.path!=="Navigators"){const o=r.path.split(" \u2794 ").map(n=>n.trim()).filter(Boolean);return o.length>0?o[o.length-1]:r.path}if(e.caller&&e.caller!=="Unknown")try{const o=e.caller.match(/([^/\\]+)\.(tsx|jsx|ts|js)/i);if(o&&o[1]){const n=o[1];if(!["networklogger","fetch","axios","apiclient","request","http","index","nativeinspector","inappinspector","bundleanalyzer"].includes(n.toLowerCase()))return n}}catch{}if(e.url)try{const n=e.url.split("?")[0].split("#")[0].replace(/^https?:\/\//i,""),s=n.indexOf("/");if(s!==-1){const a=n.substring(s+1).split("/").filter(Boolean),p=["api","v1","v2","v3","v4","rest","graphql","json","data","service","app"],u=a.filter(c=>!p.includes(c.toLowerCase()));if(u.length>0){const c=u[0];return c.charAt(0).toUpperCase()+c.slice(1)}}const i=n.split("/")[0];if(i)return i}catch{}return"General"};exports.getLogPageName=getLogPageName;const flattenObject=(e,t="")=>{let r={};return typeof e=="object"&&e!==null?Array.isArray(e)?e.forEach((o,n)=>{Object.assign(r,(0,exports.flattenObject)(o,t?`${t}[${n}]`:`[${n}]`))}):Object.keys(e).forEach(o=>{Object.assign(r,(0,exports.flattenObject)(e[o],t?`${t}.${o}`:o))}):r[t||"root"]=e,r};exports.flattenObject=flattenObject;const getDiff=(e,t)=>{const r=(0,exports.flattenObject)(e),o=(0,exports.flattenObject)(t),n=[];return new Set([...Object.keys(r),...Object.keys(o)]).forEach(i=>{i in r?i in o?r[i]!==o[i]&&n.push({type:"changed",path:i,oldVal:r[i],newVal:o[i]}):n.push({type:"removed",path:i,oldVal:r[i]}):n.push({type:"added",path:i,newVal:o[i]})}),n.sort((i,a)=>i.path.localeCompare(a.path))};exports.getDiff=getDiff;const formatDisplayUrl=e=>e?e.startsWith("http://")||e.startsWith("https://")?e:`https://${e}`:"";exports.formatDisplayUrl=formatDisplayUrl;const getLocalizedFilePath=(e,t,r)=>e.replace("country-language",`${t?.toLowerCase()}-${r?.toLowerCase()}`);exports.getLocalizedFilePath=getLocalizedFilePath;const getLocalizedFilePathWithSlash=(e,t,r)=>e.replace("country/language",`${t?.toLowerCase()}/${r?.toLowerCase()}`);exports.getLocalizedFilePathWithSlash=getLocalizedFilePathWithSlash;const isAllValuesEmpty=e=>!e||typeof e!="object"?!0:Object.values(e).every(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0);exports.isAllValuesEmpty=isAllValuesEmpty;const formatDateTimeToAnalytics=e=>new Date(e)?.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"});exports.formatDateTimeToAnalytics=formatDateTimeToAnalytics;const getBundleIdentifier=()=>{const e=react_native_1.NativeModules.RNDeviceInfo;if(e&&typeof e.bundleId=="string")return e.bundleId;if(e&&typeof e.getBundleId=="function")try{const n=e.getBundleId();if(typeof n=="string")return n}catch{}const t=react_native_1.NativeModules.ExponentConstants;if(t&&t.manifest){const n=t.manifest;if(n.ios&&n.ios.bundleIdentifier)return n.ios.bundleIdentifier;if(n.android&&n.android.package)return n.android.package}const r=react_native_1.NativeModules.ExpoApplication;if(r&&typeof r.applicationId=="string")return r.applicationId;const o=react_native_1.NativeModules.SourceCode;if(o&&typeof o.scriptURL=="string"){const n=o.scriptURL;if(n.includes("assets/"))try{const s=n.match(/assets\/([^/?#]+)/);if(s&&s[1])return s[1]}catch{}}return"org.reactjs.native.example"};exports.getBundleIdentifier=getBundleIdentifier;const getAppName=()=>{const e=react_native_1.NativeModules.PlatformConstants;e&&e.interfaceIdiom;const t=react_native_1.NativeModules.RNDeviceInfo;if(t&&typeof t.appName=="string")return t.appName;const r=react_native_1.NativeModules.NetworkInspectorModule;if(r&&typeof r.appName=="string"&&r.appName.length>0&&r.appName!=="App")return r.appName;const o=react_native_1.NativeModules.ExpoApplication;if(o&&typeof o.applicationName=="string")return o.applicationName;const n=react_native_1.NativeModules.ExponentConstants;if(n&&n.manifest){const a=n.manifest;if(a.name)return a.name}const s=react_native_1.NativeModules.AppInfo;if(s&&typeof s.appName=="string")return s.appName;const i=(0,exports.getBundleIdentifier)();if(i&&i!=="org.reactjs.native.example"){const a=i.split("."),p=a[a.length-1];return p?p.charAt(0).toUpperCase()+p.slice(1):"App"}return"App"};exports.getAppName=getAppName;const getAppVersionAndBuild=()=>{let e="",t="";const r=react_native_1.NativeModules.NetworkInspectorModule;if(r&&(typeof r.appVersion=="string"&&r.appVersion.length>0&&(e=r.appVersion),typeof r.appBuild=="string"&&r.appBuild.length>0&&(t=r.appBuild)),!e||!t){const o=react_native_1.NativeModules.ExpoApplication;o&&(!e&&typeof o.nativeAppVersion=="string"&&(e=o.nativeAppVersion),!t&&typeof o.nativeBuildVersion=="string"&&(t=o.nativeBuildVersion))}if(!e||!t){const o=react_native_1.NativeModules.ExponentConstants;if(o){const n=o.manifest||o.expoConfig;n&&(!e&&n.version&&(e=String(n.version)),t||(n.ios?.buildNumber?t=String(n.ios.buildNumber):n.android?.versionCode&&(t=String(n.android.versionCode))))}}if(!e||!t){const o=react_native_1.NativeModules.RNDeviceInfo;if(o){if(!e){if(typeof o.appVersion=="string")e=o.appVersion;else if(typeof o.getVersion=="function")try{e=o.getVersion()}catch{}}if(!t){if(typeof o.buildNumber=="string")t=o.buildNumber;else if(typeof o.getBuildNumber=="function")try{t=o.getBuildNumber()}catch{}}}}if(!e||!t){const o=react_native_1.NativeModules.AppInfo;o&&(!e&&typeof o.versionName=="string"&&(e=o.versionName),!t&&typeof o.versionCode=="string"&&(t=o.versionCode))}if(!e){const o=react_native_1.Platform.constants||react_native_1.NativeModules.PlatformConstants;o&&o.Version&&typeof o.Version=="string"&&o.Version.includes(".")&&(e=o.Version)}return e||(e="1.0"),t||(t="1"),{version:e,build:t,formatted:`${e} (${t})`}};exports.getAppVersionAndBuild=getAppVersionAndBuild;const handleOpenExternalLink=e=>{if(!e)return;const t=(0,exports.formatDisplayUrl)(e);react_native_1.Alert.alert("Open Link",`Do you want to open this link in your web browser?
6
+
7
+ ${t}`,[{text:"Cancel",style:"cancel"},{text:"Open",onPress:()=>{react_native_1.Linking.openURL(t).catch(()=>{})}}])};exports.handleOpenExternalLink=handleOpenExternalLink;const formatTimeShort=e=>{const t=new Date(e),r=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${r}:${o}:${n}`};exports.formatTimeShort=formatTimeShort;const formatTime=e=>{const t=new Date(e),r=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0"),s=String(t.getMilliseconds()).padStart(3,"0");return`${r}:${o}:${n}.${s}`};exports.formatTime=formatTime;const formatGap=e=>{if(e<1e3)return`+${e}ms`;const t=Math.round(e/1e3);if(t<60)return`+${t}s`;const r=Math.floor(t/60),o=t%60;return o>0?`+${r}m ${o}s`:`+${r}m`};exports.formatGap=formatGap;const getJsonContent=e=>{if(!e)return null;const t=[];for(let r=0;r<e.length;r++)(e[r]==="{"||e[r]==="[")&&t.push(r);for(const r of t){const o=e.substring(r).trim();try{const n=JSON.parse(o);if(n!==null&&typeof n=="object")return{header:e.substring(0,r).trim(),data:n}}catch{}}return null};exports.getJsonContent=getJsonContent;const getJsonPreviewText=(e,t=4)=>{try{const r=JSON.stringify(e,null,2),o=r.split(`
8
+ `);return o.length>t?{text:o.slice(0,t).join(`
7
9
  `)+`
8
- ...`,hasMore:!0}:{text:o,hasMore:!1}}catch{return{text:String(e),hasMore:!1}}};exports.getJsonPreviewText=getJsonPreviewText;const parseStackLine=(e,t=!1)=>{let o=e.trim().replace(/^at /,"");if(o.includes("@")){const N=o.indexOf("@"),b=o.substring(0,N).trim(),S=o.substring(N+1).trim();o=b?`${b} (${S})`:S}const r=o.match(/^(.*?)\s*\((.*?)\)$/);let n="<anonymous>",i=o;r&&(n=r[1].trim()||"<anonymous>",i=r[2].trim()),(n.startsWith("?anon_")||n==="?")&&(n="anonymous"),i=i.replace(/^address at /,"");const s=i.match(/^(.*?):(\d+):(\d+)$/);let a=i,l,d;s&&(a=s[1],l=s[2],d=s[3]);let c=a.replace(/[?&].*$/,"").replace(/[)]+$/,"").replace(/\/\/+$/,"");c=c.replace(/^(?:https?:\/\/[^\/]+\/|file:\/\/\/|webpack:\/\/\/?)/,"");let p=c.split("/").filter(Boolean).pop()||c;p=p.replace(/[?&].*$/,"").replace(/[)]+$/,""),(p.startsWith("&")||p.startsWith("?")||p.startsWith("platform=")||p.includes("platform=")||p.startsWith("dev=")||p.includes("dev="))&&(p="Unknown",c="Unknown");const m=p.match(/\.([a-z0-9]+)$/i),u=m?m[1].toLowerCase():"",g=u==="tsx"||u==="jsx"||u==="ts"||u==="js"?u:"other",h=i==="native"||c==="native",x=c.includes("InternalBytecode")||c.includes("metro-runtime")||c.includes("regenerator-runtime")||n==="tryCallOne"||n==="asyncGeneratorStep"||n==="_next"||n==="next"&&h,y=c.includes("node_modules")||c.includes("react-native/Libraries")||c.includes("react-native-inapp-inspector")&&!c.includes("/example/"),C=!h&&!x&&!y&&(g==="tsx"||g==="jsx"||g==="ts"||g==="js"||!p.includes(".bundle")&&p!=="Unknown"),v=C?"app":y?"dependency":h?"native":"runtime",A=x||h||n==="asyncGeneratorStep"||n==="_next";let f=c;f.includes("/example/")?f=f.substring(f.indexOf("/example/")+9):f.includes("/src/")?f=f.substring(f.indexOf("/src/")+1):f.includes("/node_modules/")&&(f=f.substring(f.indexOf("/node_modules/")+14));const $=l?`${p}:${l}${d?`:${d}`:""}`:p;return{raw:e,functionName:n,fileName:p,fullPath:f,rawFilePath:a,fileExt:g,frameType:v,isUserCode:C,isRuntimeNoise:A,lineNumber:l,columnNumber:d,isOrigin:t,copyableLocation:$}};exports.parseStackLine=parseStackLine;const getCleanCallerDisplay=e=>{if(!e||e==="Unknown"||e.trim()==="")return null;const t=e.trim();if(t.startsWith("&platform")||t.startsWith("?platform")||t.startsWith("&")||t.includes("&platform=")||t.includes("?platform=")){const i=t.match(/^(.*?)\s*[\(@]/);if(i&&i[1]&&!i[1].includes("&")&&!i[1].includes("platform")){const s=i[1].trim();if(s&&s!=="<anonymous>"&&s!=="anonymous"&&!s.startsWith("?anon_"))return{fileName:s,functionName:s,display:s}}return null}const o=(0,exports.parseStackLine)(e,!0);if(!o)return null;if(o.fileName.includes(".bundle")||o.fileName.includes("platform=")||o.fileName.startsWith("&")||o.fileName.startsWith("?")||o.fileName==="index.bundle"||o.fileName==="bundle"||o.fileName==="Unknown")return o.functionName&&o.functionName!=="<anonymous>"&&o.functionName!=="anonymous"&&!o.functionName.startsWith("?")&&!o.functionName.startsWith("_callee")&&!o.functionName.includes("regeneratorRuntime")?{fileName:o.functionName,lineNumber:o.lineNumber,functionName:o.functionName,display:o.functionName}:null;const n=o.lineNumber?`${o.fileName}:${o.lineNumber}`:o.fileName;return{fileName:o.fileName,lineNumber:o.lineNumber,functionName:o.functionName,display:n}};exports.getCleanCallerDisplay=getCleanCallerDisplay;const openInVSCode=(e,t,o)=>{const r=t?Number(t):1,n=o?Number(o):1,i=t?`:${t}`:"",s=o?`:${o}`:"",a=e.replace(/^file:\/\//,"");let l=null;try{const u=react_native_1.NativeModules?.SourceCode?.scriptURL||react_native_1.NativeModules?.PlatformConstants?.serverHost||react_native_1.NativeModules?.DevSettings?.serverHost;if(typeof u=="string"&&u.length>0){const g=u.match(/^(https?:\/\/[^/]+)/);g?l=g[1]:!u.startsWith("http")&&u.includes(":")&&(l=`http://${u}`)}}catch{}Array.from(new Set([...l?[l]:[],"http://localhost:8081","http://127.0.0.1:8081","http://10.0.2.2:8081"])).forEach(u=>{try{fetch(`${u}/open-stack-frame`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({file:a,lineNumber:r,column:n})}).catch(()=>{})}catch{}});const c=`vscode://file/${a.replace(/^\/+/,"")}${i}${s}`,p=`cursor://file/${a.replace(/^\/+/,"")}${i}${s}`,m=`vscode-insiders://file/${a.replace(/^\/+/,"")}${i}${s}`;react_native_1.Linking.openURL(c).catch(()=>{react_native_1.Linking.openURL(p).catch(()=>{react_native_1.Linking.openURL(m).catch(()=>{(0,exports.copyToClipboard)(`${a}${i}${s}`,"Location")})})})};exports.openInVSCode=openInVSCode,exports.ANALYTICS_EVENT_PALETTE=[AppColors_1.AppColors.googleBlue,AppColors_1.AppColors.googleGreen,AppColors_1.AppColors.googlePurple,AppColors_1.AppColors.googleTeal,AppColors_1.AppColors.googleRed,AppColors_1.AppColors.googleOrange,AppColors_1.AppColors.blue700,AppColors_1.AppColors.materialGreen];const getEventColor=e=>{const t=typeof e=="string"?e:String(e||"");let o=0;for(let r=0;r<t.length;r++)o=o*31+t.charCodeAt(r)|0;return exports.ANALYTICS_EVENT_PALETTE[Math.abs(o)%exports.ANALYTICS_EVENT_PALETTE.length]};exports.getEventColor=getEventColor;var gaAnalyticsRegistry_1=require("./gaAnalyticsRegistry");Object.defineProperty(exports,"getEventCategory",{enumerable:!0,get:function(){return gaAnalyticsRegistry_1.getEventCategory}}),Object.defineProperty(exports,"registerGAPlugin",{enumerable:!0,get:function(){return gaAnalyticsRegistry_1.registerGAPlugin}});const getCategoryColors=e=>{switch(e){case"page_view":case"Page View":return{bg:AppColors_1.AppColors.blueBg,border:AppColors_1.AppColors.blueBorder,text:AppColors_1.AppColors.blue800};case"ecommerce":case"Ecommerce":return{bg:AppColors_1.AppColors.greenBg,border:AppColors_1.AppColors.greenBorder,text:AppColors_1.AppColors.materialGreen};case"system":case"System":return{bg:AppColors_1.AppColors.greyBg,border:AppColors_1.AppColors.greyBorder,text:AppColors_1.AppColors.grey600};default:return{bg:AppColors_1.AppColors.purpleBg,border:AppColors_1.AppColors.purpleBorder,text:AppColors_1.AppColors.purpleText}}};exports.getCategoryColors=getCategoryColors;const getRuntimeDiagnostics=()=>{const e=typeof global.HermesInternal<"u",t=typeof global._v8runtime<"u",o=e?"hermes":t?"v8":"jsc",n=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy?"fabric":"paper";let i=32.4,s=64;try{const a=global.HermesInternal?.getInstrumentedStats?.();a?.js_heap_size?(i=Number((a.js_heap_size/(1024*1024)).toFixed(1)),s=Number(((a.js_allocated_bytes||a.js_heap_size*1.6)/(1024*1024)).toFixed(1))):global.performance?.memory?.usedJSHeapSize&&(i=Number((global.performance.memory.usedJSHeapSize/(1024*1024)).toFixed(1)),s=Number((global.performance.memory.totalJSHeapSize/(1024*1024)).toFixed(1)))}catch{}return{engineType:o,archType:n,usedHeapMb:i,totalAllocMb:s}};exports.getRuntimeDiagnostics=getRuntimeDiagnostics;
10
+ ...`,hasMore:!0}:{text:r,hasMore:!1}}catch{return{text:String(e),hasMore:!1}}};exports.getJsonPreviewText=getJsonPreviewText;const parseStackLine=(e,t=!1)=>{let r=e.trim().replace(/^at /,"");if(r.includes("@")){const N=r.indexOf("@"),b=r.substring(0,N).trim(),S=r.substring(N+1).trim();r=b?`${b} (${S})`:S}const o=r.match(/^(.*?)\s*\((.*?)\)$/);let n="<anonymous>",s=r;o&&(n=o[1].trim()||"<anonymous>",s=o[2].trim()),(n.startsWith("?anon_")||n==="?")&&(n="anonymous"),s=s.replace(/^address at /,"");const i=s.match(/^(.*?):(\d+):(\d+)$/);let a=s,p,u;i&&(a=i[1],p=i[2],u=i[3]);let c=a.replace(/[?&].*$/,"").replace(/[)]+$/,"").replace(/\/\/+$/,"");c=c.replace(/^(?:https?:\/\/[^\/]+\/|file:\/\/\/|webpack:\/\/\/?)/,"");let l=c.split("/").filter(Boolean).pop()||c;l=l.replace(/[?&].*$/,"").replace(/[)]+$/,""),(l.startsWith("&")||l.startsWith("?")||l.startsWith("platform=")||l.includes("platform=")||l.startsWith("dev=")||l.includes("dev="))&&(l="Unknown",c="Unknown");const g=l.match(/\.([a-z0-9]+)$/i),d=g?g[1].toLowerCase():"",m=d==="tsx"||d==="jsx"||d==="ts"||d==="js"?d:"other",h=s==="native"||c==="native",x=c.includes("InternalBytecode")||c.includes("metro-runtime")||c.includes("regenerator-runtime")||n==="tryCallOne"||n==="asyncGeneratorStep"||n==="_next"||n==="next"&&h,y=c.includes("node_modules")||c.includes("react-native/Libraries")||c.includes("react-native-inapp-inspector")&&!c.includes("/example/"),C=!h&&!x&&!y&&(m==="tsx"||m==="jsx"||m==="ts"||m==="js"||!l.includes(".bundle")&&l!=="Unknown"),v=C?"app":y?"dependency":h?"native":"runtime",A=x||h||n==="asyncGeneratorStep"||n==="_next";let f=c;f.includes("/example/")?f=f.substring(f.indexOf("/example/")+9):f.includes("/src/")?f=f.substring(f.indexOf("/src/")+1):f.includes("/node_modules/")&&(f=f.substring(f.indexOf("/node_modules/")+14));const $=p?`${l}:${p}${u?`:${u}`:""}`:l;return{raw:e,functionName:n,fileName:l,fullPath:f,rawFilePath:a,fileExt:m,frameType:v,isUserCode:C,isRuntimeNoise:A,lineNumber:p,columnNumber:u,isOrigin:t,copyableLocation:$}};exports.parseStackLine=parseStackLine;const getCleanCallerDisplay=e=>{if(!e||e==="Unknown"||e.trim()==="")return null;const t=e.trim();if(t.startsWith("&platform")||t.startsWith("?platform")||t.startsWith("&")||t.includes("&platform=")||t.includes("?platform=")){const s=t.match(/^(.*?)\s*[\(@]/);if(s&&s[1]&&!s[1].includes("&")&&!s[1].includes("platform")){const i=s[1].trim();if(i&&i!=="<anonymous>"&&i!=="anonymous"&&!i.startsWith("?anon_"))return{fileName:i,functionName:i,display:i}}return null}const r=(0,exports.parseStackLine)(e,!0);if(!r)return null;if(r.fileName.includes(".bundle")||r.fileName.includes("platform=")||r.fileName.startsWith("&")||r.fileName.startsWith("?")||r.fileName==="index.bundle"||r.fileName==="bundle"||r.fileName==="Unknown")return r.functionName&&r.functionName!=="<anonymous>"&&r.functionName!=="anonymous"&&!r.functionName.startsWith("?")&&!r.functionName.startsWith("_callee")&&!r.functionName.includes("regeneratorRuntime")?{fileName:r.functionName,lineNumber:r.lineNumber,functionName:r.functionName,display:r.functionName}:null;const n=r.lineNumber?`${r.fileName}:${r.lineNumber}`:r.fileName;return{fileName:r.fileName,lineNumber:r.lineNumber,functionName:r.functionName,display:n}};exports.getCleanCallerDisplay=getCleanCallerDisplay;const openInVSCode=(e,t,r)=>{const o=t?Number(t):1,n=r?Number(r):1,s=t?`:${t}`:"",i=r?`:${r}`:"",a=e.replace(/^file:\/\//,"");let p=null;try{const d=react_native_1.NativeModules?.SourceCode?.scriptURL||react_native_1.NativeModules?.PlatformConstants?.serverHost||react_native_1.NativeModules?.DevSettings?.serverHost;if(typeof d=="string"&&d.length>0){const m=d.match(/^(https?:\/\/[^/]+)/);m?p=m[1]:!d.startsWith("http")&&d.includes(":")&&(p=`http://${d}`)}}catch{}Array.from(new Set([...p?[p]:[],"http://localhost:8081","http://127.0.0.1:8081","http://10.0.2.2:8081"])).forEach(d=>{try{fetch(`${d}/open-stack-frame`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({file:a,lineNumber:o,column:n})}).catch(()=>{})}catch{}});const c=`vscode://file/${a.replace(/^\/+/,"")}${s}${i}`,l=`cursor://file/${a.replace(/^\/+/,"")}${s}${i}`,g=`vscode-insiders://file/${a.replace(/^\/+/,"")}${s}${i}`;react_native_1.Linking.openURL(c).catch(()=>{react_native_1.Linking.openURL(l).catch(()=>{react_native_1.Linking.openURL(g).catch(()=>{(0,exports.copyToClipboard)(`${a}${s}${i}`,"Location")})})})};exports.openInVSCode=openInVSCode,exports.ANALYTICS_EVENT_PALETTE=[AppColors_1.AppColors.googleBlue,AppColors_1.AppColors.googleGreen,AppColors_1.AppColors.googlePurple,AppColors_1.AppColors.googleTeal,AppColors_1.AppColors.googleRed,AppColors_1.AppColors.googleOrange,AppColors_1.AppColors.blue700,AppColors_1.AppColors.materialGreen];const getEventColor=e=>{const t=typeof e=="string"?e:String(e||"");let r=0;for(let o=0;o<t.length;o++)r=r*31+t.charCodeAt(o)|0;return exports.ANALYTICS_EVENT_PALETTE[Math.abs(r)%exports.ANALYTICS_EVENT_PALETTE.length]};exports.getEventColor=getEventColor;var gaAnalyticsRegistry_1=require("./gaAnalyticsRegistry");Object.defineProperty(exports,"getEventCategory",{enumerable:!0,get:function(){return gaAnalyticsRegistry_1.getEventCategory}}),Object.defineProperty(exports,"registerGAPlugin",{enumerable:!0,get:function(){return gaAnalyticsRegistry_1.registerGAPlugin}});const getCategoryColors=e=>{switch(e){case"page_view":case"Page View":return{bg:AppColors_1.AppColors.blueBg,border:AppColors_1.AppColors.blueBorder,text:AppColors_1.AppColors.blue800};case"ecommerce":case"Ecommerce":return{bg:AppColors_1.AppColors.greenBg,border:AppColors_1.AppColors.greenBorder,text:AppColors_1.AppColors.materialGreen};case"system":case"System":return{bg:AppColors_1.AppColors.greyBg,border:AppColors_1.AppColors.greyBorder,text:AppColors_1.AppColors.grey600};default:return{bg:AppColors_1.AppColors.purpleBg,border:AppColors_1.AppColors.purpleBorder,text:AppColors_1.AppColors.purpleText}}};exports.getCategoryColors=getCategoryColors;const getRuntimeDiagnostics=()=>{const e=typeof global.HermesInternal<"u",t=typeof global._v8runtime<"u",r=e?"hermes":t?"v8":"jsc",n=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy?"fabric":"paper";let s=32.4,i=64;try{const a=global.HermesInternal?.getInstrumentedStats?.();a?.js_heap_size?(s=Number((a.js_heap_size/(1024*1024)).toFixed(1)),i=Number(((a.js_allocated_bytes||a.js_heap_size*1.6)/(1024*1024)).toFixed(1))):global.performance?.memory?.usedJSHeapSize&&(s=Number((global.performance.memory.usedJSHeapSize/(1024*1024)).toFixed(1)),i=Number((global.performance.memory.totalJSHeapSize/(1024*1024)).toFixed(1)))}catch{}return{engineType:r,archType:n,usedHeapMb:s,totalAllocMb:i}};exports.getRuntimeDiagnostics=getRuntimeDiagnostics;const isUrlHidden=(e,t)=>{if(!e||!t||t.length===0)return!1;const r=e.trim();if(!r)return!1;const o=r.toLowerCase();for(let n=0;n<t.length;n++){const s=t[n]?.trim();if(!s)continue;const i=s.toLowerCase();if(o.includes(i))return!0;const a=i.replace(/^https?:\/\//,""),p=o.replace(/^https?:\/\//,"");if(a&&p.includes(a))return!0;if(s.includes("*"))try{const u=s.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");if(new RegExp(u,"i").test(r))return!0}catch{}try{if(new RegExp(s,"i").test(r))return!0}catch{}}return!1};exports.isUrlHidden=isUrlHidden;
@@ -0,0 +1,88 @@
1
+ export interface FrameSample {
2
+ timestamp: number;
3
+ durationMs: number;
4
+ fps: number;
5
+ isJank: boolean;
6
+ isFrozen: boolean;
7
+ }
8
+ export interface JankEvent {
9
+ id: string;
10
+ timestamp: number;
11
+ timeStr: string;
12
+ durationMs: number;
13
+ fps: number;
14
+ severity: 'moderate' | 'severe' | 'frozen';
15
+ }
16
+ export interface MemoryStats {
17
+ usedHeapMb: number;
18
+ totalAllocMb: number;
19
+ peakHeapMb: number;
20
+ engine: string;
21
+ isAvailable: boolean;
22
+ gcCount?: number;
23
+ gcTimeMs?: number;
24
+ }
25
+ export interface PercentileStats {
26
+ p50Ms: number;
27
+ p90Ms: number;
28
+ p95Ms: number;
29
+ p99Ms: number;
30
+ }
31
+ export interface BucketDistribution {
32
+ ultraSmoothCount: number;
33
+ smoothCount: number;
34
+ degradedCount: number;
35
+ stutteredCount: number;
36
+ frozenCount: number;
37
+ totalSamples: number;
38
+ }
39
+ export interface EngineDetails {
40
+ engineName: string;
41
+ isHermes: boolean;
42
+ isFabric: boolean;
43
+ isTurboModules: boolean;
44
+ architectureName: string;
45
+ gcCollections?: number;
46
+ gcCpuTimeMs?: number;
47
+ heapUsedMb: number;
48
+ heapTotalMb: number;
49
+ peakHeapMb: number;
50
+ }
51
+ export interface LivePerformanceData {
52
+ fps: number;
53
+ avgFps: number;
54
+ minFps: number;
55
+ maxFps: number;
56
+ frameDurationMs: number;
57
+ refreshRateHz: number;
58
+ jankCount: number;
59
+ frozenCount: number;
60
+ jankPercent: number;
61
+ apdexScore: number;
62
+ apdexStatus: 'EXCELLENT' | 'GOOD' | 'FAIR' | 'POOR';
63
+ satisfiedCount: number;
64
+ toleratingCount: number;
65
+ frustratedCount: number;
66
+ longTaskCount: number;
67
+ percentiles: PercentileStats;
68
+ budgetUsedPercent: number;
69
+ budgetHeadroomMs: number;
70
+ distribution: BucketDistribution;
71
+ engineDetails: EngineDetails;
72
+ jsEventLoopLagMs: number;
73
+ avgJsLagMs: number;
74
+ peakJsLagMs: number;
75
+ healthScore: number;
76
+ healthStatus: 'EXCELLENT' | 'GOOD' | 'FAIR' | 'POOR';
77
+ frameHistory: number[];
78
+ jsLagHistory: number[];
79
+ recentJanks: JankEvent[];
80
+ memory: MemoryStats;
81
+ sessionDurationSec: number;
82
+ isStressTesting: boolean;
83
+ runJsStressTest: (durationMs?: number) => void;
84
+ runRenderStressTest: () => void;
85
+ triggerGC: () => void;
86
+ resetStats: () => void;
87
+ }
88
+ export declare const usePerformanceMonitor: (active?: boolean) => LivePerformanceData;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.usePerformanceMonitor=void 0;const react_1=require("react"),usePerformanceMonitor=(l=!0)=>{const y=(0,react_1.useRef)(0),L=(0,react_1.useRef)(0),b=(0,react_1.useRef)([]),S=(0,react_1.useRef)([]),R=(0,react_1.useRef)(0),F=(0,react_1.useRef)(0),T=(0,react_1.useRef)(0),H=(0,react_1.useRef)(0),D=(0,react_1.useRef)(0),E=(0,react_1.useRef)(0),J=(0,react_1.useRef)(0),j=(0,react_1.useRef)(0),I=(0,react_1.useRef)(0),v=(0,react_1.useRef)(0),d=(0,react_1.useRef)([]),x=(0,react_1.useRef)(null),C=(0,react_1.useRef)(null),z=(0,react_1.useRef)(null),B=(0,react_1.useRef)(null),p=(0,react_1.useCallback)(()=>{const e=!!global.HermesInternal,u=!!global._v8runtime,t=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy,r=`${e?"Hermes":u?"V8 Engine":"JavaScriptCore"} \u2022 ${t?"Fabric":"Paper"}`;let s=0,a=0,i=!1,m,A;try{const k=global.HermesInternal;if(k?.getInstrumentedStats){const n=k.getInstrumentedStats();if(n&&typeof n=="object"){const c=n.js_heap_size??n.heapSize??n["js.heap_size"]??n.js_allocated_bytes??0,w=n.js_allocated_bytes??n.allocatedBytes??n["js.allocated_bytes"]??n.totalAllocatedBytes??c;(c>0||w>0)&&(s=Number((c/(1024*1024)).toFixed(2)),a=Number((w/(1024*1024)).toFixed(2)),m=n.gc_num_collections??n.num_gc_collections??n["gc.num_collections"],A=n.gc_cpu_time??n.gc_time??n["gc.cpu_time"],i=!0)}}else if(global.performance?.memory?.usedJSHeapSize){const n=global.performance.memory;s=Number((n.usedJSHeapSize/(1024*1024)).toFixed(2)),a=Number((n.totalJSHeapSize/(1024*1024)).toFixed(2)),i=!0}}catch{}const _=H?.current||0,h=Math.max(_,s);return H&&(H.current=h),{usedHeapMb:s,totalAllocMb:a,peakHeapMb:h,engine:r,isAvailable:i,gcCount:m,gcTimeMs:A}},[]),[Me,V]=(0,react_1.useState)(60),[he,G]=(0,react_1.useState)(60),[be,X]=(0,react_1.useState)(60),[Se,K]=(0,react_1.useState)(60),[Re,O]=(0,react_1.useState)(16.6),[Fe,rt]=(0,react_1.useState)(60),[xe,Q]=(0,react_1.useState)(0),[Ce,W]=(0,react_1.useState)(0),[_e,Y]=(0,react_1.useState)(0),[M,Z]=(0,react_1.useState)(1),[ke,ee]=(0,react_1.useState)(0),[ye,te]=(0,react_1.useState)(0),[Le,ne]=(0,react_1.useState)(0),[U,re]=(0,react_1.useState)(0),[Te,He]=(0,react_1.useState)({p50Ms:16.6,p90Ms:16.6,p95Ms:16.6,p99Ms:16.6}),[Ie,ve]=(0,react_1.useState)(100),[Ne,Pe]=(0,react_1.useState)(0),[Ae,we]=(0,react_1.useState)({ultraSmoothCount:0,smoothCount:0,degradedCount:0,stutteredCount:0,frozenCount:0,totalSamples:0}),[De,se]=(0,react_1.useState)(0),[Ee,oe]=(0,react_1.useState)(0),[Je,ae]=(0,react_1.useState)(0),[je,ue]=(0,react_1.useState)(()=>Array(45).fill(16.6)),[ze,ce]=(0,react_1.useState)(()=>Array(25).fill(0)),[Be,ie]=(0,react_1.useState)([]),[Oe,N]=(0,react_1.useState)(!1),[Ue,le]=(0,react_1.useState)(0),[g,$]=(0,react_1.useState)(()=>p()),$e=(0,react_1.useMemo)(()=>{const e=!!global.HermesInternal,u=!!global._v8runtime,t=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy,o=!!global.__turboModuleProxy;return{engineName:e?"Hermes":u?"V8 Engine":"JavaScriptCore",isHermes:e,isFabric:t,isTurboModules:o,architectureName:t?"Fabric (New Architecture)":"Paper (Legacy)",heapUsedMb:g.usedHeapMb,heapTotalMb:g.totalAllocMb,peakHeapMb:g.peakHeapMb,gcCollections:g.gcCount,gcCpuTimeMs:g.gcTimeMs}},[g]);(0,react_1.useEffect)(()=>{if(!l)return;let e=!0,u=6;y.current=performance.now();const t=o=>{if(!e)return;if(u>0){y.current=o,u--,x.current=requestAnimationFrame(t);return}const r=o-y.current;if(y.current=o,r>0&&r<800){L.current++;const s=Math.min(60,Math.max(1,Math.round(1e3/Math.max(16,r)))),a=Number(r.toFixed(1));if(r<=18.5)D.current++;else if(r<=66.6){if(E.current++,I.current++,r>36){const i={id:`jank_${Date.now()}_${Math.random().toString(36).substring(2,6)}`,timestamp:Date.now(),timeStr:new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"}),durationMs:a,fps:s,severity:"moderate"};d.current=[i,...d.current.slice(0,19)]}}else{J.current++,v.current++;const i={id:`jank_${Date.now()}_${Math.random().toString(36).substring(2,6)}`,timestamp:Date.now(),timeStr:new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"}),durationMs:a,fps:s,severity:"frozen"};d.current=[i,...d.current.slice(0,19)]}b.current.push(a),b.current.length>45&&b.current.shift(),L.current===1?(R.current=s,F.current=s):(s<R.current&&s>=15&&(R.current=s),s>F.current&&(F.current=s))}x.current=requestAnimationFrame(t)};return x.current=requestAnimationFrame(t),()=>{e=!1,x.current&&cancelAnimationFrame(x.current)}},[l]),(0,react_1.useEffect)(()=>{if(!l)return;const e=30;let u=performance.now()+e,t=5;const o=()=>{const r=performance.now(),s=r-u;if(u=r+e,t>0){t--,C.current=setTimeout(o,e);return}const a=Math.max(0,Number((s-8).toFixed(1)));a>T.current&&(T.current=a),a>=50&&j.current++,S.current.push(a),S.current.length>30&&S.current.shift(),C.current=setTimeout(o,e)};return C.current=setTimeout(o,e),()=>{C.current&&clearTimeout(C.current)}},[l]),(0,react_1.useEffect)(()=>{if(!l)return;const u=setInterval(()=>{const t=b.current,o=S.current;if(t.length>0){const r=t[t.length-1]??16.6,a=t.reduce((f,q)=>f+q,0)/t.length,i=Math.min(60,Math.max(1,Math.round(1e3/Math.max(16,a)))),m=Math.min(60,Math.max(1,Math.round(1e3/Math.max(16,r))));V(m),G(i),O(r),ue([...t]),X(R.current||m),K(F.current||m);const A=Math.max(1,L.current),_=D.current,h=E.current,k=J.current,n=Number(((_+h/2)/Math.max(1,_+h+k)).toFixed(2));Z(Math.max(0,Math.min(1,n))),ee(_),te(h),ne(k),re(j.current);const c=[...t].sort((f,q)=>f-q),w=c[Math.floor(c.length*.5)]??16.6,We=c[Math.floor(c.length*.9)]??16.6,Ye=c[Math.floor(c.length*.95)]??16.6,Ze=c[Math.floor(c.length*.99)]??16.6;He({p50Ms:Number(w.toFixed(1)),p90Ms:Number(We.toFixed(1)),p95Ms:Number(Ye.toFixed(1)),p99Ms:Number(Ze.toFixed(1))});const et=Math.min(250,Number((r/16.6*100).toFixed(0))),tt=Number(Math.max(0,16.6-r).toFixed(1));ve(et),Pe(tt);let me=0,fe=0,ge=0,de=0,pe=0;for(const f of t)f<=16.6?me++:f<=24?fe++:f<=34?ge++:f<=66.6?de++:pe++;we({ultraSmoothCount:me,smoothCount:fe,degradedCount:ge,stutteredCount:de,frozenCount:pe,totalSamples:t.length});const nt=Number(((I.current+v.current)/A*100).toFixed(1));Y(nt),Q(I.current),W(v.current),ie([...d.current])}if(o.length>0){const r=o[o.length-1]??0,s=o.reduce((i,m)=>i+m,0),a=Number((s/o.length).toFixed(1));se(r),oe(a),ae(T.current),ce([...o])}},300);return()=>{clearInterval(u)}},[l]),(0,react_1.useEffect)(()=>{if(l)return z.current=setInterval(()=>{$(p())},1500),B.current=setInterval(()=>{le(e=>e+1)},1e3),()=>{z.current&&clearInterval(z.current),B.current&&clearInterval(B.current)}},[l,p]);const P=(0,react_1.useMemo)(()=>{const e=Math.round(M*100-Math.min(U*2,10));return Math.max(0,Math.min(100,e))},[M,U]),qe=P>=88?"EXCELLENT":P>=72?"GOOD":P>=55?"FAIR":"POOR",Ve=M>=.94?"EXCELLENT":M>=.85?"GOOD":M>=.7?"FAIR":"POOR",Ge=(0,react_1.useCallback)((e=120)=>{N(!0),setTimeout(()=>{const u=performance.now();for(;performance.now()-u<e;)Math.sqrt(Math.random()*1e6);N(!1)},50)},[]),Xe=(0,react_1.useCallback)(()=>{N(!0);let e=0;const u=setInterval(()=>{e++,O(t=>Number((t+.1).toFixed(1))),e>25&&(clearInterval(u),N(!1))},16)},[]),Ke=(0,react_1.useCallback)(()=>{try{const e=global.HermesInternal;e?.gc?e.gc():global.gc&&global.gc(),setTimeout(()=>{$(p())},200)}catch{}},[]),Qe=(0,react_1.useCallback)(()=>{L.current=0,D.current=0,E.current=0,J.current=0,j.current=0,I.current=0,v.current=0,R.current=0,F.current=0,T.current=0,H.current=0,b.current=[],S.current=[],d.current=[],V(60),G(60),X(60),K(60),O(16.6),Z(1),ee(0),te(0),ne(0),re(0),Q(0),W(0),Y(0),se(0),oe(0),ae(0),ue(Array(45).fill(16.6)),ce(Array(25).fill(0)),ie([]),le(0),$(p())},[p]);return{fps:Me,avgFps:he,minFps:be,maxFps:Se,frameDurationMs:Re,refreshRateHz:Fe,jankCount:xe,frozenCount:Ce,jankPercent:_e,apdexScore:M,apdexStatus:Ve,satisfiedCount:ke,toleratingCount:ye,frustratedCount:Le,longTaskCount:U,percentiles:Te,budgetUsedPercent:Ie,budgetHeadroomMs:Ne,distribution:Ae,engineDetails:$e,jsEventLoopLagMs:De,avgJsLagMs:Ee,peakJsLagMs:Je,healthScore:P,healthStatus:qe,frameHistory:je,jsLagHistory:ze,recentJanks:Be,memory:g,sessionDurationSec:Ue,isStressTesting:Oe,runJsStressTest:Ge,runRenderStressTest:Xe,triggerGC:Ke,resetStats:Qe}};exports.usePerformanceMonitor=usePerformanceMonitor;
@@ -1,4 +1,10 @@
1
1
  import { ActiveTab } from '../types';
2
+ export interface InspectorRemoteConfigResult {
3
+ modules?: Partial<Record<ActiveTab, boolean>>;
4
+ captureWidgetEnabled?: boolean;
5
+ enabled?: boolean;
6
+ }
2
7
  export declare function getFirebaseRemoteConfig(customInstance?: any): any;
3
8
  export declare function isFirebaseRemoteConfigAvailable(customInstance?: any): boolean;
9
+ export declare function fetchRemoteConfigSettings(customInstance?: any, fetchTimeoutMs?: number): Promise<InspectorRemoteConfigResult | null>;
4
10
  export declare function fetchRemoteConfigModuleStatus(customInstance?: any, fetchTimeoutMs?: number): Promise<Partial<Record<ActiveTab, boolean>> | null>;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getFirebaseRemoteConfig=getFirebaseRemoteConfig,exports.isFirebaseRemoteConfigAvailable=isFirebaseRemoteConfigAvailable,exports.fetchRemoteConfigModuleStatus=fetchRemoteConfigModuleStatus;const MODULE_KEYS=["apis","logs","analytics","redux","storage","device","crash","debugging"];let cachedRemoteConfigInstance=null;function getFirebaseRemoteConfig(t){if(t&&typeof t=="object")return cachedRemoteConfigInstance=t,t;if(cachedRemoteConfigInstance)return cachedRemoteConfigInstance;try{const n=require("@react-native-firebase/remote-config"),e=typeof n.default=="function"?n.default():typeof n=="function"?n():n;return cachedRemoteConfigInstance=e,e}catch{return null}}function isFirebaseRemoteConfigAvailable(t){return!!getFirebaseRemoteConfig(t)}function extractValue(t){if(t!=null){if(typeof t=="boolean")return t;if(typeof t=="number")return t!==0;if(typeof t=="string"){const n=t.trim().toLowerCase();if(n==="true"||n==="1"||n==="enabled"||n==="on")return!0;if(n==="false"||n==="0"||n==="disabled"||n==="off")return!1;try{return JSON.parse(t)}catch{return}}if(typeof t.asBoolean=="function")return t.asBoolean();if(typeof t.asString=="function"){const n=t.asString(),e=n.trim().toLowerCase();if(e==="true"||e==="1"||e==="enabled"||e==="on")return!0;if(e==="false"||e==="0"||e==="disabled"||e==="off")return!1;try{return JSON.parse(n)}catch{return}}}}async function fetchRemoteConfigModuleStatus(t,n=8e3){const e=getFirebaseRemoteConfig(t);if(!e)return null;try{const s=(async()=>{typeof e.fetchAndActivate=="function"?await e.fetchAndActivate():(typeof e.fetch=="function"&&await e.fetch(),typeof e.activate=="function"&&await e.activate())})(),a=new Promise((o,i)=>setTimeout(()=>i(new Error("Remote Config fetch timeout")),n));await Promise.race([s,a]).catch(()=>{});const c={},l=["inspector_modules","inapp_inspector_modules","react_native_inapp_inspector_modules"];for(const o of l){let i;if(typeof e.getValue=="function")try{i=e.getValue(o)}catch{}else e[o]!==void 0&&(i=e[o]);const r=extractValue(i);if(r&&typeof r=="object")for(const f of MODULE_KEYS)typeof r[f]=="boolean"&&(c[f]=r[f])}for(const o of MODULE_KEYS){const i=[`inspector_module_${o}`,`inapp_inspector_${o}`,`inspector_${o}`,`inapp_inspector_module_${o}`,`rn_inspector_${o}`];for(const r of i){let f;if(typeof e.getValue=="function")try{f=e.getValue(r)}catch{}else e[r]!==void 0&&(f=e[r]);const u=extractValue(f);if(typeof u=="boolean"){c[o]=u;break}}}return c.apis===void 0&&(c.apis=!0),Object.keys(c).length>0?c:null}catch{return null}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getFirebaseRemoteConfig=getFirebaseRemoteConfig,exports.isFirebaseRemoteConfigAvailable=isFirebaseRemoteConfigAvailable,exports.fetchRemoteConfigSettings=fetchRemoteConfigSettings,exports.fetchRemoteConfigModuleStatus=fetchRemoteConfigModuleStatus;const MODULE_KEYS=["apis","logs","perf","analytics","redux","storage","device","crash","debugging","media","socket"];let cachedRemoteConfigInstance=null;function getFirebaseRemoteConfig(e){if(e&&typeof e=="object")return cachedRemoteConfigInstance=e,e;if(cachedRemoteConfigInstance)return cachedRemoteConfigInstance;try{const n=require("@react-native-firebase/remote-config"),t=typeof n.default=="function"?n.default():typeof n=="function"?n():n;return cachedRemoteConfigInstance=t,t}catch{return null}}function isFirebaseRemoteConfigAvailable(e){return!!getFirebaseRemoteConfig(e)}function extractValue(e){if(e!=null){if(typeof e=="boolean")return e;if(typeof e=="number")return e!==0;if(typeof e=="string"){const n=e.trim().toLowerCase();if(n==="true"||n==="1"||n==="enabled"||n==="on")return!0;if(n==="false"||n==="0"||n==="disabled"||n==="off")return!1;try{return JSON.parse(e)}catch{return}}if(typeof e.asBoolean=="function")return e.asBoolean();if(typeof e.asString=="function"){const n=e.asString(),t=n.trim().toLowerCase();if(t==="true"||t==="1"||t==="enabled"||t==="on")return!0;if(t==="false"||t==="0"||t==="disabled"||t==="off")return!1;try{return JSON.parse(n)}catch{return}}}}async function fetchRemoteConfigSettings(e,n=8e3){const t=getFirebaseRemoteConfig(e);if(!t)return null;try{const l=(async()=>{typeof t.fetchAndActivate=="function"?await t.fetchAndActivate():(typeof t.fetch=="function"&&await t.fetch(),typeof t.activate=="function"&&await t.activate())})(),p=new Promise((o,r)=>setTimeout(()=>r(new Error("Remote Config fetch timeout")),n));await Promise.race([l,p]).catch(()=>{});const a=o=>{if(typeof t.getValue=="function")try{return t.getValue(o)}catch{return}return t[o]},s={},i={},d=["inspector_modules","inapp_inspector_modules","react_native_inapp_inspector_modules"];for(const o of d){const r=a(o),f=extractValue(r);if(f&&typeof f=="object")for(const c of MODULE_KEYS)typeof f[c]=="boolean"&&(i[c]=f[c])}for(const o of MODULE_KEYS){const r=[`inspector_module_${o}`,`inapp_inspector_${o}`,`inspector_${o}`,`inapp_inspector_module_${o}`,`rn_inspector_${o}`];for(const f of r){const c=a(f),u=extractValue(c);if(typeof u=="boolean"){i[o]=u;break}}}Object.keys(i).length>0&&(i.apis===void 0&&(i.apis=!0),s.modules=i);const y=["inspector_capture_widget_enabled","inapp_inspector_capture_widget","inspector_floating_capture_enabled"];for(const o of y){const r=extractValue(a(o));if(typeof r=="boolean"){s.captureWidgetEnabled=r;break}}const b=["inspector_enabled","inapp_inspector_enabled"];for(const o of b){const r=extractValue(a(o));if(typeof r=="boolean"){s.enabled=r;break}}return Object.keys(s).length>0?s:null}catch{return null}}async function fetchRemoteConfigModuleStatus(e,n=8e3){return(await fetchRemoteConfigSettings(e,n))?.modules||null}
@@ -1 +1 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.setTelemetryEnabled=setTelemetryEnabled,exports.markSearchFilterUsed=markSearchFilterUsed,exports.trackActiveTelemetryHeartbeat=trackActiveTelemetryHeartbeat,exports.trackTelemetryEvent=trackTelemetryEvent,exports.trackInspectorTabView=trackInspectorTabView,exports.trackInspectorScreenView=trackInspectorScreenView,exports.trackInspectorScreenRecord=trackInspectorScreenRecord;const react_1=__importDefault(require("react")),react_native_1=require("react-native"),version_1=require("../constants/version"),settingsStore_1=require("./settingsStore"),reduxLogger_1=require("../customHooks/reduxLogger"),analyticsLogger_1=require("../customHooks/analyticsLogger"),crashHandler_1=require("../customHooks/crashHandler"),networkLogger_1=require("../customHooks/networkLogger"),NativeInspector_1=require("../native/NativeInspector"),index_1=require("./index"),telemetryConfig_1=require("../constants/telemetryConfig"),PKG_NAME="react-native-inapp-inspector",KEY_MATERIAL=`${PKG_NAME}::${telemetryConfig_1.TELEMETRY_SALT}`;function getKeystream(t,o){const i=[];let r=1518500249;for(let a=0;a<o;a++){const e=t.charCodeAt(a%t.length);r=(r*31+e*17+a*13^r>>>7)&4294967295,i.push(r>>>a%24&255)}return i}function deobfuscate(t){if(!t)return"";const o=[];for(let a=0;a<t.length;a+=2)o.push(parseInt(t.substring(a,a+2),16));const i=getKeystream(KEY_MATERIAL,o.length),r=[];for(let a=0;a<o.length;a++){const e=i[a],l=telemetryConfig_1.TELEMETRY_SALT.charCodeAt(a%telemetryConfig_1.TELEMETRY_SALT.length),c=(o[a]^e^l)&255;r.push(String.fromCharCode(c))}return r.join("")}let _cachedMid=null,_cachedSec=null;function getCredentials(){if(_cachedMid!==null&&_cachedSec!==null)return{measurementId:_cachedMid,apiSecret:_cachedSec};if(!telemetryConfig_1.ENC_MID||!telemetryConfig_1.ENC_SEC||!telemetryConfig_1.TELEMETRY_SALT)return _cachedMid="",_cachedSec="",{measurementId:"",apiSecret:""};try{_cachedMid=deobfuscate(telemetryConfig_1.ENC_MID),_cachedSec=deobfuscate(telemetryConfig_1.ENC_SEC)}catch{_cachedMid="",_cachedSec=""}return{measurementId:_cachedMid,apiSecret:_cachedSec}}function getCollectUrl(){const{measurementId:t,apiSecret:o}=getCredentials();return!t||!o?"":`https://www.google-analytics.com/mp/collect?measurement_id=${t}&api_secret=${o}`}const PING_INTERVAL_MS=1440*60*1e3;let isTelemetryEnabled=!0,_hasSearchFilterBeenUsed=!1;function setTelemetryEnabled(t){isTelemetryEnabled=t}function markSearchFilterUsed(){_hasSearchFilterBeenUsed=!0}async function getOrCreateClientId(){try{const t=await(0,settingsStore_1.loadSettings)();if(t.telemetryClientId||t.telemetryDeviceId){const e=t.telemetryClientId||t.telemetryDeviceId||"";return t.telemetryDeviceId||await(0,settingsStore_1.saveSettings)({...t,telemetryDeviceId:e}),e}const o=Math.floor(1e8+Math.random()*9e8),i=Math.floor(1e9+Math.random()*9e9),r=`${o}.${i}`,a=Date.now();return await(0,settingsStore_1.saveSettings)({...t,telemetryClientId:r,telemetryDeviceId:r,deviceFirstSeen:t.deviceFirstSeen||a}),r}catch{return`${Math.floor(1e8+Math.random()*9e8)}.${Math.floor(1e9+Math.random()*9e9)}`}}function isDeviceEmulator(){try{if(react_native_1.Platform.OS==="android"){const t=react_native_1.Platform.constants||{},o=String(t.Model||"").toLowerCase(),i=String(t.Brand||"").toLowerCase(),r=String(t.Fingerprint||"").toLowerCase(),a=String(t.Hardware||"").toLowerCase(),e=String(t.Manufacturer||"").toLowerCase();return o.includes("emulator")||o.includes("sdk")||o.includes("google_sdk")||o.includes("vbox")||i.includes("generic")||r.startsWith("generic")||a.includes("goldfish")||a.includes("ranchu")||e.includes("genymotion")}if(react_native_1.Platform.OS==="ios"){const t=react_native_1.Platform.constants||{};return String(t.Model||"").toLowerCase().includes("simulator")||!!t.isSimulator}}catch{return!1}return!1}function getDeviceLocaleInfo(){try{const t=typeof Intl<"u"&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions():{},o=t.timeZone||"unknown",i=t.locale||"unknown";let r="unknown";if(i&&i!=="unknown"){const a=i.split(/[-_]/);a.length>1&&(r=a[a.length-1].toUpperCase())}return{countryCode:r,locale:i,timeZone:o}}catch{return{countryCode:"unknown",locale:"unknown",timeZone:"unknown"}}}function getSystemMetadata(t,o){const i=react_native_1.Platform.constants,r=i?.reactNativeVersion?`${i.reactNativeVersion.major}.${i.reactNativeVersion.minor}.${i.reactNativeVersion.patch}`:"unknown",a=typeof global.HermesInternal=="object"&&global.HermesInternal!==null,e=global?.nativeFabricUIManager!==void 0,l=!!(global?._rn_bridgeless||global?.RN$Bridgeless),c=!!(typeof __DEV__<"u"&&__DEV__),n=isDeviceEmulator(),{countryCode:_,locale:d,timeZone:L}=getDeviceLocaleInfo();let m="unknown",p=1,f=1,g="phone",h="portrait";try{const s=react_native_1.Dimensions.get("window");m=`${Math.round(s.width)}x${Math.round(s.height)}`,p=react_native_1.PixelRatio.get(),f=react_native_1.PixelRatio.getFontScale(),h=s.width>s.height?"landscape":"portrait",g=react_native_1.Platform.OS==="ios"&&!!react_native_1.Platform.isPad||Math.min(s.width,s.height)>=600?"tablet":"phone"}catch{}let b="unknown";try{b=react_native_1.Appearance?.getColorScheme?.()||"unknown"}catch{}const N=!!(globalThis?.expo||globalThis?.__expo||globalThis?.__turboModuleProxy?.name==="Expo"||react_native_1.Platform.constants?.ExpoVersion);let u="non_hermes",v="jsc";if(a){v="hermes";try{const s=global.HermesInternal?.getRuntimeProperties?.()||{};u=s["OSS Release Version"]||(s["Bytecode Version"]?`bc_v${s["Bytecode Version"]}`:"hermes")}catch{u="hermes"}}else globalThis?._v8&&(v="v8");let y=!1;try{y=(0,reduxLogger_1.isReduxConnected)()}catch{}let S=!1;try{S=(0,analyticsLogger_1.isFirebaseAnalyticsPatched)()}catch{}const k=(0,NativeInspector_1.isNativeModuleAvailable)(),P=!!(react_native_1.NativeModules?.RNMMKV||globalThis?.MMKV);let w=0;try{w=(0,crashHandler_1.getCrashRecords)().length}catch{}let I="0";try{const s=(0,networkLogger_1.getNetworkLogs)().length;I=s===0?"0":s<=10?"1-10":s<=50?"11-50":s<=100?"51-100":"100+"}catch{}let M=!1;try{M=(0,index_1.isLocalDebugEnvironment)()}catch{}const D=o?.defaultTab||"apis",V=k&&o?.useNativeFab!==!1?"native_ui_thread":"js_floating_button",A=String(i?.Brand||(react_native_1.Platform.OS==="ios"?"Apple":"unknown")),B=String(i?.Model||i?.systemName||(react_native_1.Platform.OS==="ios"?"iPhone/iPad":"unknown")),R=String(i?.Manufacturer||(react_native_1.Platform.OS==="ios"?"Apple":"unknown"));let C="App",E="unknown",T="unknown",x="unknown";try{C=(0,index_1.getAppName)()||"App",E=(0,index_1.getBundleIdentifier)()||"unknown";const s=(0,index_1.getAppVersionAndBuild)();T=s.version||"unknown",x=s.build||"unknown"}catch{}const O=typeof react_1.default<"u"&&react_1.default.version?react_1.default.version:"unknown";return{pkg_name:PKG_NAME,pkg_version:version_1.LIB_VERSION,lib_version:version_1.LIB_VERSION,install_type:c?"local_dev":"bundled_production",app_name:C,bundle_id:E,app_version:T,app_build:x,react_version:O,platform:react_native_1.Platform.OS,os_version:String(react_native_1.Platform.Version||"unknown"),rn_version:r,country_code:_,device_locale:d,time_zone:L,device_brand:A,device_model:B,device_manufacturer:R,device_form_factor:g,screen_resolution:m,screen_density:p,screen_orientation:h,font_scale:f,appearance_mode:b,is_expo:N,js_engine:v,hermes_version:u,is_hermes:a,is_fabric:e,is_bridgeless:l,has_native_module:k,has_mmkv:P,fab_mode:V,default_landing_tab:D,captured_crashes_count:w,captured_apis_bracket:I,search_filter_used:_hasSearchFilterBeenUsed,is_metro_connected:M,is_dev:c,is_emulator:n,device_type:n?"emulator":"real_device",app_mode:c?"local_mode":"bundled_application",redux_attached:y,analytics_attached:S,environment:t||(c?"DEV":"PROD"),engagement_time_msec:1e3}}async function trackActiveTelemetryHeartbeat(t=!0,o){if(t===!1){isTelemetryEnabled=!1;return}if(isTelemetryEnabled=!0,process.env.NODE_ENV==="test"||typeof globalThis.jest<"u")return;const i=getCollectUrl();if(i)try{const r=await(0,settingsStore_1.loadSettings)(),a=r.telemetryLastPing||0,e=Date.now(),l=!r.deviceRegistered;if(!l&&e-a<PING_INTERVAL_MS)return;const c=await getOrCreateClientId(),n=getSystemMetadata(o,r),_={...n,device_id:c,is_new_device:l,device_first_seen:r.deviceFirstSeen||e},d=l?[{name:"active_device",params:_},{name:"first_device_install",params:_},{name:"inspector_active_heartbeat",params:_}]:[{name:"active_device",params:_},{name:"inspector_active_heartbeat",params:_}];await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:c,user_id:c,non_personalized_ads:!0,user_properties:{device_id:{value:c},pkg_name:{value:n.pkg_name},pkg_version:{value:n.pkg_version},install_type:{value:n.install_type},app_name:{value:n.app_name},bundle_id:{value:n.bundle_id},app_version:{value:n.app_version},react_version:{value:n.react_version},country:{value:n.country_code},country_code:{value:n.country_code},locale:{value:n.device_locale},time_zone:{value:n.time_zone},device_brand:{value:n.device_brand},device_model:{value:n.device_model},device_form_factor:{value:n.device_form_factor},screen_resolution:{value:n.screen_resolution},appearance_mode:{value:n.appearance_mode},is_expo:{value:String(n.is_expo)},js_engine:{value:n.js_engine},is_fabric:{value:String(n.is_fabric)},is_bridgeless:{value:String(n.is_bridgeless)},has_native_module:{value:String(n.has_native_module)},has_mmkv:{value:String(n.has_mmkv)},fab_mode:{value:n.fab_mode},default_landing_tab:{value:n.default_landing_tab},captured_crashes_count:{value:String(n.captured_crashes_count)},captured_apis_bracket:{value:n.captured_apis_bracket},search_filter_used:{value:String(n.search_filter_used)},is_metro_connected:{value:String(n.is_metro_connected)},redux_attached:{value:String(n.redux_attached)},analytics_attached:{value:String(n.analytics_attached)},platform:{value:n.platform},rn_version:{value:n.rn_version},lib_version:{value:n.lib_version}},events:d})}),await(0,settingsStore_1.saveSettings)({...r,telemetryClientId:c,telemetryDeviceId:c,deviceRegistered:!0,deviceFirstSeen:r.deviceFirstSeen||e,telemetryLastPing:e,telemetryLastActive:e})}catch{}}async function trackTelemetryEvent(t,o){if(!isTelemetryEnabled)return;const i=getCollectUrl();if(i)try{const r=await getOrCreateClientId(),a=await(0,settingsStore_1.loadSettings)().catch(()=>({})),e=getSystemMetadata(void 0,a),l={...e,device_id:r,...o,engagement_time_msec:100};await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:r,user_id:r,non_personalized_ads:!0,user_properties:{device_id:{value:r},pkg_name:{value:e.pkg_name},pkg_version:{value:e.pkg_version},install_type:{value:e.install_type},app_name:{value:e.app_name},bundle_id:{value:e.bundle_id},app_version:{value:e.app_version},react_version:{value:e.react_version},country:{value:e.country_code},country_code:{value:e.country_code},locale:{value:e.device_locale},time_zone:{value:e.time_zone},device_brand:{value:e.device_brand},device_model:{value:e.device_model},device_form_factor:{value:e.device_form_factor},screen_resolution:{value:e.screen_resolution},appearance_mode:{value:e.appearance_mode},is_expo:{value:String(e.is_expo)},js_engine:{value:e.js_engine},is_fabric:{value:String(e.is_fabric)},is_bridgeless:{value:String(e.is_bridgeless)},has_native_module:{value:String(e.has_native_module)},has_mmkv:{value:String(e.has_mmkv)},fab_mode:{value:e.fab_mode},default_landing_tab:{value:e.default_landing_tab},captured_crashes_count:{value:String(e.captured_crashes_count)},captured_apis_bracket:{value:e.captured_apis_bracket},search_filter_used:{value:String(e.search_filter_used)},is_metro_connected:{value:String(e.is_metro_connected)},redux_attached:{value:String(e.redux_attached)},analytics_attached:{value:String(e.analytics_attached)},platform:{value:e.platform},rn_version:{value:e.rn_version},lib_version:{value:e.lib_version}},events:[{name:t,params:l}]})})}catch{}}function trackInspectorTabView(t){trackTelemetryEvent("inspector_tab_view",{tab_name:t,screen_name:`tab_${t}`,screen_class:"NetworkInspector"})}function trackInspectorScreenView(t){trackTelemetryEvent("screen_view",{screen_name:t,screen_class:"NetworkInspector"})}function trackInspectorScreenRecord(t,o="screen"){trackTelemetryEvent("inspector_screen_record",{action:t,recording_type:o})}
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.setTelemetryEnabled=setTelemetryEnabled,exports.markSearchFilterUsed=markSearchFilterUsed,exports.trackActiveTelemetryHeartbeat=trackActiveTelemetryHeartbeat,exports.trackTelemetryEvent=trackTelemetryEvent,exports.trackInspectorTabView=trackInspectorTabView,exports.trackInspectorScreenView=trackInspectorScreenView,exports.trackInspectorScreenRecord=trackInspectorScreenRecord;const react_1=__importDefault(require("react")),react_native_1=require("react-native"),version_1=require("../constants/version"),settingsStore_1=require("./settingsStore"),reduxLogger_1=require("../customHooks/reduxLogger"),analyticsLogger_1=require("../customHooks/analyticsLogger"),crashHandler_1=require("../customHooks/crashHandler"),networkLogger_1=require("../customHooks/networkLogger"),NativeInspector_1=require("../native/NativeInspector"),index_1=require("./index"),telemetryConfig_1=require("../constants/telemetryConfig"),PKG_NAME="react-native-inapp-inspector",KEY_MATERIAL=`${PKG_NAME}::${telemetryConfig_1.TELEMETRY_SALT}`;function getKeystream(e,n){const i=[];let o=1518500249;for(let r=0;r<n;r++){const t=e.charCodeAt(r%e.length);o=(o*31+t*17+r*13^o>>>7)&4294967295,i.push(o>>>r%24&255)}return i}function deobfuscate(e){if(!e)return"";const n=[];for(let r=0;r<e.length;r+=2)n.push(parseInt(e.substring(r,r+2),16));const i=getKeystream(KEY_MATERIAL,n.length),o=[];for(let r=0;r<n.length;r++){const t=i[r],l=telemetryConfig_1.TELEMETRY_SALT.charCodeAt(r%telemetryConfig_1.TELEMETRY_SALT.length),c=(n[r]^t^l)&255;o.push(String.fromCharCode(c))}return o.join("")}let _cachedMid=null,_cachedSec=null;function getCredentials(){if(_cachedMid!==null&&_cachedSec!==null)return{measurementId:_cachedMid,apiSecret:_cachedSec};if(!telemetryConfig_1.ENC_MID||!telemetryConfig_1.ENC_SEC||!telemetryConfig_1.TELEMETRY_SALT)return _cachedMid="",_cachedSec="",{measurementId:"",apiSecret:""};try{_cachedMid=deobfuscate(telemetryConfig_1.ENC_MID),_cachedSec=deobfuscate(telemetryConfig_1.ENC_SEC)}catch{_cachedMid="",_cachedSec=""}return{measurementId:_cachedMid,apiSecret:_cachedSec}}function getCollectUrl(){const{measurementId:e,apiSecret:n}=getCredentials();return!e||!n?"":`https://www.google-analytics.com/mp/collect?measurement_id=${e}&api_secret=${n}`}function getPlatformUserAgent(e){try{const n=react_native_1.Platform.OS,i=String(e.os_version||(n==="ios"?"17.0":"13.0")),o=(e.device_locale||"en_US").replace("_","-");if(n==="android"){const r=e.device_model||"Android";return`Mozilla/5.0 (Linux; U; Android ${i}; ${o}; ${r}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.0.0 Mobile Safari/537.36 (react-native-inapp-inspector/${version_1.LIB_VERSION})`}else if(n==="ios"){const r=i.replace(/\./g,"_");return`Mozilla/5.0 (${e.device_model||"iPhone"}; CPU iPhone OS ${r} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 (react-native-inapp-inspector/${version_1.LIB_VERSION})`}return`${e.app_name||"App"}/${e.app_version||"1.0"} (${n}; ${i}) react-native-inapp-inspector/${version_1.LIB_VERSION}`}catch{return`react-native-inapp-inspector/${version_1.LIB_VERSION}`}}function getClientCollectUrl(e,n,i){const{measurementId:o}=getCredentials();if(!o)return"";const r=String(Math.floor(Date.now()/1e3));return`https://www.google-analytics.com/g/collect?${new URLSearchParams({v:"2",tid:o,cid:i,en:e,_p:String(Math.floor(1e6+Math.random()*9e6)),ul:(n.device_locale||"en_US").toLowerCase().replace("_","-"),sr:n.screen_resolution||"1080x1920",_s:"1",_ee:"1",seg:"1",_et:"1000",sid:r,sct:"1",dl:`https://${n.bundle_id||"app.native"}/inspector`,dt:`${n.app_name||"App"} - Inspector`,"ep.country_code":n.country_code||"unknown","ep.app_name":n.app_name||"App","ep.platform":n.platform||react_native_1.Platform.OS,"ep.pkg_version":n.pkg_version||version_1.LIB_VERSION,"ep.install_type":n.install_type||"local_dev","ep.js_engine":n.js_engine||"hermes","ep.rn_version":n.rn_version||"","ep.device_brand":n.device_brand||"","ep.device_model":n.device_model||""}).toString()}`}const PING_INTERVAL_MS=1440*60*1e3;let isTelemetryEnabled=!0,_hasSearchFilterBeenUsed=!1;function setTelemetryEnabled(e){isTelemetryEnabled=e}function markSearchFilterUsed(){_hasSearchFilterBeenUsed=!0}async function getOrCreateClientId(){try{const e=await(0,settingsStore_1.loadSettings)();if(e.telemetryClientId||e.telemetryDeviceId){const t=e.telemetryClientId||e.telemetryDeviceId||"";return e.telemetryDeviceId||await(0,settingsStore_1.saveSettings)({...e,telemetryDeviceId:t}),t}const n=Math.floor(1e8+Math.random()*9e8),i=Math.floor(1e9+Math.random()*9e9),o=`${n}.${i}`,r=Date.now();return await(0,settingsStore_1.saveSettings)({...e,telemetryClientId:o,telemetryDeviceId:o,deviceFirstSeen:e.deviceFirstSeen||r}),o}catch{return`${Math.floor(1e8+Math.random()*9e8)}.${Math.floor(1e9+Math.random()*9e9)}`}}function isDeviceEmulator(){try{if(react_native_1.Platform.OS==="android"){const e=react_native_1.Platform.constants||{},n=String(e.Model||"").toLowerCase(),i=String(e.Brand||"").toLowerCase(),o=String(e.Fingerprint||"").toLowerCase(),r=String(e.Hardware||"").toLowerCase(),t=String(e.Manufacturer||"").toLowerCase();return n.includes("emulator")||n.includes("sdk")||n.includes("google_sdk")||n.includes("vbox")||i.includes("generic")||o.startsWith("generic")||r.includes("goldfish")||r.includes("ranchu")||t.includes("genymotion")}if(react_native_1.Platform.OS==="ios"){const e=react_native_1.Platform.constants||{};return String(e.Model||"").toLowerCase().includes("simulator")||!!e.isSimulator}}catch{return!1}return!1}function getDeviceLocaleInfo(){try{const e=typeof Intl<"u"&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions():{},n=e.timeZone||"unknown",i=e.locale||"unknown";let o="unknown";if(i&&i!=="unknown"){const r=i.split(/[-_]/);r.length>1&&(o=r[r.length-1].toUpperCase())}return{countryCode:o,locale:i,timeZone:n}}catch{return{countryCode:"unknown",locale:"unknown",timeZone:"unknown"}}}function getSystemMetadata(e,n){const i=react_native_1.Platform.constants,o=i?.reactNativeVersion?`${i.reactNativeVersion.major}.${i.reactNativeVersion.minor}.${i.reactNativeVersion.patch}`:"unknown",r=typeof global.HermesInternal=="object"&&global.HermesInternal!==null,t=global?.nativeFabricUIManager!==void 0,l=!!(global?._rn_bridgeless||global?.RN$Bridgeless),c=!!(typeof __DEV__<"u"&&__DEV__),a=isDeviceEmulator(),{countryCode:_,locale:u,timeZone:d}=getDeviceLocaleInfo();let m="unknown",f=1,g=1,h="phone",b="portrait";try{const s=react_native_1.Dimensions.get("window");m=`${Math.round(s.width)}x${Math.round(s.height)}`,f=react_native_1.PixelRatio.get(),g=react_native_1.PixelRatio.getFontScale(),b=s.width>s.height?"landscape":"portrait",h=react_native_1.Platform.OS==="ios"&&!!react_native_1.Platform.isPad||Math.min(s.width,s.height)>=600?"tablet":"phone"}catch{}let y="unknown";try{y=react_native_1.Appearance?.getColorScheme?.()||"unknown"}catch{}const x=!!(globalThis?.expo||globalThis?.__expo||globalThis?.__turboModuleProxy?.name==="Expo"||react_native_1.Platform.constants?.ExpoVersion);let p="non_hermes",v="jsc";if(r){v="hermes";try{const s=global.HermesInternal?.getRuntimeProperties?.()||{};p=s["OSS Release Version"]||(s["Bytecode Version"]?`bc_v${s["Bytecode Version"]}`:"hermes")}catch{p="hermes"}}else globalThis?._v8&&(v="v8");let S=!1;try{S=(0,reduxLogger_1.isReduxConnected)()}catch{}let k=!1;try{k=(0,analyticsLogger_1.isFirebaseAnalyticsPatched)()}catch{}const w=(0,NativeInspector_1.isNativeModuleAvailable)(),A=!!(react_native_1.NativeModules?.RNMMKV||globalThis?.MMKV);let I=0;try{I=(0,crashHandler_1.getCrashRecords)().length}catch{}let M="0";try{const s=(0,networkLogger_1.getNetworkLogs)().length;M=s===0?"0":s<=10?"1-10":s<=50?"11-50":s<=100?"51-100":"100+"}catch{}let E=!1;try{E=(0,index_1.isLocalDebugEnvironment)()}catch{}const N=n?.defaultTab||"apis",V=w&&n?.useNativeFab!==!1?"native_ui_thread":"js_floating_button",$=String(i?.Brand||(react_native_1.Platform.OS==="ios"?"Apple":"unknown")),O=String(i?.Model||i?.systemName||(react_native_1.Platform.OS==="ios"?"iPhone/iPad":"unknown")),D=String(i?.Manufacturer||(react_native_1.Platform.OS==="ios"?"Apple":"unknown"));let C="App",T="unknown",P="unknown",L="unknown";try{C=(0,index_1.getAppName)()||"App",T=(0,index_1.getBundleIdentifier)()||"unknown";const s=(0,index_1.getAppVersionAndBuild)();P=s.version||"unknown",L=s.build||"unknown"}catch{}const R=typeof react_1.default<"u"&&react_1.default.version?react_1.default.version:"unknown";return{pkg_name:PKG_NAME,pkg_version:version_1.LIB_VERSION,lib_version:version_1.LIB_VERSION,install_type:c?"local_dev":"bundled_production",app_name:C,bundle_id:T,app_version:P,app_build:L,react_version:R,platform:react_native_1.Platform.OS,os_version:String(react_native_1.Platform.Version||"unknown"),rn_version:o,country_code:_,device_locale:u,time_zone:d,device_brand:$,device_model:O,device_manufacturer:D,device_form_factor:h,screen_resolution:m,screen_density:f,screen_orientation:b,font_scale:g,appearance_mode:y,is_expo:x,js_engine:v,hermes_version:p,is_hermes:r,is_fabric:t,is_bridgeless:l,has_native_module:w,has_mmkv:A,fab_mode:V,default_landing_tab:N,captured_crashes_count:I,captured_apis_bracket:M,search_filter_used:_hasSearchFilterBeenUsed,is_metro_connected:E,is_dev:c,is_emulator:a,device_type:a?"emulator":"real_device",app_mode:c?"local_mode":"bundled_application",redux_attached:S,analytics_attached:k,environment:e||(c?"DEV":"PROD"),engagement_time_msec:1e3}}async function trackActiveTelemetryHeartbeat(e=!0,n){if(e===!1){isTelemetryEnabled=!1;return}if(isTelemetryEnabled=!0,process.env.NODE_ENV==="test"||typeof globalThis.jest<"u")return;const i=getCollectUrl();if(i)try{const o=await(0,settingsStore_1.loadSettings)(),r=o.telemetryLastPing||0,t=Date.now(),l=!o.deviceRegistered;if(!l&&t-r<PING_INTERVAL_MS)return;const c=await getOrCreateClientId(),a=getSystemMetadata(n,o),_={...a,device_id:c,is_new_device:l,device_first_seen:o.deviceFirstSeen||t},u=l?[{name:"first_open",params:_},{name:"first_device_install",params:_},{name:"session_start",params:_},{name:"active_device",params:_},{name:"inspector_active_heartbeat",params:_}]:[{name:"session_start",params:_},{name:"app_open",params:_},{name:"active_device",params:_},{name:"inspector_active_heartbeat",params:_}],d=getClientCollectUrl(l?"first_open":"session_start",a,c);d&&fetch(d,{method:"POST",headers:{"User-Agent":getPlatformUserAgent(a)}}).catch(()=>{}),await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:c,user_id:c,non_personalized_ads:!0,user_properties:{device_id:{value:c},pkg_name:{value:a.pkg_name},pkg_version:{value:a.pkg_version},install_type:{value:a.install_type},app_name:{value:a.app_name},bundle_id:{value:a.bundle_id},app_version:{value:a.app_version},react_version:{value:a.react_version},country:{value:a.country_code},country_code:{value:a.country_code},locale:{value:a.device_locale},time_zone:{value:a.time_zone},device_brand:{value:a.device_brand},device_model:{value:a.device_model},device_form_factor:{value:a.device_form_factor},screen_resolution:{value:a.screen_resolution},appearance_mode:{value:a.appearance_mode},is_expo:{value:String(a.is_expo)},js_engine:{value:a.js_engine},is_fabric:{value:String(a.is_fabric)},is_bridgeless:{value:String(a.is_bridgeless)},has_native_module:{value:String(a.has_native_module)},has_mmkv:{value:String(a.has_mmkv)},fab_mode:{value:a.fab_mode},default_landing_tab:{value:a.default_landing_tab},captured_crashes_count:{value:String(a.captured_crashes_count)},captured_apis_bracket:{value:a.captured_apis_bracket},search_filter_used:{value:String(a.search_filter_used)},is_metro_connected:{value:String(a.is_metro_connected)},redux_attached:{value:String(a.redux_attached)},analytics_attached:{value:String(a.analytics_attached)},platform:{value:a.platform},rn_version:{value:a.rn_version},lib_version:{value:a.lib_version}},events:u})}),await(0,settingsStore_1.saveSettings)({...o,telemetryClientId:c,telemetryDeviceId:c,deviceRegistered:!0,deviceFirstSeen:o.deviceFirstSeen||t,telemetryLastPing:t,telemetryLastActive:t})}catch{}}async function trackTelemetryEvent(e,n){if(!isTelemetryEnabled)return;const i=getCollectUrl();if(i)try{const o=await getOrCreateClientId(),r=await(0,settingsStore_1.loadSettings)().catch(()=>({})),t=getSystemMetadata(void 0,r),l={...t,device_id:o,...n,engagement_time_msec:100},c=getClientCollectUrl(e,l,o);c&&fetch(c,{method:"POST",headers:{"User-Agent":getPlatformUserAgent(t)}}).catch(()=>{}),await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:o,user_id:o,non_personalized_ads:!0,user_properties:{device_id:{value:o},pkg_name:{value:t.pkg_name},pkg_version:{value:t.pkg_version},install_type:{value:t.install_type},app_name:{value:t.app_name},bundle_id:{value:t.bundle_id},app_version:{value:t.app_version},react_version:{value:t.react_version},country:{value:t.country_code},country_code:{value:t.country_code},locale:{value:t.device_locale},time_zone:{value:t.time_zone},device_brand:{value:t.device_brand},device_model:{value:t.device_model},device_form_factor:{value:t.device_form_factor},screen_resolution:{value:t.screen_resolution},appearance_mode:{value:t.appearance_mode},is_expo:{value:String(t.is_expo)},js_engine:{value:t.js_engine},is_fabric:{value:String(t.is_fabric)},is_bridgeless:{value:String(t.is_bridgeless)},has_native_module:{value:String(t.has_native_module)},has_mmkv:{value:String(t.has_mmkv)},fab_mode:{value:t.fab_mode},default_landing_tab:{value:t.default_landing_tab},captured_crashes_count:{value:String(t.captured_crashes_count)},captured_apis_bracket:{value:t.captured_apis_bracket},search_filter_used:{value:String(t.search_filter_used)},is_metro_connected:{value:String(t.is_metro_connected)},redux_attached:{value:String(t.redux_attached)},analytics_attached:{value:String(t.analytics_attached)},platform:{value:t.platform},rn_version:{value:t.rn_version},lib_version:{value:t.lib_version}},events:[{name:e,params:l}]})})}catch{}}function trackInspectorTabView(e){trackTelemetryEvent("inspector_tab_view",{tab_name:e,screen_name:`tab_${e}`,screen_class:"NetworkInspector"})}function trackInspectorScreenView(e){trackTelemetryEvent("screen_view",{screen_name:e,screen_class:"NetworkInspector"})}function trackInspectorScreenRecord(e,n="screen"){trackTelemetryEvent("inspector_screen_record",{action:e,recording_type:n})}