react-native-inapp-inspector 1.1.25 → 1.1.26

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 (70) hide show
  1. package/android/build.gradle +36 -0
  2. package/android/src/main/AndroidManifest.xml +3 -0
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +114 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +28 -0
  5. package/dist/commonjs/components/ErrorBoundary.d.ts +1 -1
  6. package/dist/commonjs/components/ErrorBoundary.js +9 -145
  7. package/dist/commonjs/components/Inspector/CrashDetail.d.ts +3 -0
  8. package/dist/commonjs/components/Inspector/CrashDetail.js +796 -0
  9. package/dist/commonjs/components/Inspector/CrashFilterModal.d.ts +20 -0
  10. package/dist/commonjs/components/Inspector/CrashFilterModal.js +597 -0
  11. package/dist/commonjs/components/Inspector/CrashTab.d.ts +3 -0
  12. package/dist/commonjs/components/Inspector/CrashTab.js +727 -0
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +52 -23
  14. package/dist/commonjs/components/Inspector/LogDetail.js +4 -3
  15. package/dist/commonjs/components/Inspector/MainScreen.js +12 -3
  16. package/dist/commonjs/components/Inspector/SettingsPanel.js +90 -1
  17. package/dist/commonjs/components/Inspector/TabBar.js +15 -3
  18. package/dist/commonjs/components/NetworkIcons.d.ts +11 -0
  19. package/dist/commonjs/components/NetworkIcons.js +96 -1
  20. package/dist/commonjs/components/SegmentedTabs.js +2 -1
  21. package/dist/commonjs/constants/version.d.ts +1 -1
  22. package/dist/commonjs/constants/version.js +1 -1
  23. package/dist/commonjs/customHooks/analyticsLogger.js +70 -44
  24. package/dist/commonjs/customHooks/consoleLogger.d.ts +1 -0
  25. package/dist/commonjs/customHooks/consoleLogger.js +70 -6
  26. package/dist/commonjs/customHooks/crashHandler.d.ts +64 -0
  27. package/dist/commonjs/customHooks/crashHandler.js +681 -0
  28. package/dist/commonjs/customHooks/networkLogger.js +64 -48
  29. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +1 -1
  30. package/dist/commonjs/i18n/locales/en.json +131 -0
  31. package/dist/commonjs/index.d.ts +3 -1
  32. package/dist/commonjs/index.js +95 -1
  33. package/dist/commonjs/types/enums.d.ts +41 -0
  34. package/dist/commonjs/types/enums.js +37 -1
  35. package/dist/commonjs/types/interfaces.d.ts +51 -1
  36. package/dist/esm/components/ErrorBoundary.d.ts +1 -1
  37. package/dist/esm/components/ErrorBoundary.js +10 -113
  38. package/dist/esm/components/Inspector/CrashDetail.d.ts +3 -0
  39. package/dist/esm/components/Inspector/CrashDetail.js +758 -0
  40. package/dist/esm/components/Inspector/CrashFilterModal.d.ts +20 -0
  41. package/dist/esm/components/Inspector/CrashFilterModal.js +557 -0
  42. package/dist/esm/components/Inspector/CrashTab.d.ts +3 -0
  43. package/dist/esm/components/Inspector/CrashTab.js +689 -0
  44. package/dist/esm/components/Inspector/InspectorHeader.js +52 -23
  45. package/dist/esm/components/Inspector/LogDetail.js +4 -3
  46. package/dist/esm/components/Inspector/MainScreen.js +12 -3
  47. package/dist/esm/components/Inspector/SettingsPanel.js +91 -2
  48. package/dist/esm/components/Inspector/TabBar.js +16 -4
  49. package/dist/esm/components/NetworkIcons.d.ts +11 -0
  50. package/dist/esm/components/NetworkIcons.js +83 -0
  51. package/dist/esm/components/SegmentedTabs.js +2 -1
  52. package/dist/esm/constants/version.d.ts +1 -1
  53. package/dist/esm/constants/version.js +1 -1
  54. package/dist/esm/customHooks/analyticsLogger.js +70 -44
  55. package/dist/esm/customHooks/consoleLogger.d.ts +1 -0
  56. package/dist/esm/customHooks/consoleLogger.js +68 -5
  57. package/dist/esm/customHooks/crashHandler.d.ts +64 -0
  58. package/dist/esm/customHooks/crashHandler.js +659 -0
  59. package/dist/esm/customHooks/networkLogger.js +64 -48
  60. package/dist/esm/helpers/gaAnalyticsRegistry.js +1 -1
  61. package/dist/esm/i18n/locales/en.json +131 -0
  62. package/dist/esm/index.d.ts +3 -1
  63. package/dist/esm/index.js +73 -1
  64. package/dist/esm/types/enums.d.ts +41 -0
  65. package/dist/esm/types/enums.js +36 -0
  66. package/dist/esm/types/interfaces.d.ts +51 -1
  67. package/ios/NetworkInspectorModule.h +6 -0
  68. package/ios/NetworkInspectorModule.m +125 -0
  69. package/package.json +5 -2
  70. package/react-native-inapp-inspector.podspec +18 -0
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.addAxiosInterceptors = exports.setupNetworkLogger = exports.getNetworkLogs = exports.clearNetworkLogs = exports.subscribeNetworkLogs = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
+ const crashHandler_1 = require("./crashHandler");
8
9
  let logs = [];
