react-native-prod-debugger 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +350 -0
  3. package/lib/commonjs/core/DebugBubble.js +139 -0
  4. package/lib/commonjs/core/DebugBubble.js.map +1 -0
  5. package/lib/commonjs/core/DebugOverlay.js +184 -0
  6. package/lib/commonjs/core/DebugOverlay.js.map +1 -0
  7. package/lib/commonjs/core/DebuggerProvider.js +174 -0
  8. package/lib/commonjs/core/DebuggerProvider.js.map +1 -0
  9. package/lib/commonjs/core/GestureDetector.js +83 -0
  10. package/lib/commonjs/core/GestureDetector.js.map +1 -0
  11. package/lib/commonjs/core/PluginRegistry.js +124 -0
  12. package/lib/commonjs/core/PluginRegistry.js.map +1 -0
  13. package/lib/commonjs/core/theme.js +50 -0
  14. package/lib/commonjs/core/theme.js.map +1 -0
  15. package/lib/commonjs/core/types.js +6 -0
  16. package/lib/commonjs/core/types.js.map +1 -0
  17. package/lib/commonjs/core/useDebugger.js +27 -0
  18. package/lib/commonjs/core/useDebugger.js.map +1 -0
  19. package/lib/commonjs/core/utils.js +239 -0
  20. package/lib/commonjs/core/utils.js.map +1 -0
  21. package/lib/commonjs/index.js +132 -0
  22. package/lib/commonjs/index.js.map +1 -0
  23. package/lib/commonjs/plugins/console/ConsoleInterceptor.js +103 -0
  24. package/lib/commonjs/plugins/console/ConsoleInterceptor.js.map +1 -0
  25. package/lib/commonjs/plugins/console/ConsoleViewerPlugin.js +269 -0
  26. package/lib/commonjs/plugins/console/ConsoleViewerPlugin.js.map +1 -0
  27. package/lib/commonjs/plugins/crashReporter/CrashReporterPlugin.js +363 -0
  28. package/lib/commonjs/plugins/crashReporter/CrashReporterPlugin.js.map +1 -0
  29. package/lib/commonjs/plugins/customActions/CustomActionsPlugin.js +218 -0
  30. package/lib/commonjs/plugins/customActions/CustomActionsPlugin.js.map +1 -0
  31. package/lib/commonjs/plugins/customActions/actionStore.js +46 -0
  32. package/lib/commonjs/plugins/customActions/actionStore.js.map +1 -0
  33. package/lib/commonjs/plugins/deepLinkTester/DeepLinkTesterPlugin.js +268 -0
  34. package/lib/commonjs/plugins/deepLinkTester/DeepLinkTesterPlugin.js.map +1 -0
  35. package/lib/commonjs/plugins/deviceInfo/DeviceInfoPlugin.js +184 -0
  36. package/lib/commonjs/plugins/deviceInfo/DeviceInfoPlugin.js.map +1 -0
  37. package/lib/commonjs/plugins/featureFlags/FeatureFlagsPlugin.js +381 -0
  38. package/lib/commonjs/plugins/featureFlags/FeatureFlagsPlugin.js.map +1 -0
  39. package/lib/commonjs/plugins/featureFlags/flagStore.js +125 -0
  40. package/lib/commonjs/plugins/featureFlags/flagStore.js.map +1 -0
  41. package/lib/commonjs/plugins/navigationInspector/NavigationInspectorPlugin.js +250 -0
  42. package/lib/commonjs/plugins/navigationInspector/NavigationInspectorPlugin.js.map +1 -0
  43. package/lib/commonjs/plugins/navigationInspector/navigationStore.js +65 -0
  44. package/lib/commonjs/plugins/navigationInspector/navigationStore.js.map +1 -0
  45. package/lib/commonjs/plugins/network/NetworkInspectorPlugin.js +709 -0
  46. package/lib/commonjs/plugins/network/NetworkInspectorPlugin.js.map +1 -0
  47. package/lib/commonjs/plugins/network/NetworkInterceptor.js +305 -0
  48. package/lib/commonjs/plugins/network/NetworkInterceptor.js.map +1 -0
  49. package/lib/commonjs/plugins/performance/PerformanceMonitorPlugin.js +261 -0
  50. package/lib/commonjs/plugins/performance/PerformanceMonitorPlugin.js.map +1 -0
  51. package/lib/commonjs/plugins/remoteConfig/RemoteConfigPlugin.js +265 -0
  52. package/lib/commonjs/plugins/remoteConfig/RemoteConfigPlugin.js.map +1 -0
  53. package/lib/commonjs/plugins/remoteConfig/remoteConfigStore.js +50 -0
  54. package/lib/commonjs/plugins/remoteConfig/remoteConfigStore.js.map +1 -0
  55. package/lib/commonjs/plugins/stateInspector/StateInspectorPlugin.js +378 -0
  56. package/lib/commonjs/plugins/stateInspector/StateInspectorPlugin.js.map +1 -0
  57. package/lib/commonjs/plugins/stateInspector/stateAdapterRegistry.js +62 -0
  58. package/lib/commonjs/plugins/stateInspector/stateAdapterRegistry.js.map +1 -0
  59. package/lib/commonjs/plugins/storageBrowser/StorageBrowserPlugin.js +496 -0
  60. package/lib/commonjs/plugins/storageBrowser/StorageBrowserPlugin.js.map +1 -0
  61. package/lib/commonjs/plugins/storageBrowser/storageAdapterRegistry.js +44 -0
  62. package/lib/commonjs/plugins/storageBrowser/storageAdapterRegistry.js.map +1 -0
  63. package/lib/commonjs/plugins/timeline/TimelinePlugin.js +294 -0
  64. package/lib/commonjs/plugins/timeline/TimelinePlugin.js.map +1 -0
  65. package/lib/commonjs/plugins/timeline/timelineStore.js +61 -0
  66. package/lib/commonjs/plugins/timeline/timelineStore.js.map +1 -0
  67. package/lib/module/core/DebugBubble.js +131 -0
  68. package/lib/module/core/DebugBubble.js.map +1 -0
  69. package/lib/module/core/DebugOverlay.js +176 -0
  70. package/lib/module/core/DebugOverlay.js.map +1 -0
  71. package/lib/module/core/DebuggerProvider.js +167 -0
  72. package/lib/module/core/DebuggerProvider.js.map +1 -0
  73. package/lib/module/core/GestureDetector.js +75 -0
  74. package/lib/module/core/GestureDetector.js.map +1 -0
  75. package/lib/module/core/PluginRegistry.js +116 -0
  76. package/lib/module/core/PluginRegistry.js.map +1 -0
  77. package/lib/module/core/theme.js +43 -0
  78. package/lib/module/core/theme.js.map +1 -0
  79. package/lib/module/core/types.js +2 -0
  80. package/lib/module/core/types.js.map +1 -0
  81. package/lib/module/core/useDebugger.js +21 -0
  82. package/lib/module/core/useDebugger.js.map +1 -0
  83. package/lib/module/core/utils.js +219 -0
  84. package/lib/module/core/utils.js.map +1 -0
  85. package/lib/module/index.js +44 -0
  86. package/lib/module/index.js.map +1 -0
  87. package/lib/module/plugins/console/ConsoleInterceptor.js +97 -0
  88. package/lib/module/plugins/console/ConsoleInterceptor.js.map +1 -0
  89. package/lib/module/plugins/console/ConsoleViewerPlugin.js +262 -0
  90. package/lib/module/plugins/console/ConsoleViewerPlugin.js.map +1 -0
  91. package/lib/module/plugins/crashReporter/CrashReporterPlugin.js +357 -0
  92. package/lib/module/plugins/crashReporter/CrashReporterPlugin.js.map +1 -0
  93. package/lib/module/plugins/customActions/CustomActionsPlugin.js +211 -0
  94. package/lib/module/plugins/customActions/CustomActionsPlugin.js.map +1 -0
  95. package/lib/module/plugins/customActions/actionStore.js +38 -0
  96. package/lib/module/plugins/customActions/actionStore.js.map +1 -0
  97. package/lib/module/plugins/deepLinkTester/DeepLinkTesterPlugin.js +261 -0
  98. package/lib/module/plugins/deepLinkTester/DeepLinkTesterPlugin.js.map +1 -0
  99. package/lib/module/plugins/deviceInfo/DeviceInfoPlugin.js +177 -0
  100. package/lib/module/plugins/deviceInfo/DeviceInfoPlugin.js.map +1 -0
  101. package/lib/module/plugins/featureFlags/FeatureFlagsPlugin.js +374 -0
  102. package/lib/module/plugins/featureFlags/FeatureFlagsPlugin.js.map +1 -0
  103. package/lib/module/plugins/featureFlags/flagStore.js +117 -0
  104. package/lib/module/plugins/featureFlags/flagStore.js.map +1 -0
  105. package/lib/module/plugins/navigationInspector/NavigationInspectorPlugin.js +243 -0
  106. package/lib/module/plugins/navigationInspector/NavigationInspectorPlugin.js.map +1 -0
  107. package/lib/module/plugins/navigationInspector/navigationStore.js +58 -0
  108. package/lib/module/plugins/navigationInspector/navigationStore.js.map +1 -0
  109. package/lib/module/plugins/network/NetworkInspectorPlugin.js +703 -0
  110. package/lib/module/plugins/network/NetworkInspectorPlugin.js.map +1 -0
  111. package/lib/module/plugins/network/NetworkInterceptor.js +299 -0
  112. package/lib/module/plugins/network/NetworkInterceptor.js.map +1 -0
  113. package/lib/module/plugins/performance/PerformanceMonitorPlugin.js +254 -0
  114. package/lib/module/plugins/performance/PerformanceMonitorPlugin.js.map +1 -0
  115. package/lib/module/plugins/remoteConfig/RemoteConfigPlugin.js +258 -0
  116. package/lib/module/plugins/remoteConfig/RemoteConfigPlugin.js.map +1 -0
  117. package/lib/module/plugins/remoteConfig/remoteConfigStore.js +43 -0
  118. package/lib/module/plugins/remoteConfig/remoteConfigStore.js.map +1 -0
  119. package/lib/module/plugins/stateInspector/StateInspectorPlugin.js +372 -0
  120. package/lib/module/plugins/stateInspector/StateInspectorPlugin.js.map +1 -0
  121. package/lib/module/plugins/stateInspector/stateAdapterRegistry.js +54 -0
  122. package/lib/module/plugins/stateInspector/stateAdapterRegistry.js.map +1 -0
  123. package/lib/module/plugins/storageBrowser/StorageBrowserPlugin.js +489 -0
  124. package/lib/module/plugins/storageBrowser/StorageBrowserPlugin.js.map +1 -0
  125. package/lib/module/plugins/storageBrowser/storageAdapterRegistry.js +36 -0
  126. package/lib/module/plugins/storageBrowser/storageAdapterRegistry.js.map +1 -0
  127. package/lib/module/plugins/timeline/TimelinePlugin.js +287 -0
  128. package/lib/module/plugins/timeline/TimelinePlugin.js.map +1 -0
  129. package/lib/module/plugins/timeline/timelineStore.js +54 -0
  130. package/lib/module/plugins/timeline/timelineStore.js.map +1 -0
  131. package/lib/typescript/core/DebugBubble.d.ts +22 -0
  132. package/lib/typescript/core/DebugBubble.d.ts.map +1 -0
  133. package/lib/typescript/core/DebugOverlay.d.ts +18 -0
  134. package/lib/typescript/core/DebugOverlay.d.ts.map +1 -0
  135. package/lib/typescript/core/DebuggerProvider.d.ts +25 -0
  136. package/lib/typescript/core/DebuggerProvider.d.ts.map +1 -0
  137. package/lib/typescript/core/GestureDetector.d.ts +20 -0
  138. package/lib/typescript/core/GestureDetector.d.ts.map +1 -0
  139. package/lib/typescript/core/PluginRegistry.d.ts +41 -0
  140. package/lib/typescript/core/PluginRegistry.d.ts.map +1 -0
  141. package/lib/typescript/core/theme.d.ts +11 -0
  142. package/lib/typescript/core/theme.d.ts.map +1 -0
  143. package/lib/typescript/core/types.d.ts +269 -0
  144. package/lib/typescript/core/types.d.ts.map +1 -0
  145. package/lib/typescript/core/useDebugger.d.ts +14 -0
  146. package/lib/typescript/core/useDebugger.d.ts.map +1 -0
  147. package/lib/typescript/core/utils.d.ts +46 -0
  148. package/lib/typescript/core/utils.d.ts.map +1 -0
  149. package/lib/typescript/index.d.ts +23 -0
  150. package/lib/typescript/index.d.ts.map +1 -0
  151. package/lib/typescript/plugins/console/ConsoleInterceptor.d.ts +32 -0
  152. package/lib/typescript/plugins/console/ConsoleInterceptor.d.ts.map +1 -0
  153. package/lib/typescript/plugins/console/ConsoleViewerPlugin.d.ts +3 -0
  154. package/lib/typescript/plugins/console/ConsoleViewerPlugin.d.ts.map +1 -0
  155. package/lib/typescript/plugins/crashReporter/CrashReporterPlugin.d.ts +3 -0
  156. package/lib/typescript/plugins/crashReporter/CrashReporterPlugin.d.ts.map +1 -0
  157. package/lib/typescript/plugins/customActions/CustomActionsPlugin.d.ts +3 -0
  158. package/lib/typescript/plugins/customActions/CustomActionsPlugin.d.ts.map +1 -0
  159. package/lib/typescript/plugins/customActions/actionStore.d.ts +16 -0
  160. package/lib/typescript/plugins/customActions/actionStore.d.ts.map +1 -0
  161. package/lib/typescript/plugins/deepLinkTester/DeepLinkTesterPlugin.d.ts +3 -0
  162. package/lib/typescript/plugins/deepLinkTester/DeepLinkTesterPlugin.d.ts.map +1 -0
  163. package/lib/typescript/plugins/deviceInfo/DeviceInfoPlugin.d.ts +3 -0
  164. package/lib/typescript/plugins/deviceInfo/DeviceInfoPlugin.d.ts.map +1 -0
  165. package/lib/typescript/plugins/featureFlags/FeatureFlagsPlugin.d.ts +3 -0
  166. package/lib/typescript/plugins/featureFlags/FeatureFlagsPlugin.d.ts.map +1 -0
  167. package/lib/typescript/plugins/featureFlags/flagStore.d.ts +45 -0
  168. package/lib/typescript/plugins/featureFlags/flagStore.d.ts.map +1 -0
  169. package/lib/typescript/plugins/navigationInspector/NavigationInspectorPlugin.d.ts +3 -0
  170. package/lib/typescript/plugins/navigationInspector/NavigationInspectorPlugin.d.ts.map +1 -0
  171. package/lib/typescript/plugins/navigationInspector/navigationStore.d.ts +30 -0
  172. package/lib/typescript/plugins/navigationInspector/navigationStore.d.ts.map +1 -0
  173. package/lib/typescript/plugins/network/NetworkInspectorPlugin.d.ts +3 -0
  174. package/lib/typescript/plugins/network/NetworkInspectorPlugin.d.ts.map +1 -0
  175. package/lib/typescript/plugins/network/NetworkInterceptor.d.ts +42 -0
  176. package/lib/typescript/plugins/network/NetworkInterceptor.d.ts.map +1 -0
  177. package/lib/typescript/plugins/performance/PerformanceMonitorPlugin.d.ts +3 -0
  178. package/lib/typescript/plugins/performance/PerformanceMonitorPlugin.d.ts.map +1 -0
  179. package/lib/typescript/plugins/remoteConfig/RemoteConfigPlugin.d.ts +3 -0
  180. package/lib/typescript/plugins/remoteConfig/RemoteConfigPlugin.d.ts.map +1 -0
  181. package/lib/typescript/plugins/remoteConfig/remoteConfigStore.d.ts +20 -0
  182. package/lib/typescript/plugins/remoteConfig/remoteConfigStore.d.ts.map +1 -0
  183. package/lib/typescript/plugins/stateInspector/StateInspectorPlugin.d.ts +3 -0
  184. package/lib/typescript/plugins/stateInspector/StateInspectorPlugin.d.ts.map +1 -0
  185. package/lib/typescript/plugins/stateInspector/stateAdapterRegistry.d.ts +34 -0
  186. package/lib/typescript/plugins/stateInspector/stateAdapterRegistry.d.ts.map +1 -0
  187. package/lib/typescript/plugins/storageBrowser/StorageBrowserPlugin.d.ts +3 -0
  188. package/lib/typescript/plugins/storageBrowser/StorageBrowserPlugin.d.ts.map +1 -0
  189. package/lib/typescript/plugins/storageBrowser/storageAdapterRegistry.d.ts +16 -0
  190. package/lib/typescript/plugins/storageBrowser/storageAdapterRegistry.d.ts.map +1 -0
  191. package/lib/typescript/plugins/timeline/TimelinePlugin.d.ts +3 -0
  192. package/lib/typescript/plugins/timeline/TimelinePlugin.d.ts.map +1 -0
  193. package/lib/typescript/plugins/timeline/timelineStore.d.ts +24 -0
  194. package/lib/typescript/plugins/timeline/timelineStore.d.ts.map +1 -0
  195. package/package.json +131 -0
  196. package/src/core/DebugBubble.tsx +149 -0
  197. package/src/core/DebugOverlay.tsx +211 -0
  198. package/src/core/DebuggerProvider.tsx +211 -0
  199. package/src/core/GestureDetector.tsx +95 -0
  200. package/src/core/PluginRegistry.ts +118 -0
  201. package/src/core/theme.ts +41 -0
  202. package/src/core/types.ts +339 -0
  203. package/src/core/useDebugger.ts +24 -0
  204. package/src/core/utils.ts +221 -0
  205. package/src/index.ts +67 -0
  206. package/src/plugins/console/ConsoleInterceptor.ts +110 -0
  207. package/src/plugins/console/ConsoleViewerPlugin.tsx +241 -0
  208. package/src/plugins/crashReporter/CrashReporterPlugin.tsx +316 -0
  209. package/src/plugins/customActions/CustomActionsPlugin.tsx +199 -0
  210. package/src/plugins/customActions/actionStore.ts +49 -0
  211. package/src/plugins/deepLinkTester/DeepLinkTesterPlugin.tsx +213 -0
  212. package/src/plugins/deviceInfo/DeviceInfoPlugin.tsx +153 -0
  213. package/src/plugins/featureFlags/FeatureFlagsPlugin.tsx +338 -0
  214. package/src/plugins/featureFlags/flagStore.ts +118 -0
  215. package/src/plugins/navigationInspector/NavigationInspectorPlugin.tsx +170 -0
  216. package/src/plugins/navigationInspector/navigationStore.ts +70 -0
  217. package/src/plugins/network/NetworkInspectorPlugin.tsx +598 -0
  218. package/src/plugins/network/NetworkInterceptor.ts +344 -0
  219. package/src/plugins/performance/PerformanceMonitorPlugin.tsx +194 -0
  220. package/src/plugins/remoteConfig/RemoteConfigPlugin.tsx +205 -0
  221. package/src/plugins/remoteConfig/remoteConfigStore.ts +48 -0
  222. package/src/plugins/stateInspector/StateInspectorPlugin.tsx +342 -0
  223. package/src/plugins/stateInspector/stateAdapterRegistry.ts +66 -0
  224. package/src/plugins/storageBrowser/StorageBrowserPlugin.tsx +410 -0
  225. package/src/plugins/storageBrowser/storageAdapterRegistry.ts +47 -0
  226. package/src/plugins/timeline/TimelinePlugin.tsx +242 -0
  227. package/src/plugins/timeline/timelineStore.ts +65 -0
