execbro 2.12.3 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/README.md +15 -1
  2. package/build/__tests__/unit/autoReconnectOptOut.test.js +3 -0
  3. package/build/__tests__/unit/autoReconnectOptOut.test.js.map +1 -1
  4. package/build/__tests__/unit/cdpCommand.test.d.ts +2 -0
  5. package/build/__tests__/unit/cdpCommand.test.d.ts.map +1 -0
  6. package/build/__tests__/unit/cdpCommand.test.js +84 -0
  7. package/build/__tests__/unit/cdpCommand.test.js.map +1 -0
  8. package/build/__tests__/unit/chromium.test.d.ts +2 -0
  9. package/build/__tests__/unit/chromium.test.d.ts.map +1 -0
  10. package/build/__tests__/unit/chromium.test.js +118 -0
  11. package/build/__tests__/unit/chromium.test.js.map +1 -0
  12. package/build/__tests__/unit/chromiumDevice.test.d.ts +2 -0
  13. package/build/__tests__/unit/chromiumDevice.test.d.ts.map +1 -0
  14. package/build/__tests__/unit/chromiumDevice.test.js +115 -0
  15. package/build/__tests__/unit/chromiumDevice.test.js.map +1 -0
  16. package/build/__tests__/unit/chromiumDialogAnswer.test.d.ts +2 -0
  17. package/build/__tests__/unit/chromiumDialogAnswer.test.d.ts.map +1 -0
  18. package/build/__tests__/unit/chromiumDialogAnswer.test.js +71 -0
  19. package/build/__tests__/unit/chromiumDialogAnswer.test.js.map +1 -0
  20. package/build/__tests__/unit/chromiumDialogRaces.test.d.ts +2 -0
  21. package/build/__tests__/unit/chromiumDialogRaces.test.d.ts.map +1 -0
  22. package/build/__tests__/unit/chromiumDialogRaces.test.js +100 -0
  23. package/build/__tests__/unit/chromiumDialogRaces.test.js.map +1 -0
  24. package/build/__tests__/unit/chromiumDialogs.test.d.ts +2 -0
  25. package/build/__tests__/unit/chromiumDialogs.test.d.ts.map +1 -0
  26. package/build/__tests__/unit/chromiumDialogs.test.js +167 -0
  27. package/build/__tests__/unit/chromiumDialogs.test.js.map +1 -0
  28. package/build/__tests__/unit/chromiumDiscovery.test.d.ts +2 -0
  29. package/build/__tests__/unit/chromiumDiscovery.test.d.ts.map +1 -0
  30. package/build/__tests__/unit/chromiumDiscovery.test.js +302 -0
  31. package/build/__tests__/unit/chromiumDiscovery.test.js.map +1 -0
  32. package/build/__tests__/unit/chromiumDom.test.d.ts +2 -0
  33. package/build/__tests__/unit/chromiumDom.test.d.ts.map +1 -0
  34. package/build/__tests__/unit/chromiumDom.test.js +119 -0
  35. package/build/__tests__/unit/chromiumDom.test.js.map +1 -0
  36. package/build/__tests__/unit/chromiumGate.test.d.ts +2 -0
  37. package/build/__tests__/unit/chromiumGate.test.d.ts.map +1 -0
  38. package/build/__tests__/unit/chromiumGate.test.js +149 -0
  39. package/build/__tests__/unit/chromiumGate.test.js.map +1 -0
  40. package/build/__tests__/unit/chromiumInput.test.d.ts +2 -0
  41. package/build/__tests__/unit/chromiumInput.test.d.ts.map +1 -0
  42. package/build/__tests__/unit/chromiumInput.test.js +113 -0
  43. package/build/__tests__/unit/chromiumInput.test.js.map +1 -0
  44. package/build/__tests__/unit/chromiumKeys.test.d.ts +2 -0
  45. package/build/__tests__/unit/chromiumKeys.test.d.ts.map +1 -0
  46. package/build/__tests__/unit/chromiumKeys.test.js +26 -0
  47. package/build/__tests__/unit/chromiumKeys.test.js.map +1 -0
  48. package/build/__tests__/unit/chromiumScreen.test.d.ts +2 -0
  49. package/build/__tests__/unit/chromiumScreen.test.d.ts.map +1 -0
  50. package/build/__tests__/unit/chromiumScreen.test.js +390 -0
  51. package/build/__tests__/unit/chromiumScreen.test.js.map +1 -0
  52. package/build/__tests__/unit/chromiumStaleTarget.test.d.ts +2 -0
  53. package/build/__tests__/unit/chromiumStaleTarget.test.d.ts.map +1 -0
  54. package/build/__tests__/unit/chromiumStaleTarget.test.js +26 -0
  55. package/build/__tests__/unit/chromiumStaleTarget.test.js.map +1 -0
  56. package/build/__tests__/unit/connectionGaps.test.d.ts +2 -0
  57. package/build/__tests__/unit/connectionGaps.test.d.ts.map +1 -0
  58. package/build/__tests__/unit/connectionGaps.test.js +14 -0
  59. package/build/__tests__/unit/connectionGaps.test.js.map +1 -0
  60. package/build/__tests__/unit/contextPreambleGlobals.test.d.ts +2 -0
  61. package/build/__tests__/unit/contextPreambleGlobals.test.d.ts.map +1 -0
  62. package/build/__tests__/unit/contextPreambleGlobals.test.js +25 -0
  63. package/build/__tests__/unit/contextPreambleGlobals.test.js.map +1 -0
  64. package/build/__tests__/unit/deviceResolver.test.js +9 -0
  65. package/build/__tests__/unit/deviceResolver.test.js.map +1 -1
  66. package/build/__tests__/unit/electronLaunch.test.d.ts +2 -0
  67. package/build/__tests__/unit/electronLaunch.test.d.ts.map +1 -0
  68. package/build/__tests__/unit/electronLaunch.test.js +165 -0
  69. package/build/__tests__/unit/electronLaunch.test.js.map +1 -0
  70. package/build/__tests__/unit/fiberRoots.test.d.ts +2 -0
  71. package/build/__tests__/unit/fiberRoots.test.d.ts.map +1 -0
  72. package/build/__tests__/unit/fiberRoots.test.js +95 -0
  73. package/build/__tests__/unit/fiberRoots.test.js.map +1 -0
  74. package/build/__tests__/unit/fiberRootsDrift.test.d.ts +2 -0
  75. package/build/__tests__/unit/fiberRootsDrift.test.d.ts.map +1 -0
  76. package/build/__tests__/unit/fiberRootsDrift.test.js +23 -0
  77. package/build/__tests__/unit/fiberRootsDrift.test.js.map +1 -0
  78. package/build/__tests__/unit/hostAddress.test.d.ts +2 -0
  79. package/build/__tests__/unit/hostAddress.test.d.ts.map +1 -0
  80. package/build/__tests__/unit/hostAddress.test.js +38 -0
  81. package/build/__tests__/unit/hostAddress.test.js.map +1 -0
  82. package/build/__tests__/unit/measureComponent.test.js +1 -1
  83. package/build/__tests__/unit/measureComponent.test.js.map +1 -1
  84. package/build/__tests__/unit/networkInterceptorFetchMock.test.d.ts +2 -0
  85. package/build/__tests__/unit/networkInterceptorFetchMock.test.d.ts.map +1 -0
  86. package/build/__tests__/unit/networkInterceptorFetchMock.test.js +90 -0
  87. package/build/__tests__/unit/networkInterceptorFetchMock.test.js.map +1 -0
  88. package/build/__tests__/unit/networkMockTool.test.js +12 -1
  89. package/build/__tests__/unit/networkMockTool.test.js.map +1 -1
  90. package/build/__tests__/unit/pressKeyMobile.test.d.ts +2 -0
  91. package/build/__tests__/unit/pressKeyMobile.test.d.ts.map +1 -0
  92. package/build/__tests__/unit/pressKeyMobile.test.js +63 -0
  93. package/build/__tests__/unit/pressKeyMobile.test.js.map +1 -0
  94. package/build/__tests__/unit/reloadAppAutoConnect.test.js +4 -1
  95. package/build/__tests__/unit/reloadAppAutoConnect.test.js.map +1 -1
  96. package/build/__tests__/unit/tapAndroidSerial.test.js +16 -0
  97. package/build/__tests__/unit/tapAndroidSerial.test.js.map +1 -1
  98. package/build/core/android.d.ts +10 -0
  99. package/build/core/android.d.ts.map +1 -1
  100. package/build/core/android.js +17 -0
  101. package/build/core/android.js.map +1 -1
  102. package/build/core/appContext.d.ts.map +1 -1
  103. package/build/core/appContext.js +11 -13
  104. package/build/core/appContext.js.map +1 -1
  105. package/build/core/appDetection.d.ts.map +1 -1
  106. package/build/core/appDetection.js +7 -4
  107. package/build/core/appDetection.js.map +1 -1
  108. package/build/core/cdpCommand.d.ts +4 -0
  109. package/build/core/cdpCommand.d.ts.map +1 -0
  110. package/build/core/cdpCommand.js +58 -0
  111. package/build/core/cdpCommand.js.map +1 -0
  112. package/build/core/chromium.d.ts +157 -0
  113. package/build/core/chromium.d.ts.map +1 -0
  114. package/build/core/chromium.js +480 -0
  115. package/build/core/chromium.js.map +1 -0
  116. package/build/core/chromiumCapabilities.d.ts +11 -0
  117. package/build/core/chromiumCapabilities.d.ts.map +1 -0
  118. package/build/core/chromiumCapabilities.js +35 -0
  119. package/build/core/chromiumCapabilities.js.map +1 -0
  120. package/build/core/chromiumDialogAnswer.d.ts +11 -0
  121. package/build/core/chromiumDialogAnswer.d.ts.map +1 -0
  122. package/build/core/chromiumDialogAnswer.js +61 -0
  123. package/build/core/chromiumDialogAnswer.js.map +1 -0
  124. package/build/core/chromiumDialogs.d.ts +46 -0
  125. package/build/core/chromiumDialogs.d.ts.map +1 -0
  126. package/build/core/chromiumDialogs.js +88 -0
  127. package/build/core/chromiumDialogs.js.map +1 -0
  128. package/build/core/chromiumScreen.d.ts +97 -0
  129. package/build/core/chromiumScreen.d.ts.map +1 -0
  130. package/build/core/chromiumScreen.js +498 -0
  131. package/build/core/chromiumScreen.js.map +1 -0
  132. package/build/core/componentSearch.d.ts.map +1 -1
  133. package/build/core/componentSearch.js +7 -26
  134. package/build/core/componentSearch.js.map +1 -1
  135. package/build/core/componentSource.d.ts.map +1 -1
  136. package/build/core/componentSource.js +3 -11
  137. package/build/core/componentSource.js.map +1 -1
  138. package/build/core/componentTree.d.ts.map +1 -1
  139. package/build/core/componentTree.js +4 -18
  140. package/build/core/componentTree.js.map +1 -1
  141. package/build/core/connection.d.ts +13 -0
  142. package/build/core/connection.d.ts.map +1 -1
  143. package/build/core/connection.js +99 -18
  144. package/build/core/connection.js.map +1 -1
  145. package/build/core/connectionState.d.ts +2 -1
  146. package/build/core/connectionState.d.ts.map +1 -1
  147. package/build/core/connectionState.js +3 -0
  148. package/build/core/connectionState.js.map +1 -1
  149. package/build/core/deviceResolver.d.ts.map +1 -1
  150. package/build/core/deviceResolver.js +8 -5
  151. package/build/core/deviceResolver.js.map +1 -1
  152. package/build/core/electronLaunch.d.ts +25 -0
  153. package/build/core/electronLaunch.d.ts.map +1 -0
  154. package/build/core/electronLaunch.js +113 -0
  155. package/build/core/electronLaunch.js.map +1 -0
  156. package/build/core/errors.d.ts +1 -1
  157. package/build/core/errors.d.ts.map +1 -1
  158. package/build/core/errors.js.map +1 -1
  159. package/build/core/guides.d.ts.map +1 -1
  160. package/build/core/guides.js +9 -6
  161. package/build/core/guides.js.map +1 -1
  162. package/build/core/hostAddress.d.ts +6 -0
  163. package/build/core/hostAddress.d.ts.map +1 -0
  164. package/build/core/hostAddress.js +32 -0
  165. package/build/core/hostAddress.js.map +1 -0
  166. package/build/core/injected/fiberRoots.d.ts +2 -0
  167. package/build/core/injected/fiberRoots.d.ts.map +1 -0
  168. package/build/core/injected/fiberRoots.js +60 -0
  169. package/build/core/injected/fiberRoots.js.map +1 -0
  170. package/build/core/inputTarget.d.ts.map +1 -1
  171. package/build/core/inputTarget.js +4 -9
  172. package/build/core/inputTarget.js.map +1 -1
  173. package/build/core/inspector.d.ts.map +1 -1
  174. package/build/core/inspector.js +6 -22
  175. package/build/core/inspector.js.map +1 -1
  176. package/build/core/ios.d.ts +12 -0
  177. package/build/core/ios.d.ts.map +1 -1
  178. package/build/core/ios.js +32 -0
  179. package/build/core/ios.js.map +1 -1
  180. package/build/core/jsExecute.d.ts.map +1 -1
  181. package/build/core/jsExecute.js +20 -1
  182. package/build/core/jsExecute.js.map +1 -1
  183. package/build/core/measureComponent.d.ts.map +1 -1
  184. package/build/core/measureComponent.js +4 -8
  185. package/build/core/measureComponent.js.map +1 -1
  186. package/build/core/metro.d.ts +20 -1
  187. package/build/core/metro.d.ts.map +1 -1
  188. package/build/core/metro.js +146 -9
  189. package/build/core/metro.js.map +1 -1
  190. package/build/core/mockRules.d.ts +1 -0
  191. package/build/core/mockRules.d.ts.map +1 -1
  192. package/build/core/mockRules.js +8 -0
  193. package/build/core/mockRules.js.map +1 -1
  194. package/build/core/nativeLogs.js +1 -1
  195. package/build/core/nativeLogs.js.map +1 -1
  196. package/build/core/navigation.d.ts.map +1 -1
  197. package/build/core/navigation.js +4 -18
  198. package/build/core/navigation.js.map +1 -1
  199. package/build/core/networkInterceptor.d.ts +2 -2
  200. package/build/core/networkInterceptor.d.ts.map +1 -1
  201. package/build/core/networkInterceptor.js +90 -3
  202. package/build/core/networkInterceptor.js.map +1 -1
  203. package/build/core/pressables.d.ts.map +1 -1
  204. package/build/core/pressables.js +6 -13
  205. package/build/core/pressables.js.map +1 -1
  206. package/build/core/redux.d.ts.map +1 -1
  207. package/build/core/redux.js +6 -10
  208. package/build/core/redux.js.map +1 -1
  209. package/build/core/register.d.ts.map +1 -1
  210. package/build/core/register.js +5 -2
  211. package/build/core/register.js.map +1 -1
  212. package/build/core/rnGlobalsBootstrap.d.ts.map +1 -1
  213. package/build/core/rnGlobalsBootstrap.js +3 -1
  214. package/build/core/rnGlobalsBootstrap.js.map +1 -1
  215. package/build/core/screenLayout.d.ts.map +1 -1
  216. package/build/core/screenLayout.js +4 -13
  217. package/build/core/screenLayout.js.map +1 -1
  218. package/build/core/screenStaleness.d.ts.map +1 -1
  219. package/build/core/screenStaleness.js +2 -0
  220. package/build/core/screenStaleness.js.map +1 -1
  221. package/build/core/screenState.d.ts.map +1 -1
  222. package/build/core/screenState.js +4 -11
  223. package/build/core/screenState.js.map +1 -1
  224. package/build/core/swipeDiagnosis.d.ts.map +1 -1
  225. package/build/core/swipeDiagnosis.js +3 -10
  226. package/build/core/swipeDiagnosis.js.map +1 -1
  227. package/build/core/textEntry.d.ts +1 -1
  228. package/build/core/textEntry.d.ts.map +1 -1
  229. package/build/core/types.d.ts +4 -2
  230. package/build/core/types.d.ts.map +1 -1
  231. package/build/pro/chromiumKeys.d.ts +19 -0
  232. package/build/pro/chromiumKeys.d.ts.map +1 -0
  233. package/build/pro/chromiumKeys.js +68 -0
  234. package/build/pro/chromiumKeys.js.map +1 -0
  235. package/build/pro/chromiumSwipe.d.ts +35 -0
  236. package/build/pro/chromiumSwipe.d.ts.map +1 -0
  237. package/build/pro/chromiumSwipe.js +105 -0
  238. package/build/pro/chromiumSwipe.js.map +1 -0
  239. package/build/pro/chromiumTap.d.ts +12 -0
  240. package/build/pro/chromiumTap.d.ts.map +1 -0
  241. package/build/pro/chromiumTap.js +155 -0
  242. package/build/pro/chromiumTap.js.map +1 -0
  243. package/build/pro/tap.d.ts +1 -0
  244. package/build/pro/tap.d.ts.map +1 -1
  245. package/build/pro/tap.js +7 -1
  246. package/build/pro/tap.js.map +1 -1
  247. package/build/tools/componentTools.d.ts.map +1 -1
  248. package/build/tools/componentTools.js +31 -3
  249. package/build/tools/componentTools.js.map +1 -1
  250. package/build/tools/connectionTools.d.ts.map +1 -1
  251. package/build/tools/connectionTools.js +66 -28
  252. package/build/tools/connectionTools.js.map +1 -1
  253. package/build/tools/deviceTools.d.ts.map +1 -1
  254. package/build/tools/deviceTools.js +42 -1
  255. package/build/tools/deviceTools.js.map +1 -1
  256. package/build/tools/interactionTools.d.ts.map +1 -1
  257. package/build/tools/interactionTools.js +132 -7
  258. package/build/tools/interactionTools.js.map +1 -1
  259. package/build/tools/networkTools.d.ts.map +1 -1
  260. package/build/tools/networkTools.js +20 -5
  261. package/build/tools/networkTools.js.map +1 -1
  262. package/build/tools/screenshotTools.d.ts.map +1 -1
  263. package/build/tools/screenshotTools.js +452 -373
  264. package/build/tools/screenshotTools.js.map +1 -1
  265. package/package.json +1 -1
  266. package/tools.json +27 -1