9
10
  let listeners = [];
10
11
  let counter = 0;
@@ -151,65 +152,76 @@ const setupNetworkLogger = () => {
151
152
  const finalUrl = typeof url === "string" ? url : url?.url;
152
153
  if (shouldIgnoreUrl(finalUrl))
153
154
  return originalFetch(url, options);
154
- const requestHeaders = normaliseHeaders(options?.headers);
155
- const caller = getCallerFromStack(); // ✅ Capture call line
156
- addOrUpdateLog({
157
- id,
158
- url: finalUrl,
159
- method,
160
- startTime: start,
161
- caller,
162
- request: method === "GET" ? undefined : parseRequestData(options?.body),
163
- requestHeaders,
164
- });
155
+ let caller = "Unknown";
156
+ let requestHeaders;
165
157
  try {
166
- const response = await originalFetch(url, options);
167
- const duration = Date.now() - start;
168
- const responseHeaders = normaliseHeaders(response.headers);
169
- let data = null;
170
- const contentType = responseHeaders?.["content-type"] ||
171
- responseHeaders?.["Content-Type"] ||
172
- "";
173
- if (contentType.includes("image/")) {
174
- data = "[Image Data]";
175
- }
176
- else {
177
- try {
178
- const clone = response.clone();
179
- const text = await clone.text();
180
- try {
181
- data = JSON.parse(text);
182
- }
183
- catch {
184
- data = text;
185
- }
186
- }
187
- catch { }
188
- }
158
+ requestHeaders = normaliseHeaders(options?.headers);
159
+ caller = getCallerFromStack(); // ✅ Capture call line
189
160
  addOrUpdateLog({
190
161
  id,
191
162
  url: finalUrl,
192
163
  method,
193
- status: response.status,
194
- response: data,
195
- duration,
196
164
  startTime: start,
197
165
  caller,
198
- responseHeaders,
166
+ request: method === "GET" ? undefined : parseRequestData(options?.body),
167
+ requestHeaders,
199
168
  });
169
+ }
170
+ catch { }
171
+ try {
172
+ const response = await originalFetch(url, options);
173
+ const duration = Date.now() - start;
174
+ try {
175
+ const responseHeaders = normaliseHeaders(response.headers);
176
+ let data = null;
177
+ const contentType = responseHeaders?.["content-type"] ||
178
+ responseHeaders?.["Content-Type"] ||
179
+ "";
180
+ if (contentType.includes("image/")) {
181
+ data = "[Image Data]";
182
+ }
183
+ else {
184
+ try {
185
+ const clone = response.clone();
186
+ const text = await clone.text();
187
+ try {
188
+ data = JSON.parse(text);
189
+ }
190
+ catch {
191
+ data = text;
192
+ }
193
+ }
194
+ catch { }
195
+ }
196
+ addOrUpdateLog({
197
+ id,
198
+ url: finalUrl,
199
+ method,
200
+ status: response.status,
201
+ response: data,
202
+ duration,
203
+ startTime: start,
204
+ caller,
205
+ responseHeaders,
206
+ });
207
+ }
208
+ catch { }
200
209
  return response;
201
210
  }
202
211
  catch (error) {
203
- addOrUpdateLog({
204
- id,
205
- url: finalUrl,
206
- method,
207
- status: 0,
208
- startTime: start,
209
- response: error,
210
- caller,
211
- duration: Date.now() - start,
212
- });
212
+ try {
213
+ addOrUpdateLog({
214
+ id,
215
+ url: finalUrl,
216
+ method,
217
+ status: 0,
218
+ startTime: start,
219
+ response: error,
220
+ caller,
221
+ duration: Date.now() - start,
222
+ });
223
+ }
224
+ catch { }
213
225
  throw error;
214
226
  }
215
227
  };
@@ -231,6 +243,10 @@ const setupNetworkLogger = () => {
231
243
  catch (_e) {
232
244
  // Axios not available — fetch-only mode
233
245
  }
246
+ try {
247
+ (0, crashHandler_1.setupGlobalCrashHandler)();
248
+ }
249
+ catch { }
234
250
  globalThis.__NETWORK_LOGGER_INITIALIZED__ = true;
235
251
  };
236
252
  exports.setupNetworkLogger = setupNetworkLogger;
@@ -122,7 +122,7 @@ tryInspectRuntimeFirebaseAnalytics();
122
122
  * 4. Semantic pattern & prefix analysis
123
123
  */
