rn-backstage 1.0.0 → 1.2.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 (72) hide show
  1. package/README.md +74 -23
  2. package/lib/commonjs/Backstage.js +55 -5
  3. package/lib/commonjs/Backstage.js.map +1 -1
  4. package/lib/commonjs/components/BackstagePanel.js +36 -5
  5. package/lib/commonjs/components/BackstagePanel.js.map +1 -1
  6. package/lib/commonjs/components/FlagsTab.js +255 -0
  7. package/lib/commonjs/components/FlagsTab.js.map +1 -0
  8. package/lib/commonjs/components/NetworkItem.js +537 -0
  9. package/lib/commonjs/components/NetworkItem.js.map +1 -0
  10. package/lib/commonjs/components/NetworkTab.js +274 -0
  11. package/lib/commonjs/components/NetworkTab.js.map +1 -0
  12. package/lib/commonjs/constants.js +11 -3
  13. package/lib/commonjs/constants.js.map +1 -1
  14. package/lib/commonjs/index.js +6 -0
  15. package/lib/commonjs/index.js.map +1 -1
  16. package/lib/commonjs/log-interceptor.js +8 -1
  17. package/lib/commonjs/log-interceptor.js.map +1 -1
  18. package/lib/commonjs/network-interceptor.js +417 -0
  19. package/lib/commonjs/network-interceptor.js.map +1 -0
  20. package/lib/commonjs/types.js +9 -1
  21. package/lib/commonjs/types.js.map +1 -1
  22. package/lib/module/Backstage.js +56 -6
  23. package/lib/module/Backstage.js.map +1 -1
  24. package/lib/module/components/BackstagePanel.js +36 -5
  25. package/lib/module/components/BackstagePanel.js.map +1 -1
  26. package/lib/module/components/FlagsTab.js +250 -0
  27. package/lib/module/components/FlagsTab.js.map +1 -0
  28. package/lib/module/components/NetworkItem.js +532 -0
  29. package/lib/module/components/NetworkItem.js.map +1 -0
  30. package/lib/module/components/NetworkTab.js +269 -0
  31. package/lib/module/components/NetworkTab.js.map +1 -0
  32. package/lib/module/constants.js +10 -2
  33. package/lib/module/constants.js.map +1 -1
  34. package/lib/module/index.js +1 -1
  35. package/lib/module/index.js.map +1 -1
  36. package/lib/module/log-interceptor.js +8 -1
  37. package/lib/module/log-interceptor.js.map +1 -1
  38. package/lib/module/network-interceptor.js +409 -0
  39. package/lib/module/network-interceptor.js.map +1 -0
  40. package/lib/module/types.js +10 -0
  41. package/lib/module/types.js.map +1 -1
  42. package/lib/typescript/Backstage.d.ts.map +1 -1
  43. package/lib/typescript/components/BackstagePanel.d.ts +7 -1
  44. package/lib/typescript/components/BackstagePanel.d.ts.map +1 -1
  45. package/lib/typescript/components/FlagsTab.d.ts +9 -0
  46. package/lib/typescript/components/FlagsTab.d.ts.map +1 -0
  47. package/lib/typescript/components/NetworkItem.d.ts +9 -0
  48. package/lib/typescript/components/NetworkItem.d.ts.map +1 -0
  49. package/lib/typescript/components/NetworkTab.d.ts +11 -0
  50. package/lib/typescript/components/NetworkTab.d.ts.map +1 -0
  51. package/lib/typescript/constants.d.ts +8 -0
  52. package/lib/typescript/constants.d.ts.map +1 -1
  53. package/lib/typescript/index.d.ts +2 -2
  54. package/lib/typescript/index.d.ts.map +1 -1
  55. package/lib/typescript/log-interceptor.d.ts +3 -1
  56. package/lib/typescript/log-interceptor.d.ts.map +1 -1
  57. package/lib/typescript/network-interceptor.d.ts +35 -0
  58. package/lib/typescript/network-interceptor.d.ts.map +1 -0
  59. package/lib/typescript/types.d.ts +46 -0
  60. package/lib/typescript/types.d.ts.map +1 -1
  61. package/package.json +1 -1
  62. package/src/Backstage.tsx +64 -6
  63. package/src/components/BackstagePanel.tsx +46 -5
  64. package/src/components/FlagsTab.tsx +249 -0
  65. package/src/components/InfoTab.tsx +1 -1
  66. package/src/components/NetworkItem.tsx +536 -0
  67. package/src/components/NetworkTab.tsx +274 -0
  68. package/src/constants.ts +11 -2
  69. package/src/index.ts +3 -1
  70. package/src/log-interceptor.ts +12 -1
  71. package/src/network-interceptor.ts +468 -0
  72. package/src/types.ts +60 -0
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+
3
+ import { NetworkState } from './types';
4
+ import { DEFAULT_MAX_NETWORK_ENTRIES, DEFAULT_MAX_NETWORK_BODY_SIZE } from './constants';
5
+
6
+ // ─── Types ───────────────────────────────────────────────────────────────────
7
+
8
+ // ─── State ───────────────────────────────────────────────────────────────────
9
+
10
+ let activeCallback = null;
11
+ let isInstalled = false;
12
+ let interceptorOptions = {};
13
+
14
+ // Track if we're inside a network callback context.
15
+ // Used by the log interceptor to auto-filter network-related console.logs.
16
+ let _activeNetworkCallbacks = 0;
17
+
18
+ /**
19
+ * Returns true if the current call stack originated from within a network
20
+ * response handler (XHR load/error, fetch .then()). Used by the log
21
+ * interceptor to suppress network-related console.logs from the Logs tab.
22
+ */
23
+ export function isInsideNetworkCallback() {
24
+ return _activeNetworkCallbacks > 0;
25
+ }
26
+ function enterNetworkContext() {
27
+ _activeNetworkCallbacks++;
28
+ }
29
+ function exitNetworkContext() {
30
+ // Defer decrement through microtask queue so developer's .then() chains
31
+ // that fire after our return are also covered.
32
+ queueMicrotask(() => {
33
+ _activeNetworkCallbacks--;
34
+ });
35
+ }
36
+
37
+ // Store originals before patching
38
+ const originals = {
39
+ fetch: null,
40
+ XMLHttpRequest: null
41
+ };
42
+
43
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
44
+
45
+ function generateId() {
46
+ return `net_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
47
+ }
48
+ function shouldCapture(url, filters) {
49
+ if (filters.length === 0) return true;
50
+ const lower = url.toLowerCase();
51
+ return !filters.some(f => lower.includes(f.toLowerCase()));
52
+ }
53
+ function truncateBody(body, maxSize) {
54
+ if (!body) return undefined;
55
+ const limit = maxSize ?? DEFAULT_MAX_NETWORK_BODY_SIZE;
56
+ if (body.length <= limit) return body;
57
+ return body.substring(0, limit) + '\n... [truncated]';
58
+ }
59
+ function parseHeaders(headers) {
60
+ if (!headers) return undefined;
61
+ const result = {};
62
+ headers.forEach((value, key) => {
63
+ result[key] = value;
64
+ });
65
+ return Object.keys(result).length > 0 ? result : undefined;
66
+ }
67
+
68
+ /**
69
+ * Generates a cURL command string from a NetworkEntry.
70
+ */
71
+ export function toCurl(entry) {
72
+ const parts = ['curl'];
73
+
74
+ // Method
75
+ if (entry.method && entry.method !== 'GET') {
76
+ parts.push(`-X ${entry.method}`);
77
+ }
78
+
79
+ // Request headers
80
+ if (entry.requestHeaders) {
81
+ for (const [key, value] of Object.entries(entry.requestHeaders)) {
82
+ parts.push(`-H '${key}: ${value}'`);
83
+ }
84
+ }
85
+
86
+ // Request body
87
+ if (entry.requestBody) {
88
+ // Escape single quotes in body
89
+ const escaped = entry.requestBody.replace(/'/g, "'\\''");
90
+ parts.push(`-d '${escaped}'`);
91
+ }
92
+
93
+ // URL (must be last)
94
+ parts.push(`'${entry.url}'`);
95
+ return parts.join(' \\\n ');
96
+ }
97
+
98
+ // ─── Fetch Interceptor ──────────────────────────────────────────────────────
99
+
100
+ function installFetchInterceptor() {
101
+ const originalFetch = global.fetch;
102
+ if (!originalFetch) return;
103
+ originals.fetch = originalFetch;
104
+ global.fetch = async function interceptedFetch(input, init) {
105
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
106
+ const method = init?.method ?? (typeof input !== 'string' && !(input instanceof URL) ? input.method : 'GET') ?? 'GET';
107
+
108
+ // Check filters
109
+ if (!shouldCapture(url, interceptorOptions.filters ?? [])) {
110
+ return originalFetch(input, init);
111
+ }
112
+
113
+ // Build entry
114
+ const entry = {
115
+ id: generateId(),
116
+ method: method.toUpperCase(),
117
+ url,
118
+ startTime: Date.now(),
119
+ state: NetworkState.pending
120
+ };
121
+
122
+ // Capture request headers
123
+ if (init?.headers) {
124
+ try {
125
+ const h = new Headers(init.headers);
126
+ entry.requestHeaders = parseHeaders(h);
127
+ } catch {
128
+ // Skip if headers can't be parsed
129
+ }
130
+ }
131
+
132
+ // Capture request body
133
+ if (init?.body) {
134
+ try {
135
+ entry.requestBody = truncateBody(typeof init.body === 'string' ? init.body : JSON.stringify(init.body), interceptorOptions.maxBodySize);
136
+ } catch {
137
+ entry.requestBody = '[unable to serialize body]';
138
+ }
139
+ }
140
+
141
+ // Notify: request started
142
+ activeCallback?.(entry);
143
+ try {
144
+ const response = await originalFetch(input, init);
145
+ entry.endTime = Date.now();
146
+ entry.duration = entry.endTime - entry.startTime;
147
+ entry.status = response.status;
148
+ entry.statusText = response.statusText;
149
+ entry.responseHeaders = parseHeaders(response.headers);
150
+ entry.state = NetworkState.completed;
151
+
152
+ // Clone response to read body without consuming it
153
+ try {
154
+ const clone = response.clone();
155
+ const text = await clone.text();
156
+ entry.responseSize = text.length;
157
+ entry.responseBody = truncateBody(text, interceptorOptions.maxBodySize);
158
+ } catch {
159
+ // Body may not be readable (e.g., stream already consumed)
160
+ }
161
+
162
+ // Notify: request completed
163
+ activeCallback?.(entry);
164
+
165
+ // Mark network context so developer's .then() console.logs are filtered
166
+ enterNetworkContext();
167
+
168
+ // Return the ORIGINAL response untouched
169
+ // Developer's .then() runs in the next microtask — exitNetworkContext
170
+ // defers via queueMicrotask to cover it.
171
+ const result = response;
172
+ exitNetworkContext();
173
+ return result;
174
+ } catch (err) {
175
+ entry.endTime = Date.now();
176
+ entry.duration = entry.endTime - entry.startTime;
177
+ entry.state = NetworkState.error;
178
+ entry.error = err instanceof Error ? err.message : String(err);
179
+
180
+ // Notify: request failed
181
+ activeCallback?.(entry);
182
+
183
+ // Re-throw the original error
184
+ throw err;
185
+ }
186
+ };
187
+ }
188
+
189
+ // ─── XMLHttpRequest Interceptor ──────────────────────────────────────────────
190
+
191
+ function installXHRInterceptor() {
192
+ const OriginalXHR = global.XMLHttpRequest;
193
+ if (!OriginalXHR) return;
194
+ originals.XMLHttpRequest = OriginalXHR;
195
+ global.XMLHttpRequest = function InterceptedXHR() {
196
+ const xhr = new OriginalXHR();
197
+ const entry = {
198
+ id: generateId(),
199
+ method: 'GET',
200
+ url: '',
201
+ startTime: Date.now(),
202
+ state: NetworkState.pending,
203
+ requestHeaders: {}
204
+ };
205
+ let shouldTrack = true;
206
+
207
+ // Intercept open()
208
+ const originalOpen = xhr.open.bind(xhr);
209
+ xhr.open = function (method, url, ...rest) {
210
+ entry.method = method.toUpperCase();
211
+ entry.url = url;
212
+ shouldTrack = shouldCapture(url, interceptorOptions.filters ?? []);
213
+ // @ts-expect-error — forwarding args to original
214
+ return originalOpen(method, url, ...rest);
215
+ };
216
+
217
+ // Intercept setRequestHeader()
218
+ const originalSetRequestHeader = xhr.setRequestHeader.bind(xhr);
219
+ xhr.setRequestHeader = function (name, value) {
220
+ if (shouldTrack && entry.requestHeaders) {
221
+ entry.requestHeaders[name] = value;
222
+ }
223
+ return originalSetRequestHeader(name, value);
224
+ };
225
+
226
+ // Intercept send()
227
+ const originalSend = xhr.send.bind(xhr);
228
+ xhr.send = function (body) {
229
+ if (!shouldTrack) {
230
+ return originalSend(body);
231
+ }
232
+ entry.startTime = Date.now();
233
+
234
+ // Capture request body
235
+ if (body) {
236
+ try {
237
+ entry.requestBody = truncateBody(typeof body === 'string' ? body : JSON.stringify(body), interceptorOptions.maxBodySize);
238
+ } catch {
239
+ entry.requestBody = '[unable to serialize body]';
240
+ }
241
+ }
242
+
243
+ // Clean up empty request headers
244
+ if (entry.requestHeaders && Object.keys(entry.requestHeaders).length === 0) {
245
+ entry.requestHeaders = undefined;
246
+ }
247
+
248
+ // Notify: request started
249
+ activeCallback?.(entry);
250
+
251
+ // Listen for completion
252
+ xhr.addEventListener('load', () => {
253
+ enterNetworkContext();
254
+ entry.endTime = Date.now();
255
+ entry.duration = entry.endTime - entry.startTime;
256
+ entry.status = xhr.status;
257
+ entry.statusText = xhr.statusText;
258
+ entry.state = NetworkState.completed;
259
+
260
+ // Parse response headers
261
+ const rawHeaders = xhr.getAllResponseHeaders();
262
+ if (rawHeaders) {
263
+ const parsed = {};
264
+ rawHeaders.trim().split(/[\r\n]+/).forEach(line => {
265
+ const idx = line.indexOf(': ');
266
+ if (idx > 0) {
267
+ parsed[line.substring(0, idx).toLowerCase()] = line.substring(idx + 2);
268
+ }
269
+ });
270
+ entry.responseHeaders = Object.keys(parsed).length > 0 ? parsed : undefined;
271
+ }
272
+
273
+ // Capture response body
274
+ try {
275
+ const responseText = xhr.responseType === '' || xhr.responseType === 'text' ? xhr.responseText : JSON.stringify(xhr.response);
276
+ entry.responseSize = responseText?.length;
277
+ entry.responseBody = truncateBody(responseText, interceptorOptions.maxBodySize);
278
+ } catch {
279
+ // Response may not be text-readable
280
+ }
281
+ activeCallback?.(entry);
282
+ exitNetworkContext();
283
+ });
284
+ xhr.addEventListener('error', () => {
285
+ enterNetworkContext();
286
+ entry.endTime = Date.now();
287
+ entry.duration = entry.endTime - entry.startTime;
288
+ entry.state = NetworkState.error;
289
+ entry.error = 'Network request failed';
290
+ activeCallback?.(entry);
291
+ exitNetworkContext();
292
+ });
293
+ xhr.addEventListener('timeout', () => {
294
+ enterNetworkContext();
295
+ entry.endTime = Date.now();
296
+ entry.duration = entry.endTime - entry.startTime;
297
+ entry.state = NetworkState.error;
298
+ entry.error = 'Request timed out';
299
+ activeCallback?.(entry);
300
+ exitNetworkContext();
301
+ });
302
+ xhr.addEventListener('abort', () => {
303
+ enterNetworkContext();
304
+ entry.endTime = Date.now();
305
+ entry.duration = entry.endTime - entry.startTime;
306
+ entry.state = NetworkState.error;
307
+ entry.error = 'Request aborted';
308
+ activeCallback?.(entry);
309
+ exitNetworkContext();
310
+ });
311
+ return originalSend(body);
312
+ };
313
+ return xhr;
314
+ };
315
+
316
+ // Copy static properties and prototype
317
+ Object.defineProperty(global.XMLHttpRequest, 'UNSENT', {
318
+ value: 0
319
+ });
320
+ Object.defineProperty(global.XMLHttpRequest, 'OPENED', {
321
+ value: 1
322
+ });
323
+ Object.defineProperty(global.XMLHttpRequest, 'HEADERS_RECEIVED', {
324
+ value: 2
325
+ });
326
+ Object.defineProperty(global.XMLHttpRequest, 'LOADING', {
327
+ value: 3
328
+ });
329
+ Object.defineProperty(global.XMLHttpRequest, 'DONE', {
330
+ value: 4
331
+ });
332
+ global.XMLHttpRequest.prototype = OriginalXHR.prototype;
333
+ }
334
+
335
+ // ─── Install / Uninstall ─────────────────────────────────────────────────────
336
+
337
+ export function installNetworkInterceptor(callback, options = {}) {
338
+ if (isInstalled) {
339
+ // Update callback and options if already installed
340
+ activeCallback = callback;
341
+ interceptorOptions = options;
342
+ return;
343
+ }
344
+ activeCallback = callback;
345
+ interceptorOptions = options;
346
+ isInstalled = true;
347
+ installFetchInterceptor();
348
+ installXHRInterceptor();
349
+ }
350
+ export function uninstallNetworkInterceptor() {
351
+ if (!isInstalled) return;
352
+
353
+ // Restore originals
354
+ if (originals.fetch) {
355
+ global.fetch = originals.fetch;
356
+ originals.fetch = null;
357
+ }
358
+ if (originals.XMLHttpRequest) {
359
+ global.XMLHttpRequest = originals.XMLHttpRequest;
360
+ originals.XMLHttpRequest = null;
361
+ }
362
+ activeCallback = null;
363
+ isInstalled = false;
364
+ }
365
+
366
+ // ─── Network Buffer ──────────────────────────────────────────────────────────
367
+
368
+ export class NetworkBuffer {
369
+ entries = new Map();
370
+ order = [];
371
+ constructor(maxSize = DEFAULT_MAX_NETWORK_ENTRIES) {
372
+ this.maxSize = maxSize;
373
+ }
374
+
375
+ /**
376
+ * Upsert a network entry. If the entry already exists (same id),
377
+ * update it in place (e.g., pending → completed). Otherwise add new.
378
+ */
379
+ upsert(entry) {
380
+ if (this.entries.has(entry.id)) {
381
+ // Update existing entry (pending → completed/error)
382
+ this.entries.set(entry.id, entry);
383
+ } else {
384
+ // Add new entry at the front
385
+ this.order.unshift(entry.id);
386
+ this.entries.set(entry.id, entry);
387
+
388
+ // Evict oldest if over capacity
389
+ while (this.order.length > this.maxSize) {
390
+ const oldId = this.order.pop();
391
+ if (oldId) this.entries.delete(oldId);
392
+ }
393
+ }
394
+ }
395
+ getAll() {
396
+ return this.order.map(id => this.entries.get(id)).filter(Boolean);
397
+ }
398
+ clear() {
399
+ this.entries.clear();
400
+ this.order = [];
401
+ }
402
+ get hasErrors() {
403
+ return this.order.some(id => this.entries.get(id)?.state === NetworkState.error);
404
+ }
405
+ get size() {
406
+ return this.order.length;
407
+ }
408
+ }
409
+ //# sourceMappingURL=network-interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NetworkState","DEFAULT_MAX_NETWORK_ENTRIES","DEFAULT_MAX_NETWORK_BODY_SIZE","activeCallback","isInstalled","interceptorOptions","_activeNetworkCallbacks","isInsideNetworkCallback","enterNetworkContext","exitNetworkContext","queueMicrotask","originals","fetch","XMLHttpRequest","generateId","Date","now","Math","random","toString","substring","shouldCapture","url","filters","length","lower","toLowerCase","some","f","includes","truncateBody","body","maxSize","undefined","limit","parseHeaders","headers","result","forEach","value","key","Object","keys","toCurl","entry","parts","method","push","requestHeaders","entries","requestBody","escaped","replace","join","installFetchInterceptor","originalFetch","global","interceptedFetch","input","init","URL","id","toUpperCase","startTime","state","pending","h","Headers","JSON","stringify","maxBodySize","response","endTime","duration","status","statusText","responseHeaders","completed","clone","text","responseSize","responseBody","err","error","Error","message","String","installXHRInterceptor","OriginalXHR","InterceptedXHR","xhr","shouldTrack","originalOpen","open","bind","rest","originalSetRequestHeader","setRequestHeader","name","originalSend","send","addEventListener","rawHeaders","getAllResponseHeaders","parsed","trim","split","line","idx","indexOf","responseText","responseType","defineProperty","prototype","installNetworkInterceptor","callback","options","uninstallNetworkInterceptor","NetworkBuffer","Map","order","constructor","upsert","has","set","unshift","oldId","pop","delete","getAll","map","get","filter","Boolean","clear","hasErrors","size"],"sourceRoot":"../../src","sources":["network-interceptor.ts"],"mappings":"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","ignoreList":[]}
@@ -10,11 +10,21 @@ export let LogLevel = /*#__PURE__*/function (LogLevel) {
10
10
  LogLevel["error"] = "error";
11
11
  return LogLevel;
12
12
  }({});
13
+ // ─── Network Types ───────────────────────────────────────────────────────────
14
+
15
+ export let NetworkState = /*#__PURE__*/function (NetworkState) {
16
+ NetworkState["pending"] = "pending";
17
+ NetworkState["completed"] = "completed";
18
+ NetworkState["error"] = "error";
19
+ return NetworkState;
20
+ }({});
13
21
 
14
22
  // ─── App Info ────────────────────────────────────────────────────────────────
15
23
 
16
24
  // ─── Quick Actions ───────────────────────────────────────────────────────────
17
25
 
26
+ // ─── Feature Flags ─────────────────────────────────────────────────────────
27
+
18
28
  // ─── Extensible Tabs ─────────────────────────────────────────────────────────
19
29
 
20
30
  // ─── Theme ───────────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"names":["LogLevel"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAGA;;AAEA,WAAYA,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;;AAgBpB;;AAOA;;AAWA;;AASA;;AAuBA;;AAkEA","ignoreList":[]}
1
+ {"version":3,"names":["LogLevel","NetworkState"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAGA;;AAEA,WAAYA,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAgBpB;;AAEA,WAAYC,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;;AAwBxB;;AAOA;;AAWA;;AAaA;;AASA;;AAuBA;;AAuFA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Backstage.d.ts","sourceRoot":"","sources":["../../src/Backstage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAA;AAMd,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAY,MAAM,SAAS,CAAA;AAIrE,eAAO,MAAM,SAAS,qFAmHrB,CAAA"}
1
+ {"version":3,"file":"Backstage.d.ts","sourceRoot":"","sources":["../../src/Backstage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAA;AAWd,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAA;AAInF,eAAO,MAAM,SAAS,qFAwKrB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { AppInfoItem, BackstageStyleOverrides, BackstageTab, LogEntry, QuickAction } from '../types';
2
+ import type { AppInfoItem, BackstageStyleOverrides, BackstageTab, FeatureFlag, LogEntry, NetworkEntry, QuickAction } from '../types';
3
3
  interface BackstagePanelProps {
4
4
  visible: boolean;
5
5
  onClose: () => void;
@@ -9,9 +9,15 @@ interface BackstagePanelProps {
9
9
  deviceInfo?: AppInfoItem[];
10
10
  state?: Record<string, unknown>;
11
11
  quickActions?: QuickAction[];
12
+ featureFlags?: FeatureFlag[];
13
+ onToggleFeatureFlag?: (key: string, value: boolean) => void;
12
14
  logs: LogEntry[];
13
15
  onRefreshLogs: () => void;
14
16
  onCopyLogs?: (logs: string) => void;
17
+ networkEntries: NetworkEntry[];
18
+ onRefreshNetwork: () => void;
19
+ onClearNetwork: () => void;
20
+ onCopyNetwork?: (text: string) => void;
15
21
  extraTabs?: BackstageTab[];
16
22
  styles?: BackstageStyleOverrides;
17
23
  children?: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"BackstagePanel.d.ts","sourceRoot":"","sources":["../../../src/components/BackstagePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAcvC,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,YAAY,EACZ,QAAQ,EACR,WAAW,EACZ,MAAM,UAAU,CAAA;AAIjB,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;IAGnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAG5B,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAGnC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAA;IAG1B,MAAM,CAAC,EAAE,uBAAuB,CAAA;IAChC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAWD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkGxD,CAAA"}
1
+ {"version":3,"file":"BackstagePanel.d.ts","sourceRoot":"","sources":["../../../src/components/BackstagePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAgBvC,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,WAAW,EACZ,MAAM,UAAU,CAAA;AAIjB,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;IAGnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAC5B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAC5B,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAG3D,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAGnC,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAGtC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAA;IAG1B,MAAM,CAAC,EAAE,uBAAuB,CAAA;IAChC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAeD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA2HxD,CAAA"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { FeatureFlag } from '../types';
3
+ interface FlagsTabProps {
4
+ flags: FeatureFlag[];
5
+ onToggle?: (key: string, value: boolean) => void;
6
+ }
7
+ export declare const FlagsTab: React.FC<FlagsTabProps>;
8
+ export {};
9
+ //# sourceMappingURL=FlagsTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlagsTab.d.ts","sourceRoot":"","sources":["../../../src/components/FlagsTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAGhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI3C,UAAU,aAAa;IACrB,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACjD;AAID,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAgG5C,CAAA"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { NetworkEntry } from '../types';
3
+ interface NetworkItemProps {
4
+ item: NetworkEntry;
5
+ onCopy?: (text: string) => void;
6
+ }
7
+ export declare const NetworkItem: React.FC<NetworkItemProps>;
8
+ export {};
9
+ //# sourceMappingURL=NetworkItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkItem.d.ts","sourceRoot":"","sources":["../../../src/components/NetworkItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAIpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAO5C,UAAU,gBAAgB;IACxB,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAoID,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAwLjD,CAAA"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { NetworkEntry } from '../types';
3
+ interface NetworkTabProps {
4
+ entries: NetworkEntry[];
5
+ onRefresh: () => void;
6
+ onClear: () => void;
7
+ onCopy?: (text: string) => void;
8
+ }
9
+ export declare const NetworkTab: React.FC<NetworkTabProps>;
10
+ export {};
11
+ //# sourceMappingURL=NetworkTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkTab.d.ts","sourceRoot":"","sources":["../../../src/components/NetworkTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAK5C,UAAU,eAAe;IACvB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAID,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA2HhD,CAAA"}
@@ -13,6 +13,8 @@ export declare const Metrics: {
13
13
  };
14
14
  export declare const DarkTheme: BackstageTheme;
15
15
  export declare const DEFAULT_MAX_LOGS = 500;
16
+ export declare const DEFAULT_MAX_NETWORK_ENTRIES = 500;
17
+ export declare const DEFAULT_MAX_NETWORK_BODY_SIZE = 65536;
16
18
  export declare const MonospaceFont: string;
17
19
  export declare const TestIDs: {
18
20
  floatingPill: string;
@@ -39,5 +41,11 @@ export declare const TestIDs: {
39
41
  copyButton: string;
40
42
  list: string;
41
43
  };
44
+ networkTab: {
45
+ section: string;
46
+ searchInput: string;
47
+ list: string;
48
+ clearButton: string;
49
+ };
42
50
  };
43
51
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,OAAO;;;;;;;;;;;CAWnB,CAAA;AAID,eAAO,MAAM,SAAS,EAAE,cAmBvB,CAAA;AAID,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAInC,eAAO,MAAM,aAAa,QAGxB,CAAA;AAIF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;CAyBnB,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,eAAO,MAAM,OAAO;;;;;;;;;;;CAWnB,CAAA;AAID,eAAO,MAAM,SAAS,EAAE,cAmBvB,CAAA;AAED,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAInC,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAC9C,eAAO,MAAM,6BAA6B,QAAQ,CAAA;AAIlD,eAAO,MAAM,aAAa,QAGxB,CAAA;AAIF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BnB,CAAA"}
@@ -1,4 +1,4 @@
1
1
  export { Backstage } from './Backstage';
2
- export type { BackstageProps, BackstageRef, BackstageTab, BackstageStyleOverrides, BackstageTheme, QuickAction, AppInfoItem, LogEntry, } from './types';
3
- export { LogLevel } from './types';
2
+ export type { BackstageProps, BackstageRef, BackstageTab, BackstageStyleOverrides, BackstageTheme, QuickAction, FeatureFlag, AppInfoItem, LogEntry, NetworkEntry, } from './types';
3
+ export { LogLevel, NetworkState } from './types';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,QAAQ,GACT,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import type { LogEntry } from './types';
2
2
  type LogCallback = (entry: LogEntry) => void;
3
- export declare function installInterceptor(callback: LogCallback, filters?: string[]): void;
3
+ export declare function installInterceptor(callback: LogCallback, filters?: string[], options?: {
4
+ autoFilterNetworkLogs?: boolean;
5
+ }): void;
4
6
  export declare function uninstallInterceptor(): void;
5
7
  export declare class LogBuffer {
6
8
  private logs;
@@ -1 +1 @@
1
- {"version":3,"file":"log-interceptor.d.ts","sourceRoot":"","sources":["../../src/log-interceptor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAcvC,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;AAyC5C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,IAAI,CAiCtF;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAW3C;AAID,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,SAAmB;IAItC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAO3B,MAAM,IAAI,QAAQ,EAAE;IAIpB,KAAK,IAAI,IAAI;IAIb,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
1
+ {"version":3,"file":"log-interceptor.d.ts","sourceRoot":"","sources":["../../src/log-interceptor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAevC,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;AA0C5C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,MAAM,EAAO,EACtB,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,IAAI,CAsCN;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAW3C;AAID,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,SAAmB;IAItC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAO3B,MAAM,IAAI,QAAQ,EAAE;IAIpB,KAAK,IAAI,IAAI;IAIb,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { NetworkEntry } from './types';
2
+ type NetworkCallback = (entry: NetworkEntry) => void;
3
+ interface NetworkInterceptorOptions {
4
+ filters?: string[];
5
+ maxBodySize?: number;
6
+ }
7
+ /**
8
+ * Returns true if the current call stack originated from within a network
9
+ * response handler (XHR load/error, fetch .then()). Used by the log
10
+ * interceptor to suppress network-related console.logs from the Logs tab.
11
+ */
12
+ export declare function isInsideNetworkCallback(): boolean;
13
+ /**
14
+ * Generates a cURL command string from a NetworkEntry.
15
+ */
16
+ export declare function toCurl(entry: NetworkEntry): string;
17
+ export declare function installNetworkInterceptor(callback: NetworkCallback, options?: NetworkInterceptorOptions): void;
18
+ export declare function uninstallNetworkInterceptor(): void;
19
+ export declare class NetworkBuffer {
20
+ private entries;
21
+ private order;
22
+ private maxSize;
23
+ constructor(maxSize?: number);
24
+ /**
25
+ * Upsert a network entry. If the entry already exists (same id),
26
+ * update it in place (e.g., pending → completed). Otherwise add new.
27
+ */
28
+ upsert(entry: NetworkEntry): void;
29
+ getAll(): NetworkEntry[];
30
+ clear(): void;
31
+ get hasErrors(): boolean;
32
+ get size(): number;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=network-interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-interceptor.d.ts","sourceRoot":"","sources":["../../src/network-interceptor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAK3C,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;AAEpD,UAAU,yBAAyB;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAYD;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAmDD;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CA0BlD;AAiRD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,yBAA8B,GACtC,IAAI,CAcN;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAelD;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,SAA8B;IAIjD;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAiBjC,MAAM,IAAI,YAAY,EAAE;IAIxB,KAAK,IAAI,IAAI;IAKb,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}