@@ -0,0 +1,113 @@
1
+ import { spawn } from "child_process";
2
+ import { createHash } from "crypto";
3
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, statSync } from "fs";
4
+ import { basename, dirname, join, resolve } from "path";
5
+ import { fetchDevices, isChromiumTarget, isUntitledPage } from "./metro.js";
6
+ import { CONFIG_DIR } from "./paths.js";
7
+ const POLL_MS = 500;
8
+ const TITLE_GRACE_MS = 5000;
9
+ export function findBin(start, name) {
10
+ for (let dir = start;; dir = dirname(dir)) {
11
+ const p = join(dir, "node_modules", ".bin", name);
12
+ if (existsSync(p))
13
+ return p;
14
+ if (dirname(dir) === dir)
15
+ return null;
16
+ }
17
+ }
18
+ export function planElectronLaunch(projectPath, port) {
19
+ const cwd = resolve(projectPath);
20
+ if (/\.(app|asar)(\/|$)/i.test(cwd)) {
21
+ return { error: `${cwd} is a packaged build. execbro never opens a CDP port on a packaged app (anything that reaches the port could run code in it). Pass the project's source folder instead.` };
22
+ }
23
+ if (!existsSync(cwd) || !statSync(cwd).isDirectory()) {
24
+ return { error: `${cwd} is not a directory. Pass the Electron project's source folder, the one with package.json.` };
25
+ }
26
+ const pkgPath = join(cwd, "package.json");
27
+ if (!existsSync(pkgPath))
28
+ return { error: `No package.json in ${cwd}. Pass the Electron project's source folder.` };
29
+ let pkg;
30
+ try {
31
+ pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
32
+ }
33
+ catch {
34
+ return { error: `${pkgPath} is not valid JSON.` };
35
+ }
36
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
37
+ if (!deps.electron)
38
+ return { error: `${pkg.name ?? cwd} does not depend on electron, so there is nothing to launch.` };
39
+ const runner = deps["electron-vite"] ? "electron-vite" : "electron";
40
+ const cmd = findBin(cwd, runner);
41
+ if (!cmd)
42
+ return { error: `${runner} is declared in package.json but not installed. Run npm install in ${cwd} first.` };
43
+ return runner === "electron-vite"
44
+ ? { cmd, args: ["dev", "--remoteDebuggingPort", String(port)], cwd, runner }
45
+ : { cmd, args: [".", `--remote-debugging-port=${port}`], cwd, runner };
46
+ }
47
+ export function devToolsPortFromLog(log) {
48
+ const m = /DevTools listening on ws:\/\/[^:/]+:(\d+)\//.exec(log);
49
+ return m ? Number(m[1]) : null;
50
+ }
51
+ function readLog(path) {
52
+ try {
53
+ return readFileSync(path, "utf8");
54
+ }
55
+ catch {
56
+ return "";
57
+ }
58
+ }
59
+ function tail(path, lines = 20) {
60
+ try {
61
+ return readFileSync(path, "utf8").trimEnd().split("\n").slice(-lines).join("\n");
62
+ }
63
+ catch {
64
+ return "(no log)";
65
+ }
66
+ }
67
+ export function launchLogPath(logDir, cwd) {
68
+ return join(logDir, `${basename(cwd)}-${createHash("sha1").update(cwd).digest("hex").slice(0, 8)}.log`);
69
+ }
70
+ export async function launchElectron(plan, port, timeoutMs, logDir = join(CONFIG_DIR, "electron")) {
71
+ mkdirSync(logDir, { recursive: true });
72
+ const logPath = launchLogPath(logDir, plan.cwd);
73
+ const fd = openSync(logPath, "w");
74
+ const env = { ...process.env };
75
+ delete env.ELECTRON_RUN_AS_NODE;
76
+ const child = spawn(plan.cmd, plan.args, { cwd: plan.cwd, env, detached: true, stdio: ["ignore", fd, fd] });
77
+ closeSync(fd);
78
+ let exited = null;
79
+ let spawnError = null;
80
+ child.on("exit", (code, signal) => { exited = String(code ?? signal); });
81
+ child.on("error", (e) => { spawnError = e; });
82
+ child.unref();
83
+ const deadline = Date.now() + timeoutMs;
84
+ let firstSeen = null;
85
+ let actual = port;
86
+ let devices = [];
87
+ while (Date.now() < deadline) {
88
+ await new Promise((r) => setTimeout(r, POLL_MS));
89
+ if (spawnError)
90
+ return { ok: false, error: `Could not start ${plan.cmd}: ${spawnError.message}`, logPath };
91
+ if (exited !== null) {
92
+ return { ok: false, error: `The app exited (${exited}) before its CDP port answered. Last log lines:\n${tail(logPath)}`, logPath };
93
+ }
94
+ actual = devToolsPortFromLog(readLog(logPath)) ?? port;
95
+ devices = (await fetchDevices(actual)).filter(isChromiumTarget);
96
+ if (devices.length === 0)
97
+ continue;
98
+ firstSeen ??= Date.now();
99
+ if (devices.some(isUntitledPage) && Date.now() - firstSeen < TITLE_GRACE_MS)
100
+ continue;
101
+ return { ok: true, pid: child.pid, port: actual, logPath, devices };
102
+ }
103
+ if (devices.length > 0)
104
+ return { ok: true, pid: child.pid, port: actual, logPath, devices };
105
+ return {
106
+ ok: false,
107
+ error: `Port ${actual} listed no window within ${Math.round(timeoutMs / 1000)}s. The app is still running (pid ${child.pid}). ` +
108
+ `If its main process calls app.commandLine.appendSwitch('remote-debugging-port', ...), that port wins over this flag: ` +
109
+ `connect_metro({ port: <that port> }), or relaunch with that port. Last log lines:\n${tail(logPath)}`,
110
+ logPath,
111
+ };
112
+ }
113
+ //# sourceMappingURL=electronLaunch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronLaunch.js","sourceRoot":"","sources":["../../src/core/electronLaunch.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ export declare class UserInputError extends Error {
3
3
  readonly kind?: FailureKind;