124
124
  const getEventCategory = (name, params) => {
125
- if (!name)
125
+ if (!name || typeof name !== 'string')
126
126
  return 'custom';
127
127
  const cleanName = name.trim().toLowerCase();
128
128
  // 1. Run through registered dynamic plugins
@@ -582,5 +582,136 @@
582
582
  "retry": "Try Again",
583
583
  "reset": "Reset",
584
584
  "close": "Close"
585
+ },
586
+ "crash": {
587
+ "title": "Crash",
588
+ "searchPlaceholder": "Search error, message, stack...",
589
+ "searchDetailPlaceholder": "Search in trace or JSON...",
590
+ "statCrashes": "Crashes",
591
+ "statFatal": "Fatal",
592
+ "statJsErrors": "JS Errors",
593
+ "statPromises": "Promises",
594
+ "statRender": "Render",
595
+ "statNative": "Native",
596
+ "filterAll": "All",
597
+ "filterFatal": "Fatal",
598
+ "filterJsError": "JS Error",
599
+ "filterPromise": "Promise",
600
+ "filterRender": "Render",
601
+ "filterNative": "Native",
602
+ "fatalBadge": "FATAL",
603
+ "handledBadge": "HANDLED",
604
+ "fatalCrash": "FATAL CRASH",
605
+ "handledException": "HANDLED EXCEPTION",
606
+ "unknownException": "Unknown Exception",
607
+ "report": "Report",
608
+ "inspect": "Inspect",
609
+ "copyReport": "Copy Report",
610
+ "copied": "Copied",
611
+ "clearTitle": "Clear Crash History",
612
+ "clearMessage": "Are you sure you want to clear all intercepted crash records?",
613
+ "clearCancel": "Cancel",
614
+ "clearConfirm": "Clear All",
615
+ "emptyTitle": "Zero Crashes Detected",
616
+ "emptySubtitle": "Global crash guard is active. All native and JavaScript exceptions are intercepted and protected.",
617
+ "emptySearchSubtitle": "No crash entries matched your search query.",
618
+ "tabStack": "Stack ({{count}})",
619
+ "tabDiagnostics": "Diagnostics",
620
+ "tabTrail": "Trail ({{count}})",
621
+ "tabRawJson": "Raw JSON",
622
+ "appFrames": "App Frames ({{count}})",
623
+ "allFrames": "All Frames ({{count}})",
624
+ "frameApp": "APP",
625
+ "frameLib": "LIB",
626
+ "anonymous": "<anonymous>",
627
+ "noStackTrace": "No stack trace captured for this event.",
628
+ "deviceEnvironment": "Device & Environment",
629
+ "platform": "Platform",
630
+ "osVersion": "OS Version",
631
+ "reactNative": "React Native",
632
+ "jsEngine": "JS Engine",
633
+ "hermesEngine": "Hermes Engine",
634
+ "jsc": "JSC",
635
+ "architecture": "Architecture",
636
+ "fabricNewArch": "Fabric (New Arch)",
637
+ "paperLegacy": "Paper (Legacy)",
638
+ "appState": "App State",
639
+ "jsHeapMemory": "JS Heap Memory",
640
+ "usedHeap": "Used Heap",
641
+ "totalHeap": "Total Heap",
642
+ "noBreadcrumbs": "No breadcrumb events recorded prior to this crash.",
643
+ "simNativeMessage": "Simulated native fatal exception",
644
+ "simPromiseMessage": "Simulated unhandled promise rejection",
645
+ "simRenderMessage": "Simulated React component render error",
646
+ "simJsMessage": "Simulated JavaScript exception",
647
+ "reportTitle": "CRASH DIAGNOSTIC REPORT",
648
+ "reportErrorName": "Error Name:",
649
+ "reportMessage": "Message:",
650
+ "reportType": "Type:",
651
+ "reportFatalYes": "YES (Fatal)",
652
+ "reportFatalNo": "NO (Caught/Handled)",
653
+ "reportFatal": "Fatal:",
654
+ "reportTimestamp": "Timestamp:",
655
+ "reportUptime": "App Uptime:",
656
+ "reportUptimeValue": "{{seconds}} seconds",
657
+ "reportPlatform": "Platform:",
658
+ "reportReactNative": "React Native:",
659
+ "reportHermes": "Hermes:",
660
+ "reportEnabled": "Enabled",
661
+ "reportDisabled": "Disabled",
662
+ "reportArchitecture": "Architecture:",
663
+ "reportFabricNew": "Fabric (New)",
664
+ "reportPaperLegacy": "Paper (Legacy)",
665
+ "reportScreenSize": "Screen Size:",
666
+ "reportAppState": "App State:",
667
+ "reportJsMemory": "JS Memory:",
668
+ "reportStackTrace": "STACK TRACE:",
669
+ "reportNoStackTrace": "No stack trace available",
670
+ "reportComponentHierarchy": "COMPONENT HIERARCHY:",
671
+ "reportRecentBreadcrumbs": "RECENT BREADCRUMBS:",
672
+ "mdReportTitle": "🚨 Crash Report: {{name}}",
673
+ "mdStackTrace": "📦 Stack Trace",
674
+ "mdComponentHierarchy": "🌲 Component Hierarchy",
675
+ "mdRecentBreadcrumbs": "👣 Recent Breadcrumbs",
676
+ "mdSeverityFatal": "FATAL",
677
+ "mdSeverityHandled": "HANDLED",
678
+ "breadcrumbNavigation": "Navigated from \"{{from}}\" to \"{{to}}\"",
679
+ "breadcrumbAction": "Action: {{actionType}}",
680
+ "unknown": "Unknown",
681
+ "runtimeException": "Runtime Exception",
682
+ "logFatalCrash": "Fatal Crash",
683
+ "logUnhandledError": "Unhandled Error",
684
+ "errorNameFatal": "FatalError",
685
+ "errorNameUnhandled": "UnhandledException",
686
+ "nativeCrashTitle": "Native Crash",
687
+ "nativeUncaughtException": "Native Uncaught Exception",
688
+ "nativeException": "Native Exception",
689
+ "unhandledPromiseRejection": "Unhandled Promise Rejection",
690
+ "filterTitle": "Crash Filters",
691
+ "filterSubtitle": "Diagnostics & Reports",
692
+ "filterReset": "Reset All",
693
+ "filterTypeSection": "CRASH TYPE",
694
+ "filterTypeAll": "All Types",
695
+ "filterTimeSection": "TIME HORIZON",
696
+ "filterTimeAll": "All Time",
697
+ "filterTime15m": "Last 15 mins",
698
+ "filterTime1h": "Last 1 hour",
699
+ "filterTime24h": "Last 24 hours",
700
+ "filterTime7d": "Last 7 days",
701
+ "filterPlatformSection": "PLATFORM",
702
+ "filterPlatformAll": "All Platforms",
703
+ "filterPlatformIos": "iOS",
704
+ "filterPlatformAndroid": "Android",
705
+ "filterEngineSection": "JS ENGINE",
706
+ "filterEngineAll": "All Engines",
707
+ "filterEngineHermes": "Hermes",
708
+ "filterSortSection": "SORT ORDER",
709
+ "filterSortNewest": "Newest First (Default)",
710
+ "filterSortOldest": "Oldest First",
711
+ "filterDiscard": "Discard",
712
+ "filterApply": "Apply ({{count}} Crashes)",
713
+ "frameCopy": "Copy",
714
+ "frameCopied": "Copied",
715
+ "componentHierarchy": "Component Hierarchy"
585
716
  }
