rn-backstage 1.0.0 → 1.1.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 (64) hide show
  1. package/README.md +54 -23
  2. package/lib/commonjs/Backstage.js +51 -5
  3. package/lib/commonjs/Backstage.js.map +1 -1
  4. package/lib/commonjs/components/BackstagePanel.js +16 -0
  5. package/lib/commonjs/components/BackstagePanel.js.map +1 -1
  6. package/lib/commonjs/components/NetworkItem.js +537 -0
  7. package/lib/commonjs/components/NetworkItem.js.map +1 -0
  8. package/lib/commonjs/components/NetworkTab.js +274 -0
  9. package/lib/commonjs/components/NetworkTab.js.map +1 -0
  10. package/lib/commonjs/constants.js +11 -3
  11. package/lib/commonjs/constants.js.map +1 -1
  12. package/lib/commonjs/index.js +6 -0
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/log-interceptor.js +8 -1
  15. package/lib/commonjs/log-interceptor.js.map +1 -1
  16. package/lib/commonjs/network-interceptor.js +417 -0
  17. package/lib/commonjs/network-interceptor.js.map +1 -0
  18. package/lib/commonjs/types.js +8 -1
  19. package/lib/commonjs/types.js.map +1 -1
  20. package/lib/module/Backstage.js +52 -6
  21. package/lib/module/Backstage.js.map +1 -1
  22. package/lib/module/components/BackstagePanel.js +16 -0
  23. package/lib/module/components/BackstagePanel.js.map +1 -1
  24. package/lib/module/components/NetworkItem.js +532 -0
  25. package/lib/module/components/NetworkItem.js.map +1 -0
  26. package/lib/module/components/NetworkTab.js +269 -0
  27. package/lib/module/components/NetworkTab.js.map +1 -0
  28. package/lib/module/constants.js +10 -2
  29. package/lib/module/constants.js.map +1 -1
  30. package/lib/module/index.js +1 -1
  31. package/lib/module/index.js.map +1 -1
  32. package/lib/module/log-interceptor.js +8 -1
  33. package/lib/module/log-interceptor.js.map +1 -1
  34. package/lib/module/network-interceptor.js +409 -0
  35. package/lib/module/network-interceptor.js.map +1 -0
  36. package/lib/module/types.js +8 -0
  37. package/lib/module/types.js.map +1 -1
  38. package/lib/typescript/Backstage.d.ts.map +1 -1
  39. package/lib/typescript/components/BackstagePanel.d.ts +5 -1
  40. package/lib/typescript/components/BackstagePanel.d.ts.map +1 -1
  41. package/lib/typescript/components/NetworkItem.d.ts +9 -0
  42. package/lib/typescript/components/NetworkItem.d.ts.map +1 -0
  43. package/lib/typescript/components/NetworkTab.d.ts +11 -0
  44. package/lib/typescript/components/NetworkTab.d.ts.map +1 -0
  45. package/lib/typescript/constants.d.ts +8 -0
  46. package/lib/typescript/constants.d.ts.map +1 -1
  47. package/lib/typescript/index.d.ts +2 -2
  48. package/lib/typescript/index.d.ts.map +1 -1
  49. package/lib/typescript/log-interceptor.d.ts +3 -1
  50. package/lib/typescript/log-interceptor.d.ts.map +1 -1
  51. package/lib/typescript/network-interceptor.d.ts +35 -0
  52. package/lib/typescript/network-interceptor.d.ts.map +1 -0
  53. package/lib/typescript/types.d.ts +32 -0
  54. package/lib/typescript/types.d.ts.map +1 -1
  55. package/package.json +1 -1
  56. package/src/Backstage.tsx +60 -6
  57. package/src/components/BackstagePanel.tsx +22 -0
  58. package/src/components/NetworkItem.tsx +536 -0
  59. package/src/components/NetworkTab.tsx +274 -0
  60. package/src/constants.ts +11 -2
  61. package/src/index.ts +2 -1
  62. package/src/log-interceptor.ts +12 -1
  63. package/src/network-interceptor.ts +468 -0
  64. package/src/types.ts +41 -0
@@ -14,6 +14,28 @@ export interface LogEntry {
14
14
  data?: unknown;
15
15
  timestamp: number;
16
16
  }
