@rozenite/network-activity-plugin 1.0.0-alpha.9 → 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 (111) hide show
  1. package/README.md +2 -0
  2. package/dist/App.html +2 -2
  3. package/dist/assets/{App-DoHQsY5s.css → App-BrSkOkws.css} +223 -2
  4. package/dist/assets/{App-CA1Fbh0I.js → App-C6wCDVkW.js} +8157 -2677
  5. package/dist/react-native.cjs +4 -1
  6. package/dist/react-native.js +4 -1
  7. package/dist/rozenite.json +1 -1
  8. package/dist/src/react-native/config.d.ts +20 -0
  9. package/dist/src/react-native/http/overrides-registry.d.ts +6 -0
  10. package/dist/src/react-native/http/xhr-interceptor.d.ts +7 -1
  11. package/dist/src/react-native/sse/sse-interceptor.d.ts +2 -2
  12. package/dist/src/react-native/useNetworkActivityDevTools.d.ts +2 -1
  13. package/dist/src/react-native/utils/getBlobName.d.ts +35 -0
  14. package/dist/src/react-native/utils/getFormDataEntries.d.ts +18 -0
  15. package/dist/src/shared/client.d.ts +48 -4
  16. package/dist/src/shared/sse-events.d.ts +4 -1
  17. package/dist/src/ui/components/Button.d.ts +2 -2
  18. package/dist/src/ui/components/CodeBlock.d.ts +3 -0
  19. package/dist/src/ui/components/CodeEditor.d.ts +5 -0
  20. package/dist/src/ui/components/CookieCard.d.ts +7 -0
  21. package/dist/src/ui/components/CopyRequestDropdown.d.ts +7 -0
  22. package/dist/src/ui/components/DropdownMenu.d.ts +27 -0
  23. package/dist/src/ui/components/FilterBar.d.ts +10 -0
  24. package/dist/src/ui/components/JsonTreeCopyableItem.d.ts +1 -1
  25. package/dist/src/ui/components/KeyValueGrid.d.ts +13 -0
  26. package/dist/src/ui/components/OverrideResponse.d.ts +8 -0
  27. package/dist/src/ui/components/RequestBody.d.ts +6 -0
  28. package/dist/src/ui/components/RequestList.d.ts +9 -4
  29. package/dist/src/ui/components/ScrollArea.d.ts +3 -2
  30. package/dist/src/ui/components/Section.d.ts +8 -0
  31. package/dist/src/ui/components/Separator.d.ts +2 -1
  32. package/dist/src/ui/components/Tabs.d.ts +7 -0
  33. package/dist/src/ui/state/hooks.d.ts +4 -0
  34. package/dist/src/ui/state/model.d.ts +12 -7
  35. package/dist/src/ui/state/store.d.ts +27 -3
  36. package/dist/src/ui/utils/checkRequestBodyBinary.d.ts +2 -0
  37. package/dist/src/ui/utils/escapeShellArg.d.ts +1 -0
  38. package/dist/src/ui/utils/generateCurlCommand.d.ts +2 -0
  39. package/dist/src/ui/utils/generateFetchCall.d.ts +2 -0
  40. package/dist/src/ui/utils/generateMultipartBody.d.ts +4 -0
  41. package/dist/src/utils/applyReactNativeRequestHeadersLogic.d.ts +7 -0
  42. package/dist/src/utils/applyReactNativeResponseHeadersLogic.d.ts +9 -0
  43. package/dist/src/utils/cookieParser.d.ts +6 -0
  44. package/dist/src/utils/getContentTypeMimeType.d.ts +2 -0
  45. package/dist/src/utils/getHttpHeader.d.ts +5 -0
  46. package/dist/src/utils/getHttpHeaderValueAsString.d.ts +11 -0
  47. package/dist/src/utils/getStringSizeInBytes.d.ts +1 -0
  48. package/dist/src/utils/inferContentTypeFromPostData.d.ts +2 -0
  49. package/dist/src/utils/safeStringify.d.ts +1 -0
  50. package/dist/src/utils/typeChecks.d.ts +9 -0
  51. package/dist/useNetworkActivityDevTools.cjs +319 -24
  52. package/dist/useNetworkActivityDevTools.js +320 -25
  53. package/package.json +7 -4
  54. package/react-native.ts +6 -1
  55. package/src/react-native/config.ts +43 -0
  56. package/src/react-native/http/network-inspector.ts +170 -8
  57. package/src/react-native/http/overrides-registry.ts +32 -0
  58. package/src/react-native/http/xhr-interceptor.ts +19 -2
  59. package/src/react-native/sse/sse-inspector.ts +27 -5
  60. package/src/react-native/sse/sse-interceptor.ts +26 -8
  61. package/src/react-native/useNetworkActivityDevTools.ts +86 -8
  62. package/src/react-native/utils/getBlobName.ts +45 -0
  63. package/src/react-native/utils/getFormDataEntries.ts +32 -0
  64. package/src/react-native/utils.ts +3 -3
  65. package/src/shared/client.ts +73 -4
  66. package/src/shared/sse-events.ts +4 -1
  67. package/src/ui/components/Button.tsx +1 -0
  68. package/src/ui/components/CodeBlock.tsx +19 -0
  69. package/src/ui/components/CodeEditor.tsx +26 -0
  70. package/src/ui/components/CookieCard.tsx +64 -0
  71. package/src/ui/components/CopyRequestDropdown.tsx +95 -0
  72. package/src/ui/components/DropdownMenu.tsx +206 -0
  73. package/src/ui/components/FilterBar.tsx +117 -0
  74. package/src/ui/components/Input.tsx +1 -1
  75. package/src/ui/components/JsonTree.tsx +10 -3
  76. package/src/ui/components/JsonTreeCopyableItem.tsx +14 -10
  77. package/src/ui/components/KeyValueGrid.tsx +51 -0
  78. package/src/ui/components/OverrideResponse.tsx +132 -0
  79. package/src/ui/components/RequestBody.tsx +86 -0
  80. package/src/ui/components/RequestList.tsx +65 -13
  81. package/src/ui/components/ScrollArea.tsx +1 -0
  82. package/src/ui/components/Section.tsx +46 -0
  83. package/src/ui/components/SidePanel.tsx +15 -5
  84. package/src/ui/globals.css +4 -0
  85. package/src/ui/hooks/useCopyToClipboard.ts +2 -2
  86. package/src/ui/state/hooks.ts +8 -0
  87. package/src/ui/state/model.ts +18 -7
  88. package/src/ui/state/store.ts +610 -500
  89. package/src/ui/tabs/CookiesTab.tsx +60 -263
  90. package/src/ui/tabs/HeadersTab.tsx +78 -89
  91. package/src/ui/tabs/RequestTab.tsx +58 -46
  92. package/src/ui/tabs/ResponseTab.tsx +98 -67
  93. package/src/ui/tabs/SSEMessagesTab.tsx +50 -39
  94. package/src/ui/utils/checkRequestBodyBinary.ts +7 -0
  95. package/src/ui/utils/escapeShellArg.ts +12 -0
  96. package/src/ui/utils/generateCurlCommand.ts +83 -0
  97. package/src/ui/utils/generateFetchCall.ts +64 -0
  98. package/src/ui/utils/generateMultipartBody.ts +19 -0
  99. package/src/ui/views/InspectorView.tsx +15 -3
  100. package/src/utils/applyReactNativeRequestHeadersLogic.ts +30 -0
  101. package/src/utils/applyReactNativeResponseHeadersLogic.ts +28 -0
  102. package/src/utils/cookieParser.ts +126 -0
  103. package/src/utils/getContentTypeMimeType.ts +17 -0
  104. package/src/utils/getHttpHeader.ts +17 -0
  105. package/src/utils/getHttpHeaderValueAsString.ts +13 -0
  106. package/src/utils/getStringSizeInBytes.ts +3 -0
  107. package/src/utils/inferContentTypeFromPostData.ts +9 -0
  108. package/src/utils/safeStringify.ts +7 -0
  109. package/src/utils/typeChecks.ts +27 -0
  110. package/dist/src/ui/utils/getHttpHeaderValue.d.ts +0 -2
  111. package/src/ui/utils/getHttpHeaderValue.ts +0 -14
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  exports.useNetworkActivityDevTools = void 0;
4
- if (process.env.NODE_ENV !== "production") {
4
+ const isWeb = typeof window !== "undefined" && window.navigator.product !== "ReactNative";
5
+ const isDev = process.env.NODE_ENV !== "production";
6
+ const isServer = typeof window === "undefined";
7
+ if (isDev && !isWeb && !isServer) {
5
8
  exports.useNetworkActivityDevTools = require("./useNetworkActivityDevTools.cjs").useNetworkActivityDevTools;
6
9
  } else {
7
10
  exports.useNetworkActivityDevTools = () => null;
@@ -1,5 +1,8 @@
1
1
  let useNetworkActivityDevTools;
2
- if (process.env.NODE_ENV !== "production") {
2
+ const isWeb = typeof window !== "undefined" && window.navigator.product !== "ReactNative";
3
+ const isDev = process.env.NODE_ENV !== "production";
4
+ const isServer = typeof window === "undefined";
5
+ if (isDev && !isWeb && !isServer) {
3
6
  useNetworkActivityDevTools = require("./useNetworkActivityDevTools.js").useNetworkActivityDevTools;
4
7
  } else {
5
8
  useNetworkActivityDevTools = () => null;
@@ -1 +1 @@
1
- {"name":"@rozenite/network-activity-plugin","version":"1.0.0-alpha.8","description":"Network Activity for Rozenite.","panels":[{"name":"Network Activity","source":"/App.html"}]}
1
+ {"name":"@rozenite/network-activity-plugin","version":"1.0.0-alpha.16","description":"Network Activity for Rozenite.","panels":[{"name":"Network Activity","source":"/App.html"}]}
@@ -0,0 +1,20 @@
1
+ export type InspectorType = 'http' | 'websocket' | 'sse';
2
+ export type NetworkActivityDevToolsConfig = {
3
+ /**
4
+ * Specifies which network inspectors are enabled.
5
+ * Set to `false` to disable monitoring for a specific type of network traffic.
6
+ * @default { http: true, websocket: true, sse: true }
7
+ */
8
+ inspectors?: {
9
+ [key in InspectorType]?: boolean;
10
+ };
11
+ clientUISettings?: {
12
+ /**
13
+ * If true, display the entire relative URL as the request name in the UI instead of only the last path segment.
14
+ * @default false
15
+ */
16
+ showUrlAsName?: boolean;
17
+ };
18
+ };
19
+ export declare const DEFAULT_CONFIG: NetworkActivityDevToolsConfig;
20
+ export declare const validateConfig: (config: NetworkActivityDevToolsConfig) => void;
@@ -0,0 +1,6 @@
1
+ import { RequestOverride } from '../../shared/client';
2
+ export type OverridesRegistry = {
3
+ setOverrides: (newOverrides: [string, RequestOverride][]) => void;
4
+ getOverrideForUrl: (url: string) => RequestOverride | undefined;
5
+ };
6
+ export declare const getOverridesRegistry: () => OverridesRegistry;
@@ -1,8 +1,10 @@
1
+ import { XHRPostData } from '../../shared/client';
1
2
  type XHRInterceptorOpenCallback = (method: string, url: string, request: XMLHttpRequest) => void;
2
- type XHRInterceptorSendCallback = (data: string, request: XMLHttpRequest) => void;
3
+ type XHRInterceptorSendCallback = (data: XHRPostData, request: XMLHttpRequest) => void;
3
4
  type XHRInterceptorRequestHeaderCallback = (header: string, value: string, request: XMLHttpRequest) => void;
4
5
  type XHRInterceptorHeaderReceivedCallback = (responseContentType: string | undefined, responseSize: number | undefined, allHeaders: string, request: XMLHttpRequest) => void;
5
6
  type XHRInterceptorResponseCallback = (status: number, timeout: number, response: string, responseURL: string, responseType: string, request: XMLHttpRequest) => void;
7
+ type XHRInterceptorOverrideCallback = (request: XMLHttpRequest) => void;
6
8
  /**
7
9
  * A network interceptor which monkey-patches XMLHttpRequest methods
8
10
  * to gather all network requests/responses, in order to show their
@@ -31,6 +33,10 @@ export declare const XHRInterceptor: {
31
33
  * Invoked before XMLHttpRequest.setRequestHeader(...) is called.
32
34
  */
33
35
  setRequestHeaderCallback(callback: XHRInterceptorRequestHeaderCallback): void;
36
+ /**
37
+ * Invoked before XMLHttpRequest.send(...) is called.
38
+ */
39
+ setOverrideCallback(callback: XHRInterceptorOverrideCallback): void;
34
40
  isInterceptorEnabled(): boolean;
35
41
  enableInterception(): void;
36
42
  disableInterception(): void;
@@ -1,6 +1,6 @@
1
- import { default as EventSource, MessageEvent, ErrorEvent, OpenEvent, CloseEvent, TimeoutEvent, ExceptionEvent } from 'react-native-sse';
1
+ import { default as EventSource, MessageEvent, ErrorEvent, OpenEvent, CloseEvent, TimeoutEvent, ExceptionEvent, CustomEvent } from 'react-native-sse';
2
2
  export type SSEInterceptorConnectCallback = (url: string, request: EventSource) => void;
3
- export type SSEInterceptorMessageCallback = (event: MessageEvent, request: EventSource) => void;
3
+ export type SSEInterceptorMessageCallback = (event: MessageEvent | CustomEvent<string>, request: EventSource) => void;
4
4
  export type SSEInterceptorErrorCallback = (error: ErrorEvent | TimeoutEvent | ExceptionEvent, request: EventSource) => void;
5
5
  export type SSEInterceptorOpenEventCallback = (event: OpenEvent, request: EventSource) => void;
6
6
  export type SSEInterceptorCloseCallback = (event: CloseEvent, request: EventSource) => void;
@@ -1,2 +1,3 @@
1
1
  import { NetworkActivityEventMap } from '../shared/client';
2
- export declare const useNetworkActivityDevTools: () => import('@rozenite/plugin-bridge').RozeniteDevToolsClient<NetworkActivityEventMap> | null;
2
+ import { NetworkActivityDevToolsConfig } from './config';
3
+ export declare const useNetworkActivityDevTools: (config?: NetworkActivityDevToolsConfig) => import('@rozenite/plugin-bridge').RozeniteDevToolsClient<NetworkActivityEventMap> | null;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Utility function to get the name of a blob. Handles both the direct name property and the data object.
3
+ *
4
+ * ```
5
+ * // node_modules/react-native/Libraries/Blob/Blob.js
6
+ *
7
+ * export type BlobData = {
8
+ * blobId: string,
9
+ * offset: number,
10
+ * size: number,
11
+ * name?: string,
12
+ * type?: string,
13
+ * lastModified?: number,
14
+ * __collector?: ?BlobCollector,
15
+ * ...
16
+ * };
17
+ *
18
+ * get data(): BlobData {
19
+ * if (!this._data) {
20
+ * throw new Error('Blob has been closed and is no longer available');
21
+ * }
22
+ *
23
+ * return this._data;
24
+ * }
25
+ *
26
+ * get size(): number {
27
+ * return this.data.size;
28
+ * }
29
+ *
30
+ * get type(): string {
31
+ * return this.data.type || '';
32
+ * }
33
+ * ```
34
+ */
35
+ export declare function getBlobName(blob: any): string | undefined;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Extracts form data parts from a FormData object.
3
+ * Handles both the standard FormData API and the React Native FormData format.
4
+ *
5
+ * ```
6
+ * // node_modules/react-native/Libraries/Network/FormData.js
7
+ *
8
+ * class FormData {
9
+ * _parts: Array<FormDataNameValuePair>;
10
+ *
11
+ * constructor() {
12
+ * this._parts = [];
13
+ * }
14
+ *
15
+ * ...
16
+ * ```
17
+ */
18
+ export declare function getFormDataEntries(formData: any): [string, unknown][];
@@ -1,15 +1,45 @@
1
1
  import { RozeniteDevToolsClient } from '@rozenite/plugin-bridge';
2
2
  import { WebSocketEventMap } from './websocket-events';
3
3
  import { SSEEventMap } from './sse-events';
4
- export type HttpHeaders = Record<string, string>;
4
+ export type HttpHeaders = Record<string, string | string[]>;
5
+ export type XHRHeaders = NonNullable<XMLHttpRequest['responseHeaders']>;
5
6
  export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD';
6
7
  export type RequestId = string;
7
8
  export type Timestamp = number;
9
+ export type XHRPostData = string | Blob | FormData | ArrayBuffer | ArrayBufferView | unknown | null | undefined;
10
+ export type RequestTextPostData = {
11
+ type: 'text';
12
+ value: string;
13
+ };
14
+ export type RequestBinaryPostData = {
15
+ type: 'binary';
16
+ value: {
17
+ size: number;
18
+ type?: string;
19
+ name?: string;
20
+ };
21
+ };
22
+ export type RequestFormDataPostData = {
23
+ type: 'form-data';
24
+ value: Record<string, RequestTextPostData | RequestBinaryPostData>;
25
+ };
26
+ export type RequestPostData = RequestTextPostData | RequestFormDataPostData | RequestBinaryPostData | null | undefined;
27
+ export type Cookie = {
28
+ name: string;
29
+ value: string;
30
+ domain?: string;
31
+ path?: string;
32
+ expires?: string;
33
+ maxAge?: string;
34
+ secure?: boolean;
35
+ httpOnly?: boolean;
36
+ sameSite?: string;
37
+ };
8
38
  export type Request = {
9
39
  url: string;
10
40
  method: HttpMethod;
11
41
  headers: HttpHeaders;
12
- postData?: string;
42
+ postData?: RequestPostData;
13
43
  };
14
44
  export type Response = {
15
45
  url: string;
@@ -17,7 +47,7 @@ export type Response = {
17
47
  statusText: string;
18
48
  headers: HttpHeaders;
19
49
  contentType: string;
20
- size: number;
50
+ size: number | null;
21
51
  responseTime: Timestamp;
22
52
  };
23
53
  export type Initiator = {
@@ -27,9 +57,20 @@ export type Initiator = {
27
57
  columnNumber?: number;
28
58
  };
29
59
  export type ResourceType = 'XHR' | 'Fetch' | 'Other';
60
+ export type RequestOverride = {
61
+ status?: number;
62
+ body?: string;
63
+ };
64
+ export type NetworkActivityClientUISettings = {
65
+ showUrlAsName?: boolean;
66
+ };
30
67
  export type NetworkActivityEventMap = {
31
68
  'network-enable': unknown;
32
69
  'network-disable': unknown;
70
+ 'get-client-ui-settings': unknown;
71
+ 'client-ui-settings': {
72
+ settings?: NetworkActivityClientUISettings;
73
+ };
33
74
  'request-sent': {
34
75
  requestId: RequestId;
35
76
  request: Request;
@@ -47,7 +88,7 @@ export type NetworkActivityEventMap = {
47
88
  requestId: RequestId;
48
89
  timestamp: Timestamp;
49
90
  duration: number;
50
- size: number;
91
+ size: number | null;
51
92
  ttfb: number;
52
93
  };
53
94
  'request-failed': {
@@ -64,5 +105,8 @@ export type NetworkActivityEventMap = {
64
105
  requestId: RequestId;
65
106
  body: string | null;
66
107
  };
108
+ 'set-overrides': {
109
+ overrides: [string, RequestOverride][];
110
+ };
67
111
  } & WebSocketEventMap & SSEEventMap;
68
112
  export type NetworkActivityDevToolsClient = RozeniteDevToolsClient<NetworkActivityEventMap>;
@@ -11,7 +11,10 @@ export type SSEMessageEvent = {
11
11
  type: 'sse-message';
12
12
  requestId: SSERequestId;
13
13
  timestamp: number;
14
- data: string;
14
+ payload: {
15
+ type: string;
16
+ data: string;
17
+ };
15
18
  };
16
19
  export type SSEErrorEvent = {
17
20
  type: 'sse-error';
@@ -1,8 +1,8 @@
1
1
  import { VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
5
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
4
+ variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
+ size?: "default" | "xs" | "sm" | "lg" | "icon" | null | undefined;
6
6
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
7
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
8
8
  asChild?: boolean;
@@ -0,0 +1,3 @@
1
+ import { HTMLProps } from 'react';
2
+ export type CodeBlockProps = HTMLProps<HTMLPreElement>;
3
+ export declare const CodeBlock: ({ children, className, ...props }: CodeBlockProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export type CodeEditorProps = {
2
+ data: string | undefined;
3
+ onInput?: (event: React.FormEvent<HTMLPreElement>) => void;
4
+ };
5
+ export declare const CodeEditor: import('react').ForwardRefExoticComponent<CodeEditorProps & import('react').RefAttributes<HTMLPreElement>>;
@@ -0,0 +1,7 @@
1
+ import { Cookie } from '../../shared/client';
2
+ type CookieCardProps = {
3
+ cookie: Cookie;
4
+ keyClassName?: string;
5
+ };
6
+ export declare const CookieCard: ({ cookie, keyClassName }: CookieCardProps) => import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,7 @@
1
+ import { HttpNetworkEntry, SSENetworkEntry } from '../state/model';
2
+ type NetworkEntry = HttpNetworkEntry | SSENetworkEntry;
3
+ type CopyDropdownProps = {
4
+ selectedRequest: NetworkEntry;
5
+ };
6
+ export declare const CopyRequestDropdown: ({ selectedRequest }: CopyDropdownProps) => import("react/jsx-runtime").JSX.Element | null;
7
+ export {};
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
3
+ declare const DropdownMenu: React.FC<DropdownMenuPrimitive.DropdownMenuProps>;
4
+ declare const DropdownMenuTrigger: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
+ declare const DropdownMenuGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & React.RefAttributes<HTMLDivElement>>;
6
+ declare const DropdownMenuPortal: React.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
7
+ declare const DropdownMenuSub: React.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
8
+ declare const DropdownMenuRadioGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
9
+ declare const DropdownMenuSubTrigger: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
10
+ inset?: boolean;
11
+ } & React.RefAttributes<HTMLDivElement>>;
12
+ declare const DropdownMenuSubContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ declare const DropdownMenuContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
14
+ declare const DropdownMenuItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
15
+ inset?: boolean;
16
+ } & React.RefAttributes<HTMLDivElement>>;
17
+ declare const DropdownMenuCheckboxItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
18
+ declare const DropdownMenuRadioItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
19
+ declare const DropdownMenuLabel: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
20
+ inset?: boolean;
21
+ } & React.RefAttributes<HTMLDivElement>>;
22
+ declare const DropdownMenuSeparator: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
+ declare const DropdownMenuShortcut: {
24
+ ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): import("react/jsx-runtime").JSX.Element;
25
+ displayName: string;
26
+ };
27
+ export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, };
@@ -0,0 +1,10 @@
1
+ export type FilterState = {
2
+ text: string;
3
+ types: Set<'http' | 'websocket' | 'sse'>;
4
+ };
5
+ type FilterBarProps = {
6
+ filter: FilterState;
7
+ onFilterChange: (filter: FilterState) => void;
8
+ };
9
+ export declare const FilterBar: ({ filter, onFilterChange }: FilterBarProps) => import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -3,5 +3,5 @@ type JsonTreeCopyableItemProps = PropsWithChildren<{
3
3
  getCopyableValue: () => string;
4
4
  className?: string;
5
5
  }>;
6
- export declare const JsonTreeCopyableItem: ({ children, getCopyableValue, className }: JsonTreeCopyableItemProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const JsonTreeCopyableItem: ({ children, getCopyableValue, className, }: JsonTreeCopyableItemProps) => import("react/jsx-runtime").JSX.Element;
7
7
  export {};
@@ -0,0 +1,13 @@
1
+ import { default as React } from 'react';
2
+ export type KeyValueItem = {
3
+ key: string;
4
+ value: React.ReactNode;
5
+ keyClassName?: string;
6
+ valueClassName?: string;
7
+ };
8
+ export type KeyValueGridProps = {
9
+ items?: KeyValueItem[];
10
+ emptyMessage?: string;
11
+ className?: string;
12
+ };
13
+ export declare const KeyValueGrid: ({ items, emptyMessage, className, }: KeyValueGridProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,8 @@
1
+ import { HttpNetworkEntry } from '../state/model';
2
+ import { RequestOverride } from '../../shared/client';
3
+ export type OverrideResponseProps = {
4
+ selectedRequest: HttpNetworkEntry;
5
+ initialOverride: RequestOverride | undefined;
6
+ onClear: () => void;
7
+ };
8
+ export declare const OverrideResponse: ({ selectedRequest, initialOverride, onClear, }: OverrideResponseProps) => import("react/jsx-runtime").JSX.Element | undefined;
@@ -0,0 +1,6 @@
1
+ import { HttpRequestData } from '../state/model';
2
+ type RequestBodyProps = {
3
+ data: HttpRequestData['data'];
4
+ };
5
+ export declare const RequestBody: ({ data }: RequestBodyProps) => import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { ProcessedRequest } from '../state/model';
2
- import { RequestId } from '../../shared/client';
2
+ import { RequestId, RequestOverride } from '../../shared/client';
3
+ import { FilterState } from './FilterBar';
3
4
  type NetworkRequest = {
4
5
  id: RequestId;
5
6
  name: string;
@@ -11,6 +12,7 @@ type NetworkRequest = {
11
12
  time: string;
12
13
  type: string;
13
14
  startTime: string;
15
+ hasOverride: boolean;
14
16
  };
15
17
  declare const formatSize: (bytes: number) => string;
16
18
  declare const formatDuration: (duration: number) => string;
@@ -19,7 +21,10 @@ declare const extractDomainAndPath: (url: string) => {
19
21
  domain: string;
20
22
  path: string;
21
23
  };
22
- declare const generateName: (url: string) => string;
23
- declare const processNetworkRequests: (processedRequests: ProcessedRequest[]) => NetworkRequest[];
24
- export declare const RequestList: () => import("react/jsx-runtime").JSX.Element;
24
+ declare const generateName: (url: string, showEntirePathName?: boolean) => string;
25
+ declare const processNetworkRequests: (processedRequests: ProcessedRequest[], overrides: Map<string, RequestOverride>, showEntirePathAsName?: boolean) => NetworkRequest[];
26
+ export type RequestListProps = {
27
+ filter: FilterState;
28
+ };
29
+ export declare const RequestList: ({ filter }: RequestListProps) => import("react/jsx-runtime").JSX.Element;
25
30
  export { formatSize, formatDuration, formatStartTime, extractDomainAndPath, generateName, processNetworkRequests, };
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
- declare const ScrollArea: React.ForwardRefExoticComponent<React.RefAttributes<never>>;
3
- declare const ScrollBar: React.ForwardRefExoticComponent<React.RefAttributes<never>>;
2
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
3
+ declare const ScrollArea: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
+ declare const ScrollBar: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
5
  export { ScrollArea, ScrollBar };
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ export type SectionProps = {
3
+ title: string;
4
+ children: React.ReactNode;
5
+ collapsible?: boolean;
6
+ action?: React.ReactNode;
7
+ };
8
+ export declare const Section: ({ title, children, collapsible, action, }: SectionProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,3 +1,4 @@
1
1
  import * as React from 'react';
2
- declare const Separator: React.ForwardRefExoticComponent<React.RefAttributes<never>>;
2
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
3
+ declare const Separator: React.ForwardRefExoticComponent<Omit<SeparatorPrimitive.SeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
3
4
  export { Separator };
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
3
+ declare const Tabs: React.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>>;
4
+ declare const TabsList: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
+ declare const TabsTrigger: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const TabsContent: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
@@ -9,9 +9,13 @@ export declare const useNetworkActivityActions: () => {
9
9
  setRecording: (isRecording: boolean) => void;
10
10
  setSelectedRequest: (requestId: import('../../shared/client').RequestId | null) => void;
11
11
  clearRequests: () => void;
12
+ addOverride: (requestUrl: string, override: import('../../shared/client').RequestOverride) => void;
13
+ clearOverride: (requestUrl: string) => void;
12
14
  };
13
15
  export declare const useNetworkActivityClientManagement: () => {
14
16
  setupClient: (client: import('../../shared/client').NetworkActivityDevToolsClient) => void;
15
17
  cleanupClient: () => void;
16
18
  };
17
19
  export declare const useWebSocketMessages: (requestId: string) => import('./model').WebSocketMessage[];
20
+ export declare const useOverrides: () => Map<string, import('../../shared/client').RequestOverride>;
21
+ export declare const useClientUISettings: () => import('../../shared/client').NetworkActivityClientUISettings | null;
@@ -1,28 +1,32 @@
1
- import { Initiator, ResourceType } from '../../shared/client';
1
+ import { Initiator, ResourceType, HttpHeaders, RequestPostData } from '../../shared/client';
2
2
  export type RequestId = string;
3
3
  export type Timestamp = number;
4
4
  export type SocketId = number;
5
5
  export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD';
6
6
  export type NetworkEntryType = 'http' | 'websocket' | 'sse';
7
- export type HttpData = {
7
+ export type HttpRequestData = {
8
+ type: string;
9
+ data: NonNullable<RequestPostData>;
10
+ };
11
+ export type HttpResponseData = {
8
12
  type: string;
9
13
  data: string;
10
14
  };
11
15
  export type HttpRequest = {
12
16
  url: string;
13
17
  method: HttpMethod;
14
- headers: Record<string, string>;
15
- body?: HttpData;
18
+ headers: HttpHeaders;
19
+ body?: HttpRequestData;
16
20
  };
17
21
  export type HttpResponse = {
18
22
  url: string;
19
23
  status: number;
20
24
  statusText: string;
21
- headers: Record<string, string>;
25
+ headers: HttpHeaders;
22
26
  contentType: string;
23
27
  size: number;
24
28
  responseTime: Timestamp;
25
- body?: HttpData;
29
+ body?: HttpResponseData;
26
30
  };
27
31
  export type HttpStatus = 'pending' | 'loading' | 'finished' | 'failed';
28
32
  export type HttpNetworkEntry = {
@@ -42,6 +46,7 @@ export type HttpNetworkEntry = {
42
46
  };
43
47
  export type SSEMessage = {
44
48
  id: string;
49
+ type: string;
45
50
  data: string;
46
51
  timestamp: Timestamp;
47
52
  };
@@ -92,7 +97,7 @@ export type ProcessedRequest = {
92
97
  status: HttpStatus | WebSocketStatus | SSEStatus;
93
98
  timestamp: Timestamp;
94
99
  duration?: number;
95
- size?: number;
100
+ size: number | null;
96
101
  method: HttpMethod | 'WS' | 'SSE';
97
102
  httpStatus?: number;
98
103
  };
@@ -1,10 +1,12 @@
1
- import { NetworkActivityDevToolsClient, NetworkActivityEventMap, RequestId } from '../../shared/client';
1
+ import { NetworkActivityDevToolsClient, NetworkActivityEventMap, RequestOverride, RequestId, NetworkActivityClientUISettings } from '../../shared/client';
2
2
  import { NetworkEntry, WebSocketMessage } from './model';
3
3
  export interface NetworkActivityState {
4
4
  isRecording: boolean;
5
5
  selectedRequestId: RequestId | null;
6
6
  networkEntries: Map<RequestId, NetworkEntry>;
7
7
  websocketMessages: Map<RequestId, WebSocketMessage[]>;
8
+ overrides: Map<string, RequestOverride>;
9
+ clientUISettings: NetworkActivityClientUISettings | null;
8
10
  _unsubscribeFunctions?: Array<{
9
11
  remove: () => void;
10
12
  }>;
@@ -13,6 +15,8 @@ export interface NetworkActivityState {
13
15
  setRecording: (isRecording: boolean) => void;
14
16
  setSelectedRequest: (requestId: RequestId | null) => void;
15
17
  clearRequests: () => void;
18
+ addOverride: (requestUrl: string, override: RequestOverride) => void;
19
+ clearOverride: (requestUrl: string) => void;
16
20
  };
17
21
  handleEvent: <K extends keyof NetworkActivityEventMap>(eventType: K, data: NetworkActivityEventMap[K]) => void;
18
22
  client: {
@@ -20,5 +24,25 @@ export interface NetworkActivityState {
20
24
  cleanupClient: () => void;
21
25
  };
22
26
  }
23
- export declare const createNetworkActivityStore: () => import('zustand').StoreApi<NetworkActivityState>;
24
- export declare const store: import('zustand').StoreApi<NetworkActivityState>;
27
+ export declare const createNetworkActivityStore: () => Omit<import('zustand').StoreApi<NetworkActivityState>, "persist"> & {
28
+ persist: {
29
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<NetworkActivityState, unknown>>) => void;
30
+ clearStorage: () => void;
31
+ rehydrate: () => Promise<void> | void;
32
+ hasHydrated: () => boolean;
33
+ onHydrate: (fn: (state: NetworkActivityState) => void) => () => void;
34
+ onFinishHydration: (fn: (state: NetworkActivityState) => void) => () => void;
35
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<NetworkActivityState, unknown>>;
36
+ };
37
+ };
38
+ export declare const store: Omit<import('zustand').StoreApi<NetworkActivityState>, "persist"> & {
39
+ persist: {
40
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<NetworkActivityState, unknown>>) => void;
41
+ clearStorage: () => void;
42
+ rehydrate: () => Promise<void> | void;
43
+ hasHydrated: () => boolean;
44
+ onHydrate: (fn: (state: NetworkActivityState) => void) => () => void;
45
+ onFinishHydration: (fn: (state: NetworkActivityState) => void) => () => void;
46
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<NetworkActivityState, unknown>>;
47
+ };
48
+ };
@@ -0,0 +1,2 @@
1
+ import { NetworkEntry } from '../state/model';
2
+ export declare const checkRequestBodyBinary: (request: NetworkEntry) => boolean;
@@ -0,0 +1 @@
1
+ export declare function escapeShellArg(arg: string): string;
@@ -0,0 +1,2 @@
1
+ import { HttpNetworkEntry, SSENetworkEntry } from '../state/model';
2
+ export declare function generateCurlCommand(request: HttpNetworkEntry | SSENetworkEntry): string;
@@ -0,0 +1,2 @@
1
+ import { HttpNetworkEntry, SSENetworkEntry } from '../state/model';
2
+ export declare const generateFetchCall: (request: HttpNetworkEntry | SSENetworkEntry) => string;
@@ -0,0 +1,4 @@
1
+ export declare const generateMultipartBody: (formData: Record<string, unknown>) => {
2
+ body: string;
3
+ contentType: string;
4
+ };
@@ -0,0 +1,7 @@
1
+ import { HttpHeaders, RequestPostData } from '../shared/client';
2
+ /**
3
+ * Partially emulates React Native's behavior for setting HTTP headers.
4
+ *
5
+ * @see https://github.com/facebook/react-native/blob/de5093c88771977b58f7bec3f3ffa64a9595334e/packages/react-native/Libraries/Network/RCTNetworking.mm#L345-L349
6
+ */
7
+ export declare function applyReactNativeRequestHeadersLogic(headers: HttpHeaders, postData?: RequestPostData): HttpHeaders;
@@ -0,0 +1,9 @@
1
+ import { HttpHeaders, XHRHeaders } from '../shared/client';
2
+ /**
3
+ * Applies React Native specific logic to response headers.
4
+ * React Native concatenates multiple header values into single strings,
5
+ * this function parses them back into arrays where appropriate.
6
+ *
7
+ * @see https://github.com/facebook/react-native/blob/588f0c5ce6c283f116228456da2170d2adc3cbf4/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java#L637
8
+ */
9
+ export declare const applyReactNativeResponseHeadersLogic: (headers: XHRHeaders) => HttpHeaders;
@@ -0,0 +1,6 @@
1
+ import { Cookie, HttpHeaders } from '../shared/client';
2
+ export declare const parseSetCookieHeader: (setCookieStr: string) => Cookie;
3
+ export declare const splitSetCookieHeaderByComma: (header: string) => string[];
4
+ export declare const parseCookieHeader: (cookieString: string) => Cookie[];
5
+ export declare const parseRequestCookiesFromHeaders: (headers: HttpHeaders) => Cookie[];
6
+ export declare const parseResponseCookiesFromHeaders: (headers: HttpHeaders) => Cookie[];
@@ -0,0 +1,2 @@
1
+ import { HttpHeaders } from '../shared/client';
2
+ export declare function getContentTypeMime(headers: HttpHeaders): string | undefined;