586
717
  }
@@ -5,9 +5,11 @@ export default NetworkInspectorWrapper;
5
5
  export { setupNetworkLogger, clearNetworkLogs, subscribeNetworkLogs, addAxiosInterceptors, } from './customHooks/networkLogger';
6
6
  export { setupConsoleLogger, clearConsoleLogs, subscribeConsoleLogs, } from './customHooks/consoleLogger';
7
7
  export { setupAnalyticsLogger, logAnalyticsEvent, subscribeAnalyticsEvents, clearAnalyticsEvents, getCurrentUserProperties, getCurrentUserId, getDefaultEventParameters, getCollectionEnabled, } from './customHooks/analyticsLogger';
8
+ export { setupGlobalCrashHandler, subscribeCrashEvents, emitCrashEvent, getCrashRecords, clearCrashRecords, simulateTestCrash, exportCrashReport, parseCrashStackTrace, recordCustomCrash, addCrashBreadcrumb, recordNavigationBreadcrumb, recordNetworkBreadcrumb, recordReduxBreadcrumb, recordUserActionBreadcrumb, computeCrashFingerprint, type CrashEventPayload, } from './customHooks/crashHandler';
9
+ export { default as CrashTab } from './components/Inspector/CrashTab';
8
10
  export { default as ErrorBoundary } from './components/ErrorBoundary';
9
11
  export { connectReduxStore, inspectorReduxMiddleware, getReduxState, subscribeReduxState, getActionHistory, clearActionHistory, getLastActionForReducer, } from './customHooks/reduxLogger';
10
12
  export { getEventCategory, registerGAPlugin, type GAPlugin, } from './helpers/gaAnalyticsRegistry';
11
13
  export { usePerformanceTracker, logPerformanceEvent, clearPerformanceEvents, subscribePerformanceEvents, getPerformanceEvents, } from './customHooks/performanceTracker';
12
14
  export { InspectLog, InspectTrackTime, InspectCatch, type InspectLogOptions, } from './decorators';
