react-native-inapp-inspector 1.1.22 → 1.1.24

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 (31) hide show
  1. package/dist/commonjs/components/AnalyticsEventCard.js +5 -2
  2. package/dist/commonjs/components/ErrorBoundary.js +17 -8
  3. package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -0
  4. package/dist/commonjs/components/Inspector/BundleTab.js +172 -48
  5. package/dist/commonjs/components/Inspector/LogDetail.js +12 -6
  6. package/dist/commonjs/components/Inspector/PerformanceTab.js +12 -12
  7. package/dist/commonjs/components/Inspector/ReduxTab.js +6 -3
  8. package/dist/commonjs/components/NetworkIcons.d.ts +12 -0
  9. package/dist/commonjs/components/NetworkIcons.js +92 -1
  10. package/dist/commonjs/components/TreeNode.js +1 -1
  11. package/dist/commonjs/constants/version.d.ts +1 -1
  12. package/dist/commonjs/constants/version.js +1 -1
  13. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +1 -1
  14. package/dist/commonjs/customHooks/bundleAnalyzer.js +95 -28
  15. package/dist/commonjs/i18n/locales/en.json +24 -22
  16. package/dist/esm/components/AnalyticsEventCard.js +5 -2
  17. package/dist/esm/components/ErrorBoundary.js +17 -8
  18. package/dist/esm/components/Inspector/BundleTab.d.ts +1 -0
  19. package/dist/esm/components/Inspector/BundleTab.js +174 -50
  20. package/dist/esm/components/Inspector/LogDetail.js +13 -7
  21. package/dist/esm/components/Inspector/PerformanceTab.js +13 -13
  22. package/dist/esm/components/Inspector/ReduxTab.js +7 -4
  23. package/dist/esm/components/NetworkIcons.d.ts +12 -0
  24. package/dist/esm/components/NetworkIcons.js +79 -0
  25. package/dist/esm/components/TreeNode.js +2 -2
  26. package/dist/esm/constants/version.d.ts +1 -1
  27. package/dist/esm/constants/version.js +1 -1
  28. package/dist/esm/customHooks/bundleAnalyzer.d.ts +1 -1
  29. package/dist/esm/customHooks/bundleAnalyzer.js +96 -29
  30. package/dist/esm/i18n/locales/en.json +24 -22
  31. package/package.json +1 -1
@@ -66,3 +66,15 @@ export declare const StorageIcon: ({ color, size, }: any) => React.JSX.Element;
66
66
  export declare const MetadataIcon: ({ color, size, }: any) => React.JSX.Element;
67
67
  export declare const ReduxIcon: ({ color, size, }: any) => React.JSX.Element;
68
68
  export declare const PerformanceIcon: ({ color, size, }: any) => React.JSX.Element;
69
+ export declare const BoltIcon: ({ color, size }: any) => React.JSX.Element;
70
+ export declare const BanIcon: ({ color, size }: any) => React.JSX.Element;
71
+ export declare const FolderOpenIcon: ({ color, size }: any) => React.JSX.Element;
72
+ export declare const DocIcon: ({ color, size }: any) => React.JSX.Element;
73
+ export declare const LightbulbIcon: ({ color, size }: any) => React.JSX.Element;
74
+ export declare const SparkleIcon: ({ color, size }: any) => React.JSX.Element;
75
+ export declare const MapIcon: ({ color, size }: any) => React.JSX.Element;
76
+ export declare const AtomIcon: ({ color, size }: any) => React.JSX.Element;
77
+ export declare const BrainIcon: ({ color, size }: any) => React.JSX.Element;
78
+ export declare const TextAaIcon: ({ color, size }: any) => React.JSX.Element;
79
+ export declare const CartIcon: ({ color, size }: any) => React.JSX.Element;
80
+ export declare const MoneyIcon: ({ color, size }: any) => React.JSX.Element;
@@ -402,3 +402,82 @@ export const PerformanceIcon = ({ color = AppColors.purple, size = 14, }) => {
402
402
  <Circle cx="12" cy="12" r="1.5" fill={color}/>
403
403
  </Svg>);
