react-native-inapp-inspector 2.2.2 → 2.2.4

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 (159) hide show
  1. package/dist/commonjs/components/AnalyticsDetail.js +5 -1
  2. package/dist/commonjs/components/AnalyticsEventCard.js +2 -1
  3. package/dist/commonjs/components/DiffViewer.js +1 -1
  4. package/dist/commonjs/components/Inspector/BundleTab.js +22 -0
  5. package/dist/commonjs/components/Inspector/DeviceInfoTab.d.ts +3 -0
  6. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +835 -0
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +12 -14
  8. package/dist/commonjs/components/Inspector/LogDetail.js +6 -3
  9. package/dist/commonjs/components/Inspector/MainScreen.js +7 -3
  10. package/dist/commonjs/components/Inspector/NetworkTab.js +92 -15
  11. package/dist/commonjs/components/Inspector/PerformanceTab.js +38 -12
  12. package/dist/commonjs/components/Inspector/SettingsPanel.js +440 -229
  13. package/dist/commonjs/components/Inspector/StorageTab.d.ts +3 -0
  14. package/dist/commonjs/components/Inspector/StorageTab.js +892 -0
  15. package/dist/commonjs/components/Inspector/TabBar.js +14 -0
  16. package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +11 -2
  17. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +4 -1
  18. package/dist/commonjs/components/NetworkIcons.d.ts +6 -0
  19. package/dist/commonjs/components/NetworkIcons.js +30 -1
  20. package/dist/commonjs/constants/version.d.ts +1 -1
  21. package/dist/commonjs/constants/version.js +1 -1
  22. package/dist/commonjs/customHooks/bundleAnalyzer.js +44 -22
  23. package/dist/commonjs/customHooks/storageInspector.d.ts +67 -0
  24. package/dist/commonjs/customHooks/storageInspector.js +486 -0
  25. package/dist/commonjs/i18n/locales/en.json +8 -2
  26. package/dist/commonjs/index.d.ts +1 -0
  27. package/dist/commonjs/index.js +16 -1
  28. package/dist/commonjs/storage.d.ts +5 -0
  29. package/dist/commonjs/storage.js +18 -0
  30. package/dist/commonjs/types/enums.d.ts +5 -0
  31. package/dist/commonjs/types/enums.js +5 -0
  32. package/dist/esm/components/AnalyticsDetail.js +6 -2
  33. package/dist/esm/components/AnalyticsEventCard.js +2 -1
  34. package/dist/esm/components/DiffViewer.js +1 -1
  35. package/dist/esm/components/Inspector/BundleTab.js +22 -0
  36. package/dist/esm/components/Inspector/DeviceInfoTab.d.ts +3 -0
  37. package/dist/esm/components/Inspector/DeviceInfoTab.js +796 -0
  38. package/dist/esm/components/Inspector/InspectorHeader.js +13 -15
  39. package/dist/esm/components/Inspector/LogDetail.js +7 -4
  40. package/dist/esm/components/Inspector/MainScreen.js +7 -3
  41. package/dist/esm/components/Inspector/NetworkTab.js +93 -16
  42. package/dist/esm/components/Inspector/PerformanceTab.js +39 -13
  43. package/dist/esm/components/Inspector/SettingsPanel.js +441 -230
  44. package/dist/esm/components/Inspector/StorageTab.d.ts +3 -0
  45. package/dist/esm/components/Inspector/StorageTab.js +853 -0
  46. package/dist/esm/components/Inspector/TabBar.js +15 -1
  47. package/dist/esm/components/Inspector/TelemetryConsentModal.js +11 -2
  48. package/dist/esm/components/Inspector/UpdateAvailableModal.js +4 -1
  49. package/dist/esm/components/NetworkIcons.d.ts +6 -0
  50. package/dist/esm/components/NetworkIcons.js +23 -0
  51. package/dist/esm/constants/version.d.ts +1 -1
  52. package/dist/esm/constants/version.js +1 -1
  53. package/dist/esm/customHooks/bundleAnalyzer.js +44 -22
  54. package/dist/esm/customHooks/storageInspector.d.ts +67 -0
  55. package/dist/esm/customHooks/storageInspector.js +469 -0
  56. package/dist/esm/i18n/locales/en.json +8 -2
  57. package/dist/esm/index.d.ts +1 -0
  58. package/dist/esm/index.js +5 -0
  59. package/dist/esm/storage.d.ts +5 -0
  60. package/dist/esm/storage.js +5 -0
  61. package/dist/esm/types/enums.d.ts +5 -0
  62. package/dist/esm/types/enums.js +5 -0
  63. package/package.json +9 -1
  64. package/src/analytics.ts +35 -0
  65. package/src/bundle.ts +25 -0
  66. package/src/components/AnalyticsDetail.tsx +870 -0
  67. package/src/components/AnalyticsEventCard.tsx +442 -0
  68. package/src/components/AnalyticsGraph.tsx +583 -0
  69. package/src/components/AnimatedEntrance.tsx +64 -0
  70. package/src/components/AppHeaderLogo.tsx +109 -0
  71. package/src/components/BrandCircleIcon.tsx +144 -0
  72. package/src/components/BrandSquareIcon.tsx +144 -0
  73. package/src/components/CodeSnippet.tsx +725 -0
  74. package/src/components/ConsoleLogCard.tsx +628 -0
  75. package/src/components/CopyButton.tsx +87 -0
  76. package/src/components/DiffViewer.tsx +82 -0
  77. package/src/components/DomainHeader.tsx +237 -0
  78. package/src/components/EmptyState.tsx +73 -0
  79. package/src/components/EndOfListFooter.tsx +100 -0
  80. package/src/components/ErrorBoundary.tsx +688 -0
  81. package/src/components/HeadersSection.tsx +192 -0
  82. package/src/components/HighlightText.tsx +100 -0
  83. package/src/components/Inspector/AnalyticsFilterModal.tsx +1250 -0
  84. package/src/components/Inspector/AnalyticsTab.tsx +1336 -0
  85. package/src/components/Inspector/BundleTab.tsx +4760 -0
  86. package/src/components/Inspector/ConsoleTab.tsx +702 -0
  87. package/src/components/Inspector/CrashDetail.tsx +941 -0
  88. package/src/components/Inspector/CrashFilterModal.tsx +721 -0
  89. package/src/components/Inspector/CrashTab.tsx +871 -0
  90. package/src/components/Inspector/DeviceInfoTab.tsx +1204 -0
  91. package/src/components/Inspector/FabLauncher.tsx +80 -0
  92. package/src/components/Inspector/InspectorContext.tsx +28 -0
  93. package/src/components/Inspector/InspectorHeader.tsx +972 -0
  94. package/src/components/Inspector/LogDetail.tsx +1431 -0
  95. package/src/components/Inspector/MainScreen.tsx +262 -0
  96. package/src/components/Inspector/NavigationTracker.tsx +13 -0
  97. package/src/components/Inspector/NetworkDetail.tsx +794 -0
  98. package/src/components/Inspector/NetworkTab.tsx +1183 -0
  99. package/src/components/Inspector/NpmUpdateToast.tsx +392 -0
  100. package/src/components/Inspector/PerformanceTab.tsx +1928 -0
  101. package/src/components/Inspector/ReduxDetail.tsx +1651 -0
  102. package/src/components/Inspector/ReduxTab.tsx +954 -0
  103. package/src/components/Inspector/SettingsPanel.tsx +3447 -0
  104. package/src/components/Inspector/StorageTab.tsx +1048 -0
  105. package/src/components/Inspector/TabBar.tsx +207 -0
  106. package/src/components/Inspector/TelemetryConsentModal.tsx +416 -0
  107. package/src/components/Inspector/UpdateAvailableModal.tsx +557 -0
  108. package/src/components/JsonViewer.tsx +486 -0
  109. package/src/components/LogCard.tsx +491 -0
  110. package/src/components/LogSyntaxHighlighter.tsx +178 -0
  111. package/src/components/MetaAccordion.tsx +340 -0
  112. package/src/components/MiniBarChart.tsx +42 -0
  113. package/src/components/MiniLineChart.tsx +33 -0
  114. package/src/components/NetworkIcons.tsx +2221 -0
  115. package/src/components/SectionHeader.tsx +113 -0
  116. package/src/components/SegmentedTabs.tsx +83 -0
  117. package/src/components/Slider.tsx +300 -0
  118. package/src/components/SourcePageCard.tsx +148 -0
  119. package/src/components/Toast.tsx +131 -0
  120. package/src/components/TouchableScale.tsx +91 -0
  121. package/src/components/TreeNode.tsx +186 -0
  122. package/src/console.ts +24 -0
  123. package/src/constants/index.ts +38 -0
  124. package/src/constants/version.ts +3 -0
  125. package/src/crash.ts +32 -0
  126. package/src/customHooks/analyticsLogger.ts +336 -0
  127. package/src/customHooks/bundleAnalyzer.ts +1256 -0
  128. package/src/customHooks/consoleLogger.ts +497 -0
  129. package/src/customHooks/crashHandler.ts +944 -0
  130. package/src/customHooks/logFilters.ts +32 -0
  131. package/src/customHooks/networkLogger.ts +419 -0
  132. package/src/customHooks/performanceTracker.ts +1014 -0
  133. package/src/customHooks/reduxLogger.ts +406 -0
  134. package/src/customHooks/storageInspector.ts +509 -0
  135. package/src/customHooks/useAccordion.tsx +60 -0
  136. package/src/decorators/index.ts +184 -0
  137. package/src/helpers/gaAnalyticsRegistry.ts +204 -0
  138. package/src/helpers/index.ts +860 -0
  139. package/src/helpers/memoryManager.ts +138 -0
  140. package/src/helpers/searchQueryParser.ts +283 -0
  141. package/src/helpers/settingsStore.ts +171 -0
  142. package/src/helpers/telemetry.ts +505 -0
  143. package/src/helpers/toast.ts +17 -0
  144. package/src/i18n/index.ts +69 -0
  145. package/src/i18n/locales/en.json +1058 -0
  146. package/src/index.tsx +2356 -0
  147. package/src/native/NativeInspector.ts +397 -0
  148. package/src/native/NativeNetworkInspector.ts +24 -0
  149. package/src/network.ts +22 -0
  150. package/src/performance.ts +38 -0
  151. package/src/redux.ts +23 -0
  152. package/src/storage.ts +18 -0
  153. package/src/styles/AppColors.ts +408 -0
  154. package/src/styles/AppFonts.ts +8 -0
  155. package/src/styles/common.ts +209 -0
  156. package/src/styles/index.ts +1570 -0
  157. package/src/types/enums.ts +199 -0
  158. package/src/types/index.ts +34 -0
  159. package/src/types/interfaces.ts +515 -0
