devlens-mcp 0.3.0 → 0.3.1

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 (162) hide show
  1. package/README.md +10 -21
  2. package/docs/setup-guide.md +11 -31
  3. package/package.json +1 -1
  4. package/.claude/settings.json +0 -12
  5. package/.claude/settings.local.json +0 -17
  6. package/bin/cli.ts +0 -22
  7. package/bin/register.ts +0 -96
  8. package/dist/src/config/devlens-config.d.ts +0 -92
  9. package/dist/src/config/devlens-config.d.ts.map +0 -1
  10. package/dist/src/config/devlens-config.js +0 -70
  11. package/dist/src/config/devlens-config.js.map +0 -1
  12. package/dist/src/index.d.ts +0 -35
  13. package/dist/src/index.d.ts.map +0 -1
  14. package/dist/src/index.js +0 -8
  15. package/dist/src/index.js.map +0 -1
  16. package/dist/src/metro/cdp-client.d.ts +0 -48
  17. package/dist/src/metro/cdp-client.d.ts.map +0 -1
  18. package/dist/src/metro/cdp-client.js +0 -127
  19. package/dist/src/metro/cdp-client.js.map +0 -1
  20. package/dist/src/metro/log-collector.d.ts +0 -30
  21. package/dist/src/metro/log-collector.d.ts.map +0 -1
  22. package/dist/src/metro/log-collector.js +0 -114
  23. package/dist/src/metro/log-collector.js.map +0 -1
  24. package/dist/src/metro/metro-bridge.d.ts +0 -56
  25. package/dist/src/metro/metro-bridge.d.ts.map +0 -1
  26. package/dist/src/metro/metro-bridge.js +0 -255
  27. package/dist/src/metro/metro-bridge.js.map +0 -1
  28. package/dist/src/metro/network-inspector.d.ts +0 -34
  29. package/dist/src/metro/network-inspector.d.ts.map +0 -1
  30. package/dist/src/metro/network-inspector.js +0 -100
  31. package/dist/src/metro/network-inspector.js.map +0 -1
  32. package/dist/src/platform/android/adb.d.ts +0 -50
  33. package/dist/src/platform/android/adb.d.ts.map +0 -1
  34. package/dist/src/platform/android/adb.js +0 -137
  35. package/dist/src/platform/android/adb.js.map +0 -1
  36. package/dist/src/platform/android/android-device.d.ts +0 -21
  37. package/dist/src/platform/android/android-device.d.ts.map +0 -1
  38. package/dist/src/platform/android/android-device.js +0 -94
  39. package/dist/src/platform/android/android-device.js.map +0 -1
  40. package/dist/src/platform/android/ui-automator.d.ts +0 -17
  41. package/dist/src/platform/android/ui-automator.d.ts.map +0 -1
  42. package/dist/src/platform/android/ui-automator.js +0 -126
  43. package/dist/src/platform/android/ui-automator.js.map +0 -1
  44. package/dist/src/platform/device-manager.d.ts +0 -28
  45. package/dist/src/platform/device-manager.d.ts.map +0 -1
  46. package/dist/src/platform/device-manager.js +0 -185
  47. package/dist/src/platform/device-manager.js.map +0 -1
  48. package/dist/src/platform/device.d.ts +0 -86
  49. package/dist/src/platform/device.d.ts.map +0 -1
  50. package/dist/src/platform/device.js +0 -7
  51. package/dist/src/platform/device.js.map +0 -1
  52. package/dist/src/platform/ios/accessibility.d.ts +0 -17
  53. package/dist/src/platform/ios/accessibility.d.ts.map +0 -1
  54. package/dist/src/platform/ios/accessibility.js +0 -159
  55. package/dist/src/platform/ios/accessibility.js.map +0 -1
  56. package/dist/src/platform/ios/ios-device.d.ts +0 -22
  57. package/dist/src/platform/ios/ios-device.d.ts.map +0 -1
  58. package/dist/src/platform/ios/ios-device.js +0 -97
  59. package/dist/src/platform/ios/ios-device.js.map +0 -1
  60. package/dist/src/platform/ios/simctl.d.ts +0 -54
  61. package/dist/src/platform/ios/simctl.d.ts.map +0 -1
  62. package/dist/src/platform/ios/simctl.js +0 -192
  63. package/dist/src/platform/ios/simctl.js.map +0 -1
  64. package/dist/src/server.d.ts +0 -3
  65. package/dist/src/server.d.ts.map +0 -1
  66. package/dist/src/server.js +0 -176
  67. package/dist/src/server.js.map +0 -1
  68. package/dist/src/snapshot/formatter.d.ts +0 -18
  69. package/dist/src/snapshot/formatter.d.ts.map +0 -1
  70. package/dist/src/snapshot/formatter.js +0 -86
  71. package/dist/src/snapshot/formatter.js.map +0 -1
  72. package/dist/src/snapshot/ref-registry.d.ts +0 -67
  73. package/dist/src/snapshot/ref-registry.d.ts.map +0 -1
  74. package/dist/src/snapshot/ref-registry.js +0 -169
  75. package/dist/src/snapshot/ref-registry.js.map +0 -1
  76. package/dist/src/snapshot/snapshot-differ.d.ts +0 -57
  77. package/dist/src/snapshot/snapshot-differ.d.ts.map +0 -1
  78. package/dist/src/snapshot/snapshot-differ.js +0 -153
  79. package/dist/src/snapshot/snapshot-differ.js.map +0 -1
  80. package/dist/src/tools/app-tools.d.ts +0 -71
  81. package/dist/src/tools/app-tools.d.ts.map +0 -1
  82. package/dist/src/tools/app-tools.js +0 -97
  83. package/dist/src/tools/app-tools.js.map +0 -1
  84. package/dist/src/tools/device-tools.d.ts +0 -53
  85. package/dist/src/tools/device-tools.d.ts.map +0 -1
  86. package/dist/src/tools/device-tools.js +0 -86
  87. package/dist/src/tools/device-tools.js.map +0 -1
  88. package/dist/src/tools/ds-tools.d.ts +0 -65
  89. package/dist/src/tools/ds-tools.d.ts.map +0 -1
  90. package/dist/src/tools/ds-tools.js +0 -314
  91. package/dist/src/tools/ds-tools.js.map +0 -1
  92. package/dist/src/tools/interaction-tools.d.ts +0 -248
  93. package/dist/src/tools/interaction-tools.d.ts.map +0 -1
  94. package/dist/src/tools/interaction-tools.js +0 -391
  95. package/dist/src/tools/interaction-tools.js.map +0 -1
  96. package/dist/src/tools/metro-tools.d.ts +0 -115
  97. package/dist/src/tools/metro-tools.d.ts.map +0 -1
  98. package/dist/src/tools/metro-tools.js +0 -270
  99. package/dist/src/tools/metro-tools.js.map +0 -1
  100. package/dist/src/tools/navigation-tools.d.ts +0 -36
  101. package/dist/src/tools/navigation-tools.d.ts.map +0 -1
  102. package/dist/src/tools/navigation-tools.js +0 -60
  103. package/dist/src/tools/navigation-tools.js.map +0 -1
  104. package/dist/src/tools/screenshot-tools.d.ts +0 -298
  105. package/dist/src/tools/screenshot-tools.d.ts.map +0 -1
  106. package/dist/src/tools/screenshot-tools.js +0 -565
  107. package/dist/src/tools/screenshot-tools.js.map +0 -1
  108. package/dist/src/tools/snapshot-tools.d.ts +0 -161
  109. package/dist/src/tools/snapshot-tools.d.ts.map +0 -1
  110. package/dist/src/tools/snapshot-tools.js +0 -479
  111. package/dist/src/tools/snapshot-tools.js.map +0 -1
  112. package/dist/src/utils/image-preprocess.d.ts +0 -49
  113. package/dist/src/utils/image-preprocess.d.ts.map +0 -1
  114. package/dist/src/utils/image-preprocess.js +0 -322
  115. package/dist/src/utils/image-preprocess.js.map +0 -1
  116. package/dist/src/utils/retry.d.ts +0 -21
  117. package/dist/src/utils/retry.d.ts.map +0 -1
  118. package/dist/src/utils/retry.js +0 -33
  119. package/dist/src/utils/retry.js.map +0 -1
  120. package/dist/src/visual/comparator.d.ts +0 -51
  121. package/dist/src/visual/comparator.d.ts.map +0 -1
  122. package/dist/src/visual/comparator.js +0 -119
  123. package/dist/src/visual/comparator.js.map +0 -1
  124. package/dist/src/visual/layout-analyzer.d.ts +0 -64
  125. package/dist/src/visual/layout-analyzer.d.ts.map +0 -1
  126. package/dist/src/visual/layout-analyzer.js +0 -198
  127. package/dist/src/visual/layout-analyzer.js.map +0 -1
  128. package/dist/src/visual/screenshot.d.ts +0 -17
  129. package/dist/src/visual/screenshot.d.ts.map +0 -1
  130. package/dist/src/visual/screenshot.js +0 -39
  131. package/dist/src/visual/screenshot.js.map +0 -1
  132. package/src/config/devlens-config.ts +0 -76
  133. package/src/index.ts +0 -5
  134. package/src/metro/cdp-client.ts +0 -160
  135. package/src/metro/log-collector.ts +0 -137
  136. package/src/metro/metro-bridge.ts +0 -307
  137. package/src/metro/network-inspector.ts +0 -134
  138. package/src/platform/android/adb.ts +0 -200
  139. package/src/platform/android/android-device.ts +0 -116
  140. package/src/platform/android/ui-automator.ts +0 -141
  141. package/src/platform/device-manager.ts +0 -229
  142. package/src/platform/device.ts +0 -110
  143. package/src/platform/ios/accessibility.ts +0 -189
  144. package/src/platform/ios/ios-device.ts +0 -116
  145. package/src/platform/ios/simctl.ts +0 -244
  146. package/src/server.ts +0 -228
  147. package/src/snapshot/formatter.ts +0 -102
  148. package/src/snapshot/ref-registry.ts +0 -230
  149. package/src/snapshot/snapshot-differ.ts +0 -220
  150. package/src/tools/app-tools.ts +0 -111
  151. package/src/tools/device-tools.ts +0 -96
  152. package/src/tools/ds-tools.ts +0 -395
  153. package/src/tools/interaction-tools.ts +0 -467
  154. package/src/tools/metro-tools.ts +0 -320
  155. package/src/tools/navigation-tools.ts +0 -71
  156. package/src/tools/screenshot-tools.ts +0 -698
  157. package/src/tools/snapshot-tools.ts +0 -585
  158. package/src/utils/image-preprocess.ts +0 -430
  159. package/src/utils/retry.ts +0 -51
  160. package/src/visual/comparator.ts +0 -191
  161. package/src/visual/layout-analyzer.ts +0 -283
  162. package/src/visual/screenshot.ts +0 -49