13
- export { ActiveTab, Method, StatusFilter, SortOrder, LocalFilter, ModalAnimationType, SettingsPage, SettingsSubTab, LogFilter, ConsoleLogType, AnalyticsEventSource, GAEventCategory, StackFrameType, DiffResultType, BundleSubTab, PerformanceSubTab, } from './types';
15
+ export { ActiveTab, Method, StatusFilter, SortOrder, LocalFilter, ModalAnimationType, SettingsPage, SettingsSubTab, LogFilter, ConsoleLogType, AnalyticsEventSource, GAEventCategory, StackFrameType, DiffResultType, BundleSubTab, PerformanceSubTab, CrashType, CrashExportFormat, CrashDetailSubTab, CrashFilterType, BreadcrumbType, } from './types';
@@ -36,7 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.PerformanceSubTab = exports.BundleSubTab = exports.DiffResultType = exports.StackFrameType = exports.GAEventCategory = exports.AnalyticsEventSource = exports.ConsoleLogType = exports.LogFilter = exports.SettingsSubTab = exports.SettingsPage = exports.ModalAnimationType = exports.LocalFilter = exports.SortOrder = exports.StatusFilter = exports.Method = exports.ActiveTab = exports.InspectCatch = exports.InspectTrackTime = exports.InspectLog = exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = exports.usePerformanceTracker = exports.registerGAPlugin = exports.getEventCategory = exports.getLastActionForReducer = exports.clearActionHistory = exports.getActionHistory = exports.subscribeReduxState = exports.getReduxState = exports.inspectorReduxMiddleware = exports.connectReduxStore = exports.ErrorBoundary = exports.getCollectionEnabled = exports.getDefaultEventParameters = exports.getCurrentUserId = exports.getCurrentUserProperties = exports.clearAnalyticsEvents = exports.subscribeAnalyticsEvents = exports.logAnalyticsEvent = exports.setupAnalyticsLogger = exports.subscribeConsoleLogs = exports.clearConsoleLogs = exports.setupConsoleLogger = exports.addAxiosInterceptors = exports.subscribeNetworkLogs = exports.clearNetworkLogs = exports.setupNetworkLogger = void 0;
39
+ exports.ActiveTab = exports.InspectCatch = exports.InspectTrackTime = exports.InspectLog = exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = exports.usePerformanceTracker = exports.registerGAPlugin = exports.getEventCategory = exports.getLastActionForReducer = exports.clearActionHistory = exports.getActionHistory = exports.subscribeReduxState = exports.getReduxState = exports.inspectorReduxMiddleware = exports.connectReduxStore = exports.ErrorBoundary = exports.CrashTab = exports.computeCrashFingerprint = exports.recordUserActionBreadcrumb = exports.recordReduxBreadcrumb = exports.recordNetworkBreadcrumb = exports.recordNavigationBreadcrumb = exports.addCrashBreadcrumb = exports.recordCustomCrash = exports.parseCrashStackTrace = exports.exportCrashReport = exports.simulateTestCrash = exports.clearCrashRecords = exports.getCrashRecords = exports.emitCrashEvent = exports.subscribeCrashEvents = exports.setupGlobalCrashHandler = exports.getCollectionEnabled = exports.getDefaultEventParameters = exports.getCurrentUserId = exports.getCurrentUserProperties = exports.clearAnalyticsEvents = exports.subscribeAnalyticsEvents = exports.logAnalyticsEvent = exports.setupAnalyticsLogger = exports.subscribeConsoleLogs = exports.clearConsoleLogs = exports.setupConsoleLogger = exports.addAxiosInterceptors = exports.subscribeNetworkLogs = exports.clearNetworkLogs = exports.setupNetworkLogger = void 0;
40
+ exports.BreadcrumbType = exports.CrashFilterType = exports.CrashDetailSubTab = exports.CrashExportFormat = exports.CrashType = exports.PerformanceSubTab = exports.BundleSubTab = exports.DiffResultType = exports.StackFrameType = exports.GAEventCategory = exports.AnalyticsEventSource = exports.ConsoleLogType = exports.LogFilter = exports.SettingsSubTab = exports.SettingsPage = exports.ModalAnimationType = exports.LocalFilter = exports.SortOrder = exports.StatusFilter = exports.Method = void 0;
40
41
  const react_1 = __importStar(require("react"));
41
42
  const react_native_1 = require("react-native");
42
43
  const native_1 = require("@react-navigation/native");
@@ -55,6 +56,8 @@ const networkLogger_1 = require("./customHooks/networkLogger");
55
56
  // Console
56
57
  const consoleLogger_1 = require("./customHooks/consoleLogger");
57
58
  const logFilters_1 = require("./customHooks/logFilters");
59
+ // Crash Protection
60
+ const crashHandler_1 = require("./customHooks/crashHandler");
58
61
  const analyticsLogger_1 = require("./customHooks/analyticsLogger");
59
62
  const reduxLogger_1 = require("./customHooks/reduxLogger");
60
63
  const constants_1 = require("./constants");
@@ -128,6 +131,14 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
128
131
  const latestAnalyticsEventsRef = (0, react_1.useRef)([]);
129
132
  const [lastReadLogsCount, setLastReadLogsCount] = (0, react_1.useState)(0);
130
133
  const [lastReadApisCount, setLastReadApisCount] = (0, react_1.useState)(0);
134
+ const [lastReadCrashesCount, setLastReadCrashesCount] = (0, react_1.useState)(0);
135
+ // ─── Crash state ───────────────────────────────────────────────────────────
136
+ const [crashRecords, setCrashRecords] = (0, react_1.useState)(() => (0, crashHandler_1.getCrashRecords)());
137
+ const [selectedCrash, setSelectedCrash] = (0, react_1.useState)(null);
138
+ const [maxCrashLogs, setMaxCrashLogs] = (0, react_1.useState)(100);
139
+ (0, react_1.useEffect)(() => {
140
+ (0, crashHandler_1.setMaxCrashLogsLimit)(maxCrashLogs);
141
+ }, [maxCrashLogs]);
131
142
  (0, react_1.useEffect)(() => {
132
143
  if (visible) {
133
144
  if (activeTab === 'apis') {
@@ -136,6 +147,9 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
136
147
  if (activeTab === 'logs') {
137
148
  setLastReadLogsCount(consoleLogs.length);
138
149
  }
150
+ if (activeTab === 'crash') {
151
+ setLastReadCrashesCount(crashRecords.length);
152
+ }
139
153
  }
140
154
  }, [visible]);
141
155
  (0, react_1.useEffect)(() => {
@@ -148,6 +162,11 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
148
162
  setLastReadLogsCount(consoleLogs.length);
149
163
  }
150
164
  }, [activeTab, consoleLogs.length]);
165
+ (0, react_1.useEffect)(() => {
166
+ if (activeTab === 'crash') {
167
+ setLastReadCrashesCount(crashRecords.length);
168
+ }
169
+ }, [activeTab, crashRecords.length]);
151
170
  const [maxConsoleLogs, setMaxConsoleLogs] = (0, react_1.useState)(200);
