@buoy-gg/network 7.0.41 → 7.0.43

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 (272) hide show
  1. package/README.md +11 -85
  2. package/lib/commonjs/index.js +1 -332
  3. package/lib/commonjs/index.web.js +1 -420
  4. package/lib/commonjs/network/components/DataViewer.web.js +1 -879
  5. package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
  6. package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
  7. package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
  8. package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
  9. package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
  10. package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
  11. package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
  12. package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
  13. package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
  14. package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
  15. package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
  16. package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
  17. package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
  18. package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
  19. package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
  20. package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
  21. package/lib/commonjs/network/components/NetworkListScreen.js +1 -403
  22. package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -624
  23. package/lib/commonjs/network/components/NetworkModal.js +1 -786
  24. package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
  25. package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
  26. package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
  27. package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
  28. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
  29. package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
  30. package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
  31. package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
  32. package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
  33. package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
  34. package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
  35. package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
  36. package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
  37. package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
  38. package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
  39. package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
  40. package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
  41. package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
  42. package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
  43. package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
  44. package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
  45. package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
  46. package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
  47. package/lib/commonjs/network/conditions/store.js +1 -75
  48. package/lib/commonjs/network/conditions/wait.js +1 -43
  49. package/lib/commonjs/network/conditions/xhr.js +1 -135
  50. package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
  51. package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
  52. package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
  53. package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
  54. package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
  55. package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
  56. package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
  57. package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
  58. package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
  59. package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
  60. package/lib/commonjs/network/overrides/applyToXhr.js +2 -510
  61. package/lib/commonjs/network/overrides/engine.js +1 -93
  62. package/lib/commonjs/network/overrides/matchRule.js +1 -87
  63. package/lib/commonjs/network/overrides/overriddenRows.js +1 -37
  64. package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
  65. package/lib/commonjs/network/overrides/presets.js +1 -70
  66. package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
  67. package/lib/commonjs/network/overrides/types.js +1 -90
  68. package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
  69. package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
  70. package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
  71. package/lib/commonjs/network/types/index.js +1 -5
  72. package/lib/commonjs/network/utils/extractOperationName.js +1 -80
  73. package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
  74. package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
  75. package/lib/commonjs/network/utils/formatting.js +1 -30
  76. package/lib/commonjs/network/utils/generateCurl.js +2 -71
  77. package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
  78. package/lib/commonjs/network/utils/httpCompletion.js +1 -37
  79. package/lib/commonjs/network/utils/networkEventStore.js +1 -411
  80. package/lib/commonjs/network/utils/networkListener.js +4 -1352
  81. package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
  82. package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
  83. package/lib/commonjs/network/utils/realNow.js +1 -0
  84. package/lib/commonjs/network/utils/requestId.js +1 -16
  85. package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -15
  86. package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
  87. package/lib/commonjs/network/utils/startNetworkCapture.js +1 -24
  88. package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
  89. package/lib/commonjs/preset.js +1 -93
  90. package/lib/module/index.js +1 -104
  91. package/lib/module/index.web.js +1 -82
  92. package/lib/module/network/components/DataViewer.web.js +1 -875
  93. package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
  94. package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
  95. package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
  96. package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
  97. package/lib/module/network/components/NetworkDetailStepper.js +1 -104
  98. package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
  99. package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
  100. package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
  101. package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
  102. package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
  103. package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
  104. package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
  105. package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
  106. package/lib/module/network/components/NetworkHeaderLive.js +1 -366
  107. package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
  108. package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
  109. package/lib/module/network/components/NetworkListScreen.js +1 -399
  110. package/lib/module/network/components/NetworkListScreen.web.js +1 -622
  111. package/lib/module/network/components/NetworkModal.js +1 -781
  112. package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
  113. package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
  114. package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
  115. package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
  116. package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
  117. package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
  118. package/lib/module/network/components/NetworkOverridesButton.js +1 -87
  119. package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
  120. package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
  121. package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
  122. package/lib/module/network/components/NetworkSavedScreen.js +1 -222
  123. package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
  124. package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
  125. package/lib/module/network/components/response-editor/Explorer.js +1 -972
  126. package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
  127. package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
  128. package/lib/module/network/components/response-editor/editorContext.js +1 -29
  129. package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
  130. package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
  131. package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
  132. package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
  133. package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
  134. package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
  135. package/lib/module/network/conditions/store.js +1 -65
  136. package/lib/module/network/conditions/wait.js +1 -38
  137. package/lib/module/network/conditions/xhr.js +1 -131
  138. package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
  139. package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
  140. package/lib/module/network/hooks/useNetworkEventList.js +1 -104
  141. package/lib/module/network/hooks/useNetworkEvents.js +1 -314
  142. package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
  143. package/lib/module/network/hooks/useNetworkSaved.js +1 -34
  144. package/lib/module/network/hooks/useNetworkSelection.js +1 -46
  145. package/lib/module/network/hooks/useOverrideRules.js +1 -32
  146. package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
  147. package/lib/module/network/overrides/applyToFetch.js +1 -72
  148. package/lib/module/network/overrides/applyToXhr.js +2 -502
  149. package/lib/module/network/overrides/engine.js +1 -85
  150. package/lib/module/network/overrides/matchRule.js +1 -81
  151. package/lib/module/network/overrides/overriddenRows.js +1 -33
  152. package/lib/module/network/overrides/overrideRulesStore.js +1 -547
  153. package/lib/module/network/overrides/presets.js +1 -65
  154. package/lib/module/network/overrides/resolveOverride.js +1 -152
  155. package/lib/module/network/overrides/types.js +1 -86
  156. package/lib/module/network/sync/networkBodyResolver.js +1 -34
  157. package/lib/module/network/sync/networkSyncAdapter.js +1 -880
  158. package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
  159. package/lib/module/network/types/index.js +1 -3
  160. package/lib/module/network/utils/extractOperationName.js +1 -76
  161. package/lib/module/network/utils/filterNetworkEvents.js +1 -92
  162. package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
  163. package/lib/module/network/utils/formatting.js +1 -9
  164. package/lib/module/network/utils/generateCurl.js +2 -67
  165. package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
  166. package/lib/module/network/utils/httpCompletion.js +1 -32
  167. package/lib/module/network/utils/networkEventStore.js +1 -409
  168. package/lib/module/network/utils/networkListener.js +4 -1341
  169. package/lib/module/network/utils/networkSavedStore.js +3 -572
  170. package/lib/module/network/utils/networkSelectionStore.js +1 -188
  171. package/lib/module/network/utils/realNow.js +1 -0
  172. package/lib/module/network/utils/requestId.js +1 -12
  173. package/lib/module/network/utils/resolveRequestUrl.js +1 -11
  174. package/lib/module/network/utils/selectSavedEvents.js +1 -35
  175. package/lib/module/network/utils/startNetworkCapture.js +1 -21
  176. package/lib/module/network/utils/withPinnedFirst.js +1 -28
  177. package/lib/module/preset.js +1 -91
  178. package/lib/typescript/network/overrides/engine.d.ts +1 -1
  179. package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
  180. package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
  181. package/lib/typescript/network/overrides/types.d.ts +9 -0
  182. package/lib/typescript/network/utils/networkListener.d.ts +11 -0
  183. package/lib/typescript/network/utils/realNow.d.ts +18 -0
  184. package/lib/web/index.mjs +73 -74
  185. package/package.json +3 -6
  186. package/lib/typescript/index.d.ts.map +0 -1
  187. package/lib/typescript/index.web.d.ts.map +0 -1
  188. package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
  189. package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
  190. package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
  191. package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
  192. package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
  193. package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
  194. package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
  195. package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
  196. package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
  197. package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
  198. package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
  199. package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
  200. package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
  201. package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
  202. package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
  203. package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
  204. package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
  205. package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
  206. package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
  207. package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
  208. package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
  209. package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
  210. package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
  211. package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
  212. package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
  213. package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
  214. package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
  215. package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
  216. package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
  217. package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
  218. package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
  219. package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
  220. package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
  221. package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
  222. package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
  223. package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
  224. package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
  225. package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
  226. package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
  227. package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
  228. package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
  229. package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
  230. package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
  231. package/lib/typescript/network/conditions/store.d.ts.map +0 -1
  232. package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
  233. package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
  234. package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
  235. package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
  236. package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
  237. package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
  238. package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
  239. package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
  240. package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
  241. package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
  242. package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
  243. package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
  244. package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
  245. package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
  246. package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
  247. package/lib/typescript/network/overrides/overriddenRows.d.ts.map +0 -1
  248. package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
  249. package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
  250. package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
  251. package/lib/typescript/network/overrides/types.d.ts.map +0 -1
  252. package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
  253. package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
  254. package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
  255. package/lib/typescript/network/types/index.d.ts.map +0 -1
  256. package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
  257. package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
  258. package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
  259. package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
  260. package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
  261. package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
  262. package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
  263. package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
  264. package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
  265. package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
  266. package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
  267. package/lib/typescript/network/utils/requestId.d.ts.map +0 -1
  268. package/lib/typescript/network/utils/resolveRequestUrl.d.ts.map +0 -1
  269. package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
  270. package/lib/typescript/network/utils/startNetworkCapture.d.ts.map +0 -1
  271. package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
  272. package/lib/typescript/preset.d.ts.map +0 -1
