execbro 0.0.1-reserve → 1.10.12

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 (475) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +496 -0
  3. package/build/__tests__/helpers/fake-cdp-server.d.ts +56 -0
  4. package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -0
  5. package/build/__tests__/helpers/fake-cdp-server.js +120 -0
  6. package/build/__tests__/helpers/fake-cdp-server.js.map +1 -0
  7. package/build/__tests__/helpers/tap-test-helpers.d.ts +36 -0
  8. package/build/__tests__/helpers/tap-test-helpers.d.ts.map +1 -0
  9. package/build/__tests__/helpers/tap-test-helpers.js +130 -0
  10. package/build/__tests__/helpers/tap-test-helpers.js.map +1 -0
  11. package/build/__tests__/integration/auto-reconnect.test.d.ts +2 -0
  12. package/build/__tests__/integration/auto-reconnect.test.d.ts.map +1 -0
  13. package/build/__tests__/integration/auto-reconnect.test.js +118 -0
  14. package/build/__tests__/integration/auto-reconnect.test.js.map +1 -0
  15. package/build/__tests__/integration/connection-health.test.d.ts +2 -0
  16. package/build/__tests__/integration/connection-health.test.d.ts.map +1 -0
  17. package/build/__tests__/integration/connection-health.test.js +157 -0
  18. package/build/__tests__/integration/connection-health.test.js.map +1 -0
  19. package/build/__tests__/integration/execute-in-app.test.d.ts +2 -0
  20. package/build/__tests__/integration/execute-in-app.test.d.ts.map +1 -0
  21. package/build/__tests__/integration/execute-in-app.test.js +124 -0
  22. package/build/__tests__/integration/execute-in-app.test.js.map +1 -0
  23. package/build/__tests__/integration/per-call-timeout.test.d.ts +2 -0
  24. package/build/__tests__/integration/per-call-timeout.test.d.ts.map +1 -0
  25. package/build/__tests__/integration/per-call-timeout.test.js +103 -0
  26. package/build/__tests__/integration/per-call-timeout.test.js.map +1 -0
  27. package/build/__tests__/integration/tap-strategies.test.d.ts +2 -0
  28. package/build/__tests__/integration/tap-strategies.test.d.ts.map +1 -0
  29. package/build/__tests__/integration/tap-strategies.test.js +330 -0
  30. package/build/__tests__/integration/tap-strategies.test.js.map +1 -0
  31. package/build/__tests__/integration/tools.test.d.ts +2 -0
  32. package/build/__tests__/integration/tools.test.d.ts.map +1 -0
  33. package/build/__tests__/integration/tools.test.js +227 -0
  34. package/build/__tests__/integration/tools.test.js.map +1 -0
  35. package/build/__tests__/setup.d.ts +2 -0
  36. package/build/__tests__/setup.d.ts.map +1 -0
  37. package/build/__tests__/setup.js +15 -0
  38. package/build/__tests__/setup.js.map +1 -0
  39. package/build/__tests__/unit/androidEmulatorAvds.test.d.ts +2 -0
  40. package/build/__tests__/unit/androidEmulatorAvds.test.d.ts.map +1 -0
  41. package/build/__tests__/unit/androidEmulatorAvds.test.js +98 -0
  42. package/build/__tests__/unit/androidEmulatorAvds.test.js.map +1 -0
  43. package/build/__tests__/unit/buildToken.test.d.ts +2 -0
  44. package/build/__tests__/unit/buildToken.test.d.ts.map +1 -0
  45. package/build/__tests__/unit/buildToken.test.js +22 -0
  46. package/build/__tests__/unit/buildToken.test.js.map +1 -0
  47. package/build/__tests__/unit/bundle.test.d.ts +2 -0
  48. package/build/__tests__/unit/bundle.test.d.ts.map +1 -0
  49. package/build/__tests__/unit/bundle.test.js +53 -0
  50. package/build/__tests__/unit/bundle.test.js.map +1 -0
  51. package/build/__tests__/unit/burst.test.d.ts +2 -0
  52. package/build/__tests__/unit/burst.test.d.ts.map +1 -0
  53. package/build/__tests__/unit/burst.test.js +54 -0
  54. package/build/__tests__/unit/burst.test.js.map +1 -0
  55. package/build/__tests__/unit/connection-health.test.d.ts +2 -0
  56. package/build/__tests__/unit/connection-health.test.d.ts.map +1 -0
  57. package/build/__tests__/unit/connection-health.test.js +38 -0
  58. package/build/__tests__/unit/connection-health.test.js.map +1 -0
  59. package/build/__tests__/unit/debugGlobals.test.d.ts +2 -0
  60. package/build/__tests__/unit/debugGlobals.test.d.ts.map +1 -0
  61. package/build/__tests__/unit/debugGlobals.test.js +14 -0
  62. package/build/__tests__/unit/debugGlobals.test.js.map +1 -0
  63. package/build/__tests__/unit/deviceDiscovery.test.d.ts +2 -0
  64. package/build/__tests__/unit/deviceDiscovery.test.d.ts.map +1 -0
  65. package/build/__tests__/unit/deviceDiscovery.test.js +119 -0
  66. package/build/__tests__/unit/deviceDiscovery.test.js.map +1 -0
  67. package/build/__tests__/unit/deviceResolver.test.d.ts +2 -0
  68. package/build/__tests__/unit/deviceResolver.test.d.ts.map +1 -0
  69. package/build/__tests__/unit/deviceResolver.test.js +261 -0
  70. package/build/__tests__/unit/deviceResolver.test.js.map +1 -0
  71. package/build/__tests__/unit/escapeNonAscii.test.d.ts +2 -0
  72. package/build/__tests__/unit/escapeNonAscii.test.d.ts.map +1 -0
  73. package/build/__tests__/unit/escapeNonAscii.test.js +76 -0
  74. package/build/__tests__/unit/escapeNonAscii.test.js.map +1 -0
  75. package/build/__tests__/unit/exec.test.d.ts +2 -0
  76. package/build/__tests__/unit/exec.test.d.ts.map +1 -0
  77. package/build/__tests__/unit/exec.test.js +54 -0
  78. package/build/__tests__/unit/exec.test.js.map +1 -0
  79. package/build/__tests__/unit/executor.test.d.ts +2 -0
  80. package/build/__tests__/unit/executor.test.d.ts.map +1 -0
  81. package/build/__tests__/unit/executor.test.js +220 -0
  82. package/build/__tests__/unit/executor.test.js.map +1 -0
  83. package/build/__tests__/unit/failureArtifact.test.d.ts +2 -0
  84. package/build/__tests__/unit/failureArtifact.test.d.ts.map +1 -0
  85. package/build/__tests__/unit/failureArtifact.test.js +207 -0
  86. package/build/__tests__/unit/failureArtifact.test.js.map +1 -0
  87. package/build/__tests__/unit/fastRefreshRecorder.test.d.ts +2 -0
  88. package/build/__tests__/unit/fastRefreshRecorder.test.d.ts.map +1 -0
  89. package/build/__tests__/unit/fastRefreshRecorder.test.js +68 -0
  90. package/build/__tests__/unit/fastRefreshRecorder.test.js.map +1 -0
  91. package/build/__tests__/unit/fastRefreshTools.test.d.ts +2 -0
  92. package/build/__tests__/unit/fastRefreshTools.test.d.ts.map +1 -0
  93. package/build/__tests__/unit/fastRefreshTools.test.js +112 -0
  94. package/build/__tests__/unit/fastRefreshTools.test.js.map +1 -0
  95. package/build/__tests__/unit/fiberMatch.test.d.ts +2 -0
  96. package/build/__tests__/unit/fiberMatch.test.d.ts.map +1 -0
  97. package/build/__tests__/unit/fiberMatch.test.js +114 -0
  98. package/build/__tests__/unit/fiberMatch.test.js.map +1 -0
  99. package/build/__tests__/unit/fingerprint.test.d.ts +2 -0
  100. package/build/__tests__/unit/fingerprint.test.d.ts.map +1 -0
  101. package/build/__tests__/unit/fingerprint.test.js +99 -0
  102. package/build/__tests__/unit/fingerprint.test.js.map +1 -0
  103. package/build/__tests__/unit/focusedInput.test.d.ts +2 -0
  104. package/build/__tests__/unit/focusedInput.test.d.ts.map +1 -0
  105. package/build/__tests__/unit/focusedInput.test.js +58 -0
  106. package/build/__tests__/unit/focusedInput.test.js.map +1 -0
  107. package/build/__tests__/unit/focusedInputTools.test.d.ts +2 -0
  108. package/build/__tests__/unit/focusedInputTools.test.d.ts.map +1 -0
  109. package/build/__tests__/unit/focusedInputTools.test.js +79 -0
  110. package/build/__tests__/unit/focusedInputTools.test.js.map +1 -0
  111. package/build/__tests__/unit/iconSemantics.test.d.ts +2 -0
  112. package/build/__tests__/unit/iconSemantics.test.d.ts.map +1 -0
  113. package/build/__tests__/unit/iconSemantics.test.js +80 -0
  114. package/build/__tests__/unit/iconSemantics.test.js.map +1 -0
  115. package/build/__tests__/unit/imageBuffer.test.d.ts +2 -0
  116. package/build/__tests__/unit/imageBuffer.test.d.ts.map +1 -0
  117. package/build/__tests__/unit/imageBuffer.test.js +128 -0
  118. package/build/__tests__/unit/imageBuffer.test.js.map +1 -0
  119. package/build/__tests__/unit/logs.test.d.ts +2 -0
  120. package/build/__tests__/unit/logs.test.d.ts.map +1 -0
  121. package/build/__tests__/unit/logs.test.js +90 -0
  122. package/build/__tests__/unit/logs.test.js.map +1 -0
  123. package/build/__tests__/unit/measureComponent.test.d.ts +2 -0
  124. package/build/__tests__/unit/measureComponent.test.d.ts.map +1 -0
  125. package/build/__tests__/unit/measureComponent.test.js +66 -0
  126. package/build/__tests__/unit/measureComponent.test.js.map +1 -0
  127. package/build/__tests__/unit/measureComponentTools.test.d.ts +2 -0
  128. package/build/__tests__/unit/measureComponentTools.test.d.ts.map +1 -0
  129. package/build/__tests__/unit/measureComponentTools.test.js +94 -0
  130. package/build/__tests__/unit/measureComponentTools.test.js.map +1 -0
  131. package/build/__tests__/unit/metro.test.d.ts +2 -0
  132. package/build/__tests__/unit/metro.test.d.ts.map +1 -0
  133. package/build/__tests__/unit/metro.test.js +61 -0
  134. package/build/__tests__/unit/metro.test.js.map +1 -0
  135. package/build/__tests__/unit/network.test.d.ts +2 -0
  136. package/build/__tests__/unit/network.test.d.ts.map +1 -0
  137. package/build/__tests__/unit/network.test.js +102 -0
  138. package/build/__tests__/unit/network.test.js.map +1 -0
  139. package/build/__tests__/unit/networkInterceptor.test.d.ts +2 -0
  140. package/build/__tests__/unit/networkInterceptor.test.d.ts.map +1 -0
  141. package/build/__tests__/unit/networkInterceptor.test.js +104 -0
  142. package/build/__tests__/unit/networkInterceptor.test.js.map +1 -0
  143. package/build/__tests__/unit/probe.test.d.ts +2 -0
  144. package/build/__tests__/unit/probe.test.d.ts.map +1 -0
  145. package/build/__tests__/unit/probe.test.js +62 -0
  146. package/build/__tests__/unit/probe.test.js.map +1 -0
  147. package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts +2 -0
  148. package/build/__tests__/unit/rnGlobalsBootstrap.test.d.ts.map +1 -0
  149. package/build/__tests__/unit/rnGlobalsBootstrap.test.js +29 -0
  150. package/build/__tests__/unit/rnGlobalsBootstrap.test.js.map +1 -0
  151. package/build/__tests__/unit/screenState.test.d.ts +2 -0
  152. package/build/__tests__/unit/screenState.test.d.ts.map +1 -0
  153. package/build/__tests__/unit/screenState.test.js +186 -0
  154. package/build/__tests__/unit/screenState.test.js.map +1 -0
  155. package/build/__tests__/unit/screenshot-diff.test.d.ts +2 -0
  156. package/build/__tests__/unit/screenshot-diff.test.d.ts.map +1 -0
  157. package/build/__tests__/unit/screenshot-diff.test.js +97 -0
  158. package/build/__tests__/unit/screenshot-diff.test.js.map +1 -0
  159. package/build/__tests__/unit/tap-evidence.test.d.ts +2 -0
  160. package/build/__tests__/unit/tap-evidence.test.d.ts.map +1 -0
  161. package/build/__tests__/unit/tap-evidence.test.js +89 -0
  162. package/build/__tests__/unit/tap-evidence.test.js.map +1 -0
  163. package/build/__tests__/unit/tap.test.d.ts +2 -0
  164. package/build/__tests__/unit/tap.test.d.ts.map +1 -0
  165. package/build/__tests__/unit/tap.test.js +769 -0
  166. package/build/__tests__/unit/tap.test.js.map +1 -0
  167. package/build/__tests__/unit/timeoutClamp.test.d.ts +2 -0
  168. package/build/__tests__/unit/timeoutClamp.test.d.ts.map +1 -0
  169. package/build/__tests__/unit/timeoutClamp.test.js +17 -0
  170. package/build/__tests__/unit/timeoutClamp.test.js.map +1 -0
  171. package/build/__tests__/unit/toolDescriptions.test.d.ts +2 -0
  172. package/build/__tests__/unit/toolDescriptions.test.d.ts.map +1 -0
  173. package/build/__tests__/unit/toolDescriptions.test.js +145 -0
  174. package/build/__tests__/unit/toolDescriptions.test.js.map +1 -0
  175. package/build/__tests__/unit/transportClassify.test.d.ts +2 -0
  176. package/build/__tests__/unit/transportClassify.test.d.ts.map +1 -0
  177. package/build/__tests__/unit/transportClassify.test.js +60 -0
  178. package/build/__tests__/unit/transportClassify.test.js.map +1 -0
  179. package/build/__tests__/unit/verifyAction.test.d.ts +2 -0
  180. package/build/__tests__/unit/verifyAction.test.d.ts.map +1 -0
  181. package/build/__tests__/unit/verifyAction.test.js +26 -0
  182. package/build/__tests__/unit/verifyAction.test.js.map +1 -0
  183. package/build/core/android.d.ts +299 -0
  184. package/build/core/android.d.ts.map +1 -0
  185. package/build/core/android.js +1582 -0
  186. package/build/core/android.js.map +1 -0
  187. package/build/core/appDetection.d.ts +20 -0
  188. package/build/core/appDetection.d.ts.map +1 -0
  189. package/build/core/appDetection.js +167 -0
  190. package/build/core/appDetection.js.map +1 -0
  191. package/build/core/bundle.d.ts +49 -0
  192. package/build/core/bundle.d.ts.map +1 -0
  193. package/build/core/bundle.js +356 -0
  194. package/build/core/bundle.js.map +1 -0
  195. package/build/core/componentSearch.d.ts +41 -0
  196. package/build/core/componentSearch.d.ts.map +1 -0
  197. package/build/core/componentSearch.js +588 -0
  198. package/build/core/componentSearch.js.map +1 -0
  199. package/build/core/componentTree.d.ts +13 -0
  200. package/build/core/componentTree.d.ts.map +1 -0
  201. package/build/core/componentTree.js +275 -0
  202. package/build/core/componentTree.js.map +1 -0
  203. package/build/core/config.d.ts +9 -0
  204. package/build/core/config.d.ts.map +1 -0
  205. package/build/core/config.js +28 -0
  206. package/build/core/config.js.map +1 -0
  207. package/build/core/connection.d.ts +102 -0
  208. package/build/core/connection.d.ts.map +1 -0
  209. package/build/core/connection.js +1710 -0
  210. package/build/core/connection.js.map +1 -0
  211. package/build/core/connectionState.d.ts +122 -0
  212. package/build/core/connectionState.d.ts.map +1 -0
  213. package/build/core/connectionState.js +313 -0
  214. package/build/core/connectionState.js.map +1 -0
  215. package/build/core/debugGlobals.d.ts +6 -0
  216. package/build/core/debugGlobals.d.ts.map +1 -0
  217. package/build/core/debugGlobals.js +370 -0
  218. package/build/core/debugGlobals.js.map +1 -0
  219. package/build/core/deviceDiscovery.d.ts +52 -0
  220. package/build/core/deviceDiscovery.d.ts.map +1 -0
  221. package/build/core/deviceDiscovery.js +74 -0
  222. package/build/core/deviceDiscovery.js.map +1 -0
  223. package/build/core/deviceResolver.d.ts +44 -0
  224. package/build/core/deviceResolver.d.ts.map +1 -0
  225. package/build/core/deviceResolver.js +225 -0
  226. package/build/core/deviceResolver.js.map +1 -0
  227. package/build/core/errorScreenParser.d.ts +30 -0
  228. package/build/core/errorScreenParser.d.ts.map +1 -0
  229. package/build/core/errorScreenParser.js +198 -0
  230. package/build/core/errorScreenParser.js.map +1 -0
  231. package/build/core/errors.d.ts +14 -0
  232. package/build/core/errors.d.ts.map +1 -0
  233. package/build/core/errors.js +17 -0
  234. package/build/core/errors.js.map +1 -0
  235. package/build/core/escapeNonAscii.d.ts +18 -0
  236. package/build/core/escapeNonAscii.d.ts.map +1 -0
  237. package/build/core/escapeNonAscii.js +352 -0
  238. package/build/core/escapeNonAscii.js.map +1 -0
  239. package/build/core/exec.d.ts +22 -0
  240. package/build/core/exec.d.ts.map +1 -0
  241. package/build/core/exec.js +54 -0
  242. package/build/core/exec.js.map +1 -0
  243. package/build/core/executor.d.ts +9 -0
  244. package/build/core/executor.d.ts.map +1 -0
  245. package/build/core/executor.js +12 -0
  246. package/build/core/executor.js.map +1 -0
  247. package/build/core/failureArtifact.d.ts +120 -0
  248. package/build/core/failureArtifact.d.ts.map +1 -0
  249. package/build/core/failureArtifact.js +113 -0
  250. package/build/core/failureArtifact.js.map +1 -0
  251. package/build/core/fastRefreshRecorder.d.ts +23 -0
  252. package/build/core/fastRefreshRecorder.d.ts.map +1 -0
  253. package/build/core/fastRefreshRecorder.js +83 -0
  254. package/build/core/fastRefreshRecorder.js.map +1 -0
  255. package/build/core/fastRefreshTools.d.ts +19 -0
  256. package/build/core/fastRefreshTools.d.ts.map +1 -0
  257. package/build/core/fastRefreshTools.js +71 -0
  258. package/build/core/fastRefreshTools.js.map +1 -0
  259. package/build/core/feedback.d.ts +18 -0
  260. package/build/core/feedback.d.ts.map +1 -0
  261. package/build/core/feedback.js +73 -0
  262. package/build/core/feedback.js.map +1 -0
  263. package/build/core/fiberMatch.d.ts +25 -0
  264. package/build/core/fiberMatch.d.ts.map +1 -0
  265. package/build/core/fiberMatch.js +35 -0
  266. package/build/core/fiberMatch.js.map +1 -0
  267. package/build/core/fingerprint.d.ts +4 -0
  268. package/build/core/fingerprint.d.ts.map +1 -0
  269. package/build/core/fingerprint.js +47 -0
  270. package/build/core/fingerprint.js.map +1 -0
  271. package/build/core/focusedInput.d.ts +27 -0
  272. package/build/core/focusedInput.d.ts.map +1 -0
  273. package/build/core/focusedInput.js +110 -0
  274. package/build/core/focusedInput.js.map +1 -0
  275. package/build/core/focusedInputTools.d.ts +21 -0
  276. package/build/core/focusedInputTools.d.ts.map +1 -0
  277. package/build/core/focusedInputTools.js +51 -0
  278. package/build/core/focusedInputTools.js.map +1 -0
  279. package/build/core/format.d.ts +8 -0
  280. package/build/core/format.d.ts.map +1 -0
  281. package/build/core/format.js +34 -0
  282. package/build/core/format.js.map +1 -0
  283. package/build/core/guides.d.ts +21 -0
  284. package/build/core/guides.d.ts.map +1 -0
  285. package/build/core/guides.js +397 -0
  286. package/build/core/guides.js.map +1 -0
  287. package/build/core/iconSemantics.d.ts +18 -0
  288. package/build/core/iconSemantics.d.ts.map +1 -0
  289. package/build/core/iconSemantics.js +114 -0
  290. package/build/core/iconSemantics.js.map +1 -0
  291. package/build/core/imageBuffer.d.ts +37 -0
  292. package/build/core/imageBuffer.d.ts.map +1 -0
  293. package/build/core/imageBuffer.js +58 -0
  294. package/build/core/imageBuffer.js.map +1 -0
  295. package/build/core/index.d.ts +37 -0
  296. package/build/core/index.d.ts.map +1 -0
  297. package/build/core/index.js +66 -0
  298. package/build/core/index.js.map +1 -0
  299. package/build/core/inspector.d.ts +55 -0
  300. package/build/core/inspector.d.ts.map +1 -0
  301. package/build/core/inspector.js +603 -0
  302. package/build/core/inspector.js.map +1 -0
  303. package/build/core/ios.d.ts +263 -0
  304. package/build/core/ios.d.ts.map +1 -0
  305. package/build/core/ios.js +1705 -0
  306. package/build/core/ios.js.map +1 -0
  307. package/build/core/jsExecute.d.ts +62 -0
  308. package/build/core/jsExecute.d.ts.map +1 -0
  309. package/build/core/jsExecute.js +696 -0
  310. package/build/core/jsExecute.js.map +1 -0
  311. package/build/core/license.d.ts +48 -0
  312. package/build/core/license.d.ts.map +1 -0
  313. package/build/core/license.js +267 -0
  314. package/build/core/license.js.map +1 -0
  315. package/build/core/logbox.d.ts +58 -0
  316. package/build/core/logbox.d.ts.map +1 -0
  317. package/build/core/logbox.js +330 -0
  318. package/build/core/logbox.js.map +1 -0
  319. package/build/core/logs.d.ts +44 -0
  320. package/build/core/logs.d.ts.map +1 -0
  321. package/build/core/logs.js +149 -0
  322. package/build/core/logs.js.map +1 -0
  323. package/build/core/measureComponent.d.ts +19 -0
  324. package/build/core/measureComponent.d.ts.map +1 -0
  325. package/build/core/measureComponent.js +94 -0
  326. package/build/core/measureComponent.js.map +1 -0
  327. package/build/core/measureComponentTools.d.ts +6 -0
  328. package/build/core/measureComponentTools.d.ts.map +1 -0
  329. package/build/core/measureComponentTools.js +43 -0
  330. package/build/core/measureComponentTools.js.map +1 -0
  331. package/build/core/metro.d.ts +31 -0
  332. package/build/core/metro.d.ts.map +1 -0
  333. package/build/core/metro.js +124 -0
  334. package/build/core/metro.js.map +1 -0
  335. package/build/core/nativeOnlyHints.d.ts +14 -0
  336. package/build/core/nativeOnlyHints.d.ts.map +1 -0
  337. package/build/core/nativeOnlyHints.js +58 -0
  338. package/build/core/nativeOnlyHints.js.map +1 -0
  339. package/build/core/network.d.ts +43 -0
  340. package/build/core/network.d.ts.map +1 -0
  341. package/build/core/network.js +217 -0
  342. package/build/core/network.js.map +1 -0
  343. package/build/core/networkInterceptor.d.ts +30 -0
  344. package/build/core/networkInterceptor.d.ts.map +1 -0
  345. package/build/core/networkInterceptor.js +211 -0
  346. package/build/core/networkInterceptor.js.map +1 -0
  347. package/build/core/ocr.d.ts +87 -0
  348. package/build/core/ocr.d.ts.map +1 -0
  349. package/build/core/ocr.js +335 -0
  350. package/build/core/ocr.js.map +1 -0
  351. package/build/core/paths.d.ts +2 -0
  352. package/build/core/paths.d.ts.map +1 -0
  353. package/build/core/paths.js +28 -0
  354. package/build/core/paths.js.map +1 -0
  355. package/build/core/posthog.d.ts +5 -0
  356. package/build/core/posthog.d.ts.map +1 -0
  357. package/build/core/posthog.js +52 -0
  358. package/build/core/posthog.js.map +1 -0
  359. package/build/core/pressables.d.ts +46 -0
  360. package/build/core/pressables.d.ts.map +1 -0
  361. package/build/core/pressables.js +1719 -0
  362. package/build/core/pressables.js.map +1 -0
  363. package/build/core/probe.d.ts +12 -0
  364. package/build/core/probe.d.ts.map +1 -0
  365. package/build/core/probe.js +56 -0
  366. package/build/core/probe.js.map +1 -0
  367. package/build/core/redux.d.ts +22 -0
  368. package/build/core/redux.d.ts.map +1 -0
  369. package/build/core/redux.js +116 -0
  370. package/build/core/redux.js.map +1 -0
  371. package/build/core/register.d.ts +8 -0
  372. package/build/core/register.d.ts.map +1 -0
  373. package/build/core/register.js +202 -0
  374. package/build/core/register.js.map +1 -0
  375. package/build/core/rnGlobalsBootstrap.d.ts +16 -0
  376. package/build/core/rnGlobalsBootstrap.d.ts.map +1 -0
  377. package/build/core/rnGlobalsBootstrap.js +116 -0
  378. package/build/core/rnGlobalsBootstrap.js.map +1 -0
  379. package/build/core/screenLayout.d.ts +53 -0
  380. package/build/core/screenLayout.d.ts.map +1 -0
  381. package/build/core/screenLayout.js +878 -0
  382. package/build/core/screenLayout.js.map +1 -0
  383. package/build/core/screenState.d.ts +98 -0
  384. package/build/core/screenState.d.ts.map +1 -0
  385. package/build/core/screenState.js +1121 -0
  386. package/build/core/screenState.js.map +1 -0
  387. package/build/core/sdkBridge.d.ts +67 -0
  388. package/build/core/sdkBridge.d.ts.map +1 -0
  389. package/build/core/sdkBridge.js +148 -0
  390. package/build/core/sdkBridge.js.map +1 -0
  391. package/build/core/state.d.ts +37 -0
  392. package/build/core/state.d.ts.map +1 -0
  393. package/build/core/state.js +124 -0
  394. package/build/core/state.js.map +1 -0
  395. package/build/core/telemetry.d.ts +50 -0
  396. package/build/core/telemetry.d.ts.map +1 -0
  397. package/build/core/telemetry.js +653 -0
  398. package/build/core/telemetry.js.map +1 -0
  399. package/build/core/toolHelpers.d.ts +24 -0
  400. package/build/core/toolHelpers.d.ts.map +1 -0
  401. package/build/core/toolHelpers.js +118 -0
  402. package/build/core/toolHelpers.js.map +1 -0
  403. package/build/core/types.d.ts +162 -0
  404. package/build/core/types.d.ts.map +1 -0
  405. package/build/core/types.js +2 -0
  406. package/build/core/types.js.map +1 -0
  407. package/build/index.d.ts +4 -0
  408. package/build/index.d.ts.map +1 -0
  409. package/build/index.js +132 -0
  410. package/build/index.js.map +1 -0
  411. package/build/pro/screenshot-diff.d.ts +10 -0
  412. package/build/pro/screenshot-diff.d.ts.map +1 -0
  413. package/build/pro/screenshot-diff.js +38 -0
  414. package/build/pro/screenshot-diff.js.map +1 -0
  415. package/build/pro/tap.d.ts +295 -0
  416. package/build/pro/tap.d.ts.map +1 -0
  417. package/build/pro/tap.js +1937 -0
  418. package/build/pro/tap.js.map +1 -0
  419. package/build/pro/verifyAction.d.ts +50 -0
  420. package/build/pro/verifyAction.d.ts.map +1 -0
  421. package/build/pro/verifyAction.js +285 -0
  422. package/build/pro/verifyAction.js.map +1 -0
  423. package/build/tools/_deviceArg.d.ts +45 -0
  424. package/build/tools/_deviceArg.d.ts.map +1 -0
  425. package/build/tools/_deviceArg.js +58 -0
  426. package/build/tools/_deviceArg.js.map +1 -0
  427. package/build/tools/accountTools.d.ts +46 -0
  428. package/build/tools/accountTools.d.ts.map +1 -0
  429. package/build/tools/accountTools.js +223 -0
  430. package/build/tools/accountTools.js.map +1 -0
  431. package/build/tools/bundleTools.d.ts +3 -0
  432. package/build/tools/bundleTools.d.ts.map +1 -0
  433. package/build/tools/bundleTools.js +375 -0
  434. package/build/tools/bundleTools.js.map +1 -0
  435. package/build/tools/componentTools.d.ts +3 -0
  436. package/build/tools/componentTools.d.ts.map +1 -0
  437. package/build/tools/componentTools.js +745 -0
  438. package/build/tools/componentTools.js.map +1 -0
  439. package/build/tools/connectionTools.d.ts +3 -0
  440. package/build/tools/connectionTools.d.ts.map +1 -0
  441. package/build/tools/connectionTools.js +625 -0
  442. package/build/tools/connectionTools.js.map +1 -0
  443. package/build/tools/deviceTools.d.ts +3 -0
  444. package/build/tools/deviceTools.d.ts.map +1 -0
  445. package/build/tools/deviceTools.js +423 -0
  446. package/build/tools/deviceTools.js.map +1 -0
  447. package/build/tools/executionTools.d.ts +3 -0
  448. package/build/tools/executionTools.d.ts.map +1 -0
  449. package/build/tools/executionTools.js +243 -0
  450. package/build/tools/executionTools.js.map +1 -0
  451. package/build/tools/interactionTools.d.ts +3 -0
  452. package/build/tools/interactionTools.d.ts.map +1 -0
  453. package/build/tools/interactionTools.js +539 -0
  454. package/build/tools/interactionTools.js.map +1 -0
  455. package/build/tools/logTools.d.ts +3 -0
  456. package/build/tools/logTools.d.ts.map +1 -0
  457. package/build/tools/logTools.js +371 -0
  458. package/build/tools/logTools.js.map +1 -0
  459. package/build/tools/metaTools.d.ts +7 -0
  460. package/build/tools/metaTools.d.ts.map +1 -0
  461. package/build/tools/metaTools.js +186 -0
  462. package/build/tools/metaTools.js.map +1 -0
  463. package/build/tools/networkTools.d.ts +3 -0
  464. package/build/tools/networkTools.d.ts.map +1 -0
  465. package/build/tools/networkTools.js +478 -0
  466. package/build/tools/networkTools.js.map +1 -0
  467. package/build/tools/reduxTools.d.ts +3 -0
  468. package/build/tools/reduxTools.d.ts.map +1 -0
  469. package/build/tools/reduxTools.js +83 -0
  470. package/build/tools/reduxTools.js.map +1 -0
  471. package/build/tools/screenshotTools.d.ts +3 -0
  472. package/build/tools/screenshotTools.d.ts.map +1 -0
  473. package/build/tools/screenshotTools.js +703 -0
  474. package/build/tools/screenshotTools.js.map +1 -0
  475. package/package.json +63 -2