404
404
  };
405
+ // ─── App-wide Vector Icons (emoji-free, render on every device) ─────────────
406
+ export const BoltIcon = ({ color = AppColors.amber500, size = 14 }) => {
407
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
408
+ <Path d="M13 2 4.5 13.5 H10.5 L9 22 19.5 9.5 H13.5 Z" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
409
+ </Svg>);
410
+ };
411
+ export const BanIcon = ({ color = AppColors.errorColor, size = 14 }) => {
412
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
413
+ <Circle cx="12" cy="12" r="8.5" stroke={color} strokeWidth="1.8"/>
414
+ <Path d="M5.5 5.5 18.5 18.5" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
415
+ </Svg>);
416
+ };
417
+ export const FolderOpenIcon = ({ color = AppColors.amber500, size = 14 }) => {
418
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
419
+ <Path d="M8.4 11 10 5.5a2 2 0 0 1 1.9-1.5h3.7a1.5 1.5 0 0 1 1.4 2L15.5 11" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
420
+ <Path d="M6.7 20.4 4.3 12.9A1.6 1.6 0 0 1 5.8 11h14.6a1.6 1.6 0 0 1 1.6 1.9l-2.4 7.5a2 2 0 0 1-2 1.4H8.7a2 2 0 0 1-2-1.4Z" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
421
+ </Svg>);
422
+ };
423
+ export const DocIcon = ({ color = AppColors.grayTextWeak, size = 14 }) => {
424
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
425
+ <Path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
426
+ <Path d="M14 2v4a2 2 0 0 0 2 2h4" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
427
+ <Path d="M8 13h8 M8 17h8" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
428
+ </Svg>);
429
+ };
430
+ export const LightbulbIcon = ({ color = AppColors.amber500, size = 14 }) => {
431
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
432
+ <Path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1.3.5 2.6 1.5 3.5.8.8 1.3 1.5 1.5 2.5" stroke={color} strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
433
+ <Path d="M9 18h6" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
434
+ <Path d="M10 22h4" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
435
+ </Svg>);
436
+ };
437
+ export const SparkleIcon = ({ color = AppColors.amber500, size = 14 }) => {
438
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
439
+ <Path d="M11.1 3.9c.2-.6 1-.6 1.2 0l1.2 4.2 4.2 1.2c.6.2.6 1 0 1.2l-4.2 1.2-1.2 4.2c-.2.6-1 .6-1.2 0l-1.2-4.2-4.2-1.2c-.6-.2-.6-1 0-1.2l4.2-1.2Z" fill={color}/>
440
+ <Path d="M18.5 3.5v4 M16.5 5.5h4" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
441
+ </Svg>);
442
+ };
443
+ export const MapIcon = ({ color = AppColors.grayTextWeak, size = 14 }) => {
444
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
445
+ <Path d="M3 5.5 9 3.5l6 2 6-2v15l-6 2-6-2-6 2Z" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
446
+ <Path d="M9 3.5v15M15 5.5v15" stroke={color} strokeWidth="1.8"/>
447
+ <Circle cx="12" cy="11" r="1.9" stroke={color} strokeWidth="1.6"/>
448
+ </Svg>);
449
+ };
450
+ export const AtomIcon = ({ color = AppColors.grayTextWeak, size = 14 }) => {
451
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
452
+ <Ellipse cx="12" cy="12" rx="9" ry="3.8" stroke={color} strokeWidth="1.6"/>
453
+ <Ellipse cx="12" cy="12" rx="9" ry="3.8" stroke={color} strokeWidth="1.6" transform="rotate(60 12 12)"/>
454
+ <Ellipse cx="12" cy="12" rx="9" ry="3.8" stroke={color} strokeWidth="1.6" transform="rotate(120 12 12)"/>
455
+ <Circle cx="12" cy="12" r="1.6" fill={color}/>
456
+ </Svg>);
457
+ };
458
+ export const BrainIcon = ({ color = AppColors.grayTextWeak, size = 14 }) => {
459
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
460
+ <Path d="M9.5 2a2.5 2.5 0 0 0-2.5 2.5v.5a2.5 2.5 0 0 0-3 3.17A2.5 2.5 0 0 0 2 10.5c0 .76.34 1.44.88 1.9A2.5 2.5 0 0 0 2 15.5c0 .76.34 1.44.88 1.9A2.5 2.5 0 0 0 5 19.75c0 .75.5 1.5 1.25 1.75A2.5 2.5 0 0 0 8.5 23h.25a2.5 2.5 0 0 0 2.5-2.5V4a2.5 2.5 0 0 0-1.75-2ZM14.5 2a2.5 2.5 0 0 1 2.5 2.5v.5a2.5 2.5 0 0 1 3 3.17A2.5 2.5 0 0 1 22 10.5c0 .76-.34 1.44-.88 1.9a2.5 2.5 0 0 1 .88 1.9c0 .76-.34 1.44-.88 1.9A2.5 2.5 0 0 1 19 19.75c0 .75-.5 1.5-1.25 1.75A2.5 2.5 0 0 1 15.5 23h-.25a2.5 2.5 0 0 1-2.5-2.5V4a2.5 2.5 0 0 1 1.75-2Z" stroke={color} strokeWidth="1.6" strokeLinejoin="round"/>
461
+ </Svg>);
462
+ };
463
+ export const TextAaIcon = ({ color = AppColors.grayTextWeak, size = 14 }) => {
464
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
465
+ <Path d="M4 19 7.5 7 11 19" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
466
+ <Path d="M5.5 15h4" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
467
+ <Path d="M16 19l1.7-6.6 1.7 6.6" stroke={color} strokeWidth="1.8" strokeLinejoin="round"/>
468
+ <Path d="M16.9 15.8h1.6" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
469
+ </Svg>);
470
+ };
471
+ export const CartIcon = ({ color = AppColors.amber500, size = 14 }) => {
472
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
473
+ <Circle cx="9.5" cy="20" r="1.3" stroke={color} strokeWidth="1.8"/>
474
+ <Circle cx="18.5" cy="20" r="1.3" stroke={color} strokeWidth="1.8"/>
475
+ <Path d="M3 3.5h1.8a1 1 0 0 1 .97.75l3.1 9.75a1.5 1.5 0 0 0 1.44 1.1h9.2a1 1 0 0 0 .95-.7l2.5-7.5a.8.8 0 0 0-.75-1.05H7" stroke={color} strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
476
+ </Svg>);
477
+ };
478
+ export const MoneyIcon = ({ color = AppColors.emerald500, size = 14 }) => {
479
+ return (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
480
+ <Circle cx="12" cy="12" r="8.5" stroke={color} strokeWidth="1.8"/>
481
+ <Path d="M12 7v10M14.5 9.5c-.6-1-1.5-1.5-2.5-1.5-1.5 0-2.5.9-2.5 2s1 1.8 2.5 2 2.5.8 2.5 2-1 2-2.5 2c-1 0-1.9-.5-2.5-1.5" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
482
+ </Svg>);
483
+ };
@@ -3,7 +3,7 @@ import { Text, View, Image, Animated, Pressable } from 'react-native';
3
3
  // Helpers
