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
@@ -0,0 +1,36 @@
1
+ buildscript {
2
+ repositories {
3
+ google()
4
+ mavenCentral()
5
+ }
6
+ dependencies {
7
+ classpath 'com.android.tools.build:gradle:8.0.2'
8
+ }
9
+ }
10
+
11
+ apply plugin: 'com.android.library'
12
+
13
+ android {
14
+ compileSdkVersion 34
15
+
16
+ defaultConfig {
17
+ minSdkVersion 21
18
+ targetSdkVersion 34
19
+ versionCode 1
20
+ versionName "1.1.25"
21
+ }
22
+
23
+ lintOptions {
24
+ abortOnError false
25
+ }
26
+ }
27
+
28
+ repositories {
29
+ google()
30
+ mavenCentral()
31
+ }
32
+
33
+ dependencies {
34
+ //noinspection GradleDynamicVersion
35
+ implementation 'com.facebook.react:react-native:+'
36
+ }
@@ -0,0 +1,3 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="com.inappinspector">
3
+ </manifest>
@@ -0,0 +1,114 @@
1
+ package com.inappinspector;
2
+
3
+ import android.os.Handler;
4
+ import android.os.Looper;
5
+ import android.util.Log;
6
+
7
+ import androidx.annotation.NonNull;
8
+ import androidx.annotation.Nullable;
9
+
10
+ import com.facebook.react.bridge.Arguments;
11
+ import com.facebook.react.bridge.Promise;
12
+ import com.facebook.react.bridge.ReactApplicationContext;
13
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
14
+ import com.facebook.react.bridge.ReactMethod;
15
+ import com.facebook.react.bridge.WritableMap;
16
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
17
+
18
+ import java.io.PrintWriter;
19
+ import java.io.StringWriter;
20
+
21
+ public class NetworkInspectorModule extends ReactContextBaseJavaModule {
22
+ private static final String MODULE_NAME = "NetworkInspectorModule";
23
+ private static final String TAG = "NetworkInspector";
24
+ private final ReactApplicationContext reactContext;
25
+ private Thread.UncaughtExceptionHandler defaultHandler;
26
+ private boolean isProtectionEnabled = false;
27
+
28
+ public NetworkInspectorModule(ReactApplicationContext reactContext) {
29
+ super(reactContext);
30
+ this.reactContext = reactContext;
31
+ setupNativeCrashProtection();
32
+ }
33
+
34
+ @NonNull
35
+ @Override
36
+ public String getName() {
37
+ return MODULE_NAME;
38
+ }
39
+
40
+ private void setupNativeCrashProtection() {
41
+ if (isProtectionEnabled) return;
42
+ isProtectionEnabled = true;
43
+
44
+ try {
45
+ defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
46
+ Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
47
+ @Override
48
+ public void uncaughtException(@NonNull Thread thread, @NonNull Throwable throwable) {
49
+ try {
50
+ StringWriter sw = new StringWriter();
51
+ PrintWriter pw = new PrintWriter(sw);
52
+ throwable.printStackTrace(pw);
53
+ String stackTrace = sw.toString();
54
+ String message = throwable.getMessage() != null ? throwable.getMessage() : throwable.toString();
55
+
56
+ Log.e(TAG, "Intercepted Android Native Crash: " + message, throwable);
57
+
58
+ sendCrashEventToJS(message, stackTrace, thread.getName());
59
+ } catch (Exception e) {
60
+ Log.e(TAG, "Failed to dispatch native crash event", e);
61
+ }
62
+
63
+ // Keep main looper processing to prevent instant process exit
64
+ if (Looper.myLooper() != null) {
65
+ while (true) {
66
+ try {
67
+ Looper.loop();
68
+ } catch (Throwable inner) {
69
+ Log.e(TAG, "Caught inner loop exception", inner);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ });
75
+ } catch (Exception e) {
76
+ Log.e(TAG, "Error installing uncaught exception handler", e);
77
+ }
78
+ }
79
+
80
+ private void sendCrashEventToJS(String message, String stackTrace, String threadName) {
81
+ try {
82
+ if (reactContext != null && reactContext.hasActiveReactInstance()) {
83
+ WritableMap params = Arguments.createMap();
84
+ params.putString("platform", "android");
85
+ params.putString("message", message);
86
+ params.putString("stack", stackTrace);
87
+ params.putString("thread", threadName);
88
+ params.putDouble("timestamp", System.currentTimeMillis());
89
+
90
+ reactContext
91
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
92
+ .emit("onNativeCrash", params);
93
+ }
94
+ } catch (Exception e) {
95
+ Log.e(TAG, "Failed to emit onNativeCrash to JS", e);
96
+ }
97
+ }
98
+
99
+ @ReactMethod
100
+ public void enableNativeCrashProtection(Promise promise) {
101
+ setupNativeCrashProtection();
102
+ promise.resolve(true);
103
+ }
104
+
105
+ @ReactMethod
106
+ public void addListener(String eventName) {
107
+ // Required for RN built-in Event Emitter
108
+ }
109
+
110
+ @ReactMethod
111
+ public void removeListeners(double count) {
112
+ // Required for RN built-in Event Emitter
113
+ }
114
+ }
@@ -0,0 +1,28 @@
1
+ package com.inappinspector;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.ReactPackage;
6
+ import com.facebook.react.bridge.NativeModule;
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.facebook.react.uimanager.ViewManager;
9
+
10
+ import java.util.ArrayList;
11
+ import java.util.Collections;
12
+ import java.util.List;
13
+
14
+ public class NetworkInspectorPackage implements ReactPackage {
15
+ @NonNull
16
+ @Override
17
+ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
18
+ List<NativeModule> modules = new ArrayList<>();
19
+ modules.add(new NetworkInspectorModule(reactContext));
20
+ return modules;
21
+ }
22
+
23
+ @NonNull
24
+ @Override
25
+ public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
26
+ return Collections.emptyList();
27
+ }
28
+ }
@@ -6,6 +6,6 @@ export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBo
6
6
  componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