152
171
  const [showConsoleLevels, setShowConsoleLevels] = (0, react_1.useState)({
153
172
  info: true,
@@ -190,6 +209,7 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
190
209
  redux: false,
191
210
  bundle: false,
192
211
  performance: false,
212
+ crash: true,
193
213
  });
194
214
  const [maxNetworkLogs, setMaxNetworkLogs] = (0, react_1.useState)(100);
195
215
  const [reduxAutoRefresh, setReduxAutoRefreshState] = (0, react_1.useState)(true);
@@ -210,8 +230,10 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
210
230
  redux: false,
211
231
  bundle: false,
212
232
  performance: false,
233
+ crash: true,
213
234
  });
214
235
  setDefaultTab('apis');
236
+ setMaxCrashLogs(100);
215
237
  setMaxNetworkLogs(100);
216
238
  setMaxConsoleLogs(200);
217
239
  setShowConsoleLevels({
@@ -244,6 +266,9 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
244
266
  ...prev,
245
267
  ...saved.tabVisibility,
246
268
  apis: true, // APIs is always required
269
+ crash: saved.tabVisibility.crash !== undefined
270
+ ? saved.tabVisibility.crash
271
+ : true,
247
272
  }));
248
273
  if (saved.defaultTab)
249
274
  setDefaultTab(saved.defaultTab);
@@ -269,6 +294,7 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
269
294
  redux: false,
270
295
  bundle: false,
271
296
  performance: false,
297
+ crash: true,
272
298
  },
273
299
  ...(saved.tabVisibility || {}),
274
300
  apis: true,
@@ -649,6 +675,22 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
649
675
  (0, networkLogger_1.clearNetworkLogs)();
650
676
  (0, consoleLogger_1.setupConsoleLogger)();
651
677
  (0, analyticsLogger_1.autoSetupAnalyticsLogger)();
678
+ (0, crashHandler_1.setupGlobalCrashHandler)();
679
+ const unsubscribeCrash = (0, crashHandler_1.subscribeCrashEvents)(crashInfo => {
680
+ if (crashInfo.message === '__CLEARED__') {
681
+ setCrashRecords([]);
682
+ setSelectedCrash(null);
683
+ return;
684
+ }
685
+ const updated = (0, crashHandler_1.getCrashRecords)();
686
+ setCrashRecords(updated);
687
+ });
688
+ // Sync crashes recorded before this subscription ran (e.g. a render crash
689
+ // during the very first commit, which fires before effects are mounted).
690
+ const pendingCrashes = (0, crashHandler_1.getCrashRecords)();
691
+ if (pendingCrashes.length > 0) {
692
+ setCrashRecords(pendingCrashes);
693
+ }
652
694
  let timeoutId;
653
695
  let isFirstNetworkCall = true;
654
696
  const unsubscribe = (0, networkLogger_1.subscribeNetworkLogs)((raw) => {
@@ -760,6 +802,7 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
760
802
  unsubscribeConsole();
761
803
  clearTimeout(consoleTimeoutId);
762
804
  unsubscribeRedux();
805
+ unsubscribeCrash();
763
806
  };
764
807
  }, []);
765
808
  (0, react_1.useEffect)(() => {
@@ -1249,6 +1292,21 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
1249
1292
  ]);
1250
1293
  return;
1251
1294
  }
1295
+ if (activeTab === 'crash') {
1296
+ react_native_1.Alert.alert('Clear Crash History', 'Are you sure you want to clear all intercepted crash records?', [
1297
+ { text: 'Cancel', style: 'cancel' },
1298
+ {
1299
+ text: 'Clear All',
1300
+ onPress: () => {
1301
+ (0, crashHandler_1.clearCrashRecords)();
1302
+ setCrashRecords([]);
1303
+ setSelectedCrash(null);
1304
+ },
1305
+ style: 'destructive',
1306
+ },
1307
+ ]);
1308
+ return;
1309
+ }
1252
1310
  // Default: APIs tab. Only clears NETWORK logs — never touches the other tabs.
