@buoy-gg/network 2.1.15 → 3.0.1

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.
@@ -161,13 +161,13 @@ const NetworkEventItemCompact = exports.NetworkEventItemCompact = /*#__PURE__*/(
161
161
  statusColor: statusColor
162
162
  }), event.requestClient && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
163
163
  style: [styles.topRightBadge, {
164
- backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : "rgba(147, 51, 234, 0.15)"
164
+ backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : event.requestClient === "xhr" ? "rgba(245, 158, 11, 0.15)" : "rgba(147, 51, 234, 0.15)"
165
165
  }],
166
166
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
167
167
  style: [styles.clientText, {
168
- color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : "#9333EA"
168
+ color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : event.requestClient === "xhr" ? "#F59E0B" : "#9333EA"
169
169
  }],
170
- children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient
170
+ children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient === "xhr" ? "XHR" : event.requestClient
171
171
  })
172
172
  })]
173
173
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.NetworkFilterViewV3 = NetworkFilterViewV3;
7
7
  var _sharedUi = require("@buoy-gg/shared-ui");
8
8
  var _react = require("react");
9
+ var _reactNative = require("react-native");
9
10
  var _jsxRuntime = require("react/jsx-runtime");
10
11
  function getContentType(event) {
11
12
  const headers = event.responseHeaders || event.requestHeaders;
@@ -90,10 +91,91 @@ function NetworkFilterViewV3({
90
91
  events,
91
92
  filter,
92
93
  onFilterChange,
93
- ignoredPatterns = new Set(),
94
- onTogglePattern = () => {},
95
- onAddPattern = () => {}
94
+ ignoredPatterns = [],
95
+ onRemovePattern = () => {},
96
+ onAddPattern = () => {},
97
+ onTogglePatternMode = () => {}
96
98
  }) {
99
+ // Mode applied when the user submits the "Add pattern" input. Defaults to
100
+ // `contains` so behavior matches the previous implementation until the user
101
+ // opts into `exact`.
102
+ const [nextPatternMode, setNextPatternMode] = (0, _react.useState)("contains");
103
+ const patternModes = (0, _react.useMemo)(() => {
104
+ const map = new Map();
105
+ for (const p of ignoredPatterns) map.set(p.value, p.mode);
106
+ return map;
107
+ }, [ignoredPatterns]);
108
+ const activePatternsSet = (0, _react.useMemo)(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
109
+ const handlePatternAdd = (0, _react.useCallback)(pattern => {
110
+ onAddPattern({
111
+ value: pattern,
112
+ mode: nextPatternMode
113
+ });
114
+ }, [onAddPattern, nextPatternMode]);
115
+ const renderPatternMeta = (0, _react.useCallback)(pattern => {
116
+ const mode = patternModes.get(pattern) ?? "contains";
117
+ const isExact = mode === "exact";
118
+ const color = isExact ? _sharedUi.macOSColors.semantic.warning : _sharedUi.macOSColors.semantic.info;
119
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
120
+ accessibilityRole: "button",
121
+ accessibilityLabel: `Match mode: ${mode}. Tap to toggle.`,
122
+ onPress: () => onTogglePatternMode(pattern),
123
+ style: [styles.modeBadge, {
124
+ borderColor: `${color}60`,
125
+ backgroundColor: `${color}15`
126
+ }],
127
+ hitSlop: {
128
+ top: 6,
129
+ bottom: 6,
130
+ left: 6,
131
+ right: 6
132
+ },
133
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
134
+ style: [styles.modeBadgeText, {
135
+ color
136
+ }],
137
+ children: isExact ? "EXACT" : "CONTAINS"
138
+ })
139
+ });
140
+ }, [patternModes, onTogglePatternMode]);
141
+ const renderAddFilterExtra = (0, _react.useCallback)(() => {
142
+ const options = [{
143
+ label: "Contains",
144
+ value: "contains",
145
+ hint: "substring"
146
+ }, {
147
+ label: "Exact",
148
+ value: "exact",
149
+ hint: "whole path/host/url"
150
+ }];
151
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
152
+ style: styles.modeToggleRow,
153
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
154
+ style: styles.modeToggleLabel,
155
+ children: "Match:"
156
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
157
+ style: styles.modeToggleGroup,
158
+ children: options.map(opt => {
159
+ const isActive = nextPatternMode === opt.value;
160
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
161
+ onPress: () => setNextPatternMode(opt.value),
162
+ style: [styles.modeToggleButton, isActive && styles.modeToggleButtonActive],
163
+ accessibilityRole: "button",
164
+ accessibilityState: {
165
+ selected: isActive
166
+ },
167
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
168
+ style: [styles.modeToggleButtonText, isActive && styles.modeToggleButtonTextActive],
169
+ children: opt.label
170
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
171
+ style: styles.modeToggleButtonHint,
172
+ children: opt.hint
173
+ })]
174
+ }, opt.value);
175
+ })
176
+ })]
177
+ });
178
+ }, [nextPatternMode]);
97
179
  const statusCounts = (0, _react.useMemo)(() => {
98
180
  const counts = {
99
181
  all: events.length,
@@ -271,7 +353,8 @@ function NetworkFilterViewV3({
271
353
  enabled: true,
272
354
  placeholder: "Enter domain or URL pattern...",
273
355
  title: "ACTIVE FILTERS",
274
- icon: _sharedUi.Filter
356
+ icon: _sharedUi.Filter,
357
+ renderExtra: renderAddFilterExtra
275
358
  },
276
359
  availableItemsSection: {
277
360
  enabled: true,
@@ -282,16 +365,78 @@ function NetworkFilterViewV3({
282
365
  howItWorksSection: {
283
366
  enabled: true,
284
367
  title: "HOW NETWORK FILTERS WORK",
285
- description: "Patterns hide matching requests from the network event list. Filters match if the domain or URL contains the provided text.",
286
- examples: ["• example.com → filters any request whose host includes example.com", "• https://api.example.com/v1/usersfilters that exact endpoint", "• /healthfilters any URL path containing /health"],
368
+ description: "Patterns hide matching requests from the network event list. Each pattern has a match mode you can toggle on its badge: CONTAINS hides any URL containing the text; EXACT hides only an exact path/host/url match.",
369
+ examples: ["• example.com (CONTAINS) → any request whose URL contains example.com", "• example.com (EXACT) only requests served by that exact host", "• /v1 (CONTAINS) → any URL containing /v1 (e.g. /v1, /v1/users)", "• /v1 (EXACT) → only requests whose pathname is exactly /v1"],
287
370
  icon: _sharedUi.Filter
288
371
  },
289
372
  onFilterChange: handleDynamicFilterChange,
290
- onPatternAdd: onAddPattern,
291
- onPatternToggle: onTogglePattern,
292
- activePatterns: ignoredPatterns
293
- }), [filterSections, handleDynamicFilterChange, ignoredPatterns, onAddPattern, onTogglePattern, suggestionItems]);
373
+ onPatternAdd: handlePatternAdd,
374
+ onPatternToggle: onRemovePattern,
375
+ activePatterns: activePatternsSet,
376
+ renderPatternMeta
377
+ }), [activePatternsSet, filterSections, handleDynamicFilterChange, handlePatternAdd, onRemovePattern, renderAddFilterExtra, renderPatternMeta, suggestionItems]);
294
378
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.DynamicFilterView, {
295
379
  ...dynamicFilterConfig
296
380
  });
