react-native-inapp-inspector 1.1.27 → 1.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +29 -46
- package/dist/commonjs/components/AppHeaderLogo.js +12 -15
- package/dist/commonjs/components/ConsoleLogCard.js +31 -7
- package/dist/commonjs/components/CopyButton.js +15 -1
- package/dist/commonjs/components/DomainHeader.js +56 -28
- package/dist/commonjs/components/ErrorBoundary.d.ts +1 -1
- package/dist/commonjs/components/ErrorBoundary.js +530 -100
- package/dist/commonjs/components/HighlightText.js +7 -1
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +190 -126
- package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -0
- package/dist/commonjs/components/Inspector/BundleTab.js +145 -21
- package/dist/commonjs/components/Inspector/CrashTab.js +0 -8
- package/dist/commonjs/components/Inspector/InspectorHeader.js +17 -3
- package/dist/commonjs/components/Inspector/LogDetail.js +8 -5
- package/dist/commonjs/components/Inspector/MainScreen.js +4 -0
- package/dist/commonjs/components/Inspector/NetworkDetail.js +65 -24
- package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +5 -0
- package/dist/commonjs/components/Inspector/PerformanceTab.js +588 -155
- package/dist/commonjs/components/Inspector/SettingsPanel.js +57 -22
- package/dist/commonjs/components/Inspector/TabBar.js +13 -1
- package/dist/commonjs/components/JsonViewer.js +25 -3
- package/dist/commonjs/components/LogCard.js +173 -40
- package/dist/commonjs/components/NetworkIcons.d.ts +112 -102
- package/dist/commonjs/components/Toast.d.ts +3 -0
- package/dist/commonjs/components/Toast.js +152 -0
- package/dist/commonjs/components/TouchableScale.d.ts +1 -0
- package/dist/commonjs/components/TouchableScale.js +3 -3
- package/dist/commonjs/components/TreeNode.js +1 -1
- package/dist/commonjs/constants/index.js +6 -6
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.d.ts +1 -11
- package/dist/commonjs/customHooks/analyticsLogger.js +8 -1
- package/dist/commonjs/customHooks/bundleAnalyzer.js +121 -124
- package/dist/commonjs/customHooks/networkLogger.d.ts +1 -0
- package/dist/commonjs/customHooks/networkLogger.js +16 -0
- package/dist/commonjs/customHooks/performanceTracker.d.ts +74 -0
- package/dist/commonjs/customHooks/performanceTracker.js +546 -392
- package/dist/commonjs/customHooks/reduxLogger.d.ts +1 -0
- package/dist/commonjs/customHooks/reduxLogger.js +3 -1
- package/dist/commonjs/helpers/index.d.ts +4 -0
- package/dist/commonjs/helpers/index.js +92 -69
- package/dist/commonjs/helpers/toast.d.ts +4 -0
- package/dist/commonjs/helpers/toast.js +20 -0
- package/dist/commonjs/i18n/locales/en.json +229 -5
- package/dist/commonjs/index.d.ts +1 -1
- package/dist/commonjs/index.js +36 -2
- package/dist/commonjs/styles/index.d.ts +63 -15
- package/dist/commonjs/styles/index.js +79 -32
- package/dist/commonjs/types/interfaces.d.ts +3 -0
- package/dist/esm/components/AppHeaderLogo.js +12 -15
- package/dist/esm/components/ConsoleLogCard.js +33 -9
- package/dist/esm/components/CopyButton.js +15 -1
- package/dist/esm/components/DomainHeader.js +56 -28
- package/dist/esm/components/ErrorBoundary.d.ts +1 -1
- package/dist/esm/components/ErrorBoundary.js +498 -101
- package/dist/esm/components/HighlightText.js +7 -1
- package/dist/esm/components/Inspector/AnalyticsTab.js +191 -127
- package/dist/esm/components/Inspector/BundleTab.d.ts +1 -0
- package/dist/esm/components/Inspector/BundleTab.js +145 -23
- package/dist/esm/components/Inspector/CrashTab.js +0 -8
- package/dist/esm/components/Inspector/InspectorHeader.js +18 -4
- package/dist/esm/components/Inspector/LogDetail.js +10 -7
- package/dist/esm/components/Inspector/MainScreen.js +4 -0
- package/dist/esm/components/Inspector/NetworkDetail.js +66 -25
- package/dist/esm/components/Inspector/PerformanceTab.d.ts +5 -0
- package/dist/esm/components/Inspector/PerformanceTab.js +591 -158
- package/dist/esm/components/Inspector/SettingsPanel.js +57 -22
- package/dist/esm/components/Inspector/TabBar.js +13 -1
- package/dist/esm/components/JsonViewer.js +25 -3
- package/dist/esm/components/LogCard.js +175 -42
- package/dist/esm/components/NetworkIcons.d.ts +112 -102
- package/dist/esm/components/Toast.d.ts +3 -0
- package/dist/esm/components/Toast.js +117 -0
- package/dist/esm/components/TouchableScale.d.ts +1 -0
- package/dist/esm/components/TouchableScale.js +3 -3
- package/dist/esm/components/TreeNode.js +1 -1
- package/dist/esm/constants/index.js +6 -6
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.d.ts +1 -11
- package/dist/esm/customHooks/analyticsLogger.js +6 -0
- package/dist/esm/customHooks/bundleAnalyzer.js +121 -124
- package/dist/esm/customHooks/networkLogger.d.ts +1 -0
- package/dist/esm/customHooks/networkLogger.js +16 -0
- package/dist/esm/customHooks/performanceTracker.d.ts +74 -0
- package/dist/esm/customHooks/performanceTracker.js +531 -391
- package/dist/esm/customHooks/reduxLogger.d.ts +1 -0
- package/dist/esm/customHooks/reduxLogger.js +1 -0
- package/dist/esm/helpers/index.d.ts +4 -0
- package/dist/esm/helpers/index.js +87 -69
- package/dist/esm/helpers/toast.d.ts +4 -0
- package/dist/esm/helpers/toast.js +15 -0
- package/dist/esm/i18n/locales/en.json +229 -5
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +24 -3
- package/dist/esm/styles/index.d.ts +63 -15
- package/dist/esm/styles/index.js +79 -32
- package/dist/esm/types/interfaces.d.ts +3 -0
- package/package.json +4 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ReduxHistoryEntry } from '../types';
|
|
2
2
|
export { ReduxHistoryEntry };
|
|
3
|
+
export declare const isReduxConnected: () => boolean;
|
|
3
4
|
export declare const getReduxState: () => any;
|
|
4
5
|
export declare const setReduxAutoRefresh: (val: boolean) => void;
|
|
5
6
|
export declare const getReduxAutoRefresh: () => boolean;
|
|
@@ -23,6 +23,7 @@ let historyIdSeq = 0;
|
|
|
23
23
|
// timeline entries and inconsistent counts.
|
|
24
24
|
const connectedStores = new WeakSet();
|
|
25
25
|
let middlewareAttached = false;
|
|
26
|
+
export const isReduxConnected = () => middlewareAttached || currentReduxState != null || actionHistory.length > 0;
|
|
26
27
|
export const getReduxState = () => currentReduxState;
|
|
27
28
|
export const setReduxAutoRefresh = (val) => {
|
|
28
29
|
globalReduxAutoRefresh = val;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NetworkLog, RouteInfo, DiffResult, JsonContent, StackFrameType } from '../types';
|
|
2
2
|
export declare const getDomainColor: (domain: string) => string;
|
|
3
3
|
export declare const formatDateTime: (timestamp: number) => string;
|
|
4
|
+
export declare const formatTimestamp: (timestamp: number) => string;
|
|
4
5
|
export declare const getStatusColor: (status: number | null) => string;
|
|
5
6
|
export declare const getDurationColor: (duration: number | null) => string;
|
|
6
7
|
export declare const getSize: (data: unknown) => string;
|
|
@@ -44,6 +45,7 @@ export interface ParsedStackFrame {
|
|
|
44
45
|
frameType: StackFrameType | 'app' | 'dependency' | 'runtime' | 'native';
|
|
45
46
|
isUserCode: boolean;
|
|
46
47
|
isRuntimeNoise: boolean;
|
|
48
|
+
rawFilePath?: string;
|
|
47
49
|
lineNumber?: string;
|
|
48
50
|
columnNumber?: string;
|
|
49
51
|
isOrigin?: boolean;
|
|
@@ -51,6 +53,8 @@ export interface ParsedStackFrame {
|
|
|
51
53
|
}
|
|
52
54
|
/** Parses a stack trace line to extract function name, file name, extension (.tsx/.jsx/.ts), line, and column numbers */
|
|
53
55
|
export declare const parseStackLine: (rawLine: string, isOrigin?: boolean) => ParsedStackFrame;
|
|
56
|
+
/** Opens a file and line number directly in VS Code */
|
|
57
|
+
export declare const openInVSCode: (filePath: string, lineNumber?: string | number, columnNumber?: string | number) => void;
|
|
54
58
|
export declare const ANALYTICS_EVENT_PALETTE: string[];
|
|
55
59
|
export declare const getEventColor: (name: string) => string;
|
|
56
60
|
export { getEventCategory, registerGAPlugin, type GAEventCategory, type GAPlugin, } from './gaAnalyticsRegistry';
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Platform, ToastAndroid, Alert, NativeModules, Linking, } from 'react-native';
|
|
2
|
+
import Clipboard from '@react-native-clipboard/clipboard';
|
|
3
|
+
import { showToast } from './toast';
|
|
2
4
|
// Stylesheet
|
|
3
5
|
import { AppColors } from '../styles/AppColors';
|
|
4
6
|
// Constants
|
|
@@ -23,6 +25,19 @@ export const formatDateTime = (timestamp) => {
|
|
|
23
25
|
const seconds = pad(date.getSeconds());
|
|
24
26
|
return `${day}/${month}/${year} ${hours}:${minutes}:${seconds}`;
|
|
25
27
|
};
|
|
28
|
+
export const formatTimestamp = (timestamp) => {
|
|
29
|
+
try {
|
|
30
|
+
const date = new Date(timestamp);
|
|
31
|
+
const hours = date.getHours().toString().padStart(2, '0');
|
|
32
|
+
const minutes = date.getMinutes().toString().padStart(2, '0');
|
|
33
|
+
const seconds = date.getSeconds().toString().padStart(2, '0');
|
|
34
|
+
const ms = date.getMilliseconds().toString().padStart(3, '0');
|
|
35
|
+
return `${hours}:${minutes}:${seconds}.${ms}`;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return '—';
|
|
39
|
+
}
|
|
40
|
+
};
|
|
26
41
|
export const getStatusColor = (status) => {
|
|
27
42
|
if (!status || status === 0)
|
|
28
43
|
return AppColors.errorColor;
|
|
@@ -52,80 +67,43 @@ export const getSize = (data) => {
|
|
|
52
67
|
return '—';
|
|
53
68
|
}
|
|
54
69
|
};
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return tm;
|
|
68
|
-
}
|
|
70
|
+
export const copyToClipboard = (value, label) => {
|
|
71
|
+
const resolved = typeof value === 'function' ? value() : value;
|
|
72
|
+
let textToCopy = '';
|
|
73
|
+
if (typeof resolved === 'string') {
|
|
74
|
+
textToCopy = resolved;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
try {
|
|
78
|
+
textToCopy = JSON.stringify(resolved, null, 2);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
textToCopy = String(resolved);
|
|
69
82
|
}
|
|
70
83
|
}
|
|
71
|
-
|
|
72
|
-
// 2. Check legacy NativeModules table (Bridge / Old Architecture)
|
|
84
|
+
// Use @react-native-clipboard/clipboard npm package
|
|
73
85
|
try {
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
return NativeModules.RNCClipboard;
|
|
86
|
+
if (typeof Clipboard?.setString === 'function') {
|
|
87
|
+
Clipboard.setString(textToCopy);
|
|
77
88
|
}
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
return NativeModules.ExpoClipboard;
|
|
81
|
-
}
|
|
82
|
-
if (NativeModules?.Clipboard &&
|
|
83
|
-
typeof NativeModules.Clipboard.setString === 'function') {
|
|
84
|
-
return NativeModules.Clipboard;
|
|
89
|
+
else if (typeof Clipboard?.default?.setString === 'function') {
|
|
90
|
+
Clipboard.default.setString(textToCopy);
|
|
85
91
|
}
|
|
86
92
|
}
|
|
87
|
-
catch {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (Clipboard && typeof Clipboard.setString === 'function') {
|
|
91
|
-
return Clipboard;
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (__DEV__) {
|
|
95
|
+
console.warn('[NetworkInspector] Clipboard.setString failed:', err);
|
|
92
96
|
}
|
|
93
97
|
}
|
|
94
|
-
|
|
95
|
-
return null;
|
|
96
|
-
};
|
|
97
|
-
export const copyToClipboard = (value, label) => {
|
|
98
|
-
const resolved = typeof value === 'function' ? value() : value;
|
|
99
|
-
const text = typeof resolved === 'string' ? resolved : JSON.stringify(resolved, null, 2);
|
|
100
|
-
const textToCopy = text ?? '';
|
|
101
|
-
let copied = false;
|
|
98
|
+
// Trigger floating in-app bottom toast notification
|
|
102
99
|
try {
|
|
103
|
-
|
|
104
|
-
if (cb) {
|
|
105
|
-
if (typeof cb.setStringAsync === 'function') {
|
|
106
|
-
cb.setStringAsync(textToCopy);
|
|
107
|
-
copied = true;
|
|
108
|
-
}
|
|
109
|
-
else if (typeof cb.setString === 'function') {
|
|
110
|
-
cb.setString(textToCopy);
|
|
111
|
-
copied = true;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
100
|
+
showToast(label ? `${label} copied to clipboard` : 'Copied to clipboard');
|
|
114
101
|
}
|
|
115
102
|
catch { }
|
|
116
|
-
|
|
117
|
-
try {
|
|
118
|
-
if (typeof navigator !== 'undefined' && navigator?.clipboard?.writeText) {
|
|
119
|
-
navigator.clipboard.writeText(textToCopy);
|
|
120
|
-
copied = true;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch { }
|
|
124
|
-
}
|
|
125
|
-
// Visual toast feedback on Android if ToastAndroid exists
|
|
103
|
+
// Native Android Toast fallback
|
|
126
104
|
try {
|
|
127
105
|
if (Platform.OS === 'android' && ToastAndroid?.show) {
|
|
128
|
-
ToastAndroid.show(`${label} copied
|
|
106
|
+
ToastAndroid.show(label ? `${label} copied to clipboard` : 'Copied to clipboard', ToastAndroid.SHORT);
|
|
129
107
|
}
|
|
130
108
|
}
|
|
131
109
|
catch { }
|
|
@@ -511,11 +489,16 @@ export const parseStackLine = (rawLine, isOrigin = false) => {
|
|
|
511
489
|
(functionName === 'next' && isNative);
|
|
512
490
|
const isDependency = cleanPath.includes('node_modules') ||
|
|
513
491
|
cleanPath.includes('react-native/Libraries') ||
|
|
514
|
-
(cleanPath.includes('react-native-inapp-inspector') &&
|
|
492
|
+
(cleanPath.includes('react-native-inapp-inspector') &&
|
|
493
|
+
!cleanPath.includes('/example/'));
|
|
515
494
|
const isUserCode = !isNative &&
|
|
516
495
|
!isInternalBytecode &&
|
|
517
496
|
!isDependency &&
|
|
518
|
-
(fileExt === 'tsx' ||
|
|
497
|
+
(fileExt === 'tsx' ||
|
|
498
|
+
fileExt === 'jsx' ||
|
|
499
|
+
fileExt === 'ts' ||
|
|
500
|
+
fileExt === 'js' ||
|
|
501
|
+
!fileName.includes('.bundle'));
|
|
519
502
|
const frameType = isUserCode
|
|
520
503
|
? 'app'
|
|
521
504
|
: isDependency
|
|
@@ -523,7 +506,10 @@ export const parseStackLine = (rawLine, isOrigin = false) => {
|
|
|
523
506
|
: isNative
|
|
524
507
|
? 'native'
|
|
525
508
|
: 'runtime';
|
|
526
|
-
const isRuntimeNoise = isInternalBytecode ||
|
|
509
|
+
const isRuntimeNoise = isInternalBytecode ||
|
|
510
|
+
isNative ||
|
|
511
|
+
functionName === 'asyncGeneratorStep' ||
|
|
512
|
+
functionName === '_next';
|
|
527
513
|
// Format clean relative project path
|
|
528
514
|
let relativePath = cleanPath;
|
|
529
515
|
if (relativePath.includes('/example/')) {
|
|
@@ -543,6 +529,7 @@ export const parseStackLine = (rawLine, isOrigin = false) => {
|
|
|
543
529
|
functionName,
|
|
544
530
|
fileName,
|
|
545
531
|
fullPath: relativePath,
|
|
532
|
+
rawFilePath: fullPath,
|
|
546
533
|
fileExt,
|
|
547
534
|
frameType,
|
|
548
535
|
isUserCode,
|
|
@@ -553,6 +540,30 @@ export const parseStackLine = (rawLine, isOrigin = false) => {
|
|
|
553
540
|
copyableLocation,
|
|
554
541
|
};
|
|
555
542
|
};
|
|
543
|
+
/** Opens a file and line number directly in VS Code */
|
|
544
|
+
export const openInVSCode = (filePath, lineNumber, columnNumber) => {
|
|
545
|
+
const line = lineNumber ? `:${lineNumber}` : '';
|
|
546
|
+
const col = columnNumber ? `:${columnNumber}` : '';
|
|
547
|
+
const cleanPath = filePath.replace(/^file:\/\//, '');
|
|
548
|
+
const vscodeUrl = `vscode://file/${cleanPath.replace(/^\/+/, '')}${line}${col}`;
|
|
549
|
+
Linking.canOpenURL(vscodeUrl)
|
|
550
|
+
.then(supported => {
|
|
551
|
+
if (supported) {
|
|
552
|
+
Linking.openURL(vscodeUrl);
|
|
553
|
+
}
|
|
554
|
+
else {
|
|
555
|
+
Linking.openURL(vscodeUrl).catch(() => {
|
|
556
|
+
const insidersUrl = `vscode-insiders://file/${cleanPath.replace(/^\/+/, '')}${line}${col}`;
|
|
557
|
+
Linking.openURL(insidersUrl).catch(() => {
|
|
558
|
+
Alert.alert('Open in VS Code', `Target location:\n${cleanPath}${line}${col}\n\nPlease ensure VS Code is installed.`, [{ text: 'OK' }]);
|
|
559
|
+
});
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
})
|
|
563
|
+
.catch(() => {
|
|
564
|
+
Linking.openURL(vscodeUrl).catch(() => { });
|
|
565
|
+
});
|
|
566
|
+
};
|
|
556
567
|
// ─── Analytics Helpers ────────────────────────────────────────────────────────
|
|
557
568
|
export const ANALYTICS_EVENT_PALETTE = [
|
|
558
569
|
AppColors.googleBlue,
|
|
@@ -607,7 +618,11 @@ export const getCategoryColors = (category) => {
|
|
|
607
618
|
export const getRuntimeDiagnostics = () => {
|
|
608
619
|
const isHermes = typeof global.HermesInternal !== 'undefined';
|
|
609
620
|
const isV8 = typeof global._v8runtime !== 'undefined';
|
|
610
|
-
const engineType = isHermes
|
|
621
|
+
const engineType = isHermes
|
|
622
|
+
? 'hermes'
|
|
623
|
+
: isV8
|
|
624
|
+
? 'v8'
|
|
625
|
+
: 'jsc';
|
|
611
626
|
const isFabric = typeof global.nativeFabricUIManager !== 'undefined' ||
|
|
612
627
|
Boolean(global.__turboModuleProxy);
|
|
613
628
|
const archType = isFabric ? 'fabric' : 'paper';
|
|
@@ -617,11 +632,14 @@ export const getRuntimeDiagnostics = () => {
|
|
|
617
632
|
const hermesStats = global.HermesInternal?.getInstrumentedStats?.();
|
|
618
633
|
if (hermesStats?.js_heap_size) {
|
|
619
634
|
usedHeapMb = Number((hermesStats.js_heap_size / (1024 * 1024)).toFixed(1));
|
|
620
|
-
totalAllocMb = Number(((hermesStats.js_allocated_bytes || hermesStats.js_heap_size * 1.6) /
|
|
635
|
+
totalAllocMb = Number(((hermesStats.js_allocated_bytes || hermesStats.js_heap_size * 1.6) /
|
|
636
|
+
(1024 * 1024)).toFixed(1));
|
|
621
637
|
}
|
|
622
638
|
else if (global.performance?.memory?.usedJSHeapSize) {
|
|
623
|
-
usedHeapMb = Number((global.performance.memory.usedJSHeapSize /
|
|
624
|
-
|
|
639
|
+
usedHeapMb = Number((global.performance.memory.usedJSHeapSize /
|
|
640
|
+
(1024 * 1024)).toFixed(1));
|
|
641
|
+
totalAllocMb = Number((global.performance.memory.totalJSHeapSize /
|
|
642
|
+
(1024 * 1024)).toFixed(1));
|
|
625
643
|
}
|
|
626
644
|
}
|
|
627
645
|
catch { }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const listeners = new Set();
|
|
2
|
+
export const showToast = (message) => {
|
|
3
|
+
listeners.forEach(fn => {
|
|
4
|
+
try {
|
|
5
|
+
fn(message);
|
|
6
|
+
}
|
|
7
|
+
catch { }
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
export const subscribeToast = (listener) => {
|
|
11
|
+
listeners.add(listener);
|
|
12
|
+
return () => {
|
|
13
|
+
listeners.delete(listener);
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
"expandAll": "Expand All",
|
|
16
16
|
"viewOnNpm": "View on NPM",
|
|
17
17
|
"later": "Later",
|
|
18
|
-
"source": "SOURCE"
|
|
18
|
+
"source": "SOURCE",
|
|
19
|
+
"open": "Open",
|
|
20
|
+
"openInBrowser": "Open in Browser",
|
|
21
|
+
"openInBrowserPrompt": "Are you sure you want to open this URL in your external browser?"
|
|
19
22
|
},
|
|
20
23
|
"header": {
|
|
21
24
|
"updateAvailableTitle": "Update Available",
|
|
@@ -39,6 +42,11 @@
|
|
|
39
42
|
"mainTitle": "Settings",
|
|
40
43
|
"requiredBadge": "REQUIRED",
|
|
41
44
|
"defaultBadge": "DEFAULT",
|
|
45
|
+
"notConnectedBadge": "NOT CONNECTED",
|
|
46
|
+
"notDetectedBadge": "NOT DETECTED",
|
|
47
|
+
"readOnlyBadge": "READ ONLY",
|
|
48
|
+
"reduxNotConnectedTip": "Redux store is not connected. Call connectReduxStore(store) or use inspectorReduxMiddleware to enable.",
|
|
49
|
+
"analyticsNotConnectedTip": "Analytics is not initialized. Call setupAnalyticsLogger(analytics()) to enable.",
|
|
42
50
|
"tabVisibility": "Tab Visibility",
|
|
43
51
|
"tabVisibilityDescription": "Choose which modules appear in the inspector",
|
|
44
52
|
"settingsTitle": "Settings",
|
|
@@ -262,7 +270,19 @@
|
|
|
262
270
|
"pageViewCategory": "Page View",
|
|
263
271
|
"ecommerceCategory": "Ecommerce",
|
|
264
272
|
"systemCategory": "System",
|
|
265
|
-
"customCategory": "Custom"
|
|
273
|
+
"customCategory": "Custom",
|
|
274
|
+
"realtimeStream": "Realtime Activity",
|
|
275
|
+
"liveTelemetry": "Live Telemetry",
|
|
276
|
+
"eventsInWindow": "events in window",
|
|
277
|
+
"eventVelocity": "{{rate}} ev/min",
|
|
278
|
+
"peakVolume": "Peak: {{count}}",
|
|
279
|
+
"time30mAgo": "-30m",
|
|
280
|
+
"time20mAgo": "-20m",
|
|
281
|
+
"time10mAgo": "-10m",
|
|
282
|
+
"timeNow": "NOW",
|
|
283
|
+
"selectedBucket": "Bucket: {{time}} ({{count}} events)",
|
|
284
|
+
"totalRevenue": "Revenue",
|
|
285
|
+
"activeDistribution": "Category Split"
|
|
266
286
|
},
|
|
267
287
|
"redux": {
|
|
268
288
|
"title": "Redux",
|
|
@@ -351,6 +371,14 @@
|
|
|
351
371
|
"components": "Components",
|
|
352
372
|
"memoryGc": "Memory & GC",
|
|
353
373
|
"networkIo": "Network & I/O",
|
|
374
|
+
"catAll": "All",
|
|
375
|
+
"catJanky": "Janky",
|
|
376
|
+
"catNavigation": "Navigation",
|
|
377
|
+
"catRender": "Components",
|
|
378
|
+
"catMemory": "Memory",
|
|
379
|
+
"catIo": "I/O",
|
|
380
|
+
"recording": "Recording",
|
|
381
|
+
"paused": "Paused",
|
|
354
382
|
"budgetHeadroom": "~{{time}}ms Headroom ({{percent}}%)",
|
|
355
383
|
"jsExec": "JS Exec: {{time}}ms",
|
|
356
384
|
"yogaLayoutTime": "Yoga Layout: {{time}}ms",
|
|
@@ -370,8 +398,144 @@
|
|
|
370
398
|
"fpsUnit": "FPS",
|
|
371
399
|
"jsLag": "JS Lag",
|
|
372
400
|
"jankRate": "Jank Rate",
|
|
401
|
+
"fpsAreaChartTitle": "Real-Time FPS Stream & Jitter (30s)",
|
|
402
|
+
"fpsAreaChartSub": "Live 60 FPS target with continuous frame variance measurement",
|
|
403
|
+
"frameLatencyDistTitle": "Frame Latency Distribution",
|
|
404
|
+
"frameLatencyDistSub": "Proportion of frames delivered within 16.6ms budget",
|
|
405
|
+
"optimalBucket": "< 16.6ms (60 FPS)",
|
|
406
|
+
"minorJankBucket": "16.7 - 33.3ms (30-60 FPS)",
|
|
407
|
+
"noticeableJankBucket": "33.4 - 50.0ms (20-30 FPS)",
|
|
408
|
+
"severeFreezeBucket": "> 50.0ms (< 20 FPS)",
|
|
409
|
+
"hermesHeapTrendTitle": "Memory & Hermes Heap Dynamics",
|
|
410
|
+
"hermesHeapTrendSub": "Live allocation vs generational GC scavenge cycles",
|
|
373
411
|
"live": "Live",
|
|
374
|
-
"msTotal": "{{duration}}ms total • {{time}}"
|
|
412
|
+
"msTotal": "{{duration}}ms total • {{time}}",
|
|
413
|
+
"droppedFrames": "{{count}} Dropped",
|
|
414
|
+
"zeroDropped": "0 Dropped",
|
|
415
|
+
"frameBudgetMs": "{{time}}ms / frame ({{budget}}% budget)",
|
|
416
|
+
"target60Fps": "Target 60 FPS • Actual {{fps}} FPS",
|
|
417
|
+
"frameDuration": "Frame Duration",
|
|
418
|
+
"frameDurationVal": "{{time}} ms (16.67ms budget)",
|
|
419
|
+
"frameUtilization": "Frame Budget Exceeded",
|
|
420
|
+
"frameBudgetOk": "Frame Budget Headroom",
|
|
421
|
+
"bottleneck": "Bottleneck",
|
|
422
|
+
"jsBound": "JS Thread Bound",
|
|
423
|
+
"uiBound": "UI Thread Bound",
|
|
424
|
+
"balanced": "Balanced",
|
|
425
|
+
"smooth": "Smooth 60 FPS",
|
|
426
|
+
"minorJank": "Minor Stutter",
|
|
427
|
+
"noticeableJank": "Noticeable Jank",
|
|
428
|
+
"severeFreeze": "Severe Freeze",
|
|
429
|
+
"screenContext": "Screen Context",
|
|
430
|
+
"profileReason1": "Inline arrow function props passed to children (onAddToCart={() => ...})",
|
|
431
|
+
"profileReason2": "Unmemoized Redux selector creating new object reference on every dispatch",
|
|
432
|
+
"profileReason3": "Dynamic style object created in render body ({ marginTop: insets.top + 10 })",
|
|
433
|
+
"profileReason4": "FlatList missing getItemLayout causing async layout measuring passes",
|
|
434
|
+
"profileReason5": "renderItem function defined anonymously inside JSX body",
|
|
435
|
+
"profileReason6": "List item components not wrapped with React.memo",
|
|
436
|
+
"profileReason7": "Parent screen re-rendered on keyboard show/hide event",
|
|
437
|
+
"profileReason8": "Unstable callback reference passed into checkout button",
|
|
438
|
+
"profileReason9": "TextInput value state triggers parent re-render on every keystroke without debouncing",
|
|
439
|
+
"profileReason10": "Passing unmemoized filter object ({ category, minPrice }) down to child chips",
|
|
440
|
+
"profileReason11": "Avatar image cache re-validation on auth session refresh",
|
|
441
|
+
"fixUseCallbackTitle": "Wrap Event Handlers in useCallback",
|
|
442
|
+
"fixUseCallbackDesc": "Inline functions recreate a new memory reference on every render, invalidating React.memo on child components.",
|
|
443
|
+
"fixCreateSelectorTitle": "Memoize Redux / Zustand Selectors with shallowEqual",
|
|
444
|
+
"fixCreateSelectorDesc": "Returning new object or array references inside useSelector forces an automatic re-render on every state dispatch.",
|
|
445
|
+
"fixUseMemoStylesTitle": "Hoist Styles or Use useMemo for Dynamic Dimensions",
|
|
446
|
+
"fixUseMemoStylesDesc": "Inline style objects create new object identities on every frame pass, causing Yoga Flexbox reconciliation diffs.",
|
|
447
|
+
"fixGetItemLayoutTitle": "Implement getItemLayout for Fixed-Height Items",
|
|
448
|
+
"fixGetItemLayoutDesc": "Supplying getItemLayout allows FlatList to immediately compute scroll offsets and virtual windows without measuring views asynchronously.",
|
|
449
|
+
"fixReactMemoTitle": "Wrap List Items in React.memo",
|
|
450
|
+
"fixReactMemoDesc": "Prevents all 50+ visible list items from re-rendering when parent list state (e.g. scroll position or pagination) updates.",
|
|
451
|
+
"fixComponentSplittingTitle": "Isolate Fast-Changing State in Leaf Components",
|
|
452
|
+
"fixComponentSplittingDesc": "Move keyboard listeners and modal animation state into self-contained subcomponents so the parent does not re-render.",
|
|
453
|
+
"fixDebouncedInputTitle": "Debounce Search Input or Use Local Controlled State",
|
|
454
|
+
"fixDebouncedInputDesc": "Do not propagate keystroke state into global store immediately. Use a 250ms debounce or uncontrolled ref.",
|
|
455
|
+
"fixPrimitivePropsTitle": "Pass Primitive Props Instead of Large Objects",
|
|
456
|
+
"fixPrimitivePropsDesc": "Passing only categoryId string instead of whole category object prevents re-renders when other category metadata updates.",
|
|
457
|
+
"fixUseRefForTrackingTitle": "Use useRef for Non-Visual Tracking Values",
|
|
458
|
+
"fixUseRefForTrackingDesc": "Do not store analytics timers, scroll offsets, or tracking IDs in useState if they do not directly alter the JSX tree.",
|
|
459
|
+
"highImpact": "High Impact",
|
|
460
|
+
"mediumImpact": "Medium Impact",
|
|
461
|
+
"bestPractice": "Best Practice",
|
|
462
|
+
"beforeUseCallback": "// ❌ Before in <{{comp}} /> (re-creates function reference on every render):",
|
|
463
|
+
"afterUseCallback": "// ✅ After (stable memoized callback reference):",
|
|
464
|
+
"beforeCreateSelector": "// ❌ Before in <{{comp}} /> (returns new object reference every render):",
|
|
465
|
+
"afterCreateSelector": "// ✅ After (shallowEqual prevents re-render unless values change):",
|
|
466
|
+
"beforeMemo": "// ❌ Before (<{{comp}} />):",
|
|
467
|
+
"afterMemo": "// ✅ After (skips render if props are shallowly identical):",
|
|
468
|
+
"flatListOptimization": "// FlatList Optimization for <{{comp}} />",
|
|
469
|
+
"customComparator": "// Custom equality function for <{{comp}} />",
|
|
470
|
+
"debounceInput": "// Debounce input inside <{{comp}} /> to prevent per-keystroke renders:",
|
|
471
|
+
"isolateState": "// Isolate rapidly changing state from <{{comp}} /> to child sub-tree\n// ✅ Encapsulate animated layout inside isolated component:",
|
|
472
|
+
"beforeUseRef": "// ❌ Before in <{{comp}} /> (triggers whole component re-render on value change):",
|
|
473
|
+
"afterUseRef": "// ✅ After (preserves mutable reference across renders without re-rendering):",
|
|
474
|
+
"fixInteractionManagerTitle": "Defer Offscreen Logic with InteractionManager",
|
|
475
|
+
"fixInteractionManagerDesc": "Heavy data processing during screen animations drops frames. Defer until transition finishes.",
|
|
476
|
+
"beforeInteractionManager": "// ❌ Before in <{{comp}} /> (runs heavy computation while transition animates):\nuseEffect(() => {\n loadHeavyData();\n}, []);",
|
|
477
|
+
"afterInteractionManager": "// ✅ After (waits until transition completes smoothly):\nuseEffect(() => {\n const task = InteractionManager.runAfterInteractions(() => {\n loadHeavyData();\n });\n return () => task.cancel();\n}, []);",
|
|
478
|
+
"fixFlatListWindowingTitle": "Tune FlatList Windowing Properties",
|
|
479
|
+
"fixFlatListWindowingDesc": "Configure maxToRenderPerBatch and windowSize to minimize offscreen virtualized view allocations.",
|
|
480
|
+
"beforeFlatListWindowing": "// FlatList Windowing Optimization for <{{comp}} />:\n<FlatList\n data={items}\n maxToRenderPerBatch={10}\n windowSize={5}\n initialNumToRender={8}\n removeClippedSubviews={true}\n/>",
|
|
481
|
+
"fixImageCachingTitle": "Optimize Image Caching and Downscaling",
|
|
482
|
+
"fixImageCachingDesc": "Use priority headers or resizeMode downscaling to avoid massive bitmap allocations in the Hermes heap.",
|
|
483
|
+
"beforeImageCaching": "// Image Optimization for <{{comp}} />:\n<Image\n source={{ uri: imageUrl, cache: 'force-cache' }}\n resizeMode=\"cover\"\n fadeDuration={100}\n/>",
|
|
484
|
+
"fixContextSplittingTitle": "Split Monolithic Context into Granular Providers",
|
|
485
|
+
"fixContextSplittingDesc": "Components subscribing to a large context re-render even when unused state properties change.",
|
|
486
|
+
"beforeContextSplitting": "// ❌ Before (<{{comp}} /> consumes entire AppContext):\nconst { user, cart, theme } = useAppContext();",
|
|
487
|
+
"afterContextSplitting": "// ✅ After (subscribe to dedicated slice context):\nconst theme = useThemeContext();",
|
|
488
|
+
"fixInlineStylesHoistTitle": "Hoist Static Styles with StyleSheet.create",
|
|
489
|
+
"fixInlineStylesHoistDesc": "Inline style objects allocate new memory references on each render pass, causing Yoga reconciliation overhead.",
|
|
490
|
+
"beforeInlineStyles": "// ❌ Before (<{{comp}} /> allocates inline object every frame):\n<View style={{ flex: 1, padding: 16, backgroundColor: '#ffffff' }} />",
|
|
491
|
+
"afterInlineStyles": "// ✅ After (hoisted StyleSheet reference):\nconst styles = StyleSheet.create({ container: { flex: 1, padding: 16, backgroundColor: '#ffffff' } });\n<View style={styles.container} />",
|
|
492
|
+
"transitionEventLabel": "Screen Transition: {{screen}}",
|
|
493
|
+
"transitionEventDetail": "Transition completed in {{duration}}ms (TTI: {{tti}}ms).",
|
|
494
|
+
"transitionEventAdvice": "Interaction completed within 60 FPS target budget.",
|
|
495
|
+
"heavyTaskEventLabel": "Heavy Synchronous Task: {{taskName}}",
|
|
496
|
+
"heavyTaskEventDetail": "JS thread blocked for {{duration}}ms during task execution.",
|
|
497
|
+
"heavyTaskEventAdvice": "Consider offloading to web worker, InteractionManager, or batching in chunks.",
|
|
498
|
+
"asyncOpEventLabel": "Slow Async Operation: {{opName}}",
|
|
499
|
+
"asyncOpEventDetail": "Async task took {{duration}}ms to resolve.",
|
|
500
|
+
"renderLoopWarningLabel": "Rapid Re-render Spike in <{{comp}} />",
|
|
501
|
+
"renderLoopWarningDetail": "Component re-rendered {{count}} times in 500ms. Potential infinite loop or unstable dependencies.",
|
|
502
|
+
"renderLoopWarningAdvice": "Check useEffect / useCallback dependency arrays for unstable object or function references.",
|
|
503
|
+
"event1Label": "Main Thread Spike during Navigation",
|
|
504
|
+
"event1Detail": "Screen transition triggered heavy layout reconciliation and simultaneous component mounts.",
|
|
505
|
+
"event1Advice": "Defer non-critical offscreen hooks with InteractionManager.runAfterInteractions to preserve 60 FPS.",
|
|
506
|
+
"event2Label": "FlatList Virtualization Re-render Pass",
|
|
507
|
+
"event2Detail": "FlatList rendered 25 items simultaneously on orientation change without memoized row component.",
|
|
508
|
+
"event2Advice": "Implement getItemLayout and React.memo(LogCard) to skip redundant diffing passes.",
|
|
509
|
+
"event3Label": "Native Modal Slide-Up Transition",
|
|
510
|
+
"event3Detail": "Hardware accelerated native driver animated transform running smoothly at sustained 60 FPS.",
|
|
511
|
+
"event3Advice": "Using nativeDriver: true successfully prevents JS thread blocking during animations.",
|
|
512
|
+
"event4Label": "Hermes Generational Garbage Collection",
|
|
513
|
+
"event4Detail": "Minor generational GC cycle scavenged 4.2 MB ephemeral heap objects with sub-millisecond thread pause.",
|
|
514
|
+
"event4Advice": "Hermes generational garbage collector is operating within optimal sub-5ms limits.",
|
|
515
|
+
"gcCycleLabel": "Manual Garbage Collection Cycle",
|
|
516
|
+
"gcCycleDetail": "Reclaimed ~{{amount}} MB unreferenced heap objects and compacted memory nursery.",
|
|
517
|
+
"gcCycleAdvice": "Heap usage optimized. Generational nursery cleared.",
|
|
518
|
+
"liveFpsDropLabel": "Live Frame Rate Dip ({{fps}} FPS)",
|
|
519
|
+
"liveFpsDropDetail": "Main thread frame duration extended to {{duration}}ms during view update.",
|
|
520
|
+
"liveFpsDropAdvice": "Heavy JavaScript execution during frame pass delayed display presentation.",
|
|
521
|
+
"event5Label": "Large JSON Payload Deserialization",
|
|
522
|
+
"event5Detail": "50-item API response parse overhead in network adapter (185 KB JSON raw string).",
|
|
523
|
+
"event5Advice": "Consider paginating API payloads or streaming responses if payload size exceeds 250 KB.",
|
|
524
|
+
"event6Label": "Image Bitmap Decode & Rasterization",
|
|
525
|
+
"event6Detail": "Retina raster decode for banner_dark.png (1200×630px raster buffer allocation).",
|
|
526
|
+
"event6Advice": "Downscale asset dimensions or convert to WebP to reduce decode latency by ~65%.",
|
|
527
|
+
"event7Label": "Native TurboModule JSI Invocation",
|
|
528
|
+
"event7Detail": "AsyncStorage / MMKV preferences transaction read across 32 configuration keys.",
|
|
529
|
+
"event7Advice": "Direct C++ JSI Turbomodule bindings completely bypass legacy JSON bridge serialization overhead.",
|
|
530
|
+
"event8Label": "Redux Action State Tree Diffing",
|
|
531
|
+
"event8Detail": "Redux dispatch pass evaluated 6 reducer slices and emitted state notification in 4.8ms.",
|
|
532
|
+
"event8Advice": "State tree immutability preserved. Memoized selectors prevented redundant component renders.",
|
|
533
|
+
"event9Label": "Touch-to-Render Event Latency",
|
|
534
|
+
"event9Detail": "Gesture responder dispatched tap event to TabBar button with immediate 60 FPS response.",
|
|
535
|
+
"event9Advice": "Touch responder latency is well within standard 16.67ms frame budget.",
|
|
536
|
+
"event10Label": "C++ Yoga Flexbox Layout Pass",
|
|
537
|
+
"event10Detail": "Inspector UI multi-tab card layout recalculation and font metrics pass in C++ Yoga engine.",
|
|
538
|
+
"event10Advice": "Flexbox layout constraints are cached and computed efficiently with zero reflow penalties."
|
|
375
539
|
},
|
|
376
540
|
"bundle": {
|
|
377
541
|
"heroTitle": "Bundle & Asset Architecture",
|
|
@@ -525,7 +689,52 @@
|
|
|
525
689
|
"bestPractice": "Best Practice",
|
|
526
690
|
"actionRequired": "Action Required",
|
|
527
691
|
"active": "Active",
|
|
528
|
-
"tipDetails": "Tip Details"
|
|
692
|
+
"tipDetails": "Tip Details",
|
|
693
|
+
"iosComp1Name": "Frameworks & Dynamic Pods",
|
|
694
|
+
"iosComp1Desc": "React, Hermes, and {{count}} native pod frameworks.",
|
|
695
|
+
"iosComp1Advice": "Ensure Dead Code Stripping (STRIP_INSTALLED_PRODUCT = YES) in Release mode.",
|
|
696
|
+
"iosComp2Name": "Mach-O Executable (ARM64)",
|
|
697
|
+
"iosComp2Desc": "Host App compiled Swift/Objective-C and C++ native bridges.",
|
|
698
|
+
"iosComp2Advice": "Enable Monolithic LTO (Link-Time Optimization) in Xcode Scheme.",
|
|
699
|
+
"iosComp3Name": "Asset Catalog (Assets.car)",
|
|
700
|
+
"iosComp3Desc": "AppIcons, splash screens, vector glyphs, and bundled fonts.",
|
|
701
|
+
"iosComp3Advice": "Compile images into Xcode Asset Catalog for automatic App Thinning.",
|
|
702
|
+
"iosComp4Name": "Hermes Bytecode (main.jsbundle)",
|
|
703
|
+
"iosComp4Desc": "Host app JavaScript compiled AOT into Hermes bytecode ({{count}} files).",
|
|
704
|
+
"iosComp4Advice": "AOT bytecode loads with 0ms compile latency on device launch.",
|
|
705
|
+
"iosComp5Name": "Metadata & Code Signatures",
|
|
706
|
+
"iosComp5Desc": "_CodeSignature, Info.plist, and entitlements block.",
|
|
707
|
+
"iosComp5Advice": "Standard Apple Code Signing & provisioning signature.",
|
|
708
|
+
"andComp1Name": "Native C++ Libraries (.so)",
|
|
709
|
+
"andComp1Desc": "libhermes.so, libfbjni.so, and {{count}} C++ native adapters.",
|
|
710
|
+
"andComp1Advice": "Deploy with Android App Bundle (.aab) to deliver per-ABI split APKs.",
|
|
711
|
+
"andComp2Name": "Compiled DEX (classes.dex)",
|
|
712
|
+
"andComp2Desc": "Compiled Java & Kotlin runtime, AndroidX, and React Native bridges.",
|
|
713
|
+
"andComp2Advice": "Enable R8 / ProGuard shrinking (minifyEnabled true) in build.gradle.",
|
|
714
|
+
"andComp3Name": "Android Resources (res/)",
|
|
715
|
+
"andComp3Desc": "Drawables, vector XMLs, mipmap densities, resources.arsc, fonts.",
|
|
716
|
+
"andComp3Advice": "Use WebP and VectorDrawables to avoid multi-density asset duplication.",
|
|
717
|
+
"andComp4Name": "Hermes Bytecode (Android)",
|
|
718
|
+
"andComp4Desc": "Host app JavaScript compiled into Hermes bytecode ({{count}} files).",
|
|
719
|
+
"andComp4Advice": "Pre-compiled bytecode during assembleRelease gradle task.",
|
|
720
|
+
"andComp5Name": "Manifest & Signatures (META-INF)",
|
|
721
|
+
"andComp5Desc": "AndroidManifest.xml, signing certs, v2/v3/v4 APK Signature Scheme blocks.",
|
|
722
|
+
"andComp5Advice": "Official Google Play signing & signature block.",
|
|
723
|
+
"apkComp1Name": "Multi-ABI C++ Libraries (.so)",
|
|
724
|
+
"apkComp1Desc": "Universal multi-architecture shared libraries (.so) bundled for direct sideloading.",
|
|
725
|
+
"apkComp1Advice": "Use Android App Bundle (.aab) for Google Play to reduce install size by 60%.",
|
|
726
|
+
"apkComp2Name": "Compiled DEX Bytecode (classes.dex)",
|
|
727
|
+
"apkComp2Desc": "Compiled Java & Kotlin runtime, AndroidX libraries, and native bridge modules.",
|
|
728
|
+
"apkComp2Advice": "Enable R8 / ProGuard shrinking (minifyEnabled true) and shrinkResources true.",
|
|
729
|
+
"apkComp3Name": "Android Resources & Assets (res/)",
|
|
730
|
+
"apkComp3Desc": "Drawables, vector XMLs, mipmap densities, resources.arsc, fonts.",
|
|
731
|
+
"apkComp3Advice": "Use WebP and VectorDrawables to avoid multi-density asset duplication.",
|
|
732
|
+
"apkComp4Name": "Hermes Bytecode Bundle (Android)",
|
|
733
|
+
"apkComp4Desc": "Host app JavaScript compiled into Hermes bytecode ({{count}} files).",
|
|
734
|
+
"apkComp4Advice": "Pre-compiled bytecode during assembleRelease gradle task.",
|
|
735
|
+
"apkComp5Name": "Manifest & Signatures (META-INF)",
|
|
736
|
+
"apkComp5Desc": "AndroidManifest.xml, signing certs, JAR & v2/v3/v4 APK Signature Scheme.",
|
|
737
|
+
"apkComp5Advice": "Enterprise sideload & direct install signature block."
|
|
529
738
|
},
|
|
530
739
|
"errors": {
|
|
531
740
|
"title": "Something went wrong",
|
|
@@ -538,7 +747,22 @@
|
|
|
538
747
|
"modalMessage": "The inspector hit an unexpected error. You can reset it below.",
|
|
539
748
|
"inlineTitle": "Inspector error",
|
|
540
749
|
"inlineMessage": "An unexpected error occurred inside the inspector.",
|
|
541
|
-
"networkError": "Network request failed"
|
|
750
|
+
"networkError": "Network request failed",
|
|
751
|
+
"crashIntercepted": "CRASH INTERCEPTED",
|
|
752
|
+
"protected": "PROTECTED",
|
|
753
|
+
"rootCauseTitle": "Root Cause Diagnostics",
|
|
754
|
+
"rootCauseSubtitle": "Inspector caught this runtime error to prevent app termination",
|
|
755
|
+
"exactLocation": "EXACT SOURCE LOCATION",
|
|
756
|
+
"file": "File:",
|
|
757
|
+
"lineCol": "Line / Col:",
|
|
758
|
+
"lineColVal": "Line {{line}}, Col {{col}}",
|
|
759
|
+
"function": "Function:",
|
|
760
|
+
"callStack": "CALL STACK FRAMES",
|
|
761
|
+
"framesCount": "{{count}} frames",
|
|
762
|
+
"tryAgainRecover": "Try Again / Recover",
|
|
763
|
+
"copyDiagnostics": "Copy Diagnostics",
|
|
764
|
+
"appTag": "APP",
|
|
765
|
+
"copy": "Copy"
|
|
542
766
|
},
|
|
543
767
|
"jsonViewer": {
|
|
544
768
|
"pretty": "Pretty",
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -10,6 +10,6 @@ export { default as CrashTab } from './components/Inspector/CrashTab';
|
|
|
10
10
|
export { default as ErrorBoundary } from './components/ErrorBoundary';
|
|
11
11
|
export { connectReduxStore, inspectorReduxMiddleware, getReduxState, subscribeReduxState, getActionHistory, clearActionHistory, getLastActionForReducer, } from './customHooks/reduxLogger';
|
|
12
12
|
export { getEventCategory, registerGAPlugin, type GAPlugin, } from './helpers/gaAnalyticsRegistry';
|
|
13
|
-
export { usePerformanceTracker, logPerformanceEvent, clearPerformanceEvents, subscribePerformanceEvents, getPerformanceEvents, } from './customHooks/performanceTracker';
|
|
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
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';
|