@rn-probe/cli 0.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.
@@ -0,0 +1,227 @@
1
+ import WebSocket from "ws";
2
+ import { state } from "./state.js";
3
+ const DEVTOOLS_PORT = 8097;
4
+ const RECONNECT_DELAY_MS = 2000;
5
+ const REQUEST_TIMEOUT_MS = 10_000;
6
+ // ── DevToolsBridge ────────────────────────────────────────────────────────────
7
+ export class DevToolsBridge {
8
+ ws = null;
9
+ connected = false;
10
+ pendingRequests = new Map();
11
+ componentTree = new Map();
12
+ networkLog = [];
13
+ perfEvents = [];
14
+ async connect() {
15
+ return new Promise((resolve) => {
16
+ this.tryConnect(resolve);
17
+ });
18
+ }
19
+ tryConnect(onFirstConnect) {
20
+ const ws = new WebSocket(`ws://localhost:${DEVTOOLS_PORT}`);
21
+ this.ws = ws;
22
+ ws.on("open", () => {
23
+ // Introduce ourselves as a DevTools frontend
24
+ ws.send(JSON.stringify({ type: "react-devtools-inject-backend" }));
25
+ this.connected = true;
26
+ state.devtoolsConnected = true;
27
+ onFirstConnect?.();
28
+ });
29
+ ws.on("message", (data) => {
30
+ this.handleMessage(JSON.parse(data.toString()));
31
+ });
32
+ ws.on("close", () => {
33
+ this.connected = false;
34
+ state.devtoolsConnected = false;
35
+ // Reconnect after delay
36
+ setTimeout(() => this.tryConnect(), RECONNECT_DELAY_MS);
37
+ });
38
+ ws.on("error", () => {
39
+ // Will trigger close which handles reconnect
40
+ onFirstConnect?.(); // resolve connect() even if DevTools unavailable
41
+ });
42
+ }
43
+ disconnect() {
44
+ this.ws?.close();
45
+ this.ws = null;
46
+ this.connected = false;
47
+ state.devtoolsConnected = false;
48
+ }
49
+ // ── Message dispatch ─────────────────────────────────────────────────────────
50
+ handleMessage(msg) {
51
+ // Resolve pending request if response matches
52
+ if (msg.type === "inspectElement" || msg.type === "getComponentTree") {
53
+ const pending = this.pendingRequests.get(msg.type);
54
+ if (pending) {
55
+ this.pendingRequests.delete(msg.type);
56
+ pending.resolve(msg.payload);
57
+ }
58
+ }
59
+ // Update component tree cache
60
+ if (msg.type === "operations" && msg.payload) {
61
+ this.applyTreeOperations(msg.payload);
62
+ }
63
+ // Capture network events
64
+ if (msg.type === "network-request-received" && msg.payload) {
65
+ const req = msg.payload;
66
+ const existing = this.networkLog.findIndex((r) => r.id === req.id);
67
+ if (existing >= 0) {
68
+ this.networkLog[existing] = { ...this.networkLog[existing], ...req };
69
+ }
70
+ else {
71
+ this.networkLog.push(req);
72
+ }
73
+ }
74
+ // Capture perf events
75
+ if (msg.type === "performance" && msg.payload) {
76
+ const p = msg.payload;
77
+ this.perfEvents.push({ ts: Date.now(), jsFps: p.jsFps, uiFps: p.uiFps });
78
+ if (this.perfEvents.length > 100)
79
+ this.perfEvents.shift();
80
+ }
81
+ }
82
+ applyTreeOperations(ops) {
83
+ // The React DevTools "operations" message encodes tree mutations as a flat
84
+ // integer array. For simplicity we rebuild from full snapshots sent by
85
+ // getComponentTree and only use this to detect staleness.
86
+ // A full operations parser is a future improvement.
87
+ void ops;
88
+ }
89
+ // ── Request helper ───────────────────────────────────────────────────────────
90
+ request(type, payload) {
91
+ if (!this.connected || !this.ws) {
92
+ throw new Error("RN DevTools not connected. Is your app running with dev mode enabled?");
93
+ }
94
+ return new Promise((resolve, reject) => {
95
+ const timer = setTimeout(() => {
96
+ this.pendingRequests.delete(type);
97
+ reject(new Error(`DevTools request '${type}' timed out`));
98
+ }, REQUEST_TIMEOUT_MS);
99
+ this.pendingRequests.set(type, {
100
+ resolve: (v) => { clearTimeout(timer); resolve(v); },
101
+ reject: (e) => { clearTimeout(timer); reject(e); },
102
+ });
103
+ this.ws.send(JSON.stringify({ type, payload }));
104
+ });
105
+ }
106
+ // ── Tree ─────────────────────────────────────────────────────────────────────
107
+ async getTree() {
108
+ // Request a fresh snapshot
109
+ const snapshot = await this.request("getComponentTree", { rendererID: 1 });
110
+ const nodes = new Map();
111
+ for (const n of snapshot.nodes)
112
+ nodes.set(n.id, n);
113
+ const roots = snapshot.nodes.filter((n) => {
114
+ // Root nodes are not referenced as a child by any other node
115
+ const allChildIds = new Set(snapshot.nodes.flatMap((x) => x.children));
116
+ return !allChildIds.has(n.id);
117
+ });
118
+ const lines = [];
119
+ const walk = (id, depth) => {
120
+ const node = nodes.get(id);
121
+ if (!node)
122
+ return;
123
+ lines.push(`${" ".repeat(depth)}[${id}] ${node.displayName ?? "(anonymous)"}`);
124
+ for (const childId of node.children)
125
+ walk(childId, depth + 1);
126
+ };
127
+ for (const root of roots)
128
+ walk(root.id, 0);
129
+ return lines.join("\n") || "(empty tree)";
130
+ }
131
+ // ── Inspect ──────────────────────────────────────────────────────────────────
132
+ async inspect(id) {
133
+ const result = await this.request("inspectElement", { id: Number(id), rendererID: 1, path: null });
134
+ if (!result)
135
+ return `Component ${id} not found.`;
136
+ const el = result.value;
137
+ const lines = [];
138
+ lines.push(`Component: ${el.displayName ?? "(anonymous)"}`);
139
+ if (el.source)
140
+ lines.push(`Source: ${el.source.fileName}:${el.source.lineNumber}`);
141
+ if (el.props && Object.keys(el.props).length > 0) {
142
+ lines.push("Props:");
143
+ for (const [k, v] of Object.entries(el.props)) {
144
+ lines.push(` ${k}: ${JSON.stringify(v)}`);
145
+ }
146
+ }
147
+ if (el.state !== null && el.state !== undefined) {
148
+ lines.push(`State: ${JSON.stringify(el.state, null, 2)}`);
149
+ }
150
+ if (el.hooks && el.hooks.length > 0) {
151
+ lines.push("Hooks:");
152
+ for (const h of el.hooks) {
153
+ lines.push(` ${h.name}: ${JSON.stringify(h.value)}`);
154
+ }
155
+ }
156
+ return lines.join("\n");
157
+ }
158
+ // ── Find ─────────────────────────────────────────────────────────────────────
159
+ async find(name) {
160
+ const snapshot = await this.request("getComponentTree", { rendererID: 1 });
161
+ const lower = name.toLowerCase();
162
+ const matches = snapshot.nodes.filter((n) => (n.displayName ?? "").toLowerCase().includes(lower));
163
+ if (matches.length === 0)
164
+ return `No components matching "${name}" found.`;
165
+ return matches
166
+ .map((n) => `[${n.id}] ${n.displayName ?? "(anonymous)"}`)
167
+ .join("\n");
168
+ }
169
+ // ── Eval ─────────────────────────────────────────────────────────────────────
170
+ async evaluate(script) {
171
+ // Use CDP evaluateOnCallFrame via DevTools bridge
172
+ const result = await this.request("evaluateOnCallFrame", { expression: script, callFrameId: "0" });
173
+ if (result.exceptionDetails) {
174
+ throw new Error(result.exceptionDetails.exception?.description ?? result.exceptionDetails.text);
175
+ }
176
+ return JSON.stringify(result.result, null, 2);
177
+ }
178
+ // ── Network ──────────────────────────────────────────────────────────────────
179
+ network(idx) {
180
+ if (this.networkLog.length === 0) {
181
+ return "No network requests captured.\nNote: Network inspection requires Hermes with network inspection enabled.";
182
+ }
183
+ if (idx !== undefined) {
184
+ const req = this.networkLog[idx];
185
+ if (!req)
186
+ return `No request at index ${idx}.`;
187
+ const lines = [
188
+ `[${idx}] ${req.method} ${req.url}`,
189
+ `Status: ${req.status ?? "pending"}`,
190
+ `Duration: ${req.duration !== undefined ? `${req.duration}ms` : "—"}`,
191
+ ];
192
+ if (req.requestHeaders) {
193
+ lines.push("Request Headers:");
194
+ for (const [k, v] of Object.entries(req.requestHeaders))
195
+ lines.push(` ${k}: ${v}`);
196
+ }
197
+ if (req.requestBody)
198
+ lines.push(`Request Body:\n${req.requestBody}`);
199
+ if (req.responseHeaders) {
200
+ lines.push("Response Headers:");
201
+ for (const [k, v] of Object.entries(req.responseHeaders))
202
+ lines.push(` ${k}: ${v}`);
203
+ }
204
+ if (req.responseBody)
205
+ lines.push(`Response Body:\n${req.responseBody}`);
206
+ return lines.join("\n");
207
+ }
208
+ return this.networkLog
209
+ .map((r, i) => `[${i}] ${r.method} ${r.url} — ${r.status ?? "pending"} (${r.duration !== undefined ? `${r.duration}ms` : "—"})`)
210
+ .join("\n");
211
+ }
212
+ // ── Perf ─────────────────────────────────────────────────────────────────────
213
+ getPerfMetrics() {
214
+ if (this.perfEvents.length === 0)
215
+ return "No performance events captured yet.";
216
+ const recent = this.perfEvents.slice(-10);
217
+ const avgJs = Math.round(recent.reduce((s, e) => s + e.jsFps, 0) / recent.length);
218
+ const avgUi = Math.round(recent.reduce((s, e) => s + e.uiFps, 0) / recent.length);
219
+ const slow = this.perfEvents.filter((e) => e.jsFps < 30 || e.uiFps < 30).length;
220
+ return [
221
+ `JS Thread FPS (avg): ${avgJs}`,
222
+ `UI Thread FPS (avg): ${avgUi}`,
223
+ `Slow frames (<30fps): ${slow}`,
224
+ ].join("\n");
225
+ }
226
+ }
227
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../src/daemon/devtools.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAkClC,iFAAiF;AAEjF,MAAM,OAAO,cAAc;IACjB,EAAE,GAAqB,IAAI,CAAC;IAC5B,SAAS,GAAG,KAAK,CAAC;IAClB,eAAe,GAAG,IAAI,GAAG,EAAyE,CAAC;IACnG,aAAa,GAA+B,IAAI,GAAG,EAAE,CAAC;IACtD,UAAU,GAAqB,EAAE,CAAC;IAClC,UAAU,GAAwD,EAAE,CAAC;IAE7E,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,cAA2B;QAC5C,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,kBAAkB,aAAa,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,6CAA6C;YAC7C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC/B,cAAc,EAAE,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAuB,EAAE,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAoB,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAChC,wBAAwB;YACxB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,6CAA6C;YAC7C,cAAc,EAAE,EAAE,CAAC,CAAC,iDAAiD;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,gFAAgF;IAExE,aAAa,CAAC,GAAoB;QACxC,8CAA8C;QAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAoB,CAAC,CAAC;QACrD,CAAC;QAED,yBAAyB;QACzB,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAyB,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,GAAG,CAAC,OAA2C,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG;gBAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,GAAc;QACxC,2EAA2E;QAC3E,uEAAuE;QACvE,0DAA0D;QAC1D,oDAAoD;QACpD,KAAK,GAAG,CAAC;IACX,CAAC;IAED,gFAAgF;IAExE,OAAO,CAAI,IAAY,EAAE,OAAiB;QAChD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,IAAI,aAAa,CAAC,CAAC,CAAC;YAC5D,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEvB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC7B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAM,CAAC,CAAC,CAAC,CAAC;gBACzD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACnD,CAAC,CAAC;YAEH,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAEhF,KAAK,CAAC,OAAO;QACX,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAA6B,kBAAkB,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACvG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACxC,6DAA6D;YAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC,CAAC;YAChF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;IAC5C,CAAC;IAED,gFAAgF;IAEhF,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,gBAAgB,EAChB,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAC9C,CAAC;QAEF,IAAI,CAAC,MAAM;YAAE,OAAO,aAAa,EAAE,aAAa,CAAC;QAEjD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QACxB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAEvF,IAAI,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,EAAE,CAAC,KAAK,IAAK,EAAE,CAAC,KAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAgD,EAAE,CAAC;gBACpE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,gFAAgF;IAEhF,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAA6B,kBAAkB,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACvG,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1C,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACpD,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,2BAA2B,IAAI,UAAU,CAAC;QAE3E,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;aACzD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,gFAAgF;IAEhF,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,kDAAkD;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,qBAAqB,EACrB,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CACzC,CAAC;QAEF,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAClG,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,gFAAgF;IAEhF,OAAO,CAAC,GAAY;QAClB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,0GAA0G,CAAC;QACpH,CAAC;QAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG;gBAAE,OAAO,uBAAuB,GAAG,GAAG,CAAC;YAC/C,MAAM,KAAK,GAAG;gBACZ,IAAI,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;gBACnC,aAAa,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE;gBACtC,aAAa,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE;aACtE,CAAC;YACF,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,GAAG,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAChC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,GAAG,CAAC,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,IAAI,CAAC,UAAU;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,IAAI,SAAS,KAAK,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;aAC/H,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,gFAAgF;IAEhF,cAAc;QACZ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,qCAAqC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QAEhF,OAAO;YACL,yBAAyB,KAAK,EAAE;YAChC,yBAAyB,KAAK,EAAE;YAChC,yBAAyB,IAAI,EAAE;SAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { MetroBridge } from "./metro.js";
2
+ import { DevToolsBridge } from "./devtools.js";
3
+ import { SimulatorBridge } from "./simulator.js";
4
+ export declare const metro: MetroBridge;
5
+ export declare const devtools: DevToolsBridge;
6
+ export declare const simulator: SimulatorBridge;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAajD,eAAO,MAAM,KAAK,aAAoB,CAAC;AACvC,eAAO,MAAM,QAAQ,gBAAuB,CAAC;AAC7C,eAAO,MAAM,SAAS,iBAAwB,CAAC"}
@@ -0,0 +1,124 @@
1
+ import net from "node:net";
2
+ import fs from "node:fs";
3
+ import { SOCKET_PATH } from "../ipc.js";
4
+ import { state } from "./state.js";
5
+ import { MetroBridge } from "./metro.js";
6
+ import { DevToolsBridge } from "./devtools.js";
7
+ import { SimulatorBridge } from "./simulator.js";
8
+ const handlers = new Map();
9
+ function register(method, fn) {
10
+ handlers.set(method, fn);
11
+ }
12
+ // ── Bridges ───────────────────────────────────────────────────────────────────
13
+ export const metro = new MetroBridge();
14
+ export const devtools = new DevToolsBridge();
15
+ export const simulator = new SimulatorBridge();
16
+ // ── Lifecycle handlers ────────────────────────────────────────────────────────
17
+ register("open", async (params) => {
18
+ if (params.metroUrl)
19
+ state.metroUrl = params.metroUrl;
20
+ if (params.expoMode)
21
+ state.expoMode = params.expoMode;
22
+ if (params.platform)
23
+ state.platform = params.platform;
24
+ if (params.targetUdid)
25
+ state.targetUdid = params.targetUdid;
26
+ metro.connect(state.metroUrl);
27
+ await devtools.connect();
28
+ return {
29
+ metroUrl: state.metroUrl,
30
+ expoMode: state.expoMode,
31
+ platform: state.platform,
32
+ metroConnected: state.metroConnected,
33
+ devtoolsConnected: state.devtoolsConnected,
34
+ };
35
+ });
36
+ register("close", async () => {
37
+ metro.disconnect();
38
+ devtools.disconnect();
39
+ cleanup();
40
+ process.exit(0);
41
+ });
42
+ // ── Metro handlers ────────────────────────────────────────────────────────────
43
+ register("bundle-status", async () => metro.getBundleStatus());
44
+ register("errors", async () => metro.getErrors());
45
+ register("logs", async (p) => metro.getLogs(Number(p.lines ?? 50)));
46
+ register("reload", async () => metro.reload());
47
+ register("restart-metro", async () => metro.restart());
48
+ // ── DevTools handlers ─────────────────────────────────────────────────────────
49
+ register("tree", async () => devtools.getTree());
50
+ register("inspect", async (p) => devtools.inspect(p.id));
51
+ register("find", async (p) => devtools.find(p.name));
52
+ register("eval", async (p) => devtools.evaluate(p.script));
53
+ register("network", async (p) => devtools.network(p.idx !== undefined ? Number(p.idx) : undefined));
54
+ register("logs-perf", async () => devtools.getPerfMetrics());
55
+ // ── Simulator handlers ────────────────────────────────────────────────────────
56
+ register("screenshot", async (p) => simulator.screenshot(p.udid));
57
+ register("tap", async (p) => simulator.tap(Number(p.x), Number(p.y), p.udid));
58
+ register("swipe", async (p) => simulator.swipe(Number(p.x1), Number(p.y1), Number(p.x2), Number(p.y2), p.udid));
59
+ register("viewport", async (p) => simulator.viewport(p.size, p.udid));
60
+ register("goto", async (p) => simulator.goto(p.screen, state.expoMode, p.scheme, p.udid));
61
+ register("back", async (p) => simulator.back(p.udid));
62
+ register("logs-native", async (p) => simulator.logsNative(state.bundleId ?? "com.example.app", p.udid));
63
+ register("type", async (p) => simulator.type(p.text, p.udid));
64
+ // ── IPC server ────────────────────────────────────────────────────────────────
65
+ function cleanup() {
66
+ try {
67
+ fs.unlinkSync(SOCKET_PATH);
68
+ }
69
+ catch {
70
+ // already gone
71
+ }
72
+ }
73
+ process.on("SIGTERM", () => { cleanup(); process.exit(0); });
74
+ process.on("SIGINT", () => { cleanup(); process.exit(0); });
75
+ process.on("exit", cleanup);
76
+ process.on("uncaughtException", (err) => {
77
+ console.error("[daemon] uncaught:", err);
78
+ cleanup();
79
+ process.exit(1);
80
+ });
81
+ // Remove stale socket from a previous crash
82
+ cleanup();
83
+ const server = net.createServer((socket) => {
84
+ let buffer = "";
85
+ socket.on("data", (chunk) => {
86
+ buffer += chunk.toString();
87
+ const lines = buffer.split("\n");
88
+ buffer = lines.pop() ?? "";
89
+ for (const line of lines) {
90
+ if (!line.trim())
91
+ continue;
92
+ handleRequest(socket, line);
93
+ }
94
+ });
95
+ socket.on("error", () => socket.destroy());
96
+ });
97
+ async function handleRequest(socket, raw) {
98
+ let req;
99
+ try {
100
+ req = JSON.parse(raw);
101
+ }
102
+ catch {
103
+ return;
104
+ }
105
+ const handler = handlers.get(req.method);
106
+ if (!handler) {
107
+ const err = { id: req.id, error: { message: `Unknown method: ${req.method}` } };
108
+ socket.write(JSON.stringify(err) + "\n");
109
+ return;
110
+ }
111
+ try {
112
+ const result = await handler(req.params ?? {});
113
+ const res = { id: req.id, result };
114
+ socket.write(JSON.stringify(res) + "\n");
115
+ }
116
+ catch (e) {
117
+ const err = { id: req.id, error: { message: e.message } };
118
+ socket.write(JSON.stringify(err) + "\n");
119
+ }
120
+ }
121
+ server.listen(SOCKET_PATH, () => {
122
+ console.log(`[daemon] listening on ${SOCKET_PATH}`);
123
+ });
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function appendMetroLog(line: string): void;
2
+ export declare class MetroBridge {
3
+ private baseUrl;
4
+ private metroProcess;
5
+ connect(metroUrl: string): void;
6
+ disconnect(): void;
7
+ getBundleStatus(): Promise<string>;
8
+ getErrors(): Promise<string>;
9
+ getLogs(lines: number): string;
10
+ reload(): Promise<string>;
11
+ restart(): Promise<string>;
12
+ private waitForMetro;
13
+ private get;
14
+ private post;
15
+ }
16
+ //# sourceMappingURL=metro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metro.d.ts","sourceRoot":"","sources":["../../src/daemon/metro.ts"],"names":[],"mappings":"AAeA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,QAG1C;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,YAAY,CAA0D;IAE9E,OAAO,CAAC,QAAQ,EAAE,MAAM;IAKxB,UAAU;IAMJ,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAelC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBlC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOxB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAyBlB,YAAY;IAY1B,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,IAAI;CAab"}
@@ -0,0 +1,118 @@
1
+ import http from "node:http";
2
+ import { state } from "./state.js";
3
+ // ── Ring buffer for Metro stdout ──────────────────────────────────────────────
4
+ const LOG_BUFFER_SIZE = 500;
5
+ const logBuffer = [];
6
+ export function appendMetroLog(line) {
7
+ if (logBuffer.length >= LOG_BUFFER_SIZE)
8
+ logBuffer.shift();
9
+ logBuffer.push(line);
10
+ }
11
+ // ── MetroBridge ───────────────────────────────────────────────────────────────
12
+ export class MetroBridge {
13
+ baseUrl = "http://localhost:8081";
14
+ metroProcess = null;
15
+ connect(metroUrl) {
16
+ this.baseUrl = metroUrl;
17
+ state.metroConnected = true;
18
+ }
19
+ disconnect() {
20
+ state.metroConnected = false;
21
+ }
22
+ // ── GET /status ─────────────────────────────────────────────────────────────
23
+ async getBundleStatus() {
24
+ const data = await this.get("/status").catch(() => null);
25
+ if (data === null) {
26
+ throw new Error(`Metro not reachable at ${this.baseUrl}. Is your dev server running?`);
27
+ }
28
+ const parsed = JSON.parse(data);
29
+ const lines = [];
30
+ lines.push(`Metro URL: ${this.baseUrl}`);
31
+ lines.push(`Bundle type: ${parsed.type ?? "unknown"}`);
32
+ lines.push(`Status: ${parsed.bundleStatus ?? JSON.stringify(parsed)}`);
33
+ return lines.join("\n");
34
+ }
35
+ // ── Errors ──────────────────────────────────────────────────────────────────
36
+ async getErrors() {
37
+ // Metro surfaces errors via /status (type=BundleTransformError) or cached error events.
38
+ // We check /status first, then fall back to the stored DevTools error list.
39
+ const data = await this.get("/status").catch(() => null);
40
+ if (data === null) {
41
+ throw new Error(`Metro not reachable at ${this.baseUrl}. Is your dev server running?`);
42
+ }
43
+ const parsed = JSON.parse(data);
44
+ if (parsed.type === "BundleTransformError") {
45
+ return `Build Error:\n${JSON.stringify(parsed, null, 2)}`;
46
+ }
47
+ return "No errors.";
48
+ }
49
+ // ── Logs ────────────────────────────────────────────────────────────────────
50
+ getLogs(lines) {
51
+ const tail = logBuffer.slice(-lines);
52
+ return tail.length > 0 ? tail.join("\n") : "(no Metro logs captured yet)";
53
+ }
54
+ // ── Reload ──────────────────────────────────────────────────────────────────
55
+ async reload() {
56
+ // Metro accepts a POST to /reload or a WebSocket message; try HTTP first.
57
+ await this.post("/reload", "").catch(() => {
58
+ // silent — Metro may not return 200 but still process it
59
+ });
60
+ return "Reload triggered.";
61
+ }
62
+ // ── Restart Metro ───────────────────────────────────────────────────────────
63
+ async restart() {
64
+ if (this.metroProcess) {
65
+ this.metroProcess.kill("SIGTERM");
66
+ this.metroProcess = null;
67
+ }
68
+ const { execa } = await import("execa");
69
+ const child = execa("npx", ["react-native", "start", "--reset-cache"], {
70
+ detached: false,
71
+ stdio: ["ignore", "pipe", "pipe"],
72
+ });
73
+ child.stdout?.on("data", (chunk) => {
74
+ for (const line of chunk.toString().split("\n")) {
75
+ if (line.trim())
76
+ appendMetroLog(line);
77
+ }
78
+ });
79
+ this.metroProcess = child;
80
+ // Wait up to 20s for Metro to be ready
81
+ await this.waitForMetro(20_000);
82
+ return "Metro restarted.";
83
+ }
84
+ async waitForMetro(timeoutMs) {
85
+ const deadline = Date.now() + timeoutMs;
86
+ while (Date.now() < deadline) {
87
+ const ok = await this.get("/status").then(() => true).catch(() => false);
88
+ if (ok)
89
+ return;
90
+ await new Promise((r) => setTimeout(r, 500));
91
+ }
92
+ throw new Error("Metro did not become ready within timeout.");
93
+ }
94
+ // ── HTTP helpers ─────────────────────────────────────────────────────────────
95
+ get(path) {
96
+ return new Promise((resolve, reject) => {
97
+ http.get(`${this.baseUrl}${path}`, (res) => {
98
+ let data = "";
99
+ res.on("data", (c) => { data += c.toString(); });
100
+ res.on("end", () => resolve(data));
101
+ }).on("error", reject);
102
+ });
103
+ }
104
+ post(path, body) {
105
+ return new Promise((resolve, reject) => {
106
+ const url = new URL(`${this.baseUrl}${path}`);
107
+ const req = http.request({ hostname: url.hostname, port: url.port, path: url.pathname, method: "POST" }, (res) => {
108
+ let data = "";
109
+ res.on("data", (c) => { data += c.toString(); });
110
+ res.on("end", () => resolve(data));
111
+ });
112
+ req.on("error", reject);
113
+ req.write(body);
114
+ req.end();
115
+ });
116
+ }
117
+ }
118
+ //# sourceMappingURL=metro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/daemon/metro.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AASnC,iFAAiF;AAEjF,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,SAAS,CAAC,MAAM,IAAI,eAAe;QAAE,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,iFAAiF;AAEjF,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,uBAAuB,CAAC;IAClC,YAAY,GAAqD,IAAI,CAAC;IAE9E,OAAO,CAAC,QAAgB;QACtB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,UAAU;QACR,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,+EAA+E;IAE/E,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,+BAA+B,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;QAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,+EAA+E;IAE/E,KAAK,CAAC,SAAS;QACb,wFAAwF;QACxF,4EAA4E;QAC5E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,+BAA+B,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC3C,OAAO,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5D,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,+EAA+E;IAE/E,OAAO,CAAC,KAAa;QACnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC;IAC5E,CAAC;IAED,+EAA+E;IAE/E,KAAK,CAAC,MAAM;QACV,0EAA0E;QAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,yDAAyD;QAC3D,CAAC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,+EAA+E;IAE/E,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE;YACrE,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,KAA6D,CAAC;QAElF,uCAAuC;QACvC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,SAAiB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACzE,IAAI,EAAE;gBAAE,OAAO;YACf,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,gFAAgF;IAExE,GAAG,CAAC,IAAY;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,IAAY;QACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC/G,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import { ExpoMode } from "./state.js";
2
+ export declare class SimulatorBridge {
3
+ private get platform();
4
+ screenshot(udid?: string): Promise<string>;
5
+ tap(x: number, y: number, udid?: string): Promise<string>;
6
+ swipe(x1: number, y1: number, x2: number, y2: number, udid?: string): Promise<string>;
7
+ viewport(size?: string, udid?: string): Promise<string>;
8
+ goto(screen: string, expoMode: ExpoMode, scheme?: string, udid?: string): Promise<string>;
9
+ private buildDeepLink;
10
+ back(udid?: string): Promise<string>;
11
+ logsNative(bundleId: string, udid?: string): Promise<string>;
12
+ type(text: string, udid?: string): Promise<string>;
13
+ private adbDevice;
14
+ }
15
+ //# sourceMappingURL=simulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator.d.ts","sourceRoot":"","sources":["../../src/daemon/simulator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAS,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI7C,qBAAa,eAAe;IAC1B,OAAO,KAAK,QAAQ,GAA6B;IAI3C,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1C,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAerF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BvD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW/F,OAAO,CAAC,aAAa;IAcf,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa5D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAc1C,SAAS;CAMxB"}