react-native-inapp-inspector 2.2.3 → 2.2.5
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/dist/commonjs/components/AnalyticsDetail.js +5 -1
- package/dist/commonjs/components/AnalyticsEventCard.js +2 -1
- package/dist/commonjs/components/BrandSquareIcon.js +51 -117
- package/dist/commonjs/components/DiffViewer.js +1 -1
- package/dist/commonjs/components/Inspector/BundleTab.js +22 -0
- package/dist/commonjs/components/Inspector/DeviceInfoTab.d.ts +3 -0
- package/dist/commonjs/components/Inspector/DeviceInfoTab.js +835 -0
- package/dist/commonjs/components/Inspector/InspectorHeader.js +12 -14
- package/dist/commonjs/components/Inspector/LogDetail.js +6 -3
- package/dist/commonjs/components/Inspector/MainScreen.js +7 -3
- package/dist/commonjs/components/Inspector/NetworkTab.js +92 -15
- package/dist/commonjs/components/Inspector/PerformanceTab.js +38 -12
- package/dist/commonjs/components/Inspector/SettingsPanel.js +440 -229
- package/dist/commonjs/components/Inspector/StorageTab.d.ts +3 -0
- package/dist/commonjs/components/Inspector/StorageTab.js +892 -0
- package/dist/commonjs/components/Inspector/TabBar.js +14 -0
- package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +12 -18
- package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +4 -1
- package/dist/commonjs/components/NetworkIcons.d.ts +6 -0
- package/dist/commonjs/components/NetworkIcons.js +30 -1
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/bundleAnalyzer.js +44 -22
- package/dist/commonjs/customHooks/storageInspector.d.ts +67 -0
- package/dist/commonjs/customHooks/storageInspector.js +486 -0
- package/dist/commonjs/i18n/locales/en.json +8 -2
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +16 -1
- package/dist/commonjs/native/NativeInspector.js +50 -26
- package/dist/commonjs/storage.d.ts +5 -0
- package/dist/commonjs/storage.js +18 -0
- package/dist/commonjs/types/enums.d.ts +5 -0
- package/dist/commonjs/types/enums.js +5 -0
- package/dist/esm/components/AnalyticsDetail.js +6 -2
- package/dist/esm/components/AnalyticsEventCard.js +2 -1
- package/dist/esm/components/BrandSquareIcon.js +52 -118
- package/dist/esm/components/DiffViewer.js +1 -1
- package/dist/esm/components/Inspector/BundleTab.js +22 -0
- package/dist/esm/components/Inspector/DeviceInfoTab.d.ts +3 -0
- package/dist/esm/components/Inspector/DeviceInfoTab.js +796 -0
- package/dist/esm/components/Inspector/InspectorHeader.js +13 -15
- package/dist/esm/components/Inspector/LogDetail.js +7 -4
- package/dist/esm/components/Inspector/MainScreen.js +7 -3
- package/dist/esm/components/Inspector/NetworkTab.js +93 -16
- package/dist/esm/components/Inspector/PerformanceTab.js +39 -13
- package/dist/esm/components/Inspector/SettingsPanel.js +441 -230
- package/dist/esm/components/Inspector/StorageTab.d.ts +3 -0
- package/dist/esm/components/Inspector/StorageTab.js +853 -0
- package/dist/esm/components/Inspector/TabBar.js +15 -1
- package/dist/esm/components/Inspector/TelemetryConsentModal.js +12 -18
- package/dist/esm/components/Inspector/UpdateAvailableModal.js +4 -1
- package/dist/esm/components/NetworkIcons.d.ts +6 -0
- package/dist/esm/components/NetworkIcons.js +23 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/bundleAnalyzer.js +44 -22
- package/dist/esm/customHooks/storageInspector.d.ts +67 -0
- package/dist/esm/customHooks/storageInspector.js +469 -0
- package/dist/esm/i18n/locales/en.json +8 -2
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/native/NativeInspector.js +51 -27
- package/dist/esm/storage.d.ts +5 -0
- package/dist/esm/storage.js +5 -0
- package/dist/esm/types/enums.d.ts +5 -0
- package/dist/esm/types/enums.js +5 -0
- package/ios/NetworkInspectorModule.mm +34 -19
- package/package.json +8 -1
- package/src/components/AnalyticsDetail.tsx +6 -1
- package/src/components/AnalyticsEventCard.tsx +2 -1
- package/src/components/BrandSquareIcon.tsx +109 -118
- package/src/components/DiffViewer.tsx +1 -1
- package/src/components/Inspector/BundleTab.tsx +29 -0
- package/src/components/Inspector/DeviceInfoTab.tsx +1204 -0
- package/src/components/Inspector/InspectorHeader.tsx +13 -14
- package/src/components/Inspector/LogDetail.tsx +15 -11
- package/src/components/Inspector/MainScreen.tsx +7 -3
- package/src/components/Inspector/NetworkTab.tsx +104 -16
- package/src/components/Inspector/PerformanceTab.tsx +46 -12
- package/src/components/Inspector/SettingsPanel.tsx +570 -304
- package/src/components/Inspector/StorageTab.tsx +1048 -0
- package/src/components/Inspector/TabBar.tsx +20 -0
- package/src/components/Inspector/TelemetryConsentModal.tsx +17 -52
- package/src/components/Inspector/UpdateAvailableModal.tsx +13 -1
- package/src/components/NetworkIcons.tsx +103 -0
- package/src/constants/version.ts +1 -1
- package/src/customHooks/bundleAnalyzer.ts +47 -22
- package/src/customHooks/storageInspector.ts +509 -0
- package/src/i18n/locales/en.json +8 -2
- package/src/index.tsx +21 -1
- package/src/native/NativeInspector.ts +56 -24
- package/src/storage.ts +18 -0
- package/src/types/enums.ts +5 -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
|
|
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",
|
package/dist/commonjs/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/commonjs/index.js
CHANGED
|
@@ -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; } });
|
|
@@ -12,10 +12,16 @@ const isNativeModuleAvailable = () => {
|
|
|
12
12
|
return !!NativeModule;
|
|
13
13
|
};
|
|
14
14
|
exports.isNativeModuleAvailable = isNativeModuleAvailable;
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const getNativeEmitter = () => {
|
|
16
|
+
try {
|
|
17
|
+
if (react_native_1.NativeModules && react_native_1.NativeModules.NetworkInspectorModule) {
|
|
18
|
+
return new react_native_1.NativeEventEmitter(react_native_1.NativeModules.NetworkInspectorModule);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (e) { }
|
|
22
|
+
return null;
|
|
23
|
+
};
|
|
24
|
+
const nativeEmitter = getNativeEmitter();
|
|
19
25
|
/**
|
|
20
26
|
* Retrieves low-level native hardware and system metrics (RAM, Heap, Disk, Battery, CPU).
|
|
21
27
|
*/
|
|
@@ -56,18 +62,27 @@ exports.enableNativeCrashProtection = enableNativeCrashProtection;
|
|
|
56
62
|
* Subscribes to fatal native crash events caught by the iOS / Kotlin exception handlers.
|
|
57
63
|
*/
|
|
58
64
|
const subscribeNativeCrashes = (callback) => {
|
|
59
|
-
|
|
60
|
-
return () => { };
|
|
61
|
-
}
|
|
65
|
+
const cleanups = [];
|
|
62
66
|
try {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
const sub1 = react_native_1.DeviceEventEmitter.addListener('onNativeCrash', callback);
|
|
68
|
+
cleanups.push(() => sub1.remove());
|
|
69
|
+
}
|
|
70
|
+
catch (e) { }
|
|
71
|
+
if (nativeEmitter) {
|
|
72
|
+
try {
|
|
73
|
+
const sub2 = nativeEmitter.addListener('onNativeCrash', callback);
|
|
74
|
+
cleanups.push(() => sub2.remove());
|
|
75
|
+
}
|
|
76
|
+
catch (e) { }
|
|
77
|
+
}
|
|
78
|
+
return () => {
|
|
79
|
+
cleanups.forEach(fn => {
|
|
80
|
+
try {
|
|
81
|
+
fn();
|
|
82
|
+
}
|
|
83
|
+
catch (e) { }
|
|
84
|
+
});
|
|
85
|
+
};
|
|
71
86
|
};
|
|
72
87
|
exports.subscribeNativeCrashes = subscribeNativeCrashes;
|
|
73
88
|
/**
|
|
@@ -123,18 +138,27 @@ exports.setNativeFloatingButtonBadge = setNativeFloatingButtonBadge;
|
|
|
123
138
|
* Subscribes to tap events on the native floating button.
|
|
124
139
|
*/
|
|
125
140
|
const subscribeNativeFloatingButtonPress = (callback) => {
|
|
126
|
-
|
|
127
|
-
return () => { };
|
|
128
|
-
}
|
|
141
|
+
const cleanups = [];
|
|
129
142
|
try {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
143
|
+
const sub1 = react_native_1.DeviceEventEmitter.addListener('onFloatingButtonPress', callback);
|
|
144
|
+
cleanups.push(() => sub1.remove());
|
|
145
|
+
}
|
|
146
|
+
catch (e) { }
|
|
147
|
+
if (nativeEmitter) {
|
|
148
|
+
try {
|
|
149
|
+
const sub2 = nativeEmitter.addListener('onFloatingButtonPress', callback);
|
|
150
|
+
cleanups.push(() => sub2.remove());
|
|
151
|
+
}
|
|
152
|
+
catch (e) { }
|
|
153
|
+
}
|
|
154
|
+
return () => {
|
|
155
|
+
cleanups.forEach(fn => {
|
|
156
|
+
try {
|
|
157
|
+
fn();
|
|
158
|
+
}
|
|
159
|
+
catch (e) { }
|
|
160
|
+
});
|
|
161
|
+
};
|
|
138
162
|
};
|
|
139
163
|
exports.subscribeNativeFloatingButtonPress = subscribeNativeFloatingButtonPress;
|
|
140
164
|
/**
|
|
@@ -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';
|