4
4
  constructor(message: string, context?: string, kind?: FailureKind);
5
5
  }
6
- export type FailureKind = "no_devices_attached" | "no_apps_connected" | "no_metro" | "driver_not_installed" | "no_debuggable_devices" | "devtools_hook_missing" | "no_metro_server" | "ws_closed" | "no_android_device" | "no_ios_simulator" | "no_fiber_roots" | "platform_mismatch" | "fiber_guard_unexpected" | "app_exception" | "bad_arguments";
6
+ export type FailureKind = "no_devices_attached" | "no_apps_connected" | "no_metro" | "driver_not_installed" | "no_debuggable_devices" | "devtools_hook_missing" | "no_metro_server" | "ws_closed" | "no_android_device" | "no_ios_simulator" | "no_fiber_roots" | "platform_mismatch" | "fiber_guard_unexpected" | "app_exception" | "bad_arguments" | "js_dialog_open";
7
7
  export declare const ENVIRONMENT_KINDS: ReadonlySet<FailureKind>;
8
8
  export declare class EnvironmentError extends Error {
9
9
  readonly kind: FailureKind;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAUA,qBAAa,cAAe,SAAQ,KAAK;IAMrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAU1B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW;CAMpE;AAkBD,MAAM,MAAM,WAAW,GACjB,qBAAqB,GACrB,mBAAmB,GACnB,UAAU,GACV,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,iBAAiB,GACjB,WAAW,GACX,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,wBAAwB,GASxB,eAAe,GAef,eAAe,CAAC;AAQtB,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,WAAW,CAYrD,CAAC;AAOH,qBAAa,gBAAiB,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW;CAKjD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAUA,qBAAa,cAAe,SAAQ,KAAK;IAMrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAU1B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW;CAMpE;AAkBD,MAAM,MAAM,WAAW,GACjB,qBAAqB,GACrB,mBAAmB,GACnB,UAAU,GACV,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,iBAAiB,GACjB,WAAW,GACX,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,wBAAwB,GASxB,eAAe,GAef,eAAe,GAKf,gBAAgB,CAAC;AAQvB,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,WAAW,CAYrD,CAAC;AAOH,qBAAa,gBAAiB,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW;CAKjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAM5B,OAAO,CAAU;IAUjB,IAAI,CAAe;IAE5B,YAAY,OAAe,EAAE,OAAgB,EAAE,IAAkB;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ;AA+DD,MAAM,CAAC,MAAM,iBAAiB,GAA6B,IAAI,GAAG,CAAc;IAC5E,qBAAqB;IACrB,mBAAmB;IACnB,UAAU;IACV,sBAAsB;IACtB,uBAAuB;IACvB,uBAAuB;IACvB,iBAAiB;IACjB,WAAW;IACX,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;CACnB,CAAC,CAAC;AAOH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC9B,IAAI,CAAc;IAE3B,YAAY,OAAe,EAAE,IAAiB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAM5B,OAAO,CAAU;IAUjB,IAAI,CAAe;IAE5B,YAAY,OAAe,EAAE,OAAgB,EAAE,IAAkB;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ;AAoED,MAAM,CAAC,MAAM,iBAAiB,GAA6B,IAAI,GAAG,CAAc;IAC5E,qBAAqB;IACrB,mBAAmB;IACnB,UAAU;IACV,sBAAsB;IACtB,uBAAuB;IACvB,uBAAuB;IACvB,iBAAiB;IACjB,WAAW;IACX,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;CACnB,CAAC,CAAC;AAOH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC9B,IAAI,CAAc;IAE3B,YAAY,OAAe,EAAE,IAAiB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAgpBD,eAAO,MAAM,mBAAmB,EAAE,MAItB,CAAC;AAEb,eAAO,MAAM,aAAa,EAAE,MAchB,CAAC;AAEb,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
1
+ {"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAkpBD,eAAO,MAAM,mBAAmB,EAAE,MAItB,CAAC;AAEb,eAAO,MAAM,aAAa,EAAE,MAehB,CAAC;AAEb,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -13,7 +13,7 @@ const guides = [
13
13
  - **Android:** ADB must be in PATH (comes with Android SDK Platform Tools)
14
14
 
15
15
  ## Quick Start
16
- 1. scan_metro — auto-discovers Metro on ports 8081-8090 and connects. Note: this occupies the CDP slot, which prevents the built-in React Native debugger from connecting. See "Switch to Native Debugger" below.
16
+ 1. scan_metro — auto-discovers Metro on ports 8081-8090 and connects. Also probes Chromium/Electron debug ports: 9222 is listed but not auto-connected (attach with connect_metro({ port: 9222, device })), ports in EXECBRO_CHROMIUM_PORTS auto-connect. Note: this occupies the CDP slot, which prevents the built-in React Native debugger from connecting. See "Switch to Native Debugger" below.
17
17
  2. get_apps — verify the app appears in connected list
18
18
  3. get_connection_status — check connection health
19
19
 
@@ -41,8 +41,8 @@ exactly like "my fix didn't work".
41
41
  - Use scan_metro to reconnect when done with native debugger
42
42
 
43
43
  ## Key Tools
44
- - scan_metro: auto-discover and connect (preferred)
45
- - connect_metro: connect to specific port (when you know it)
44
+ - scan_metro: auto-discover and connect React Native (Metro) and Chromium/Electron (CDP) targets (preferred)
45
+ - connect_metro: connect to a specific port (when you know it); device=<name> to attach one Chromium target
46
46
  - disconnect_metro: close all connections (free CDP slot for native debugger)
47
47
  - ensure_connection: health check with healthCheck=true
48
48
  - get_connection_status: check uptime and gaps
@@ -162,7 +162,7 @@ size in a note when it applies.
162
162
  {
163
163
  id: "interact",
164
164
  title: "Device Interaction",
165
- summary: "Tap buttons, swipe, pinch to zoom, type text, and navigate the app UI",
165
+ summary: "Tap buttons, swipe, pinch to zoom, type text, answer browser dialogs, and navigate the app UI",
166
166
  content: `# Device Interaction
167
167
 
168
168
  ## Prerequisites
@@ -282,8 +282,10 @@ For buttons that contain only an icon (no text):
282
282
  tap(text=...) skips fiber for non-ASCII (Hermes limitation) and uses accessibility/OCR instead. For best results, use testID or coordinates.
283
283
 
284
284
  ## Other Interactions
285
- - swipe: cross-platform swipe/scroll. Easiest form: swipe({ direction: "up" }) scrolls to reveal more content (content-scroll semantics; "down"/"left"/"right" supported, bare swipe() defaults to "up"). Optional distance is in screenshot pixels (default 33% of the axis). For pixel-precise gestures pass all four startX/startY/endX/endY coordinates — they take precedence over direction. Use for FlatList/SectionList scrolling where off-screen items aren't mounted. Returns verification.meaningful — if false, warning names which no-op it was, by probing the scroll surface under the start point: already at top, already at end, content not scrollable, wrong axis, or no scroll view there at all. On a screen with no React Native connection it says it could not inspect the screen, rather than claiming the gesture missed — the gesture itself still went through, and swipe needs no RN connection to drive the device. Set burst:true to surface overscroll/bounce feedback even when the final state is unchanged. Set verify:false, screenshot:false for the fastest path. Pass delta on iOS to control touch step size.
285
+ - swipe: cross-platform swipe/scroll. Easiest form: swipe({ direction: "up" }) scrolls to reveal more content (content-scroll semantics; "down"/"left"/"right" supported, bare swipe() defaults to "up"). Optional distance is in screenshot pixels (default 33% of the axis). For pixel-precise gestures pass all four startX/startY/endX/endY coordinates — they take precedence over direction. Use for FlatList/SectionList scrolling where off-screen items aren't mounted. Returns verification.meaningful — if false, warning names which no-op it was, by probing the scroll surface under the start point: already at top, already at end, content not scrollable, wrong axis, or no scroll view there at all. On a screen with no React Native connection it says it could not inspect the screen, rather than claiming the gesture missed — the gesture itself still went through, and swipe needs no RN connection to drive the device. Set burst:true to surface overscroll/bounce feedback even when the final state is unchanged. Set verify:false, screenshot:false for the fastest path. Pass delta on iOS to control touch step size. On chromium a direction is one mouse-wheel event at the viewport centre (or startX/startY), verified by reading the scroll container's offsets (scrolled, container), and four coordinates are a left-button drag (sliders, resizable panes, pointer-event drag libraries; not native HTML5 draggable).
286
286
  - input_text: type text — target with testID/component/textMatch (focuses itself), or pass native:true to type into whatever already has focus (system dialogs, non-RN screens). Pass replace:true to clear pre-filled values before typing (Bridgeless/Fabric only).
287
+ - press_key: keys that are not text: Enter to submit, Escape to close, Tab to move focus, arrows, Backspace, or a combo like Shift+Tab / Meta+K. Goes to the focused element, or pass testID/text to focus one first; repeat:N presses it N times. Works on chromium (CDP key events; the response names the focused element before and after), Android (adb keyevent, no modifier combos) and the iOS simulator (HID keys; combos need AXe).
288
+ - handle_dialog: accept or dismiss a JavaScript alert / confirm / prompt / beforeunload on a chromium page. A dialog pauses the page: tap, press_key, swipe and execute_in_app return it as dialog when they open one, and other page tools refuse until it is answered. Pass promptText for a prompt. Chromium only: an RN Alert is native UI, tap its button instead.
287
289
  - dismiss_keyboard: blur the focused input, closing the keyboard. Already-down with nothing focused is a success; up with nothing focused means a native field owns it and only a platform dismiss will close it.
288
290
  - ios_button / android_key_event: hardware buttons (HOME, BACK, etc.)
289
291
  - ios_open_url: deep links and universal links
@@ -630,11 +632,12 @@ export const UNTRUSTED_DATA_RULE = [
630
632
  export const DECISION_TREE = [
631
633
  "Primary tools: scan_metro, get_logs / search_logs, ios_screenshot / android_screenshot, tap, get_screen_state, get_screen_layout.",
632
634
  "Platform-specific ios_* / android_* tools (ios_button, android_key_event, ios_open_url, etc.) are FALLBACKS for non-React or native-only flows — prefer the cross-platform primary tools above whenever possible. input_text covers native-only text entry too, via native:true.",
635
+ "Chromium/Electron targets (platform chromium) support logs, network capture and mocking, execute_in_app, globals, redux, component inspection, screen reading (get_screen_state, get_screen_layout, inspect_at_point, measure), screenshot, tap, input_text, swipe (wheel scroll, four-coordinate drag), press_key and handle_dialog (JavaScript alert / confirm / prompt); other tools refuse them with a message saying so. electron_launch_app starts an Electron project with the CDP port open.",
633
636
  "",
634
637
  "Call get_usage_guide(topic=...) for end-to-end workflows. Available topics:",
635
638
  " setup — session setup (scan_metro, connect_metro, ensure_connection)",
636
639
  " logs — console debugging (get_logs, search_logs)",
637
- " interact — device interaction (tap, swipe, pinch, screenshots, input_text, dismiss_keyboard)",
640
+ " interact — device interaction (tap, swipe, pinch, screenshots, input_text, press_key, handle_dialog, dismiss_keyboard)",
638
641
  " layout — on-screen layout check (get_screen_state, get_screen_layout)",
639
642
  " inspect — component inspection (find_components, inspect_component, inspect_at_point)",
640
643
  " network — network request inspection (get_network_requests, search_network)",
@@ -1 +1 @@
1
- {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ type AddressReader = () => string[];
2
+ export declare function rememberHostAddresses(): void;
3
+ export declare function hostAddressChangeHint(port?: number): string | null;
4
+ export declare function resetHostAddress(nextReader?: AddressReader): void;
5
+ export {};
6
+ //# sourceMappingURL=hostAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostAddress.d.ts","sourceRoot":"","sources":["../../src/core/hostAddress.ts"],"names":[],"mappings":"AAiBA,KAAK,aAAa,GAAG,MAAM,MAAM,EAAE,CAAC;AAYpC,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAGD,wBAAgB,qBAAqB,CAAC,IAAI,SAAO,GAAG,MAAM,GAAG,IAAI,CAchE;AAGD,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,aAAgC,GAAG,IAAI,CAGnF"}
@@ -0,0 +1,32 @@
1
+ import { networkInterfaces } from "os";
2
+ const readLanAddresses = () => Object.values(networkInterfaces())
3
+ .flat()
4
+ .filter(a => a && a.family === "IPv4" && !a.internal)
5
+ .map(a => a.address);
6
+ let reader = readLanAddresses;
7
+ let addressesAtConnect = null;
8
+ export function rememberHostAddresses() {
9
+ addressesAtConnect = reader();
10
+ }
11
+ export function hostAddressChangeHint(port = 8081) {
12
+ if (!addressesAtConnect)
13
+ return null;
14
+ const current = reader();
15
+ const lost = addressesAtConnect.filter(a => !current.includes(a));
16
+ if (lost.length === 0)
17
+ return null;
18
+ const url = encodeURIComponent(`http://localhost:${port}`);
19
+ return [
20
+ `NETWORK ADDRESS CHANGED: this machine was ${lost.join(", ")} when the app connected and is now ${current.join(", ") || "offline"}.`,
21
+ `The app is most likely still loading from the old address, so retrying scan_metro will not bring it back.`,
22
+ `Reload it from a reachable address, then scan_metro:`,
23
+ ` iOS simulator (Expo dev client): xcrun simctl openurl booted "<app-scheme>://expo-development-client/?url=${url}" and accept the "Open in" prompt`,
24
+ ` Android emulator: adb reverse tcp:${port} tcp:${port}, then relaunch the app`,
25
+ ` Physical device: reopen the project from the dev launcher or a fresh QR code on the new address`,
26
+ ].join("\n");
27
+ }
28
+ export function resetHostAddress(nextReader = readLanAddresses) {
29
+ reader = nextReader;
30
+ addressesAtConnect = null;
31
+ }
32
+ //# sourceMappingURL=hostAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostAddress.js","sourceRoot":"","sources":["../../src/core/hostAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AAmBvC,MAAM,gBAAgB,GAAkB,GAAG,EAAE,CACzC,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;KAC7B,IAAI,EAAE;KACN,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;KACpD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC;AAE9B,IAAI,MAAM,GAAkB,gBAAgB,CAAC;AAC7C,IAAI,kBAAkB,GAAoB,IAAI,CAAC;AAG/C,MAAM,UAAU,qBAAqB;IACjC,kBAAkB,GAAG,MAAM,EAAE,CAAC;AAClC,CAAC;AAGD,MAAM,UAAU,qBAAqB,CAAC,IAAI,GAAG,IAAI;IAC7C,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,kBAAkB,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO;QACH,6CAA6C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG;QACpI,2GAA2G;QAC3G,sDAAsD;QACtD,+GAA+G,GAAG,mCAAmC;QACrJ,uCAAuC,IAAI,QAAQ,IAAI,yBAAyB;QAChF,mGAAmG;KACtG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAAC,aAA4B,gBAAgB;IACzE,MAAM,GAAG,UAAU,CAAC;IACpB,kBAAkB,GAAG,IAAI,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const FIBER_ROOTS_JS = "\nfunction __eb_fiberRoots(all) {\n var hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n var roots = [];\n var add = function (list) {\n for (var i = 0; i < list.length; i++) if (roots.indexOf(list[i]) < 0) roots.push(list[i]);\n };\n if (hook && typeof hook.getFiberRoots === 'function') {\n if (!all) {\n try { add(Array.from(hook.getFiberRoots(1) || [])); } catch (e) {}\n }\n if (roots.length === 0 && hook.renderers) {\n hook.renderers.forEach(function (_, id) {\n if (!all && roots.length > 0) return;\n try { add(Array.from(hook.getFiberRoots(id) || [])); } catch (e) {}\n });\n }\n }\n if (roots.length === 0 && typeof document !== 'undefined' && document) {\n var containerRoot = function (el) {\n if (!el) return null;\n var keys = Object.keys(el);\n for (var k = 0; k < keys.length; k++) {\n if (keys[k].indexOf('__reactContainer$') !== 0) continue;\n var f = el[keys[k]];\n return f ? (f.stateNode && f.stateNode.current ? f.stateNode : { current: f }) : null;\n }\n return null;\n };\n var seen = [];\n var scan = function (list) {\n for (var c = 0; c < list.length; c++) {\n if (!all && roots.length > 0) return;\n // #root is usually also one of body's children: read each element once.\n if (!list[c] || seen.indexOf(list[c]) >= 0) continue;\n seen.push(list[c]);\n var r = containerRoot(list[c]);\n if (r && roots.indexOf(r) < 0) roots.push(r);\n }\n };\n var candidates = [document.getElementById ? document.getElementById('root') : null];\n if (document.body) {\n candidates = candidates.concat(Array.from(document.body.children || []));\n candidates.push(document.body);\n }\n scan(candidates);\n // The usual spots missed: a container nested deeper (<div class=\"wrapper\"><div id=\"app\">).\n // ponytail: one Object.keys per element, only on a page where the fast path found nothing.\n if (roots.length === 0 && document.body && document.body.querySelectorAll) scan(Array.from(document.body.querySelectorAll('*')));\n }\n return roots;\n}\nfunction __eb_noRootsReason() {\n if (typeof document !== 'undefined' && document) return 'No fiber roots found on this page: it is not a React app, or React has not rendered yet.';\n return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__\n ? 'No fiber roots found. The app may not have rendered yet.'\n : 'React DevTools hook not found. Make sure you are running a development build.';\n}\n";
2
+ //# sourceMappingURL=fiberRoots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiberRoots.d.ts","sourceRoot":"","sources":["../../../src/core/injected/fiberRoots.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,cAAc,mwFA0D1B,CAAC"}
@@ -0,0 +1,60 @@
1
+ export const FIBER_ROOTS_JS = `
2
+ function __eb_fiberRoots(all) {
3
+ var hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
4
+ var roots = [];
5
+ var add = function (list) {
6
+ for (var i = 0; i < list.length; i++) if (roots.indexOf(list[i]) < 0) roots.push(list[i]);
7
+ };
8
+ if (hook && typeof hook.getFiberRoots === 'function') {
9
+ if (!all) {
10
+ try { add(Array.from(hook.getFiberRoots(1) || [])); } catch (e) {}
11
+ }
12
+ if (roots.length === 0 && hook.renderers) {
13
+ hook.renderers.forEach(function (_, id) {
14
+ if (!all && roots.length > 0) return;
15
+ try { add(Array.from(hook.getFiberRoots(id) || [])); } catch (e) {}
16
+ });
17
+ }
18
+ }
19
+ if (roots.length === 0 && typeof document !== 'undefined' && document) {
20
+ var containerRoot = function (el) {
21
+ if (!el) return null;
22
+ var keys = Object.keys(el);
23
+ for (var k = 0; k < keys.length; k++) {
24
+ if (keys[k].indexOf('__reactContainer$') !== 0) continue;
25
+ var f = el[keys[k]];
26
+ return f ? (f.stateNode && f.stateNode.current ? f.stateNode : { current: f }) : null;
27
+ }
28
+ return null;
29
+ };
30
+ var seen = [];
31
+ var scan = function (list) {
32
+ for (var c = 0; c < list.length; c++) {
33
+ if (!all && roots.length > 0) return;
34
+ // #root is usually also one of body's children: read each element once.
35
+ if (!list[c] || seen.indexOf(list[c]) >= 0) continue;
36
+ seen.push(list[c]);
37
+ var r = containerRoot(list[c]);
38
+ if (r && roots.indexOf(r) < 0) roots.push(r);
39
+ }
40
+ };
41
+ var candidates = [document.getElementById ? document.getElementById('root') : null];
42
+ if (document.body) {
43
+ candidates = candidates.concat(Array.from(document.body.children || []));
44
+ candidates.push(document.body);
45
+ }
46
+ scan(candidates);
47
+ // The usual spots missed: a container nested deeper (<div class="wrapper"><div id="app">).
48
+ // ponytail: one Object.keys per element, only on a page where the fast path found nothing.
49
+ if (roots.length === 0 && document.body && document.body.querySelectorAll) scan(Array.from(document.body.querySelectorAll('*')));
50
+ }
51
+ return roots;
52
+ }
53
+ function __eb_noRootsReason() {
54
+ if (typeof document !== 'undefined' && document) return 'No fiber roots found on this page: it is not a React app, or React has not rendered yet.';
55
+ return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__
56
+ ? 'No fiber roots found. The app may not have rendered yet.'
57
+ : 'React DevTools hook not found. Make sure you are running a development build.';
58
+ }
59
+ `;
60
+ //# sourceMappingURL=fiberRoots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiberRoots.js","sourceRoot":"","sources":["../../../src/core/injected/fiberRoots.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"inputTarget.d.ts","sourceRoot":"","sources":["../../src/core/inputTarget.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,UAAU,GAAG;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAYf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAIF,MAAM,MAAM,OAAO,GACb;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAEnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAQtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAO3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IASzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAK5B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IAOb,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,OAAO,CAAC;IASpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAO9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;AAucpD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAuF5E"}
1
+ {"version":3,"file":"inputTarget.d.ts","sourceRoot":"","sources":["../../src/core/inputTarget.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,UAAU,GAAG;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAYf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAKF,MAAM,MAAM,OAAO,GACb;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAEnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAQtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAO3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IASzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAK5B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IAOb,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,OAAO,CAAC;IASpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAO9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;AAicpD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAuF5E"}
@@ -1,4 +1,5 @@
1
1
  import { RN_PRIMITIVES_SRC, GENERIC_COMPONENT_SRC } from "./injectedFilters.js";
2
+ import { FIBER_ROOTS_JS } from "./injected/fiberRoots.js";
2
3
  const HOST_INPUT_TYPES = `["RCTSinglelineTextInputView","RCTMultilineTextInputView","AndroidTextInput"]`;
3
4
  const NO_FOCUS_REASON = "no focused TextInput. Pass testID (or component) so this tool can focus a field itself, " +
4
5
  "or tap the field first. A tap reporting success does not guarantee React focus.";
@@ -8,15 +9,9 @@ function prelude(query) {
8
9
  const wantText = query?.textMatch != null ? JSON.stringify(query.textMatch) : "null";
9
10
  return `
10
11
  var hook = global.__REACT_DEVTOOLS_GLOBAL_HOOK__;
11
- if (!hook) return { found: false, reason: "no devtools hook" };
12
-
13
- var allRoots = [];
14
- var rendererIds = Array.from(hook.renderers.keys());
15
- for (var ri = 0; ri < rendererIds.length; ri++) {
16
- var rs = Array.from(hook.getFiberRoots(rendererIds[ri]) || []);
17
- for (var rj = 0; rj < rs.length; rj++) allRoots.push(rs[rj]);
18
- }
19
- if (allRoots.length === 0) return { found: false, reason: "no fiber roots" };
12
+ ${FIBER_ROOTS_JS}
13
+ var allRoots = __eb_fiberRoots(true);
14
+ if (allRoots.length === 0) return hook ? { found: false, reason: "no fiber roots" } : { found: false, reason: "no devtools hook" };
20
15
 
21
16
  var HOSTS = ${HOST_INPUT_TYPES};
22
17
  var wantTestID = ${wantTestID};
@@ -1 +1 @@
1
- {"version":3,"file":"inputTarget.js","sourceRoot":"","sources":["../../src/core/inputTarget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputTarget.js","sourceRoot":"","sources":["../../src/core/inputTarget.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/core/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUnF,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCzE;AAmBD,wBAAsB,cAAc,CAChC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,GAAE;IACL,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC/B,GACP,OAAO,CAAC,eAAe,CAAC,CA6b1B;AAOD,wBAAsB,oBAAoB,CACtC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAc9B;AAMD,wBAAsB,gBAAgB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,iBAAiB,EAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC"}
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/core/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWnF,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCzE;AAmBD,wBAAsB,cAAc,CAChC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,GAAE;IACL,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC/B,GACP,OAAO,CAAC,eAAe,CAAC,CAib1B;AAOD,wBAAsB,oBAAoB,CACtC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAc9B;AAMD,wBAAsB,gBAAgB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,iBAAiB,EAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC"}
@@ -3,19 +3,15 @@ import { resolveStacksToSource, buildDebugStackHarvestExpression } from "./compo
3
3
  import { RN_PRIMITIVES_SRC, GENERIC_COMPONENT_SRC } from "./injectedFilters.js";
4
4
  import { SCREEN_SPACE_HELPER_JS } from "./screenSpace.js";
5
5
  import { SHEET_HELPERS_JS } from "./injected/sheetOffset.js";
6
+ import { FIBER_ROOTS_JS } from "./injected/fiberRoots.js";
6
7
  export async function isInspectorActive(device) {
7
8
  const expression = `
8
9
  (function() {
9
10
  const hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
10
11
  if (!hook) return false;
11
12
 
12
- let roots = [...(hook.getFiberRoots?.(1) || [])];
13
- if (roots.length === 0) {
14
- for (const [id] of (hook.renderers || [])) {
15
- roots = [...(hook.getFiberRoots?.(id) || [])];
16
- if (roots.length > 0) break;
17
- }
18
- }
13
+ ${FIBER_ROOTS_JS}
14
+ const roots = __eb_fiberRoots(false);
19
15
  if (roots.length === 0) return false;
20
16
 
21
17
  function findComponent(fiber, targetName, depth = 0) {
@@ -46,21 +42,9 @@ export async function inspectAtPoint(x, y, options = {}) {
46
42
  const expression = `
47
43
  new Promise(function(resolve) {
48
44
  var hook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
49
- if (!hook) return resolve({ error: 'React DevTools hook not available. Make sure you are running a development build.' });
50
-
51
- var roots = [];
52
- if (hook.getFiberRoots) {
53
- try { roots = Array.from(hook.getFiberRoots(1) || []); } catch(e) {}
54
- }
55
- if (roots.length === 0 && hook.renderers) {
56
- for (var entry of hook.renderers) {
57
- try {
58
- var r = Array.from(hook.getFiberRoots ? (hook.getFiberRoots(entry[0]) || []) : []);
59
- if (r.length > 0) { roots = r; break; }
60
- } catch(e) {}
61
- }
62
- }
63
- if (roots.length === 0) return resolve({ error: 'No fiber roots found. The app may not have rendered yet.' });
45
+ ${FIBER_ROOTS_JS}
46
+ var roots = __eb_fiberRoots(false);
47
+ if (roots.length === 0) return resolve({ error: __eb_noRootsReason() });
64
48
 
65
49
  // Paper: measureInWindow is on stateNode directly.
66
50
  // Fabric: measureInWindow is on stateNode.canonical.publicInstance.
@@ -1 +1 @@
1
- {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../src/core/inspector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../src/core/inspector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAA2B,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAS1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAe;IACnD,MAAM,UAAU,GAAG;;;;;cAKT,cAAc;;;;;;;;;;;;;;;;;;;KAmBvB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7G,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAmBD,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,CAAS,EACT,CAAS,EACT,UASI,EAAE;IAEN,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAClF,MAAM,OAAO,GAAuB,WAAW,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAEpF,MAAM,UAAU,GAAG;;;cAGT,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmEd,sBAAsB;cACtB,gBAAgB;iCACG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAyEzB,CAAC;+BACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAkEE,iBAAiB;sCACb,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwHzC,YAAY;;;;;;;;;;;;;;;;;;;;kBAoBZ,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqEzB,CAAC;IAMF,OAAO,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,EAAE,MAAM,CAAC,CAAC;AAChH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,CAAS,EACT,CAAS,EACT,MAAe;IAEf,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAC1B,gCAAgC,CAAC,CAAC,EAAE,CAAC,CAAC,EACtC,IAAI,EACJ,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,EAC5D,MAAM,CACT,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAqC,CAAC;QAC1E,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,OAAgC,EAChC,MAA2B;IAE3B,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,SAAS,EAAE,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;IAClE,CAAC;AACL,CAAC"}
@@ -74,6 +74,18 @@ export declare function iosKeyEvent(keycode: number, options?: {
74
74
  duration?: number;
75
75
  udid?: string;
76
76
  }): Promise<iOSResult>;
77
+ export declare function hidKeyFor(combo: {
78
+ mods: number;
79
+ key: {
80
+ key: string;
81
+ };
82
+ }): {
83
+ keycode: number;
84
+ modifiers: number[];
85
+ } | {
86
+ error: string;
87
+ };
88
+ export declare function iosKeyCombo(modifiers: number[], keycode: number, udid?: string): Promise<iOSResult>;
77
89
  export declare function iosKeySequence(keycodes: number[], udid?: string): Promise<iOSResult>;
78
90
  export declare function getIOSSafeAreaTop(udid?: string): Promise<number>;
79
91
  export declare function getIOSScreenPointSize(udid?: string): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/core/ios.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/core/ios.ts"],"names":[],"mappings":"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"}
package/build/core/ios.js CHANGED
@@ -777,6 +777,38 @@ export async function iosKeyEvent(keycode, options) {
777
777
  };
778
778
  }
779
779
  }
780
+ const KEY_TO_HID = {
781
+ Enter: 40, Escape: 41, Backspace: 42, Tab: 43, " ": 44,
782
+ ArrowRight: 79, ArrowLeft: 80, ArrowDown: 81, ArrowUp: 82,
783
+ Home: 74, PageUp: 75, Delete: 76, End: 77, PageDown: 78,
784
+ ...Object.fromEntries(Array.from({ length: 12 }, (_, i) => [`F${i + 1}`, 58 + i])),
785
+ ...Object.fromEntries(Array.from({ length: 26 }, (_, i) => [String.fromCharCode(97 + i), 4 + i])),
786
+ ...Object.fromEntries(Array.from({ length: 9 }, (_, i) => [String(i + 1), 30 + i])),
787
+ "0": 39,
788
+ };
789
+ const MOD_BIT_TO_HID = [[2, 224], [8, 225], [1, 226], [4, 227]];
790
+ export function hidKeyFor(combo) {
791
+ const keycode = KEY_TO_HID[combo.key.key];
792
+ if (keycode === undefined) {
793
+ return { error: `"${combo.key.key}" has no HID keycode here. Named keys, a-z and 0-9 are supported; use input_text for other characters.` };
794
+ }
795
+ return { keycode, modifiers: MOD_BIT_TO_HID.filter(([bit]) => combo.mods & bit).map(([, hid]) => hid) };
796
+ }
797
+ export async function iosKeyCombo(modifiers, keycode, udid) {
798
+ if (getIosDriver() !== "axe") {
799
+ return { success: false, error: "Modifier combos need the AXe driver (brew install cameroncooke/axe/axe, then unset IOS_DRIVER): IDB has no key-combo command." };
800
+ }
801
+ try {
802
+ const preflight = await ensureUiDriverReady(udid);
803
+ if (!preflight.ready)
804
+ return preflight.error;
805
+ await runAxe("key-combo", "--modifiers", modifiers.join(","), "--key", String(keycode), "--udid", preflight.targetUdid);
806
+ return { success: true, result: `Sent key combo: ${modifiers.join("+")}+${keycode}` };
807
+ }
808
+ catch (error) {
809
+ return { success: false, error: `Failed to send key combo: ${error instanceof Error ? error.message : String(error)}` };
810
+ }
811
+ }
780
812
  export async function iosKeySequence(keycodes, udid) {
781
813
  try {
782
814
  if (!keycodes || keycodes.length === 0) {