@@ -0,0 +1,709 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createNetworkInspectorPlugin = createNetworkInspectorPlugin;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _NetworkInterceptor = require("./NetworkInterceptor");
10
+ var _utils = require("../../core/utils");
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ // ─── Network Inspector Plugin Component ─────────────────────────────────────
13
+
14
+ const NetworkInspectorPanel = ({
15
+ theme
16
+ }) => {
17
+ const [requests, setRequests] = (0, _react.useState)([]);
18
+ const [searchQuery, setSearchQuery] = (0, _react.useState)('');
19
+ const [selectedRequest, setSelectedRequest] = (0, _react.useState)(null);
20
+ const [activeDetailTab, setActiveDetailTab] = (0, _react.useState)('headers');
21
+ const [methodFilter, setMethodFilter] = (0, _react.useState)(null);
22
+ (0, _react.useEffect)(() => {
23
+ const unsubscribe = _NetworkInterceptor.NetworkInterceptor.subscribe(setRequests);
24
+ return unsubscribe;
25
+ }, []);
26
+ const filteredRequests = (0, _react.useMemo)(() => {
27
+ let filtered = requests;
28
+ if (searchQuery) {
29
+ const q = searchQuery.toLowerCase();
30
+ filtered = filtered.filter(r => r.url.toLowerCase().includes(q) || r.method.toLowerCase().includes(q) || r.gqlOperation?.toLowerCase().includes(q) || String(r.status).includes(q));
31
+ }
32
+ if (methodFilter) {
33
+ filtered = filtered.filter(r => r.method === methodFilter);
34
+ }
35
+ return filtered;
36
+ }, [requests, searchQuery, methodFilter]);
37
+ const stats = (0, _react.useMemo)(() => {
38
+ const total = requests.length;
39
+ const errors = requests.filter(r => r.isError).length;
40
+ const pending = requests.filter(r => !r.endTime).length;
41
+ return {
42
+ total,
43
+ errors,
44
+ pending
45
+ };
46
+ }, [requests]);
47
+ const handleClear = (0, _react.useCallback)(() => {
48
+ _NetworkInterceptor.NetworkInterceptor.clear();
49
+ setSelectedRequest(null);
50
+ }, []);
51
+ const handleCopyCurl = (0, _react.useCallback)(req => {
52
+ (0, _utils.copyToClipboard)((0, _utils.toCurl)(req));
53
+ }, []);
54
+ const handleShareRequest = (0, _react.useCallback)(req => {
55
+ const data = (0, _utils.safeStringify)({
56
+ url: req.url,
57
+ method: req.method,
58
+ status: req.status,
59
+ duration: req.duration,
60
+ requestHeaders: req.requestHeaders,
61
+ responseHeaders: req.responseHeaders,
62
+ requestBody: req.requestBody,
63
+ responseBody: req.responseBody
64
+ });
65
+ (0, _utils.shareText)(data, `${req.method} ${req.url}`);
66
+ }, []);
67
+ if (selectedRequest) {
68
+ return /*#__PURE__*/_react.default.createElement(RequestDetail, {
69
+ request: selectedRequest,
70
+ theme: theme,
71
+ activeTab: activeDetailTab,
72
+ onTabChange: setActiveDetailTab,
73
+ onBack: () => setSelectedRequest(null),
74
+ onCopyCurl: handleCopyCurl,
75
+ onShare: handleShareRequest
76
+ });
77
+ }
78
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
79
+ style: styles.container
80
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
81
+ style: [styles.statsBar, {
82
+ backgroundColor: theme.surface
83
+ }]
84
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
85
+ style: styles.statsRow
86
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
87
+ style: [styles.statText, {
88
+ color: theme.text
89
+ }]
90
+ }, stats.total, " requests"), stats.errors > 0 && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
91
+ style: [styles.statText, {
92
+ color: theme.error
93
+ }]
94
+ }, stats.errors, " errors"), stats.pending > 0 && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
95
+ style: [styles.statText, {
96
+ color: theme.warning
97
+ }]
98
+ }, stats.pending, " pending")), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
99
+ onPress: handleClear,
100
+ activeOpacity: 0.7
101
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
102
+ style: [styles.clearButton, {
103
+ color: theme.error
104
+ }]
105
+ }, "Clear"))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
106
+ style: [styles.searchContainer, {
107
+ backgroundColor: theme.surface
108
+ }]
109
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.TextInput, {
110
+ style: [styles.searchInput, {
111
+ color: theme.text,
112
+ backgroundColor: theme.surfaceAlt,
113
+ borderColor: theme.border
114
+ }],
115
+ placeholder: "Search URL, method, status...",
116
+ placeholderTextColor: theme.textMuted,
117
+ value: searchQuery,
118
+ onChangeText: setSearchQuery,
119
+ autoCapitalize: "none",
120
+ autoCorrect: false
121
+ })), /*#__PURE__*/_react.default.createElement(_reactNative.ScrollView, {
122
+ horizontal: true,
123
+ showsHorizontalScrollIndicator: false,
124
+ style: [styles.filterContainer, {
125
+ backgroundColor: theme.surface
126
+ }],
127
+ contentContainerStyle: styles.filterContent
128
+ }, ['ALL', 'GET', 'POST', 'PUT', 'PATCH', 'DELETE'].map(method => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
129
+ key: method,
130
+ style: [styles.filterChip, {
131
+ backgroundColor: method === 'ALL' && !methodFilter || methodFilter === method ? theme.accent : theme.surfaceAlt,
132
+ borderColor: theme.border
133
+ }],
134
+ onPress: () => setMethodFilter(method === 'ALL' ? null : method),
135
+ activeOpacity: 0.7
136
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
137
+ style: [styles.filterChipText, {
138
+ color: method === 'ALL' && !methodFilter || methodFilter === method ? '#FFFFFF' : theme.textSecondary
139
+ }]
140
+ }, method)))), /*#__PURE__*/_react.default.createElement(_reactNative.FlatList, {
141
+ data: filteredRequests,
142
+ keyExtractor: item => item.id,
143
+ renderItem: ({
144
+ item
145
+ }) => /*#__PURE__*/_react.default.createElement(RequestRow, {
146
+ request: item,
147
+ theme: theme,
148
+ onPress: () => setSelectedRequest(item)
149
+ }),
150
+ ListEmptyComponent: /*#__PURE__*/_react.default.createElement(_reactNative.View, {
151
+ style: styles.emptyContainer
152
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
153
+ style: [styles.emptyText, {
154
+ color: theme.textMuted
155
+ }]
156
+ }, searchQuery ? 'No matching requests' : 'No network requests captured yet')),
157
+ initialNumToRender: 20,
158
+ maxToRenderPerBatch: 10,
159
+ windowSize: 10
160
+ }));
161
+ };
162
+
163
+ // ─── Request Row ────────────────────────────────────────────────────────────
164
+
165
+ const RequestRow = /*#__PURE__*/_react.default.memo(({
166
+ request,
167
+ theme,
168
+ onPress
169
+ }) => {
170
+ const urlPath = (0, _react.useMemo)(() => {
171
+ try {
172
+ const parsed = new URL(request.url);
173
+ return parsed.pathname + parsed.search;
174
+ } catch {
175
+ return request.url;
176
+ }
177
+ }, [request.url]);
178
+ return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
179
+ style: [styles.requestRow, {
180
+ backgroundColor: request.isError ? `${theme.error}10` : theme.surface,
181
+ borderBottomColor: theme.border
182
+ }],
183
+ onPress: onPress,
184
+ activeOpacity: 0.7
185
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
186
+ style: styles.requestRowLeft
187
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
188
+ style: styles.requestMethodContainer
189
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
190
+ style: [styles.requestMethod, {
191
+ color: (0, _utils.getMethodColor)(request.method)
192
+ }]
193
+ }, request.method), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
194
+ style: [styles.requestStatus, {
195
+ color: (0, _utils.getStatusColor)(request.status)
196
+ }]
197
+ }, request.status ?? '...')), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
198
+ style: [styles.requestUrl, {
199
+ color: theme.text
200
+ }],
201
+ numberOfLines: 1
202
+ }, request.gqlOperation ? `[${request.gqlType}] ${request.gqlOperation}` : (0, _utils.truncate)(urlPath, 60))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
203
+ style: styles.requestRowRight
204
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
205
+ style: [styles.requestDuration, {
206
+ color: theme.textSecondary
207
+ }]
208
+ }, (0, _utils.formatDuration)(request.duration)), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
209
+ style: [styles.requestSize, {
210
+ color: theme.textMuted
211
+ }]
212
+ }, (0, _utils.formatBytes)(request.responseSize)), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
213
+ style: [styles.requestTime, {
214
+ color: theme.textMuted
215
+ }]
216
+ }, (0, _utils.formatTimestamp)(request.startTime))));
217
+ });
218
+
219
+ // ─── Request Detail ─────────────────────────────────────────────────────────
220
+
221
+ const RequestDetail = ({
222
+ request,
223
+ theme,
224
+ activeTab,
225
+ onTabChange,
226
+ onBack,
227
+ onCopyCurl,
228
+ onShare
229
+ }) => {
230
+ const tabs = ['headers', 'request', 'response', 'timing'];
231
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
232
+ style: styles.container
233
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
234
+ style: [styles.detailHeader, {
235
+ backgroundColor: theme.surface,
236
+ borderBottomColor: theme.border
237
+ }]
238
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
239
+ onPress: onBack,
240
+ activeOpacity: 0.7
241
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
242
+ style: [styles.backButton, {
243
+ color: theme.accent
244
+ }]
245
+ }, "\u2190 Back")), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
246
+ style: styles.detailActions
247
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
248
+ onPress: () => onCopyCurl(request),
249
+ style: [styles.actionButton, {
250
+ backgroundColor: theme.surfaceAlt
251
+ }],
252
+ activeOpacity: 0.7
253
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
254
+ style: [styles.actionButtonText, {
255
+ color: theme.textSecondary
256
+ }]
257
+ }, "cURL")), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
258
+ onPress: () => onShare(request),
259
+ style: [styles.actionButton, {
260
+ backgroundColor: theme.surfaceAlt
261
+ }],
262
+ activeOpacity: 0.7
263
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
264
+ style: [styles.actionButtonText, {
265
+ color: theme.textSecondary
266
+ }]
267
+ }, "Share")))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
268
+ style: [styles.urlDisplay, {
269
+ backgroundColor: theme.codeBackground
270
+ }]
271
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
272
+ style: [styles.urlMethod, {
273
+ color: (0, _utils.getMethodColor)(request.method)
274
+ }]
275
+ }, request.method), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
276
+ style: [styles.urlText, {
277
+ color: theme.codeText
278
+ }],
279
+ selectable: true
280
+ }, request.url)), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
281
+ style: [styles.detailTabBar, {
282
+ backgroundColor: theme.surface
283
+ }]
284
+ }, tabs.map(tab => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
285
+ key: tab,
286
+ style: [styles.detailTab, {
287
+ borderBottomColor: activeTab === tab ? theme.accent : 'transparent'
288
+ }],
289
+ onPress: () => onTabChange(tab),
290
+ activeOpacity: 0.7
291
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
292
+ style: [styles.detailTabText, {
293
+ color: activeTab === tab ? theme.accent : theme.textSecondary
294
+ }]
295
+ }, tab.charAt(0).toUpperCase() + tab.slice(1))))), /*#__PURE__*/_react.default.createElement(_reactNative.ScrollView, {
296
+ style: styles.detailContent
297
+ }, activeTab === 'headers' && /*#__PURE__*/_react.default.createElement(HeadersView, {
298
+ request: request,
299
+ theme: theme
300
+ }), activeTab === 'request' && /*#__PURE__*/_react.default.createElement(BodyView, {
301
+ body: request.requestBody,
302
+ theme: theme,
303
+ label: "Request Body"
304
+ }), activeTab === 'response' && /*#__PURE__*/_react.default.createElement(BodyView, {
305
+ body: request.responseBody,
306
+ theme: theme,
307
+ label: "Response Body"
308
+ }), activeTab === 'timing' && /*#__PURE__*/_react.default.createElement(TimingView, {
309
+ request: request,
310
+ theme: theme
311
+ })));
312
+ };
313
+
314
+ // ─── Sub-views ──────────────────────────────────────────────────────────────
315
+
316
+ const HeadersView = ({
317
+ request,
318
+ theme
319
+ }) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
320
+ style: styles.sectionContainer
321
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
322
+ style: [styles.sectionTitle, {
323
+ color: theme.text
324
+ }]
325
+ }, "Request Headers"), request.requestHeaders && Object.keys(request.requestHeaders).length > 0 ? Object.entries(request.requestHeaders).map(([key, value]) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
326
+ key: key,
327
+ style: [styles.headerRow, {
328
+ borderBottomColor: theme.border
329
+ }]
330
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
331
+ style: [styles.headerKey, {
332
+ color: theme.accent
333
+ }]
334
+ }, key), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
335
+ style: [styles.headerValue, {
336
+ color: theme.text
337
+ }],
338
+ selectable: true
339
+ }, value))) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
340
+ style: [styles.emptyText, {
341
+ color: theme.textMuted
342
+ }]
343
+ }, "No headers"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
344
+ style: [styles.sectionTitle, {
345
+ color: theme.text,
346
+ marginTop: 16
347
+ }]
348
+ }, "Response Headers"), request.responseHeaders && Object.keys(request.responseHeaders).length > 0 ? Object.entries(request.responseHeaders).map(([key, value]) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
349
+ key: key,
350
+ style: [styles.headerRow, {
351
+ borderBottomColor: theme.border
352
+ }]
353
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
354
+ style: [styles.headerKey, {
355
+ color: theme.accent
356
+ }]
357
+ }, key), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
358
+ style: [styles.headerValue, {
359
+ color: theme.text
360
+ }],
361
+ selectable: true
362
+ }, value))) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
363
+ style: [styles.emptyText, {
364
+ color: theme.textMuted
365
+ }]
366
+ }, request.endTime ? 'No headers' : 'Pending...'));
367
+ const BodyView = ({
368
+ body,
369
+ theme,
370
+ label
371
+ }) => {
372
+ const formatted = (0, _react.useMemo)(() => {
373
+ if (!body) return null;
374
+ try {
375
+ const parsed = JSON.parse(body);
376
+ return JSON.stringify(parsed, null, 2);
377
+ } catch {
378
+ return body;
379
+ }
380
+ }, [body]);
381
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
382
+ style: styles.sectionContainer
383
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
384
+ style: styles.sectionHeaderRow
385
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
386
+ style: [styles.sectionTitle, {
387
+ color: theme.text
388
+ }]
389
+ }, label), formatted && /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
390
+ onPress: () => (0, _utils.copyToClipboard)(formatted),
391
+ activeOpacity: 0.7
392
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
393
+ style: [styles.copyButton, {
394
+ color: theme.accent
395
+ }]
396
+ }, "Copy"))), formatted ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
397
+ style: [styles.codeBlock, {
398
+ backgroundColor: theme.codeBackground
399
+ }]
400
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
401
+ style: [styles.codeText, {
402
+ color: theme.codeText
403
+ }],
404
+ selectable: true
405
+ }, formatted)) : /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
406
+ style: [styles.emptyText, {
407
+ color: theme.textMuted
408
+ }]
409
+ }, "No body"));
410
+ };
411
+ const TimingView = ({
412
+ request,
413
+ theme
414
+ }) => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
415
+ style: styles.sectionContainer
416
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
417
+ style: [styles.timingRow, {
418
+ borderBottomColor: theme.border
419
+ }]
420
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
421
+ style: [styles.timingLabel, {
422
+ color: theme.textSecondary
423
+ }]
424
+ }, "Started"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
425
+ style: [styles.timingValue, {
426
+ color: theme.text
427
+ }]
428
+ }, (0, _utils.formatTimestamp)(request.startTime))), request.endTime && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
429
+ style: [styles.timingRow, {
430
+ borderBottomColor: theme.border
431
+ }]
432
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
433
+ style: [styles.timingLabel, {
434
+ color: theme.textSecondary
435
+ }]
436
+ }, "Completed"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
437
+ style: [styles.timingValue, {
438
+ color: theme.text
439
+ }]
440
+ }, (0, _utils.formatTimestamp)(request.endTime))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
441
+ style: [styles.timingRow, {
442
+ borderBottomColor: theme.border
443
+ }]
444
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
445
+ style: [styles.timingLabel, {
446
+ color: theme.textSecondary
447
+ }]
448
+ }, "Duration"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
449
+ style: [styles.timingValue, {
450
+ color: request.duration && request.duration > 3000 ? theme.warning : theme.success
451
+ }]
452
+ }, (0, _utils.formatDuration)(request.duration))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
453
+ style: [styles.timingRow, {
454
+ borderBottomColor: theme.border
455
+ }]
456
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
457
+ style: [styles.timingLabel, {
458
+ color: theme.textSecondary
459
+ }]
460
+ }, "Request Size"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
461
+ style: [styles.timingValue, {
462
+ color: theme.text
463
+ }]
464
+ }, (0, _utils.formatBytes)(request.requestSize))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
465
+ style: [styles.timingRow, {
466
+ borderBottomColor: theme.border
467
+ }]
468
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
469
+ style: [styles.timingLabel, {
470
+ color: theme.textSecondary
471
+ }]
472
+ }, "Response Size"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
473
+ style: [styles.timingValue, {
474
+ color: theme.text
475
+ }]
476
+ }, (0, _utils.formatBytes)(request.responseSize))));
477
+
478
+ // ─── Styles ─────────────────────────────────────────────────────────────────
479
+
480
+ const styles = _reactNative.StyleSheet.create({
481
+ container: {
482
+ flex: 1
483
+ },
484
+ statsBar: {
485
+ flexDirection: 'row',
486
+ justifyContent: 'space-between',
487
+ alignItems: 'center',
488
+ paddingHorizontal: 12,
489
+ paddingVertical: 8
490
+ },
491
+ statsRow: {
492
+ flexDirection: 'row',
493
+ gap: 12
494
+ },
495
+ statText: {
496
+ fontSize: 12,
497
+ fontWeight: '600'
498
+ },
499
+ clearButton: {
500
+ fontSize: 13,
501
+ fontWeight: '700'
502
+ },
503
+ searchContainer: {
504
+ paddingHorizontal: 12,
505
+ paddingBottom: 8
506
+ },
507
+ searchInput: {
508
+ height: 36,
509
+ borderRadius: 8,
510
+ paddingHorizontal: 12,
511
+ fontSize: 13,
512
+ borderWidth: 1
513
+ },
514
+ filterContainer: {
515
+ maxHeight: 44
516
+ },
517
+ filterContent: {
518
+ paddingHorizontal: 12,
519
+ paddingBottom: 8,
520
+ gap: 6
521
+ },
522
+ filterChip: {
523
+ paddingHorizontal: 12,
524
+ paddingVertical: 4,
525
+ borderRadius: 12,
526
+ borderWidth: 1
527
+ },
528
+ filterChipText: {
529
+ fontSize: 11,
530
+ fontWeight: '600'
531
+ },
532
+ requestRow: {
533
+ flexDirection: 'row',
534
+ justifyContent: 'space-between',
535
+ alignItems: 'center',
536
+ paddingHorizontal: 12,
537
+ paddingVertical: 10,
538
+ borderBottomWidth: _reactNative.StyleSheet.hairlineWidth
539
+ },
540
+ requestRowLeft: {
541
+ flex: 1,
542
+ marginRight: 8
543
+ },
544
+ requestRowRight: {
545
+ alignItems: 'flex-end'
546
+ },
547
+ requestMethodContainer: {
548
+ flexDirection: 'row',
549
+ alignItems: 'center',
550
+ gap: 8,
551
+ marginBottom: 2
552
+ },
553
+ requestMethod: {
554
+ fontSize: 11,
555
+ fontWeight: '800',
556
+ letterSpacing: 0.5
557
+ },
558
+ requestStatus: {
559
+ fontSize: 11,
560
+ fontWeight: '700'
561
+ },
562
+ requestUrl: {
563
+ fontSize: 12
564
+ },
565
+ requestDuration: {
566
+ fontSize: 11,
567
+ fontWeight: '600'
568
+ },
569
+ requestSize: {
570
+ fontSize: 10,
571
+ marginTop: 1
572
+ },
573
+ requestTime: {
574
+ fontSize: 10,
575
+ marginTop: 1
576
+ },
577
+ emptyContainer: {
578
+ alignItems: 'center',
579
+ paddingVertical: 40
580
+ },
581
+ emptyText: {
582
+ fontSize: 13
583
+ },
584
+ detailHeader: {
585
+ flexDirection: 'row',
586
+ justifyContent: 'space-between',
587
+ alignItems: 'center',
588
+ paddingHorizontal: 12,
589
+ paddingVertical: 10,
590
+ borderBottomWidth: _reactNative.StyleSheet.hairlineWidth
591
+ },
592
+ backButton: {
593
+ fontSize: 14,
594
+ fontWeight: '600'
595
+ },
596
+ detailActions: {
597
+ flexDirection: 'row',
598
+ gap: 8
599
+ },
600
+ actionButton: {
601
+ paddingHorizontal: 10,
602
+ paddingVertical: 4,
603
+ borderRadius: 8
604
+ },
605
+ actionButtonText: {
606
+ fontSize: 11,
607
+ fontWeight: '600'
608
+ },
609
+ urlDisplay: {
610
+ padding: 12,
611
+ flexDirection: 'row',
612
+ alignItems: 'flex-start',
613
+ gap: 8
614
+ },
615
+ urlMethod: {
616
+ fontSize: 12,
617
+ fontWeight: '800'
618
+ },
619
+ urlText: {
620
+ fontSize: 11,
621
+ flex: 1
622
+ },
623
+ detailTabBar: {
624
+ flexDirection: 'row'
625
+ },
626
+ detailTab: {
627
+ flex: 1,
628
+ alignItems: 'center',
629
+ paddingVertical: 10,
630
+ borderBottomWidth: 2
631
+ },
632
+ detailTabText: {
633
+ fontSize: 12,
634
+ fontWeight: '600'
635
+ },
636
+ detailContent: {
637
+ flex: 1
638
+ },
639
+ sectionContainer: {
640
+ padding: 12
641
+ },
642
+ sectionTitle: {
643
+ fontSize: 14,
644
+ fontWeight: '700',
645
+ marginBottom: 8
646
+ },
647
+ sectionHeaderRow: {
648
+ flexDirection: 'row',
649
+ justifyContent: 'space-between',
650
+ alignItems: 'center',
651
+ marginBottom: 8
652
+ },
653
+ copyButton: {
654
+ fontSize: 12,
655
+ fontWeight: '600'
656
+ },
657
+ headerRow: {
658
+ flexDirection: 'row',
659
+ paddingVertical: 6,
660
+ borderBottomWidth: _reactNative.StyleSheet.hairlineWidth
661
+ },
662
+ headerKey: {
663
+ fontSize: 11,
664
+ fontWeight: '600',
665
+ width: 120,
666
+ marginRight: 8
667
+ },
668
+ headerValue: {
669
+ fontSize: 11,
670
+ flex: 1
671
+ },
672
+ codeBlock: {
673
+ padding: 12,
674
+ borderRadius: 8
675
+ },
676
+ codeText: {
677
+ fontSize: 11,
678
+ fontFamily: 'monospace',
679
+ lineHeight: 18
680
+ },
681
+ timingRow: {
682
+ flexDirection: 'row',
683
+ justifyContent: 'space-between',
684
+ paddingVertical: 10,
685
+ borderBottomWidth: _reactNative.StyleSheet.hairlineWidth
686
+ },
687
+ timingLabel: {
688
+ fontSize: 13
689
+ },
690
+ timingValue: {
691
+ fontSize: 13,
692
+ fontWeight: '600'
693
+ }
694
+ });
695
+
696
+ // ─── Plugin Factory ─────────────────────────────────────────────────────────
697
+
698
+ function createNetworkInspectorPlugin() {
699
+ return {
700
+ id: 'network-inspector',
701
+ name: 'Network',
702
+ icon: '🌐',
703
+ component: NetworkInspectorPanel,
704
+ order: 10,
705
+ onInit: () => _NetworkInterceptor.NetworkInterceptor.start(),
706
+ onDestroy: () => _NetworkInterceptor.NetworkInterceptor.stop()
707
+ };
708
+ }
709
+ //# sourceMappingURL=NetworkInspectorPlugin.js.map