stim 1.20.2 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +141 -8
  2. package/dist/acquire-artifact-Co2k4f7O.mjs +171 -0
  3. package/dist/act-DsuqEkiM.mjs +2801 -0
  4. package/dist/activity-CMLmzp7o.mjs +1397 -0
  5. package/dist/{agent-device-usage-output-Dzgv6lgR.mjs → agent-device-usage-output-DUFaTMdd.mjs} +23 -67
  6. package/dist/{android-DCKZrNvV.mjs → android-ByRMUoiJ.mjs} +157 -93
  7. package/dist/{android-Mz_Inn3w.mjs → android-C7sVmyI9.mjs} +299 -116
  8. package/dist/{android-Dlzxshgp.mjs → android-DGkNqa_c.mjs} +5 -5
  9. package/dist/{android-HqP1_vB_.mjs → android-DR5lZ2Az.mjs} +2 -2
  10. package/dist/android-cas-compiler.mjs +2 -2
  11. package/dist/{android-cas-Bl-cLJBk.mjs → android-cas-ngferVq2.mjs} +7 -6
  12. package/dist/android-project-BCAAmMwz.mjs +12 -0
  13. package/dist/android-project-DVWyCbWU.d.mts +391 -0
  14. package/dist/api.d.mts +810 -64
  15. package/dist/api.mjs +782 -1
  16. package/dist/{artifact-HSwkIWEQ.mjs → artifact-8EY8SAPw.mjs} +240 -213
  17. package/dist/{artifact-D3czlUvT.mjs → artifact-DJPy518Y.mjs} +203 -164
  18. package/dist/artifact-platform-CXcmX_j3.mjs +27 -0
  19. package/dist/{browser-web-CA-F1GQo.mjs → browser-web-Bcv99PBM.mjs} +194 -64
  20. package/dist/budget-Cvwn54qV.mjs +9285 -0
  21. package/dist/{build-DYDbfkk5.mjs → build-CabC3G23.mjs} +153 -98
  22. package/dist/build-cache-Dv7RN200.mjs +602 -0
  23. package/dist/build-plan-DUC8Ka9y.mjs +248 -0
  24. package/dist/{cache-manifest-XH-fvDUj.mjs → cache-manifest-DSeQjt-Q.mjs} +2 -2
  25. package/dist/cache-manifest.mjs +1 -1
  26. package/dist/{ccache-zdKiYQ3E.mjs → ccache-Btwc36-I.mjs} +10 -9
  27. package/dist/{cdp-Dq_ypAlJ.mjs → cdp-3fwICjzi.mjs} +18 -5
  28. package/dist/{chrome-BnzZMqsR.mjs → chrome-Bbw689-6.mjs} +7 -4
  29. package/dist/{cli-CLP3diBm.mjs → cli-CHZa9Lvk.mjs} +20 -20
  30. package/dist/cli.mjs +1 -1
  31. package/dist/client-OyRoEuSr.mjs +1577 -0
  32. package/dist/collector-run.d.mts +4 -40
  33. package/dist/collector-run.mjs +9 -8
  34. package/dist/{command-output-BTy8hZ0F.mjs → command-output-gwpm28fu.mjs} +1 -1
  35. package/dist/config-DlrsduwG.mjs +955 -0
  36. package/dist/{created-devices-Dzd5C2LF.mjs → created-devices-x9rN6bhs.mjs} +14 -4
  37. package/dist/{dependency-state-DG0p31-y.mjs → dependency-state-1I9KZT1Y.mjs} +20 -5
  38. package/dist/{detached-entry-B9C_zeQC.mjs → detached-entry-BwNEtIrP.mjs} +1 -1
  39. package/dist/{dev-client-DAWVIGBu.mjs → dev-client-BSDR5h3F.mjs} +2 -2
  40. package/dist/{device-BECOiufl.mjs → device-B-L3Fbxy.mjs} +91 -34
  41. package/dist/device-DklWZLqb.mjs +1068 -0
  42. package/dist/{device-capacity-CBUAcRyQ.mjs → device-capacity-DK5_EwRS.mjs} +42 -13
  43. package/dist/device-host-worker.mjs +76 -79
  44. package/dist/{device-ios-COSi6oS1.mjs → device-ios-DoB6KFCO.mjs} +77 -51
  45. package/dist/{device-lease-run-Cw2M4z51.mjs → device-lease-run-xJPQ_QQG.mjs} +14 -26
  46. package/dist/{device-pool-Bf-pOhSw.mjs → device-pool-BMkdsefq.mjs} +5 -5
  47. package/dist/{doctor-kfMBnUw6.mjs → doctor-Bo7BXLux.mjs} +271 -320
  48. package/dist/{doctor-CB8oZKCk.mjs → doctor-D5_EzwfA.mjs} +186 -91
  49. package/dist/doctor-fingerprint-DZLoYFVb.mjs +16 -0
  50. package/dist/doctor-fingerprint.mjs +19 -0
  51. package/dist/doctor-thjWAV0z.mjs +2 -0
  52. package/dist/{doctor-watchman-BRyV2adA.mjs → doctor-watchman-N2wDotwQ.mjs} +40 -21
  53. package/dist/{eas-build-JyfqyHfC.mjs → eas-build-CwknaQYj.mjs} +53 -20
  54. package/dist/{build-plan-B7SZsc2N.mjs → eas-fallback-CSgAulr5.mjs} +41 -214
  55. package/dist/{watchman-CPQFZLXY.mjs → eas-session-ledger-DlY_serQ.mjs} +230 -11
  56. package/dist/{error-diagnostics-BR677IDM.mjs → error-diagnostics-DBWO2rxE.mjs} +172 -82
  57. package/dist/exec-DEoAhcze.mjs +858 -0
  58. package/dist/exec-DnYc4HGH.d.mts +78 -0
  59. package/dist/{gc-qWOMdnER.mjs → gc-CXxN-4SE.mjs} +1091 -1029
  60. package/dist/gc-DnNDQyaP.mjs +3 -0
  61. package/dist/{guide-G9cAbVAc.mjs → guide-Br0LEfKy.mjs} +1165 -297
  62. package/dist/{hosted-android-C3MHGld1.mjs → hosted-android-B-9f-jkd.mjs} +10 -8
  63. package/dist/{hosted-client-ZEKpS9vw.mjs → hosted-client-DZAPrcro.mjs} +34 -19
  64. package/dist/{hosted-ios-l-o3iM9J.mjs → hosted-ios-CsCS21hn.mjs} +1 -1
  65. package/dist/{hosted-logs-EzQM7-3Z.mjs → hosted-logs-FIRx9X2f.mjs} +77 -43
  66. package/dist/{hosted-macos-BACVAVqE.mjs → hosted-macos-_awYSpfv.mjs} +35 -22
  67. package/dist/{hosted-native-A4s1QPXe.mjs → hosted-native-BdzE668-.mjs} +49 -27
  68. package/dist/idle-C4cZ757K.d.mts +24 -0
  69. package/dist/{idle-shutdown-DtxhPTKe.mjs → idle-shutdown-DDg3SdvY.mjs} +11 -10
  70. package/dist/ios-CDvlmUs7.d.mts +24 -0
  71. package/dist/{ios-BwVCF7oA.mjs → ios-Ds1clbIt.mjs} +8 -8
  72. package/dist/{ios-device-D7pi2Sca.mjs → ios-device--h_-8ENa.mjs} +51 -26
  73. package/dist/{ios-device-B5veSDDQ.mjs → ios-device-BXZ0c7Kb.mjs} +1 -1
  74. package/dist/{ios-RkW4pnQf.mjs → ios-hcBpnEGk.mjs} +200 -93
  75. package/dist/{ios-Ce7bc7br.mjs → ios-pm4nL6By.mjs} +160 -108
  76. package/dist/{ios-project-K9hY_Jab.mjs → ios-project-CZhKODF3.mjs} +13 -13
  77. package/dist/ios-signing-BtAffm0A.mjs +489 -0
  78. package/dist/{ios-state-CBLe1xYw.mjs → ios-state-Dtw5K2aI.mjs} +1 -1
  79. package/dist/{ios-nOLJGVdy.mjs → ios-xtlRHaeB.mjs} +1 -1
  80. package/dist/{js-swap-Bb3nsS07.mjs → js-swap-Bwhh4S7V.mjs} +30 -25
  81. package/dist/{launch-C3qJ6Agb.mjs → launch-BjxemNpK.mjs} +85 -543
  82. package/dist/{launch-F4sOqAhB.mjs → launch-CCzXlc8r.mjs} +91 -90
  83. package/dist/logs-BfwwadsZ.mjs +479 -0
  84. package/dist/logs-jTS_lHSo.mjs +248 -0
  85. package/dist/{macos-D7uDvO-z.mjs → macos-DVlSSyUg.mjs} +1 -1
  86. package/dist/macos-NfV2D7dO.mjs +694 -0
  87. package/dist/macos-run.mjs +1 -1
  88. package/dist/maintenance-run.mjs +123 -248
  89. package/dist/{metro-DnCEjCxs.mjs → metro-DiXtA3Ty.mjs} +107 -30
  90. package/dist/metro-gateway-CKZqKqx7.mjs +209 -0
  91. package/dist/{named-ports-4WopRPg-.mjs → named-ports-DkEzOfzO.mjs} +42 -90
  92. package/dist/native-android-CqgnOgsT.mjs +645 -0
  93. package/dist/native-gradle-artifact-inputs-DHFnmrVf.mjs +270 -0
  94. package/dist/native-gradle-inputs-Dnh84Zbd.mjs +211 -0
  95. package/dist/native-inputs-TRTTTRxt.mjs +91 -0
  96. package/dist/native-run-NwUuxbkg.mjs +276 -0
  97. package/dist/{native-runtime-k8dTIrbK.mjs → native-runtime-B7KIafpM.mjs} +11 -9
  98. package/dist/native-source-Y0yLhFyQ.mjs +133 -0
  99. package/dist/{native-xcode-inputs-CykopJdM.mjs → native-xcode-inputs-D_VOfFL7.mjs} +26 -18
  100. package/dist/{native-xcode-ios-Bbf30Gm0.mjs → native-xcode-ios-BYDOHWLN.mjs} +104 -60
  101. package/dist/{ndjson-GOnbyvso.mjs → ndjson-CgE_o3Dl.mjs} +3 -3
  102. package/dist/offload-worker.d.mts +59 -41
  103. package/dist/offload-worker.mjs +478 -115
  104. package/dist/operation-exec-BW0em61G.mjs +171 -0
  105. package/dist/{ownership-DCtw_2IA.mjs → ownership-C5fo5Edb.mjs} +3 -3
  106. package/dist/{page-DRHy329N.mjs → page-DBL2PiUU.mjs} +12 -5
  107. package/dist/paths-BsJMoPP2.mjs +12 -0
  108. package/dist/paths-DQtTgsBf.mjs +42 -0
  109. package/dist/{placement-log-MOfPVgaM.mjs → placement-log-BnGgJRRZ.mjs} +5 -5
  110. package/dist/{plan-placement-V0TdzYXp.mjs → plan-placement-DIsMtN-d.mjs} +15 -11
  111. package/dist/{ports-DdSUicVo.mjs → ports-Cy1RkmuQ.mjs} +3 -3
  112. package/dist/prebuild-D4JoEAEs.mjs +484 -0
  113. package/dist/{project-_phNIJfs.mjs → project-wM_XFTvE.mjs} +65 -37
  114. package/dist/{pull-request-CQ8sPbZa.mjs → pull-request-W1IuLXDt.mjs} +102 -20
  115. package/dist/pull-request-eODyIqZF.d.mts +124 -0
  116. package/dist/pull-requests.d.mts +2 -120
  117. package/dist/pull-requests.mjs +2 -2
  118. package/dist/{react-native-android-CM1XRDwv.mjs → react-native-android-6OZ7MSM7.mjs} +121 -72
  119. package/dist/{gradle-DSrXb6lG.mjs → react-native-build-Dvd8hC21.mjs} +292 -15
  120. package/dist/react-native-doctor-DsoSF1Y9.mjs +234 -0
  121. package/dist/{react-native-ios-Dhq_eiYQ.mjs → react-native-ios-4u1Rn-GR.mjs} +71 -39
  122. package/dist/{recordings-D0d5aQt0.mjs → recordings-CQmfzAh7.mjs} +12 -9
  123. package/dist/registration-BcRgF6Ox.mjs +51 -0
  124. package/dist/{reload-C8JhxjSh.mjs → reload-BzkYabB-.mjs} +94 -47
  125. package/dist/reload-D7AVlb8N.mjs +2 -0
  126. package/dist/{remote-BiR6aYjy.mjs → remote-DjGDmlTZ.mjs} +26 -18
  127. package/dist/result-D2Ykz_iD.mjs +435 -0
  128. package/dist/{run-BtPgpKks.mjs → run-DidHghD1.mjs} +5 -5
  129. package/dist/selection-DSMbWEX2.mjs +620 -0
  130. package/dist/{server-bare-R2m_gsH8.mjs → server-bare-CafzuyFB.mjs} +3 -4
  131. package/dist/{server-command-CTtCkmcQ.mjs → server-command-C6QjeupS.mjs} +14 -7
  132. package/dist/{server-expo-DsguMGUF.mjs → server-expo-CrjB29pq.mjs} +54 -11
  133. package/dist/server-expo-D58c9L0M.mjs +2 -0
  134. package/dist/{settings-B717odTD.mjs → settings-C7O8A6ZI.mjs} +309 -119
  135. package/dist/settings-DpR-1Wnn.mjs +114 -0
  136. package/dist/settings-write-CzD60rOD.mjs +360 -0
  137. package/dist/settings.schema.json +176 -16
  138. package/dist/{simslim-CCr3rE-A.mjs → simslim-BNckWpXi.mjs} +14 -12
  139. package/dist/{slot-launch-DPt0m9Nd.mjs → slot-launch-CbfmNgM6.mjs} +15 -20
  140. package/dist/{spawn-entry-Dcb7sDUz.mjs → spawn-entry-jw19m8Nl.mjs} +0 -1
  141. package/dist/stage-Bps5oius.mjs +200 -0
  142. package/dist/{start-TXeMmmO2.mjs → start-Br-oxqMD.mjs} +1 -1
  143. package/dist/start-EojN4WFz.mjs +1364 -0
  144. package/dist/{state-D1Icyjlu.mjs → state--smjFSTL.mjs} +55 -13
  145. package/dist/{state-CG_OFoaA.mjs → state-08I3hw3_.mjs} +3 -2
  146. package/dist/{stats-BoY5sEPU.mjs → stats-D3GerlFW.mjs} +7 -13
  147. package/dist/stats-report-BzaPrRm6.mjs +16 -0
  148. package/dist/{status-BTA7kKiQ.mjs → status-BRROykC8.mjs} +7 -5
  149. package/dist/status-EvrK72L2.mjs +2 -0
  150. package/dist/{status-WgFbkRzj.mjs → status-WBDajew2.mjs} +554 -452
  151. package/dist/{status-watch-C23ILtf9.mjs → status-watch-Bg_u-pwR.mjs} +222 -25
  152. package/dist/status-worker.d.mts +1 -0
  153. package/dist/status-worker.mjs +19 -0
  154. package/dist/stim-desktop-D5OGpYZM.mjs +112 -0
  155. package/dist/{stop-DR6VoDIk.mjs → stop-DTZ9uTw3.mjs} +2 -2
  156. package/dist/{stop-DPEhunlw.mjs → stop-Dky10AEJ.mjs} +33 -23
  157. package/dist/{stop-BNmBMi1F.mjs → stop-Mv6W9FAk.mjs} +137 -98
  158. package/dist/supervisor-run.d.mts +8 -17
  159. package/dist/supervisor-run.mjs +56 -28
  160. package/dist/{support-CwjbFs9H.mjs → support-CNioewsd.mjs} +14 -14
  161. package/dist/{support-DMTqj3Hm.mjs → support-yUiOjnVY.mjs} +20 -13
  162. package/dist/swiftpm-artifact-inputs-DFcGsXDP.mjs +153 -0
  163. package/dist/swiftpm-macos-BIak-Rxv.mjs +532 -0
  164. package/dist/toolchain-BY8X8HXx.mjs +2 -0
  165. package/dist/toolchain-DpJMHq0n.mjs +876 -0
  166. package/dist/{trigger-CigAYjeL.mjs → trigger-Cbyc41d_.mjs} +21 -6
  167. package/dist/trigger-yb_nFzPF.mjs +2 -0
  168. package/dist/{warm-progress-BuY-Fvfn.mjs → warm-progress-CA3TgT3-.mjs} +263 -156
  169. package/dist/web-CZ07gd77.mjs +2 -0
  170. package/dist/{web-BDBMxDpx.mjs → web-DKx6yoFA.mjs} +20 -14
  171. package/dist/web-run.mjs +13 -12
  172. package/dist/windows-report.d.mts +1 -0
  173. package/dist/windows-report.mjs +18 -0
  174. package/dist/windows-report.ps1 +43 -0
  175. package/dist/{workspace-state-DJt_MMvf.mjs → workspace-state-U08dEzhG.mjs} +62 -58
  176. package/dist/{workspaces-C36s2jb9.mjs → workspaces-CpANmBlq.mjs} +1723 -1286
  177. package/dist/{worktree-CgvJYJ-Q.mjs → worktree-CHecZ4Oq.mjs} +1097 -547
  178. package/dist/worktree-ZqZVjD9K.mjs +2 -0
  179. package/dist/xcode-BXn9-xYx.mjs +896 -0
  180. package/package.json +7 -5
  181. package/shim/android-audio/Main.java +24 -0
  182. package/shim/android-audio/README.md +17 -0
  183. package/shim/android-audio.jar +0 -0
  184. package/shim/android-optimizations.gradle +7 -5
  185. package/dist/activity-BSV745Kz.mjs +0 -629
  186. package/dist/api-qvOzWyfO.mjs +0 -154
  187. package/dist/api-run.mjs +0 -294
  188. package/dist/app-install-BIKtMfPq.mjs +0 -896
  189. package/dist/artifact-lifecycle-DzPpBYvK.mjs +0 -30
  190. package/dist/budget-f7516Zk0.mjs +0 -4106
  191. package/dist/build-facts-DcLv2HSd.d.mts +0 -111
  192. package/dist/cancellation-C_22VQTH.mjs +0 -24
  193. package/dist/client-qQAaXSUs.mjs +0 -1771
  194. package/dist/config-BYDxlMY3.mjs +0 -562
  195. package/dist/device-DuiPJQSn.mjs +0 -290
  196. package/dist/device-lease-BX1sJQ2E.mjs +0 -1224
  197. package/dist/device-remote-xRT0Vmo9.mjs +0 -1272
  198. package/dist/eas-session-ledger-Cm0Gwq2F.mjs +0 -207
  199. package/dist/exec-DqKo9GKJ.mjs +0 -268
  200. package/dist/git-DDfFzkMm.mjs +0 -45
  201. package/dist/launch-verify-B6Q8hZP-.mjs +0 -428
  202. package/dist/logs-BGrEUaEs.mjs +0 -383
  203. package/dist/macos-Ch5VJmcS.mjs +0 -584
  204. package/dist/metro-gateway-CX9Xlkq2.mjs +0 -103
  205. package/dist/miss-reason-mKzZ4VvN.mjs +0 -238
  206. package/dist/native-android-D5qc3-_v.mjs +0 -226
  207. package/dist/native-gradle-inputs-BsLRrl7u.mjs +0 -349
  208. package/dist/ndjson-Du3j0AQ9.d.mts +0 -17
  209. package/dist/plan-C4TjdPsR.mjs +0 -260
  210. package/dist/prebuild-DYbucPXy.mjs +0 -212
  211. package/dist/preview-78a9kR_-.mjs +0 -1011
  212. package/dist/react-native-build-CtCccJtb.mjs +0 -239
  213. package/dist/react-native-doctor-CfRnFfjs.mjs +0 -78
  214. package/dist/remote-cache-OyOyVIS3.mjs +0 -526
  215. package/dist/result-CaJg5Iat.mjs +0 -186
  216. package/dist/server-expo-Bigriskl.mjs +0 -2
  217. package/dist/settings-BORNaaCO.mjs +0 -402
  218. package/dist/settings-vk3mJGSm.d.mts +0 -13
  219. package/dist/spawn-claims-DVS5RkMS.mjs +0 -72
  220. package/dist/stage-KNTQopqv.mjs +0 -157
  221. package/dist/start-BWqzODpb.mjs +0 -1116
  222. package/dist/stim-desktop-BzBN2Em2.mjs +0 -63
  223. package/dist/swiftpm-macos-DRNVJWlb.mjs +0 -119
  224. package/dist/tailnet-Dh-qiYzG.mjs +0 -265
  225. package/dist/toolchain-BFkAcstd.mjs +0 -2
  226. package/dist/toolchain-DxSsNssu.mjs +0 -1657
  227. package/dist/trigger-9_USgmxz.mjs +0 -2
  228. package/dist/web-Dq-i3wzJ.mjs +0 -2
  229. package/dist/worktree-DpLdCHga.mjs +0 -2
  230. package/dist/{api-run.d.mts → doctor-fingerprint.d.mts} +0 -0
  231. package/dist/{errors-DzkMYh8Q.mjs → errors-ccaPc4ox.mjs} +2 -2
