react-native-inapp-inspector 2.3.14 → 2.3.15
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/AnimatedEntrance.js +3 -3
- package/dist/commonjs/components/ConsoleLogCard.js +174 -100
- package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -16
- package/dist/commonjs/components/Inspector/CrashTab.js +19 -5
- package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
- package/dist/commonjs/components/Inspector/InspectorHeader.js +2 -2
- package/dist/commonjs/components/Inspector/MainScreen.js +56 -56
- package/dist/commonjs/components/Inspector/NetworkTab.js +1 -335
- package/dist/commonjs/components/Inspector/PerformanceTab.js +32 -6
- package/dist/commonjs/components/Inspector/ReduxTab.js +3 -1
- package/dist/commonjs/components/Inspector/StorageTab.js +23 -5
- package/dist/commonjs/components/JsonViewer.js +14 -2
- package/dist/commonjs/components/LogCard.js +428 -227
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
- package/dist/commonjs/customHooks/consoleLogger.js +34 -2
- package/dist/commonjs/customHooks/crashHandler.js +1 -1
- package/dist/commonjs/customHooks/networkLogger.js +184 -26
- package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
- package/dist/commonjs/helpers/searchQueryParser.js +37 -291
- package/dist/commonjs/index.js +141 -27
- package/dist/esm/components/AnimatedEntrance.js +3 -3
- package/dist/esm/components/ConsoleLogCard.js +141 -100
- package/dist/esm/components/Inspector/ConsoleTab.js +25 -16
- package/dist/esm/components/Inspector/CrashTab.js +19 -5
- package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
- package/dist/esm/components/Inspector/InspectorHeader.js +3 -3
- package/dist/esm/components/Inspector/MainScreen.js +56 -56
- package/dist/esm/components/Inspector/NetworkTab.js +2 -336
- package/dist/esm/components/Inspector/PerformanceTab.js +32 -6
- package/dist/esm/components/Inspector/ReduxTab.js +3 -1
- package/dist/esm/components/Inspector/StorageTab.js +23 -5
- package/dist/esm/components/JsonViewer.js +14 -2
- package/dist/esm/components/LogCard.js +422 -221
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.js +1 -1
- package/dist/esm/customHooks/consoleLogger.js +34 -2
- package/dist/esm/customHooks/crashHandler.js +1 -1
- package/dist/esm/customHooks/networkLogger.js +184 -26
- package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
- package/dist/esm/helpers/searchQueryParser.js +37 -291
- package/dist/esm/index.js +141 -27
- package/package.json +1 -1
- package/src/components/AnimatedEntrance.tsx +3 -3
- package/src/components/ConsoleLogCard.tsx +154 -103
- package/src/components/Inspector/ConsoleTab.tsx +27 -18
- package/src/components/Inspector/CrashTab.tsx +19 -5
- package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
- package/src/components/Inspector/InspectorHeader.tsx +5 -3
- package/src/components/Inspector/MainScreen.tsx +2 -3
- package/src/components/Inspector/NetworkTab.tsx +1 -402
- package/src/components/Inspector/PerformanceTab.tsx +36 -7
- package/src/components/Inspector/ReduxTab.tsx +9 -1
- package/src/components/Inspector/StorageTab.tsx +27 -7
- package/src/components/JsonViewer.tsx +15 -2
- package/src/components/LogCard.tsx +528 -339
- package/src/constants/version.ts +1 -1
- package/src/customHooks/analyticsLogger.ts +1 -1
- package/src/customHooks/consoleLogger.ts +36 -3
- package/src/customHooks/crashHandler.ts +1 -1
- package/src/customHooks/networkLogger.ts +214 -26
- package/src/helpers/searchQueryParser.ts +40 -285
- package/src/index.tsx +332 -211
|
@@ -1,311 +1,57 @@
|
|
|
1
|
-
export function matchNetworkLogQuery(log, searchQuery, routePath,
|
|
1
|
+
export function matchNetworkLogQuery(log, searchQuery, routePath, _options) {
|
|
2
2
|
if (!searchQuery || searchQuery.trim().length === 0)
|
|
3
3
|
return true;
|
|
4
|
-
const rawTokens = searchQuery.trim().
|
|
4
|
+
const rawTokens = searchQuery.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
5
5
|
if (rawTokens.length === 0)
|
|
6
6
|
return true;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const methodRaw = log.method || '';
|
|
11
|
-
const urlRaw = log.url || '';
|
|
7
|
+
const methodRaw = (log.method || '').toLowerCase();
|
|
8
|
+
const urlRaw = (log.url || '').toLowerCase();
|
|
9
|
+
const statusStr = log.status != null ? String(log.status).toLowerCase() : 'pending';
|
|
12
10
|
const statusNum = typeof log.status === 'number'
|
|
13
11
|
? log.status
|
|
14
12
|
: log.status != null
|
|
15
13
|
? parseInt(String(log.status), 10)
|
|
16
14
|
: null;
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const callerRaw = log.caller || '';
|
|
15
|
+
const clientRaw = (log.client || '').toLowerCase();
|
|
16
|
+
const callerRaw = (log.caller || '').toLowerCase();
|
|
17
|
+
const pathRaw = (routePath || log?.routeInfo?.path || '').toLowerCase();
|
|
21
18
|
const reqRaw = typeof log.request === 'string'
|
|
22
|
-
? log.request
|
|
19
|
+
? log.request.toLowerCase()
|
|
23
20
|
: log.request != null
|
|
24
|
-
? JSON.stringify(log.request)
|
|
21
|
+
? JSON.stringify(log.request).toLowerCase()
|
|
25
22
|
: '';
|
|
26
23
|
const resRaw = typeof log.response === 'string'
|
|
27
|
-
? log.response
|
|
24
|
+
? log.response.toLowerCase()
|
|
28
25
|
: log.response != null
|
|
29
|
-
? JSON.stringify(log.response)
|
|
26
|
+
? JSON.stringify(log.response).toLowerCase()
|
|
30
27
|
: '';
|
|
31
28
|
const reqHeadersRaw = log.requestHeaders
|
|
32
|
-
? JSON.stringify(log.requestHeaders)
|
|
29
|
+
? JSON.stringify(log.requestHeaders).toLowerCase()
|
|
33
30
|
: '';
|
|
34
31
|
const resHeadersRaw = log.responseHeaders
|
|
35
|
-
? JSON.stringify(log.responseHeaders)
|
|
32
|
+
? JSON.stringify(log.responseHeaders).toLowerCase()
|
|
36
33
|
: '';
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
reqRaw,
|
|
61
|
-
resRaw,
|
|
62
|
-
reqHeadersRaw,
|
|
63
|
-
resHeadersRaw,
|
|
64
|
-
];
|
|
65
|
-
}
|
|
66
|
-
const combined = parts.join(' ');
|
|
67
|
-
return caseSens ? combined : combined.toLowerCase();
|
|
68
|
-
};
|
|
69
|
-
const targetCorpus = getScopedCorpus(isCaseSensitive);
|
|
70
|
-
const methodStr = methodRaw.toLowerCase();
|
|
71
|
-
const urlStr = urlRaw.toLowerCase();
|
|
72
|
-
const clientStr = clientRaw.toLowerCase();
|
|
73
|
-
const callerStr = callerRaw.toLowerCase();
|
|
74
|
-
const reqStr = reqRaw.toLowerCase();
|
|
75
|
-
const resStr = resRaw.toLowerCase();
|
|
76
|
-
const reqHeadersStr = reqHeadersRaw.toLowerCase();
|
|
77
|
-
const resHeadersStr = resHeadersRaw.toLowerCase();
|
|
78
|
-
const pathStr = pathRaw.toLowerCase();
|
|
79
|
-
for (const rawToken of rawTokens) {
|
|
80
|
-
const token = rawToken.replace(/^["']|["']$/g, '').trim();
|
|
81
|
-
if (!token)
|
|
82
|
-
continue;
|
|
83
|
-
const lowerToken = token.toLowerCase();
|
|
84
|
-
if (lowerToken.startsWith('method:') || lowerToken.startsWith('m:')) {
|
|
85
|
-
const targetMethod = lowerToken.replace(/^(method:|m:)/, '').trim();
|
|
86
|
-
if (targetMethod.startsWith('!')) {
|
|
87
|
-
if (methodStr === targetMethod.slice(1))
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
if (methodStr !== targetMethod)
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (lowerToken.startsWith('status:') || lowerToken.startsWith('s:')) {
|
|
97
|
-
const val = lowerToken.replace(/^(status:|s:)/, '').trim();
|
|
98
|
-
if (val === 'pending' || val === 'loading') {
|
|
99
|
-
if (log.status != null)
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
else if (val.startsWith('>=')) {
|
|
103
|
-
const threshold = parseInt(val.slice(2), 10);
|
|
104
|
-
if (isNaN(threshold) || statusNum === null || statusNum < threshold)
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
else if (val.startsWith('>')) {
|
|
108
|
-
const threshold = parseInt(val.slice(1), 10);
|
|
109
|
-
if (isNaN(threshold) || statusNum === null || statusNum <= threshold)
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
else if (val.startsWith('<=')) {
|
|
113
|
-
const threshold = parseInt(val.slice(2), 10);
|
|
114
|
-
if (isNaN(threshold) || statusNum === null || statusNum > threshold)
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
else if (val.startsWith('<')) {
|
|
118
|
-
const threshold = parseInt(val.slice(1), 10);
|
|
119
|
-
if (isNaN(threshold) || statusNum === null || statusNum >= threshold)
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
122
|
-
else if (val.endsWith('xx') || val.endsWith('x')) {
|
|
123
|
-
const prefix = val.replace(/x/g, '');
|
|
124
|
-
if (!statusStr.startsWith(prefix))
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
const targetCode = parseInt(val, 10);
|
|
129
|
-
if (!isNaN(targetCode)) {
|
|
130
|
-
if (statusNum !== targetCode)
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
else if (!statusStr.includes(val)) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
|
-
if (lowerToken.startsWith('is:')) {
|
|
140
|
-
const flag = lowerToken.slice(3).trim();
|
|
141
|
-
if (flag === 'error' ||
|
|
142
|
-
flag === 'failed' ||
|
|
143
|
-
flag === 'err' ||
|
|
144
|
-
flag === 'fail') {
|
|
145
|
-
const isErr = log.status === 0 || (statusNum !== null && statusNum >= 400);
|
|
146
|
-
if (!isErr)
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
else if (flag === 'success' || flag === 'ok' || flag === '2xx') {
|
|
150
|
-
const isSuccess = statusNum !== null && statusNum >= 200 && statusNum < 300;
|
|
151
|
-
if (!isSuccess)
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
else if (flag === 'pending' || flag === 'loading') {
|
|
155
|
-
if (log.status != null)
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
else if (flag === 'slow') {
|
|
159
|
-
if (durationNum < 1000)
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
else if (flag === 'fast') {
|
|
163
|
-
if (durationNum >= 200)
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
else if (flag === 'graphql' || flag === 'gql') {
|
|
167
|
-
const isGql = urlStr.includes('graphql') ||
|
|
168
|
-
clientStr === 'graphql' ||
|
|
169
|
-
clientStr === 'apollo';
|
|
170
|
-
if (!isGql)
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
else if (flag === 'https') {
|
|
174
|
-
if (!urlStr.startsWith('https'))
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
else if (flag === 'http') {
|
|
178
|
-
if (urlStr.startsWith('https') || !urlStr.startsWith('http'))
|
|
179
|
-
return false;
|
|
180
|
-
}
|
|
181
|
-
else if (flag === 'json') {
|
|
182
|
-
const isJson = reqHeadersStr.includes('application/json') ||
|
|
183
|
-
resHeadersStr.includes('application/json') ||
|
|
184
|
-
urlStr.includes('.json');
|
|
185
|
-
if (!isJson)
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
else if (flag === 'image') {
|
|
189
|
-
const isImg = resHeadersStr.includes('image/') ||
|
|
190
|
-
/\.(png|jpe?g|gif|webp|svg)/i.test(urlStr);
|
|
191
|
-
if (!isImg)
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (lowerToken.startsWith('slow:') ||
|
|
197
|
-
lowerToken.startsWith('dur:') ||
|
|
198
|
-
lowerToken.startsWith('duration:')) {
|
|
199
|
-
const val = lowerToken.replace(/^(slow:|dur:|duration:)/, '').trim();
|
|
200
|
-
let thresholdMs = 0;
|
|
201
|
-
let isGreater = true;
|
|
202
|
-
let cleanVal = val;
|
|
203
|
-
if (val.startsWith('>=')) {
|
|
204
|
-
isGreater = true;
|
|
205
|
-
cleanVal = val.slice(2);
|
|
206
|
-
}
|
|
207
|
-
else if (val.startsWith('>')) {
|
|
208
|
-
isGreater = true;
|
|
209
|
-
cleanVal = val.slice(1);
|
|
210
|
-
}
|
|
211
|
-
else if (val.startsWith('<=')) {
|
|
212
|
-
isGreater = false;
|
|
213
|
-
cleanVal = val.slice(2);
|
|
214
|
-
}
|
|
215
|
-
else if (val.startsWith('<')) {
|
|
216
|
-
isGreater = false;
|
|
217
|
-
cleanVal = val.slice(1);
|
|
218
|
-
}
|
|
219
|
-
if (cleanVal.endsWith('s') && !cleanVal.endsWith('ms')) {
|
|
220
|
-
thresholdMs = parseFloat(cleanVal.slice(0, -1)) * 1000;
|
|
221
|
-
}
|
|
222
|
-
else if (cleanVal.endsWith('ms')) {
|
|
223
|
-
thresholdMs = parseFloat(cleanVal.slice(0, -2));
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
thresholdMs = parseFloat(cleanVal);
|
|
227
|
-
}
|
|
228
|
-
if (!isNaN(thresholdMs)) {
|
|
229
|
-
if (isGreater) {
|
|
230
|
-
if (durationNum < thresholdMs)
|
|
231
|
-
return false;
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
if (durationNum > thresholdMs)
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
continue;
|
|
239
|
-
}
|
|
240
|
-
if (lowerToken.startsWith('client:') || lowerToken.startsWith('c:')) {
|
|
241
|
-
const targetClient = lowerToken.replace(/^(client:|c:)/, '').trim();
|
|
242
|
-
if (!clientStr.includes(targetClient))
|
|
243
|
-
return false;
|
|
244
|
-
continue;
|
|
245
|
-
}
|
|
246
|
-
if (lowerToken.startsWith('domain:') || lowerToken.startsWith('d:')) {
|
|
247
|
-
const targetDomain = lowerToken.replace(/^(domain:|d:)/, '').trim();
|
|
248
|
-
if (!urlStr.includes(targetDomain))
|
|
249
|
-
return false;
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
if (lowerToken.startsWith('path:') ||
|
|
253
|
-
lowerToken.startsWith('p:') ||
|
|
254
|
-
lowerToken.startsWith('page:')) {
|
|
255
|
-
const targetPath = lowerToken
|
|
256
|
-
.replace(/^(path:|p:|page:)/, '')
|
|
257
|
-
.trim();
|
|
258
|
-
if (!urlStr.includes(targetPath) &&
|
|
259
|
-
!pathStr.includes(targetPath) &&
|
|
260
|
-
!callerStr.includes(targetPath)) {
|
|
261
|
-
return false;
|
|
262
|
-
}
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
if (lowerToken.startsWith('req:') || lowerToken.startsWith('body:')) {
|
|
266
|
-
const target = lowerToken.replace(/^(req:|body:)/, '').trim();
|
|
267
|
-
if (!reqStr.includes(target))
|
|
268
|
-
return false;
|
|
269
|
-
continue;
|
|
270
|
-
}
|
|
271
|
-
if (lowerToken.startsWith('res:')) {
|
|
272
|
-
const target = lowerToken.slice(4).trim();
|
|
273
|
-
if (!resStr.includes(target))
|
|
274
|
-
return false;
|
|
275
|
-
continue;
|
|
276
|
-
}
|
|
277
|
-
if (lowerToken.startsWith('header:') || lowerToken.startsWith('h:')) {
|
|
278
|
-
const target = lowerToken.replace(/^(header:|h:)/, '').trim();
|
|
279
|
-
if (!reqHeadersStr.includes(target) && !resHeadersStr.includes(target)) {
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
continue;
|
|
283
|
-
}
|
|
284
|
-
if (isRegex) {
|
|
285
|
-
try {
|
|
286
|
-
const re = new RegExp(token, isCaseSensitive ? '' : 'i');
|
|
287
|
-
if (!re.test(targetCorpus))
|
|
288
|
-
return false;
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
const queryTerm = isCaseSensitive ? token : lowerToken;
|
|
292
|
-
if (!targetCorpus.includes(queryTerm))
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
const queryTerm = isCaseSensitive ? token : lowerToken;
|
|
298
|
-
if (!targetCorpus.includes(queryTerm)) {
|
|
299
|
-
if (queryTerm === 'error' ||
|
|
300
|
-
queryTerm === 'failed' ||
|
|
301
|
-
queryTerm === 'fail') {
|
|
302
|
-
const isErr = log.status === 0 || (statusNum !== null && statusNum >= 400);
|
|
303
|
-
if (isErr)
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
return true;
|
|
34
|
+
const corpus = [
|
|
35
|
+
methodRaw,
|
|
36
|
+
urlRaw,
|
|
37
|
+
statusStr,
|
|
38
|
+
pathRaw,
|
|
39
|
+
callerRaw,
|
|
40
|
+
clientRaw,
|
|
41
|
+
reqRaw,
|
|
42
|
+
resRaw,
|
|
43
|
+
reqHeadersRaw,
|
|
44
|
+
resHeadersRaw,
|
|
45
|
+
].join(' ');
|
|
46
|
+
return rawTokens.every(token => {
|
|
47
|
+
if (corpus.includes(token))
|
|
48
|
+
return true;
|
|
49
|
+
if (token === 'error' || token === 'failed' || token === 'err' || token === 'fail') {
|
|
50
|
+
return log.status === 0 || (statusNum !== null && statusNum >= 400);
|
|
51
|
+
}
|
|
52
|
+
if (token === 'success' || token === 'ok' || token === '2xx') {
|
|
53
|
+
return statusNum !== null && statusNum >= 200 && statusNum < 300;
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
});
|
|
311
57
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -127,7 +127,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
127
127
|
const [maxConsoleLogs, setMaxConsoleLogs] = useState(100);
|
|
128
128
|
const [showConsoleLevels, setShowConsoleLevels] = useState({
|
|
129
129
|
info: true,
|
|
130
|
-
warn:
|
|
130
|
+
warn: true,
|
|
131
131
|
error: true,
|
|
132
132
|
});
|
|
133
133
|
const visibleConsoleLogs = useMemo(() => {
|
|
@@ -155,7 +155,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
155
155
|
return filtered.slice(0, maxConsoleLogs);
|
|
156
156
|
}, [consoleLogs, showConsoleLevels, maxConsoleLogs]);
|
|
157
157
|
const [logSearch, setLogSearch] = useState('');
|
|
158
|
-
const [logFilters, setLogFilters] = useState(new Set(['
|
|
158
|
+
const [logFilters, setLogFilters] = useState(new Set(['all']));
|
|
159
159
|
const [settingsPage, setSettingsPage] = useState(null);
|
|
160
160
|
const [settingsActiveSubTab, setSettingsActiveSubTab] = useState('module');
|
|
161
161
|
const [tabVisibility, setTabVisibility] = useState({
|
|
@@ -170,8 +170,8 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
170
170
|
storage: false,
|
|
171
171
|
debugging: false,
|
|
172
172
|
});
|
|
173
|
-
const [maxNetworkLogs, setMaxNetworkLogs] = useState(
|
|
174
|
-
const [maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit] = useState(
|
|
173
|
+
const [maxNetworkLogs, setMaxNetworkLogs] = useState(250);
|
|
174
|
+
const [maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit] = useState(150);
|
|
175
175
|
const [isAutoRamLimitEnabled, setIsAutoRamLimitEnabled] = useState(true);
|
|
176
176
|
const [deviceFreeRamMb, setDeviceFreeRamMb] = useState(1800);
|
|
177
177
|
const [reduxAutoRefresh, setReduxAutoRefreshState] = useState(true);
|
|
@@ -1366,27 +1366,18 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
1366
1366
|
log.caller || '',
|
|
1367
1367
|
log.type || '',
|
|
1368
1368
|
log.sourceMethod || '',
|
|
1369
|
+
log.stack || '',
|
|
1369
1370
|
].join(' ').toLowerCase();
|
|
1370
1371
|
return queryTokens.every(token => {
|
|
1371
|
-
if (token.startsWith('level:') || token.startsWith('is:') || token.startsWith('type:')) {
|
|
1372
|
-
const flag = token.replace(/^(level:|is:|type:)/, '').trim();
|
|
1373
|
-
if (flag === 'error' || flag === 'err')
|
|
1374
|
-
return log.type === 'error';
|
|
1375
|
-
if (flag === 'warn' || flag === 'warning')
|
|
1376
|
-
return log.type === 'warn';
|
|
1377
|
-
if (flag === 'info')
|
|
1378
|
-
return log.type === 'info';
|
|
1379
|
-
if (flag === 'log')
|
|
1380
|
-
return log.sourceMethod === 'log';
|
|
1381
|
-
if (flag === 'analytics')
|
|
1382
|
-
return (log.message || '').toLowerCase().includes('[analytics');
|
|
1383
|
-
}
|
|
1384
1372
|
if (token === 'error' || token === 'err') {
|
|
1385
1373
|
return log.type === 'error' || searchTarget.includes(token);
|
|
1386
1374
|
}
|
|
1387
1375
|
if (token === 'warn' || token === 'warning') {
|
|
1388
1376
|
return log.type === 'warn' || searchTarget.includes(token);
|
|
1389
1377
|
}
|
|
1378
|
+
if (token === 'info') {
|
|
1379
|
+
return log.type === 'info' || searchTarget.includes(token);
|
|
1380
|
+
}
|
|
1390
1381
|
return searchTarget.includes(token);
|
|
1391
1382
|
});
|
|
1392
1383
|
});
|
|
@@ -1431,8 +1422,20 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
1431
1422
|
log.caller || '',
|
|
1432
1423
|
log.type || '',
|
|
1433
1424
|
log.sourceMethod || '',
|
|
1425
|
+
log.stack || '',
|
|
1434
1426
|
].join(' ').toLowerCase();
|
|
1435
|
-
return queryTokens.every(token =>
|
|
1427
|
+
return queryTokens.every(token => {
|
|
1428
|
+
if (token === 'error' || token === 'err') {
|
|
1429
|
+
return log.type === 'error' || searchTarget.includes(token);
|
|
1430
|
+
}
|
|
1431
|
+
if (token === 'warn' || token === 'warning') {
|
|
1432
|
+
return log.type === 'warn' || searchTarget.includes(token);
|
|
1433
|
+
}
|
|
1434
|
+
if (token === 'info') {
|
|
1435
|
+
return log.type === 'info' || searchTarget.includes(token);
|
|
1436
|
+
}
|
|
1437
|
+
return searchTarget.includes(token);
|
|
1438
|
+
});
|
|
1436
1439
|
});
|
|
1437
1440
|
}
|
|
1438
1441
|
const total = visibleConsoleLogs.length;
|
|
@@ -1446,14 +1449,15 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
1446
1449
|
};
|
|
1447
1450
|
}, [visibleConsoleLogs, logSearch]);
|
|
1448
1451
|
function closeModal() {
|
|
1449
|
-
animateNextLayout();
|
|
1450
1452
|
setVisible(false);
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1453
|
+
setTimeout(() => {
|
|
1454
|
+
setSelected(null);
|
|
1455
|
+
setSelectedEvent(null);
|
|
1456
|
+
setSelectedLog(null);
|
|
1457
|
+
setSelectedReduxSlice(null);
|
|
1458
|
+
setSelectedReduxAction(null);
|
|
1459
|
+
setSelectedCrash(null);
|
|
1460
|
+
}, 300);
|
|
1457
1461
|
}
|
|
1458
1462
|
function handleClearAll() {
|
|
1459
1463
|
clearNetworkLogs();
|
|
@@ -1463,13 +1467,17 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
1463
1467
|
setCollapsedSections(new Set());
|
|
1464
1468
|
setStatusFilters(new Set());
|
|
1465
1469
|
setMethodFilters(new Set());
|
|
1470
|
+
setSearch('');
|
|
1466
1471
|
prevLogIdsRef.current = new Set();
|
|
1467
1472
|
logRouteMapRef.current = new Map();
|
|
1468
1473
|
clearAnalyticsEvents();
|
|
1469
1474
|
setAnalyticsEvents([]);
|
|
1475
|
+
setAnalyticsSearch('');
|
|
1470
1476
|
prevEventIdsRef.current = new Set();
|
|
1471
1477
|
clearConsoleLogs();
|
|
1472
1478
|
setConsoleLogs([]);
|
|
1479
|
+
setLogFilters(new Set(['all']));
|
|
1480
|
+
setLogSearch('');
|
|
1473
1481
|
}
|
|
1474
1482
|
function handleDelete() {
|
|
1475
1483
|
if (activeTab === 'logs') {
|
|
@@ -1583,7 +1591,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
1583
1591
|
return next;
|
|
1584
1592
|
});
|
|
1585
1593
|
}, []);
|
|
1586
|
-
const contextValue = {
|
|
1594
|
+
const contextValue = useMemo(() => ({
|
|
1587
1595
|
visible,
|
|
1588
1596
|
setVisible,
|
|
1589
1597
|
closeModal,
|
|
@@ -1750,7 +1758,113 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
|
|
|
1750
1758
|
setReduxAutoRefreshState,
|
|
1751
1759
|
reduxExpandDepth,
|
|
1752
1760
|
setReduxExpandDepth,
|
|
1753
|
-
}
|
|
1761
|
+
}), [
|
|
1762
|
+
visible,
|
|
1763
|
+
closeModal,
|
|
1764
|
+
isReady,
|
|
1765
|
+
enabled,
|
|
1766
|
+
appIcon,
|
|
1767
|
+
environment,
|
|
1768
|
+
modalHeightPercent,
|
|
1769
|
+
modalAnimationType,
|
|
1770
|
+
hasNavigationContext,
|
|
1771
|
+
setNavState,
|
|
1772
|
+
activeTab,
|
|
1773
|
+
switchActiveTab,
|
|
1774
|
+
tabVisibility,
|
|
1775
|
+
toggleTabVisibility,
|
|
1776
|
+
lastReadApisCount,
|
|
1777
|
+
lastReadLogsCount,
|
|
1778
|
+
selected,
|
|
1779
|
+
selectedEvent,
|
|
1780
|
+
selectedLog,
|
|
1781
|
+
showHeaderInfo,
|
|
1782
|
+
settingsPage,
|
|
1783
|
+
updateAvailable,
|
|
1784
|
+
latestNpmVersion,
|
|
1785
|
+
clearAnim,
|
|
1786
|
+
activePulseAnim,
|
|
1787
|
+
unreadPulseAnim,
|
|
1788
|
+
runClearAllWithAnimation,
|
|
1789
|
+
useNativeFab,
|
|
1790
|
+
fabPan,
|
|
1791
|
+
fabPanResponder,
|
|
1792
|
+
pulseAnim,
|
|
1793
|
+
fabShineAnim,
|
|
1794
|
+
logs,
|
|
1795
|
+
filteredLogs,
|
|
1796
|
+
groupedData,
|
|
1797
|
+
search,
|
|
1798
|
+
searchScope,
|
|
1799
|
+
isRegexSearch,
|
|
1800
|
+
isCaseSensitive,
|
|
1801
|
+
quickFilter,
|
|
1802
|
+
statusFilters,
|
|
1803
|
+
methodFilters,
|
|
1804
|
+
availableMethods,
|
|
1805
|
+
sortOrder,
|
|
1806
|
+
selectedLogs,
|
|
1807
|
+
toggleSelect,
|
|
1808
|
+
minStart,
|
|
1809
|
+
totalRange,
|
|
1810
|
+
newLogIds,
|
|
1811
|
+
toggleSectionFilter,
|
|
1812
|
+
toggleSectionCollapse,
|
|
1813
|
+
handleDelete,
|
|
1814
|
+
isNetworkPaused,
|
|
1815
|
+
detailTitle,
|
|
1816
|
+
detailDisplayUrl,
|
|
1817
|
+
apiDetailActiveTab,
|
|
1818
|
+
detailSearch,
|
|
1819
|
+
reqExpanded,
|
|
1820
|
+
resExpanded,
|
|
1821
|
+
showReqDiff,
|
|
1822
|
+
showResDiff,
|
|
1823
|
+
prevRequestData,
|
|
1824
|
+
prevResponseData,
|
|
1825
|
+
consoleLogs,
|
|
1826
|
+
visibleConsoleLogs,
|
|
1827
|
+
filteredConsoleLogs,
|
|
1828
|
+
logSearch,
|
|
1829
|
+
logFilters,
|
|
1830
|
+
logCounts,
|
|
1831
|
+
logSortOrder,
|
|
1832
|
+
isConsolePaused,
|
|
1833
|
+
analyticsEvents,
|
|
1834
|
+
filteredAnalyticsEvents,
|
|
1835
|
+
analyticsSearch,
|
|
1836
|
+
analyticsFilters,
|
|
1837
|
+
isAnalyticsFilterApplied,
|
|
1838
|
+
resetAnalyticsFilters,
|
|
1839
|
+
newEventIds,
|
|
1840
|
+
isAnalyticsLayoutReady,
|
|
1841
|
+
analyticsHeaderExpanded,
|
|
1842
|
+
isAnalyticsPaused,
|
|
1843
|
+
reduxState,
|
|
1844
|
+
reduxLastActionMap,
|
|
1845
|
+
reduxSearch,
|
|
1846
|
+
selectedReduxSlice,
|
|
1847
|
+
selectedReduxAction,
|
|
1848
|
+
reduxActiveSubTab,
|
|
1849
|
+
crashRecords,
|
|
1850
|
+
selectedCrash,
|
|
1851
|
+
lastReadCrashesCount,
|
|
1852
|
+
maxCrashLogs,
|
|
1853
|
+
settingsActiveSubTab,
|
|
1854
|
+
defaultTab,
|
|
1855
|
+
isDark,
|
|
1856
|
+
showDuplicateLogs,
|
|
1857
|
+
showUpdateToast,
|
|
1858
|
+
showConsoleLevels,
|
|
1859
|
+
storage,
|
|
1860
|
+
maxNetworkLogs,
|
|
1861
|
+
maxConsoleLogs,
|
|
1862
|
+
maxAnalyticsEventsLimit,
|
|
1863
|
+
isAutoRamLimitEnabled,
|
|
1864
|
+
deviceFreeRamMb,
|
|
1865
|
+
reduxAutoRefresh,
|
|
1866
|
+
reduxExpandDepth,
|
|
1867
|
+
]);
|
|
1754
1868
|
return (<InspectorContext.Provider value={contextValue}>
|
|
1755
1869
|
<MainScreen />
|
|
1756
1870
|
</InspectorContext.Provider>);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-inapp-inspector",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.15",
|
|
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",
|
|
@@ -23,16 +23,16 @@ const AnimatedEntrance = React.memo(function AnimatedEntrance({
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const progress = useRef(new Animated.Value(0)).current;
|
|
26
|
+
const initialIndex = useRef(index).current;
|
|
26
27
|
|
|
27
28
|
useEffect(() => {
|
|
28
|
-
progress.setValue(0);
|
|
29
29
|
Animated.timing(progress, {
|
|
30
30
|
toValue: 1,
|
|
31
31
|
duration,
|
|
32
|
-
delay: delay + Math.min(
|
|
32
|
+
delay: delay + Math.min(initialIndex, 8) * 12,
|
|
33
33
|
useNativeDriver: true,
|
|
34
34
|
}).start();
|
|
35
|
-
}, [
|
|
35
|
+
}, []);
|
|
36
36
|
|
|
37
37
|
return (
|
|
38
38
|
<Animated.View
|