@@ -1,314 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * Hook for accessing network events and controls
5
- *
6
- * Uses self-managing Subscribable pattern - the network listener automatically
7
- * starts when this hook mounts and stops when all subscribers unmount.
8
- */
9
-
10
- import { useState, useEffect, useCallback, useMemo, useRef } from "react";
11
- import { networkEventStore } from "../utils/networkEventStore";
12
- import { useLimit, TIER_LIMITS } from "@buoy-gg/shared-ui";
13
- import { searchGraphQLVariables } from "../utils/formatGraphQLVariables";
14
-
15
- /**
16
- * @deprecated Read the live limit with `useLimit("network.requests")` — this
17
- * only reports the FREE tier's value and ignores the Weekend Pass. Kept
18
- * because it is part of the package's public exports.
19
- */
20
- export const FREE_TIER_REQUEST_LIMIT = TIER_LIMITS["network.requests"].free;
21
-
22
- /**
23
- * Custom hook for accessing network events and controls
24
- *
25
- * This hook provides a complete interface for network monitoring, including
26
- * event filtering, statistics calculation, and interception control.
27
- *
28
- * The network listener automatically starts when this hook mounts and stops
29
- * when all components using it unmount (Subscribable pattern from TanStack Query).
30
- *
31
- * @returns Object containing filtered events, statistics, controls, and utilities
32
- *
33
- * @example
34
- * ```typescript
35
- * function NetworkMonitor() {
36
- * const {
37
- * events,
38
- * stats,
39
- * filter,
40
- * setFilter,
41
- * clearEvents,
42
- * isCapturing
43
- * } = useNetworkEvents();
44
- *
45
- * return (
46
- * <div>
47
- * <p>Total requests: {stats.totalRequests}</p>
48
- * <p>Success rate: {stats.successfulRequests}/{stats.totalRequests}</p>
49
- * <p>Capturing: {isCapturing ? 'Yes' : 'No'}</p>
50
- * </div>
51
- * );
52
- * }
53
- * ```
54
- *
55
- * @performance Uses memoization for expensive filtering and statistics calculations
56
- * @performance Optimizes string operations and array processing for large datasets
57
- * @performance Includes Set-based lookups for O(1) filter matching
58
- *
59
- * @param options.isPro - Force the unlimited view. Defaults to false, in
60
- * which case the current tier's limit from `useLimit("network.requests")`
61
- * applies.
62
- */
63
- export function useNetworkEvents(options = {}) {
64
- const {
65
- isPro = false
66
- } = options;
67
- const tierLimit = useLimit("network.requests");
68
- // `isPro` stays an option so callers can force the unlimited view.
69
- const requestLimit = isPro ? Infinity : tierLimit;
70
- const [events, setEvents] = useState([]);
71
- const [filter, setFilter] = useState({});
72
- const [isCapturing, setIsCapturing] = useState(true);
73
- const unsubscribeRef = useRef(null);
74
-
75
- // Subscribe/unsubscribe to event store based on isCapturing state.
76
- // Each subscriber is independent — pausing this hook's subscription
77
- // does not affect other subscribers (e.g. the events tool).
78
- useEffect(() => {
79
- if (isCapturing) {
80
- unsubscribeRef.current = networkEventStore.subscribeToEvents(setEvents);
81
- }
82
- return () => {
83
- if (unsubscribeRef.current) {
84
- unsubscribeRef.current();
85
- unsubscribeRef.current = null;
86
- }
87
- };
88
- }, [isCapturing]);
89
-
90
- // Clear all events (also update local state in case we're paused/unsubscribed)
91
- const clearEvents = useCallback(() => {
92
- networkEventStore.clearEvents();
93
- setEvents([]);
94
- }, []);
95
-
96
- // Pause: unsubscribe this hook from the store (other subscribers unaffected)
97
- const pauseCapturing = useCallback(() => {
98
- setIsCapturing(false);
99
- }, []);
100
-
101
- // Resume: resubscribe this hook to the store
102
- const resumeCapturing = useCallback(() => {
103
- setIsCapturing(true);
104
- }, []);
105
-
106
- // Memoize search text processing to avoid repeated toLowerCase calls
107
- // Performance: Expensive string operations repeated for every event on every filter
108
- const searchLower = useMemo(() => {
109
- return filter.searchText ? filter.searchText.toLowerCase() : null;
110
- }, [filter.searchText]);
111
-
112
- // Memoize method filter Set for O(1) lookup instead of Array.includes
113
- // Performance: Converting array.includes to Set.has for faster lookups with large method lists
114
- const methodSet = useMemo(() => {
115
- return filter.method && filter.method.length > 0 ? new Set(filter.method) : null;
116
- }, [filter.method]);
117
-
118
- // Memoize content type Set for O(1) lookup
119
- // Performance: Converting array.some to Set.has for faster content type matching
120
- const contentTypeSet = useMemo(() => {
121
- return filter.contentType && filter.contentType.length > 0 ? new Set(filter.contentType) : null;
122
- }, [filter.contentType]);
123
-
124
- // Filter events with optimized string operations and Set lookups
125
- // Performance: Complex multi-stage filtering with string operations and content type matching
126
- const filteredEvents = useMemo(() => {
127
- let filtered = [...events];
128
- if (methodSet) {
129
- filtered = filtered.filter(e => methodSet.has(e.method));
130
- }
131
- if (filter.status && filter.status !== "all") {
132
- switch (filter.status) {
133
- case "success":
134
- filtered = filtered.filter(e => e.status && e.status >= 200 && e.status < 300);
135
- break;
136
- case "error":
137
- filtered = filtered.filter(e => e.error || e.status && e.status >= 400);
138
- break;
139
- case "pending":
140
- filtered = filtered.filter(e => !e.status && !e.error);
141
- break;
142
- }
143
- }
144
- if (searchLower) {
145
- filtered = filtered.filter(e => e.url.toLowerCase().includes(searchLower) || e.method.toLowerCase().includes(searchLower) || e.path?.toLowerCase().includes(searchLower) || e.host?.toLowerCase().includes(searchLower) || e.error && e.error.toLowerCase().includes(searchLower) ||
146
- // Search by GraphQL operation name (e.g., "GetUser", "CreatePost")
147
- e.operationName && e.operationName.toLowerCase().includes(searchLower) ||
148
- // Search by GraphQL variable values (e.g., "Sandshrew", "123", "true")
149
- // This enables finding specific requests like "GetPokemon › Sandshrew" by typing "Sandshrew"
150
- searchGraphQLVariables(e.graphqlVariables, searchLower));
151
- }
152
- if (filter.host) {
153
- filtered = filtered.filter(e => e.host === filter.host);
154
- }
155
- if (contentTypeSet) {
156
- filtered = filtered.filter(e => {
157
- const headers = e.responseHeaders || e.requestHeaders;
158
- const contentType = headers?.["content-type"] || headers?.["Content-Type"] || "";
159
- for (const type of contentTypeSet) {
160
- switch (type) {
161
- case "JSON":
162
- if (contentType.includes("json")) return true;
163
- break;
164
- case "XML":
165
- if (contentType.includes("xml")) return true;
166
- break;
167
- case "HTML":
168
- if (contentType.includes("html")) return true;
169
- break;
170
- case "TEXT":
171
- if (contentType.includes("text")) return true;
172
- break;
173
- case "IMAGE":
174
- if (contentType.includes("image")) return true;
175
- break;
176
- case "VIDEO":
177
- if (contentType.includes("video")) return true;
178
- break;
179
- case "AUDIO":
180
- if (contentType.includes("audio")) return true;
181
- break;
182
- case "FORM":
183
- if (contentType.includes("form")) return true;
184
- break;
185
- case "OTHER":
186
- if (!contentType || !contentType.includes("json") && !contentType.includes("xml") && !contentType.includes("html") && !contentType.includes("text") && !contentType.includes("image") && !contentType.includes("video") && !contentType.includes("audio") && !contentType.includes("form")) {
187
- return true;
188
- }
189
- break;
190
- }
191
- }
192
- return false;
193
- });
194
- }
195
- return filtered;
196
- }, [events, filter, searchLower, methodSet, contentTypeSet]);
197
-
198
- // Events beyond the tier limit are "locked". Keyed off the ORIGINAL event
199
- // order, not the filtered results, so locked events stay locked when
200
- // searching. slice(Infinity) is empty, so Pro locks nothing.
201
- const lockedEventIds = useMemo(() => {
202
- const lockedIds = new Set();
203
- events.slice(requestLimit).forEach(event => {
204
- lockedIds.add(event.id);
205
- });
206
- return lockedIds;
207
- }, [events, requestLimit]);
208
-
209
- // Check if there are locked events in the current filtered results
210
- const lockedEventsInFilter = useMemo(() => {
211
- return filteredEvents.filter(event => lockedEventIds.has(event.id));
212
- }, [filteredEvents, lockedEventIds]);
213
- const hasLockedEvents = lockedEventsInFilter.length > 0;
214
- const lockedEventCount = lockedEventsInFilter.length;
215
-
216
- // Helper to check if a specific event is locked
217
- const isEventLocked = useCallback(eventId => {
218
- return lockedEventIds.has(eventId);
219
- }, [lockedEventIds]);
220
-
221
- // Memoize expensive statistics calculation by categorizing events in single pass
222
- // Performance: Multiple array.filter operations replaced with single loop for better performance
223
- const stats = useMemo(() => {
224
- let successful = 0;
225
- let failed = 0;
226
- let pending = 0;
227
- let totalSent = 0;
228
- let totalReceived = 0;
229
- let durationSum = 0;
230
- let durationCount = 0;
231
-
232
- // Single pass through events for all statistics
233
- for (const event of events) {
234
- // Categorize status
235
- if (event.status && event.status >= 200 && event.status < 300) {
236
- successful++;
237
- } else if (event.error || event.status && event.status >= 400) {
238
- failed++;
239
- } else if (!event.status && !event.error) {
240
- pending++;
241
- }
242
-
243
- // Accumulate data sizes
244
- totalSent += event.requestSize || 0;
245
- totalReceived += event.responseSize || 0;
246
-
247
- // Accumulate durations
248
- if (event.duration) {
249
- durationSum += event.duration;
250
- durationCount++;
251
- }
252
- }
253
- const avgDuration = durationCount > 0 ? durationSum / durationCount : 0;
254
- return {
255
- totalRequests: events.length,
256
- successfulRequests: successful,
257
- failedRequests: failed,
258
- pendingRequests: pending,
259
- totalDataSent: totalSent,
260
- totalDataReceived: totalReceived,
261
- averageDuration: Math.round(avgDuration)
262
- };
263
- }, [events]);
264
-
265
- // Memoize unique hosts extraction with single pass instead of map + filter + Set
266
- // Performance: Avoiding array.map().filter() chain, using single loop with Set for deduplication
267
- const hosts = useMemo(() => {
268
- const hostSet = new Set();
269
- for (const event of events) {
270
- if (event.host) {
271
- hostSet.add(event.host);
272
- }
273
- }
274
- return Array.from(hostSet);
275
- }, [events]);
276
-
277
- // Memoize unique methods extraction with single pass
278
- // Performance: Avoiding array.map() + Set constructor, using single loop for better performance
279
- const methods = useMemo(() => {
280
- const methodSet = new Set();
281
- for (const event of events) {
282
- methodSet.add(event.method);
283
- }
284
- return Array.from(methodSet);
285
- }, [events]);
286
- return {
287
- /** Filtered events (all shown, but some may be locked for free users) */
288
- events: filteredEvents,
289
- /** All events before filtering (for stats) */
290
- allEvents: events,
291
- stats,
292
- filter,
293
- setFilter,
294
- clearEvents,
295
- /** Whether this hook is subscribed and receiving network events */
296
- isCapturing,
297
- /** Unsubscribe this hook from the network store (other subscribers unaffected) */
298
- pauseCapturing,
299
- /** Resubscribe this hook to the network store */
300
- resumeCapturing,
301
- hosts,
302
- methods,
303
- /** Whether there are locked events due to free tier limit */
304
- hasLockedEvents,
305
- /** Number of events locked due to free tier limit */
306
- lockedEventCount,
307
- /** Check if a specific event is locked (by ID) */
308
- isEventLocked,
309
- /** The live request limit for this tier (Infinity when unlimited). */
310
- requestLimit,
311
- /** Get subscriber counts for debugging */
312
- getSubscriberCounts: () => networkEventStore.getSubscriberCounts()
313
- };
314
- }
1
+ "use strict";import{useState as k,useEffect as V,useCallback as f,useMemo as a,useRef as j}from"react";import{networkEventStore as S}from"../utils/networkEventStore";import{useLimit as z,TIER_LIMITS as G}from"@buoy-gg/shared-ui";import{searchGraphQLVariables as Q}from"../utils/formatGraphQLVariables";export const FREE_TIER_REQUEST_LIMIT=G["network.requests"].free;export function useNetworkEvents(C={}){const{isPro:I=false}=C;const R=z("network.requests");const h=I?Infinity:R;const[n,T]=k([]);const[r,y]=k({});const[m,g]=k(true);const c=j(null);V(()=>{if(m){c.current=S.subscribeToEvents(T)}return()=>{if(c.current){c.current();c.current=null}}},[m]);const q=f(()=>{S.clearEvents();T([])},[]);const x=f(()=>{g(false)},[]);const M=f(()=>{g(true)},[]);const u=a(()=>{return r.searchText?r.searchText.toLowerCase():null},[r.searchText]);const p=a(()=>{return r.method&&r.method.length>0?new Set(r.method):null},[r.method]);const E=a(()=>{return r.contentType&&r.contentType.length>0?new Set(r.contentType):null},[r.contentType]);const v=a(()=>{let t=[...n];if(p){t=t.filter(e=>p.has(e.method))}if(r.status&&r.status!=="all"){switch(r.status){case"success":t=t.filter(e=>e.status&&e.status>=200&&e.status<300);break;case"error":t=t.filter(e=>e.error||e.status&&e.status>=400);break;case"pending":t=t.filter(e=>!e.status&&!e.error);break}}if(u){t=t.filter(e=>e.url.toLowerCase().includes(u)||e.method.toLowerCase().includes(u)||e.path?.toLowerCase().includes(u)||e.host?.toLowerCase().includes(u)||e.error&&e.error.toLowerCase().includes(u)||e.operationName&&e.operationName.toLowerCase().includes(u)||Q(e.graphqlVariables,u))}if(r.host){t=t.filter(e=>e.host===r.host)}if(E){t=t.filter(e=>{const i=e.responseHeaders||e.requestHeaders;const s=i?.["content-type"]||i?.["Content-Type"]||"";for(const d of E){switch(d){case"JSON":if(s.includes("json"))return true;break;case"XML":if(s.includes("xml"))return true;break;case"HTML":if(s.includes("html"))return true;break;case"TEXT":if(s.includes("text"))return true;break;case"IMAGE":if(s.includes("image"))return true;break;case"VIDEO":if(s.includes("video"))return true;break;case"AUDIO":if(s.includes("audio"))return true;break;case"FORM":if(s.includes("form"))return true;break;case"OTHER":if(!s||!s.includes("json")&&!s.includes("xml")&&!s.includes("html")&&!s.includes("text")&&!s.includes("image")&&!s.includes("video")&&!s.includes("audio")&&!s.includes("form")){return true}break}}return false})}return t},[n,r,u,p,E]);const l=a(()=>{const t=new Set;n.slice(h).forEach(e=>{t.add(e.id)});return t},[n,h]);const w=a(()=>{return v.filter(t=>l.has(t.id))},[v,l]);const D=w.length>0;const O=w.length;const A=f(t=>{return l.has(t)},[l]);const F=a(()=>{let t=0;let e=0;let i=0;let s=0;let d=0;let L=0;let b=0;for(const o of n){if(o.status&&o.status>=200&&o.status<300){t++}else if(o.error||o.status&&o.status>=400){e++}else if(!o.status&&!o.error){i++}s+=o.requestSize||0;d+=o.responseSize||0;if(o.duration){L+=o.duration;b++}}const _=b>0?L/b:0;return{totalRequests:n.length,successfulRequests:t,failedRequests:e,pendingRequests:i,totalDataSent:s,totalDataReceived:d,averageDuration:Math.round(_)}},[n]);const H=a(()=>{const t=new Set;for(const e of n){if(e.host){t.add(e.host)}}return Array.from(t)},[n]);const N=a(()=>{const t=new Set;for(const e of n){t.add(e.method)}return Array.from(t)},[n]);return{events:v,allEvents:n,stats:F,filter:r,setFilter:y,clearEvents:q,isCapturing:m,pauseCapturing:x,resumeCapturing:M,hosts:H,methods:N,hasLockedEvents:D,lockedEventCount:O,isEventLocked:A,requestLimit:h,getSubscriberCounts:()=>S.getSubscriberCounts()}}
@@ -1,52 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * Narrowest possible subscription: a BOOLEAN that flips when the store
5
- * goes between "has events matching this filter" and "empty". Used by
6
- * header buttons (clear/copy) whose only live dependency is their
7
- * enabled state — with the full counts hook they re-rendered on every
8
- * count change (32× in a 25-request run, tool-bench 2026-07-06); with a
9
- * flip-guarded boolean they render ~twice per session.
10
- */
11
-
12
- import { useEffect, useState } from "react";
13
- import { networkEventStore } from "../utils/networkEventStore";
14
- import { applyIgnoredPatterns, filterNetworkEvents } from "../utils/filterNetworkEvents";
15
-
16
- /** True while the store has ANY events (clear button's enabled state). */
17
- export function useNetworkHasEvents(options) {
18
- const {
19
- paused
20
- } = options;
21
- const [hasEvents, setHasEvents] = useState(() => networkEventStore.getEvents().length > 0);
22
- useEffect(() => {
23
- if (paused) return undefined;
24
- return networkEventStore.subscribeToEvents(events => {
25
- const next = events.length > 0;
26
- setHasEvents(prev => prev === next ? prev : next);
27
- });
28
- }, [paused]);
29
- useEffect(() => networkEventStore.onClear(() => setHasEvents(false)), []);
30
- return hasEvents;
31
- }
32
-
33
- /** True while the store has events matching the current filter (copy
34
- * button's enabled state). The filter pass runs per emission but a
35
- * re-render only happens when the boolean flips. */
36
- export function useNetworkHasMatches(options) {
37
- const {
38
- filter,
39
- ignoredPatterns,
40
- paused
41
- } = options;
42
- const [hasMatches, setHasMatches] = useState(() => filterNetworkEvents(applyIgnoredPatterns(networkEventStore.getEvents(), ignoredPatterns), filter).length > 0);
43
- useEffect(() => {
44
- if (paused) return undefined;
45
- return networkEventStore.subscribeToEvents(events => {
46
- const next = filterNetworkEvents(applyIgnoredPatterns(events, ignoredPatterns), filter).length > 0;
47
- setHasMatches(prev => prev === next ? prev : next);
48
- });
49
- }, [paused, filter, ignoredPatterns]);
50
- useEffect(() => networkEventStore.onClear(() => setHasMatches(false)), []);
51
- return hasMatches;
52
- }
1
+ "use strict";import{useEffect as a,useState as l}from"react";import{networkEventStore as t}from"../utils/networkEventStore";import{applyIgnoredPatterns as E,filterNetworkEvents as h}from"../utils/filterNetworkEvents";export function useNetworkHasEvents(u){const{paused:e}=u;const[n,s]=l(()=>t.getEvents().length>0);a(()=>{if(e)return void 0;return t.subscribeToEvents(c=>{const r=c.length>0;s(o=>o===r?o:r)})},[e]);a(()=>t.onClear(()=>s(false)),[]);return n}export function useNetworkHasMatches(u){const{filter:e,ignoredPatterns:n,paused:s}=u;const[c,r]=l(()=>h(E(t.getEvents(),n),e).length>0);a(()=>{if(s)return void 0;return t.subscribeToEvents(o=>{const f=h(E(o,n),e).length>0;r(i=>i===f?i:f)})},[s,e,n]);a(()=>t.onClear(()=>r(false)),[]);return c}
@@ -1,34 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * Narrow subscription to the pinned/saved store.
5
- *
6
- * The store rebuilds its derived view once per mutation, so the object this
7
- * returns keeps a stable identity between pins — memoized rows don't re-render
8
- * because a network event arrived, only because the user pinned something.
9
- *
10
- * Mutations happen through module-scope callbacks (stable identities), so
11
- * passing them into memoized rows costs nothing.
12
- */
13
-
14
- import { useEffect, useState } from "react";
15
- import { networkSavedStore } from "../utils/networkSavedStore";
16
- const togglePin = event => networkSavedStore.togglePin(event);
17
- const toggleSave = event => networkSavedStore.toggleSave(event);
18
- const remove = key => networkSavedStore.remove(key);
19
- const clearSaved = () => networkSavedStore.clearSaved();
20
- const clearPinned = () => networkSavedStore.clearPinned();
21
- export function useNetworkSaved() {
22
- const [state, setState] = useState(() => networkSavedStore.getState());
23
- useEffect(() => networkSavedStore.subscribe(() => {
24
- setState(networkSavedStore.getState());
25
- }), []);
26
- return {
27
- ...state,
28
- togglePin,
29
- toggleSave,
30
- remove,
31
- clearSaved,
32
- clearPinned
33
- };
34
- }
1
+ "use strict";import{useEffect as r,useState as n}from"react";import{networkSavedStore as e}from"../utils/networkSavedStore";const a=t=>e.togglePin(t);const s=t=>e.toggleSave(t);const c=t=>e.remove(t);const S=()=>e.clearSaved();const g=()=>e.clearPinned();export function useNetworkSaved(){const[t,o]=n(()=>e.getState());r(()=>e.subscribe(()=>{o(e.getState())}),[]);return{...t,togglePin:a,toggleSave:s,remove:c,clearSaved:S,clearPinned:g}}
@@ -1,46 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * Narrow subscriptions to the prev/next cursor (`networkSelectionStore`).
5
- *
6
- * One hook per consumer, each returning the SMALLEST value that consumer
7
- * renders — that is the whole point of moving the cursor into a store. The
8
- * modal root takes `useHasNetworkSelection()` (a boolean that flips twice a
9
- * session), so a step no longer re-renders `JsModal`, the header and all five
10
- * screens; the footer and the body take the parts that actually change.
11
- */
12
-
13
- import { useSyncExternalStore } from "react";
14
- import { networkSelectionStore } from "../utils/networkSelectionStore";
15
- const subscribe = onChange => networkSelectionStore.subscribe(onChange);
16
- const getState = () => networkSelectionStore.getState();
17
-
18
- /**
19
- * Is ANYTHING selected — i.e. is the detail screen up?
20
- *
21
- * `useSyncExternalStore` compares the selector's result, so the root only
22
- * re-renders when this boolean flips, not on every step.
23
- */
24
- export function useHasNetworkSelection() {
25
- return useSyncExternalStore(subscribe, () => getState().selectedId != null, () => getState().selectedId != null);
26
- }
27
-
28
- /** Where the USER is. Moves synchronously on tap — footer, header pin actions. */
29
- export function useSelectedNetworkEventId() {
30
- return useSyncExternalStore(subscribe, () => getState().selectedId, () => getState().selectedId);
31
- }
32
-
33
- /** What the BODY may render. Lags `selectedId` — see networkSelectionStore. */
34
- export function useNetworkBodyEventId() {
35
- return useSyncExternalStore(subscribe, () => getState().bodyId, () => getState().bodyId);
36
- }
37
-
38
- /** Cursor position + list length, for the "REQUEST n OF m" counter. */
39
- export function useNetworkCursor() {
40
- const index = useSyncExternalStore(subscribe, () => getState().index, () => getState().index);
41
- const total = useSyncExternalStore(subscribe, () => getState().ids.length, () => getState().ids.length);
42
- return {
43
- index,
44
- total
45
- };
46
- }
1
+ "use strict";import{useSyncExternalStore as t}from"react";import{networkSelectionStore as r}from"../utils/networkSelectionStore";const n=o=>r.subscribe(o);const e=()=>r.getState();export function useHasNetworkSelection(){return t(n,()=>e().selectedId!=null,()=>e().selectedId!=null)}export function useSelectedNetworkEventId(){return t(n,()=>e().selectedId,()=>e().selectedId)}export function useNetworkBodyEventId(){return t(n,()=>e().bodyId,()=>e().bodyId)}export function useNetworkCursor(){const o=t(n,()=>e().index,()=>e().index);const s=t(n,()=>e().ids.length,()=>e().ids.length);return{index:o,total:s}}
@@ -1,32 +1 @@
1
- "use strict";
2
-
3
- import { useCallback, useSyncExternalStore } from "react";
4
- import { overrideRulesStore } from "../overrides/overrideRulesStore";
5
- import { isSpent } from "../overrides/resolveOverride";
6
- /**
7
- * Read + mutate the override rule list.
8
- *
9
- * `useSyncExternalStore` over the store's own subscribe/getState, which already
10
- * hands out a stable state object per mutation (see `rebuild`) — so this can't
11
- * tear and doesn't need a selector to stay cheap.
12
- */
13
- export function useOverrideRules() {
14
- const state = useSyncExternalStore(useCallback(listener => overrideRulesStore.subscribe(listener), []), () => overrideRulesStore.getState(), () => overrideRulesStore.getState());
15
- const setEnabled = useCallback(enabled => overrideRulesStore.setEnabled(enabled), []);
16
- const upsertRule = useCallback(draft => overrideRulesStore.upsertRule(draft), []);
17
- const setRuleEnabled = useCallback((id, enabled) => overrideRulesStore.setRuleEnabled(id, enabled), []);
18
- const removeRule = useCallback(id => overrideRulesStore.removeRule(id), []);
19
- const clearRules = useCallback(() => overrideRulesStore.clearRules(), []);
20
- return {
21
- enabled: state.enabled,
22
- rules: state.rules,
23
- autoPaused: state.autoPaused,
24
- activeCount: overrideRulesStore.activeCount(),
25
- setEnabled,
26
- upsertRule,
27
- setRuleEnabled,
28
- removeRule,
29
- clearRules,
30
- isRuleSpent: isSpent
31
- };
32
- }
1
+ "use strict";import{useCallback as s,useSyncExternalStore as i}from"react";import{overrideRulesStore as t}from"../overrides/overrideRulesStore";import{isSpent as R}from"../overrides/resolveOverride";export function useOverrideRules(){const u=i(s(e=>t.subscribe(e),[]),()=>t.getState(),()=>t.getState());const r=s(e=>t.setEnabled(e),[]);const l=s(e=>t.upsertRule(e),[]);const o=s((e,c)=>t.setRuleEnabled(e,c),[]);const n=s(e=>t.removeRule(e),[]);const a=s(()=>t.clearRules(),[]);return{enabled:u.enabled,rules:u.rules,autoPaused:u.autoPaused,activeCount:t.activeCount(),setEnabled:r,upsertRule:l,setRuleEnabled:o,removeRule:n,clearRules:a,isRuleSpent:R}}
@@ -1,11 +1 @@
1
- "use strict";
2
-
3
- // Re-export TickProvider from shared package
4
- export { TickProvider } from "@buoy-gg/shared-ui";
5
-
6
- // Re-export useTick as useTickEveryMinute for backward compatibility.
7
- // Falls back to Date.now() when no provider is present (matches original behavior).
8
- import { useTick } from "@buoy-gg/shared-ui";
9
- export function useTickEveryMinute() {
10
- return useTick() ?? Date.now();
11
- }
1
+ "use strict";export{TickProvider}from"@buoy-gg/shared-ui";import{useTick as r}from"@buoy-gg/shared-ui";export function useTickEveryMinute(){return r()??Date.now()}
@@ -1,72 +1 @@
1
- "use strict";
2
-
3
- /**
4
- * Perform an override outcome against `fetch`.
5
- *
6
- * WHY THIS EXISTS — and why "XHR is the single choke point" is WRONG:
7
- *
8
- * In bare React Native, `Libraries/Network/fetch.js` is `require('whatwg-fetch')`,
9
- * so `fetch` really is a polyfill over XMLHttpRequest and hooking XHR alone
10
- * would cover everything. But **Expo replaces it**: `expo/src/winter/runtime.native.ts`
11
- * installs `expo/fetch` — a NATIVE fetch over `ExpoFetchModule` — as
12
- * `globalThis.fetch` unless `EXPO_PUBLIC_USE_RN_FETCH=1`. Those requests never
13
- * construct an XMLHttpRequest, so an XHR-only override silently does nothing on
14
- * the majority of real apps.
15
- *
16
- * Verified the hard way on Expo SDK 56 / RN 0.85.3: rule matched, engine
17
- * healthy, interceptor installed, and the request still came back a real 200.
18
- *
19
- * So overrides hook BOTH layers. `axios` still needs the XHR path (it uses
20
- * XMLHttpRequest on every platform), and this covers `fetch` on both flavours.
21
- */
22
-
23
- export const sleep = ms => ms > 0 ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve();
24
-
25
- /**
26
- * Can we build a `Response` in this runtime?
27
- *
28
- * React Native installs the whatwg-fetch `Response` global via `setUpXHR`, and
29
- * Expo deliberately keeps it (it only swaps `fetch`). Feature-detected anyway:
30
- * without it, the honest thing is to let the request run for real.
31
- */
32
- export function canSynthesizeResponse() {
33
- return typeof Response === "function";
34
- }
35
-
36
- /**
37
- * Build the fake `Response` an overridden `fetch` resolves with.
38
- *
39
- * Note the status range: whatwg-fetch's `Response` constructor THROWS
40
- * `RangeError` outside [200, 599], which would crash the caller instead of
41
- * overriding it. `resolveOverride` clamps before we ever get here.
42
- */
43
- export function synthesizeResponse(url, outcome) {
44
- const response = new Response(outcome.body, {
45
- status: outcome.status,
46
- statusText: outcome.statusText,
47
- headers: outcome.headers
48
- });
49
- // `Response.url` is not settable through the constructor, and consumers do
50
- // read it (redirect checks, cache keys). whatwg-fetch stores it as a plain
51
- // property, so assigning is both possible and correct.
52
- try {
53
- Object.defineProperty(response, "url", {
54
- value: url,
55
- configurable: true
56
- });
57
- } catch {
58
- // Sealed implementation — an empty url is cosmetic, not worth failing over.
59
- }
60
- return response;
61
- }
62
-
63
- /**
64
- * The error a failed `fetch` rejects with.
65
- *
66
- * These are the exact messages whatwg-fetch produces for a dead connection and
67
- * a timeout, so app code that string-matches on them (plenty does) behaves the
68
- * same way it would against a real failure.
69
- */
70
- export function synthesizeFetchError(outcome) {
71
- return new TypeError(outcome.failKind === "timeout" ? "Network request timed out" : "Network request failed");
72
- }
1
+ "use strict";export const sleep=e=>e>0?new Promise(t=>setTimeout(t,e)):Promise.resolve();export function canSynthesizeResponse(){return typeof Response==="function"}export function synthesizeResponse(e,t){const s=new Response(t.body,{status:t.status,statusText:t.statusText,headers:t.headers});try{Object.defineProperty(s,"url",{value:e,configurable:true})}catch{}return s}export function synthesizeFetchError(e){return new TypeError(e.failKind==="timeout"?"Network request timed out":"Network request failed")}