17
+ export declare enum NetworkState {
18
+ pending = "pending",
19
+ completed = "completed",
20
+ error = "error"
21
+ }
22
+ export interface NetworkEntry {
23
+ id: string;
24
+ method: string;
25
+ url: string;
26
+ startTime: number;
27
+ endTime?: number;
28
+ duration?: number;
29
+ status?: number;
30
+ statusText?: string;
31
+ requestHeaders?: Record<string, string>;
32
+ responseHeaders?: Record<string, string>;
33
+ requestBody?: string;
34
+ responseBody?: string;
35
+ responseSize?: number;
36
+ error?: string;
37
+ state: NetworkState;
38
+ }
17
39
  export interface AppInfoItem {
18
40
  label: string;
19
41
  value: string;
@@ -85,6 +107,16 @@ export interface BackstageProps {
85
107
  initialY?: number;
86
108
  /** Text displayed on the floating pill. Defaults to appVersion or "DEV" */
87
109
  pillText?: string;
110
+ /** Whether to enable network request interception. Default: true */
111
+ enableNetworkInspector?: boolean;
112
+ /** Maximum number of network entries to retain in memory. Default: 500 */
113
+ maxNetworkEntries?: number;
114
+ /** Maximum body size (bytes) to capture per request/response. Default: 65536 (64KB) */
115
+ maxNetworkBodySize?: number;
116
+ /** URL substrings to exclude from network capture */
117
+ networkFilters?: string[];
118
+ /** Auto-filter console.logs from network callbacks (e.g., Axios interceptors) out of the Logs tab. Default: true */
119
+ autoFilterNetworkLogs?: boolean;
88
120
  }
89
121
  export interface BackstageStyleOverrides {
90
122
  pillStyle?: StyleProp<ViewStyle>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rn-backstage",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A zero-dependency developer/QA debug panel for React Native apps",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/Backstage.tsx CHANGED
@@ -7,11 +7,16 @@ import React, {
7
7
  useState,
8
8
  } from 'react'
9
9
  import { StyleSheet, View } from 'react-native'
10
- import { DEFAULT_MAX_LOGS } from './constants'
10
+ import { DEFAULT_MAX_LOGS, DEFAULT_MAX_NETWORK_ENTRIES } from './constants'
11
11
  import { installInterceptor, LogBuffer, uninstallInterceptor } from './log-interceptor'
12
+ import {
13
+ installNetworkInterceptor,
14
+ NetworkBuffer,
15
+ uninstallNetworkInterceptor,
16
+ } from './network-interceptor'
12
17
  import { FloatingPill } from './components/FloatingPill'
13
18
  import { BackstagePanel } from './components/BackstagePanel'
14
- import type { BackstageProps, BackstageRef, LogEntry } from './types'
19
+ import type { BackstageProps, BackstageRef, LogEntry, NetworkEntry } from './types'
15
20
 
16
21
  // ─── Component ───────────────────────────────────────────────────────────────
17
22
 
@@ -34,21 +39,29 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
34
39
  initialX,
35
40
  initialY,
36
41
  pillText,
42
+ enableNetworkInspector = true,
43
+ maxNetworkEntries = DEFAULT_MAX_NETWORK_ENTRIES,
44
+ maxNetworkBodySize,
45
+ networkFilters,
46
+ autoFilterNetworkLogs = true,
37
47
  },
38
48
  ref,
39
49
  ) => {
40
50
  const [panelVisible, setPanelVisible] = useState(false)
41
51
  const [hasError, setHasError] = useState(false)
42
52
  const [logs, setLogs] = useState<LogEntry[]>([])
53
+ const [networkEntries, setNetworkEntries] = useState<NetworkEntry[]>([])
43
54
 
44
55
  const logBuffer = useRef(new LogBuffer(maxLogs))
56
+ const networkBuffer = useRef(new NetworkBuffer(maxNetworkEntries))
45
57
 
46
58
  // ── Panel controls ────────────────────────────────────────
47
59
 
48
60
  const openPanel = useCallback(() => {
49
61
  setPanelVisible(true)
50
- // Sync logs when opening panel
62
+ // Sync logs and network entries when opening panel
51
63
  setLogs(logBuffer.current.getAll())
64
+ setNetworkEntries(networkBuffer.current.getAll())
52
65
  }, [])
53
66
 
54
67
  const closePanel = useCallback(() => {
@@ -61,12 +74,23 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
61
74
  setHasError(false)
62
75
  }, [])
63
76
 
64
- // ── Refresh logs ──────────────────────────────────────────
77
+ // ── Refresh logs ──────────────────────────────────────────────────
65
78
 
66
79
  const refreshLogs = useCallback(() => {
67
80
  setLogs(logBuffer.current.getAll())
68
81
  }, [])
69
82
 
83
+ // ── Network controls ──────────────────────────────────────────────
84
+
85
+ const refreshNetwork = useCallback(() => {
86
+ setNetworkEntries(networkBuffer.current.getAll())
87
+ }, [])
88
+
89
+ const clearNetwork = useCallback(() => {
90
+ networkBuffer.current.clear()
91
+ setNetworkEntries([])
92
+ }, [])
93
+
70
94
  // ── Install console interceptor ───────────────────────────
71
95
 
72
96
  useEffect(() => {
@@ -79,12 +103,38 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
79
103
  }
80
104
  }
81
105
 
82
- installInterceptor(handleLogEntry, logFilters)
106
+ installInterceptor(handleLogEntry, logFilters, {
107
+ autoFilterNetworkLogs: enableNetworkInspector && autoFilterNetworkLogs,
108
+ })
83
109
 
84
110
  return () => {
85
111
  uninstallInterceptor()
86
112
  }
87
- }, [logFilters])
113
+ }, [logFilters, enableNetworkInspector, autoFilterNetworkLogs])
114
+
115
+ // ── Install network interceptor ───────────────────────────────
116
+
117
+ useEffect(() => {
118
+ if (!enableNetworkInspector) return
119
+
120
+ const handleNetworkEntry = (entry: NetworkEntry) => {
121
+ networkBuffer.current.upsert(entry)
122
+
123
+ // Auto-refresh if panel is open
124
+ if (panelVisible) {
125
+ setNetworkEntries(networkBuffer.current.getAll())
126
+ }
127
+ }
128
+
129
+ installNetworkInterceptor(handleNetworkEntry, {
130
+ filters: networkFilters,
131
+ maxBodySize: maxNetworkBodySize,
132
+ })
133
+
134
+ return () => {
135
+ uninstallNetworkInterceptor()
136
+ }
137
+ }, [enableNetworkInspector, networkFilters, maxNetworkBodySize, panelVisible])
88
138
 
