@farmslot/adapter-rn 0.15.0 → 0.17.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.
- package/CHANGELOG.md +14 -0
- package/README.md +48 -10
- package/bridge-runtime/bridge-core.cjs +1481 -0
- package/bridge-runtime/console-forwarder.cjs +485 -0
- package/bridge-runtime/lib/bridge-errors.cjs +108 -0
- package/bridge-runtime/lib/cdp-eval.cjs +118 -0
- package/bridge-runtime/lib/config.cjs +68 -0
- package/bridge-runtime/lib/console-format.cjs +54 -0
- package/bridge-runtime/lib/devtools-proxy.cjs +169 -0
- package/bridge-runtime/lib/issue-capture.cjs +86 -0
- package/bridge-runtime/lib/match-bridge-target.cjs +89 -0
- package/bridge-runtime/lib/target-discovery.cjs +436 -0
- package/bridge-runtime/lib/ws-client.cjs +119 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/devices.d.ts +16 -0
- package/dist/devices.d.ts.map +1 -0
- package/dist/devices.js +131 -0
- package/dist/devices.js.map +1 -0
- package/dist/doctor.js +1 -1
- package/dist/doctor.js.map +1 -1
- package/dist/fingerprint-baseline.d.ts +8 -0
- package/dist/fingerprint-baseline.d.ts.map +1 -0
- package/dist/fingerprint-baseline.js +68 -0
- package/dist/fingerprint-baseline.js.map +1 -0
- package/dist/frame-metrics.d.ts +26 -0
- package/dist/frame-metrics.d.ts.map +1 -0
- package/dist/frame-metrics.js +134 -0
- package/dist/frame-metrics.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/metro-env.d.ts +11 -0
- package/dist/metro-env.d.ts.map +1 -0
- package/dist/metro-env.js +29 -0
- package/dist/metro-env.js.map +1 -0
- package/dist/source-freshness.d.ts +11 -0
- package/dist/source-freshness.d.ts.map +1 -0
- package/dist/source-freshness.js +98 -0
- package/dist/source-freshness.js.map +1 -0
- package/dist/tool-paths.d.ts +13 -0
- package/dist/tool-paths.d.ts.map +1 -0
- package/dist/tool-paths.js +125 -0
- package/dist/tool-paths.js.map +1 -0
- package/dist/video-recorder.d.ts +7 -0
- package/dist/video-recorder.d.ts.map +1 -0
- package/dist/video-recorder.js +250 -0
- package/dist/video-recorder.js.map +1 -0
- package/metro/coalesce-metro-log.cjs +28 -0
- package/metro/launch-metro.cjs +84 -0
- package/metro/metro-config.cjs +92 -0
- package/metro/metro-log-generation.cjs +116 -0
- package/package.json +27 -7
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const http = require('node:http');
|
|
4
|
+
const {
|
|
5
|
+
loadSimulatorName,
|
|
6
|
+
loadAndroidDevice,
|
|
7
|
+
loadAndroidTargetDeviceName,
|
|
8
|
+
} = require('./config.cjs');
|
|
9
|
+
const { createWSClient } = require('./ws-client.cjs');
|
|
10
|
+
const { BRIDGE_ERROR_CODES, coded } = require('./bridge-errors.cjs');
|
|
11
|
+
|
|
12
|
+
const FETCH_TIMEOUT_MS = Number.parseInt(process.env.CDP_TIMEOUT || '30000', 10);
|
|
13
|
+
const DISCOVERY_RETRY_DELAY_MS = 500;
|
|
14
|
+
const FETCH_RETRIES = Number.parseInt(
|
|
15
|
+
process.env.CDP_DISCOVERY_RETRIES ||
|
|
16
|
+
String(Math.max(3, Math.ceil(FETCH_TIMEOUT_MS / DISCOVERY_RETRY_DELAY_MS))),
|
|
17
|
+
10,
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
/** Fetch JSON from a URL (http only, no external deps) */
|
|
21
|
+
function fetchJSONOnce(url) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const req = http.get(url, (res) => {
|
|
24
|
+
let data = '';
|
|
25
|
+
res.on('data', (chunk) => (data += chunk));
|
|
26
|
+
res.on('end', () => {
|
|
27
|
+
try {
|
|
28
|
+
resolve(JSON.parse(data));
|
|
29
|
+
} catch (e) {
|
|
30
|
+
reject(new Error(`Failed to parse JSON from ${url}: ${e.message}`));
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
req.on('error', reject);
|
|
35
|
+
req.setTimeout(FETCH_TIMEOUT_MS, () => {
|
|
36
|
+
req.destroy();
|
|
37
|
+
reject(new Error(`Timeout fetching ${url} after ${FETCH_TIMEOUT_MS}ms`));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function fetchJSON(url, acceptResponse) {
|
|
43
|
+
let lastError;
|
|
44
|
+
let lastResponse;
|
|
45
|
+
for (let attempt = 1; attempt <= FETCH_RETRIES; attempt++) {
|
|
46
|
+
try {
|
|
47
|
+
const response = await fetchJSONOnce(url);
|
|
48
|
+
lastError = undefined;
|
|
49
|
+
lastResponse = response;
|
|
50
|
+
if (!acceptResponse || (await acceptResponse(response))) return response;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
lastError = error;
|
|
53
|
+
}
|
|
54
|
+
if (attempt === FETCH_RETRIES) break;
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, DISCOVERY_RETRY_DELAY_MS));
|
|
56
|
+
}
|
|
57
|
+
if (lastError !== undefined) throw lastError;
|
|
58
|
+
if (lastResponse !== undefined) return lastResponse;
|
|
59
|
+
throw lastError;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Quick probe: connect to a CDP target, evaluate `__DEV__`, disconnect.
|
|
64
|
+
* Returns true if __AGENTIC__ is installed, false otherwise.
|
|
65
|
+
*/
|
|
66
|
+
async function probeTarget(wsUrl) {
|
|
67
|
+
return (await probeTargetDetailed(wsUrl)) === 'agentic';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Three-state probe so callers can tell a pre-__AGENTIC__ build apart from a
|
|
72
|
+
* dead target:
|
|
73
|
+
* 'agentic' — JS runtime answered and __AGENTIC__ is installed.
|
|
74
|
+
* 'responsive' — the target evaluated JS but has no __AGENTIC__ (an app build
|
|
75
|
+
* that predates the bridge, or a non-runtime page).
|
|
76
|
+
* 'unreachable' — connect/eval failed.
|
|
77
|
+
*/
|
|
78
|
+
async function probeTargetDetailed(wsUrl) {
|
|
79
|
+
try {
|
|
80
|
+
const client = await createWSClient(wsUrl, 3000);
|
|
81
|
+
try {
|
|
82
|
+
const result = await client.send('Runtime.evaluate', {
|
|
83
|
+
expression: '(function(){ return typeof globalThis.__AGENTIC__; })()',
|
|
84
|
+
returnByValue: true,
|
|
85
|
+
awaitPromise: false,
|
|
86
|
+
});
|
|
87
|
+
return result?.result?.value === 'object' ? 'agentic' : 'responsive';
|
|
88
|
+
} finally {
|
|
89
|
+
client.close();
|
|
90
|
+
}
|
|
91
|
+
} catch {
|
|
92
|
+
// Connection failed — target is not usable at all
|
|
93
|
+
return 'unreachable';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Filter Metro /json/list targets to debugger-capable RN/Hermes pages and rank
|
|
99
|
+
* them JS-runtime-first. Pre-RN-0.81 titles say "React Native"/"Hermes";
|
|
100
|
+
* RN 0.81+ Bridgeless titles are bundle-id-only (e.g. "io.metamask.MetaMask
|
|
101
|
+
* (mm-5)") with the runtime kind in `description`. Each device exposes
|
|
102
|
+
* multiple pages — page 1 is the native C++ runtime; the JS runtime (console,
|
|
103
|
+
* __AGENTIC__) has a higher page number, so after the sort the first candidate
|
|
104
|
+
* per device is its JS runtime.
|
|
105
|
+
*/
|
|
106
|
+
function rankRuntimeCandidates(targets) {
|
|
107
|
+
const candidates = (Array.isArray(targets) ? targets : []).filter(
|
|
108
|
+
(t) =>
|
|
109
|
+
t.webSocketDebuggerUrl &&
|
|
110
|
+
((t.title && (/react/i.test(t.title) || /hermes/i.test(t.title))) ||
|
|
111
|
+
/bridgeless|hermes/i.test(t.description || '')),
|
|
112
|
+
);
|
|
113
|
+
candidates.sort((a, b) => {
|
|
114
|
+
const aPage = Number.parseInt((a.id || '').split('-').pop() || '0', 10);
|
|
115
|
+
const bPage = Number.parseInt((b.id || '').split('-').pop() || '0', 10);
|
|
116
|
+
return bPage - aPage;
|
|
117
|
+
});
|
|
118
|
+
return candidates;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function targetDeviceIdentity(target) {
|
|
122
|
+
try {
|
|
123
|
+
const device = new URL(target.webSocketDebuggerUrl).searchParams.get('device');
|
|
124
|
+
if (device) return device;
|
|
125
|
+
} catch {
|
|
126
|
+
// Fall back to Metro's display identity when the debugger URL is malformed.
|
|
127
|
+
}
|
|
128
|
+
// Without Metro's device id there is no safe way to collapse same-name pages
|
|
129
|
+
// into one physical device. Keep each debugger target distinct and fail closed
|
|
130
|
+
// on ambiguity instead of silently choosing between devices.
|
|
131
|
+
return target.webSocketDebuggerUrl || target.deviceName || '';
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Discover the Hermes CDP WebSocket URL from Metro's /json/list endpoint.
|
|
136
|
+
*
|
|
137
|
+
* Multi-simulator support:
|
|
138
|
+
* - When IOS_SIMULATOR is set, filters targets by deviceName
|
|
139
|
+
* - With Hermes bridgeless mode, there are multiple pages per device:
|
|
140
|
+
* page 1 = native C++ runtime, page 2+ = JS runtime (where __AGENTIC__ lives)
|
|
141
|
+
* - We probe candidates to find the one with __AGENTIC__ installed
|
|
142
|
+
*/
|
|
143
|
+
async function discoverTarget(port, { probe = true } = {}) {
|
|
144
|
+
const listUrl = `http://127.0.0.1:${port}/json/list`;
|
|
145
|
+
const androidTargetName = loadAndroidTargetDeviceName();
|
|
146
|
+
const androidDevice = loadAndroidDevice();
|
|
147
|
+
const adbSerial = process.env.ADB_SERIAL || process.env.ANDROID_SERIAL || '';
|
|
148
|
+
const androidPinned = Boolean(androidTargetName || androidDevice);
|
|
149
|
+
const simName = loadSimulatorName();
|
|
150
|
+
const iosPinned =
|
|
151
|
+
process.env.RECIPE_RN_EXPLICIT_PLATFORM === 'ios' || Boolean(process.env.SIM_UDID);
|
|
152
|
+
const matchesAndroidPin = (target) =>
|
|
153
|
+
androidTargetName
|
|
154
|
+
? target.deviceName !== simName &&
|
|
155
|
+
(target.deviceName === androidTargetName ||
|
|
156
|
+
(target.deviceName != null && target.deviceName.startsWith(androidTargetName)))
|
|
157
|
+
: target.deviceName === androidDevice;
|
|
158
|
+
let acceptedPinnedCandidate;
|
|
159
|
+
let targets;
|
|
160
|
+
try {
|
|
161
|
+
targets = await fetchJSON(listUrl, async (response) => {
|
|
162
|
+
const runtimeCandidates = rankRuntimeCandidates(response);
|
|
163
|
+
if (runtimeCandidates.length === 0) return false;
|
|
164
|
+
if (androidPinned) {
|
|
165
|
+
const pinnedCandidates = runtimeCandidates.filter(matchesAndroidPin);
|
|
166
|
+
for (const candidate of pinnedCandidates) {
|
|
167
|
+
if (!probe || (await probeTarget(candidate.webSocketDebuggerUrl))) {
|
|
168
|
+
acceptedPinnedCandidate = candidate;
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
if (iosPinned && simName) {
|
|
175
|
+
const pinnedCandidates = runtimeCandidates.filter(
|
|
176
|
+
(candidate) => candidate.deviceName === simName,
|
|
177
|
+
);
|
|
178
|
+
for (const candidate of pinnedCandidates) {
|
|
179
|
+
if (!probe || (await probeTarget(candidate.webSocketDebuggerUrl))) {
|
|
180
|
+
acceptedPinnedCandidate = candidate;
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
});
|
|
188
|
+
} catch (e) {
|
|
189
|
+
throw coded(
|
|
190
|
+
new Error(`Cannot reach Metro at ${listUrl}. Is Metro running?\n ${e.message}`),
|
|
191
|
+
BRIDGE_ERROR_CODES.METRO_UNREACHABLE,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (!Array.isArray(targets) || targets.length === 0) {
|
|
196
|
+
throw coded(new Error(`No debug targets found at ${listUrl}`), BRIDGE_ERROR_CODES.NO_TARGET);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Filter to React Native / Hermes targets with a WebSocket URL
|
|
200
|
+
let candidates = rankRuntimeCandidates(targets);
|
|
201
|
+
|
|
202
|
+
// Android pin identities (loaded before the simulator filter so an explicit
|
|
203
|
+
// android pin can take precedence over an ambient simulator name):
|
|
204
|
+
// ANDROID_TARGET_DEVICE_NAME — Metro-compatible model prefix resolved by bridge.mjs
|
|
205
|
+
// from the adb serial via `adb -s <serial> shell getprop ro.product.model`.
|
|
206
|
+
// Example: "Pixel 6" matches Metro deviceName "Pixel 6 - 16 - API 36".
|
|
207
|
+
// ANDROID_DEVICE — exact user-specified Metro deviceName.
|
|
208
|
+
// Filter by simulator name if IOS_SIMULATOR is set — but never when an android
|
|
209
|
+
// pin is present: dual-platform slots carry an ambient IOS_SIMULATOR in their
|
|
210
|
+
// context, and letting it win here sends a pinned android action to the iOS
|
|
211
|
+
// target. No-match keeps the full candidate set (ambient sim configs tolerate a
|
|
212
|
+
// sim that is not currently attached).
|
|
213
|
+
if (simName && !androidPinned) {
|
|
214
|
+
const deviceFiltered = candidates.filter((t) => t.deviceName === simName);
|
|
215
|
+
if (deviceFiltered.length > 0) {
|
|
216
|
+
candidates = deviceFiltered;
|
|
217
|
+
} else if (iosPinned) {
|
|
218
|
+
throw coded(
|
|
219
|
+
new Error(`Pinned iOS simulator '${simName}' did not match any Metro target.`),
|
|
220
|
+
BRIDGE_ERROR_CODES.NO_TARGET,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Android pin enforcement — at ANY candidate count. A pin gated on
|
|
226
|
+
// candidates.length > 1 silently accepted a single WRONG candidate (observed
|
|
227
|
+
// live: the pinned Pixel's target dropped off Metro while the iOS target
|
|
228
|
+
// remained; the pin was ignored and the recipe drove the simulator). When a
|
|
229
|
+
// device is pinned, we MUST NOT silently fall back to another target; an
|
|
230
|
+
// unmatchable pin fails fast with diagnostics.
|
|
231
|
+
if (androidPinned) {
|
|
232
|
+
let androidFiltered = [];
|
|
233
|
+
|
|
234
|
+
if (androidTargetName) {
|
|
235
|
+
// Model prefix match: "Pixel 6" matches "Pixel 6 - 16 - API 36". Metro's
|
|
236
|
+
// /json/list has no explicit platform field, so scope the ANDROID pin by
|
|
237
|
+
// excluding the one iOS identity we do know (the pinned simulator name) —
|
|
238
|
+
// a simulator named to shadow a model string must not satisfy an android pin.
|
|
239
|
+
androidFiltered = candidates.filter(matchesAndroidPin);
|
|
240
|
+
const matchingDeviceIdentities = [...new Set(androidFiltered.map(targetDeviceIdentity))];
|
|
241
|
+
if (matchingDeviceIdentities.length > 1) {
|
|
242
|
+
// Two same-model devices produce identical Metro model prefixes — the pin
|
|
243
|
+
// is genuinely ambiguous. Native + JS pages share the same Metro device
|
|
244
|
+
// identity and must remain available for probing.
|
|
245
|
+
const ambiguousList = androidFiltered
|
|
246
|
+
.map(
|
|
247
|
+
(target) =>
|
|
248
|
+
` deviceName=${JSON.stringify(target.deviceName || '')} ws=${target.webSocketDebuggerUrl || ''}`,
|
|
249
|
+
)
|
|
250
|
+
.join('\n');
|
|
251
|
+
throw coded(
|
|
252
|
+
new Error(
|
|
253
|
+
`Pinned Android device is ambiguous: model '${androidTargetName}' matches ${matchingDeviceIdentities.length} Metro devices.\n` +
|
|
254
|
+
` Requested --device (ADB_SERIAL): ${adbSerial || '(not set)'}\n` +
|
|
255
|
+
` Matching Metro targets:\n${ambiguousList}\n` +
|
|
256
|
+
` Set ANDROID_DEVICE to the exact Metro deviceName to disambiguate.`,
|
|
257
|
+
),
|
|
258
|
+
BRIDGE_ERROR_CODES.NO_TARGET,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
if (androidFiltered.length === 0) {
|
|
262
|
+
// Pinned device could not be matched — never silently pick another target.
|
|
263
|
+
const candidateList = targets
|
|
264
|
+
.map(
|
|
265
|
+
(t) =>
|
|
266
|
+
` deviceName=${JSON.stringify(t.deviceName || '')} ws=${t.webSocketDebuggerUrl || ''}`,
|
|
267
|
+
)
|
|
268
|
+
.join('\n');
|
|
269
|
+
throw coded(
|
|
270
|
+
new Error(
|
|
271
|
+
`Pinned Android device did not match any Metro target.\n` +
|
|
272
|
+
` Requested --device (ADB_SERIAL): ${adbSerial || '(not set)'}\n` +
|
|
273
|
+
` Resolved model (ANDROID_TARGET_DEVICE_NAME): ${androidTargetName}\n` +
|
|
274
|
+
` ANDROID_DEVICE: ${androidDevice || '(not set)'}\n` +
|
|
275
|
+
` Metro /json/list candidates:\n${candidateList}`,
|
|
276
|
+
),
|
|
277
|
+
BRIDGE_ERROR_CODES.NO_TARGET,
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
candidates = androidFiltered;
|
|
281
|
+
} else if (androidDevice) {
|
|
282
|
+
// Exact Metro deviceName match when the user set ANDROID_DEVICE directly.
|
|
283
|
+
androidFiltered = candidates.filter(matchesAndroidPin);
|
|
284
|
+
if (androidFiltered.length === 0) {
|
|
285
|
+
// Pinned by exact Metro name but no candidate matched — fail fast.
|
|
286
|
+
const candidateList = targets
|
|
287
|
+
.map(
|
|
288
|
+
(t) =>
|
|
289
|
+
` deviceName=${JSON.stringify(t.deviceName || '')} ws=${t.webSocketDebuggerUrl || ''}`,
|
|
290
|
+
)
|
|
291
|
+
.join('\n');
|
|
292
|
+
throw coded(
|
|
293
|
+
new Error(
|
|
294
|
+
`Pinned Android device (ANDROID_DEVICE='${androidDevice}') did not match any Metro target.\n` +
|
|
295
|
+
` ADB_SERIAL: ${adbSerial || '(not set)'}\n` +
|
|
296
|
+
` Metro /json/list candidates:\n${candidateList}`,
|
|
297
|
+
),
|
|
298
|
+
BRIDGE_ERROR_CODES.NO_TARGET,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
candidates = androidFiltered;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (candidates.length === 0) {
|
|
306
|
+
candidates = targets.filter((t) => t.webSocketDebuggerUrl);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (candidates.length === 0) {
|
|
310
|
+
throw coded(
|
|
311
|
+
new Error(`No suitable debug target found. Targets:\n${JSON.stringify(targets, null, 2)}`),
|
|
312
|
+
BRIDGE_ERROR_CODES.NO_TARGET,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (acceptedPinnedCandidate) {
|
|
317
|
+
for (const candidate of candidates) {
|
|
318
|
+
if (candidate.webSocketDebuggerUrl === acceptedPinnedCandidate.webSocketDebuggerUrl) {
|
|
319
|
+
return {
|
|
320
|
+
id: acceptedPinnedCandidate.id || '',
|
|
321
|
+
wsUrl: acceptedPinnedCandidate.webSocketDebuggerUrl,
|
|
322
|
+
deviceName: acceptedPinnedCandidate.deviceName || '',
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// The persistent console forwarder already owns and validates brokered CDP
|
|
329
|
+
// sessions. Re-probing here would evict that debugger; preserve the normal
|
|
330
|
+
// platform/device filtering and select the highest-ranked runtime instead.
|
|
331
|
+
if (!probe) {
|
|
332
|
+
return {
|
|
333
|
+
id: candidates[0].id || '',
|
|
334
|
+
wsUrl: candidates[0].webSocketDebuggerUrl,
|
|
335
|
+
deviceName: candidates[0].deviceName || '',
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Sort by page number descending (JS runtime has higher page number than C++
|
|
340
|
+
// native). rankRuntimeCandidates output arrives pre-sorted; this re-sort is
|
|
341
|
+
// load-bearing only when the raw targets.filter() fallback above repopulated
|
|
342
|
+
// the candidate list.
|
|
343
|
+
candidates.sort((a, b) => {
|
|
344
|
+
const aPage = Number.parseInt((a.id || '').split('-').pop() || '0', 10);
|
|
345
|
+
const bPage = Number.parseInt((b.id || '').split('-').pop() || '0', 10);
|
|
346
|
+
return bPage - aPage;
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// Probe candidates to find the one with __AGENTIC__ installed (the JS runtime)
|
|
350
|
+
for (const candidate of candidates) {
|
|
351
|
+
const hasAgentic = await probeTarget(candidate.webSocketDebuggerUrl);
|
|
352
|
+
if (hasAgentic) {
|
|
353
|
+
return {
|
|
354
|
+
id: candidate.id || '',
|
|
355
|
+
wsUrl: candidate.webSocketDebuggerUrl,
|
|
356
|
+
deviceName: candidate.deviceName || '',
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (androidPinned || iosPinned) {
|
|
362
|
+
const candidateList = candidates
|
|
363
|
+
.map(
|
|
364
|
+
(target) =>
|
|
365
|
+
` deviceName=${JSON.stringify(target.deviceName || '')} ws=${target.webSocketDebuggerUrl || ''}`,
|
|
366
|
+
)
|
|
367
|
+
.join('\n');
|
|
368
|
+
throw coded(
|
|
369
|
+
new Error(
|
|
370
|
+
`Pinned ${androidPinned ? 'Android device' : `iOS simulator '${simName || process.env.SIM_UDID || '(unknown)'}'`} has no responding __AGENTIC__ JS runtime after ${FETCH_RETRIES} discovery attempt(s).\n` +
|
|
371
|
+
(androidPinned
|
|
372
|
+
? ` Requested --device (ADB_SERIAL): ${adbSerial || '(not set)'}\n`
|
|
373
|
+
: '') +
|
|
374
|
+
` Matching non-agentic targets:\n${candidateList}\n` +
|
|
375
|
+
` The native C++ page is not a valid recipe target; wait for Hermes to re-register or relaunch the pinned app.`,
|
|
376
|
+
),
|
|
377
|
+
BRIDGE_ERROR_CODES.NO_TARGET,
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Fallback: return highest page number (most likely the JS runtime)
|
|
382
|
+
return {
|
|
383
|
+
id: candidates[0].id || '',
|
|
384
|
+
wsUrl: candidates[0].webSocketDebuggerUrl,
|
|
385
|
+
deviceName: candidates[0].deviceName || '',
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Discover ALL Hermes targets with __AGENTIC__ installed (one per platform/device).
|
|
391
|
+
* Groups by deviceName so each device returns at most one target.
|
|
392
|
+
*/
|
|
393
|
+
async function discoverAllTargets(port) {
|
|
394
|
+
const listUrl = `http://127.0.0.1:${port}/json/list`;
|
|
395
|
+
let targets;
|
|
396
|
+
try {
|
|
397
|
+
targets = await fetchJSON(listUrl);
|
|
398
|
+
} catch (e) {
|
|
399
|
+
throw coded(
|
|
400
|
+
new Error(`Cannot reach Metro at ${listUrl}. Is Metro running?\n ${e.message}`),
|
|
401
|
+
BRIDGE_ERROR_CODES.METRO_UNREACHABLE,
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const candidates = rankRuntimeCandidates(targets);
|
|
406
|
+
|
|
407
|
+
// Group by deviceName, probe each to find the JS runtime target. Prefer the
|
|
408
|
+
// device's __AGENTIC__-bearing target; when a device has none, keep its first
|
|
409
|
+
// RESPONSIVE candidate (candidates are sorted JS-runtime-first) so a build
|
|
410
|
+
// that predates the bridge still surfaces — the status consumer reports it as
|
|
411
|
+
// bridge-absent instead of the device silently vanishing from discovery.
|
|
412
|
+
// Known ambiguity: when a device's JS runtime is attached-but-busy while its
|
|
413
|
+
// native C++ Hermes page answers, that page is also 'responsive' (no
|
|
414
|
+
// __AGENTIC__ in the native context), so the device reports bridge-absent even
|
|
415
|
+
// though the app build may carry the bridge. Low probability, and the degraded
|
|
416
|
+
// report is informative rather than harmful.
|
|
417
|
+
const agenticByDevice = new Map();
|
|
418
|
+
const responsiveByDevice = new Map();
|
|
419
|
+
for (const candidate of candidates) {
|
|
420
|
+
const device = candidate.deviceName || candidate.id || candidate.webSocketDebuggerUrl;
|
|
421
|
+
if (agenticByDevice.has(device)) continue;
|
|
422
|
+
const state = await probeTargetDetailed(candidate.webSocketDebuggerUrl);
|
|
423
|
+
if (state === 'agentic') {
|
|
424
|
+
agenticByDevice.set(device, { wsUrl: candidate.webSocketDebuggerUrl, deviceName: device });
|
|
425
|
+
} else if (state === 'responsive' && !responsiveByDevice.has(device)) {
|
|
426
|
+
responsiveByDevice.set(device, { wsUrl: candidate.webSocketDebuggerUrl, deviceName: device });
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
const results = [...agenticByDevice.values()];
|
|
430
|
+
for (const [device, entry] of responsiveByDevice) {
|
|
431
|
+
if (!agenticByDevice.has(device)) results.push(entry);
|
|
432
|
+
}
|
|
433
|
+
return results;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
module.exports = { discoverTarget, discoverAllTargets, rankRuntimeCandidates };
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { BRIDGE_ERROR_CODES, coded } = require('./bridge-errors.cjs');
|
|
4
|
+
const WebSocket = require('ws');
|
|
5
|
+
|
|
6
|
+
function createInspectorWebSocket(wsUrl) {
|
|
7
|
+
const origin = new URL(wsUrl).origin.replace(/^ws/, 'http');
|
|
8
|
+
return new WebSocket(wsUrl, { origin });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Minimal CDP client that supplies the debugger Origin required by Metro.
|
|
13
|
+
*/
|
|
14
|
+
function createWSClient(wsUrl, timeout) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const ws = createInspectorWebSocket(wsUrl);
|
|
17
|
+
let msgId = 0;
|
|
18
|
+
const pending = new Map();
|
|
19
|
+
const eventHandlers = new Map();
|
|
20
|
+
|
|
21
|
+
const timer = setTimeout(() => {
|
|
22
|
+
ws.close();
|
|
23
|
+
reject(
|
|
24
|
+
coded(
|
|
25
|
+
new Error(`CDP connection timeout after ${timeout}ms`),
|
|
26
|
+
BRIDGE_ERROR_CODES.CDP_TIMEOUT,
|
|
27
|
+
),
|
|
28
|
+
);
|
|
29
|
+
}, timeout);
|
|
30
|
+
|
|
31
|
+
ws.onopen = () => {
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
resolve({
|
|
34
|
+
/** Send a CDP command and wait for the response */
|
|
35
|
+
send(method, params = {}, msgTimeout = timeout) {
|
|
36
|
+
return new Promise((res, rej) => {
|
|
37
|
+
const id = ++msgId;
|
|
38
|
+
const timer = setTimeout(() => {
|
|
39
|
+
pending.delete(id);
|
|
40
|
+
rej(
|
|
41
|
+
coded(
|
|
42
|
+
new Error(`CDP message timeout after ${msgTimeout}ms for ${method}`),
|
|
43
|
+
BRIDGE_ERROR_CODES.CDP_TIMEOUT,
|
|
44
|
+
),
|
|
45
|
+
);
|
|
46
|
+
}, msgTimeout);
|
|
47
|
+
pending.set(id, {
|
|
48
|
+
resolve: (v) => {
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
res(v);
|
|
51
|
+
},
|
|
52
|
+
reject: (e) => {
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
rej(e);
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const msg = JSON.stringify({ id, method, params });
|
|
58
|
+
ws.send(msg);
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
on(method, handler) {
|
|
62
|
+
const handlers = eventHandlers.get(method) || new Set();
|
|
63
|
+
handlers.add(handler);
|
|
64
|
+
eventHandlers.set(method, handlers);
|
|
65
|
+
return () => {
|
|
66
|
+
handlers.delete(handler);
|
|
67
|
+
if (handlers.size === 0) eventHandlers.delete(method);
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
close() {
|
|
71
|
+
ws.close();
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
ws.onmessage = (evt) => {
|
|
77
|
+
const data = typeof evt.data === 'string' ? evt.data : evt.data.toString();
|
|
78
|
+
let msg;
|
|
79
|
+
try {
|
|
80
|
+
msg = JSON.parse(data);
|
|
81
|
+
} catch {
|
|
82
|
+
// Non-JSON frame — ignore
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (msg.id && pending.has(msg.id)) {
|
|
86
|
+
const { resolve: res, reject: rej } = pending.get(msg.id);
|
|
87
|
+
pending.delete(msg.id);
|
|
88
|
+
if (msg.error) {
|
|
89
|
+
rej(new Error(`CDP error: ${JSON.stringify(msg.error)}`));
|
|
90
|
+
} else {
|
|
91
|
+
res(msg.result);
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (!msg.method) return;
|
|
96
|
+
for (const handler of eventHandlers.get(msg.method) || []) {
|
|
97
|
+
handler(msg.params || {});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
ws.onerror = (err) => {
|
|
102
|
+
clearTimeout(timer);
|
|
103
|
+
reject(
|
|
104
|
+
coded(new Error(`WebSocket error: ${err.message || err}`), BRIDGE_ERROR_CODES.WS_CLOSED),
|
|
105
|
+
);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
ws.onclose = () => {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
for (const [, { reject: rej }] of pending) {
|
|
111
|
+
rej(coded(new Error('WebSocket closed'), BRIDGE_ERROR_CODES.WS_CLOSED));
|
|
112
|
+
}
|
|
113
|
+
pending.clear();
|
|
114
|
+
eventHandlers.clear();
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
module.exports = { createWSClient, createInspectorWebSocket };
|
package/dist/cli.js
CHANGED
|
@@ -164,6 +164,6 @@ function printRunResult(result) {
|
|
|
164
164
|
console.log(`Artifacts: ${result.artifactManifestPath}`);
|
|
165
165
|
}
|
|
166
166
|
function printUsage() {
|
|
167
|
-
console.log(`Farmslot
|
|
167
|
+
console.log(`Farmslot React Native adapter\n\nUsage:\n farmslot-adapter-rn init [--project-root <dir>] [--force] [--with-bridge]\n farmslot-adapter-rn manifest [--project-root <dir>] [--manifest <path>]\n farmslot-adapter-rn doctor [--project-root <dir>] [--manifest <path>] [--json]\n farmslot-adapter-rn validate [recipe] [--param key=value] [--project-root <dir>] [--manifest <path>] [--json]\n farmslot-adapter-rn run [recipe] [--param key=value] [--project-root <dir>] [--manifest <path>] [--artifacts-dir <dir>] [--dry-run] [--json] [--record-video[=full-run]] [--record-pid <pid>|--record-window-id <id>|--record-app-name <name> --record-window-name <title>]\n`);
|
|
168
168
|
}
|
|
169
169
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAEL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAgB1D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc;IAClD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzD,UAAU,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,kBAAkB,CACrC,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,YAAY,IAAI,iCAAiC,CAC1D,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;YAC1D,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;YAC1D,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;YAC1D,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,OAAO,GAAqB,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAC3D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,WAAW;YAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;aAC1C,IAAI,GAAG,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;aAC1C,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;aAC5C,IAAI,GAAG,KAAK,eAAe;YAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;aACvD,IAAI,GAAG,KAAK,gBAAgB;YAAE,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3F,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC;YACxC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;aACvD,IAAI,GAAG,KAAK,YAAY;YAAE,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aACxF,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC1F,IAAI,GAAG,KAAK,iBAAiB;YAChC,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3D,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;YACzC,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;aACzD,IAAI,GAAG,KAAK,SAAS;YACxB,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;aACpE,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YACjC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;aAC1D,IAAI,GAAG,KAAK,gBAAgB;YAAE,OAAO,CAAC,eAAe,GAAG,UAAU,CAAC;aACnE,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB;YACnC,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3D,IAAI,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAC1C,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;aAC1D,IAAI,GAAG,KAAK,mBAAmB;YAClC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC5D,IAAI,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;YAC3C,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;aAC5D,IAAI,GAAG,KAAK,mBAAmB;YAClC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC5D,IAAI,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC;YAC3C,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;aAC5D,IAAI,GAAG,KAAK,sBAAsB;YACrC,OAAO,CAAC,gBAAgB,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC/D,IAAI,GAAG,CAAC,UAAU,CAAC,uBAAuB,CAAC;YAC9C,OAAO,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;aAClE,IAAI,GAAG,KAAK,oBAAoB;YACnC,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC7D,IAAI,GAAG,CAAC,UAAU,CAAC,qBAAqB,CAAC;YAC5C,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;aAC9D,IAAI,GAAG,KAAK,cAAc;YAAE,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aACvF,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;;YAC3F,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,eAAe;QAAE,OAAO,CAAC,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACpF,OAAO,CAAC,MAAM,GAAG,2BAA2B,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAyB;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,IAAI,UAAU,CAAC;IACnD,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAc,EAAE,KAAa,EAAE,MAAc;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,oBAAoB,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,WAA+B,EAAE,YAAoB;IAC/E,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAA8D;IAE9D,OAAO,CAAC,GAAG,CACT,sBAAsB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,CAAC,QAAQ,YAAY,CAC7G,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAyD;IAC/E,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CACT,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type DevicePlatform = 'ios' | 'android';
|
|
2
|
+
export interface ConnectedDevice {
|
|
3
|
+
platform: DevicePlatform;
|
|
4
|
+
id: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
state: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DeviceDiscoveryError {
|
|
9
|
+
platform: DevicePlatform;
|
|
10
|
+
message: string;
|
|
11
|
+
userAction: string;
|
|
12
|
+
probeCode?: string | number;
|
|
13
|
+
}
|
|
14
|
+
export declare function listConnectedDevices(platform?: DevicePlatform, errors?: DeviceDiscoveryError[]): ConnectedDevice[];
|
|
15
|
+
export declare function findAvailableIosSimulatorById(id: string, errors?: DeviceDiscoveryError[]): ConnectedDevice | undefined;
|
|
16
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAuBD,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,cAAc,EACzB,MAAM,GAAE,oBAAoB,EAAO,GAClC,eAAe,EAAE,CAKnB;AAKD,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,oBAAoB,EAAO,GAClC,eAAe,GAAG,SAAS,CAK7B"}
|