297
- }
381
+ }
382
+ const styles = _reactNative.StyleSheet.create({
383
+ modeBadge: {
384
+ paddingHorizontal: 8,
385
+ paddingVertical: 3,
386
+ borderRadius: 6,
387
+ borderWidth: 1
388
+ },
389
+ modeBadgeText: {
390
+ fontSize: 9,
391
+ fontFamily: "monospace",
392
+ fontWeight: "700",
393
+ letterSpacing: 0.5
394
+ },
395
+ modeToggleRow: {
396
+ flexDirection: "row",
397
+ alignItems: "center",
398
+ gap: 8,
399
+ marginBottom: 8
400
+ },
401
+ modeToggleLabel: {
402
+ fontSize: 11,
403
+ fontWeight: "600",
404
+ color: _sharedUi.macOSColors.text.secondary,
405
+ fontFamily: "monospace",
406
+ letterSpacing: 0.3
407
+ },
408
+ modeToggleGroup: {
409
+ flexDirection: "row",
410
+ gap: 6,
411
+ flex: 1
412
+ },
413
+ modeToggleButton: {
414
+ flex: 1,
415
+ paddingVertical: 6,
416
+ paddingHorizontal: 10,
417
+ borderRadius: 8,
418
+ borderWidth: 1,
419
+ borderColor: _sharedUi.macOSColors.border.default,
420
+ backgroundColor: _sharedUi.macOSColors.background.hover,
421
+ alignItems: "center"
422
+ },
423
+ modeToggleButtonActive: {
424
+ borderColor: _sharedUi.macOSColors.semantic.info,
425
+ backgroundColor: `${_sharedUi.macOSColors.semantic.info}22`
426
+ },
427
+ modeToggleButtonText: {
428
+ fontSize: 11,
429
+ fontWeight: "700",
430
+ color: _sharedUi.macOSColors.text.secondary,
431
+ fontFamily: "monospace",
432
+ letterSpacing: 0.3
433
+ },
434
+ modeToggleButtonTextActive: {
435
+ color: _sharedUi.macOSColors.semantic.info
436
+ },
437
+ modeToggleButtonHint: {
438
+ fontSize: 9,
439
+ color: _sharedUi.macOSColors.text.muted,
440
+ marginTop: 1
441
+ }
442
+ });
@@ -15,6 +15,33 @@ var _NetworkCopySettingsView = require("./NetworkCopySettingsView");
15
15
  var _useNetworkEvents = require("../hooks/useNetworkEvents");
16
16
  var _formatting = require("../utils/formatting");
17
17
  var _jsxRuntime = require("react/jsx-runtime");
18
+ /**
19
+ * Returns true when `url` matches the ignored `pattern` according to its mode.
20
+ *
21
+ * `contains` → case-insensitive substring on the full URL (legacy behavior).
22
+ * `exact` → smart equality: pattern starting with `/` compares URL.pathname,
23
+ * full URLs compare origin+pathname (ignoring query/hash), bare
24
+ * values compare URL.host. Falls back to literal equality if URL
25
+ * parsing fails (e.g. relative URLs).
26
+ */function urlMatchesIgnoredPattern(url, pattern) {
27
+ const lowerUrl = url.toLowerCase();
28
+ const lowerValue = pattern.value.toLowerCase();
29
+ if (pattern.mode === "contains") {
30
+ return lowerUrl.includes(lowerValue);
31
+ }
32
+ try {
33
+ const parsed = new URL(url);
34
+ if (lowerValue.startsWith("/")) {
35
+ return parsed.pathname.toLowerCase() === lowerValue;
36
+ }
37
+ if (lowerValue.startsWith("http://") || lowerValue.startsWith("https://")) {
38
+ return `${parsed.origin}${parsed.pathname}`.toLowerCase() === lowerValue;
39
+ }
40
+ return parsed.host.toLowerCase() === lowerValue;
41
+ } catch {
42
+ return lowerUrl === lowerValue;
43
+ }
44
+ }
18
45
  // Decompose by Responsibility: Extract empty state component