@@ -0,0 +1,14 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { buildListDebugGlobalsExpression } from "../../core/debugGlobals.js";
3
+ describe("buildListDebugGlobalsExpression", () => {
4
+ it("probes globalThis.__rn__ and surfaces its keys", () => {
5
+ const expr = buildListDebugGlobalsExpression();
6
+ expect(expr).toContain("__rn__");
7
+ expect(expr).toMatch(/rn\s*:/);
8
+ });
9
+ it("emits a hint that mentions globalThis.__rn__", () => {
10
+ const expr = buildListDebugGlobalsExpression();
11
+ expect(expr).toContain("globalThis.__rn__");
12
+ });
13
+ });
14
+ //# sourceMappingURL=debugGlobals.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugGlobals.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/debugGlobals.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAE7E,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,+BAA+B,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,+BAA+B,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deviceDiscovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceDiscovery.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/deviceDiscovery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import { describe, it, expect, jest, beforeEach } from "@jest/globals";
2
+ const listIOSSimulatorsMock = jest.fn();
3
+ const listAndroidDevicesMock = jest.fn();
4
+ const getAndroidEmulatorAvdsMock = jest.fn();
5
+ const getAdbIdForAvdMock = jest.fn();
6
+ // Minimal stubs for symbols reached transitively by the jest afterEach setup
7
+ // (state.js → bundle.js → connection.js → ios.js/android.js). Only the named
8
+ // exports actually imported by those modules need to exist on the mocked
9
+ // surface; anything else can be omitted.
10
+ jest.unstable_mockModule("../../core/ios.js", () => ({
11
+ listIOSSimulators: listIOSSimulatorsMock,
12
+ findSimulatorByName: jest.fn()
13
+ }));
14
+ jest.unstable_mockModule("../../core/android.js", () => ({
15
+ listAndroidDevices: listAndroidDevicesMock,
16
+ getAndroidEmulatorAvds: getAndroidEmulatorAvdsMock,
17
+ getAdbIdForAvd: getAdbIdForAvdMock
18
+ }));
19
+ const { listAllDevices, resetDeviceDiscoveryCache } = await import("../../core/deviceDiscovery.js");
20
+ describe("listAllDevices", () => {
21
+ beforeEach(() => {
22
+ listIOSSimulatorsMock.mockReset();
23
+ listAndroidDevicesMock.mockReset();
24
+ getAndroidEmulatorAvdsMock.mockReset();
25
+ getAdbIdForAvdMock.mockReset();
26
+ resetDeviceDiscoveryCache();
27
+ });
28
+ it("returns booted+shutdown iOS sims with normalized state", async () => {
29
+ listIOSSimulatorsMock.mockResolvedValue({
30
+ success: true,
31
+ simulators: [
32
+ { name: "iPhone 17 Pro", udid: "ABC-123", state: "Booted", runtime: "iOS 17.4" },
33
+ { name: "iPhone SE", udid: "DEF-456", state: "Shutdown", runtime: "iOS 17.4" }
34
+ ]
35
+ });
36
+ listAndroidDevicesMock.mockResolvedValue({ success: true, devices: [] });
37
+ getAndroidEmulatorAvdsMock.mockResolvedValue([]);
38
+ const result = await listAllDevices();
39
+ expect(result.ios.available).toBe(true);
40
+ expect(result.ios.simulators).toEqual([
41
+ { name: "iPhone 17 Pro", udid: "ABC-123", state: "booted", runtime: "iOS 17.4" },
42
+ { name: "iPhone SE", udid: "DEF-456", state: "shutdown", runtime: "iOS 17.4" }
43
+ ]);
44
+ });
45
+ it("merges running+stopped Android emulators, with serial filled in for running", async () => {
46
+ listIOSSimulatorsMock.mockResolvedValue({ success: true, simulators: [] });
47
+ listAndroidDevicesMock.mockResolvedValue({
48
+ success: true,
49
+ devices: [{ id: "emulator-5554", status: "device" }]
50
+ });
51
+ getAndroidEmulatorAvdsMock.mockResolvedValue(["Pixel_7_API_34", "Tablet_API_33"]);
52
+ getAdbIdForAvdMock.mockImplementation(async (name) => name === "Pixel_7_API_34" ? "emulator-5554" : null);
53
+ const result = await listAllDevices();
54
+ expect(result.android.emulators).toEqual([
55
+ { name: "Pixel_7_API_34", serial: "emulator-5554", state: "running" },
56
+ { name: "Tablet_API_33", serial: null, state: "stopped" }
57
+ ]);
58
+ });
59
+ it("separates physical Android devices from emulators", async () => {
60
+ listIOSSimulatorsMock.mockResolvedValue({ success: true, simulators: [] });
61
+ listAndroidDevicesMock.mockResolvedValue({
62
+ success: true,
63
+ devices: [
64
+ { id: "R58M12345", status: "device", model: "Pixel_7" },
65
+ { id: "emulator-5554", status: "device" }
66
+ ]
67
+ });
68
+ getAndroidEmulatorAvdsMock.mockResolvedValue([]);
69
+ getAdbIdForAvdMock.mockResolvedValue(null);
70
+ const result = await listAllDevices();
71
+ expect(result.android.physical).toEqual([
72
+ { model: "Pixel_7", serial: "R58M12345", state: "device" }
73
+ ]);
74
+ expect(result.android.emulators).toEqual([]);
75
+ });
76
+ it("reports ios.available=false when listIOSSimulators fails", async () => {
77
+ listIOSSimulatorsMock.mockResolvedValue({ success: false, error: "xcrun not found" });
78
+ listAndroidDevicesMock.mockResolvedValue({ success: true, devices: [] });
79
+ getAndroidEmulatorAvdsMock.mockResolvedValue([]);
80
+ const result = await listAllDevices();
81
+ expect(result.ios.available).toBe(false);
82
+ expect(result.ios.error).toMatch(/xcrun/);
83
+ expect(result.ios.simulators).toEqual([]);
84
+ });
85
+ it("returns cached result within the TTL window", async () => {
86
+ listIOSSimulatorsMock.mockResolvedValue({ success: true, simulators: [] });
87
+ listAndroidDevicesMock.mockResolvedValue({ success: true, devices: [] });
88
+ getAndroidEmulatorAvdsMock.mockResolvedValue([]);
89
+ await listAllDevices();
90
+ await listAllDevices();
91
+ expect(listIOSSimulatorsMock).toHaveBeenCalledTimes(1);
92
+ });
93
+ it("bypasses the cache when refresh=true", async () => {
94
+ listIOSSimulatorsMock.mockResolvedValue({ success: true, simulators: [] });
95
+ listAndroidDevicesMock.mockResolvedValue({ success: true, devices: [] });
96
+ getAndroidEmulatorAvdsMock.mockResolvedValue([]);
97
+ await listAllDevices();
98
+ await listAllDevices({ refresh: true });
99
+ expect(listIOSSimulatorsMock).toHaveBeenCalledTimes(2);
100
+ });
101
+ it("computes booted/total summary across platforms", async () => {
102
+ listIOSSimulatorsMock.mockResolvedValue({
103
+ success: true,
104
+ simulators: [
105
+ { name: "A", udid: "1", state: "Booted", runtime: "iOS 17.4" },
106
+ { name: "B", udid: "2", state: "Shutdown", runtime: "iOS 17.4" }
107
+ ]
108
+ });
109
+ listAndroidDevicesMock.mockResolvedValue({
110
+ success: true,
111
+ devices: [{ id: "emulator-5554", status: "device" }]
112
+ });
113
+ getAndroidEmulatorAvdsMock.mockResolvedValue(["Pixel_7_API_34", "Tablet_API_33"]);
114
+ getAdbIdForAvdMock.mockImplementation(async (n) => (n === "Pixel_7_API_34" ? "emulator-5554" : null));
115
+ const result = await listAllDevices();
116
+ expect(result.summary).toEqual({ booted: 2, total: 4 });
117
+ });
118
+ });
119
+ //# sourceMappingURL=deviceDiscovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceDiscovery.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/deviceDiscovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deviceResolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceResolver.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/deviceResolver.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,261 @@
1
+ import { describe, it, expect, jest, beforeEach } from "@jest/globals";
2
+ const getConnectedAppsMock = jest.fn();
3
+ const listAllDevicesMock = jest.fn();
4
+ jest.unstable_mockModule("../../core/connection.js", () => ({
5
+ getConnectedApps: getConnectedAppsMock,
6
+ // Minimal extras the setup chain may reach via state.js/bundle.js
7
+ createWebSocketWithOriginFallback: jest.fn(),
8
+ getConnectedAppByDevice: jest.fn(),
9
+ getConnectedAppBySimulatorUdid: jest.fn(),
10
+ getConnectedAppByAndroidDeviceId: jest.fn(),
11
+ getFirstConnectedApp: jest.fn(),
12
+ connectToDevice: jest.fn(),
13
+ clearReconnectionSuppression: jest.fn(),
14
+ purgeStaleConnectionsForPorts: jest.fn()
15
+ }));
16
+ jest.unstable_mockModule("../../core/deviceDiscovery.js", () => ({
17
+ listAllDevices: listAllDevicesMock,
18
+ resetDeviceDiscoveryCache: jest.fn()
19
+ }));
20
+ const { resolveDeviceTarget } = await import("../../core/deviceResolver.js");
21
+ function emptyDiscovery() {
22
+ return {
23
+ ios: { available: true, simulators: [] },
24
+ android: { available: true, emulators: [], physical: [] },
25
+ summary: { booted: 0, total: 0 }
26
+ };
27
+ }
28
+ describe("resolveDeviceTarget", () => {
29
+ beforeEach(() => {
30
+ getConnectedAppsMock.mockReset();
31
+ listAllDevicesMock.mockReset();
32
+ getConnectedAppsMock.mockReturnValue([]);
33
+ listAllDevicesMock.mockResolvedValue(emptyDiscovery());
34
+ });
35
+ it("resolves an iOS simulator UDID directly to a booted iOS target", async () => {
36
+ listAllDevicesMock.mockResolvedValue({
37
+ ...emptyDiscovery(),
38
+ ios: {
39
+ available: true,
40
+ simulators: [
41
+ { name: "iPhone 17 Pro", udid: "12345678-1234-1234-1234-123456789012", state: "booted", runtime: "iOS 17.4" }
42
+ ]
43
+ }
44
+ });
45
+ const r = await resolveDeviceTarget("12345678-1234-1234-1234-123456789012");
46
+ expect(r.ok).toBe(true);
47
+ if (r.ok) {
48
+ expect(r.target.platform).toBe("ios");
49
+ expect(r.target.iosUdid).toBe("12345678-1234-1234-1234-123456789012");
50
+ expect(r.target.source).toBe("udid");
51
+ }
52
+ });
53
+ it("errors with SIMULATOR_NOT_BOOTED when a shutdown sim UDID is passed", async () => {
54
+ listAllDevicesMock.mockResolvedValue({
55
+ ...emptyDiscovery(),
56
+ ios: {
57
+ available: true,
58
+ simulators: [
59
+ { name: "iPhone SE", udid: "ABCDEF12-3456-7890-ABCD-EF1234567890", state: "shutdown", runtime: "iOS 17.4" }
60
+ ]
61
+ }
62
+ });
63
+ const r = await resolveDeviceTarget("ABCDEF12-3456-7890-ABCD-EF1234567890");
64
+ expect(r.ok).toBe(false);
65
+ if (!r.ok) {
66
+ expect(r.error.code).toBe("SIMULATOR_NOT_BOOTED");
67
+ expect(r.error.message).toMatch(/ios_boot_simulator/);
68
+ }
69
+ });
70
+ it("resolves an emulator-NNNN serial to Android", async () => {
71
+ listAllDevicesMock.mockResolvedValue({
72
+ ...emptyDiscovery(),
73
+ android: {
74
+ available: true,
75
+ emulators: [{ name: "Pixel_7_API_34", serial: "emulator-5554", state: "running" }],
76
+ physical: []
77
+ }
78
+ });
79
+ const r = await resolveDeviceTarget("emulator-5554");
80
+ expect(r.ok).toBe(true);
81
+ if (r.ok) {
82
+ expect(r.target.platform).toBe("android");
83
+ expect(r.target.androidSerial).toBe("emulator-5554");
84
+ expect(r.target.source).toBe("adb-serial");
85
+ }
86
+ });
87
+ it("matches the RN registry by deviceName substring (iOS)", async () => {
88
+ getConnectedAppsMock.mockReturnValue([
89
+ {
90
+ app: {
91
+ platform: "ios",
92
+ simulatorUdid: "12345678-1234-1234-1234-123456789012",
93
+ deviceInfo: { deviceName: "iPhone 17 Pro" }
94
+ }
95
+ }
96
+ ]);
97
+ const r = await resolveDeviceTarget("17 Pro");
98
+ expect(r.ok).toBe(true);
99
+ if (r.ok) {
100
+ expect(r.target.platform).toBe("ios");
101
+ expect(r.target.iosUdid).toBe("12345678-1234-1234-1234-123456789012");
102
+ expect(r.target.source).toBe("registry");
103
+ }
104
+ });
105
+ it("matches the RN registry across punctuation drift (SM_A356N vs SM-A356N - 15 - API 35)", async () => {
106
+ getConnectedAppsMock.mockReturnValue([
107
+ {
108
+ app: {
109
+ platform: "android",
110
+ adbSerial: "RFCX90KEYBM",
111
+ deviceInfo: { deviceName: "SM-A356N - 15 - API 35" }
112
+ }
113
+ }
114
+ ]);
115
+ const r = await resolveDeviceTarget("SM_A356N");
116
+ expect(r.ok).toBe(true);
117
+ if (r.ok) {
118
+ expect(r.target.platform).toBe("android");
119
+ expect(r.target.androidSerial).toBe("RFCX90KEYBM");
120
+ expect(r.target.source).toBe("registry");
121
+ }
122
+ });
123
+ it("OS-level match survives punctuation drift on Android model names", async () => {
124
+ listAllDevicesMock.mockResolvedValue({
125
+ ...emptyDiscovery(),
126
+ android: {
127
+ available: true,
128
+ emulators: [],
129
+ physical: [{ serial: "RFCX90KEYBM", model: "SM-A356N - 15 - API 35", state: "device" }]
130
+ }
131
+ });
132
+ const r = await resolveDeviceTarget("SM_A356N");
133
+ expect(r.ok).toBe(true);
134
+ if (r.ok) {
135
+ expect(r.target.platform).toBe("android");
136
+ expect(r.target.androidSerial).toBe("RFCX90KEYBM");
137
+ expect(r.target.source).toBe("name-match");
138
+ }
139
+ });
140
+ it("matches the RN registry by deviceName substring (Android)", async () => {
141
+ getConnectedAppsMock.mockReturnValue([
142
+ {
143
+ app: {
144
+ platform: "android",
145
+ adbSerial: "emulator-5554",
146
+ deviceInfo: { deviceName: "sdk_gphone64_arm64" }
147
+ }
148
+ }
149
+ ]);
150
+ const r = await resolveDeviceTarget("gphone");
151
+ expect(r.ok).toBe(true);
152
+ if (r.ok) {
153
+ expect(r.target.platform).toBe("android");
154
+ expect(r.target.androidSerial).toBe("emulator-5554");
155
+ expect(r.target.source).toBe("registry");
156
+ }
157
+ });
158
+ it("errors with MULTIPLE_DEVICES_MATCH when registry has two matches", async () => {
159
+ getConnectedAppsMock.mockReturnValue([
160
+ {
161
+ app: {
162
+ platform: "ios",
163
+ simulatorUdid: "12345678-1234-1234-1234-123456789012",
164
+ deviceInfo: { deviceName: "iPhone 17 Pro" }
165
+ }
166
+ },
167
+ {
168
+ app: {
169
+ platform: "android",
170
+ adbSerial: "emulator-5554",
171
+ deviceInfo: { deviceName: "iPhone-named-Android" }
172
+ }
173
+ }
174
+ ]);
175
+ const r = await resolveDeviceTarget("iPhone");
176
+ expect(r.ok).toBe(false);
177
+ if (!r.ok) {
178
+ expect(r.error.code).toBe("MULTIPLE_DEVICES_MATCH");
179
+ expect(r.error.candidates).toHaveLength(2);
180
+ }
181
+ });
182
+ it("falls back to OS-level name match when registry is empty", async () => {
183
+ listAllDevicesMock.mockResolvedValue({
184
+ ...emptyDiscovery(),
185
+ ios: {
186
+ available: true,
187
+ simulators: [
188
+ { name: "iPhone 17 Pro", udid: "12345678-1234-1234-1234-123456789012", state: "booted", runtime: "iOS 17.4" }
189
+ ]
190
+ }
191
+ });
192
+ const r = await resolveDeviceTarget("17 Pro");
193
+ expect(r.ok).toBe(true);
194
+ if (r.ok) {
195
+ expect(r.target.source).toBe("name-match");
196
+ expect(r.target.iosUdid).toBe("12345678-1234-1234-1234-123456789012");
197
+ }
198
+ });
199
+ it("defaults to the single available device when no arg is passed", async () => {
200
+ listAllDevicesMock.mockResolvedValue({
201
+ ...emptyDiscovery(),
202
+ ios: {
203
+ available: true,
204
+ simulators: [
205
+ { name: "iPhone 17 Pro", udid: "12345678-1234-1234-1234-123456789012", state: "booted", runtime: "iOS 17.4" }
206
+ ]
207
+ }
208
+ });
209
+ const r = await resolveDeviceTarget();
210
+ expect(r.ok).toBe(true);
211
+ if (r.ok) {
212
+ expect(r.target.source).toBe("default");
213
+ expect(r.target.platform).toBe("ios");
214
+ }
215
+ });
216
+ it("errors with MULTIPLE_DEVICES_MATCH when no arg + multiple booted devices", async () => {
217
+ listAllDevicesMock.mockResolvedValue({
218
+ ...emptyDiscovery(),
219
+ ios: {
220
+ available: true,
221
+ simulators: [
222
+ { name: "iPhone 17 Pro", udid: "12345678-1234-1234-1234-123456789012", state: "booted", runtime: "iOS 17.4" }
223
+ ]
224
+ },
225
+ android: {
226
+ available: true,
227
+ emulators: [{ name: "Pixel_7_API_34", serial: "emulator-5554", state: "running" }],
228
+ physical: []
229
+ }
230
+ });
231
+ const r = await resolveDeviceTarget();
232
+ expect(r.ok).toBe(false);
233
+ if (!r.ok) {
234
+ expect(r.error.code).toBe("MULTIPLE_DEVICES_MATCH");
235
+ }
236
+ });
237
+ it("errors with NO_DEVICES_FOUND when nothing is running and no arg is passed", async () => {
238
+ const r = await resolveDeviceTarget();
239
+ expect(r.ok).toBe(false);
240
+ if (!r.ok) {
241
+ expect(r.error.code).toBe("NO_DEVICES_FOUND");
242
+ }
243
+ });
244
+ it("errors with DEVICE_NOT_FOUND when arg matches nothing", async () => {
245
+ listAllDevicesMock.mockResolvedValue({
246
+ ...emptyDiscovery(),
247
+ ios: {
248
+ available: true,
249
+ simulators: [
250
+ { name: "iPhone 17 Pro", udid: "12345678-1234-1234-1234-123456789012", state: "booted", runtime: "iOS 17.4" }
251
+ ]
252
+ }
253
+ });
254
+ const r = await resolveDeviceTarget("Pixel");
255
+ expect(r.ok).toBe(false);
256
+ if (!r.ok) {
257
+ expect(r.error.code).toBe("DEVICE_NOT_FOUND");
258
+ }
259
+ });
260
+ });
261
+ //# sourceMappingURL=deviceResolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deviceResolver.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/deviceResolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=escapeNonAscii.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeNonAscii.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/escapeNonAscii.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { escapeNonAsciiInStringLiterals } from "../../core/escapeNonAscii.js";
3
+ function run(src) {
4
+ const r = escapeNonAsciiInStringLiterals(src);
5
+ if (!r.ok)
6
+ throw new Error("recognizer failed: " + r.reason);
7
+ return r.expression;
8
+ }
9
+ describe("escapeNonAsciiInStringLiterals — happy paths", () => {
10
+ it("is a no-op on a plain ASCII expression", () => {
11
+ expect(run("1 + 2")).toBe("1 + 2");
12
+ });
13
+ it("is a no-op when there are no literals", () => {
14
+ expect(run("foo.bar.baz")).toBe("foo.bar.baz");
15
+ });
16
+ it("escapes Arabic in a double-quoted string", () => {
17
+ const out = run('"اللغة"');
18
+ expect(out).toBe('"\\u0627\\u0644\\u0644\\u063A\\u0629"');
19
+ });
20
+ it("escapes Arabic in a single-quoted string", () => {
21
+ expect(run("'اللغة'")).toContain("\\u0627");
22
+ });
23
+ it("escapes emoji (astral) using \\u{...} form", () => {
24
+ const out = run('"😀"');
25
+ expect(out).toBe('"\\u{1F600}"');
26
+ });
27
+ it("escapes CJK characters", () => {
28
+ expect(run('"中文"')).toBe('"\\u4E2D\\u6587"');
29
+ });
30
+ it("leaves identifiers and keywords alone", () => {
31
+ expect(run("var x = 1; x")).toBe("var x = 1; x");
32
+ });
33
+ it("preserves regex literals verbatim", () => {
34
+ expect(run("/[abc]/.test('x')")).toBe("/[abc]/.test('x')");
35
+ });
36
+ it("preserves comments verbatim", () => {
37
+ expect(run("// 中文 comment\n1")).toBe("// 中文 comment\n1");
38
+ expect(run("/* 中文 */ 1")).toBe("/* 中文 */ 1");
39
+ });
40
+ });
41
+ describe("escapeNonAsciiInStringLiterals — tricky cases", () => {
42
+ it("handles backslash escapes inside a string", () => {
43
+ expect(run('"a\\"中b"')).toBe('"a\\"\\u4E2Db"');
44
+ });
45
+ it("handles apostrophe inside a double-quoted string", () => {
46
+ expect(run('"it\'s café"')).toBe('"it\'s caf\\u00E9"');
47
+ });
48
+ it("handles template literal substitutions as expression context", () => {
49
+ const out = run("`a中${1 + 2}b文`");
50
+ expect(out).toBe("`a\\u4E2D${1 + 2}b\\u6587`");
51
+ });
52
+ it("handles a regex with a / inside a character class", () => {
53
+ expect(run("/[/]/.test('x')")).toBe("/[/]/.test('x')");
54
+ });
55
+ it("handles multi-line template literals", () => {
56
+ const src = "`café\nlatte`";
57
+ expect(run(src)).toBe("`caf\\u00E9\nlatte`");
58
+ });
59
+ it("handles ASCII printables (no escape)", () => {
60
+ const src = "`a\tb\nc`";
61
+ expect(run(src)).toBe("`a\tb\nc`");
62
+ });
63
+ });
64
+ describe("escapeNonAsciiInStringLiterals — fallback path", () => {
65
+ it("returns ok:false with a clear message on unbalanced quotes", () => {
66
+ const r = escapeNonAsciiInStringLiterals('"unterminated');
67
+ expect(r.ok).toBe(false);
68
+ if (!r.ok)
69
+ expect(r.reason).toMatch(/unbalanced|unterminated/i);
70
+ });
71
+ it("returns ok:false on unterminated template literal", () => {
72
+ const r = escapeNonAsciiInStringLiterals("`unterminated");
73
+ expect(r.ok).toBe(false);
74
+ });
75
+ });
76
+ //# sourceMappingURL=escapeNonAscii.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeNonAscii.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/escapeNonAscii.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exec.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/exec.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { execAsync, withCancelableTimeout } from "../../core/exec.js";
3
+ describe("execAsync", () => {
4
+ it("returns stdout/stderr for a successful command", async () => {
5
+ const { stdout, stderr } = await execAsync("printf hello");
6
+ expect(stdout).toBe("hello");
7
+ expect(stderr).toBe("");
8
+ });
9
+ it("rejects when the command fails", async () => {
10
+ await expect(execAsync("exit 7")).rejects.toThrow();
11
+ });
12
+ it("kills the child when the AbortSignal aborts", async () => {
13
+ const ctrl = new AbortController();
14
+ // 5s sleep — must reject within ~600ms once we abort.
15
+ const start = Date.now();
16
+ const p = execAsync("sleep 5", { signal: ctrl.signal });
17
+ setTimeout(() => ctrl.abort(), 50);
18
+ await expect(p).rejects.toThrow();
19
+ const elapsed = Date.now() - start;
20
+ expect(elapsed).toBeLessThan(1500);
21
+ });
22
+ it("rejects synchronously if the signal is already aborted", async () => {
23
+ const ctrl = new AbortController();
24
+ ctrl.abort();
25
+ const start = Date.now();
26
+ await expect(execAsync("sleep 5", { signal: ctrl.signal })).rejects.toThrow();
27
+ expect(Date.now() - start).toBeLessThan(1500);
28
+ });
29
+ });
30
+ describe("withCancelableTimeout", () => {
31
+ it("resolves when the inner promise resolves before the timeout", async () => {
32
+ const result = await withCancelableTimeout(async () => 42, 1000, "test");
33
+ expect(result).toBe(42);
34
+ });
35
+ it("rejects with a labelled timeout error and aborts the signal", async () => {
36
+ let abortedAt = 0;
37
+ const start = Date.now();
38
+ const p = withCancelableTimeout((signal) => new Promise((_, reject) => {
39
+ signal.addEventListener("abort", () => {
40
+ abortedAt = Date.now();
41
+ reject(new Error("inner saw abort"));
42
+ });
43
+ }), 100, "myStrategy");
44
+ await expect(p).rejects.toThrow(/myStrategy timed out after 100ms/);
45
+ expect(abortedAt).toBeGreaterThan(0);
46
+ expect(abortedAt - start).toBeGreaterThanOrEqual(80);
47
+ expect(abortedAt - start).toBeLessThan(500);
48
+ });
49
+ it("does not fire the timeout if the inner rejects first", async () => {
50
+ const ownErr = new Error("inner failure");
51
+ await expect(withCancelableTimeout(async () => { throw ownErr; }, 1000, "test")).rejects.toBe(ownErr);
52
+ });
53
+ });
54
+ //# sourceMappingURL=exec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/exec.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/executor.test.ts"],"names":[],"mappings":""}