@@ -1,896 +0,0 @@
1
- import { r as debugLog, t as getExecutor } from "./exec-DqKo9GKJ.mjs";
2
- import { R as deviceHoldsApk, g as listUserApps, k as uninstallIosApp, u as iosSimulatorFailureAdvice, z as deviceHoldsBundle } from "./ios-RkW4pnQf.mjs";
3
- import { t as DEV_MENU_LAUNCH_ARGS } from "./ios-device-B5veSDDQ.mjs";
4
- import { join } from "node:path";
5
- //#region src/engine/app-schemes.ts
6
- function schemesFromInfoPlist(plist) {
7
- const types = plist?.CFBundleURLTypes;
8
- if (!Array.isArray(types)) return [];
9
- const out = [];
10
- for (const type of types) {
11
- const schemes = type?.CFBundleURLSchemes;
12
- if (Array.isArray(schemes)) out.push(...schemes.filter((s) => typeof s === "string" && s.trim() !== ""));
13
- }
14
- return out;
15
- }
16
- function readBundleSchemes(appPath, { exec = null } = {}) {
17
- if (typeof appPath !== "string" || appPath.trim() === "") return [];
18
- const e = exec || getExecutor();
19
- let out;
20
- try {
21
- out = e.runFile("plutil", [
22
- "-convert",
23
- "json",
24
- "-o",
25
- "-",
26
- join(appPath, "Info.plist")
27
- ], { timeoutMs: 1e4 });
28
- } catch {
29
- return [];
30
- }
31
- try {
32
- return schemesFromInfoPlist(JSON.parse(String(out)));
33
- } catch {
34
- return [];
35
- }
36
- }
37
- const THIRD_PARTY_SCHEME = /^(?:fb\d+|com\.googleusercontent\.apps\.|msauth\.|msauthv2|twitterkit-|db-[a-z0-9]+$|spotify|snapchat|com\.facebook)/i;
38
- function approvableSchemes(schemes) {
39
- return (Array.isArray(schemes) ? schemes : []).filter((s) => typeof s === "string" && s.trim() !== "").map((s) => s.trim()).filter((s) => !/^(?:https?|mailto|tel|sms|itms(?:-apps)?)$/i.test(s) && !THIRD_PARTY_SCHEME.test(s));
40
- }
41
- function pickDevClientScheme(schemes) {
42
- const all = approvableSchemes(schemes);
43
- const expo = all.filter((s) => s.startsWith("exp+"));
44
- return (expo.length ? expo : all).toSorted((a, b) => b.length - a.length)[0] ?? null;
45
- }
46
- //#endregion
47
- //#region src/engine/app-install.ts
48
- const INSTALL_ERROR = "STIM_INSTALL_FAILED";
49
- const LAUNCH_ERROR = "STIM_LAUNCH_FAILED";
50
- const DEFAULT_METRO_PORT = 8081;
51
- const IOS_SCHEME_APPROVAL_DOMAIN = "com.apple.launchservices.schemeapproval";
52
- const IOS_SCHEME_APPROVAL_OPENER = "com.apple.CoreSimulator.CoreSimulatorBridge";
53
- const IOS_DEV_MENU_OFF_KEYS = ["EXDevMenuShowsAtLaunch", "EXDevMenuShowFloatingActionButton"];
54
- const DEV_CLIENT_ONBOARDING_QUERY = "disableOnboarding=1";
55
- const DEV_CLIENT_DISABLE_FAB_QUERY = "disableFab=1";
56
- const DEV_CLIENT_DEV_MENU_OFF_QUERY = "disableFab=1&disableAutoLaunch=1";
57
- const DEV_CLIENT_RESERVED_DEV_MENU_OFF_QUERY = "__expo_disable_fab=1&__expo_disable_auto_launch=1";
58
- const ANDROID_DISABLE_AUTO_LAUNCH_EXTRA = "EXDevMenuDisableAutoLaunch";
59
- const IOS_DEV_MENU_OFF_DEFAULTS_PLIST = [
60
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
61
- "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">",
62
- "<plist version=\"1.0\">",
63
- "<dict>",
64
- ...IOS_DEV_MENU_OFF_KEYS.flatMap((key) => [` <key>${key}</key>`, " <false/>"]),
65
- "</dict>",
66
- "</plist>",
67
- ""
68
- ].join("\n");
69
- function writeIosDevMenuOffDefaults(udid, bundleId, exec) {
70
- for (const key of IOS_DEV_MENU_OFF_KEYS) exec.runFile("xcrun", [
71
- "simctl",
72
- "spawn",
73
- udid,
74
- "defaults",
75
- "write",
76
- bundleId,
77
- key,
78
- "-bool",
79
- "false"
80
- ], { timeoutMs: 6e4 });
81
- }
82
- function describeIosSimulatorFailure(error, exec) {
83
- const detail = describe(error);
84
- return error?.code === "ETIMEDOUT" ? `${detail}. ${iosSimulatorFailureAdvice(exec)}` : detail;
85
- }
86
- function installIosApp({ udid, appPath, bundleId = null, devClientScheme = null, schemeApprovals = [], proveInstalled = true }, { exec = null, now = null } = {}) {
87
- const e = exec || getExecutor();
88
- const artifactStartedAt = now?.();
89
- const skipped = bundleId && proveInstalled ? deviceHoldsBundle({
90
- udid,
91
- bundleId,
92
- appPath
93
- }, { exec: e }) : false;
94
- if (!skipped) try {
95
- e.runFile("xcrun", [
96
- "simctl",
97
- "install",
98
- udid,
99
- appPath
100
- ], {
101
- timeoutMs: 3e5,
102
- killSignal: "SIGKILL"
103
- });
104
- } catch (err) {
105
- return {
106
- failed: true,
107
- code: INSTALL_ERROR,
108
- reason: `simctl install failed for ${appPath}: ${describeIosSimulatorFailure(err, e)}`
109
- };
110
- }
111
- const artifactFinishedAt = now?.();
112
- const artifactDurationMs = artifactStartedAt !== void 0 && artifactFinishedAt !== void 0 ? artifactFinishedAt - artifactStartedAt : void 0;
113
- const devMenuKeys = bundleId && devClientScheme && !skipped ? IOS_DEV_MENU_OFF_KEYS : [];
114
- const missingApprovals = (bundleId ? iosSchemeApprovalKeys(bundleId, [...approvableSchemes(readBundleSchemes(appPath, { exec: e })), ...devClientScheme ? [devClientScheme] : []]) : []).filter((key) => !schemeApprovals.includes(`${key}=${bundleId}`));
115
- const preparing = bundleId && (devMenuKeys.length > 0 || missingApprovals.length > 0);
116
- const preparationStartedAt = preparing ? artifactFinishedAt : void 0;
117
- if (bundleId && preparing) try {
118
- if (devMenuKeys.length > 0) writeIosDevMenuOffDefaults(udid, bundleId, e);
119
- for (const key of missingApprovals) e.runFile("xcrun", [
120
- "simctl",
121
- "spawn",
122
- udid,
123
- "defaults",
124
- "write",
125
- IOS_SCHEME_APPROVAL_DOMAIN,
126
- key,
127
- "-string",
128
- bundleId
129
- ], { timeoutMs: 6e4 });
130
- } catch (err) {
131
- return {
132
- failed: true,
133
- code: INSTALL_ERROR,
134
- reason: `Installed ${bundleId}, but could not prepare the dev client: ${describeIosSimulatorFailure(err, e)}`
135
- };
136
- }
137
- const devClientPreparationDurationMs = now && preparationStartedAt !== void 0 ? now() - preparationStartedAt : void 0;
138
- const timing = {
139
- ...artifactDurationMs === void 0 ? {} : { artifactDurationMs },
140
- ...devClientPreparationDurationMs === void 0 ? {} : { devClientPreparationDurationMs },
141
- ...missingApprovals.length > 0 ? { schemeApprovals: [...schemeApprovals, ...missingApprovals.map((key) => `${key}=${bundleId}`)] } : {}
142
- };
143
- return skipped ? {
144
- ok: true,
145
- appPath,
146
- skipped: true,
147
- ...timing
148
- } : {
149
- ok: true,
150
- appPath,
151
- ...timing
152
- };
153
- }
154
- function clearOtherUserApps({ udid, keep }, { list = listUserApps, uninstall = uninstallIosApp } = {}) {
155
- const removed = [];
156
- const failed = [];
157
- let installed;
158
- try {
159
- installed = list(udid);
160
- } catch {
161
- return {
162
- listed: false,
163
- kept: false,
164
- removed,
165
- failed
166
- };
167
- }
168
- for (const bundleId of installed) {
169
- if (bundleId === keep) continue;
170
- try {
171
- uninstall(udid, bundleId);
172
- removed.push(bundleId);
173
- } catch {
174
- failed.push(bundleId);
175
- }
176
- }
177
- return {
178
- listed: true,
179
- kept: keep ? installed.includes(keep) : false,
180
- removed,
181
- failed
182
- };
183
- }
184
- function jsLocationValue(metroPort) {
185
- return `localhost:${metroPort}`;
186
- }
187
- function devClientDeepLink(scheme, projectOrigin, { devMenuParams = false } = {}) {
188
- const projectQuery = devMenuParams ? `${DEV_CLIENT_ONBOARDING_QUERY}&${DEV_CLIENT_DEV_MENU_OFF_QUERY}&${DEV_CLIENT_RESERVED_DEV_MENU_OFF_QUERY}` : DEV_CLIENT_ONBOARDING_QUERY;
189
- const projectUrl = `${projectOrigin.replace(/\/+$/, "")}/?${projectQuery}`;
190
- return `${scheme}://expo-development-client/?url=${encodeURIComponent(projectUrl)}&${devMenuParams ? DEV_CLIENT_DEV_MENU_OFF_QUERY : DEV_CLIENT_DISABLE_FAB_QUERY}`;
191
- }
192
- function devClientUrl(scheme, metroPort, host = "localhost", options = {}) {
193
- return devClientDeepLink(scheme, `http://${host}:${metroPort}`, options);
194
- }
195
- function iosSchemeApprovalKeys(bundleId, schemes) {
196
- return [.../* @__PURE__ */ new Set([bundleId, ...schemes])].map((target) => `${IOS_SCHEME_APPROVAL_OPENER}-->${target}`);
197
- }
198
- function restartedAppNote(restartedPid, lead = " ") {
199
- return restartedPid ? `${lead}restarted running app (was pid ${restartedPid})` : "";
200
- }
201
- function parseLaunchedPid(text) {
202
- if (typeof text !== "string") return null;
203
- const match = text.trim().match(/:\s*(\d+)\s*$/);
204
- if (!match) return null;
205
- const pid = Number(match[1]);
206
- return Number.isInteger(pid) && pid > 0 ? pid : null;
207
- }
208
- function appProcessFromPid(pid) {
209
- return pid === null ? { state: "stopped" } : {
210
- state: "running",
211
- pid
212
- };
213
- }
214
- function iosAppProcess(udid, bundleId, { exec = null } = {}) {
215
- const e = exec || getExecutor();
216
- const started = performance.now();
217
- let probe = { state: "unknown" };
218
- let failure = {};
219
- try {
220
- const out = e.runFile("xcrun", [
221
- "simctl",
222
- "spawn",
223
- udid,
224
- "launchctl",
225
- "list"
226
- ], { timeoutMs: 2e3 });
227
- const label = `UIKitApplication:${bundleId}[`;
228
- probe = { state: "stopped" };
229
- for (const line of out.split("\n")) {
230
- if (!line.includes(label)) continue;
231
- const candidate = Number(line.trim().split(/\s+/)[0]);
232
- if (Number.isInteger(candidate) && candidate > 0) {
233
- probe = {
234
- state: "running",
235
- pid: candidate
236
- };
237
- break;
238
- }
239
- }
240
- return probe;
241
- } catch (error) {
242
- const { code, status } = error ?? {};
243
- failure = {
244
- ...typeof code === "string" ? { code } : {},
245
- ...typeof status === "number" ? { exit: status } : {}
246
- };
247
- return probe;
248
- } finally {
249
- debugLog.log("ios.app-process", {
250
- deviceId: udid,
251
- bundleId,
252
- state: probe.state === "stopped" ? "absent" : probe.state,
253
- ...probe.state === "running" ? { appPid: probe.pid } : {},
254
- ms: Math.round(performance.now() - started),
255
- ...failure
256
- });
257
- }
258
- }
259
- function launchedIosAppAfterNoHandle(error, udid, bundleId, exec) {
260
- const stderr = String(error?.stderr ?? "");
261
- if (!stderr.includes("domain=NSPOSIXErrorDomain, code=3") || !stderr.includes(`Application launch for '${bundleId}' did not return a process handle nor launch error.`)) return null;
262
- const probe = iosAppProcess(udid, bundleId, { exec });
263
- return probe.state === "running" ? probe.pid : null;
264
- }
265
- function launchIosApp({ udid, bundleId, metroPort, devClientScheme = null, devMenuParams = false, consolePaths }, { exec = null } = {}) {
266
- const e = exec || getExecutor();
267
- const running = iosAppProcess(udid, bundleId, { exec: e });
268
- const stateUnknown = running.state === "unknown";
269
- const launchArgs = [
270
- "simctl",
271
- "launch",
272
- ...consolePaths ? [`--stdout=${consolePaths.stdout}`, `--stderr=${consolePaths.stderr}`] : [],
273
- ...stateUnknown ? ["--terminate-running-process"] : [],
274
- udid,
275
- bundleId
276
- ];
277
- const restart = {};
278
- if (running.state === "running") {
279
- try {
280
- e.runFile("xcrun", [
281
- "simctl",
282
- "terminate",
283
- udid,
284
- bundleId
285
- ], { timeoutMs: 3e4 });
286
- } catch (err) {
287
- return {
288
- failed: true,
289
- code: LAUNCH_ERROR,
290
- reason: `simctl terminate ${bundleId} failed, so the running app (pid ${running.pid}) was not restarted: ${describeIosSimulatorFailure(err, e)}`
291
- };
292
- }
293
- restart.restartedPid = running.pid;
294
- }
295
- if (metroPort !== null) {
296
- try {
297
- e.runFile("xcrun", [
298
- "simctl",
299
- "spawn",
300
- udid,
301
- "defaults",
302
- "write",
303
- bundleId,
304
- "RCT_jsLocation",
305
- jsLocationValue(metroPort)
306
- ], { timeoutMs: 6e4 });
307
- } catch (err) {
308
- return {
309
- failed: true,
310
- code: LAUNCH_ERROR,
311
- reason: `Could not point ${bundleId} at Metro port ${metroPort} (defaults write RCT_jsLocation): ${describeIosSimulatorFailure(err, e)}`
312
- };
313
- }
314
- if (devClientScheme) {
315
- const url = devClientUrl(devClientScheme, metroPort, "localhost", { devMenuParams });
316
- const viaInitialUrl = Boolean(consolePaths) || stateUnknown;
317
- if (!viaInitialUrl) try {
318
- writeIosDevMenuOffDefaults(udid, bundleId, e);
319
- } catch (err) {
320
- return {
321
- failed: true,
322
- code: LAUNCH_ERROR,
323
- reason: `Could not turn off ${bundleId}'s dev menu before opening it (defaults write): ${describeIosSimulatorFailure(err, e)}`
324
- };
325
- }
326
- let launchedWithInitialUrl = false;
327
- try {
328
- if (viaInitialUrl) {
329
- const initialUrl = new URL(url).searchParams.get("url");
330
- launchedWithInitialUrl = true;
331
- const pid = parseLaunchedPid(e.runFile("xcrun", [
332
- ...launchArgs,
333
- "--initialUrl",
334
- initialUrl,
335
- ...DEV_MENU_LAUNCH_ARGS
336
- ], { timeoutMs: 6e4 }));
337
- return {
338
- ok: true,
339
- mode: "launch",
340
- url,
341
- jsLocation: jsLocationValue(metroPort),
342
- pid,
343
- ...restart
344
- };
345
- }
346
- e.runFile("xcrun", [
347
- "simctl",
348
- "openurl",
349
- udid,
350
- url
351
- ], { timeoutMs: 6e4 });
352
- return {
353
- ok: true,
354
- mode: "openurl",
355
- url,
356
- jsLocation: jsLocationValue(metroPort),
357
- ...restart
358
- };
359
- } catch (err) {
360
- const pid = launchedWithInitialUrl && !stateUnknown ? launchedIosAppAfterNoHandle(err, udid, bundleId, e) : null;
361
- if (pid && pid !== restart.restartedPid) return {
362
- ok: true,
363
- mode: "launch",
364
- url,
365
- jsLocation: jsLocationValue(metroPort),
366
- pid,
367
- ...restart
368
- };
369
- return {
370
- failed: true,
371
- code: LAUNCH_ERROR,
372
- reason: `simctl ${launchedWithInitialUrl ? `launch ${bundleId}` : `openurl ${url}`} failed: ${describeIosSimulatorFailure(err, e)}`
373
- };
374
- }
375
- }
376
- }
377
- try {
378
- const result = {
379
- ok: true,
380
- mode: "launch",
381
- pid: parseLaunchedPid(e.runFile("xcrun", launchArgs, { timeoutMs: 6e4 })),
382
- ...restart
383
- };
384
- if (metroPort !== null) result.jsLocation = jsLocationValue(metroPort);
385
- return result;
386
- } catch (err) {
387
- const pid = stateUnknown ? null : launchedIosAppAfterNoHandle(err, udid, bundleId, e);
388
- if (pid && pid !== restart.restartedPid) {
389
- const result = {
390
- ok: true,
391
- mode: "launch",
392
- pid,
393
- ...restart
394
- };
395
- if (metroPort !== null) result.jsLocation = jsLocationValue(metroPort);
396
- return result;
397
- }
398
- return {
399
- failed: true,
400
- code: LAUNCH_ERROR,
401
- reason: `simctl launch ${bundleId} failed: ${describeIosSimulatorFailure(err, e)}`
402
- };
403
- }
404
- }
405
- function installConflictKind(text) {
406
- const out = String(text ?? "");
407
- if (/INSTALL_FAILED_UPDATE_INCOMPATIBLE|INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES|signatures do not match/i.test(out)) return "signature";
408
- if (/INSTALL_FAILED_VERSION_DOWNGRADE/i.test(out)) return "downgrade";
409
- return null;
410
- }
411
- const ADB_INSTALL_TIMEOUT_MS = 3e5;
412
- const ADB_UNINSTALL_TIMEOUT_MS = 12e4;
413
- const ADB_SHELL_OPTIONS = {
414
- timeoutMs: 3e4,
415
- killSignal: "SIGKILL"
416
- };
417
- function installAndroidApp({ serial, apkPath, packageName = null, allowUninstall = false }, { exec = null } = {}) {
418
- const e = exec || getExecutor();
419
- if (packageName && deviceHoldsApk({
420
- serial,
421
- packageName,
422
- apkPath
423
- }, { exec: e })) return {
424
- ok: true,
425
- apkPath,
426
- skipped: true
427
- };
428
- const install = () => {
429
- e.runFile("adb", [
430
- "-s",
431
- serial,
432
- "install",
433
- "-r",
434
- apkPath
435
- ], { timeoutMs: ADB_INSTALL_TIMEOUT_MS });
436
- };
437
- try {
438
- install();
439
- return {
440
- ok: true,
441
- apkPath
442
- };
443
- } catch (err) {
444
- const conflict = installConflictKind(describe(err));
445
- if (!conflict || !allowUninstall || !packageName) return {
446
- failed: true,
447
- code: INSTALL_ERROR,
448
- reason: `adb install failed for ${apkPath}: ${describe(err)}`
449
- };
450
- try {
451
- e.runFile("adb", [
452
- "-s",
453
- serial,
454
- "uninstall",
455
- packageName
456
- ], {
457
- timeoutMs: ADB_UNINSTALL_TIMEOUT_MS,
458
- killSignal: "SIGKILL"
459
- });
460
- } catch (uninstallErr) {
461
- return {
462
- failed: true,
463
- code: INSTALL_ERROR,
464
- reason: `adb install failed for ${apkPath} (${conflict}) and ${packageName} could not be uninstalled: ` + describe(uninstallErr)
465
- };
466
- }
467
- try {
468
- install();
469
- } catch (retryErr) {
470
- return {
471
- failed: true,
472
- code: INSTALL_ERROR,
473
- reason: `adb install failed for ${apkPath} even after uninstalling ${packageName}: ${describe(retryErr)}`
474
- };
475
- }
476
- return {
477
- ok: true,
478
- apkPath,
479
- uninstalled: true,
480
- note: conflict === "signature" ? `${packageName} was already installed with a different signer, so it was uninstalled (its data went with it) before this APK could be installed` : `${packageName} was already installed at a higher versionCode, so it was uninstalled (its data went with it) before this APK could be installed`
481
- };
482
- }
483
- }
484
- function parseResolvedActivity(text) {
485
- if (typeof text !== "string") return null;
486
- for (const raw of text.split("\n")) {
487
- const line = raw.trim();
488
- if (!line) continue;
489
- if (/^No activity found/i.test(line)) return null;
490
- if (line.includes("=")) continue;
491
- if (!line.includes("/")) continue;
492
- return line;
493
- }
494
- return null;
495
- }
496
- function resolveLaunchActivity(serial, packageName, { exec = null } = {}) {
497
- const e = exec || getExecutor();
498
- try {
499
- return parseResolvedActivity(e.runFile("adb", [
500
- "-s",
501
- serial,
502
- "shell",
503
- "cmd",
504
- "package",
505
- "resolve-activity",
506
- "--brief",
507
- "-c",
508
- "android.intent.category.LAUNCHER",
509
- packageName
510
- ], ADB_SHELL_OPTIONS));
511
- } catch {
512
- return null;
513
- }
514
- }
515
- function reverseMetroPorts({ serial, metroPort, devicePorts = null }, { exec = null } = {}) {
516
- const e = exec || getExecutor();
517
- const pairs = (devicePorts ?? [metroPort]).map((device) => [device, metroPort]);
518
- for (const [device, host] of pairs) try {
519
- e.runFile("adb", [
520
- "-s",
521
- serial,
522
- "reverse",
523
- `tcp:${device}`,
524
- `tcp:${host}`
525
- ], ADB_SHELL_OPTIONS);
526
- } catch (err) {
527
- return {
528
- failed: true,
529
- code: LAUNCH_ERROR,
530
- reason: `adb reverse tcp:${device} tcp:${host} failed on ${serial}: ${describe(err)}`
531
- };
532
- }
533
- return {
534
- ok: true,
535
- reversed: pairs.map(([device, host]) => `tcp:${device}->tcp:${host}`)
536
- };
537
- }
538
- function hasMetroReverse(listing, metroPort) {
539
- return String(listing ?? "").split("\n").some((line) => {
540
- const cols = line.trim().split(/\s+/);
541
- return cols[1] === `tcp:${metroPort}` && cols[2] === `tcp:${metroPort}`;
542
- });
543
- }
544
- /** Re-applies the launch's `metroPort` reverse when the device no longer has it. */
545
- function ensureMetroReverse({ serial, metroPort }, { exec = null } = {}) {
546
- const e = exec || getExecutor();
547
- let listing;
548
- try {
549
- listing = e.runFile("adb", [
550
- "-s",
551
- serial,
552
- "reverse",
553
- "--list"
554
- ], ADB_SHELL_OPTIONS);
555
- } catch {
556
- return {
557
- failed: true,
558
- reason: `adb reverse --list failed on ${serial}`
559
- };
560
- }
561
- if (hasMetroReverse(listing, metroPort)) return { restored: false };
562
- const reversed = reverseMetroPorts({
563
- serial,
564
- metroPort
565
- }, { exec: e });
566
- return reversed.failed ? {
567
- failed: true,
568
- reason: reversed.reason ?? "adb reverse failed"
569
- } : { restored: true };
570
- }
571
- const EMULATOR_HOST_LOOPBACK = "127.0.0.1";
572
- const PHYSICAL_HOST_LOOPBACK = "localhost";
573
- function androidMetroHost(physical) {
574
- return physical ? PHYSICAL_HOST_LOOPBACK : EMULATOR_HOST_LOOPBACK;
575
- }
576
- function deviceShellArg(text) {
577
- return `'${String(text).replace(/'/g, "'\\''")}'`;
578
- }
579
- function debugHttpHostScript({ packageName, host, dataDir = null }) {
580
- const dir = dataDir || `/data/data/${packageName}`;
581
- const prefs = `shared_prefs/${packageName}_preferences.xml`;
582
- const tmp = `${prefs}.stim.tmp`;
583
- return [
584
- `cd ${dir} || exit 1`,
585
- "mkdir -p shared_prefs || exit 1",
586
- `printf '%s\\n' '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>' '<map>' > ${tmp} || exit 1`,
587
- `if [ -f ${prefs} ]; then grep -v 'debug_http_host' ${prefs} | grep -v '<?xml' | grep -v '<map' | grep -v '</map>' >> ${tmp}; fi`,
588
- `printf '%s\\n' ' <string name="debug_http_host">${host}</string>' '</map>' >> ${tmp} || exit 1`,
589
- `mv ${tmp} ${prefs} || exit 1`,
590
- `grep -q '>${host}<' ${prefs} || exit 1`
591
- ].join("\n");
592
- }
593
- function writeDebugHttpHost({ serial, packageName, metroPort, physical = false }, { exec = null } = {}) {
594
- const e = exec || getExecutor();
595
- const host = `${androidMetroHost(physical)}:${metroPort}`;
596
- const script = debugHttpHostScript({
597
- packageName,
598
- host
599
- });
600
- try {
601
- e.runFile("adb", [
602
- "-s",
603
- serial,
604
- "shell",
605
- "run-as",
606
- packageName,
607
- "sh",
608
- "-c",
609
- deviceShellArg(script)
610
- ], ADB_SHELL_OPTIONS);
611
- return {
612
- ok: true,
613
- host
614
- };
615
- } catch (err) {
616
- return {
617
- ok: false,
618
- reason: `debug_http_host not written (${describe(err)}); relying on adb reverse`
619
- };
620
- }
621
- }
622
- function androidDevClientUrl(scheme, metroPort, physical = false) {
623
- return devClientUrl(scheme, metroPort, androidMetroHost(physical));
624
- }
625
- function amStartError(text) {
626
- const out = String(text ?? "");
627
- for (const raw of out.split("\n")) {
628
- const line = raw.trim();
629
- if (/^Error:/i.test(line)) return line;
630
- }
631
- return null;
632
- }
633
- function openAndroidDevClientUrl({ serial, url, packageName, stopOnStart = false }, { exec = null } = {}) {
634
- const e = exec || getExecutor();
635
- let out;
636
- try {
637
- const args = [
638
- "-s",
639
- serial,
640
- "shell",
641
- "am",
642
- "start",
643
- ...stopOnStart ? ["-S"] : [],
644
- "-a",
645
- "android.intent.action.VIEW",
646
- "-d",
647
- deviceShellArg(url),
648
- ...packageName ? ["-p", packageName] : [],
649
- "--ez",
650
- ANDROID_DISABLE_AUTO_LAUNCH_EXTRA,
651
- "true"
652
- ];
653
- out = e.runFile("adb", args, ADB_SHELL_OPTIONS);
654
- } catch (err) {
655
- return {
656
- failed: true,
657
- reason: `am start -d ${url} failed on ${serial}: ${describe(err)}`
658
- };
659
- }
660
- const error = amStartError(out);
661
- if (error) return {
662
- failed: true,
663
- reason: `am start -d ${url} did not start anything on ${serial}: ${error}`
664
- };
665
- return {
666
- ok: true,
667
- url
668
- };
669
- }
670
- function stopRunningAndroidApp(serial, packageName, exec) {
671
- const running = androidAppProcess(serial, packageName, { exec });
672
- if (running.state === "stopped") return {};
673
- if (running.state !== "running") return { stopOnStart: true };
674
- try {
675
- exec.runFile("adb", [
676
- "-s",
677
- serial,
678
- "shell",
679
- "am",
680
- "force-stop",
681
- packageName
682
- ], ADB_SHELL_OPTIONS);
683
- } catch (err) {
684
- return {
685
- failed: true,
686
- code: LAUNCH_ERROR,
687
- reason: `am force-stop ${packageName} failed on ${serial}, so the running app (pid ${running.pid}) was not restarted: ${describe(err)}`
688
- };
689
- }
690
- return { restartedPid: running.pid };
691
- }
692
- function launchAndroidWithMonkey(serial, packageName, stopOnStart, exec) {
693
- if (stopOnStart) try {
694
- exec.runFile("adb", [
695
- "-s",
696
- serial,
697
- "shell",
698
- "am",
699
- "force-stop",
700
- packageName
701
- ], ADB_SHELL_OPTIONS);
702
- } catch {}
703
- exec.runFile("adb", [
704
- "-s",
705
- serial,
706
- "shell",
707
- "monkey",
708
- "-p",
709
- packageName,
710
- "1"
711
- ], ADB_SHELL_OPTIONS);
712
- }
713
- function launchAndroidApp({ serial, packageName, metroPort, devClientScheme = null, physical = false, bridgePort }, { exec = null } = {}) {
714
- const e = exec || getExecutor();
715
- const { stopOnStart = false, ...restart } = stopRunningAndroidApp(serial, packageName, e);
716
- if (restart.failed) return restart;
717
- const reversed = reverseMetroPorts({
718
- serial,
719
- metroPort: bridgePort ?? metroPort,
720
- devicePorts: [metroPort]
721
- }, { exec: e });
722
- if (reversed.failed) return reversed;
723
- const prefs = writeDebugHttpHost({
724
- serial,
725
- packageName,
726
- metroPort,
727
- physical
728
- }, { exec: e });
729
- let reversedPairs = reversed.reversed ?? [];
730
- if (!prefs.ok && Number(metroPort) !== 8081) {
731
- const fallback = reverseMetroPorts({
732
- serial,
733
- metroPort: bridgePort ?? metroPort,
734
- devicePorts: [DEFAULT_METRO_PORT]
735
- }, { exec: e });
736
- if (fallback.failed) return fallback;
737
- reversedPairs = [...reversedPairs, ...fallback.reversed ?? []];
738
- }
739
- const wiring = {
740
- reversed: reversedPairs,
741
- debugHttpHost: prefs.ok ? prefs.host : null,
742
- debugHttpHostNote: prefs.ok ? null : prefs.reason,
743
- ...restart
744
- };
745
- let devClientNote = null;
746
- if (devClientScheme) {
747
- const url = androidDevClientUrl(devClientScheme, metroPort, physical);
748
- const opened = openAndroidDevClientUrl({
749
- serial,
750
- url,
751
- stopOnStart
752
- }, { exec: e });
753
- if (opened.ok) return {
754
- ok: true,
755
- mode: "deep-link",
756
- devClientUrl: url,
757
- ...wiring
758
- };
759
- devClientNote = `${opened.reason}; fell back to the launcher activity`;
760
- }
761
- const component = resolveLaunchActivity(serial, packageName, { exec: e });
762
- if (component) try {
763
- e.runFile("adb", [
764
- "-s",
765
- serial,
766
- "shell",
767
- "am",
768
- "start",
769
- ...stopOnStart ? ["-S"] : [],
770
- "-n",
771
- component
772
- ], ADB_SHELL_OPTIONS);
773
- return {
774
- ok: true,
775
- mode: "am-start",
776
- component,
777
- devClientNote,
778
- ...wiring
779
- };
780
- } catch (err) {
781
- return {
782
- failed: true,
783
- code: LAUNCH_ERROR,
784
- reason: `am start -n ${component} failed on ${serial}: ${describe(err)}`
785
- };
786
- }
787
- try {
788
- launchAndroidWithMonkey(serial, packageName, stopOnStart, e);
789
- return {
790
- ok: true,
791
- mode: "monkey",
792
- devClientNote,
793
- ...wiring
794
- };
795
- } catch (err) {
796
- return {
797
- failed: true,
798
- code: LAUNCH_ERROR,
799
- reason: `Could not launch ${packageName} on ${serial}: no launcher activity resolved and monkey failed: ${describe(err)}`
800
- };
801
- }
802
- }
803
- function launchAndroidReleaseApp({ serial, packageName }, { exec = null } = {}) {
804
- const e = exec || getExecutor();
805
- const { stopOnStart = false, ...restart } = stopRunningAndroidApp(serial, packageName, e);
806
- if (restart.failed) return restart;
807
- const component = resolveLaunchActivity(serial, packageName, { exec: e });
808
- if (component) try {
809
- e.runFile("adb", [
810
- "-s",
811
- serial,
812
- "shell",
813
- "am",
814
- "start",
815
- ...stopOnStart ? ["-S"] : [],
816
- "-n",
817
- component
818
- ], ADB_SHELL_OPTIONS);
819
- return {
820
- ok: true,
821
- mode: "am-start",
822
- component,
823
- ...restart
824
- };
825
- } catch (err) {
826
- return {
827
- failed: true,
828
- code: LAUNCH_ERROR,
829
- reason: `am start -n ${component} failed on ${serial}: ${describe(err)}`
830
- };
831
- }
832
- try {
833
- launchAndroidWithMonkey(serial, packageName, stopOnStart, e);
834
- return {
835
- ok: true,
836
- mode: "monkey",
837
- ...restart
838
- };
839
- } catch (err) {
840
- return {
841
- failed: true,
842
- code: LAUNCH_ERROR,
843
- reason: `Could not launch ${packageName} on ${serial}: no launcher activity resolved and monkey failed: ${describe(err)}`
844
- };
845
- }
846
- }
847
- function describe(err) {
848
- const e = err;
849
- const stderr = e?.stderr ? String(e.stderr).trim() : "";
850
- const message = e?.message ? String(e.message).trim() : String(err);
851
- return stderr ? `${message}: ${stderr}` : message;
852
- }
853
- function parsePidof(text) {
854
- const first = String(text ?? "").trim().split(/\s+/)[0];
855
- const pid = Number(first);
856
- return Number.isFinite(pid) && pid > 0 ? pid : null;
857
- }
858
- function parsePsPid(text, packageName) {
859
- for (const raw of String(text ?? "").split("\n")) {
860
- const cols = raw.trim().split(/\s+/);
861
- if (cols.length < 2) continue;
862
- if (cols[cols.length - 1] !== packageName) continue;
863
- const pid = Number(cols[1]);
864
- if (Number.isFinite(pid) && pid > 0) return pid;
865
- }
866
- return null;
867
- }
868
- function androidAppProcess(serial, packageName, { exec = null } = {}) {
869
- const e = exec || getExecutor();
870
- try {
871
- const pid = parsePidof(e.runFile("adb", [
872
- "-s",
873
- serial,
874
- "shell",
875
- "pidof",
876
- packageName
877
- ], ADB_SHELL_OPTIONS));
878
- if (pid !== null) return {
879
- state: "running",
880
- pid
881
- };
882
- } catch {}
883
- try {
884
- return appProcessFromPid(parsePsPid(e.runFile("adb", [
885
- "-s",
886
- serial,
887
- "shell",
888
- "ps",
889
- "-A"
890
- ], ADB_SHELL_OPTIONS), packageName));
891
- } catch {
892
- return { state: "unknown" };
893
- }
894
- }
895
- //#endregion
896
- export { restartedAppNote as C, readBundleSchemes as D, pickDevClientScheme as E, schemesFromInfoPlist as O, launchIosApp as S, writeDebugHttpHost as T, installConflictKind as _, IOS_DEV_MENU_OFF_DEFAULTS_PLIST as a, launchAndroidApp as b, androidDevClientUrl as c, devClientDeepLink as d, devClientUrl as f, installAndroidApp as g, hasMetroReverse as h, INSTALL_ERROR as i, appProcessFromPid as l, ensureMetroReverse as m, ANDROID_DISABLE_AUTO_LAUNCH_EXTRA as n, LAUNCH_ERROR as o, deviceShellArg as p, DEFAULT_METRO_PORT as r, androidAppProcess as s, ADB_INSTALL_TIMEOUT_MS as t, clearOtherUserApps as u, installIosApp as v, reverseMetroPorts as w, launchAndroidReleaseApp as x, iosAppProcess as y };