19
46
  function EmptyState({
20
47
  isEnabled
@@ -77,8 +104,12 @@ function NetworkModalInner({
77
104
  const [searchText, setSearchText] = (0, _react.useState)("");
78
105
  const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
79
106
  const searchInputRef = (0, _react.useRef)(null);
80
- const [ignoredPatterns, setIgnoredPatterns] = (0, _react.useState)(new Set(["api.keygen.sh"]) // Auto-hide Buoy license API requests by default
81
- );
107
+ const [ignoredPatterns, setIgnoredPatterns] = (0, _react.useState)([
108
+ // Auto-hide Buoy license API requests by default
109
+ {
110
+ value: "api.keygen.sh",
111
+ mode: "contains"
112
+ }]);
82
113
  const [copySettings, setCopySettings] = (0, _react.useState)(_NetworkCopySettingsView.DEFAULT_COPY_SETTINGS);
83
114
  const flatListRef = (0, _react.useRef)(null);
84
115
  const hasLoadedFilters = (0, _react.useRef)(false);
@@ -97,15 +128,33 @@ function NetworkModalInner({
97
128
  if (!visible || hasLoadedFilters.current) return;
98
129
  const loadFilters = async () => {
99
130
  try {
100
- // Load ignored patterns (using domains key for now)
101
131
  const storedPatterns = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains());
102
132
  if (storedPatterns) {
103
- const patterns = JSON.parse(storedPatterns);
133
+ // Tolerate legacy string[] format — entries without a mode default to "contains".
134
+ const raw = JSON.parse(storedPatterns);
135
+ const migrated = [];
136
+ for (const entry of raw) {
137
+ if (typeof entry === "string" && entry.trim()) {
138
+ migrated.push({
139
+ value: entry,
140
+ mode: "contains"
141
+ });
142
+ } else if (entry && typeof entry === "object" && typeof entry.value === "string") {
143
+ const e = entry;
144
+ migrated.push({
145
+ value: e.value,
146
+ mode: e.mode === "exact" ? "exact" : "contains"
147
+ });
148
+ }
149
+ }
104
150
  // Always ensure Buoy license API is hidden
105
- if (!patterns.includes("api.keygen.sh")) {
106
- patterns.push("api.keygen.sh");
151
+ if (!migrated.some(p => p.value === "api.keygen.sh")) {
152
+ migrated.push({
153
+ value: "api.keygen.sh",
154
+ mode: "contains"
155
+ });
107
156
  }
108
- setIgnoredPatterns(new Set(patterns));
157
+ setIgnoredPatterns(migrated);
109
158
  }
110
159
  } catch (_error) {
111
160
  // Silently fail - filters will use defaults
@@ -122,9 +171,7 @@ function NetworkModalInner({
122
171
 
123
172
  const saveFilters = async () => {
124
173
  try {
125
- // Save ignored patterns
126
- const patterns = Array.from(ignoredPatterns);
127
- await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(patterns));
174
+ await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(ignoredPatterns));
128
175
  } catch (_error) {
129
176
  // Silently fail - filters will remain in memory
130
177
  }
@@ -187,18 +234,49 @@ function NetworkModalInner({
187
234
  }
188
235
  }, [isSearchActive]);
189
236
 
190
- // Filter events based on ignored patterns
237
+ // Derived set of pattern values (for components that only care about presence).
238
+ const ignoredPatternValues = (0, _react.useMemo)(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
239
+
240
+ // Filter events based on ignored patterns (mode-aware)
191
241
  const filteredEvents = (0, _react.useMemo)(() => {
192
- if (ignoredPatterns.size === 0) return events;
242
+ if (ignoredPatterns.length === 0) return events;
193
243
  return events.filter(event => {
194
- const url = event.url.toLowerCase();
195
-
196
- // Check if any pattern matches the URL
197
- const isFiltered = Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
244
+ const isFiltered = ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern));
198
245
  return !isFiltered;
199
246
  });
200
247
  }, [events, ignoredPatterns]);
201
248
 
249
+ // Add or no-op (used by add-pattern UI and suggested-items taps)
250
+ const addIgnoredPattern = (0, _react.useCallback)(pattern => {
251
+ const value = pattern.value.trim();
252
+ if (!value) return;
253
+ setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev : [...prev, {
254
+ value,
255
+ mode: pattern.mode
256
+ }]);
257
+ }, []);
258
+
259
+ // Remove by value (used by the filter list X button and the detail view chips)
260
+ const removeIgnoredPattern = (0, _react.useCallback)(value => {
261
+ setIgnoredPatterns(prev => prev.filter(p => p.value !== value));
262
+ }, []);
263
+
264
+ // Toggle presence (used by the detail-view domain/url chips — adds as contains)
265
+ const toggleIgnoredPattern = (0, _react.useCallback)(value => {
266
+ setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev.filter(p => p.value !== value) : [...prev, {
267
+ value,
268
+ mode: "contains"
269
+ }]);
270
+ }, []);
271
+
272
+ // Flip an existing pattern's mode between contains <-> exact
273
+ const toggleIgnoredPatternMode = (0, _react.useCallback)(value => {
274
+ setIgnoredPatterns(prev => prev.map(p => p.value === value ? {
275
+ ...p,
276
+ mode: p.mode === "contains" ? "exact" : "contains"
277
+ } : p));
278
+ }, []);
279
+
202
280
  // Helper to check if payload should be included based on size
203
281
  const shouldIncludePayload = (0, _react.useCallback)(data => {
204
282
  if (copySettings.bodySizeThreshold === -1) return true;
@@ -339,10 +417,7 @@ function NetworkModalInner({
339
417
  let successful = 0;
340
418
  let failed = 0;
341
419
  let pending = 0;
342
- const eventsForStats = ignoredPatterns.size === 0 ? allEvents : allEvents.filter(event => {
343
- const url = event.url.toLowerCase();
344
- return !Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
345
- });
420
+ const eventsForStats = ignoredPatterns.length === 0 ? allEvents : allEvents.filter(event => !ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern)));
346
421
  for (const event of eventsForStats) {
347
422
  if (event.status && event.status >= 200 && event.status < 300) {
348
423
  successful++;
@@ -611,16 +686,8 @@ function NetworkModalInner({
611
686
  /* Show detail view if event is selected */
612
687
  (0, _jsxRuntime.jsx)(_NetworkEventDetailView.NetworkEventDetailView, {
613
688
  event: selectedEvent,
614
- ignoredPatterns: ignoredPatterns,
615
- onTogglePattern: pattern => {
616
- const newPatterns = new Set(ignoredPatterns);
617
- if (newPatterns.has(pattern)) {
618
- newPatterns.delete(pattern);
619
- } else {
620
- newPatterns.add(pattern);
621
- }
622
- setIgnoredPatterns(newPatterns);
623
- }
689
+ ignoredPatterns: ignoredPatternValues,
690
+ onTogglePattern: toggleIgnoredPattern
624
691
  }) : showFilterView ? (/* Show filter/copy view based on active tab */
625
692
  activeTab === "copy" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_NetworkCopySettingsView.NetworkCopySettingsView, {
626
693
  settings: copySettings,
@@ -631,20 +698,9 @@ function NetworkModalInner({
631
698
  filter: filter,
632
699
  onFilterChange: setFilter,
633
700
  ignoredPatterns: ignoredPatterns,
634
- onTogglePattern: pattern => {
635
- const newPatterns = new Set(ignoredPatterns);
636
- if (newPatterns.has(pattern)) {
637
- newPatterns.delete(pattern);
638
- } else {
639
- newPatterns.add(pattern);
640
- }
641
- setIgnoredPatterns(newPatterns);
642
- },
643
- onAddPattern: pattern => {
644
- const newPatterns = new Set(ignoredPatterns);
645
- newPatterns.add(pattern);
646
- setIgnoredPatterns(newPatterns);
647
- }
701
+ onRemovePattern: removeIgnoredPattern,
702
+ onAddPattern: addIgnoredPattern,
703
+ onTogglePatternMode: toggleIgnoredPatternMode
648
704
  })) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
649
705
  children: [!isEnabled ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
650
706
  style: styles.disabledBanner,
@@ -203,7 +203,7 @@ class NetworkListener {
203
203
  * Handle XMLHttpRequest response processing
204
204
  * This method processes the response and emits appropriate events
205
205
  */
206
- handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "axios") {
206
+ handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "xhr") {
207
207
  const duration = startTime ? Date.now() - startTime : 0;
208
208
  if (isError || xhr.status === 0) {
209
209
  // Network error or aborted request
@@ -590,8 +590,13 @@ class NetworkListener {
590
590
  }
591
591
  }
592
592
 
593
- // Determine client type from X-Request-Client header
594
- const clientType = requestHeaders["X-Request-Client"] || requestHeaders["x-request-client"] || "axios";
593
+ // Determine client type. Honor an explicit X-Request-Client header first.
594
+ // Otherwise sniff axios via its default Accept header and fall back to
595
+ // "xhr" — defaulting to "axios" misclassified every raw XMLHttpRequest.
596
+ const explicitClient = requestHeaders["X-Request-Client"] || requestHeaders["x-request-client"];
597
+ const acceptHeader = requestHeaders["Accept"] || requestHeaders["accept"] || "";
598
+ const looksLikeAxios = acceptHeader.includes("application/json") && acceptHeader.includes("text/plain") && acceptHeader.includes("*/*");
599
+ const clientType = explicitClient || (looksLikeAxios ? "axios" : "xhr");
595
600
 
596
601
  // Emit request event
597
602
  self.emit({
@@ -158,13 +158,13 @@ export const NetworkEventItemCompact = /*#__PURE__*/memo(({
158
158
  statusColor: statusColor
159
159
  }), event.requestClient && /*#__PURE__*/_jsx(View, {
160
160
  style: [styles.topRightBadge, {
161
- backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : "rgba(147, 51, 234, 0.15)"
161
+ backgroundColor: event.requestClient === "fetch" ? "rgba(74, 144, 226, 0.15)" : event.requestClient === "graphql" ? "rgba(229, 53, 171, 0.15)" : event.requestClient === "grpc-web" ? "rgba(16, 185, 129, 0.15)" : event.requestClient === "xhr" ? "rgba(245, 158, 11, 0.15)" : "rgba(147, 51, 234, 0.15)"
162
162
  }],
163
163
  children: /*#__PURE__*/_jsx(Text, {
164
164
  style: [styles.clientText, {
165
- color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : "#9333EA"
165
+ color: event.requestClient === "fetch" ? "#4A90E2" : event.requestClient === "graphql" ? "#E535AB" : event.requestClient === "grpc-web" ? "#10B981" : event.requestClient === "xhr" ? "#F59E0B" : "#9333EA"
166
166
  }],
167
- children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient
167
+ children: event.requestClient === "graphql" ? "GQL" : event.requestClient === "grpc-web" ? "gRPC" : event.requestClient === "xhr" ? "XHR" : event.requestClient
168
168
  })
169
169
  })]
170
170
  }), /*#__PURE__*/_jsxs(View, {
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  import { CheckCircle, Clock, DynamicFilterView, Film, FileJson, FileText, Filter, Globe, Image, macOSColors, Music, XCircle } from "@buoy-gg/shared-ui";
4
- import { useCallback, useMemo } from "react";
5
- import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { useCallback, useMemo, useState } from "react";
5
+ import { StyleSheet, Text, TouchableOpacity, View } from "react-native";
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
7
  function getContentType(event) {
7
8
  const headers = event.responseHeaders || event.requestHeaders;
8
9
  const contentType = headers?.["content-type"] || headers?.["Content-Type"] || "";
@@ -86,10 +87,91 @@ export function NetworkFilterViewV3({
86
87
  events,
87
88
  filter,
88
89
  onFilterChange,
89
- ignoredPatterns = new Set(),
90
- onTogglePattern = () => {},
91
- onAddPattern = () => {}
90
+ ignoredPatterns = [],
91
+ onRemovePattern = () => {},
92
+ onAddPattern = () => {},
93
+ onTogglePatternMode = () => {}
92
94
  }) {
95
+ // Mode applied when the user submits the "Add pattern" input. Defaults to
96
+ // `contains` so behavior matches the previous implementation until the user
97
+ // opts into `exact`.
98
+ const [nextPatternMode, setNextPatternMode] = useState("contains");
99
+ const patternModes = useMemo(() => {
100
+ const map = new Map();
101
+ for (const p of ignoredPatterns) map.set(p.value, p.mode);
102
+ return map;
103
+ }, [ignoredPatterns]);
104
+ const activePatternsSet = useMemo(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
105
+ const handlePatternAdd = useCallback(pattern => {
106
+ onAddPattern({
107
+ value: pattern,
108
+ mode: nextPatternMode
109
+ });
110
+ }, [onAddPattern, nextPatternMode]);
111
+ const renderPatternMeta = useCallback(pattern => {
112
+ const mode = patternModes.get(pattern) ?? "contains";
113
+ const isExact = mode === "exact";
114
+ const color = isExact ? macOSColors.semantic.warning : macOSColors.semantic.info;
115
+ return /*#__PURE__*/_jsx(TouchableOpacity, {
116
+ accessibilityRole: "button",
117
+ accessibilityLabel: `Match mode: ${mode}. Tap to toggle.`,
118
+ onPress: () => onTogglePatternMode(pattern),
119
+ style: [styles.modeBadge, {
120
+ borderColor: `${color}60`,
121
+ backgroundColor: `${color}15`
122
+ }],
123
+ hitSlop: {
124
+ top: 6,
125
+ bottom: 6,
126
+ left: 6,
127
+ right: 6
128
+ },
129
+ children: /*#__PURE__*/_jsx(Text, {
130
+ style: [styles.modeBadgeText, {
131
+ color
132
+ }],
133
+ children: isExact ? "EXACT" : "CONTAINS"
134
+ })
135
+ });
136
+ }, [patternModes, onTogglePatternMode]);
137
+ const renderAddFilterExtra = useCallback(() => {
138
+ const options = [{
139
+ label: "Contains",
140
+ value: "contains",
141
+ hint: "substring"
142
+ }, {
143
+ label: "Exact",
144
+ value: "exact",
145
+ hint: "whole path/host/url"
146
+ }];
147
+ return /*#__PURE__*/_jsxs(View, {
148
+ style: styles.modeToggleRow,
149
+ children: [/*#__PURE__*/_jsx(Text, {
150
+ style: styles.modeToggleLabel,
151
+ children: "Match:"
152
+ }), /*#__PURE__*/_jsx(View, {
153
+ style: styles.modeToggleGroup,
154
+ children: options.map(opt => {
155
+ const isActive = nextPatternMode === opt.value;
156
+ return /*#__PURE__*/_jsxs(TouchableOpacity, {
157
+ onPress: () => setNextPatternMode(opt.value),
158
+ style: [styles.modeToggleButton, isActive && styles.modeToggleButtonActive],
159
+ accessibilityRole: "button",
160
+ accessibilityState: {
161
+ selected: isActive
162
+ },
163
+ children: [/*#__PURE__*/_jsx(Text, {
164
+ style: [styles.modeToggleButtonText, isActive && styles.modeToggleButtonTextActive],
165
+ children: opt.label
166
+ }), /*#__PURE__*/_jsx(Text, {
167
+ style: styles.modeToggleButtonHint,
168
+ children: opt.hint
169
+ })]
170
+ }, opt.value);
171
+ })
172
+ })]
173
+ });
174
+ }, [nextPatternMode]);
93
175
  const statusCounts = useMemo(() => {
94
176
  const counts = {
95
177
  all: events.length,
@@ -267,7 +349,8 @@ export function NetworkFilterViewV3({
267
349
  enabled: true,
268
350
  placeholder: "Enter domain or URL pattern...",
269
351
  title: "ACTIVE FILTERS",
270
- icon: Filter
352
+ icon: Filter,
353
+ renderExtra: renderAddFilterExtra
271
354
  },
272
355
  availableItemsSection: {
273
356
  enabled: true,
@@ -278,16 +361,78 @@ export function NetworkFilterViewV3({
278
361
  howItWorksSection: {
279
362
  enabled: true,
280
363
  title: "HOW NETWORK FILTERS WORK",
281
- description: "Patterns hide matching requests from the network event list. Filters match if the domain or URL contains the provided text.",
282
- examples: ["• example.com → filters any request whose host includes example.com", "• https://api.example.com/v1/usersfilters that exact endpoint", "• /healthfilters any URL path containing /health"],
364
+ description: "Patterns hide matching requests from the network event list. Each pattern has a match mode you can toggle on its badge: CONTAINS hides any URL containing the text; EXACT hides only an exact path/host/url match.",
365
+ examples: ["• example.com (CONTAINS) → any request whose URL contains example.com", "• example.com (EXACT) only requests served by that exact host", "• /v1 (CONTAINS) → any URL containing /v1 (e.g. /v1, /v1/users)", "• /v1 (EXACT) → only requests whose pathname is exactly /v1"],
283
366
  icon: Filter
284
367
  },
285
368
  onFilterChange: handleDynamicFilterChange,
286
- onPatternAdd: onAddPattern,
287
- onPatternToggle: onTogglePattern,
288
- activePatterns: ignoredPatterns
289
- }), [filterSections, handleDynamicFilterChange, ignoredPatterns, onAddPattern, onTogglePattern, suggestionItems]);
369
+ onPatternAdd: handlePatternAdd,
370
+ onPatternToggle: onRemovePattern,
371
+ activePatterns: activePatternsSet,
372
+ renderPatternMeta
373
+ }), [activePatternsSet, filterSections, handleDynamicFilterChange, handlePatternAdd, onRemovePattern, renderAddFilterExtra, renderPatternMeta, suggestionItems]);
290
374
  return /*#__PURE__*/_jsx(DynamicFilterView, {
291
375
  ...dynamicFilterConfig
292
376
  });
293
- }
377
+ }
378
+ const styles = StyleSheet.create({
379
+ modeBadge: {
380
+ paddingHorizontal: 8,
381
+ paddingVertical: 3,
382
+ borderRadius: 6,
383
+ borderWidth: 1
384
+ },
385
+ modeBadgeText: {
386
+ fontSize: 9,
387
+ fontFamily: "monospace",
388
+ fontWeight: "700",
389
+ letterSpacing: 0.5
390
+ },
391
+ modeToggleRow: {
392
+ flexDirection: "row",
393
+ alignItems: "center",
394
+ gap: 8,
395
+ marginBottom: 8
396
+ },
397
+ modeToggleLabel: {
398
+ fontSize: 11,
399
+ fontWeight: "600",
400
+ color: macOSColors.text.secondary,
401
+ fontFamily: "monospace",
402
+ letterSpacing: 0.3
403
+ },
404
+ modeToggleGroup: {
405
+ flexDirection: "row",
406
+ gap: 6,
407
+ flex: 1
408
+ },
409
+ modeToggleButton: {
410
+ flex: 1,
411
+ paddingVertical: 6,
412
+ paddingHorizontal: 10,
413
+ borderRadius: 8,
414
+ borderWidth: 1,
415
+ borderColor: macOSColors.border.default,
416
+ backgroundColor: macOSColors.background.hover,
417
+ alignItems: "center"
418
+ },
419
+ modeToggleButtonActive: {
420
+ borderColor: macOSColors.semantic.info,
421
+ backgroundColor: `${macOSColors.semantic.info}22`
422
+ },
423
+ modeToggleButtonText: {
424
+ fontSize: 11,
425
+ fontWeight: "700",
426
+ color: macOSColors.text.secondary,
427
+ fontFamily: "monospace",
428
+ letterSpacing: 0.3
429
+ },
430
+ modeToggleButtonTextActive: {
431
+ color: macOSColors.semantic.info
432
+ },
433
+ modeToggleButtonHint: {
434
+ fontSize: 9,
435
+ color: macOSColors.text.muted,
436
+ marginTop: 1
437
+ }
438
+ });
@@ -10,7 +10,36 @@ import { NetworkEventDetailView } from "./NetworkEventDetailView";
10
10
  import { NetworkCopySettingsView, DEFAULT_COPY_SETTINGS } from "./NetworkCopySettingsView";
11
11
  import { useNetworkEvents } from "../hooks/useNetworkEvents";
12
12
  import { formatBytes } from "../utils/formatting";
13
+
14
+ /**
15
+ * Returns true when `url` matches the ignored `pattern` according to its mode.
16
+ *
17
+ * `contains` → case-insensitive substring on the full URL (legacy behavior).
18
+ * `exact` → smart equality: pattern starting with `/` compares URL.pathname,
19
+ * full URLs compare origin+pathname (ignoring query/hash), bare
20
+ * values compare URL.host. Falls back to literal equality if URL
21
+ * parsing fails (e.g. relative URLs).
22
+ */
13
23
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
24
+ function urlMatchesIgnoredPattern(url, pattern) {
25
+ const lowerUrl = url.toLowerCase();
26
+ const lowerValue = pattern.value.toLowerCase();
27
+ if (pattern.mode === "contains") {
28
+ return lowerUrl.includes(lowerValue);
29
+ }
30
+ try {
31
+ const parsed = new URL(url);
32
+ if (lowerValue.startsWith("/")) {
33
+ return parsed.pathname.toLowerCase() === lowerValue;
34
+ }
35
+ if (lowerValue.startsWith("http://") || lowerValue.startsWith("https://")) {
36
+ return `${parsed.origin}${parsed.pathname}`.toLowerCase() === lowerValue;
37
+ }
38
+ return parsed.host.toLowerCase() === lowerValue;
39
+ } catch {
40
+ return lowerUrl === lowerValue;
41
+ }
42
+ }
14
43
  // Decompose by Responsibility: Extract empty state component
15
44
  function EmptyState({
16
45
  isEnabled
@@ -73,8 +102,12 @@ function NetworkModalInner({
73
102
  const [searchText, setSearchText] = useState("");
74
103
  const [isSearchActive, setIsSearchActive] = useState(false);
75
104
  const searchInputRef = useRef(null);
76
- const [ignoredPatterns, setIgnoredPatterns] = useState(new Set(["api.keygen.sh"]) // Auto-hide Buoy license API requests by default
77
- );
105
+ const [ignoredPatterns, setIgnoredPatterns] = useState([
106
+ // Auto-hide Buoy license API requests by default
107
+ {
108
+ value: "api.keygen.sh",
109
+ mode: "contains"
110
+ }]);
78
111
  const [copySettings, setCopySettings] = useState(DEFAULT_COPY_SETTINGS);
79
112
  const flatListRef = useRef(null);
80
113
  const hasLoadedFilters = useRef(false);
@@ -93,15 +126,33 @@ function NetworkModalInner({
93
126
  if (!visible || hasLoadedFilters.current) return;
94
127
  const loadFilters = async () => {
95
128
  try {
96
- // Load ignored patterns (using domains key for now)
97
129
  const storedPatterns = await persistentStorage.getItem(devToolsStorageKeys.network.ignoredDomains());
98
130
  if (storedPatterns) {
99
- const patterns = JSON.parse(storedPatterns);
131
+ // Tolerate legacy string[] format — entries without a mode default to "contains".
132
+ const raw = JSON.parse(storedPatterns);
133
+ const migrated = [];
134
+ for (const entry of raw) {
135
+ if (typeof entry === "string" && entry.trim()) {
136
+ migrated.push({
137
+ value: entry,
138
+ mode: "contains"
139
+ });
140
+ } else if (entry && typeof entry === "object" && typeof entry.value === "string") {
141
+ const e = entry;
142
+ migrated.push({
143
+ value: e.value,
144
+ mode: e.mode === "exact" ? "exact" : "contains"
145
+ });
146
+ }
147
+ }
100
148
  // Always ensure Buoy license API is hidden
101
- if (!patterns.includes("api.keygen.sh")) {
102
- patterns.push("api.keygen.sh");
149
+ if (!migrated.some(p => p.value === "api.keygen.sh")) {
150
+ migrated.push({
151
+ value: "api.keygen.sh",
152
+ mode: "contains"
153
+ });
103
154
  }
104
- setIgnoredPatterns(new Set(patterns));
155
+ setIgnoredPatterns(migrated);
105
156
  }
106
157
  } catch (_error) {
107
158
  // Silently fail - filters will use defaults
@@ -118,9 +169,7 @@ function NetworkModalInner({
118
169
 
119
170
  const saveFilters = async () => {
120
171
  try {
121
- // Save ignored patterns
122
- const patterns = Array.from(ignoredPatterns);
123
- await persistentStorage.setItem(devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(patterns));
172
+ await persistentStorage.setItem(devToolsStorageKeys.network.ignoredDomains(), JSON.stringify(ignoredPatterns));
124
173
  } catch (_error) {
125
174
  // Silently fail - filters will remain in memory
126
175
  }
@@ -183,18 +232,49 @@ function NetworkModalInner({
183
232
  }
184
233
  }, [isSearchActive]);
185
234
 
186
- // Filter events based on ignored patterns
235
+ // Derived set of pattern values (for components that only care about presence).
236
+ const ignoredPatternValues = useMemo(() => new Set(ignoredPatterns.map(p => p.value)), [ignoredPatterns]);
237
+
238
+ // Filter events based on ignored patterns (mode-aware)
187
239
  const filteredEvents = useMemo(() => {
188
- if (ignoredPatterns.size === 0) return events;
240
+ if (ignoredPatterns.length === 0) return events;
189
241
  return events.filter(event => {
190
- const url = event.url.toLowerCase();
191
-
192
- // Check if any pattern matches the URL
193
- const isFiltered = Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
242
+ const isFiltered = ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern));
194
243
  return !isFiltered;
195
244
  });
196
245
  }, [events, ignoredPatterns]);
197
246
 
247
+ // Add or no-op (used by add-pattern UI and suggested-items taps)
248
+ const addIgnoredPattern = useCallback(pattern => {
249
+ const value = pattern.value.trim();
250
+ if (!value) return;
251
+ setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev : [...prev, {
252
+ value,
253
+ mode: pattern.mode
254
+ }]);
255
+ }, []);
256
+
257
+ // Remove by value (used by the filter list X button and the detail view chips)
258
+ const removeIgnoredPattern = useCallback(value => {
259
+ setIgnoredPatterns(prev => prev.filter(p => p.value !== value));
260
+ }, []);
261
+
262
+ // Toggle presence (used by the detail-view domain/url chips — adds as contains)
263
+ const toggleIgnoredPattern = useCallback(value => {
264
+ setIgnoredPatterns(prev => prev.some(p => p.value === value) ? prev.filter(p => p.value !== value) : [...prev, {
265
+ value,
266
+ mode: "contains"
267
+ }]);
268
+ }, []);
269
+
270
+ // Flip an existing pattern's mode between contains <-> exact
271
+ const toggleIgnoredPatternMode = useCallback(value => {
272
+ setIgnoredPatterns(prev => prev.map(p => p.value === value ? {
273
+ ...p,
274
+ mode: p.mode === "contains" ? "exact" : "contains"
275
+ } : p));
276
+ }, []);
277
+
198
278
  // Helper to check if payload should be included based on size
199
279
  const shouldIncludePayload = useCallback(data => {
200
280
  if (copySettings.bodySizeThreshold === -1) return true;
@@ -335,10 +415,7 @@ function NetworkModalInner({
335
415
  let successful = 0;
336
416
  let failed = 0;
337
417
  let pending = 0;
338
- const eventsForStats = ignoredPatterns.size === 0 ? allEvents : allEvents.filter(event => {
339
- const url = event.url.toLowerCase();
340
- return !Array.from(ignoredPatterns).some(pattern => url.includes(pattern.toLowerCase()));
341
- });
418
+ const eventsForStats = ignoredPatterns.length === 0 ? allEvents : allEvents.filter(event => !ignoredPatterns.some(pattern => urlMatchesIgnoredPattern(event.url, pattern)));
342
419
  for (const event of eventsForStats) {
343
420
  if (event.status && event.status >= 200 && event.status < 300) {
344
421
  successful++;
@@ -607,16 +684,8 @@ function NetworkModalInner({
607
684
  /* Show detail view if event is selected */
608
685
  _jsx(NetworkEventDetailView, {
609
686
  event: selectedEvent,
610
- ignoredPatterns: ignoredPatterns,
611
- onTogglePattern: pattern => {
612
- const newPatterns = new Set(ignoredPatterns);
613
- if (newPatterns.has(pattern)) {
614
- newPatterns.delete(pattern);
615
- } else {
616
- newPatterns.add(pattern);
617
- }
618
- setIgnoredPatterns(newPatterns);
619
- }
687
+ ignoredPatterns: ignoredPatternValues,
688
+ onTogglePattern: toggleIgnoredPattern
620
689
  }) : showFilterView ? (/* Show filter/copy view based on active tab */
621
690
  activeTab === "copy" ? /*#__PURE__*/_jsx(NetworkCopySettingsView, {
622
691
  settings: copySettings,
@@ -627,20 +696,9 @@ function NetworkModalInner({
627
696
  filter: filter,
628
697
  onFilterChange: setFilter,
629
698
  ignoredPatterns: ignoredPatterns,
630
- onTogglePattern: pattern => {
631
- const newPatterns = new Set(ignoredPatterns);
632
- if (newPatterns.has(pattern)) {
633
- newPatterns.delete(pattern);
634
- } else {
635
- newPatterns.add(pattern);
636
- }
637
- setIgnoredPatterns(newPatterns);
638
- },
639
- onAddPattern: pattern => {
640
- const newPatterns = new Set(ignoredPatterns);
641
- newPatterns.add(pattern);
642
- setIgnoredPatterns(newPatterns);
643
- }
699
+ onRemovePattern: removeIgnoredPattern,
700
+ onAddPattern: addIgnoredPattern,
701
+ onTogglePatternMode: toggleIgnoredPatternMode
644
702
  })) : /*#__PURE__*/_jsxs(_Fragment, {
645
703
  children: [!isEnabled ? /*#__PURE__*/_jsxs(View, {
646
704
  style: styles.disabledBanner,
@@ -199,7 +199,7 @@ class NetworkListener {
199
199
  * Handle XMLHttpRequest response processing
200
200
  * This method processes the response and emits appropriate events
201
201
  */
202
- handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "axios") {
202
+ handleXHRResponse(xhr, requestId, cleanUrl, method, requestHeaders, requestData, params, startTime, isError = false, clientType = "xhr") {
203
203
  const duration = startTime ? Date.now() - startTime : 0;
204
204
  if (isError || xhr.status === 0) {
205
205
  // Network error or aborted request
@@ -586,8 +586,13 @@ class NetworkListener {
586
586
  }
587
587
  }
588
588
 
589
- // Determine client type from X-Request-Client header
590
- const clientType = requestHeaders["X-Request-Client"] || requestHeaders["x-request-client"] || "axios";
589
+ // Determine client type. Honor an explicit X-Request-Client header first.
590
+ // Otherwise sniff axios via its default Accept header and fall back to
591
+ // "xhr" — defaulting to "axios" misclassified every raw XMLHttpRequest.
592
+ const explicitClient = requestHeaders["X-Request-Client"] || requestHeaders["x-request-client"];
593
+ const acceptHeader = requestHeaders["Accept"] || requestHeaders["accept"] || "";
594
+ const looksLikeAxios = acceptHeader.includes("application/json") && acceptHeader.includes("text/plain") && acceptHeader.includes("*/*");
595
+ const clientType = explicitClient || (looksLikeAxios ? "axios" : "xhr");
591
596
 
592
597
  // Emit request event
593
598
  self.emit({
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkEventItemCompact.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkEventItemCompact.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAM7C,UAAU,4BAA4B;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC;AA8FD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAiInC,CAAC"}
1
+ {"version":3,"file":"NetworkEventItemCompact.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkEventItemCompact.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAM7C,UAAU,4BAA4B;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC;AA8FD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oEAuInC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { NetworkEvent } from "../types";
1
+ import type { IgnoredPattern, NetworkEvent } from "../types";
2
2
  interface NetworkFilter {
3
3
  status?: "all" | "success" | "error" | "pending";
4
4
  method?: string[];
@@ -9,14 +9,18 @@ interface NetworkFilterViewV3Props {
9
9
  events: NetworkEvent[];
10
10
  filter: NetworkFilter;
11
11
  onFilterChange: (filter: NetworkFilter) => void;
12
- ignoredPatterns?: Set<string>;
13
- onTogglePattern?: (pattern: string) => void;
14
- onAddPattern?: (pattern: string) => void;
12
+ ignoredPatterns?: IgnoredPattern[];
13
+ /** Remove a pattern by its value. */
14
+ onRemovePattern?: (pattern: string) => void;
15
+ /** Add a new pattern with the user-selected mode. */
16
+ onAddPattern?: (pattern: IgnoredPattern) => void;
17
+ /** Flip a pattern's mode between `contains` and `exact`. */
18
+ onTogglePatternMode?: (pattern: string) => void;
15
19
  }
16
20
  /**
17
21
  * Control panel for filtering captured network events by status, method, host, and content type.
18
22
  * Provides quick toggles, stats, and ignored-pattern management reminiscent of desktop tooling.
19
23
  */
20
- export declare function NetworkFilterViewV3({ events, filter, onFilterChange, ignoredPatterns, onTogglePattern, onAddPattern, }: NetworkFilterViewV3Props): import("react").JSX.Element;
24
+ export declare function NetworkFilterViewV3({ events, filter, onFilterChange, ignoredPatterns, onRemovePattern, onAddPattern, onTogglePatternMode, }: NetworkFilterViewV3Props): import("react").JSX.Element;
21
25
  export {};
22
26
  //# sourceMappingURL=NetworkFilterViewV3.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkFilterViewV3.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkFilterViewV3.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AA8DD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,cAAc,EACd,eAA2B,EAC3B,eAA0B,EAC1B,YAAuB,GACxB,EAAE,wBAAwB,+BAsQ1B"}
1
+ {"version":3,"file":"NetworkFilterViewV3.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkFilterViewV3.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAA2B,YAAY,EAAE,MAAM,UAAU,CAAC;AAItF,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,qCAAqC;IACrC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qDAAqD;IACrD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AA8DD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,MAAM,EACN,cAAc,EACd,eAAoB,EACpB,eAA0B,EAC1B,YAAuB,EACvB,mBAA8B,GAC/B,EAAE,wBAAwB,+BA0V1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkModal.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkModal.tsx"],"names":[],"mappings":"AA4CA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAsjCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAMpD"}
1
+ {"version":3,"file":"NetworkModal.d.ts","sourceRoot":"","sources":["../../../../src/network/components/NetworkModal.tsx"],"names":[],"mappings":"AA2EA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAslCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAMpD"}
@@ -9,5 +9,5 @@ export { TickProvider, useTickEveryMinute } from "./hooks/useTickEveryMinute";
9
9
  export { networkListener, startNetworkListener, stopNetworkListener, addNetworkListener, removeAllNetworkListeners, isNetworkListening, getNetworkListenerCount, } from "./utils/networkListener";
10
10
  export { networkEventStore, type NetworkEventCallback } from "./utils/networkEventStore";
11
11
  export { formatBytes, formatDuration, formatHttpStatus, } from "./utils/formatting";
12
- export type { NetworkEvent, NetworkStats, NetworkFilter, NetworkEventStatus, NetworkInsight, } from "./types";
12
+ export type { NetworkEvent, NetworkStats, NetworkFilter, NetworkEventStatus, NetworkInsight, IgnoredPattern, IgnoredPatternMatchMode, } from "./types";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG9E,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG9E,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
@@ -24,7 +24,7 @@ export interface NetworkEvent {
24
24
  query?: string;
25
25
  responseType?: string;
26
26
  cached?: boolean;
27
- requestClient?: "fetch" | "axios" | "graphql" | "grpc-web";
27
+ requestClient?: "fetch" | "axios" | "xhr" | "graphql" | "grpc-web";
28
28
  /**
29
29
  * GraphQL operation name extracted from request data.
30
30
  *
@@ -75,6 +75,20 @@ export interface NetworkFilter {
75
75
  }
76
76
  /** Human readable status classifications derived from request/response metadata. */
77
77
  export type NetworkEventStatus = "pending" | "success" | "error" | "timeout";
78
+ /**
79
+ * How an ignored-pattern entry should be compared against captured URLs.
80
+ *
81
+ * - `contains`: case-insensitive substring match on the full URL (legacy behavior).
82
+ * - `exact`: smart equality — if pattern starts with `/`, matches URL.pathname;
83
+ * if it starts with `http://`/`https://`, matches origin+pathname; otherwise
84
+ * matches URL.host.
85
+ */
86
+ export type IgnoredPatternMatchMode = "contains" | "exact";
87
+ /** A single network-events exclude pattern with its match mode. */
88
+ export interface IgnoredPattern {
89
+ value: string;
90
+ mode: IgnoredPatternMatchMode;
91
+ }
78
92
  /**
79
93
  * Insight surfaces highlight notable traffic patterns or issues for the current session.
80
94
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/network/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EACF,KAAK,GACL,MAAM,GACN,KAAK,GACL,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IAC3D;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC5D,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/network/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EACF,KAAK,GACL,MAAM,GACN,KAAK,GACL,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACnE;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7E;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,OAAO,CAAC;AAE3D,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,uBAAuB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC5D,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -13,7 +13,7 @@ export interface NetworkingEvent {
13
13
  headers?: Record<string, string>;
14
14
  data?: unknown;
15
15
  params?: Record<string, string>;
16
- client?: "fetch" | "axios" | "graphql" | "grpc-web";
16
+ client?: "fetch" | "axios" | "xhr" | "graphql" | "grpc-web";
17
17
  };
18
18
  response?: {
19
19
  status: number;
@@ -1 +1 @@
1
- {"version":3,"file":"networkListener.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkListener.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;KACrD,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,WAAW,CASjB;IAGF,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,2BAA2B,CAAmD;;IAWtF;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,IAAI;IAUZ;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;;;;OAKG;YACW,mBAAmB;IA2DjC;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6MzB;;;;;;;;;;OAUG;IACH,cAAc;IAkTd;;;;;OAKG;IACH,aAAa;IAkBb;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,uBAAuB;IAa7C,kBAAkB;IAKlB,IAAI,QAAQ,YAEX;IAGD,IAAI,aAAa,WAEhB;CACF;AAsBD;;;;GAIG;AACH,eAAO,MAAM,eAAe,uBAAqB,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,YAA8C,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAA6C,CAAC;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,uBAAuB,eACxB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,yBAAyB,YACK,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,eAAsC,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,cAA2C,CAAC"}
1
+ {"version":3,"file":"networkListener.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkListener.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;KAC7D,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,WAAW,CASjB;IAGF,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,2BAA2B,CAAmD;;IAWtF;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,IAAI;IAUZ;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;;;;OAKG;YACW,mBAAmB;IA2DjC;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6MzB;;;;;;;;;;OAUG;IACH,cAAc;IAyTd;;;;;OAKG;IACH,aAAa;IAkBb;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,uBAAuB;IAa7C,kBAAkB;IAKlB,IAAI,QAAQ,YAEX;IAGD,IAAI,aAAa,WAEhB;CACF;AAsBD;;;;GAIG;AACH,eAAO,MAAM,eAAe,uBAAqB,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,YAA8C,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAA6C,CAAC;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,uBAAuB,eACxB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,yBAAyB,YACK,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,eAAsC,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,cAA2C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/network",
3
- "version": "2.1.15",
3
+ "version": "3.0.1",
4
4
  "description": "network package",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "sideEffects": false,
28
28
  "dependencies": {
29
- "@buoy-gg/shared-ui": "2.1.15"
29
+ "@buoy-gg/shared-ui": "3.0.1"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "react": "*",