react-native-inapp-inspector 1.1.34 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +123 -101
  2. package/android/build.gradle +13 -1
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +904 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.kt +17 -0
  5. package/dist/commonjs/components/ConsoleLogCard.js +57 -56
  6. package/dist/commonjs/components/CopyButton.js +10 -1
  7. package/dist/commonjs/components/ErrorBoundary.js +3 -0
  8. package/dist/commonjs/components/Inspector/AnalyticsTab.js +7 -3
  9. package/dist/commonjs/components/Inspector/BundleTab.js +20 -20
  10. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -1
  11. package/dist/commonjs/components/Inspector/CrashDetail.js +16 -12
  12. package/dist/commonjs/components/Inspector/CrashTab.js +97 -90
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +28 -24
  14. package/dist/commonjs/components/Inspector/MainScreen.js +20 -103
  15. package/dist/commonjs/components/Inspector/NetworkTab.js +143 -10
  16. package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
  17. package/dist/commonjs/components/Inspector/ReduxDetail.js +24 -19
  18. package/dist/commonjs/components/Inspector/ReduxTab.js +30 -18
  19. package/dist/commonjs/components/Inspector/SettingsPanel.js +1578 -754
  20. package/dist/commonjs/components/Inspector/TabBar.js +6 -3
  21. package/dist/commonjs/components/LogCard.js +27 -9
  22. package/dist/commonjs/components/MetaAccordion.js +42 -0
  23. package/dist/commonjs/components/NetworkIcons.d.ts +10 -0
  24. package/dist/commonjs/components/NetworkIcons.js +53 -1
  25. package/dist/commonjs/components/Toast.js +3 -3
  26. package/dist/commonjs/components/TouchableScale.d.ts +5 -2
  27. package/dist/commonjs/components/TouchableScale.js +30 -32
  28. package/dist/commonjs/constants/index.d.ts +1 -2
  29. package/dist/commonjs/constants/index.js +4 -0
  30. package/dist/commonjs/constants/version.d.ts +1 -1
  31. package/dist/commonjs/constants/version.js +1 -1
  32. package/dist/commonjs/customHooks/analyticsLogger.d.ts +6 -0
  33. package/dist/commonjs/customHooks/analyticsLogger.js +16 -5
  34. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +2 -0
  35. package/dist/commonjs/customHooks/bundleAnalyzer.js +26 -17
  36. package/dist/commonjs/customHooks/consoleLogger.d.ts +2 -0
  37. package/dist/commonjs/customHooks/consoleLogger.js +10 -1
  38. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -0
  39. package/dist/commonjs/customHooks/crashHandler.js +17 -1
  40. package/dist/commonjs/customHooks/networkLogger.d.ts +2 -0
  41. package/dist/commonjs/customHooks/networkLogger.js +12 -1
  42. package/dist/commonjs/customHooks/performanceTracker.d.ts +3 -1
  43. package/dist/commonjs/customHooks/performanceTracker.js +18 -4
  44. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -0
  45. package/dist/commonjs/customHooks/reduxLogger.js +10 -1
  46. package/dist/commonjs/helpers/index.js +10 -1
  47. package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
  48. package/dist/commonjs/helpers/settingsStore.js +59 -3
  49. package/dist/commonjs/i18n/locales/en.json +96 -28
  50. package/dist/commonjs/index.d.ts +1 -0
  51. package/dist/commonjs/index.js +307 -73
  52. package/dist/commonjs/native/NativeInspector.d.ts +125 -0
  53. package/dist/commonjs/native/NativeInspector.js +313 -0
  54. package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
  55. package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
  56. package/dist/commonjs/styles/AppColors.d.ts +28 -0
  57. package/dist/commonjs/styles/AppColors.js +30 -0
  58. package/dist/commonjs/styles/index.js +6 -6
  59. package/dist/commonjs/types/enums.d.ts +1 -1
  60. package/dist/commonjs/types/interfaces.d.ts +9 -0
  61. package/dist/esm/components/ConsoleLogCard.js +58 -57
  62. package/dist/esm/components/CopyButton.js +10 -1
  63. package/dist/esm/components/ErrorBoundary.js +3 -0
  64. package/dist/esm/components/Inspector/AnalyticsTab.js +7 -3
  65. package/dist/esm/components/Inspector/BundleTab.js +20 -20
  66. package/dist/esm/components/Inspector/ConsoleTab.js +1 -1
  67. package/dist/esm/components/Inspector/CrashDetail.js +16 -12
  68. package/dist/esm/components/Inspector/CrashTab.js +97 -90
  69. package/dist/esm/components/Inspector/InspectorHeader.js +29 -25
  70. package/dist/esm/components/Inspector/MainScreen.js +21 -71
  71. package/dist/esm/components/Inspector/NetworkTab.js +145 -12
  72. package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
  73. package/dist/esm/components/Inspector/ReduxDetail.js +24 -19
  74. package/dist/esm/components/Inspector/ReduxTab.js +30 -18
  75. package/dist/esm/components/Inspector/SettingsPanel.js +1582 -758
  76. package/dist/esm/components/Inspector/TabBar.js +7 -4
  77. package/dist/esm/components/LogCard.js +27 -9
  78. package/dist/esm/components/MetaAccordion.js +42 -0
  79. package/dist/esm/components/NetworkIcons.d.ts +10 -0
  80. package/dist/esm/components/NetworkIcons.js +42 -0
  81. package/dist/esm/components/Toast.js +3 -3
  82. package/dist/esm/components/TouchableScale.d.ts +5 -2
  83. package/dist/esm/components/TouchableScale.js +31 -33
  84. package/dist/esm/constants/index.d.ts +1 -2
  85. package/dist/esm/constants/index.js +4 -0
  86. package/dist/esm/constants/version.d.ts +1 -1
  87. package/dist/esm/constants/version.js +1 -1
  88. package/dist/esm/customHooks/analyticsLogger.d.ts +6 -0
  89. package/dist/esm/customHooks/analyticsLogger.js +12 -4
  90. package/dist/esm/customHooks/bundleAnalyzer.d.ts +2 -0
  91. package/dist/esm/customHooks/bundleAnalyzer.js +23 -16
  92. package/dist/esm/customHooks/consoleLogger.d.ts +2 -0
  93. package/dist/esm/customHooks/consoleLogger.js +7 -0
  94. package/dist/esm/customHooks/crashHandler.d.ts +2 -0
  95. package/dist/esm/customHooks/crashHandler.js +14 -0
  96. package/dist/esm/customHooks/networkLogger.d.ts +2 -0
  97. package/dist/esm/customHooks/networkLogger.js +9 -0
  98. package/dist/esm/customHooks/performanceTracker.d.ts +3 -1
  99. package/dist/esm/customHooks/performanceTracker.js +15 -3
  100. package/dist/esm/customHooks/reduxLogger.d.ts +2 -0
  101. package/dist/esm/customHooks/reduxLogger.js +7 -0
  102. package/dist/esm/helpers/index.js +10 -1
  103. package/dist/esm/helpers/settingsStore.d.ts +9 -0
  104. package/dist/esm/helpers/settingsStore.js +58 -3
  105. package/dist/esm/i18n/locales/en.json +96 -28
  106. package/dist/esm/index.d.ts +1 -0
  107. package/dist/esm/index.js +279 -59
  108. package/dist/esm/native/NativeInspector.d.ts +125 -0
  109. package/dist/esm/native/NativeInspector.js +289 -0
  110. package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
  111. package/dist/esm/native/NativeNetworkInspector.js +2 -0
  112. package/dist/esm/styles/AppColors.d.ts +28 -0
  113. package/dist/esm/styles/AppColors.js +30 -0
  114. package/dist/esm/styles/index.js +6 -6
  115. package/dist/esm/types/enums.d.ts +1 -1
  116. package/dist/esm/types/interfaces.d.ts +9 -0
  117. package/ios/NetworkInspectorModule.h +6 -0
  118. package/ios/NetworkInspectorModule.m +720 -5
  119. package/package.json +15 -3
  120. package/react-native-inapp-inspector.podspec +7 -2
  121. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
  122. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +0 -28
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setupGlobalCrashHandler = exports.exportCrashReport = exports.simulateTestCrash = exports.recordCustomCrash = exports.handleInterceptedCrash = exports.emitCrashEvent = exports.subscribeCrashEvents = exports.clearCrashRecords = exports.getCrashRecords = exports.computeCrashFingerprint = exports.parseCrashStackTrace = exports.getCrashBreadcrumbs = exports.clearCrashBreadcrumbs = exports.recordUserActionBreadcrumb = exports.recordReduxBreadcrumb = exports.recordNetworkBreadcrumb = exports.recordNavigationBreadcrumb = exports.addCrashBreadcrumb = exports.setMaxCrashLogsLimit = exports.CrashExportFormat = void 0;
3
+ exports.setupGlobalCrashHandler = exports.exportCrashReport = exports.simulateTestCrash = exports.recordCustomCrash = exports.handleInterceptedCrash = exports.emitCrashEvent = exports.subscribeCrashEvents = exports.clearCrashRecords = exports.getCrashRecords = exports.computeCrashFingerprint = exports.parseCrashStackTrace = exports.getCrashBreadcrumbs = exports.clearCrashBreadcrumbs = exports.recordUserActionBreadcrumb = exports.recordReduxBreadcrumb = exports.recordNetworkBreadcrumb = exports.recordNavigationBreadcrumb = exports.addCrashBreadcrumb = exports.setMaxCrashLogsLimit = exports.getCrashModuleEnabled = exports.setCrashModuleEnabled = exports.CrashExportFormat = void 0;
4
4
  const react_native_1 = require("react-native");