1253
1311
  if (selectedLogs.size > 0) {
1254
1312
  setLogs(prev => prev.filter(l => !selectedLogs.has(l.id)));
@@ -1430,6 +1488,19 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
1430
1488
  setSelectedReduxAction,
1431
1489
  reduxActiveSubTab,
1432
1490
  setReduxActiveSubTab,
1491
+ // ─── Crash ───────────────────────────────────────────────────────────
1492
+ crashRecords,
1493
+ setCrashRecords,
1494
+ selectedCrash,
1495
+ setSelectedCrash,
1496
+ lastReadCrashesCount,
1497
+ maxCrashLogs,
1498
+ setMaxCrashLogs,
1499
+ clearAllCrashes: () => {
1500
+ (0, crashHandler_1.clearCrashRecords)();
1501
+ setCrashRecords([]);
1502
+ setSelectedCrash(null);
1503
+ },
1433
1504
  // ─── Settings ───────────────────────────────────────────────────────
1434
1505
  settingsActiveSubTab,
1435
1506
  setSettingsActiveSubTab,
@@ -1488,6 +1559,24 @@ Object.defineProperty(exports, "getCurrentUserProperties", { enumerable: true, g
1488
1559
  Object.defineProperty(exports, "getCurrentUserId", { enumerable: true, get: function () { return analyticsLogger_2.getCurrentUserId; } });
1489
1560
  Object.defineProperty(exports, "getDefaultEventParameters", { enumerable: true, get: function () { return analyticsLogger_2.getDefaultEventParameters; } });
1490
1561
  Object.defineProperty(exports, "getCollectionEnabled", { enumerable: true, get: function () { return analyticsLogger_2.getCollectionEnabled; } });
1562
+ var crashHandler_2 = require("./customHooks/crashHandler");
1563
+ Object.defineProperty(exports, "setupGlobalCrashHandler", { enumerable: true, get: function () { return crashHandler_2.setupGlobalCrashHandler; } });
1564
+ Object.defineProperty(exports, "subscribeCrashEvents", { enumerable: true, get: function () { return crashHandler_2.subscribeCrashEvents; } });
1565
+ Object.defineProperty(exports, "emitCrashEvent", { enumerable: true, get: function () { return crashHandler_2.emitCrashEvent; } });
1566
+ Object.defineProperty(exports, "getCrashRecords", { enumerable: true, get: function () { return crashHandler_2.getCrashRecords; } });
1567
+ Object.defineProperty(exports, "clearCrashRecords", { enumerable: true, get: function () { return crashHandler_2.clearCrashRecords; } });
1568
+ Object.defineProperty(exports, "simulateTestCrash", { enumerable: true, get: function () { return crashHandler_2.simulateTestCrash; } });
1569
+ Object.defineProperty(exports, "exportCrashReport", { enumerable: true, get: function () { return crashHandler_2.exportCrashReport; } });
1570
+ Object.defineProperty(exports, "parseCrashStackTrace", { enumerable: true, get: function () { return crashHandler_2.parseCrashStackTrace; } });
1571
+ Object.defineProperty(exports, "recordCustomCrash", { enumerable: true, get: function () { return crashHandler_2.recordCustomCrash; } });
1572
+ Object.defineProperty(exports, "addCrashBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.addCrashBreadcrumb; } });
1573
+ Object.defineProperty(exports, "recordNavigationBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordNavigationBreadcrumb; } });
1574
+ Object.defineProperty(exports, "recordNetworkBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordNetworkBreadcrumb; } });
1575
+ Object.defineProperty(exports, "recordReduxBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordReduxBreadcrumb; } });
1576
+ Object.defineProperty(exports, "recordUserActionBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordUserActionBreadcrumb; } });
1577
+ Object.defineProperty(exports, "computeCrashFingerprint", { enumerable: true, get: function () { return crashHandler_2.computeCrashFingerprint; } });
1578
+ var CrashTab_1 = require("./components/Inspector/CrashTab");
1579
+ Object.defineProperty(exports, "CrashTab", { enumerable: true, get: function () { return __importDefault(CrashTab_1).default; } });
1491
1580
  var ErrorBoundary_2 = require("./components/ErrorBoundary");
1492
1581
  Object.defineProperty(exports, "ErrorBoundary", { enumerable: true, get: function () { return __importDefault(ErrorBoundary_2).default; } });
1493
1582
  var reduxLogger_2 = require("./customHooks/reduxLogger");
@@ -1528,3 +1617,8 @@ Object.defineProperty(exports, "StackFrameType", { enumerable: true, get: functi
1528
1617
  Object.defineProperty(exports, "DiffResultType", { enumerable: true, get: function () { return types_1.DiffResultType; } });
1529
1618
  Object.defineProperty(exports, "BundleSubTab", { enumerable: true, get: function () { return types_1.BundleSubTab; } });
1530
1619
  Object.defineProperty(exports, "PerformanceSubTab", { enumerable: true, get: function () { return types_1.PerformanceSubTab; } });
1620
+ Object.defineProperty(exports, "CrashType", { enumerable: true, get: function () { return types_1.CrashType; } });
1621
+ Object.defineProperty(exports, "CrashExportFormat", { enumerable: true, get: function () { return types_1.CrashExportFormat; } });
1622
+ Object.defineProperty(exports, "CrashDetailSubTab", { enumerable: true, get: function () { return types_1.CrashDetailSubTab; } });
1623
+ Object.defineProperty(exports, "CrashFilterType", { enumerable: true, get: function () { return types_1.CrashFilterType; } });
1624
+ Object.defineProperty(exports, "BreadcrumbType", { enumerable: true, get: function () { return types_1.BreadcrumbType; } });
@@ -5,6 +5,7 @@ export declare const ActiveTab: {
5
5
  readonly Redux: "redux";
6
6
  readonly Bundle: "bundle";
7
7
  readonly Performance: "performance";
8
+ readonly Crash: "crash";
8
9
  };
9
10
  export type ActiveTab = (typeof ActiveTab)[keyof typeof ActiveTab];
10
11
  export declare const Method: {
@@ -50,6 +51,7 @@ export declare const SettingsPage: {
50
51
  readonly Redux: "redux";
51
52
  readonly Bundle: "bundle";
52
53
  readonly Performance: "performance";
54
+ readonly Crash: "crash";
53
55
  };
54
56
  export type SettingsPage = (typeof SettingsPage)[keyof typeof SettingsPage] | null;
55
57
  export declare const SettingsSubTab: {
@@ -113,3 +115,42 @@ export declare const PerformanceSubTab: {
113
115
  readonly Memory: "memory";
114
116
  };
115
117
  export type PerformanceSubTab = (typeof PerformanceSubTab)[keyof typeof PerformanceSubTab];
118
+ export declare const CrashType: {
119
+ readonly Native: "native";
120
+ readonly Js: "js";
121
+ readonly Promise: "promise";
122
+ readonly Render: "render";
123
+ readonly Custom: "custom";
124
+ };
125
+ export type CrashType = (typeof CrashType)[keyof typeof CrashType];
126
+ export declare const CrashExportFormat: {
127
+ readonly Text: "text";
128
+ readonly Markdown: "markdown";
129
+ readonly Json: "json";
130
+ };
131
+ export type CrashExportFormat = (typeof CrashExportFormat)[keyof typeof CrashExportFormat];
132
+ export declare const CrashDetailSubTab: {
133
+ readonly Stack: "stack";
134
+ readonly Diagnostics: "diagnostics";
135
+ readonly Breadcrumbs: "breadcrumbs";
136
+ readonly Raw: "raw";
137
+ };
138
+ export type CrashDetailSubTab = (typeof CrashDetailSubTab)[keyof typeof CrashDetailSubTab];
139
+ export declare const CrashFilterType: {
140
+ readonly All: "all";
141
+ readonly Fatal: "fatal";
142
+ readonly Js: "js";
143
+ readonly Promise: "promise";
144
+ readonly Render: "render";
145
+ readonly Native: "native";
146
+ };
147
+ export type CrashFilterType = (typeof CrashFilterType)[keyof typeof CrashFilterType];
148
+ export declare const BreadcrumbType: {
149
+ readonly Navigation: "navigation";
150
+ readonly Network: "network";
151
+ readonly Redux: "redux";
152
+ readonly Console: "console";
153
+ readonly User: "user";
154
+ readonly System: "system";
155
+ };
156
+ export type BreadcrumbType = (typeof BreadcrumbType)[keyof typeof BreadcrumbType];
@@ -3,7 +3,7 @@
3
3
  // Universal TypeScript Enum Objects and Type Aliases.
4
4
  // Allows both enum-style access (e.g. ActiveTab.Apis) and string literals ('apis').
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PerformanceSubTab = exports.BundleSubTab = exports.DiffResultType = exports.StackFrameType = exports.GAEventCategory = exports.AnalyticsEventSource = exports.ConsoleLogType = exports.LogFilter = exports.SettingsSubTab = exports.SettingsPage = exports.ModalAnimationType = exports.LocalFilter = exports.SortOrder = exports.StatusFilter = exports.Method = exports.ActiveTab = void 0;
6
+ exports.BreadcrumbType = exports.CrashFilterType = exports.CrashDetailSubTab = exports.CrashExportFormat = exports.CrashType = exports.PerformanceSubTab = exports.BundleSubTab = exports.DiffResultType = exports.StackFrameType = exports.GAEventCategory = exports.AnalyticsEventSource = exports.ConsoleLogType = exports.LogFilter = exports.SettingsSubTab = exports.SettingsPage = exports.ModalAnimationType = exports.LocalFilter = exports.SortOrder = exports.StatusFilter = exports.Method = exports.ActiveTab = void 0;
7
7
  exports.ActiveTab = {
8
8
  Apis: 'apis',
9
9
  Analytics: 'analytics',
@@ -11,6 +11,7 @@ exports.ActiveTab = {
11
11
  Redux: 'redux',
12
12
  Bundle: 'bundle',
13
13
  Performance: 'performance',
14
+ Crash: 'crash',
14
15
  };
15
16
  exports.Method = {
16
17
  All: 'ALL',
@@ -50,6 +51,7 @@ exports.SettingsPage = {
50
51
  Redux: 'redux',
51
52
  Bundle: 'bundle',
52
53
  Performance: 'performance',
54
+ Crash: 'crash',
53
55
  };
54
56
  exports.SettingsSubTab = {
55
57
  Module: 'module',
@@ -103,3 +105,37 @@ exports.PerformanceSubTab = {
103
105
  Interactions: 'interactions',
104
106
  Memory: 'memory',
105
107
  };
108
+ exports.CrashType = {
109
+ Native: 'native',
110
+ Js: 'js',
111
+ Promise: 'promise',
112
+ Render: 'render',
113
+ Custom: 'custom',
114
+ };
115
+ exports.CrashExportFormat = {
116
+ Text: 'text',
117
+ Markdown: 'markdown',
118
+ Json: 'json',
119
+ };
120
+ exports.CrashDetailSubTab = {
121
+ Stack: 'stack',
122
+ Diagnostics: 'diagnostics',
123
+ Breadcrumbs: 'breadcrumbs',
124
+ Raw: 'raw',
125
+ };
126
+ exports.CrashFilterType = {
127
+ All: 'all',
128
+ Fatal: 'fatal',
129
+ Js: 'js',
130
+ Promise: 'promise',
131
+ Render: 'render',
132
+ Native: 'native',
133
+ };
134
+ exports.BreadcrumbType = {
135
+ Navigation: 'navigation',
136
+ Network: 'network',
137
+ Redux: 'redux',
138
+ Console: 'console',
139
+ User: 'user',
140
+ System: 'system',
141
+ };