89
139
  // ── Expose ref methods ────────────────────────────────────
90
140
 
@@ -122,6 +172,10 @@ export const Backstage = forwardRef<BackstageRef, BackstageProps>(
122
172
  logs={logs}
123
173
  onRefreshLogs={refreshLogs}
124
174
  onCopyLogs={onCopyLogs}
175
+ networkEntries={networkEntries}
176
+ onRefreshNetwork={refreshNetwork}
177
+ onClearNetwork={clearNetwork}
178
+ onCopyNetwork={onCopyLogs}
125
179
  extraTabs={extraTabs}
126
180
  styles={propStyles}
127
181
  >
@@ -12,11 +12,13 @@ import { DarkTheme, MonospaceFont, TestIDs } from '../constants'
12
12
  import { TabBar } from './TabBar'
13
13
  import { InfoTab } from './InfoTab'
14
14
  import { LogsTab } from './LogsTab'
15
+ import { NetworkTab } from './NetworkTab'
15
16
  import type {
16
17
  AppInfoItem,
17
18
  BackstageStyleOverrides,
18
19
  BackstageTab,
19
20
  LogEntry,
21
+ NetworkEntry,
20
22
  QuickAction,
21
23
  } from '../types'
22
24
 
@@ -39,6 +41,12 @@ interface BackstagePanelProps {
39
41
  onRefreshLogs: () => void
40
42
  onCopyLogs?: (logs: string) => void
41
43
 
44
+ // Network tab props
45
+ networkEntries: NetworkEntry[]
46
+ onRefreshNetwork: () => void
47
+ onClearNetwork: () => void
48
+ onCopyNetwork?: (text: string) => void
49
+
42
50
  // Extensibility
43
51
  extraTabs?: BackstageTab[]
44
52
 
@@ -51,6 +59,7 @@ interface BackstagePanelProps {
51
59
 
52
60
  const BUILT_IN_TABS = [
53
61
  { key: 'info', title: 'Info', icon: 'ℹ️' },
62
+ { key: 'network', title: 'Network', icon: '🌐' },
54
63
  { key: 'logs', title: 'Logs', icon: '📋' },
55
64
  ]
56
65
 
@@ -68,6 +77,10 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
68
77
  logs,
69
78
  onRefreshLogs,
70
79
  onCopyLogs,
80
+ networkEntries,
81
+ onRefreshNetwork,
82
+ onClearNetwork,
83
+ onCopyNetwork,
71
84
  extraTabs = [],
72
85
  styles: propStyles,
73
86
  children,
@@ -98,6 +111,15 @@ export const BackstagePanel: React.FC<BackstagePanelProps> = ({
98
111
  {children}
99
112
  </InfoTab>
100
113
  )
114
+ case 'network':
115
+ return (
116
+ <NetworkTab
117
+ entries={networkEntries}
118
+ onRefresh={onRefreshNetwork}
119
+ onClear={onClearNetwork}
120
+ onCopy={onCopyNetwork}
121
+ />
122
+ )
101
123
  case 'logs':
102
124
  return (
103
125
  <LogsTab