@@ -1,127 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.CdpClient = void 0;
7
- const ws_1 = __importDefault(require("ws"));
8
- class CdpClient {
9
- endpoint;
10
- ws = null;
11
- messageId = 0;
12
- pendingRequests = new Map();
13
- eventHandlers = new Map();
14
- connected = false;
15
- constructor(endpoint) {
16
- this.endpoint = endpoint;
17
- }
18
- /** Connect to the CDP endpoint */
19
- async connect() {
20
- return new Promise((resolve, reject) => {
21
- this.ws = new ws_1.default(this.endpoint);
22
- const timeout = setTimeout(() => {
23
- reject(new Error(`CDP connection timeout to ${this.endpoint}`));
24
- }, 5000);
25
- this.ws.on("open", () => {
26
- clearTimeout(timeout);
27
- this.connected = true;
28
- resolve();
29
- });
30
- this.ws.on("message", (data) => {
31
- try {
32
- const message = JSON.parse(data.toString());
33
- this.handleMessage(message);
34
- }
35
- catch {
36
- // Ignore malformed messages
37
- }
38
- });
39
- this.ws.on("close", () => {
40
- this.connected = false;
41
- // Reject all pending requests
42
- for (const [, { reject }] of this.pendingRequests) {
43
- reject(new Error("CDP connection closed"));
44
- }
45
- this.pendingRequests.clear();
46
- });
47
- this.ws.on("error", (err) => {
48
- clearTimeout(timeout);
49
- if (!this.connected) {
50
- reject(err);
51
- }
52
- });
53
- });
54
- }
55
- /** Send a CDP command and wait for the response */
56
- async send(method, params) {
57
- if (!this.ws || !this.connected) {
58
- throw new Error("CDP client not connected");
59
- }
60
- const id = ++this.messageId;
61
- const message = JSON.stringify({ id, method, params });
62
- return new Promise((resolve, reject) => {
63
- const timeout = setTimeout(() => {
64
- this.pendingRequests.delete(id);
65
- reject(new Error(`CDP request timeout: ${method}`));
66
- }, 10000);
67
- this.pendingRequests.set(id, {
68
- resolve: (result) => {
69
- clearTimeout(timeout);
70
- resolve(result);
71
- },
72
- reject: (error) => {
73
- clearTimeout(timeout);
74
- reject(error);
75
- },
76
- });
77
- this.ws.send(message);
78
- });
79
- }
80
- /** Register an event handler for CDP events */
81
- on(method, handler) {
82
- const handlers = this.eventHandlers.get(method) || [];
83
- handlers.push(handler);
84
- this.eventHandlers.set(method, handlers);
85
- }
86
- /** Remove event handlers for a method */
87
- off(method) {
88
- this.eventHandlers.delete(method);
89
- }
90
- /** Check if connected */
91
- isConnected() {
92
- return this.connected;
93
- }
94
- /** Close the connection */
95
- close() {
96
- if (this.ws) {
97
- this.ws.close();
98
- this.ws = null;
99
- this.connected = false;
100
- }
101
- }
102
- handleMessage(message) {
103
- // Response to a request
104
- if (message.id !== undefined) {
105
- const pending = this.pendingRequests.get(message.id);
106
- if (pending) {
107
- this.pendingRequests.delete(message.id);
108
- if (message.error) {
109
- pending.reject(new Error(message.error.message));
110
- }
111
- else {
112
- pending.resolve(message.result);
113
- }
114
- }
115
- return;
116
- }
117
- // Event notification
118
- if (message.method) {
119
- const handlers = this.eventHandlers.get(message.method) || [];
120
- for (const handler of handlers) {
121
- handler(message);
122
- }
123
- }
124
- }
125
- }
126
- exports.CdpClient = CdpClient;
127
- //# sourceMappingURL=cdp-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cdp-client.js","sourceRoot":"","sources":["../../../src/metro/cdp-client.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import type { CdpClient } from "./cdp-client.js";
2
- /**
3
- * Collects console.log/warn/error messages from the React Native app
4
- * via the CDP Console and Runtime domains.
5
- */
6
- export interface LogEntry {
7
- level: "log" | "info" | "warn" | "error" | "debug";
8
- message: string;
9
- timestamp: number;
10
- source?: string;
11
- }
12
- export declare class LogCollector {
13
- private cdp;
14
- private logs;
15
- private maxLogs;
16
- constructor(cdp: CdpClient);
17
- /** Start listening for console messages */
18
- start(): void;
19
- /** Get collected logs, optionally filtered by level and time */
20
- getLogs(options?: {
21
- level?: "log" | "info" | "warn" | "error" | "debug";
22
- since?: number;
23
- limit?: number;
24
- }): LogEntry[];
25
- /** Clear all collected logs */
26
- clear(): void;
27
- private addLog;
28
- private normalizeLevel;
29
- }
30
- //# sourceMappingURL=log-collector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log-collector.d.ts","sourceRoot":"","sources":["../../../src/metro/log-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAC;AAE7D;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IAIX,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAAe;gBAEV,GAAG,EAAE,SAAS;IAElC,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAyDb,gEAAgE;IAChE,OAAO,CAAC,OAAO,CAAC,EAAE;QAChB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;QACpD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,QAAQ,EAAE;IAsBd,+BAA+B;IAC/B,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,cAAc;CAkBvB"}
@@ -1,114 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogCollector = void 0;
4
- class LogCollector {
5
- cdp;
6
- logs = [];
7
- maxLogs = 500;
8
- constructor(cdp) {
9
- this.cdp = cdp;
10
- }
11
- /** Start listening for console messages */
12
- start() {
13
- // Listen for Console.messageAdded (older CDP)
14
- this.cdp.on("Console.messageAdded", (msg) => {
15
- const entry = msg.params?.message;
16
- if (entry) {
17
- this.addLog({
18
- level: this.normalizeLevel(entry.level),
19
- message: entry.text || "",
20
- timestamp: Date.now(),
21
- source: entry.source,
22
- });
23
- }
24
- });
25
- // Listen for Runtime.consoleAPICalled (newer CDP)
26
- this.cdp.on("Runtime.consoleAPICalled", (msg) => {
27
- const params = msg.params;
28
- if (params) {
29
- const args = params.args || [];
30
- const message = args
31
- .map((arg) => {
32
- if (arg.type === "string")
33
- return arg.value;
34
- if (arg.type === "number")
35
- return String(arg.value);
36
- if (arg.type === "boolean")
37
- return String(arg.value);
38
- if (arg.type === "undefined")
39
- return "undefined";
40
- if (arg.type === "object" && arg.value)
41
- return JSON.stringify(arg.value);
42
- if (arg.description)
43
- return arg.description;
44
- return String(arg.value ?? "");
45
- })
46
- .join(" ");
47
- this.addLog({
48
- level: this.normalizeLevel(params.type),
49
- message,
50
- timestamp: params.timestamp || Date.now(),
51
- });
52
- }
53
- });
54
- // Listen for Runtime.exceptionThrown
55
- this.cdp.on("Runtime.exceptionThrown", (msg) => {
56
- const details = msg.params?.exceptionDetails;
57
- if (details) {
58
- this.addLog({
59
- level: "error",
60
- message: details.text ||
61
- details.exception?.description ||
62
- "Unknown exception",
63
- timestamp: Date.now(),
64
- source: "exception",
65
- });
66
- }
67
- });
68
- }
69
- /** Get collected logs, optionally filtered by level and time */
70
- getLogs(options) {
71
- let filtered = this.logs;
72
- if (options?.level) {
73
- const levelOrder = { debug: 0, log: 1, info: 2, warn: 3, error: 4 };
74
- const minLevel = levelOrder[options.level] ?? 0;
75
- filtered = filtered.filter((log) => (levelOrder[log.level] ?? 0) >= minLevel);
76
- }
77
- if (options?.since) {
78
- filtered = filtered.filter((log) => log.timestamp >= options.since);
79
- }
80
- if (options?.limit) {
81
- filtered = filtered.slice(-options.limit);
82
- }
83
- return filtered;
84
- }
85
- /** Clear all collected logs */
86
- clear() {
87
- this.logs = [];
88
- }
89
- addLog(entry) {
90
- this.logs.push(entry);
91
- // Keep buffer bounded
92
- if (this.logs.length > this.maxLogs) {
93
- this.logs = this.logs.slice(-Math.floor(this.maxLogs * 0.8));
94
- }
95
- }
96
- normalizeLevel(level) {
97
- switch (level?.toLowerCase()) {
98
- case "warning":
99
- case "warn":
100
- return "warn";
101
- case "error":
102
- return "error";
103
- case "debug":
104
- case "verbose":
105
- return "debug";
106
- case "info":
107
- return "info";
108
- default:
109
- return "log";
110
- }
111
- }
112
- }
113
- exports.LogCollector = LogCollector;
114
- //# sourceMappingURL=log-collector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log-collector.js","sourceRoot":"","sources":["../../../src/metro/log-collector.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- import { LogCollector } from "./log-collector.js";
2
- import { NetworkInspector } from "./network-inspector.js";
3
- /**
4
- * Metro Bridge — manages the connection to Metro bundler's debugger
5
- * and provides access to console logs, network requests, and JS execution.
6
- *
7
- * Metro/Hermes exposes CDP endpoints. To discover available pages:
8
- * GET http://localhost:{port}/json
9
- *
10
- * The main debugger endpoint is typically:
11
- * ws://localhost:{port}/inspector/device?device=0&page=-1
12
- *
13
- * For newer React Native (0.76+) with the new debugger:
14
- * ws://localhost:{port}/inspector/device?device=0&page=1
15
- */
16
- export interface MetroStatus {
17
- /** Whether the Metro packager process is running and responding */
18
- running: boolean;
19
- /** The port being checked */
20
- port: number;
21
- /** Raw response from /status endpoint (e.g., "packager-status:running") */
22
- packagerStatus: string | null;
23
- /** Whether a CDP WebSocket connection is currently active */
24
- cdpConnected: boolean;
25
- /** Error message if Metro is unreachable */
26
- error?: string;
27
- }
28
- export declare class MetroBridge {
29
- private port;
30
- private cdp;
31
- private _logCollector;
32
- private _networkInspector;
33
- private _connected;
34
- constructor(port?: number);
35
- /** Connect to Metro bundler's debugger */
36
- connect(): Promise<void>;
37
- /** Disconnect from Metro */
38
- disconnect(): void;
39
- /** Check if connected to Metro */
40
- get connected(): boolean;
41
- /** Get the log collector */
42
- get logCollector(): LogCollector;
43
- /** Get the network inspector */
44
- get networkInspector(): NetworkInspector;
45
- /** Execute JavaScript in the React Native context */
46
- evaluate(expression: string): Promise<any>;
47
- /** Trigger a hot reload / fast refresh */
48
- hotReload(): Promise<void>;
49
- /** Get the React component tree by evaluating JS in the RN context */
50
- getComponentTree(maxDepth?: number): Promise<string>;
51
- /** Proactively check if Metro bundler is running and healthy */
52
- getStatus(): Promise<MetroStatus>;
53
- /** Discover the debugger WebSocket endpoint */
54
- private discoverEndpoint;
55
- }
56
- //# sourceMappingURL=metro-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metro-bridge.d.ts","sourceRoot":"","sources":["../../../src/metro/metro-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IAMV,OAAO,CAAC,IAAI;IALxB,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,UAAU,CAAkB;gBAEhB,IAAI,GAAE,MAAa;IAEvC,0CAA0C;IACpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB9B,4BAA4B;IAC5B,UAAU,IAAI,IAAI;IAUlB,kCAAkC;IAClC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,4BAA4B;IAC5B,IAAI,YAAY,IAAI,YAAY,CAK/B;IAED,gCAAgC;IAChC,IAAI,gBAAgB,IAAI,gBAAgB,CAKvC;IAED,qDAAqD;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAoBhD,0CAA0C;IACpC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAmChC,sEAAsE;IAChE,gBAAgB,CAAC,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAqF9D,gEAAgE;IAC1D,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAyBvC,+CAA+C;YACjC,gBAAgB;CAuC/B"}
@@ -1,255 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MetroBridge = void 0;
4
- const cdp_client_js_1 = require("./cdp-client.js");
5
- const log_collector_js_1 = require("./log-collector.js");
6
- const network_inspector_js_1 = require("./network-inspector.js");
7
- class MetroBridge {
8
- port;
9
- cdp = null;
10
- _logCollector = null;
11
- _networkInspector = null;
12
- _connected = false;
13
- constructor(port = 8081) {
14
- this.port = port;
15
- }
16
- /** Connect to Metro bundler's debugger */
17
- async connect() {
18
- if (this._connected)
19
- return;
20
- // Try to discover the debugger endpoint
21
- const endpoint = await this.discoverEndpoint();
22
- this.cdp = new cdp_client_js_1.CdpClient(endpoint);
23
- await this.cdp.connect();
24
- // Initialize collectors
25
- this._logCollector = new log_collector_js_1.LogCollector(this.cdp);
26
- this._networkInspector = new network_inspector_js_1.NetworkInspector(this.cdp);
27
- // Enable CDP domains
28
- await this.cdp.send("Runtime.enable");
29
- await this.cdp.send("Console.enable").catch(() => {
30
- // Console domain might not be available in all environments
31
- });
32
- // Start collecting
33
- this._logCollector.start();
34
- this._networkInspector.start();
35
- this._connected = true;
36
- }
37
- /** Disconnect from Metro */
38
- disconnect() {
39
- if (this.cdp) {
40
- this.cdp.close();
41
- this.cdp = null;
42
- }
43
- this._logCollector = null;
44
- this._networkInspector = null;
45
- this._connected = false;
46
- }
47
- /** Check if connected to Metro */
48
- get connected() {
49
- return this._connected && (this.cdp?.isConnected() ?? false);
50
- }
51
- /** Get the log collector */
52
- get logCollector() {
53
- if (!this._logCollector) {
54
- throw new Error("Not connected to Metro. Call connect() first.");
55
- }
56
- return this._logCollector;
57
- }
58
- /** Get the network inspector */
59
- get networkInspector() {
60
- if (!this._networkInspector) {
61
- throw new Error("Not connected to Metro. Call connect() first.");
62
- }
63
- return this._networkInspector;
64
- }
65
- /** Execute JavaScript in the React Native context */
66
- async evaluate(expression) {
67
- if (!this.cdp || !this._connected) {
68
- throw new Error("Not connected to Metro.");
69
- }
70
- const result = await this.cdp.send("Runtime.evaluate", {
71
- expression,
72
- returnByValue: true,
73
- awaitPromise: true,
74
- });
75
- if (result?.exceptionDetails) {
76
- throw new Error(`JS Error: ${result.exceptionDetails.text || result.exceptionDetails.exception?.description}`);
77
- }
78
- return result?.result?.value;
79
- }
80
- /** Trigger a hot reload / fast refresh */
81
- async hotReload() {
82
- try {
83
- // Method 1: Use the Metro reload endpoint
84
- const http = await import("http");
85
- await new Promise((resolve, reject) => {
86
- const req = http.request({
87
- hostname: "localhost",
88
- port: this.port,
89
- path: "/reload",
90
- method: "POST",
91
- }, (res) => {
92
- res.resume();
93
- resolve();
94
- });
95
- req.on("error", reject);
96
- req.setTimeout(5000, () => {
97
- req.destroy();
98
- reject(new Error("Reload request timeout"));
99
- });
100
- req.end();
101
- });
102
- }
103
- catch {
104
- // Method 2: Fallback - evaluate reload command via CDP
105
- if (this.cdp && this._connected) {
106
- await this.cdp.send("Runtime.evaluate", {
107
- expression: 'if (typeof __DEV__ !== "undefined" && __DEV__) { const DevSettings = require("react-native/Libraries/Utilities/DevSettings"); DevSettings.reload(); }',
108
- });
109
- }
110
- }
111
- }
112
- /** Get the React component tree by evaluating JS in the RN context */
113
- async getComponentTree(maxDepth = 10) {
114
- if (!this.cdp || !this._connected) {
115
- throw new Error("Not connected to Metro.");
116
- }
117
- // Inject a helper that traverses the React fiber tree
118
- const script = `
119
- (function() {
120
- try {
121
- // Find the root fiber
122
- const roots = [];
123
- const fiberRoots = document?.querySelectorAll?.('[data-reactroot]') || [];
124
-
125
- // For React Native, we need to find the fiber root differently
126
- // The __REACT_DEVTOOLS_GLOBAL_HOOK__ is available when DevTools is enabled
127
- const hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
128
- if (!hook || !hook.renderers) {
129
- return "React DevTools hook not available. Ensure the app is running in __DEV__ mode.";
130
- }
131
-
132
- const renderers = Array.from(hook.renderers.values());
133
- if (renderers.length === 0) {
134
- return "No React renderers found.";
135
- }
136
-
137
- // Get fiber roots from the hook
138
- const fiberRootSet = hook.getFiberRoots?.(renderers[0].rendererID || 1);
139
- if (!fiberRootSet || fiberRootSet.size === 0) {
140
- return "No fiber roots found. Is a React Native app running?";
141
- }
142
-
143
- function traverseFiber(fiber, depth, maxDepth) {
144
- if (!fiber || depth > maxDepth) return null;
145
-
146
- const name = fiber.type?.displayName || fiber.type?.name || fiber.type || 'Unknown';
147
- const props = {};
148
-
149
- if (fiber.memoizedProps) {
150
- for (const [key, value] of Object.entries(fiber.memoizedProps)) {
151
- if (key === 'children') continue;
152
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
153
- props[key] = value;
154
- } else if (typeof value === 'function') {
155
- props[key] = '[function]';
156
- }
157
- }
158
- }
159
-
160
- const children = [];
161
- let child = fiber.child;
162
- while (child) {
163
- const result = traverseFiber(child, depth + 1, maxDepth);
164
- if (result) children.push(result);
165
- child = child.sibling;
166
- }
167
-
168
- // Skip internal React types
169
- if (typeof name === 'number' || name === 'Unknown') {
170
- return children.length === 1 ? children[0] : children.length > 0 ? { type: 'Fragment', children } : null;
171
- }
172
-
173
- return {
174
- type: String(name),
175
- props: Object.keys(props).length > 0 ? props : undefined,
176
- children: children.length > 0 ? children : undefined,
177
- };
178
- }
179
-
180
- const root = Array.from(fiberRootSet)[0];
181
- const tree = traverseFiber(root.current, 0, ${maxDepth});
182
- return JSON.stringify(tree, null, 2);
183
- } catch (e) {
184
- return "Error getting component tree: " + e.message;
185
- }
186
- })()
187
- `;
188
- const result = await this.cdp.send("Runtime.evaluate", {
189
- expression: script,
190
- returnByValue: true,
191
- });
192
- return result?.result?.value || "Could not retrieve component tree";
193
- }
194
- /** Proactively check if Metro bundler is running and healthy */
195
- async getStatus() {
196
- const status = {
197
- running: false,
198
- port: this.port,
199
- packagerStatus: null,
200
- cdpConnected: this.connected,
201
- };
202
- try {
203
- const controller = new AbortController();
204
- const timeout = setTimeout(() => controller.abort(), 3000);
205
- const response = await fetch(`http://localhost:${this.port}/status`, {
206
- signal: controller.signal,
207
- });
208
- clearTimeout(timeout);
209
- const body = await response.text();
210
- status.packagerStatus = body.trim();
211
- status.running = body.includes("packager-status:running");
212
- }
213
- catch (err) {
214
- status.error = `Cannot reach Metro on port ${this.port}: ${err.message}`;
215
- }
216
- return status;
217
- }
218
- /** Discover the debugger WebSocket endpoint */
219
- async discoverEndpoint() {
220
- const http = await import("http");
221
- try {
222
- // Query Metro's page list
223
- const pages = await new Promise((resolve, reject) => {
224
- http
225
- .get(`http://localhost:${this.port}/json`, (res) => {
226
- let data = "";
227
- res.on("data", (chunk) => (data += chunk));
228
- res.on("end", () => {
229
- try {
230
- resolve(JSON.parse(data));
231
- }
232
- catch {
233
- resolve([]);
234
- }
235
- });
236
- })
237
- .on("error", reject);
238
- });
239
- // Find the best debugger page
240
- const debuggerPage = pages.find((p) => p.title?.includes("Hermes") ||
241
- p.title?.includes("React Native") ||
242
- p.webSocketDebuggerUrl);
243
- if (debuggerPage?.webSocketDebuggerUrl) {
244
- return debuggerPage.webSocketDebuggerUrl;
245
- }
246
- }
247
- catch {
248
- // Metro might not support /json endpoint
249
- }
250
- // Fallback to default endpoint
251
- return `ws://localhost:${this.port}/inspector/device?device=0&page=-1`;
252
- }
253
- }
254
- exports.MetroBridge = MetroBridge;
255
- //# sourceMappingURL=metro-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metro-bridge.js","sourceRoot":"","sources":["../../../src/metro/metro-bridge.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import type { CdpClient } from "./cdp-client.js";
2
- /**
3
- * Intercepts network requests from the React Native app via CDP's Network domain.
4
- * Captures fetch/XHR requests, their responses, and timing information.
5
- */
6
- export interface NetworkRequest {
7
- id: string;
8
- url: string;
9
- method: string;
10
- status?: number;
11
- statusText?: string;
12
- type?: string;
13
- startTime: number;
14
- endTime?: number;
15
- duration?: number;
16
- requestHeaders?: Record<string, string>;
17
- responseHeaders?: Record<string, string>;
18
- size?: number;
19
- error?: string;
20
- }
21
- export declare class NetworkInspector {
22
- private cdp;
23
- private requests;
24
- private maxRequests;
25
- constructor(cdp: CdpClient);
26
- /** Start intercepting network requests */
27
- start(): void;
28
- /** Get all captured network requests, optionally filtered by URL pattern */
29
- getRequests(urlPattern?: string): NetworkRequest[];
30
- /** Clear all captured requests */
31
- clear(): void;
32
- private trimRequests;
33
- }
34
- //# sourceMappingURL=network-inspector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-inspector.d.ts","sourceRoot":"","sources":["../../../src/metro/network-inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAC;AAE7D;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAIf,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,WAAW,CAAe;gBAEd,GAAG,EAAE,SAAS;IAElC,0CAA0C;IAC1C,KAAK,IAAI,IAAI;IAoEb,4EAA4E;IAC5E,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAclD,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,YAAY;CAerB"}