@@ -0,0 +1,486 @@
1
+ "use strict";
2
+ // Universal In-App Storage Inspector Adapter for AsyncStorage & MMKV
3
+ // Supports automatic module resolution, NativeModules SQLite fallback, custom instances, and full CRUD operations.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.subscribeToStorageChanges = exports.clearStorageDriver = exports.removeStorageEntry = exports.setStorageEntry = exports.fetchStorageEntries = exports.analyzeStorageValue = exports.calculateByteSize = exports.getRegisteredMMKVInstanceIds = exports.isMMKVConnected = exports.isAsyncStorageConnected = exports.getResolvedMMKV = exports.getResolvedAsyncStorage = exports.connectMMKV = exports.connectAsyncStorage = void 0;
6
+ const react_native_1 = require("react-native");
7
+ // In-memory registered storage references
8
+ let customAsyncStorage = null;
9
+ const customMMKVInstances = new Map();
10
+ // Listeners for storage mutations
11
+ const changeListeners = new Set();
12
+ const notifyChange = () => {
13
+ changeListeners.forEach(listener => {
14
+ try {
15
+ listener();
16
+ }
17
+ catch { }
18
+ });
19
+ };
20
+ /**
21
+ * Register an AsyncStorage instance with the inspector (optional override).
22
+ */
23
+ const connectAsyncStorage = (storageInstance) => {
24
+ if (storageInstance) {
25
+ customAsyncStorage = storageInstance;
26
+ notifyChange();
27
+ }
28
+ };
29
+ exports.connectAsyncStorage = connectAsyncStorage;
30
+ /**
31
+ * Register an MMKV instance with the inspector (optional override).
32
+ */
33
+ const connectMMKV = (mmkvInstance, id = 'default') => {
34
+ if (mmkvInstance) {
35
+ customMMKVInstances.set(id, mmkvInstance);
36
+ notifyChange();
37
+ }
38
+ };
39
+ exports.connectMMKV = connectMMKV;
40
+ /**
41
+ * Native Bridge Fallback for AsyncStorage:
42
+ * Directly interfaces with NativeModules.RNCAsyncStorage without needing JS package imports.
43
+ */
44
+ const getNativeAsyncStorageBridge = () => {
45
+ const nativeModule = react_native_1.NativeModules.RNCAsyncStorage ||
46
+ react_native_1.NativeModules.RNC_AsyncSQLiteDBStorage ||
47
+ react_native_1.NativeModules.AsyncSQLiteDBStorage;
48
+ if (nativeModule) {
49
+ return {
50
+ getAllKeys: () => {
51
+ return new Promise((resolve, reject) => {
52
+ if (typeof nativeModule.getAllKeys !== 'function') {
53
+ resolve([]);
54
+ return;
55
+ }
56
+ nativeModule.getAllKeys((err, keys) => {
57
+ if (err)
58
+ reject(err);
59
+ else
60
+ resolve(keys || []);
61
+ });
62
+ });
63
+ },
64
+ multiGet: (keys) => {
65
+ return new Promise((resolve, reject) => {
66
+ if (typeof nativeModule.multiGet !== 'function') {
67
+ resolve([]);
68
+ return;
69
+ }
70
+ nativeModule.multiGet(keys, (err, result) => {
71
+ if (err)
72
+ reject(err);
73
+ else
74
+ resolve(result || []);
75
+ });
76
+ });
77
+ },
78
+ getItem: (key) => {
79
+ return new Promise((resolve, reject) => {
80
+ if (typeof nativeModule.multiGet !== 'function') {
81
+ resolve(null);
82
+ return;
83
+ }
84
+ nativeModule.multiGet([key], (err, result) => {
85
+ if (err)
86
+ reject(err);
87
+ else
88
+ resolve(result?.[0]?.[1] ?? null);
89
+ });
90
+ });
91
+ },
92
+ setItem: (key, value) => {
93
+ return new Promise((resolve, reject) => {
94
+ if (typeof nativeModule.multiSet !== 'function') {
95
+ resolve();
96
+ return;
97
+ }
98
+ nativeModule.multiSet([[key, value]], (err) => {
99
+ if (err)
100
+ reject(err);
101
+ else
102
+ resolve();
103
+ });
104
+ });
105
+ },
106
+ removeItem: (key) => {
107
+ return new Promise((resolve, reject) => {
108
+ if (typeof nativeModule.multiRemove !== 'function') {
109
+ resolve();
110
+ return;
111
+ }
112
+ nativeModule.multiRemove([key], (err) => {
113
+ if (err)
114
+ reject(err);
115
+ else
116
+ resolve();
117
+ });
118
+ });
119
+ },
120
+ clear: () => {
121
+ return new Promise((resolve, reject) => {
122
+ if (typeof nativeModule.clear !== 'function') {
123
+ resolve();
124
+ return;
125
+ }
126
+ nativeModule.clear((err) => {
127
+ if (err)
128
+ reject(err);
129
+ else
130
+ resolve();
131
+ });
132
+ });
133
+ },
134
+ };
135
+ }
136
+ return null;
137
+ };
138
+ /**
139
+ * Auto-detect AsyncStorage:
140
+ * 1. Explicit connection
141
+ * 2. Global instance
142
+ * 3. Dynamic require '@react-native-async-storage/async-storage'
143
+ * 4. Native Bridge Direct interface
144
+ */
145
+ const getResolvedAsyncStorage = () => {
146
+ if (customAsyncStorage)
147
+ return customAsyncStorage;
148
+ // 1. Global instances
149
+ try {
150
+ const maybeReq = globalThis?.__inAppAsyncStorage ||
151
+ globalThis?.AsyncStorage ||
152
+ global?.AsyncStorage;
153
+ if (maybeReq && typeof maybeReq.getAllKeys === 'function') {
154
+ return maybeReq;
155
+ }
156
+ }
157
+ catch { }
158
+ // 2. Dynamic runtime require
159
+ try {
160
+ const req = typeof globalThis?.require === 'function'
161
+ ? globalThis.require
162
+ : typeof require === 'function'
163
+ ? require
164
+ : null;
165
+ if (req) {
166
+ try {
167
+ const mod = req('@react-native-async-storage/async-storage');
168
+ const resolved = mod?.default || mod;
169
+ if (resolved && typeof resolved.getAllKeys === 'function') {
170
+ return resolved;
171
+ }
172
+ }
173
+ catch { }
174
+ try {
175
+ const legacyMod = req('@react-native-community/async-storage');
176
+ const resolved = legacyMod?.default || legacyMod;
177
+ if (resolved && typeof resolved.getAllKeys === 'function') {
178
+ return resolved;
179
+ }
180
+ }
181
+ catch { }
182
+ }
183
+ }
184
+ catch { }
185
+ // 3. Native Bridge Fallback (Direct SQLite)
186
+ const nativeBridge = getNativeAsyncStorageBridge();
187
+ if (nativeBridge) {
188
+ return nativeBridge;
189
+ }
190
+ return null;
191
+ };
192
+ exports.getResolvedAsyncStorage = getResolvedAsyncStorage;
193
+ /**
194
+ * Auto-detect MMKV:
195
+ * 1. Explicit connection
196
+ * 2. Dynamic require 'react-native-mmkv' & instantiate default instance
197
+ * 3. Global MMKV / JSI instances
198
+ */
199
+ const getResolvedMMKV = (id = 'default') => {
200
+ if (customMMKVInstances.has(id)) {
201
+ return customMMKVInstances.get(id);
202
+ }
203
+ // 1. Dynamic require
204
+ try {
205
+ const req = typeof globalThis?.require === 'function'
206
+ ? globalThis.require
207
+ : typeof require === 'function'
208
+ ? require
209
+ : null;
210
+ if (req) {
211
+ const mmkvMod = req('react-native-mmkv');
212
+ const MMKVClass = mmkvMod?.MMKV || mmkvMod?.default?.MMKV;
213
+ if (MMKVClass && typeof MMKVClass === 'function') {
214
+ if (!customMMKVInstances.has('default')) {
215
+ try {
216
+ const defaultInst = new MMKVClass();
217
+ customMMKVInstances.set('default', defaultInst);
218
+ }
219
+ catch { }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ catch { }
225
+ // 2. Global references
226
+ try {
227
+ const globalMMKV = globalThis?.mmkv ||
228
+ global?.mmkv ||
229
+ globalThis?.__MMKV__;
230
+ if (globalMMKV && typeof globalMMKV.getAllKeys === 'function') {
231
+ if (!customMMKVInstances.has('default')) {
232
+ customMMKVInstances.set('default', globalMMKV);
233
+ }
234
+ }
235
+ }
236
+ catch { }
237
+ if (customMMKVInstances.has(id)) {
238
+ return customMMKVInstances.get(id);
239
+ }
240
+ if (customMMKVInstances.size > 0) {
241
+ return customMMKVInstances.values().next().value;
242
+ }
243
+ return null;
244
+ };
245
+ exports.getResolvedMMKV = getResolvedMMKV;
246
+ const isAsyncStorageConnected = () => {
247
+ return Boolean((0, exports.getResolvedAsyncStorage)());
248
+ };
249
+ exports.isAsyncStorageConnected = isAsyncStorageConnected;
250
+ const isMMKVConnected = () => {
251
+ return Boolean((0, exports.getResolvedMMKV)());
252
+ };
253
+ exports.isMMKVConnected = isMMKVConnected;
254
+ const getRegisteredMMKVInstanceIds = () => {
255
+ (0, exports.getResolvedMMKV)(); // trigger auto-discovery
256
+ return Array.from(customMMKVInstances.keys());
257
+ };
258
+ exports.getRegisteredMMKVInstanceIds = getRegisteredMMKVInstanceIds;
259
+ /**
260
+ * Calculate approximate byte size of a UTF-8 string
261
+ */
262
+ const calculateByteSize = (str) => {
263
+ if (!str)
264
+ return 0;
265
+ return str.length * 2;
266
+ };
267
+ exports.calculateByteSize = calculateByteSize;
268
+ /**
269
+ * Determine type and format value safely
270
+ */
271
+ const analyzeStorageValue = (rawVal) => {
272
+ if (rawVal === null || rawVal === undefined) {
273
+ return { strVal: 'null', type: 'null', byteSize: 4 };
274
+ }
275
+ const strVal = typeof rawVal === 'string' ? rawVal : String(rawVal);
276
+ const byteSize = (0, exports.calculateByteSize)(strVal);
277
+ if (typeof rawVal === 'number') {
278
+ return { strVal, parsedVal: rawVal, type: 'number', byteSize };
279
+ }
280
+ if (typeof rawVal === 'boolean') {
281
+ return { strVal, parsedVal: rawVal, type: 'boolean', byteSize };
282
+ }
283
+ const trimmed = strVal.trim();
284
+ if ((trimmed.startsWith('{') && trimmed.endsWith('}')) ||
285
+ (trimmed.startsWith('[') && trimmed.endsWith(']'))) {
286
+ try {
287
+ const parsed = JSON.parse(trimmed);
288
+ return { strVal, parsedVal: parsed, type: 'json', byteSize };
289
+ }
290
+ catch { }
291
+ }
292
+ if (trimmed === 'true' || trimmed === 'false') {
293
+ return { strVal, parsedVal: trimmed === 'true', type: 'boolean', byteSize };
294
+ }
295
+ if (!isNaN(Number(trimmed)) && trimmed !== '') {
296
+ return { strVal, parsedVal: Number(trimmed), type: 'number', byteSize };
297
+ }
298
+ return { strVal, type: 'string', byteSize };
299
+ };
300
+ exports.analyzeStorageValue = analyzeStorageValue;
301
+ /**
302
+ * Fetch all storage entries for given driver
303
+ */
304
+ const fetchStorageEntries = async (driver, instanceId) => {
305
+ const entries = [];
306
+ if (driver === 'asyncStorage') {
307
+ const storage = (0, exports.getResolvedAsyncStorage)();
308
+ if (!storage || typeof storage.getAllKeys !== 'function') {
309
+ return [];
310
+ }
311
+ try {
312
+ const keys = await storage.getAllKeys();
313
+ if (!keys || keys.length === 0)
314
+ return [];
315
+ if (typeof storage.multiGet === 'function') {
316
+ const pairs = await storage.multiGet(keys);
317
+ for (const [k, v] of pairs) {
318
+ const analysis = (0, exports.analyzeStorageValue)(v);
319
+ entries.push({
320
+ key: k,
321
+ value: analysis.strVal,
322
+ parsedValue: analysis.parsedVal,
323
+ type: analysis.type,
324
+ byteSize: analysis.byteSize,
325
+ });
326
+ }
327
+ }
328
+ else {
329
+ for (const k of keys) {
330
+ const v = await storage.getItem(k);
331
+ const analysis = (0, exports.analyzeStorageValue)(v);
332
+ entries.push({
333
+ key: k,
334
+ value: analysis.strVal,
335
+ parsedValue: analysis.parsedVal,
336
+ type: analysis.type,
337
+ byteSize: analysis.byteSize,
338
+ });
339
+ }
340
+ }
341
+ }
342
+ catch (err) {
343
+ console.warn('[StorageInspector] Error reading AsyncStorage keys:', err);
344
+ }
345
+ }
346
+ else if (driver === 'mmkv') {
347
+ const mmkv = (0, exports.getResolvedMMKV)(instanceId);
348
+ if (!mmkv || typeof mmkv.getAllKeys !== 'function') {
349
+ return [];
350
+ }
351
+ try {
352
+ const keys = mmkv.getAllKeys();
353
+ for (const k of keys) {
354
+ let rawVal = null;
355
+ if (typeof mmkv.getString === 'function') {
356
+ rawVal = mmkv.getString(k);
357
+ }
358
+ if (rawVal === undefined || rawVal === null) {
359
+ if (typeof mmkv.getNumber === 'function') {
360
+ const num = mmkv.getNumber(k);
361
+ if (num !== undefined && !isNaN(num))
362
+ rawVal = num;
363
+ }
364
+ }
365
+ if (rawVal === undefined || rawVal === null) {
366
+ if (typeof mmkv.getBoolean === 'function') {
367
+ const bool = mmkv.getBoolean(k);
368
+ if (bool !== undefined)
369
+ rawVal = bool;
370
+ }
371
+ }
372
+ const analysis = (0, exports.analyzeStorageValue)(rawVal);
373
+ entries.push({
374
+ key: k,
375
+ value: analysis.strVal,
376
+ parsedValue: analysis.parsedVal,
377
+ type: analysis.type,
378
+ byteSize: analysis.byteSize,
379
+ });
380
+ }
381
+ }
382
+ catch (err) {
383
+ console.warn('[StorageInspector] Error reading MMKV keys:', err);
384
+ }
385
+ }
386
+ // Sort alphabetically by key
387
+ entries.sort((a, b) => a.key.localeCompare(b.key));
388
+ return entries;
389
+ };
390
+ exports.fetchStorageEntries = fetchStorageEntries;
391
+ /**
392
+ * Create or Update a key-value entry (CRUD: Create / Update)
393
+ */
394
+ const setStorageEntry = async (driver, key, value, instanceId) => {
395
+ if (!key.trim())
396
+ return false;
397
+ try {
398
+ if (driver === 'asyncStorage') {
399
+ const storage = (0, exports.getResolvedAsyncStorage)();
400
+ if (!storage || typeof storage.setItem !== 'function')
401
+ return false;
402
+ await storage.setItem(key.trim(), value);
403
+ notifyChange();
404
+ return true;
405
+ }
406
+ else if (driver === 'mmkv') {
407
+ const mmkv = (0, exports.getResolvedMMKV)(instanceId);
408
+ if (!mmkv || typeof mmkv.set !== 'function')
409
+ return false;
410
+ mmkv.set(key.trim(), value);
411
+ notifyChange();
412
+ return true;
413
+ }
414
+ }
415
+ catch (err) {
416
+ console.warn('[StorageInspector] Error setting storage item:', err);
417
+ }
418
+ return false;
419
+ };
420
+ exports.setStorageEntry = setStorageEntry;
421
+ /**
422
+ * Delete a single key (CRUD: Delete)
423
+ */
424
+ const removeStorageEntry = async (driver, key, instanceId) => {
425
+ try {
426
+ if (driver === 'asyncStorage') {
427
+ const storage = (0, exports.getResolvedAsyncStorage)();
428
+ if (!storage || typeof storage.removeItem !== 'function')
429
+ return false;
430
+ await storage.removeItem(key);
431
+ notifyChange();
432
+ return true;
433
+ }
434
+ else if (driver === 'mmkv') {
435
+ const mmkv = (0, exports.getResolvedMMKV)(instanceId);
436
+ if (!mmkv || typeof mmkv.delete !== 'function')
437
+ return false;
438
+ mmkv.delete(key);
439
+ notifyChange();
440
+ return true;
441
+ }
442
+ }
443
+ catch (err) {
444
+ console.warn('[StorageInspector] Error removing storage item:', err);
445
+ }
446
+ return false;
447
+ };
448
+ exports.removeStorageEntry = removeStorageEntry;
449
+ /**
450
+ * Wipe all keys for given storage (CRUD: Clear All)
451
+ */
452
+ const clearStorageDriver = async (driver, instanceId) => {
453
+ try {
454
+ if (driver === 'asyncStorage') {
455
+ const storage = (0, exports.getResolvedAsyncStorage)();
456
+ if (!storage || typeof storage.clear !== 'function')
457
+ return false;
458
+ await storage.clear();
459
+ notifyChange();
460
+ return true;
461
+ }
462
+ else if (driver === 'mmkv') {
463
+ const mmkv = (0, exports.getResolvedMMKV)(instanceId);
464
+ if (!mmkv || typeof mmkv.clearAll !== 'function')
465
+ return false;
466
+ mmkv.clearAll();
467
+ notifyChange();
468
+ return true;
469
+ }
470
+ }
471
+ catch (err) {
472
+ console.warn('[StorageInspector] Error clearing storage:', err);
473
+ }
474
+ return false;
475
+ };
476
+ exports.clearStorageDriver = clearStorageDriver;
477
+ /**
478
+ * Subscribe to storage mutations
479
+ */
480
+ const subscribeToStorageChanges = (listener) => {
481
+ changeListeners.add(listener);
482
+ return () => {
483
+ changeListeners.delete(listener);
484
+ };
485
+ };
486
+ exports.subscribeToStorageChanges = subscribeToStorageChanges;
@@ -36,7 +36,12 @@
36
36
  "apis": "APIs",
37
37
  "logs": "Logs",
38
38
  "analytics": "Analytics",
39
- "redux": "Redux"
39
+ "redux": "Redux",
40
+ "bundle": "Bundle",
41
+ "performance": "Performance",
42
+ "crash": "Crash",
43
+ "device": "Device",
44
+ "storage": "Storage"
40
45
  },
41
46
  "settings": {
42
47
  "mainTitle": "Settings & Modules",
@@ -51,7 +56,8 @@
51
56
  "dormantBadge": "DORMANT",
52
57
  "protectedBadge": "PROTECTED",
53
58
  "modulesAndTools": "Modules & Tools",
54
- "uiPreferences": "UI Preferences",
59
+ "uiPreferences": "UI & Display",
60
+ "ramLimits": "RAM & Limits",
55
61
  "zeroOverheadTitle": "Zero Background Overhead",
56
62
  "zeroOverheadDesc": "Check the modules you wish to activate. Disabled modules consume 0% CPU & memory until saved.",
57
63
  "unsavedPending": "● Unsaved selections pending",
@@ -21,4 +21,5 @@ export { setMaxAnalyticsLogsLimit, getMaxAnalyticsLogsLimit, pruneAnalyticsLogs,
21
21
  export { getMaxCrashLogsLimit, pruneCrashRecords, } from './customHooks/crashHandler';
22
22
  export { setMaxPerformanceEventsLimit, getMaxPerformanceEventsLimit, prunePerformanceEvents, } from './customHooks/performanceTracker';
23
23
  export { BrandSquareIcon, BrandCircleIcon, } from './components/NetworkIcons';
24
+ export { connectAsyncStorage, connectMMKV, isAsyncStorageConnected, isMMKVConnected, getRegisteredMMKVInstanceIds, fetchStorageEntries, setStorageEntry, removeStorageEntry, clearStorageDriver, subscribeToStorageChanges, type StorageEntry, type StorageDriver, } from './customHooks/storageInspector';
24
25
  export { ActiveTab, Method, StatusFilter, SortOrder, LocalFilter, ModalAnimationType, SettingsPage, SettingsSubTab, LogFilter, ConsoleLogType, AnalyticsEventSource, GAEventCategory, StackFrameType, DiffResultType, BundleSubTab, PerformanceSubTab, CrashType, CrashExportFormat, CrashDetailSubTab, CrashFilterType, BreadcrumbType, } from './types';
@@ -38,7 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.registerComponentProfile = exports.getHermesMemoryStats = exports.measureAsync = exports.trackHeavyTask = exports.trackNavigationTransition = exports.trackComponentRender = exports.useNavigationProfiler = exports.useComponentProfiler = 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
40
  exports.pruneCrashRecords = exports.getMaxCrashLogsLimit = exports.pruneAnalyticsLogs = exports.getMaxAnalyticsLogsLimit = exports.setMaxAnalyticsLogsLimit = exports.pruneReduxHistory = exports.getMaxReduxHistoryLimit = exports.setMaxReduxHistoryLimit = exports.pruneConsoleLogs = exports.getMaxConsoleLogsLimit = exports.setMaxConsoleLogsLimit = exports.pruneNetworkLogs = exports.getMaxNetworkLogsLimit = exports.setMaxNetworkLogsLimit = exports.subscribeMemoryWarning = exports.pruneAllLogs = exports.setupMemoryWarningHandler = exports.GA4_API_SECRET = exports.GA4_MEASUREMENT_ID = exports.trackLogExport = exports.trackTabSwitch = exports.trackInspectorOpen = exports.trackTelemetryEvent = exports.sendSessionTelemetryPing = exports.isNativeModuleAvailable = exports.setNativeStorageItem = exports.getNativeStorageItem = exports.getNativeFpsMetrics = exports.stopNativeFpsMonitoring = exports.startNativeFpsMonitoring = exports.subscribeNativeDeviceShake = exports.subscribeNativeFloatingButtonPress = exports.setNativeFloatingButtonBadge = exports.hideNativeFloatingButton = exports.showNativeFloatingButton = exports.subscribeNativeCrashes = exports.enableNativeCrashProtection = exports.getNativeDeviceMetrics = exports.InspectCatch = exports.InspectTrackTime = exports.InspectLog = exports.generateFixSnippet = exports.getInitialPerformanceEvents = exports.getInitialRenderProfiles = exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = exports.getRenderProfiles = exports.subscribeRenderProfiles = void 0;
41
- 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 = exports.BrandCircleIcon = exports.BrandSquareIcon = exports.prunePerformanceEvents = exports.getMaxPerformanceEventsLimit = exports.setMaxPerformanceEventsLimit = void 0;
41
+ 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 = exports.subscribeToStorageChanges = exports.clearStorageDriver = exports.removeStorageEntry = exports.setStorageEntry = exports.fetchStorageEntries = exports.getRegisteredMMKVInstanceIds = exports.isMMKVConnected = exports.isAsyncStorageConnected = exports.connectMMKV = exports.connectAsyncStorage = exports.BrandCircleIcon = exports.BrandSquareIcon = exports.prunePerformanceEvents = exports.getMaxPerformanceEventsLimit = exports.setMaxPerformanceEventsLimit = void 0;
42
42
  const react_1 = __importStar(require("react"));
43
43
  const react_native_1 = require("react-native");
44
44
  const native_1 = require("@react-navigation/native");
@@ -224,6 +224,8 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
224
224
  bundle: false,
225
225
  performance: false,
226
226
  crash: false,
227
+ device: true,
228
+ storage: true,
227
229
  });
228
230
  const [maxNetworkLogs, setMaxNetworkLogs] = (0, react_1.useState)(100);
229
231
  const [maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit] = (0, react_1.useState)(75);
@@ -278,6 +280,8 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
278
280
  bundle: false,
279
281
  performance: false,
280
282
  crash: false,
283
+ device: true,
284
+ storage: true,
281
285
  });
282
286
  setDefaultTab('apis');
283
287
  setIsAutoRamLimitEnabled(true);
@@ -1974,6 +1978,17 @@ Object.defineProperty(exports, "prunePerformanceEvents", { enumerable: true, get
1974
1978
  var NetworkIcons_1 = require("./components/NetworkIcons");
1975
1979
  Object.defineProperty(exports, "BrandSquareIcon", { enumerable: true, get: function () { return NetworkIcons_1.BrandSquareIcon; } });
1976
1980
  Object.defineProperty(exports, "BrandCircleIcon", { enumerable: true, get: function () { return NetworkIcons_1.BrandCircleIcon; } });
1981
+ var storageInspector_1 = require("./customHooks/storageInspector");
1982
+ Object.defineProperty(exports, "connectAsyncStorage", { enumerable: true, get: function () { return storageInspector_1.connectAsyncStorage; } });
1983
+ Object.defineProperty(exports, "connectMMKV", { enumerable: true, get: function () { return storageInspector_1.connectMMKV; } });
1984
+ Object.defineProperty(exports, "isAsyncStorageConnected", { enumerable: true, get: function () { return storageInspector_1.isAsyncStorageConnected; } });
1985
+ Object.defineProperty(exports, "isMMKVConnected", { enumerable: true, get: function () { return storageInspector_1.isMMKVConnected; } });
1986
+ Object.defineProperty(exports, "getRegisteredMMKVInstanceIds", { enumerable: true, get: function () { return storageInspector_1.getRegisteredMMKVInstanceIds; } });
1987
+ Object.defineProperty(exports, "fetchStorageEntries", { enumerable: true, get: function () { return storageInspector_1.fetchStorageEntries; } });
1988
+ Object.defineProperty(exports, "setStorageEntry", { enumerable: true, get: function () { return storageInspector_1.setStorageEntry; } });
1989
+ Object.defineProperty(exports, "removeStorageEntry", { enumerable: true, get: function () { return storageInspector_1.removeStorageEntry; } });
1990
+ Object.defineProperty(exports, "clearStorageDriver", { enumerable: true, get: function () { return storageInspector_1.clearStorageDriver; } });
1991
+ Object.defineProperty(exports, "subscribeToStorageChanges", { enumerable: true, get: function () { return storageInspector_1.subscribeToStorageChanges; } });
1977
1992
  var types_1 = require("./types");
1978
1993
  Object.defineProperty(exports, "ActiveTab", { enumerable: true, get: function () { return types_1.ActiveTab; } });
1979
1994
  Object.defineProperty(exports, "Method", { enumerable: true, get: function () { return types_1.Method; } });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Sub-module entry point: react-native-inapp-inspector/storage
3
+ * Universal AsyncStorage and MMKV live inspector with full CRUD operations.
4
+ */
5
+ export { connectAsyncStorage, connectMMKV, isAsyncStorageConnected, isMMKVConnected, getRegisteredMMKVInstanceIds, fetchStorageEntries, setStorageEntry, removeStorageEntry, clearStorageDriver, subscribeToStorageChanges, type StorageEntry, type StorageDriver, } from './customHooks/storageInspector';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subscribeToStorageChanges = exports.clearStorageDriver = exports.removeStorageEntry = exports.setStorageEntry = exports.fetchStorageEntries = exports.getRegisteredMMKVInstanceIds = exports.isMMKVConnected = exports.isAsyncStorageConnected = exports.connectMMKV = exports.connectAsyncStorage = void 0;
4
+ /**
5
+ * Sub-module entry point: react-native-inapp-inspector/storage
6
+ * Universal AsyncStorage and MMKV live inspector with full CRUD operations.
7
+ */
8
+ var storageInspector_1 = require("./customHooks/storageInspector");
9
+ Object.defineProperty(exports, "connectAsyncStorage", { enumerable: true, get: function () { return storageInspector_1.connectAsyncStorage; } });
10
+ Object.defineProperty(exports, "connectMMKV", { enumerable: true, get: function () { return storageInspector_1.connectMMKV; } });
11
+ Object.defineProperty(exports, "isAsyncStorageConnected", { enumerable: true, get: function () { return storageInspector_1.isAsyncStorageConnected; } });
12
+ Object.defineProperty(exports, "isMMKVConnected", { enumerable: true, get: function () { return storageInspector_1.isMMKVConnected; } });
13
+ Object.defineProperty(exports, "getRegisteredMMKVInstanceIds", { enumerable: true, get: function () { return storageInspector_1.getRegisteredMMKVInstanceIds; } });
14
+ Object.defineProperty(exports, "fetchStorageEntries", { enumerable: true, get: function () { return storageInspector_1.fetchStorageEntries; } });
15
+ Object.defineProperty(exports, "setStorageEntry", { enumerable: true, get: function () { return storageInspector_1.setStorageEntry; } });
16
+ Object.defineProperty(exports, "removeStorageEntry", { enumerable: true, get: function () { return storageInspector_1.removeStorageEntry; } });
17
+ Object.defineProperty(exports, "clearStorageDriver", { enumerable: true, get: function () { return storageInspector_1.clearStorageDriver; } });
18
+ Object.defineProperty(exports, "subscribeToStorageChanges", { enumerable: true, get: function () { return storageInspector_1.subscribeToStorageChanges; } });
@@ -6,6 +6,8 @@ export declare const ActiveTab: {
6
6
  readonly Bundle: "bundle";
7
7
  readonly Performance: "performance";
8
8
  readonly Crash: "crash";
9
+ readonly Device: "device";
10
+ readonly Storage: "storage";
9
11
  };
10
12
  export type ActiveTab = (typeof ActiveTab)[keyof typeof ActiveTab];
11
13
  export declare const Method: {
@@ -52,11 +54,14 @@ export declare const SettingsPage: {
52
54
  readonly Bundle: "bundle";
53
55
  readonly Performance: "performance";
54
56
  readonly Crash: "crash";
57
+ readonly Device: "device";
58
+ readonly Storage: "storage";
55
59
  };
56
60
  export type SettingsPage = (typeof SettingsPage)[keyof typeof SettingsPage] | null;
57
61
  export declare const SettingsSubTab: {
58
62
  readonly Module: "module";
59
63
  readonly Ui: "ui";
64
+ readonly Limits: "limits";
60
65
  };
61
66
  export type SettingsSubTab = (typeof SettingsSubTab)[keyof typeof SettingsSubTab];
62
67
  export declare const LogFilter: {
@@ -12,6 +12,8 @@ exports.ActiveTab = {
12
12
  Bundle: 'bundle',
13
13
  Performance: 'performance',
14
14
  Crash: 'crash',
15
+ Device: 'device',
16
+ Storage: 'storage',
15
17
  };
16
18
  exports.Method = {
17
19
  All: 'ALL',
@@ -52,10 +54,13 @@ exports.SettingsPage = {
52
54
  Bundle: 'bundle',
53
55
  Performance: 'performance',
54
56
  Crash: 'crash',
57
+ Device: 'device',
58
+ Storage: 'storage',
55
59
  };
56
60
  exports.SettingsSubTab = {
57
61
  Module: 'module',
58
62
  Ui: 'ui',
63
+ Limits: 'limits',
59
64
  };
60
65
  exports.LogFilter = {
61
66
  All: 'all',
@@ -12,7 +12,7 @@ import { AppColors } from '../styles/AppColors';
12
12
  import { getSize, formatDateTime } from '../helpers';
13
13
  import { getEventCategory } from '../helpers/gaAnalyticsRegistry';
14
14
  import { useTranslation } from '../i18n';
15
- import { SparkleIcon, ClockIcon, SearchIcon, ClearIcon, LayersIcon, CartIcon, GlobeIcon, BoltIcon, PinIcon, MoneyIcon, PrettyIcon, RawIcon, TableIcon, DocIcon, } from './NetworkIcons';
15
+ import { SparkleIcon, ClockIcon, SearchIcon, ClearIcon, LayersIcon, CartIcon, GlobeIcon, BoltIcon, PinIcon, MoneyIcon, PrettyIcon, RawIcon, TableIcon, DocIcon, PackageIcon, } from './NetworkIcons';
16
16
  const AnalyticsDetail = ({ event, }) => {
17
17
  const { t } = useTranslation();
18
18
  const [activeViewTab, setActiveViewTab] = useState('overview');
@@ -227,8 +227,9 @@ const AnalyticsDetail = ({ event, }) => {
227
227
  </View>)}
228
228
 
229
229
  {itemsCount !== null && (<View style={detailStyles.itemsPill}>
230
+ <PackageIcon size={12} color="#1D4ED8"/>
230
231
  <Text style={detailStyles.itemsValue}>
231
- 📦 {itemsCount} items
232
+ {itemsCount} items
232
233
  </Text>
233
234
  </View>)}
234
235
  </View>
@@ -531,6 +532,9 @@ const detailStyles = StyleSheet.create({
531
532
  color: '#047857',
532
533
  },
533
534
  itemsPill: {
535
+ flexDirection: 'row',
536
+ alignItems: 'center',
537
+ gap: 4,
534
538
  backgroundColor: '#EFF6FF',
535
539
  paddingHorizontal: 7,
536
540
  paddingVertical: 3,