7
7
  private handleReset;
8
8
  private handleCopyTrace;
9
- render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode>> | React.JSX.Element;
9
+ render(): React.ReactNode;
10
10
  }
11
11
  export default ErrorBoundary;
@@ -1,45 +1,13 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.ErrorBoundary = void 0;
37
- const react_1 = __importStar(require("react"));
4
+ const react_1 = require("react");
38
5
  const react_native_1 = require("react-native");
39
6
  const AppColors_1 = require("../styles/AppColors");
40
7
  const AppFonts_1 = require("../styles/AppFonts");
41
8
  const helpers_1 = require("../helpers");
42
- const NetworkIcons_1 = require("./NetworkIcons");
9
+ const crashHandler_1 = require("../customHooks/crashHandler");
10
+ const enums_1 = require("../types/enums");
43
11
  function parseStackTrace(stack) {
44
12
  if (!stack)
45
13
  return null;
@@ -104,119 +72,15 @@ ${error.stack}`;
104
72
  return { hasError: true, error };
105
73
  }
106
74
  componentDidCatch(error, errorInfo) {
107
- console.error('InAppInspector ErrorBoundary caught a crash:', error, errorInfo);
75
+ try {
76
+ const stack = error?.stack || errorInfo?.componentStack;
77
+ (0, crashHandler_1.handleInterceptedCrash)(error, stack, false, enums_1.CrashType.Render, errorInfo?.componentStack);
78
+ }
79
+ catch { }
108
80
  }
109
81
  render() {
110
82
  if (this.state.hasError) {
111
- const isInline = this.props.fallbackType === 'inline';
112
- if (isInline) {
113
- return (<react_native_1.View style={styles.inlineContainer}>
114
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
115
- <NetworkIcons_1.WarningTriangleIcon color={AppColors_1.AppColors.redErrorText} size={14}/>
116
- <react_native_1.Text style={styles.inlineTitle}>Inspector Crash</react_native_1.Text>
117
- </react_native_1.View>
118
- <react_native_1.TouchableOpacity style={styles.inlineResetBtn} onPress={this.handleReset}>
119
- <react_native_1.Text style={styles.inlineResetText}>Reload</react_native_1.Text>
120
- </react_native_1.TouchableOpacity>
121
- </react_native_1.View>);
122
- }
123
- const error = this.state.error;
124
- const isNativeCrash = error ? (error.message.includes('Native') || error.message.includes('native') || error.message.includes('Swift') || error.message.includes('Java')) : false;
125
- const parsed = error && error.stack ? parseStackTrace(error.stack) : null;
126
- return (<react_native_1.View style={styles.container}>
127
- <react_native_1.View style={styles.card}>
128
- <react_native_1.View style={{ marginBottom: 12, alignItems: 'center' }}>
129
- <NetworkIcons_1.WarningTriangleIcon color={AppColors_1.AppColors.amber500} size={44}/>
130
- </react_native_1.View>
131
- <react_native_1.Text style={styles.title}>Something went wrong</react_native_1.Text>
132
-
133
- <react_native_1.View style={{
134
- flexDirection: 'row',
135
- alignItems: 'center',
136
- backgroundColor: isNativeCrash ? `${AppColors_1.AppColors.errorColor}1A` : `${AppColors_1.AppColors.amber500}1A`,
137
- paddingHorizontal: 10,
138
- paddingVertical: 4,
139
- borderRadius: 20,
140
- marginBottom: 12,
141
- gap: 4
142
- }}>
143
- <react_native_1.View style={{
144
- width: 8,
145
- height: 8,
146
- borderRadius: 4,
147
- backgroundColor: isNativeCrash ? AppColors_1.AppColors.errorColor : AppColors_1.AppColors.amber500,
148
- }}/>
149
- <react_native_1.Text style={{
150
- fontSize: 10,
151
- fontWeight: 'bold',
152
- color: isNativeCrash ? AppColors_1.AppColors.errorColor : AppColors_1.AppColors.amber500,
153
- fontFamily: AppFonts_1.AppFonts.interBold || 'System'
154
- }}>
155
- {isNativeCrash ? 'NATIVE CRASH' : 'JAVASCRIPT CRASH'}
156
- </react_native_1.Text>
157
- </react_native_1.View>
158
-
159
- <react_native_1.Text style={styles.subtitle}>
160
- The In-App Inspector or active view encountered an error. Traceback details are parsed below:
161
- </react_native_1.Text>
162
-
163
- {parsed && (<react_native_1.View style={{
164
- backgroundColor: AppColors_1.AppColors.slate100,
165
- borderRadius: 8,
166
- padding: 10,
167
- width: '100%',
168
- marginBottom: 10,
169
- borderWidth: 1,
170
- borderColor: AppColors_1.AppColors.slate200,
171
- gap: 4
172
- }}>
173
- <react_native_1.Text style={{ fontSize: 11, color: AppColors_1.AppColors.slate600, fontFamily: AppFonts_1.AppFonts.interMedium }} numberOfLines={1}>
174
- <react_native_1.Text style={{ fontWeight: 'bold' }}>Method:</react_native_1.Text> {parsed.method}
175
- </react_native_1.Text>
176
- <react_native_1.Text style={{ fontSize: 11, color: AppColors_1.AppColors.slate600, fontFamily: AppFonts_1.AppFonts.interMedium }} numberOfLines={1}>
177
- <react_native_1.Text style={{ fontWeight: 'bold' }}>File:</react_native_1.Text> {parsed.file}
178
- </react_native_1.Text>
179
- <react_native_1.Text style={{ fontSize: 11, color: AppColors_1.AppColors.slate600, fontFamily: AppFonts_1.AppFonts.interMedium }}>
180
- <react_native_1.Text style={{ fontWeight: 'bold' }}>Line:</react_native_1.Text> {parsed.line} <react_native_1.Text style={{ fontWeight: 'bold' }}>Col:</react_native_1.Text> {parsed.column}
181
- </react_native_1.Text>
182
- </react_native_1.View>)}
183
-
184
- {error && (<react_native_1.ScrollView style={styles.scroll} contentContainerStyle={styles.scrollContent}>
185
- <react_native_1.Text style={styles.code}>
186
- {error.message}
187
- {'\n\n'}
188
- {error.stack}
189
- </react_native_1.Text>
190
- </react_native_1.ScrollView>)}
191
-
192
- <react_native_1.View style={{ width: '100%', gap: 8, marginBottom: 12 }}>
193
- <react_native_1.TouchableOpacity style={{
194
- backgroundColor: AppColors_1.AppColors.slate900,
195
- height: 38,
196
- borderRadius: 8,
197
- justifyContent: 'center',
198
- alignItems: 'center',
199
- flexDirection: 'row',
200
- gap: 6
201
- }} onPress={this.handleCopyTrace}>
202
- <NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.white} size={14}/>
203
- <react_native_1.Text style={{ color: AppColors_1.AppColors.white, fontSize: 12, fontWeight: 'bold', fontFamily: AppFonts_1.AppFonts.interBold || 'System' }}>
204
- Copy Crash Traceback
205
- </react_native_1.Text>
206
- </react_native_1.TouchableOpacity>
207
- </react_native_1.View>
208
-
209
- <react_native_1.View style={styles.btnRow}>
210
- <react_native_1.TouchableOpacity style={styles.resetBtn} onPress={this.handleReset}>
211
- <react_native_1.Text style={styles.resetBtnText}>Retry / Reload</react_native_1.Text>
212
- </react_native_1.TouchableOpacity>
213
-
214
- {this.props.onClose && (<react_native_1.TouchableOpacity style={styles.closeBtn} onPress={this.props.onClose}>
215
- <react_native_1.Text style={styles.closeBtnText}>Close Inspector</react_native_1.Text>
216
- </react_native_1.TouchableOpacity>)}
217
- </react_native_1.View>
218
- </react_native_1.View>
219
- </react_native_1.View>);
83
+ return null;
220
84
  }
221
85
  return this.props.children;
222
86
  }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const CrashDetail: React.FC;
3
+ export default CrashDetail;