5
5
  const enums_1 = require("../types/enums");
6
6
  Object.defineProperty(exports, "CrashExportFormat", { enumerable: true, get: function () { return enums_1.CrashExportFormat; } });
7
7
  const consoleLogger_1 = require("./consoleLogger");
8
+ const NativeInspector_1 = require("../native/NativeInspector");
8
9
  const i18n_1 = require("../i18n");
9
10
  let crashListeners = [];
10
11
  let isCrashHandlerInitialized = false;
@@ -14,6 +15,13 @@ let breadcrumbsStore = [];
14
15
  const MAX_BREADCRUMBS = 50;
15
16
  let maxStoredCrashes = 100;
16
17
  const appStartTime = Date.now();
18
+ let isCrashModuleEnabled = false;
19
+ const setCrashModuleEnabled = (enabled) => {
20
+ isCrashModuleEnabled = enabled;
21
+ };
22
+ exports.setCrashModuleEnabled = setCrashModuleEnabled;
23
+ const getCrashModuleEnabled = () => isCrashModuleEnabled;
24
+ exports.getCrashModuleEnabled = getCrashModuleEnabled;
17
25
  // ─── BREADCRUMB MANAGERS ───────────────────────────────────────────────────────
18
26
  const setMaxCrashLogsLimit = (max) => {
19
27
  maxStoredCrashes = Math.max(10, max);
@@ -23,6 +31,8 @@ const setMaxCrashLogsLimit = (max) => {
23
31
  };
24
32
  exports.setMaxCrashLogsLimit = setMaxCrashLogsLimit;
25
33
  const addCrashBreadcrumb = (type, message, data) => {
34
+ if (!isCrashModuleEnabled)
35
+ return;
26
36
  try {
27
37
  const entry = {
28
38
  type,
@@ -375,6 +385,12 @@ const handleInterceptedCrash = (errorOrTitle, rawStack, isFatal = false, customT
375
385
  logId: log?.id,
376
386
  crashRecord,
377
387
  });
388
+ // Ensure native floating icon is visible & badged even if React UI is broken
389
+ try {
390
+ (0, NativeInspector_1.showNativeFloatingButton)();
391
+ (0, NativeInspector_1.setNativeFloatingButtonBadge)(true);
392
+ }
393
+ catch { }
378
394
  return crashRecord;
379
395
  }
380
396
  catch (err) {
@@ -12,6 +12,8 @@ type NetworkLog = {
12
12
  requestHeaders?: Record<string, string>;
13
13
  responseHeaders?: Record<string, string>;
14
14
  };
15
+ export declare const setNetworkModuleEnabled: (enabled: boolean) => void;
16
+ export declare const getNetworkModuleEnabled: () => boolean;
15
17
  export declare const subscribeNetworkLogs: (callback: (logs: NetworkLog[]) => void) => () => void;
16
18
  export declare const clearNetworkLogs: () => void;
17
19
  export declare const getNetworkLogs: () => NetworkLog[];
@@ -3,12 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.addAxiosInterceptors = exports.setupNetworkLogger = exports.getNetworkLogs = exports.clearNetworkLogs = exports.subscribeNetworkLogs = void 0;
6
+ exports.addAxiosInterceptors = exports.setupNetworkLogger = exports.getNetworkLogs = exports.clearNetworkLogs = exports.subscribeNetworkLogs = exports.getNetworkModuleEnabled = exports.setNetworkModuleEnabled = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
8
  const crashHandler_1 = require("./crashHandler");
9
9
  let logs = [];
10
10
  let listeners = [];
11
11
  let counter = 0;
12
+ let isNetworkModuleEnabled = true;
13
+ const setNetworkModuleEnabled = (enabled) => {
14
+ isNetworkModuleEnabled = enabled;
15
+ };
16
+ exports.setNetworkModuleEnabled = setNetworkModuleEnabled;
17
+ const getNetworkModuleEnabled = () => isNetworkModuleEnabled;
18
+ exports.getNetworkModuleEnabled = getNetworkModuleEnabled;
12
19
  const ALLOWED_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
13
20
  const IGNORED_URL_PATTERNS = [
14
21
  /\/symbolicate(?:[/?#]|$)/i,
@@ -121,6 +128,8 @@ const notify = () => {
121
128
  listeners.forEach((cb) => cb(snapshot));
122
129
  };
123
130
  const addOrUpdateLog = (log) => {
131
+ if (!isNetworkModuleEnabled)
132
+ return;
124
133
  const method = log.method?.toUpperCase();
125
134
  if (!ALLOWED_METHODS.includes(method))
126
135
  return;
@@ -144,6 +153,8 @@ const setupNetworkLogger = () => {
144
153
  const originalFetch = globalThis.fetch;
145
154
  if (originalFetch) {
146
155
  globalThis.fetch = async (url, options = {}) => {
156
+ if (!isNetworkModuleEnabled)
157
+ return originalFetch(url, options);
147
158
  const method = (options?.method || "GET").toUpperCase();
148
159
  if (!ALLOWED_METHODS.includes(method))
149
160
  return originalFetch(url, options);
@@ -77,6 +77,8 @@ export declare function getCallerSourceFile(fallbackName?: string): string;
77
77
  export declare const getInitialRenderProfiles: () => ComponentRenderProfile[];
78
78
  export declare const getInitialPerformanceEvents: () => PerformanceEvent[];
79
79
  export declare const INITIAL_EVENTS: PerformanceEvent[];
80
+ export declare const setPerformanceModuleEnabled: (enabled: boolean) => void;
81
+ export declare const getPerformanceModuleEnabled: () => boolean;
80
82
  export declare const subscribeRenderProfiles: (listener: (profiles: ComponentRenderProfile[]) => void) => () => void;
81
83
  export declare const getRenderProfiles: () => ComponentRenderProfile[];
82
84
  export declare const registerComponentProfile: (profile: ComponentRenderProfile) => void;
@@ -129,7 +131,7 @@ export declare const useComponentProfiler: (componentName: string, options?: {
129
131
  sourceFile?: string;
130
132
  propsToCompare?: Record<string, any>;
131
133
  }) => void;
132
- export declare const usePerformanceTracker: () => {
134
+ export declare const usePerformanceTracker: (enabled?: boolean) => {
133
135
  isRecording: boolean;
134
136
  setIsRecording: import("react").Dispatch<import("react").SetStateAction<boolean>>;
135
137
  currentFps: number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = exports.usePerformanceTracker = exports.useComponentProfiler = exports.measureAsync = exports.trackHeavyTask = exports.useNavigationProfiler = exports.trackNavigationTransition = exports.getHermesMemoryStats = exports.trackComponentRender = exports.registerComponentProfile = exports.getRenderProfiles = exports.subscribeRenderProfiles = exports.INITIAL_EVENTS = exports.getInitialPerformanceEvents = exports.getInitialRenderProfiles = exports.generateFixSnippet = void 0;
3
+ exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = exports.usePerformanceTracker = exports.useComponentProfiler = exports.measureAsync = exports.trackHeavyTask = exports.useNavigationProfiler = exports.trackNavigationTransition = exports.getHermesMemoryStats = exports.trackComponentRender = exports.registerComponentProfile = exports.getRenderProfiles = exports.subscribeRenderProfiles = exports.getPerformanceModuleEnabled = exports.setPerformanceModuleEnabled = exports.INITIAL_EVENTS = exports.getInitialPerformanceEvents = exports.getInitialRenderProfiles = exports.generateFixSnippet = void 0;
4
4
  exports.getCallerSourceFile = getCallerSourceFile;
5
5
  const AppColors_1 = require("../styles/AppColors");
6
6
  const i18n_1 = require("../i18n");
@@ -177,6 +177,13 @@ exports.getInitialRenderProfiles = getInitialRenderProfiles;
177
177
  const getInitialPerformanceEvents = () => [];
178
178
  exports.getInitialPerformanceEvents = getInitialPerformanceEvents;
179
179
  exports.INITIAL_EVENTS = [];
180
+ let isPerformanceModuleEnabled = false;
181
+ const setPerformanceModuleEnabled = (enabled) => {
182
+ isPerformanceModuleEnabled = enabled;
183
+ };
184
+ exports.setPerformanceModuleEnabled = setPerformanceModuleEnabled;
185
+ const getPerformanceModuleEnabled = () => isPerformanceModuleEnabled;
186
+ exports.getPerformanceModuleEnabled = getPerformanceModuleEnabled;
180
187
  const globalRenderRegistry = new Map();
181
188
  const renderListeners = new Set();
182
189
  const notifyRenderListeners = () => {
@@ -199,11 +206,15 @@ exports.subscribeRenderProfiles = subscribeRenderProfiles;
199
206
  const getRenderProfiles = () => Array.from(globalRenderRegistry.values());
200
207
  exports.getRenderProfiles = getRenderProfiles;
201
208
  const registerComponentProfile = (profile) => {
209
+ if (!isPerformanceModuleEnabled)
210
+ return;
202
211
  globalRenderRegistry.set(profile.name, profile);
203
212
  notifyRenderListeners();
204
213
  };
205
214
  exports.registerComponentProfile = registerComponentProfile;
206
215
  const trackComponentRender = (params) => {
216
+ if (!isPerformanceModuleEnabled)
217
+ return;
207
218
  const existing = globalRenderRegistry.get(params.name);
208
219
  const now = Date.now();
209
220
  const renderTimeMs = params.renderTimeMs ?? 1.5;
@@ -451,7 +462,8 @@ const useComponentProfiler = (componentName, options) => {
451
462
  });
452
463
  };
453
464
  exports.useComponentProfiler = useComponentProfiler;
454
- const usePerformanceTracker = () => {
465
+ const usePerformanceTracker = (enabled = true) => {
466
+ const isTrackerActive = enabled && isPerformanceModuleEnabled;
455
467
  const [isRecording, setIsRecording] = (0, react_1.useState)(true);
456
468
  const [currentFps, setCurrentFps] = (0, react_1.useState)(60);
457
469
  const [minFps, setMinFps] = (0, react_1.useState)(60);
@@ -465,6 +477,8 @@ const usePerformanceTracker = () => {
465
477
  const [renderProfiles, setRenderProfiles] = (0, react_1.useState)(() => (0, exports.getRenderProfiles)());
466
478
  const [events, setEvents] = (0, react_1.useState)(() => (0, exports.getPerformanceEvents)());
467
479
  (0, react_1.useEffect)(() => {
480
+ if (!isTrackerActive)
481
+ return;
468
482
  const unsubRender = (0, exports.subscribeRenderProfiles)(profiles => {
469
483
  setRenderProfiles(profiles);
470
484
  });
@@ -475,13 +489,13 @@ const usePerformanceTracker = () => {
475
489
  unsubRender();
476
490
  unsubEvents();
477
491
  };
478
- }, []);
492
+ }, [isTrackerActive]);
479
493
  const lastFrameTimeRef = (0, react_1.useRef)(Date.now());
480
494
  const rafIdRef = (0, react_1.useRef)(null);
481
495
  const appStartTimestampRef = (0, react_1.useRef)(Date.now());
482
496
  // Live Frame Measurement Loop
483
497
  (0, react_1.useEffect)(() => {
484
- if (!isRecording)
498
+ if (!isTrackerActive || !isRecording)
485
499
  return;
486
500
  let isMounted = true;
487
501
  let frameCount = 0;
@@ -1,5 +1,7 @@
1
1
  import { ReduxHistoryEntry } from '../types';
2
2
  export { ReduxHistoryEntry };
3
+ export declare const setReduxModuleEnabled: (enabled: boolean) => void;
4
+ export declare const getReduxModuleEnabled: () => boolean;
3
5
  export declare const isReduxConnected: () => boolean;
4
6
  export declare const getReduxState: () => any;
5
7
  export declare const setReduxAutoRefresh: (val: boolean) => void;
@@ -13,11 +13,18 @@
13
13
  // dispatch reference at store-creation time) still update the state tree
14
14
  // and per-reducer "last action" consistently.
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.connectReduxStore = exports.inspectorReduxMiddleware = exports.subscribeReduxState = exports.setReduxState = exports.clearActionHistory = exports.getActionHistory = exports.clearLastActionForReducer = exports.getLastActionForReducer = exports.getReduxAutoRefresh = exports.setReduxAutoRefresh = exports.getReduxState = exports.isReduxConnected = void 0;
16
+ exports.connectReduxStore = exports.inspectorReduxMiddleware = exports.subscribeReduxState = exports.setReduxState = exports.clearActionHistory = exports.getActionHistory = exports.clearLastActionForReducer = exports.getLastActionForReducer = exports.getReduxAutoRefresh = exports.setReduxAutoRefresh = exports.getReduxState = exports.isReduxConnected = exports.getReduxModuleEnabled = exports.setReduxModuleEnabled = void 0;
17
17
  const helpers_1 = require("../helpers");
18
18
  let currentReduxState = null;
19
19
  const listeners = new Set();
20
20
  let globalReduxAutoRefresh = true;
21
+ let isReduxModuleEnabled = false;
22
+ const setReduxModuleEnabled = (enabled) => {
23
+ isReduxModuleEnabled = enabled;
24
+ };
25
+ exports.setReduxModuleEnabled = setReduxModuleEnabled;
26
+ const getReduxModuleEnabled = () => isReduxModuleEnabled;
27
+ exports.getReduxModuleEnabled = getReduxModuleEnabled;
21
28
  let lastActionForReducer = {};
22
29
  let actionHistory = [];
23
30
  const MAX_HISTORY = 50;
@@ -176,6 +183,8 @@ function extractSliceName(actionType, affectedSlices) {
176
183
  return undefined;
177
184
  }
178
185
  function recordAction(action, prevState, nextState, rawStack) {
186
+ if (!isReduxModuleEnabled)
187
+ return;
179
188
  const stack = rawStack || new Error().stack || '';
180
189
  const type = actionTypeOf(action);
181
190
  const payload = action && typeof action === 'object' && action.payload !== undefined
@@ -173,9 +173,18 @@ exports.getFetchCommand = getFetchCommand;
173
173
  const deduplicateLogs = (raw) => {
174
174
  const map = new Map();
175
175
  raw.forEach(entry => {
176
- if (!map.has(entry.id) || entry.status != null) {
176
+ if (!map.has(entry.id)) {
177
177
  map.set(entry.id, entry);
178
178
  }
179
+ else {
180
+ const existing = map.get(entry.id);
181
+ if (existing.status == null && entry.status != null) {
182
+ map.set(entry.id, entry);
183
+ }
184
+ else if ((entry.startTime ?? 0) >= (existing.startTime ?? 0)) {
185
+ map.set(entry.id, entry);
186
+ }
187
+ }
179
188
  });
180
189
  return Array.from(map.values()).sort((a, b) => b.id - a.id);
181
190
  };
@@ -6,3 +6,12 @@ export declare function saveSettings(settings: PersistedSettings): void;
6
6
  export declare function clearPersistedSettings(): Promise<void>;
7
7
  export declare const isPersistentStorageAvailable: () => boolean;
8
8
  export declare function getCustomStorage(): InspectorStorage | null;
9
+ export interface RamLimitsProfile {
10
+ maxNetworkLogs: number;
11
+ maxConsoleLogs: number;
12
+ maxAnalyticsEvents: number;
13
+ maxCrashRecords: number;
14
+ profileName: 'High-End' | 'Standard' | 'Compact' | 'Ultra-Light';
15
+ freeRamMb: number;
16
+ }
17
+ export declare function calculateRamBasedLimits(freeRamMb: number): RamLimitsProfile;
@@ -10,7 +10,9 @@ exports.loadSettings = loadSettings;
10
10
  exports.saveSettings = saveSettings;
11
11
  exports.clearPersistedSettings = clearPersistedSettings;
12
12
  exports.getCustomStorage = getCustomStorage;
13
+ exports.calculateRamBasedLimits = calculateRamBasedLimits;
13
14
  const react_native_1 = require("react-native");
15
+ const NativeInspector_1 = require("../native/NativeInspector");
14
16
  // In-memory fallback (settings survive for the app session only).
15
17
  const memory = new Map();
16
18
  let customStorage = null;
@@ -27,6 +29,13 @@ async function loadSettings() {
27
29
  const parsed = JSON.parse(raw);
28
30
  return parsed && typeof parsed === 'object' ? parsed : {};
29
31
  }
32
+ if ((0, NativeInspector_1.isNativeModuleAvailable)()) {
33
+ const raw = await (0, NativeInspector_1.getNativeStorageItem)(SETTINGS_KEY);
34
+ if (raw) {
35
+ const parsed = JSON.parse(raw);
36
+ return parsed && typeof parsed === 'object' ? parsed : {};
37
+ }
38
+ }
30
39
  if (react_native_1.Platform.OS === 'ios') {
31
40
  const raw = react_native_1.Settings.get(SETTINGS_KEY);
32
41
  if (!raw)
@@ -37,7 +46,7 @@ async function loadSettings() {
37
46
  }
38
47
  return raw && typeof raw === 'object' ? raw : {};
39
48
  }
40
- // Android/fallback: memory
49
+ // In-memory fallback
41
50
  const raw = memory.get(SETTINGS_KEY);
42
51
  if (!raw)
43
52
  return {};
@@ -55,11 +64,13 @@ function saveSettings(settings) {
55
64
  customStorage.setItem(SETTINGS_KEY, raw);
56
65
  return;
57
66
  }
67
+ if ((0, NativeInspector_1.isNativeModuleAvailable)()) {
68
+ (0, NativeInspector_1.setNativeStorageItem)(SETTINGS_KEY, raw);
69
+ }
58
70
  if (react_native_1.Platform.OS === 'ios') {
59
71
  react_native_1.Settings.set({ [SETTINGS_KEY]: raw });
60
72
  return;
61
73
  }
62
- // Android/fallback: memory
63
74
  memory.set(SETTINGS_KEY, raw);
64
75
  }
65
76
  catch {
@@ -77,6 +88,9 @@ async function clearPersistedSettings() {
77
88
  }
78
89
  return;
79
90
  }
91
+ if ((0, NativeInspector_1.isNativeModuleAvailable)()) {
92
+ await (0, NativeInspector_1.setNativeStorageItem)(SETTINGS_KEY, null);
93
+ }
80
94
  if (react_native_1.Platform.OS === 'ios') {
81
95
  react_native_1.Settings.set({ [SETTINGS_KEY]: null });
82
96
  return;
@@ -88,9 +102,51 @@ async function clearPersistedSettings() {
88
102
  }
89
103
  }
90
104
  const isPersistentStorageAvailable = () => {
91
- return customStorage !== null || react_native_1.Platform.OS === 'ios';
105
+ return customStorage !== null || (0, NativeInspector_1.isNativeModuleAvailable)() || react_native_1.Platform.OS === 'ios';
92
106
  };
93
107
  exports.isPersistentStorageAvailable = isPersistentStorageAvailable;
94
108
  function getCustomStorage() {
95
109
  return customStorage;
96
110
  }
111
+ function calculateRamBasedLimits(freeRamMb) {
112
+ if (freeRamMb >= 3000) {
113
+ return {
114
+ maxNetworkLogs: 1000,
115
+ maxConsoleLogs: 1500,
116
+ maxAnalyticsEvents: 500,
117
+ maxCrashRecords: 100,
118
+ profileName: 'High-End',
119
+ freeRamMb,
120
+ };
121
+ }
122
+ else if (freeRamMb >= 1500) {
123
+ return {
124
+ maxNetworkLogs: 500,
125
+ maxConsoleLogs: 750,
126
+ maxAnalyticsEvents: 250,
127
+ maxCrashRecords: 50,
128
+ profileName: 'Standard',
129
+ freeRamMb,
130
+ };
131
+ }
132
+ else if (freeRamMb >= 600) {
133
+ return {
134
+ maxNetworkLogs: 200,
135
+ maxConsoleLogs: 300,
136
+ maxAnalyticsEvents: 100,
137
+ maxCrashRecords: 25,
138
+ profileName: 'Compact',
139
+ freeRamMb,
140
+ };
141
+ }
142
+ else {
143
+ return {
144
+ maxNetworkLogs: 100,
145
+ maxConsoleLogs: 150,
146
+ maxAnalyticsEvents: 50,
147
+ maxCrashRecords: 15,
148
+ profileName: 'Ultra-Light',
149
+ freeRamMb,
150
+ };
151
+ }
152
+ }
@@ -39,12 +39,35 @@
39
39
  "redux": "Redux"
40
40
  },
41
41
  "settings": {
42
- "mainTitle": "Settings",
42
+ "mainTitle": "Settings & Modules",
43
+ "mainSubtitle": "Manage modules and preferences",
43
44
  "requiredBadge": "REQUIRED",
44
45
  "defaultBadge": "DEFAULT",
45
46
  "notConnectedBadge": "NOT CONNECTED",
46
47
  "notDetectedBadge": "NOT DETECTED",
47
48
  "readOnlyBadge": "READ ONLY",
49
+ "coreBadge": "CORE",
50
+ "activeBadge": "ACTIVE",
51
+ "dormantBadge": "DORMANT",
52
+ "protectedBadge": "PROTECTED",
53
+ "modulesAndTools": "Modules & Tools",
54
+ "uiPreferences": "UI Preferences",
55
+ "zeroOverheadTitle": "Zero Background Overhead",
56
+ "zeroOverheadDesc": "Check the modules you wish to activate. Disabled modules consume 0% CPU & memory until saved.",
57
+ "unsavedPending": "● Unsaved selections pending",
58
+ "allSynchronized": "All modules synchronized",
59
+ "modulesActive": "{{active}} of {{total}} Modules Active",
60
+ "saveChanges": "Save Changes",
61
+ "settingsSaved": "Settings Saved",
62
+ "settingsSavedDesc": "Active module configurations have been successfully updated.",
63
+ "configure": "Configure",
64
+ "appearanceTheme": "APPEARANCE & THEME",
65
+ "windowLayout": "WINDOW & LAYOUT",
66
+ "startupDefault": "STARTUP & DEFAULT SCREEN",
67
+ "logFiltersDeduplication": "LOG FILTERS & DEDUPLICATION",
68
+ "resetSettings": "Reset All Settings",
69
+ "resetSettingsDesc": "Wipe customized preferences back to default",
70
+ "reset": "Reset",
48
71
  "reduxNotConnectedTip": "Redux store is not connected. Call connectReduxStore(store) or use inspectorReduxMiddleware to enable.",
49
72
  "analyticsNotConnectedTip": "Analytics is not initialized. Call setupAnalyticsLogger(analytics()) to enable.",
50
73
  "tabVisibility": "Tab Visibility",
@@ -55,7 +78,7 @@
55
78
  "title": "APIs Settings",
56
79
  "total": "Total: {{count}}",
57
80
  "maxRequestLogs": "Max Request Logs",
58
- "maxRequestLogsDescription": "How many network requests to keep in memory",
81
+ "maxRequestLogsDescription": "Buffer size of network requests preserved in memory",
59
82
  "clearNetworkLogs": "Clear Network Logs",
60
83
  "clearNetworkLogsDescription": "{{count}} requests stored",
61
84
  "networkLogsCleared": "Network logs cleared.",
@@ -69,56 +92,91 @@
69
92
  "title": "Logs Settings",
70
93
  "total": "Total: {{count}}",
71
94
  "maxConsoleLogs": "Max Console Logs",
72
- "maxConsoleLogsDescription": "How many console logs to keep in memory",
73
- "logLevels": "Log Levels",
74
- "logLevelsDescription": "Which console levels to capture",
75
- "showInfo": "Show info logs",
76
- "showWarn": "Show warn logs",
77
- "showError": "Show error logs",
95
+ "maxConsoleLogsDescription": "How many console messages to retain",
96
+ "logLevels": "Log Severities",
97
+ "logLevelsDescription": "Select which severities to capture in Logs",
98
+ "showInfo": "Show Info logs",
99
+ "showInfoDesc": "Informational logs & debug prints",
100
+ "showWarn": "Show Warning logs",
101
+ "showWarnDesc": "Warning notices & deprecations",
102
+ "showError": "Show Error logs",
103
+ "showErrorDesc": "Runtime errors & exceptions",
78
104
  "clearConsoleLogs": "Clear Console Logs",
79
105
  "clearConsoleLogsDescription": "{{count}} logs stored",
80
106
  "consoleLogsCleared": "Console logs cleared."
81
107
  },
82
108
  "analytics": {
83
109
  "title": "Analytics Settings",
84
- "total": "Total: {{count}}",
85
- "maxAnalyticsEvents": "Max Analytics Events",
86
- "maxAnalyticsEventsDescription": "How many analytics events to keep in memory",
87
- "clearAnalyticsEvents": "Clear Analytics Events",
88
- "clearAnalyticsEventsDescription": "{{count}} events stored",
110
+ "total": "Events: {{count}}",
111
+ "maxAnalyticsEvents": "Events Captured",
112
+ "maxAnalyticsEventsDescription": "{{count}} analytics events stored in buffer",
113
+ "clearAnalyticsEvents": "Clear Analytics History",
114
+ "clearAnalyticsEventsDescription": "Wipe all captured telemetry events",
89
115
  "analyticsEventsCleared": "Analytics events cleared."
90
116
  },
91
117
  "redux": {
92
118
  "title": "Redux Settings",
93
119
  "reducers": "Reducers: {{count}}",
94
120
  "autoRefresh": "Auto-refresh Store",
95
- "autoRefreshDescription": "Automatically capture Redux store state updates",
121
+ "autoRefreshDescription": "Capture Redux store state tree on every dispatch",
96
122
  "defaultJsonExpandDepth": "Default JSON Expand Depth",
97
123
  "defaultJsonExpandDepthDescription": "Initial depth of Redux state tree to auto-expand",
98
124
  "clearReduxState": "Clear Redux State",
99
- "clearReduxStateDescription": "Reset state snapshot in inspector",
100
- "clearReduxStateEmpty": "No store snapshot stored",
125
+ "clearReduxStateDescription": "Reset current state snapshot in inspector",
126
+ "clearReduxStateEmpty": "No store snapshot recorded",
101
127
  "reduxStateCleared": "Redux state snapshot cleared.",
102
128
  "clearReduxTimeline": "Clear Redux Timeline",
103
129
  "clearReduxTimelineDescription": "Remove all captured action history",
104
130
  "reduxTimelineCleared": "Redux action history cleared."
105
131
  },
132
+ "bundle": {
133
+ "title": "Bundle Settings",
134
+ "sourceBundler": "Metro Source Bundler",
135
+ "sourceBundlerDesc": "Parses live module trees and calculates binary size breakdowns",
136
+ "clearCache": "Clear Bundle Cache",
137
+ "clearCacheDesc": "Force re-fetching and parsing of JS bundle",
138
+ "cacheCleared": "Bundle analysis cache cleared."
139
+ },
140
+ "performance": {
141
+ "title": "Performance Settings",
142
+ "frameMeasurement": "Live Frame Measurement",
143
+ "frameMeasurementDesc": "Samples UI/JS frame rates & detects wasteful re-renders",
144
+ "clearEvents": "Clear Performance Events",
145
+ "clearEventsDesc": "Reset recorded jank and FPS drops history",
146
+ "eventsCleared": "Performance events cleared."
147
+ },
148
+ "crash": {
149
+ "title": "Crash Settings",
150
+ "maxCrashLogs": "Max Crash Logs",
151
+ "maxCrashLogsDesc": "How many crash records to preserve in history",
152
+ "globalGuard": "Global Crash Guard",
153
+ "globalGuardDesc": "Intercepts native, JS, and render errors directly",
154
+ "clearHistory": "Clear Crash History",
155
+ "clearHistoryDesc": "{{count}} crash logs stored",
156
+ "historyCleared": "Crash logs cleared."
157
+ },
106
158
  "general": {
107
- "darkMode": "Dark Mode",
108
- "darkModeDescription": "Switch the inspector to a dark color scheme",
109
- "modalHeight": "Modal Height",
110
- "modalHeightDescription": "Height of the inspector overlay",
111
- "modalAnimation": "Modal Animation",
112
- "modalAnimationDescription": "Animation used when opening the inspector",
159
+ "darkMode": "Dark Mode Theme",
160
+ "darkModeDescription": "Toggle sleek dark aesthetic or light contrast",
161
+ "modalHeight": "Inspector Window Height",
162
+ "modalHeightDescription": "Modal screen coverage percentage",
163
+ "modalAnimation": "Transition Animation",
164
+ "modalAnimationDescription": "Entrance and dismissal presentation style",
113
165
  "duplicateLogs": "Show Duplicate Logs",
114
- "duplicateLogsDescription": "Group consecutive identical console logs",
166
+ "duplicateLogsDescription": "Off: Identical repeated entries collapse into ×N badges",
167
+ "defaultOpeningTab": "Default Opening Tab",
168
+ "defaultOpeningTabDesc": "Initial tab active when launcher button is tapped",
169
+ "activeConsoleLogLevels": "Active Console Log Levels",
170
+ "activeConsoleLogLevelsDesc": "Select which severities to capture in Logs",
115
171
  "resetToDefaults": "Reset to Defaults",
116
172
  "resetToDefaultsDescription": "Restore all inspector settings",
117
173
  "resetConfirmationTitle": "Settings Reset",
118
174
  "resetConfirmationMessage": "All settings have been reset to default values.",
119
175
  "storageStatus": "Persistent Storage",
120
- "storageStatusEnabled": "Settings persist across app restarts",
121
- "storageStatusDisabled": "Using in-memory storage (Android)"
176
+ "storageStatusEnabled": "Settings Storage: Persistent ({{type}})",
177
+ "storageStatusEnabledDesc": "Your preferences and module visibility persist across app reboots.",
178
+ "storageStatusDisabled": "Settings Storage: In-Memory (Temporary)",
179
+ "storageStatusDisabledDesc": "Preferences reset on app kill. Pass custom storage to <NetworkInspector storage={...} /> to persist on Android."
122
180
  }
123
181
  },
124
182
  "network": {
@@ -178,10 +236,20 @@
178
236
  "noMatchingHeaders": "No matching headers",
179
237
  "diffHidden": "{ Diff hidden }",
180
238
  "noDiff": "No differences from previous API.",
239
+ "healthTitle": "Network Health & Telemetry",
240
+ "successRate": "Success Rate",
241
+ "avgLatency": "Avg Latency",
242
+ "p95Latency": "P95 Latency",
243
+ "bandwidth": "Bandwidth",
244
+ "fastest": "Fastest",
245
+ "slowest": "Slowest",
246
+ "timingWaterfall": "Timing Waterfall & Latency",
247
+ "throughput": "Throughput",
248
+ "performanceTier": "Performance Tier",
181
249
  "perf": {
182
- "fast": "Fast",
183
- "moderate": "Moderate",
184
- "slow": "Slow"
250
+ "fast": "Fast (< 200ms)",
251
+ "moderate": "Moderate (200-800ms)",
252
+ "slow": "Slow (> 800ms)"
185
253
  },
186
254
  "jsonViewer": {
187
255
  "pretty": "Pretty",
@@ -12,4 +12,5 @@ export { connectReduxStore, inspectorReduxMiddleware, getReduxState, subscribeRe
12
12
  export { getEventCategory, registerGAPlugin, type GAPlugin, } from './helpers/gaAnalyticsRegistry';
13
13
  export { usePerformanceTracker, useComponentProfiler, useNavigationProfiler, trackComponentRender, trackNavigationTransition, trackHeavyTask, measureAsync, getHermesMemoryStats, registerComponentProfile, subscribeRenderProfiles, getRenderProfiles, logPerformanceEvent, clearPerformanceEvents, subscribePerformanceEvents, getPerformanceEvents, getInitialRenderProfiles, getInitialPerformanceEvents, generateFixSnippet, } from './customHooks/performanceTracker';
14
14
  export { InspectLog, InspectTrackTime, InspectCatch, type InspectLogOptions, } from './decorators';
15
+ export { getNativeDeviceMetrics, enableNativeCrashProtection, subscribeNativeCrashes, showNativeFloatingButton, hideNativeFloatingButton, setNativeFloatingButtonBadge, subscribeNativeFloatingButtonPress, subscribeNativeDeviceShake, startNativeFpsMonitoring, stopNativeFpsMonitoring, getNativeFpsMetrics, getNativeStorageItem, setNativeStorageItem, isNativeModuleAvailable, type NativeDeviceMetrics, type NativeCrashEvent, type FloatingButtonOptions, type NativeFpsMetrics, } from './native/NativeInspector';
15
16
  export { ActiveTab, Method, StatusFilter, SortOrder, LocalFilter, ModalAnimationType, SettingsPage, SettingsSubTab, LogFilter, ConsoleLogType, AnalyticsEventSource, GAEventCategory, StackFrameType, DiffResultType, BundleSubTab, PerformanceSubTab, CrashType, CrashExportFormat, CrashDetailSubTab, CrashFilterType, BreadcrumbType, } from './types';