4
4
  import { escapeRegex } from '../helpers';
5
5
  // Assets
6
- import { ChevronIcon } from './NetworkIcons';
6
+ import { ChevronIcon, DocIcon } from './NetworkIcons';
7
7
  // Stylesheet
8
8
  import { AppColors } from '../styles/AppColors';
9
9
  import styles from '../styles';
@@ -43,7 +43,7 @@ const TreeNode = React.memo(function TreeNode({ data, name, level = 0, search, f
43
43
  {name !== undefined && (<Text style={[styles.codeKey, { marginBottom: 4 }]}>{`"${String(name)}": `}</Text>)}
44
44
  <View style={styles.filePreviewCard}>
45
45
  {isImage ? (<Image source={{ uri: file.uri }} style={styles.filePreviewThumb} resizeMode="cover"/>) : (<View style={styles.filePreviewDoc}>
46
- <Text style={{ fontSize: 20 }}>📄</Text>
46
+ <DocIcon color={AppColors.grayTextWeak} size={20}/>
47
47
  </View>)}
48
48
  <View style={{ flex: 1 }}>
49
49
  <Text style={styles.filePreviewName} numberOfLines={1}>
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "1.1.22";
1
+ export declare const LIB_VERSION = "1.1.24";
@@ -1,3 +1,3 @@
1
1
  // AUTO-GENERATED FILE — do not edit by hand.
2
2
  // Regenerated from package.json on every build by scripts/gen-version.js.
3
- export const LIB_VERSION = '1.1.22';
3
+ export const LIB_VERSION = '1.1.24';
@@ -107,7 +107,7 @@ export declare const getHostScriptURL: () => string;
107
107
  /**
108
108
  * Parses raw Metro bundle source code to discover real modules and packages in the host app.
109
109
  */
110
- export declare const parseBundleSource: (bundleText: string, totalBytes: number, scriptURL: string) => HostBundleAnalysisResult;
110
+ export declare const parseBundleSource: (bundleText: string, totalBytes: number, scriptURL: string, isLive?: boolean) => HostBundleAnalysisResult;
111
111
  /**
112
112
  * Automatically fetch and analyze the real running bundle for the host app.
113
113
  */
@@ -8,23 +8,91 @@ import { AppColors } from '../styles/AppColors';
8
8
  // 3. Extracting real module paths (project files vs node_modules dependencies).
9
9
  // 4. Computing real Development and Production Binary (.ipa / .aab / .apk) sizes.
10
10
  // ─────────────────────────────────────────────────────────────────────────────
11
- import { NativeModules, Platform } from 'react-native';
11
+ import { NativeModules, Platform, TurboModuleRegistry } from 'react-native';
12
12
  let cachedAnalysis = null;
13
13
  let isAnalyzing = false;
14
14
  const subscribers = [];
15
+ const getSourceCodeModule = () => {
16
+ try {
17
+ const legacy = NativeModules?.SourceCode;
18
+ if (legacy && typeof legacy.scriptURL === 'string' && legacy.scriptURL.length > 0) {
19
+ return legacy;
20
+ }
21
+ }
22
+ catch { }
23
+ try {
24
+ const turbo = TurboModuleRegistry?.get?.('SourceCode');
25
+ const constants = turbo?.getConstants?.();
26
+ const scriptURL = turbo?.scriptURL || constants?.scriptURL;
27
+ if (typeof scriptURL === 'string' && scriptURL.length > 0) {
28
+ return { scriptURL };
29
+ }
30
+ }
31
+ catch { }
32
+ return null;
33
+ };
15
34
  export const getHostScriptURL = () => {
16
- const SourceCode = NativeModules?.SourceCode;
17
- if (SourceCode && typeof SourceCode.scriptURL === 'string' && SourceCode.scriptURL.length > 0) {
18
- return SourceCode.scriptURL;
35
+ // 1. NativeModules.SourceCode (bridged) or SourceCode TurboModule (bridgeless / new arch)
36
+ const scriptURL = getSourceCodeModule()?.scriptURL;
37
+ if (typeof scriptURL === 'string' && scriptURL.length > 0) {
38
+ return scriptURL;
39
+ }
40
+ // 2. Android legacy: PlatformConstants.serverHost -> "localhost:8082"
41
+ try {
42
+ const serverHost = NativeModules?.PlatformConstants?.serverHost;
43
+ if (typeof serverHost === 'string' && serverHost.length > 0) {
44
+ return `http://${serverHost}/index.bundle?platform=${Platform.OS}&dev=true`;
45
+ }
46
+ }
47
+ catch { }
48
+ return '';
49
+ };
50
+ const DEV_SERVER_PORTS = [8081, 8082, 8083, 8084, 8090, 8080, 19000];
51
+ const buildProbeUrls = (scriptURL) => {
52
+ const urls = [];
53
+ if (typeof scriptURL === 'string' && scriptURL.startsWith('http')) {
54
+ urls.push(scriptURL);
55
+ }
56
+ const portMatch = typeof scriptURL === 'string' ? scriptURL.match(/:(\d{2,5})/) : null;
57
+ const ports = portMatch ? [parseInt(portMatch[1], 10)] : DEV_SERVER_PORTS;
58
+ const hosts = Platform.OS === 'android'
59
+ ? ['localhost', '127.0.0.1', '10.0.2.2']
60
+ : ['localhost', '127.0.0.1'];
61
+ for (const host of hosts) {
62
+ for (const port of ports) {
63
+ urls.push(`http://${host}:${port}/index.bundle?platform=${Platform.OS}&dev=true`);
64
+ }
65
+ }
66
+ return Array.from(new Set(urls));
67
+ };
68
+ const fetchWithTimeout = async (url, timeoutMs) => {
69
+ try {
70
+ const controller = new AbortController();
71
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
72
+ try {
73
+ const res = await fetch(url, { signal: controller.signal });
74
+ if (!res.ok)
75
+ return { ok: false };
76
+ const contentLength = res.headers.get('content-length');
77
+ const text = await res.text();
78
+ return {
79
+ ok: true,
80
+ text,
81
+ bytes: contentLength ? parseInt(contentLength, 10) || text.length : text.length,
82
+ };
83
+ }
84
+ finally {
85
+ clearTimeout(timer);
86
+ }
87
+ }
88
+ catch {
89
+ return { ok: false };
19
90
  }
20
- return Platform.OS === 'ios'
21
- ? 'http://localhost:8081/index.bundle?platform=ios&dev=true'
22
- : 'http://10.0.2.2:8081/index.bundle?platform=android&dev=true';
23
91
  };
24
92
  /**
25
93
  * Parses raw Metro bundle source code to discover real modules and packages in the host app.
26
94
  */
27
- export const parseBundleSource = (bundleText, totalBytes, scriptURL) => {
95
+ export const parseBundleSource = (bundleText, totalBytes, scriptURL, isLive = true) => {
28
96
  const isHermes = Boolean(globalThis.HermesInternal);
29
97
  const totalDevMb = Number((totalBytes / (1024 * 1024)).toFixed(2));
30
98
  const totalDevKb = Math.round(totalBytes / 1024);
@@ -447,7 +515,7 @@ export const parseBundleSource = (bundleText, totalBytes, scriptURL) => {
447
515
  },
448
516
  ];
449
517
  return {
450
- isLive: true,
518
+ isLive,
451
519
  scriptURL,
452
520
  totalDevBytes: totalBytes,
453
521
  totalDevMb,
@@ -521,30 +589,29 @@ export const analyzeHostAppBundle = async () => {
521
589
  }
522
590
  isAnalyzing = true;
523
591
  const scriptURL = getHostScriptURL();
524
- try {
525
- if (scriptURL && scriptURL.startsWith('http')) {
526
- // 1. Try HEAD request first for fast content-length
527
- const headRes = await fetch(scriptURL, { method: 'HEAD' });
528
- const cl = headRes.headers.get('content-length');
529
- let byteLength = cl ? parseInt(cl, 10) : 0;
530
- // 2. Fetch partial text to discover real modules
531
- const getRes = await fetch(scriptURL);
532
- const bundleText = await getRes.text();
533
- byteLength = byteLength || bundleText.length;
534
- const result = parseBundleSource(bundleText, byteLength, scriptURL);
535
- cachedAnalysis = result;
536
- isAnalyzing = false;
537
- subscribers.forEach(cb => cb(result));
538
- subscribers.length = 0;
539
- return result;
592
+ // Probe candidate dev-server URLs until one serves the JS bundle
593
+ let fetched = null;
594
+ let fetchedUrl = '';
595
+ for (const url of buildProbeUrls(scriptURL)) {
596
+ const probe = await fetchWithTimeout(url, 3000);
597
+ if (probe.ok && probe.text && probe.text.length > 0) {
598
+ fetched = { text: probe.text, bytes: probe.bytes ?? probe.text.length };
599
+ fetchedUrl = url;
600
+ break;
540
601
  }
541
602
  }
542
- catch (err) {
543
- // If fetch failed (e.g. standalone production build or offline)
603
+ if (fetched) {
604
+ const result = parseBundleSource(fetched.text, fetched.bytes, fetchedUrl);
605
+ cachedAnalysis = result;
606
+ isAnalyzing = false;
607
+ subscribers.forEach(cb => cb(result));
608
+ subscribers.length = 0;
609
+ return result;
544
610
  }
545
- // Fallback to runtime memory estimation
611
+ // Fallback: could not reach a Metro dev server (release build, offline, or
612
+ // custom dev-server host). Return estimated values so the UI never crashes.
546
613
  const fallbackBytes = 6840000; // ~6.8MB standard RN dev bundle
547
- const result = parseBundleSource('', fallbackBytes, scriptURL);
614
+ const result = parseBundleSource('', fallbackBytes, scriptURL || 'unknown', false);
548
615
  cachedAnalysis = result;
549
616
  isAnalyzing = false;
550
617
  subscribers.forEach(cb => cb(result));
@@ -355,6 +355,8 @@
355
355
  "heroTitle": "Bundle & Asset Architecture",
356
356
  "heroSubtitle": "Real-time size breakdown across all assets, code, and dependencies",
357
357
  "heroSubtitleLive": "Live analysis of {{scriptUrl}}",
358
+ "liveAnalysisUnavailable": "Live bundle analysis unavailable",
359
+ "liveAnalysisUnavailableSub": "Could not reach the Metro dev server, so values are estimates. Make sure the app runs in development via `npx react-native start` and the Inspector can reach your Metro port (8081, 8082, ...).",
358
360
  "bundleOverviewJson": "Bundle Overview JSON",
359
361
  "devBundleSize": "DEV BUNDLE SIZE",
360
362
  "devBundleHint": "{{kb}} KB • {{modules}} modules",
@@ -379,11 +381,11 @@
379
381
  "treemapTitle": "Asset & File Type Ratio Treemap",
380
382
  "treemapSub": "Total ~{{mb}} MB",
381
383
  "treemapJson": "Ratio Treemap JSON",
382
- "legendImages": "🖼️ Images:",
383
- "legendTs": "📜 TS/TSX:",
384
- "legendJs": "⚙️ JS Libs:",
385
- "legendFonts": "🔤 Fonts:",
386
- "legendJson": "📄 JSON:",
384
+ "legendImages": "Images:",
385
+ "legendTs": "TS/TSX:",
386
+ "legendJs": "JS Libs:",
387
+ "legendFonts": "Fonts:",
388
+ "legendJson": "JSON:",
387
389
  "categoryBreakdown": "Category Breakdown",
388
390
  "categoriesJson": "Categories Breakdown JSON",
389
391
  "catImagesTitle": "Images & Media Assets",
@@ -417,14 +419,14 @@
417
419
  "catJavascript": "JS & Node Modules",
418
420
  "catFonts": "Fonts & Glyphs",
419
421
  "catJson": "JSON & Data",
420
- "treeView": "🌳 Tree View",
421
- "flatList": "📄 Flat List",
422
+ "treeView": "Tree View",
423
+ "flatList": "Flat List",
422
424
  "expand": "Expand",
423
425
  "collapse": "Collapse",
424
426
  "showingFilesOf": "Showing {{shown}} of {{total}} files",
425
427
  "filesOf": "{{count}} of {{total}} Files",
426
- "notConsumed": "🚫 Not Consumed",
427
- "consumed": "Consumed",
428
+ "notConsumed": "Not Consumed",
429
+ "consumed": "Consumed",
428
430
  "copyFileInfo": "Copy {{name}} Info",
429
431
  "fileDetailsJson": "File Details JSON",
430
432
  "file": "file",
@@ -440,13 +442,13 @@
440
442
  "showingDependencies": "Showing {{count}} dependencies",
441
443
  "versionPrefix": "v{{version}}",
442
444
  "bundled": "bundled",
443
- "deprecated": "⚠️ DEPRECATED",
444
- "updateAvailable": "Update: v{{version}}",
445
- "upToDate": "Up to date",
446
- "bundledBadge": "📦 Bundled",
445
+ "deprecated": "DEPRECATED",
446
+ "updateAvailable": "Update: v{{version}}",
447
+ "upToDate": "Up to date",
448
+ "bundledBadge": "Bundled",
447
449
  "packageDetailsJson": "Package Details JSON",
448
- "direct": "📦 Direct",
449
- "transitive": "🔗 Transitive",
450
+ "direct": "Direct",
451
+ "transitive": "Transitive",
450
452
  "minified": "~{{size}} KB minified",
451
453
  "npmLink": "npm ↗",
452
454
  "dependenciesCount": "{{count}} Dependencies",
@@ -460,16 +462,16 @@
460
462
  "mediaAndFonts": "{{count}} Media & Fonts",
461
463
  "optimizerTitle": "React Native Bundle Optimization Checklist",
462
464
  "optimizationChecklist": "Optimization Checklist",
463
- "optTip1Title": "🖼️ Convert Heavy PNGs to WebP / SVGs",
465
+ "optTip1Title": "Convert Heavy PNGs to WebP / SVGs",
464
466
  "optTip1Desc": "Images account for >40% of final app download size. Converting 2x/3x raster PNGs to WebP saves 60-70% size with no visible fidelity loss.",
465
- "optTip2Title": "📜 Enable Hermes Bytecode Engine",
466
- "optTip2DescActive": "Hermes is active! JavaScript is compiled into optimized bytecode Ahead-Of-Time.",
467
- "optTip2DescInactive": "⚠️ Hermes is disabled. Enable hermes in your app config for ~40% smaller payload and instant TTI startup.",
468
- "optTip3Title": "🔤 Font Subsetting & Weight Pruning",
467
+ "optTip2Title": "Enable Hermes Bytecode Engine",
468
+ "optTip2DescActive": "Hermes is active! JavaScript is compiled into optimized bytecode Ahead-Of-Time.",
469
+ "optTip2DescInactive": "Hermes is disabled. Enable hermes in your app config for ~40% smaller payload and instant TTI startup.",
470
+ "optTip3Title": "Font Subsetting & Weight Pruning",
469
471
  "optTip3Desc": "Include only the font weights you actively use (e.g. Regular & Bold). Remove unused glyph ranges to save 100KB+ per font file.",
470
- "optTip4Title": "🌲 Selective Path Imports (Tree-shaking)",
472
+ "optTip4Title": "Selective Path Imports (Tree-shaking)",
471
473
  "optTip4Desc": "Import from specific subpaths (e.g. lodash/get or specific vector icon sets) instead of importing large monolithic packages.",
472
- "optTip5Title": "Screen Lazy-Loading",
474
+ "optTip5Title": "Screen Lazy-Loading",
473
475
  "optTip5Desc": "Lazy load secondary screens and heavy modal sheets using dynamic imports and InteractionManager to reduce initial bundle evaluation.",
474
476
  "highImpact": "High Impact",
475
477
  "mediumImpact": "Medium Impact",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "1.1.22",
3
+ "version": "1.1.24",
4
4
  "description": "The zero-config, all-in-one in-app debugger for React Native & Expo. Inspect Network (fetch/axios), Console logs, Stack Traces, Redux State, Firebase Analytics, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",