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,112 @@
1
+ import { describe, expect, it, jest } from "@jest/globals";
2
+ import { getRefreshStatus } from "../../core/fastRefreshTools.js";
3
+ function makeExecute(result) {
4
+ return jest.fn(async () => result);
5
+ }
6
+ describe("getRefreshStatus", () => {
7
+ it("returns mapped fields on success", async () => {
8
+ const execute = makeExecute({
9
+ success: true,
10
+ result: {
11
+ lastUpdateAt: 1700000000000,
12
+ updateCount: 2,
13
+ recentUpdates: [
14
+ { at: 1700000000000, modulePath: "language-list-item.tsx" },
15
+ { at: 1699999999000, modulePath: "language-list-item.tsx" },
16
+ ],
17
+ _meta: { recorderInstalled: true, via: "performReactRefresh", justInstalled: false },
18
+ },
19
+ });
20
+ const r = await getRefreshStatus({}, execute);
21
+ expect(r.success).toBe(true);
22
+ expect(r.lastUpdateAt).toBe(1700000000000);
23
+ expect(r.updateCount).toBe(2);
24
+ expect(r.recentUpdates).toHaveLength(2);
25
+ expect(r.justInstalled).toBe(false);
26
+ });
27
+ it("surfaces justInstalled:true on the bootstrap call", async () => {
28
+ const execute = makeExecute({
29
+ success: true,
30
+ result: {
31
+ lastUpdateAt: null,
32
+ updateCount: 0,
33
+ recentUpdates: [],
34
+ _meta: { recorderInstalled: true, via: "performReactRefresh", justInstalled: true },
35
+ },
36
+ });
37
+ const r = await getRefreshStatus({}, execute);
38
+ expect(r.success).toBe(true);
39
+ expect(r.justInstalled).toBe(true);
40
+ expect(r.updateCount).toBe(0);
41
+ });
42
+ it("returns failure when recorder install failed (no hook points)", async () => {
43
+ const execute = makeExecute({
44
+ success: true,
45
+ result: {
46
+ lastUpdateAt: null,
47
+ updateCount: 0,
48
+ recentUpdates: [],
49
+ _meta: { recorderInstalled: false, via: null, reason: "no __ReactRefresh and no $RefreshReg$" },
50
+ },
51
+ });
52
+ const r = await getRefreshStatus({}, execute);
53
+ expect(r.success).toBe(false);
54
+ expect(r.error).toContain("no __ReactRefresh");
55
+ });
56
+ it("forwards executor errors verbatim", async () => {
57
+ const execute = makeExecute({
58
+ success: false,
59
+ error: "No apps connected. Run 'scan_metro' first.",
60
+ });
61
+ const r = await getRefreshStatus({}, execute);
62
+ expect(r.success).toBe(false);
63
+ expect(r.error).toContain("No apps connected");
64
+ });
65
+ it("passes sincePath into the expression builder", async () => {
66
+ const execute = makeExecute({
67
+ success: true,
68
+ result: {
69
+ lastUpdateAt: null,
70
+ updateCount: 0,
71
+ recentUpdates: [],
72
+ _meta: { recorderInstalled: true, via: "performReactRefresh" },
73
+ },
74
+ });
75
+ await getRefreshStatus({ sincePath: "language-list-item" }, execute);
76
+ expect(execute.mock.calls[0][0]).toContain("language-list-item");
77
+ });
78
+ it("passes since epoch into the expression builder", async () => {
79
+ const execute = makeExecute({
80
+ success: true,
81
+ result: {
82
+ lastUpdateAt: null,
83
+ updateCount: 0,
84
+ recentUpdates: [],
85
+ _meta: { recorderInstalled: true, via: "performReactRefresh" },
86
+ },
87
+ });
88
+ await getRefreshStatus({ since: 1700000000000 }, execute);
89
+ expect(execute.mock.calls[0][0]).toContain("1700000000000");
90
+ });
91
+ it("propagates the device argument", async () => {
92
+ const execute = makeExecute({
93
+ success: true,
94
+ result: {
95
+ lastUpdateAt: null,
96
+ updateCount: 0,
97
+ recentUpdates: [],
98
+ _meta: { recorderInstalled: true, via: "performReactRefresh" },
99
+ },
100
+ });
101
+ await getRefreshStatus({ device: "iPhone Air" }, execute);
102
+ expect(execute.mock.calls[0][3]).toBe("iPhone Air");
103
+ });
104
+ it("rejects sincePath with double quotes via the builder", async () => {
105
+ const execute = makeExecute({ success: true, result: "{}" });
106
+ const r = await getRefreshStatus({ sincePath: '"; drop"' }, execute);
107
+ expect(r.success).toBe(false);
108
+ expect(r.error).toContain("double quotes");
109
+ expect(execute).not.toHaveBeenCalled();
110
+ });
111
+ });
112
+ //# sourceMappingURL=fastRefreshTools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastRefreshTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fastRefreshTools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fiberMatch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiberMatch.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/fiberMatch.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,114 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { matchFiberCandidates } from "../../core/fiberMatch.js";
3
+ function candidate(overrides = {}) {
4
+ return {
5
+ name: "Pressable",
6
+ meaningfulComponentName: null,
7
+ text: "",
8
+ testID: null,
9
+ ancestorTestIDs: [],
10
+ isInput: false,
11
+ isPressable: true,
12
+ source: "direct",
13
+ ...overrides,
14
+ };
15
+ }
16
+ describe("matchFiberCandidates", () => {
17
+ it("matches pressable by its own testID (regression)", () => {
18
+ const list = [
19
+ candidate({ testID: "other" }),
20
+ candidate({ testID: "submit-btn" }),
21
+ candidate({ testID: null }),
22
+ ];
23
+ const r = matchFiberCandidates(list, { testID: "submit-btn" });
24
+ expect(r).not.toBeNull();
25
+ expect(r.matchIndex).toBe(1);
26
+ expect(r.totalMatches).toBe(1);
27
+ });
28
+ it("matches pressable by ancestor testID when its own testID does not match", () => {
29
+ const list = [
30
+ candidate({ testID: null, ancestorTestIDs: ["walk-detail-delete-button"] }),
31
+ candidate({ testID: "other", ancestorTestIDs: ["unrelated"] }),
32
+ ];
33
+ const r = matchFiberCandidates(list, { testID: "walk-detail-delete-button" });
34
+ expect(r).not.toBeNull();
35
+ expect(r.matchIndex).toBe(0);
36
+ });
37
+ it("matches pressable by its own fiber name (regression)", () => {
38
+ const list = [
39
+ candidate({ name: "Pressable" }),
40
+ candidate({ name: "TouchableOpacity" }),
41
+ ];
42
+ const r = matchFiberCandidates(list, { component: "Touchable" });
43
+ expect(r).not.toBeNull();
44
+ expect(r.matchIndex).toBe(1);
45
+ });
46
+ it("matches pressable by meaningfulComponentName when own name is generic", () => {
47
+ const list = [
48
+ candidate({ name: "Pressable", meaningfulComponentName: "AddDetailsButton" }),
49
+ candidate({ name: "Pressable", meaningfulComponentName: "OtherButton" }),
50
+ ];
51
+ const r = matchFiberCandidates(list, { component: "AddDetailsButton" });
52
+ expect(r).not.toBeNull();
53
+ expect(r.matchIndex).toBe(0);
54
+ });
55
+ it("component matching is case-insensitive substring", () => {
56
+ const list = [candidate({ name: "Pressable", meaningfulComponentName: "PickerTrigger" })];
57
+ const r = matchFiberCandidates(list, { component: "picker" });
58
+ expect(r).not.toBeNull();
59
+ expect(r.matchIndex).toBe(0);
60
+ });
61
+ it("respects index when multiple candidates match", () => {
62
+ const list = [
63
+ candidate({ name: "Pressable", meaningfulComponentName: "RowButton", text: "A" }),
64
+ candidate({ name: "Pressable", meaningfulComponentName: "RowButton", text: "B" }),
65
+ candidate({ name: "Pressable", meaningfulComponentName: "RowButton", text: "C" }),
66
+ ];
67
+ const r = matchFiberCandidates(list, { component: "RowButton", index: 2 });
68
+ expect(r).not.toBeNull();
69
+ expect(r.matchIndex).toBe(2);
70
+ expect(r.totalMatches).toBe(3);
71
+ expect(r.allMatches).toEqual([0, 1, 2]);
72
+ });
73
+ it("returns null when nothing matches", () => {
74
+ const list = [candidate({ testID: "a", name: "Pressable" })];
75
+ const r = matchFiberCandidates(list, { testID: "does-not-exist" });
76
+ expect(r).toBeNull();
77
+ });
78
+ it("returns null when index is out of range", () => {
79
+ const list = [candidate({ testID: "a" })];
80
+ const r = matchFiberCandidates(list, { testID: "a", index: 3 });
81
+ expect(r).toBeNull();
82
+ });
83
+ it("combines text, testID, and component with AND semantics", () => {
84
+ const list = [
85
+ candidate({
86
+ name: "Pressable",
87
+ meaningfulComponentName: "SubmitButton",
88
+ testID: "submit",
89
+ text: "Send it",
90
+ }),
91
+ candidate({
92
+ name: "Pressable",
93
+ meaningfulComponentName: "SubmitButton",
94
+ testID: "submit",
95
+ text: "Cancel",
96
+ }),
97
+ ];
98
+ const r = matchFiberCandidates(list, {
99
+ text: "send",
100
+ testID: "submit",
101
+ component: "SubmitButton",
102
+ });
103
+ expect(r).not.toBeNull();
104
+ expect(r.matchIndex).toBe(0);
105
+ expect(r.totalMatches).toBe(1);
106
+ });
107
+ it("text matching is case-insensitive substring", () => {
108
+ const list = [candidate({ text: "Hello World" })];
109
+ const r = matchFiberCandidates(list, { text: "hello" });
110
+ expect(r).not.toBeNull();
111
+ expect(r.matchIndex).toBe(0);
112
+ });
113
+ });
114
+ //# sourceMappingURL=fiberMatch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiberMatch.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fiberMatch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fingerprint.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/fingerprint.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { jest } from "@jest/globals";
2
+ // Pass-through mocks: spread the real module so any export the deferred setup
3
+ // or transitive deps consume (e.g. child_process.exec) keeps working. Using
4
+ // the `node:` protocol bypasses Jest's mock registry for the inner lookup,
5
+ // since unstable_mockModule below is keyed on the bare specifier.
6
+ const realChildProcess = await import("node:child_process");
7
+ const realFs = await import("node:fs");
8
+ const realOs = await import("node:os");
9
+ const mockExecSync = jest.fn();
10
+ jest.unstable_mockModule("child_process", () => ({
11
+ ...realChildProcess,
12
+ execSync: mockExecSync,
13
+ }));
14
+ const mockReadFileSync = jest.fn();
15
+ const mockExistsSync = jest.fn();
16
+ jest.unstable_mockModule("fs", () => ({
17
+ ...realFs,
18
+ readFileSync: mockReadFileSync,
19
+ existsSync: mockExistsSync,
20
+ }));
21
+ const mockUserInfo = jest.fn();
22
+ const mockCpus = jest.fn();
23
+ const mockPlatform = jest.fn();
24
+ jest.unstable_mockModule("os", () => ({
25
+ ...realOs,
26
+ userInfo: mockUserInfo,
27
+ cpus: mockCpus,
28
+ platform: mockPlatform,
29
+ }));
30
+ const { getDeviceFingerprint, getMachineId } = await import("../../core/fingerprint.js");
31
+ describe("fingerprint", () => {
32
+ beforeEach(() => {
33
+ jest.clearAllMocks();
34
+ mockUserInfo.mockReturnValue({ username: "testuser" });
35
+ mockCpus.mockReturnValue([{ model: "Apple M2 Pro" }]);
36
+ });
37
+ describe("getMachineId", () => {
38
+ it("reads hardware UUID on macOS", () => {
39
+ mockPlatform.mockReturnValue("darwin");
40
+ mockExecSync.mockReturnValue("Hardware UUID: ABC123-DEF456-GHI789\n");
41
+ const id = getMachineId();
42
+ expect(id).toBe("ABC123-DEF456-GHI789");
43
+ expect(mockExecSync).toHaveBeenCalledWith("system_profiler SPHardwareDataType", expect.any(Object));
44
+ });
45
+ it("reads /etc/machine-id on Linux", () => {
46
+ mockPlatform.mockReturnValue("linux");
47
+ mockExistsSync.mockReturnValue(true);
48
+ mockReadFileSync.mockReturnValue("abc123def456\n");
49
+ const id = getMachineId();
50
+ expect(id).toBe("abc123def456");
51
+ });
52
+ it("reads MachineGuid from registry on Windows", () => {
53
+ mockPlatform.mockReturnValue("win32");
54
+ mockExecSync.mockReturnValue(" MachineGuid REG_SZ {12345-ABCDE}\n");
55
+ const id = getMachineId();
56
+ expect(id).toBe("{12345-ABCDE}");
57
+ });
58
+ it("returns empty string on unsupported platform", () => {
59
+ mockPlatform.mockReturnValue("freebsd");
60
+ const id = getMachineId();
61
+ expect(id).toBe("");
62
+ });
63
+ it("returns empty string when command fails", () => {
64
+ mockPlatform.mockReturnValue("darwin");
65
+ mockExecSync.mockImplementation(() => {
66
+ throw new Error("command not found");
67
+ });
68
+ const id = getMachineId();
69
+ expect(id).toBe("");
70
+ });
71
+ });
72
+ describe("getDeviceFingerprint", () => {
73
+ it("returns consistent SHA256 hash", () => {
74
+ mockPlatform.mockReturnValue("darwin");
75
+ mockExecSync.mockReturnValue("Hardware UUID: ABC123\n");
76
+ const fp1 = getDeviceFingerprint();
77
+ const fp2 = getDeviceFingerprint();
78
+ expect(fp1).toBe(fp2);
79
+ expect(fp1).toMatch(/^[a-f0-9]{64}$/);
80
+ });
81
+ it("produces different hashes for different inputs", () => {
82
+ mockPlatform.mockReturnValue("darwin");
83
+ mockExecSync.mockReturnValue("Hardware UUID: ABC123\n");
84
+ const fp1 = getDeviceFingerprint();
85
+ mockUserInfo.mockReturnValue({ username: "otheruser" });
86
+ const fp2 = getDeviceFingerprint();
87
+ expect(fp1).not.toBe(fp2);
88
+ });
89
+ it("still produces a hash when machineId is unavailable (degraded mode)", () => {
90
+ mockPlatform.mockReturnValue("darwin");
91
+ mockExecSync.mockImplementation(() => {
92
+ throw new Error("permission denied");
93
+ });
94
+ const fp = getDeviceFingerprint();
95
+ expect(fp).toMatch(/^[a-f0-9]{64}$/);
96
+ });
97
+ });
98
+ });
99
+ //# sourceMappingURL=fingerprint.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/fingerprint.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=focusedInput.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusedInput.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInput.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import { buildFindFocusedInputExpression, buildClearFocusedInputExpression, buildDismissKeyboardExpression } from "../../core/focusedInput.js";
3
+ describe("buildFindFocusedInputExpression", () => {
4
+ it("includes the React DevTools hook and fiber-root walk", () => {
5
+ const expr = buildFindFocusedInputExpression();
6
+ expect(expr).toContain("__REACT_DEVTOOLS_GLOBAL_HOOK__");
7
+ expect(expr).toContain("getFiberRoots");
8
+ expect(expr).toContain("RCTSinglelineTextInputView");
9
+ expect(expr).toContain("RCTMultilineTextInputView");
10
+ expect(expr).toContain("AndroidTextInput");
11
+ });
12
+ it("handles string-type host fibers (Fabric)", () => {
13
+ const expr = buildFindFocusedInputExpression();
14
+ // The Fabric path requires recognizing host fibers whose `type` is a string,
15
+ // not a class with displayName. The getName helper applies a typeof === "string" check.
16
+ expect(expr).toMatch(/typeof\s+\w+\s*===\s*['"]string['"]/);
17
+ });
18
+ it("climbs .return to find a fiber with onChangeText", () => {
19
+ const expr = buildFindFocusedInputExpression();
20
+ expect(expr).toContain("onChangeText");
21
+ expect(expr).toContain(".return");
22
+ });
23
+ it("returns a parseable expression (IIFE)", () => {
24
+ const expr = buildFindFocusedInputExpression();
25
+ expect(expr.trim()).toMatch(/^\(\(\)\s*=>\s*\{/);
26
+ expect(expr.trim()).toMatch(/\}\)\(\)$/);
27
+ });
28
+ });
29
+ describe("buildClearFocusedInputExpression", () => {
30
+ it("calls onChangeText('') on the controlled fiber", () => {
31
+ const expr = buildClearFocusedInputExpression();
32
+ expect(expr).toContain(`onChangeText("")`);
33
+ });
34
+ it("falls back to publicInstance.clear when no onChangeText ancestor", () => {
35
+ const expr = buildClearFocusedInputExpression();
36
+ expect(expr).toContain("pub.clear()");
37
+ expect(expr).toContain(`via: "publicInstance"`);
38
+ });
39
+ it("returns cleared:true with the via field on success", () => {
40
+ const expr = buildClearFocusedInputExpression();
41
+ expect(expr).toMatch(/cleared:\s*true,\s*via:\s*"onChangeText"/);
42
+ });
43
+ it("returns cleared:false with reason when nothing focused", () => {
44
+ const expr = buildClearFocusedInputExpression();
45
+ expect(expr).toContain(`cleared: false, reason: "no focused TextInput`);
46
+ });
47
+ });
48
+ describe("buildDismissKeyboardExpression", () => {
49
+ it("calls publicInstance.blur()", () => {
50
+ const expr = buildDismissKeyboardExpression();
51
+ expect(expr).toContain("pub.blur()");
52
+ });
53
+ it("returns dismissed:false with reason when nothing focused", () => {
54
+ const expr = buildDismissKeyboardExpression();
55
+ expect(expr).toContain(`dismissed: false, reason: "no focused TextInput`);
56
+ });
57
+ });
58
+ //# sourceMappingURL=focusedInput.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusedInput.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInput.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=focusedInputTools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusedInputTools.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInputTools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, expect, it, jest } from "@jest/globals";
2
+ import { clearFocusedInput, dismissKeyboard, inputTextWithReplace } from "../../core/focusedInputTools.js";
3
+ const okExecute = (result) => jest.fn(async () => ({ success: true, result: JSON.stringify(result) }));
4
+ const errExecute = (error) => jest.fn(async () => ({ success: false, error }));
5
+ describe("clearFocusedInput", () => {
6
+ it("returns success when executor reports cleared via onChangeText", async () => {
7
+ const result = await clearFocusedInput(undefined, okExecute({ cleared: true, via: "onChangeText" }));
8
+ expect(result.success).toBe(true);
9
+ expect(result.via).toBe("onChangeText");
10
+ });
11
+ it("returns success with fallback flag when via=publicInstance", async () => {
12
+ const result = await clearFocusedInput(undefined, okExecute({ cleared: true, via: "publicInstance" }));
13
+ expect(result.success).toBe(true);
14
+ expect(result.via).toBe("publicInstance");
15
+ });
16
+ it("returns failure when no input focused", async () => {
17
+ const result = await clearFocusedInput(undefined, okExecute({ cleared: false, reason: "no focused TextInput" }));
18
+ expect(result.success).toBe(false);
19
+ expect(result.error).toContain("no focused TextInput");
20
+ });
21
+ it("returns failure when executor itself fails", async () => {
22
+ const result = await clearFocusedInput(undefined, errExecute("No apps connected. Run 'scan_metro' first."));
23
+ expect(result.success).toBe(false);
24
+ expect(result.error).toContain("No apps connected");
25
+ });
26
+ it("passes the device argument through to the executor", async () => {
27
+ const exec = jest.fn(async () => ({
28
+ success: true,
29
+ result: JSON.stringify({ cleared: true, via: "onChangeText" })
30
+ }));
31
+ await clearFocusedInput("iPhone 15", exec);
32
+ expect(exec).toHaveBeenCalledWith(expect.any(String), "iPhone 15");
33
+ });
34
+ });
35
+ describe("dismissKeyboard", () => {
36
+ it("returns success with nativeTag on dismiss", async () => {
37
+ const result = await dismissKeyboard(undefined, okExecute({ dismissed: true, nativeTag: 42 }));
38
+ expect(result.success).toBe(true);
39
+ expect(result.nativeTag).toBe(42);
40
+ });
41
+ it("returns failure when nothing focused", async () => {
42
+ const result = await dismissKeyboard(undefined, okExecute({ dismissed: false, reason: "no focused TextInput" }));
43
+ expect(result.success).toBe(false);
44
+ expect(result.error).toContain("no focused TextInput");
45
+ });
46
+ });
47
+ describe("inputTextWithReplace", () => {
48
+ it("calls the clear fn before the type fn when replace=true", async () => {
49
+ const order = [];
50
+ const clearFn = jest.fn(async () => {
51
+ order.push("clear");
52
+ return { success: true, via: "onChangeText" };
53
+ });
54
+ const typeFn = jest.fn(async (_t) => {
55
+ order.push("type");
56
+ return { success: true, result: "ok" };
57
+ });
58
+ const res = await inputTextWithReplace("hello", true, typeFn, clearFn);
59
+ expect(res.success).toBe(true);
60
+ expect(order).toEqual(["clear", "type"]);
61
+ expect(typeFn).toHaveBeenCalledWith("hello");
62
+ });
63
+ it("skips clear when replace=false", async () => {
64
+ const clearFn = jest.fn(async () => ({ success: true }));
65
+ const typeFn = jest.fn(async () => ({ success: true, result: "ok" }));
66
+ await inputTextWithReplace("hello", false, typeFn, clearFn);
67
+ expect(clearFn).not.toHaveBeenCalled();
68
+ expect(typeFn).toHaveBeenCalled();
69
+ });
70
+ it("returns the clear error and does NOT type when clear fails", async () => {
71
+ const clearFn = jest.fn(async () => ({ success: false, error: "no focused TextInput" }));
72
+ const typeFn = jest.fn(async () => ({ success: true, result: "ok" }));
73
+ const res = await inputTextWithReplace("hello", true, typeFn, clearFn);
74
+ expect(res.success).toBe(false);
75
+ expect(res.error).toContain("no focused TextInput");
76
+ expect(typeFn).not.toHaveBeenCalled();
77
+ });
78
+ });
79
+ //# sourceMappingURL=focusedInputTools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focusedInputTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/focusedInputTools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=iconSemantics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconSemantics.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/iconSemantics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, it, expect } from "@jest/globals";
2
+ import { iconSemanticHint, iconLabel } from "../../core/iconSemantics.js";
3
+ import { applyIconHintToLabel } from "../../core/screenState.js";
4
+ describe("iconSemanticHint", () => {
5
+ it("maps chevron/arrow + direction composites", () => {
6
+ expect(iconSemanticHint("SvgChevronBackward")).toBe("possibly back button");
7
+ expect(iconSemanticHint("ChevronLeft")).toBe("possibly back button");
8
+ expect(iconSemanticHint("ArrowRightIcon")).toBe("possibly forward/next button");
9
+ expect(iconSemanticHint("CaretDown")).toBe("possibly expand/open button");
10
+ expect(iconSemanticHint("chevron-up")).toBe("possibly collapse button");
11
+ });
12
+ it("maps standalone icon keywords", () => {
13
+ expect(iconSemanticHint("SvgClose")).toBe("possibly close button");
14
+ expect(iconSemanticHint("CheckboxOutline")).toBe("possibly checkbox");
15
+ expect(iconSemanticHint("RadioOn")).toBe("possibly radio button");
16
+ expect(iconSemanticHint("BackIcon")).toBe("possibly back button");
17
+ expect(iconSemanticHint("IconTrashCan")).toBe("possibly delete button");
18
+ expect(iconSemanticHint("HamburgerMenu")).toBe("possibly menu button");
19
+ expect(iconSemanticHint("SearchOutline")).toBe("possibly search button");
20
+ expect(iconSemanticHint("PlusCircle")).toBe("possibly add button");
21
+ expect(iconSemanticHint("DotsVertical")).toBe("possibly more-options button");
22
+ });
23
+ it("prefers checkbox over check", () => {
24
+ expect(iconSemanticHint("SvgCheckbox")).toBe("possibly checkbox");
25
+ expect(iconSemanticHint("SvgCheckmark")).toBe("possibly confirm/check button");
26
+ });
27
+ it("matches whole words only — no substring false positives", () => {
28
+ expect(iconSemanticHint("FeedbackForm")).toBeNull();
29
+ expect(iconSemanticHint("BackgroundView")).toBeNull();
30
+ expect(iconSemanticHint("Checkout")).toBeNull();
31
+ expect(iconSemanticHint("StarterKit")).toBeNull();
32
+ });
33
+ it("returns null for non-icon names and empty input", () => {
34
+ expect(iconSemanticHint("FloatingHeader")).toBeNull();
35
+ expect(iconSemanticHint("SneakerCard")).toBeNull();
36
+ expect(iconSemanticHint(null)).toBeNull();
37
+ expect(iconSemanticHint(undefined)).toBeNull();
38
+ expect(iconSemanticHint("")).toBeNull();
39
+ });
40
+ });
41
+ describe("iconLabel", () => {
42
+ it("combines the icon component name with the hint", () => {
43
+ expect(iconLabel("FloatingHeader", "SvgChevronBackward")).toBe("SvgChevronBackward — possibly back button");
44
+ });
45
+ it("falls back to the component name when no icon child is known", () => {
46
+ expect(iconLabel("CloseIcon", null)).toBe("CloseIcon — possibly close button");
47
+ });
48
+ it("returns null when neither name carries icon semantics", () => {
49
+ expect(iconLabel("FloatingHeader", null)).toBeNull();
50
+ expect(iconLabel("FloatingHeader", "FancyDecoration")).toBeNull();
51
+ });
52
+ });
53
+ describe("applyIconHintToLabel", () => {
54
+ function pressable(overrides = {}) {
55
+ return {
56
+ label: "[FloatingHeader]",
57
+ center: { x: 40, y: 100 },
58
+ bounds: { x: 16, y: 76, width: 48, height: 48 },
59
+ testID: null,
60
+ ...overrides,
61
+ };
62
+ }
63
+ it("rewrites a fallback label using the icon hint", () => {
64
+ const p = applyIconHintToLabel(pressable({ icon: "SvgChevronBackward" }));
65
+ expect(p.label).toBe("[SvgChevronBackward — possibly back button]");
66
+ });
67
+ it("keeps the existing label when the icon name has no semantics", () => {
68
+ const p = applyIconHintToLabel(pressable({ icon: "FancyDecoration" }));
69
+ expect(p.label).toBe("[FloatingHeader]");
70
+ });
71
+ it("uses the icon name when there is no label at all", () => {
72
+ const p = applyIconHintToLabel(pressable({ label: null, icon: "FancyDecoration" }));
73
+ expect(p.label).toBe("[FancyDecoration]");
74
+ });
75
+ it("never touches text/a11y labels (icon is null for those)", () => {
76
+ const p = applyIconHintToLabel(pressable({ label: "Submit", icon: null }));
77
+ expect(p.label).toBe("Submit");
78
+ });
79
+ });
80
+ //# sourceMappingURL=iconSemantics.test.js.map