@expo/cli 0.11.0 → 0.12.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 (281) hide show
  1. package/build/bin/cli +2 -2
  2. package/build/src/api/getExpoGoIntermediateCertificate.js +1 -1
  3. package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -1
  4. package/build/src/api/getExpoSchema.js +1 -1
  5. package/build/src/api/getExpoSchema.js.map +1 -1
  6. package/build/src/api/getNativeModuleVersions.js +1 -1
  7. package/build/src/api/getNativeModuleVersions.js.map +1 -1
  8. package/build/src/api/getProjectDevelopmentCertificate.js +1 -1
  9. package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -1
  10. package/build/src/api/getVersions.js +1 -1
  11. package/build/src/api/getVersions.js.map +1 -1
  12. package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -1
  13. package/build/src/api/rest/client.js +5 -5
  14. package/build/src/api/rest/client.js.map +1 -1
  15. package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
  16. package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
  17. package/build/src/api/rest/wrapFetchWithProxy.js.map +1 -1
  18. package/build/src/api/updateDevelopmentSession.js +1 -1
  19. package/build/src/api/updateDevelopmentSession.js.map +1 -1
  20. package/build/src/api/user/actions.js +2 -2
  21. package/build/src/api/user/actions.js.map +1 -1
  22. package/build/src/api/user/otp.js +1 -1
  23. package/build/src/api/user/otp.js.map +1 -1
  24. package/build/src/api/user/user.js +2 -2
  25. package/build/src/api/user/user.js.map +1 -1
  26. package/build/src/config/configAsync.js +17 -1
  27. package/build/src/config/configAsync.js.map +1 -1
  28. package/build/src/customize/customizeAsync.js +1 -1
  29. package/build/src/customize/customizeAsync.js.map +1 -1
  30. package/build/src/customize/generate.js +29 -2
  31. package/build/src/customize/generate.js.map +1 -1
  32. package/build/src/customize/templates.js +8 -0
  33. package/build/src/customize/templates.js.map +1 -1
  34. package/build/src/customize/typescript.js +54 -0
  35. package/build/src/customize/typescript.js.map +1 -0
  36. package/build/src/export/createBundles.js +1 -1
  37. package/build/src/export/createBundles.js.map +1 -1
  38. package/build/src/export/createMetadataJson.js.map +1 -1
  39. package/build/src/export/embed/exportEmbedAsync.js +50 -4
  40. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  41. package/build/src/export/embed/index.js +1 -3
  42. package/build/src/export/embed/index.js.map +1 -1
  43. package/build/src/export/embed/resolveOptions.js +6 -10
  44. package/build/src/export/embed/resolveOptions.js.map +1 -1
  45. package/build/src/export/exportApp.js +50 -41
  46. package/build/src/export/exportApp.js.map +1 -1
  47. package/build/src/export/exportAssets.js +2 -2
  48. package/build/src/export/exportAssets.js.map +1 -1
  49. package/build/src/export/exportAsync.js +1 -1
  50. package/build/src/export/exportAsync.js.map +1 -1
  51. package/build/src/export/exportStaticAsync.js +42 -12
  52. package/build/src/export/exportStaticAsync.js.map +1 -1
  53. package/build/src/export/fork-bundleAsync.js +27 -2
  54. package/build/src/export/fork-bundleAsync.js.map +1 -1
  55. package/build/src/export/getPublicExpoManifest.js +1 -1
  56. package/build/src/export/getPublicExpoManifest.js.map +1 -1
  57. package/build/src/export/getResolvedLocales.js.map +1 -1
  58. package/build/src/export/printBundleSizes.js.map +1 -1
  59. package/build/src/export/web/exportWebAsync.js.map +1 -1
  60. package/build/src/export/writeContents.js +5 -1
  61. package/build/src/export/writeContents.js.map +1 -1
  62. package/build/src/install/checkPackages.js +1 -1
  63. package/build/src/install/checkPackages.js.map +1 -1
  64. package/build/src/install/installAsync.js +1 -1
  65. package/build/src/install/installAsync.js.map +1 -1
  66. package/build/src/prebuild/configureProjectAsync.js +5 -9
  67. package/build/src/prebuild/configureProjectAsync.js.map +1 -1
  68. package/build/src/prebuild/prebuildAsync.js +5 -5
  69. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  70. package/build/src/prebuild/updateFromTemplate.js +8 -5
  71. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  72. package/build/src/register/registerAsync.js +0 -1
  73. package/build/src/register/registerAsync.js.map +1 -1
  74. package/build/src/run/android/resolveInstallApkName.js.map +1 -1
  75. package/build/src/run/android/resolveOptions.js +1 -1
  76. package/build/src/run/android/resolveOptions.js.map +1 -1
  77. package/build/src/run/android/runAndroidAsync.js +2 -2
  78. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  79. package/build/src/run/ios/XcodeBuild.js +2 -2
  80. package/build/src/run/ios/XcodeBuild.js.map +1 -1
  81. package/build/src/run/ios/appleDevice/AppleDevice.js +4 -4
  82. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
  83. package/build/src/run/ios/appleDevice/ClientManager.js +1 -1
  84. package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -1
  85. package/build/src/run/ios/appleDevice/client/AFCClient.js +1 -1
  86. package/build/src/run/ios/appleDevice/client/AFCClient.js.map +1 -1
  87. package/build/src/run/ios/appleDevice/client/DebugserverClient.js +1 -1
  88. package/build/src/run/ios/appleDevice/client/DebugserverClient.js.map +1 -1
  89. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js +1 -1
  90. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
  91. package/build/src/run/ios/appleDevice/client/LockdowndClient.js +1 -1
  92. package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
  93. package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js +1 -1
  94. package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js.map +1 -1
  95. package/build/src/run/ios/appleDevice/client/ServiceClient.js.map +1 -1
  96. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js +1 -1
  97. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js.map +1 -1
  98. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +1 -1
  99. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -1
  100. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js +1 -1
  101. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js.map +1 -1
  102. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -1
  103. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js +1 -1
  104. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js.map +1 -1
  105. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js +1 -1
  106. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js.map +1 -1
  107. package/build/src/run/ios/codeSigning/configureCodeSigning.js +1 -1
  108. package/build/src/run/ios/codeSigning/configureCodeSigning.js.map +1 -1
  109. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js +2 -2
  110. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js.map +1 -1
  111. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js +3 -0
  112. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js.map +1 -1
  113. package/build/src/run/ios/index.js.map +1 -1
  114. package/build/src/run/ios/launchApp.js +2 -2
  115. package/build/src/run/ios/launchApp.js.map +1 -1
  116. package/build/src/run/ios/options/resolveDevice.js +1 -1
  117. package/build/src/run/ios/options/resolveDevice.js.map +1 -1
  118. package/build/src/run/ios/options/resolveOptions.js +2 -2
  119. package/build/src/run/ios/options/resolveOptions.js.map +1 -1
  120. package/build/src/run/ios/runIosAsync.js +3 -3
  121. package/build/src/run/ios/runIosAsync.js.map +1 -1
  122. package/build/src/start/doctor/apple/XcodePrerequisite.js +43 -2
  123. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  124. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +1 -1
  125. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  126. package/build/src/start/doctor/dependencies/getVersionedPackages.js +5 -3
  127. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  128. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +1 -1
  129. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  130. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  131. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +7 -7
  132. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  133. package/build/src/start/doctor/typescript/updateTSConfig.js +11 -10
  134. package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
  135. package/build/src/start/index.js +0 -2
  136. package/build/src/start/index.js.map +1 -1
  137. package/build/src/start/interface/interactiveActions.js +1 -1
  138. package/build/src/start/interface/interactiveActions.js.map +1 -1
  139. package/build/src/start/interface/startInterface.js +3 -3
  140. package/build/src/start/interface/startInterface.js.map +1 -1
  141. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  142. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  143. package/build/src/start/platforms/android/ADBServer.js +1 -1
  144. package/build/src/start/platforms/android/ADBServer.js.map +1 -1
  145. package/build/src/start/platforms/android/AndroidDeviceManager.js +5 -5
  146. package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -1
  147. package/build/src/start/platforms/android/AndroidPlatformManager.js +1 -1
  148. package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -1
  149. package/build/src/start/platforms/android/adb.js +1 -1
  150. package/build/src/start/platforms/android/adb.js.map +1 -1
  151. package/build/src/start/platforms/android/adbReverse.js +2 -2
  152. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  153. package/build/src/start/platforms/android/emulator.js +1 -1
  154. package/build/src/start/platforms/android/emulator.js.map +1 -1
  155. package/build/src/start/platforms/android/getDevices.js +1 -1
  156. package/build/src/start/platforms/android/getDevices.js.map +1 -1
  157. package/build/src/start/platforms/android/promptAndroidDevice.js +1 -1
  158. package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -1
  159. package/build/src/start/platforms/ios/AppleDeviceManager.js +5 -5
  160. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  161. package/build/src/start/platforms/ios/ApplePlatformManager.js +1 -1
  162. package/build/src/start/platforms/ios/ApplePlatformManager.js.map +1 -1
  163. package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js.map +1 -1
  164. package/build/src/start/platforms/ios/getBestSimulator.js +1 -1
  165. package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
  166. package/build/src/start/platforms/ios/promptAppleDevice.js +1 -1
  167. package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -1
  168. package/build/src/start/platforms/ios/simctl.js +1 -1
  169. package/build/src/start/platforms/ios/simctl.js.map +1 -1
  170. package/build/src/start/platforms/ios/simctlLogging.js +1 -1
  171. package/build/src/start/platforms/ios/simctlLogging.js.map +1 -1
  172. package/build/src/start/resolveOptions.js +0 -5
  173. package/build/src/start/resolveOptions.js.map +1 -1
  174. package/build/src/start/server/AsyncNgrok.js +4 -3
  175. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  176. package/build/src/start/server/BundlerDevServer.js +4 -11
  177. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  178. package/build/src/start/server/DevServerManager.js +3 -2
  179. package/build/src/start/server/DevServerManager.js.map +1 -1
  180. package/build/src/start/server/UrlCreator.js +2 -1
  181. package/build/src/start/server/UrlCreator.js.map +1 -1
  182. package/build/src/start/server/getStaticRenderFunctions.js +2 -2
  183. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  184. package/build/src/start/server/metro/MetroBundlerDevServer.js +42 -25
  185. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  186. package/build/src/start/server/metro/MetroTerminalReporter.js +14 -3
  187. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  188. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  189. package/build/src/start/server/metro/TerminalReporter.types.js.map +1 -1
  190. package/build/src/start/server/metro/inspector-proxy/device.js.map +1 -1
  191. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +1 -1
  192. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +1 -1
  193. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -1
  194. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +1 -1
  195. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -1
  196. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +1 -1
  197. package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +1 -1
  198. package/build/src/start/server/metro/inspector-proxy/index.js +1 -1
  199. package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
  200. package/build/src/start/server/metro/instantiateMetro.js +49 -8
  201. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  202. package/build/src/start/server/metro/resolveFromProject.js +0 -4
  203. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  204. package/build/src/start/server/metro/runServer-fork.js +1 -1
  205. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  206. package/build/src/start/server/metro/withMetroMultiPlatform.js +59 -9
  207. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  208. package/build/src/start/server/metro/withMetroResolvers.js +6 -5
  209. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
  210. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +2 -2
  211. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  212. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  213. package/build/src/start/server/middleware/FaviconMiddleware.js +1 -1
  214. package/build/src/start/server/middleware/FaviconMiddleware.js.map +1 -1
  215. package/build/src/start/server/middleware/ManifestMiddleware.js +8 -11
  216. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  217. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +1 -1
  218. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  219. package/build/src/start/server/middleware/ServeStaticMiddleware.js +1 -1
  220. package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -1
  221. package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
  222. package/build/src/start/server/middleware/server.types.js.map +1 -1
  223. package/build/src/start/server/openPlatforms.js.map +1 -1
  224. package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
  225. package/build/src/start/server/type-generation/routes.js +6 -6
  226. package/build/src/start/server/type-generation/routes.js.map +1 -1
  227. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +3 -3
  228. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  229. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +10 -5
  230. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  231. package/build/src/start/server/webpack/compile.js +1 -1
  232. package/build/src/start/server/webpack/compile.js.map +1 -1
  233. package/build/src/start/startAsync.js +10 -32
  234. package/build/src/start/startAsync.js.map +1 -1
  235. package/build/src/utils/FileNotifier.js +1 -1
  236. package/build/src/utils/FileNotifier.js.map +1 -1
  237. package/build/src/utils/analytics/metroDebuggerMiddleware.js +1 -1
  238. package/build/src/utils/analytics/metroDebuggerMiddleware.js.map +1 -1
  239. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  240. package/build/src/utils/array.js.map +1 -1
  241. package/build/src/utils/cocoapods.js +2 -2
  242. package/build/src/utils/cocoapods.js.map +1 -1
  243. package/build/src/utils/codesigning.js +2 -2
  244. package/build/src/utils/codesigning.js.map +1 -1
  245. package/build/src/utils/downloadAppAsync.js +1 -1
  246. package/build/src/utils/downloadAppAsync.js.map +1 -1
  247. package/build/src/utils/downloadExpoGoAsync.js +2 -2
  248. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  249. package/build/src/utils/editor.js +1 -1
  250. package/build/src/utils/editor.js.map +1 -1
  251. package/build/src/utils/env.js +1 -1
  252. package/build/src/utils/env.js.map +1 -1
  253. package/build/src/utils/errors.js.map +1 -1
  254. package/build/src/utils/getOrPromptApplicationId.js +2 -2
  255. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  256. package/build/src/utils/git.js +1 -1
  257. package/build/src/utils/git.js.map +1 -1
  258. package/build/src/utils/modifyConfigAsync.js +1 -1
  259. package/build/src/utils/modifyConfigAsync.js.map +1 -1
  260. package/build/src/utils/modifyConfigPlugins.js +1 -1
  261. package/build/src/utils/modifyConfigPlugins.js.map +1 -1
  262. package/build/src/utils/npm.js +1 -1
  263. package/build/src/utils/npm.js.map +1 -1
  264. package/build/src/utils/obj.js.map +1 -1
  265. package/build/src/utils/plist.js +1 -1
  266. package/build/src/utils/plist.js.map +1 -1
  267. package/build/src/utils/port.js +1 -1
  268. package/build/src/utils/port.js.map +1 -1
  269. package/build/src/utils/profile.js +1 -1
  270. package/build/src/utils/profile.js.map +1 -1
  271. package/build/src/utils/scheme.js +1 -1
  272. package/build/src/utils/scheme.js.map +1 -1
  273. package/build/src/utils/tsconfig/loadTsConfigPaths.js +1 -1
  274. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
  275. package/build/src/utils/validateApplicationId.js +85 -5
  276. package/build/src/utils/validateApplicationId.js.map +1 -1
  277. package/package.json +11 -8
  278. package/build/src/api/signManifest.js +0 -26
  279. package/build/src/api/signManifest.js.map +0 -1
  280. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +0 -155
  281. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +0 -1
@@ -25,7 +25,6 @@ async function registerAsync() {
25
25
  } else {
26
26
  spinner.fail(failedMessage);
27
27
  }
28
- return;
29
28
  } catch (error) {
30
29
  spinner.fail(failedMessage);
31
30
  throw error;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/register/registerAsync.ts"],"sourcesContent":["import { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { isInteractive } from '../utils/interactive';\nimport { learnMore } from '../utils/link';\nimport { openBrowserAsync } from '../utils/open';\nimport { ora } from '../utils/ora';\n\nexport async function registerAsync() {\n if (!isInteractive()) {\n throw new CommandError(\n 'NON_INTERACTIVE',\n `Cannot register an account in CI. Use the EXPO_TOKEN environment variable to authenticate in CI (${learnMore(\n 'https://docs.expo.dev/accounts/programmatic-access/'\n )})`\n );\n } else if (env.EXPO_OFFLINE) {\n throw new CommandError('OFFLINE', `Cannot register an account in offline-mode`);\n }\n\n const registrationUrl = `https://expo.dev/signup`;\n const failedMessage = `Unable to open a web browser. Register an account at: ${registrationUrl}`;\n const spinner = ora(`Opening ${registrationUrl}`).start();\n try {\n const opened = await openBrowserAsync(registrationUrl);\n\n if (opened) {\n spinner.succeed(`Opened ${registrationUrl}`);\n } else {\n spinner.fail(failedMessage);\n }\n return;\n } catch (error) {\n spinner.fail(failedMessage);\n throw error;\n }\n}\n"],"names":["registerAsync","isInteractive","CommandError","learnMore","env","EXPO_OFFLINE","registrationUrl","failedMessage","spinner","ora","start","opened","openBrowserAsync","succeed","fail","error"],"mappings":"AAAA;;;;QAOsBA,aAAa,GAAbA,aAAa;AAPf,IAAA,IAAc,WAAd,cAAc,CAAA;AACL,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAChB,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;AAC1B,IAAA,KAAe,WAAf,eAAe,CAAA;AACR,IAAA,KAAe,WAAf,eAAe,CAAA;AAC5B,IAAA,IAAc,WAAd,cAAc,CAAA;AAE3B,eAAeA,aAAa,GAAG;IACpC,IAAI,CAACC,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,EAAE;QACpB,MAAM,IAAIC,OAAY,aAAA,CACpB,iBAAiB,EACjB,CAAC,iGAAiG,EAAEC,CAAAA,GAAAA,KAAS,AAE5G,CAAA,UAF4G,CAC3G,qDAAqD,CACtD,CAAC,CAAC,CAAC,CACL,CAAC;KACH,MAAM,IAAIC,IAAG,IAAA,CAACC,YAAY,EAAE;QAC3B,MAAM,IAAIH,OAAY,aAAA,CAAC,SAAS,EAAE,CAAC,0CAA0C,CAAC,CAAC,CAAC;KACjF;IAED,MAAMI,eAAe,GAAG,CAAC,uBAAuB,CAAC,AAAC;IAClD,MAAMC,aAAa,GAAG,CAAC,sDAAsD,EAAED,eAAe,CAAC,CAAC,AAAC;IACjG,MAAME,OAAO,GAAGC,CAAAA,GAAAA,IAAG,AAA8B,CAAA,IAA9B,CAAC,CAAC,QAAQ,EAAEH,eAAe,CAAC,CAAC,CAAC,CAACI,KAAK,EAAE,AAAC;IAC1D,IAAI;QACF,MAAMC,MAAM,GAAG,MAAMC,CAAAA,GAAAA,KAAgB,AAAiB,CAAA,iBAAjB,CAACN,eAAe,CAAC,AAAC;QAEvD,IAAIK,MAAM,EAAE;YACVH,OAAO,CAACK,OAAO,CAAC,CAAC,OAAO,EAAEP,eAAe,CAAC,CAAC,CAAC,CAAC;SAC9C,MAAM;YACLE,OAAO,CAACM,IAAI,CAACP,aAAa,CAAC,CAAC;SAC7B;QACD,OAAO;KACR,CAAC,OAAOQ,KAAK,EAAE;QACdP,OAAO,CAACM,IAAI,CAACP,aAAa,CAAC,CAAC;QAC5B,MAAMQ,KAAK,CAAC;KACb;CACF"}
1
+ {"version":3,"sources":["../../../src/register/registerAsync.ts"],"sourcesContent":["import { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { isInteractive } from '../utils/interactive';\nimport { learnMore } from '../utils/link';\nimport { openBrowserAsync } from '../utils/open';\nimport { ora } from '../utils/ora';\n\nexport async function registerAsync() {\n if (!isInteractive()) {\n throw new CommandError(\n 'NON_INTERACTIVE',\n `Cannot register an account in CI. Use the EXPO_TOKEN environment variable to authenticate in CI (${learnMore(\n 'https://docs.expo.dev/accounts/programmatic-access/'\n )})`\n );\n } else if (env.EXPO_OFFLINE) {\n throw new CommandError('OFFLINE', `Cannot register an account in offline-mode`);\n }\n\n const registrationUrl = `https://expo.dev/signup`;\n const failedMessage = `Unable to open a web browser. Register an account at: ${registrationUrl}`;\n const spinner = ora(`Opening ${registrationUrl}`).start();\n try {\n const opened = await openBrowserAsync(registrationUrl);\n\n if (opened) {\n spinner.succeed(`Opened ${registrationUrl}`);\n } else {\n spinner.fail(failedMessage);\n }\n } catch (error) {\n spinner.fail(failedMessage);\n throw error;\n }\n}\n"],"names":["registerAsync","isInteractive","CommandError","learnMore","env","EXPO_OFFLINE","registrationUrl","failedMessage","spinner","ora","start","opened","openBrowserAsync","succeed","fail","error"],"mappings":"AAAA;;;;QAOsBA,aAAa,GAAbA,aAAa;AAPf,IAAA,IAAc,WAAd,cAAc,CAAA;AACL,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;AAChB,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;AAC1B,IAAA,KAAe,WAAf,eAAe,CAAA;AACR,IAAA,KAAe,WAAf,eAAe,CAAA;AAC5B,IAAA,IAAc,WAAd,cAAc,CAAA;AAE3B,eAAeA,aAAa,GAAG;IACpC,IAAI,CAACC,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,EAAE;QACpB,MAAM,IAAIC,OAAY,aAAA,CACpB,iBAAiB,EACjB,CAAC,iGAAiG,EAAEC,CAAAA,GAAAA,KAAS,AAE5G,CAAA,UAF4G,CAC3G,qDAAqD,CACtD,CAAC,CAAC,CAAC,CACL,CAAC;KACH,MAAM,IAAIC,IAAG,IAAA,CAACC,YAAY,EAAE;QAC3B,MAAM,IAAIH,OAAY,aAAA,CAAC,SAAS,EAAE,CAAC,0CAA0C,CAAC,CAAC,CAAC;KACjF;IAED,MAAMI,eAAe,GAAG,CAAC,uBAAuB,CAAC,AAAC;IAClD,MAAMC,aAAa,GAAG,CAAC,sDAAsD,EAAED,eAAe,CAAC,CAAC,AAAC;IACjG,MAAME,OAAO,GAAGC,CAAAA,GAAAA,IAAG,AAA8B,CAAA,IAA9B,CAAC,CAAC,QAAQ,EAAEH,eAAe,CAAC,CAAC,CAAC,CAACI,KAAK,EAAE,AAAC;IAC1D,IAAI;QACF,MAAMC,MAAM,GAAG,MAAMC,CAAAA,GAAAA,KAAgB,AAAiB,CAAA,iBAAjB,CAACN,eAAe,CAAC,AAAC;QAEvD,IAAIK,MAAM,EAAE;YACVH,OAAO,CAACK,OAAO,CAAC,CAAC,OAAO,EAAEP,eAAe,CAAC,CAAC,CAAC,CAAC;SAC9C,MAAM;YACLE,OAAO,CAACM,IAAI,CAACP,aAAa,CAAC,CAAC;SAC7B;KACF,CAAC,OAAOQ,KAAK,EAAE;QACdP,OAAO,CAACM,IAAI,CAACP,aAAa,CAAC,CAAC;QAC5B,MAAMQ,KAAK,CAAC;KACb;CACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/run/android/resolveInstallApkName.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { Device, DeviceABI, getDeviceABIsAsync } from '../../start/platforms/android/adb';\nimport { GradleProps } from './resolveGradleProps';\n\nconst debug = require('debug')('expo:run:android:resolveInstallApkName') as typeof console.log;\n\nexport async function resolveInstallApkNameAsync(\n device: Pick<Device, 'name' | 'pid'>,\n { appName, buildType, flavors, apkVariantDirectory }: GradleProps\n) {\n const availableCPUs = await getDeviceABIsAsync(device);\n availableCPUs.push(DeviceABI.universal);\n\n debug('Supported ABIs: ' + availableCPUs.join(', '));\n debug('Searching for APK: ' + apkVariantDirectory);\n\n // Check for cpu specific builds first\n for (const availableCPU of availableCPUs) {\n const apkName = getApkFileName(appName, buildType, flavors, availableCPU);\n const apkPath = path.join(apkVariantDirectory, apkName);\n debug('Checking for APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n }\n\n // Otherwise use the default apk named after the variant: app-debug.apk\n const apkName = getApkFileName(appName, buildType, flavors);\n const apkPath = path.join(apkVariantDirectory, apkName);\n debug('Checking for fallback APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n\n return null;\n}\n\nfunction getApkFileName(\n appName: string,\n buildType: string,\n flavors?: string[] | null,\n cpuArch?: string | null\n) {\n let apkName = `${appName}-`;\n if (flavors) {\n apkName += flavors.reduce((rest, flavor) => `${rest}${flavor}-`, '');\n }\n if (cpuArch) {\n apkName += `${cpuArch}-`;\n }\n apkName += `${buildType}.apk`;\n\n return apkName;\n}\n"],"names":["resolveInstallApkNameAsync","debug","require","device","appName","buildType","flavors","apkVariantDirectory","availableCPUs","getDeviceABIsAsync","push","DeviceABI","universal","join","availableCPU","apkName","getApkFileName","apkPath","path","fs","existsSync","cpuArch","reduce","rest","flavor"],"mappings":"AAAA;;;;QAQsBA,0BAA0B,GAA1BA,0BAA0B;AARjC,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAE+B,IAAA,IAAmC,WAAnC,mCAAmC,CAAA;;;;;;AAGzF,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,wCAAwC,CAAC,AAAsB,AAAC;AAExF,eAAeF,0BAA0B,CAC9CG,MAAoC,EACpC,EAAEC,OAAO,CAAA,EAAEC,SAAS,CAAA,EAAEC,OAAO,CAAA,EAAEC,mBAAmB,CAAA,EAAe,EACjE;IACA,MAAMC,aAAa,GAAG,MAAMC,CAAAA,GAAAA,IAAkB,AAAQ,CAAA,mBAAR,CAACN,MAAM,CAAC,AAAC;IACvDK,aAAa,CAACE,IAAI,CAACC,IAAS,UAAA,CAACC,SAAS,CAAC,CAAC;IAExCX,KAAK,CAAC,kBAAkB,GAAGO,aAAa,CAACK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrDZ,KAAK,CAAC,qBAAqB,GAAGM,mBAAmB,CAAC,CAAC;IAEnD,sCAAsC;IACtC,KAAK,MAAMO,YAAY,IAAIN,aAAa,CAAE;QACxC,MAAMO,OAAO,GAAGC,cAAc,CAACZ,OAAO,EAAEC,SAAS,EAAEC,OAAO,EAAEQ,YAAY,CAAC,AAAC;QAC1E,MAAMG,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACN,mBAAmB,EAAEQ,OAAO,CAAC,AAAC;QACxDd,KAAK,CAAC,sBAAsB,EAAEgB,OAAO,CAAC,CAAC;QACvC,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;YAC1B,OAAOF,OAAO,CAAC;SAChB;KACF;IAED,uEAAuE;IACvE,MAAMA,OAAO,GAAGC,cAAc,CAACZ,OAAO,EAAEC,SAAS,EAAEC,OAAO,CAAC,AAAC;IAC5D,MAAMW,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACN,mBAAmB,EAAEQ,OAAO,CAAC,AAAC;IACxDd,KAAK,CAAC,+BAA+B,EAAEgB,OAAO,CAAC,CAAC;IAChD,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;QAC1B,OAAOF,OAAO,CAAC;KAChB;IAED,OAAO,IAAI,CAAC;CACb;AAED,SAASC,cAAc,CACrBZ,OAAe,EACfC,SAAiB,EACjBC,OAAyB,EACzBe,OAAuB,EACvB;IACA,IAAIN,OAAO,GAAG,CAAC,EAAEX,OAAO,CAAC,CAAC,CAAC,AAAC;IAC5B,IAAIE,OAAO,EAAE;QACXS,OAAO,IAAIT,OAAO,CAACgB,MAAM,CAAC,CAACC,IAAI,EAAEC,MAAM,GAAK,CAAC,EAAED,IAAI,CAAC,EAAEC,MAAM,CAAC,CAAC,CAAC;QAAA,EAAE,EAAE,CAAC,CAAC;KACtE;IACD,IAAIH,OAAO,EAAE;QACXN,OAAO,IAAI,CAAC,EAAEM,OAAO,CAAC,CAAC,CAAC,CAAC;KAC1B;IACDN,OAAO,IAAI,CAAC,EAAEV,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAOU,OAAO,CAAC;CAChB"}
1
+ {"version":3,"sources":["../../../../src/run/android/resolveInstallApkName.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { GradleProps } from './resolveGradleProps';\nimport { Device, DeviceABI, getDeviceABIsAsync } from '../../start/platforms/android/adb';\n\nconst debug = require('debug')('expo:run:android:resolveInstallApkName') as typeof console.log;\n\nexport async function resolveInstallApkNameAsync(\n device: Pick<Device, 'name' | 'pid'>,\n { appName, buildType, flavors, apkVariantDirectory }: GradleProps\n) {\n const availableCPUs = await getDeviceABIsAsync(device);\n availableCPUs.push(DeviceABI.universal);\n\n debug('Supported ABIs: ' + availableCPUs.join(', '));\n debug('Searching for APK: ' + apkVariantDirectory);\n\n // Check for cpu specific builds first\n for (const availableCPU of availableCPUs) {\n const apkName = getApkFileName(appName, buildType, flavors, availableCPU);\n const apkPath = path.join(apkVariantDirectory, apkName);\n debug('Checking for APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n }\n\n // Otherwise use the default apk named after the variant: app-debug.apk\n const apkName = getApkFileName(appName, buildType, flavors);\n const apkPath = path.join(apkVariantDirectory, apkName);\n debug('Checking for fallback APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n\n return null;\n}\n\nfunction getApkFileName(\n appName: string,\n buildType: string,\n flavors?: string[] | null,\n cpuArch?: string | null\n) {\n let apkName = `${appName}-`;\n if (flavors) {\n apkName += flavors.reduce((rest, flavor) => `${rest}${flavor}-`, '');\n }\n if (cpuArch) {\n apkName += `${cpuArch}-`;\n }\n apkName += `${buildType}.apk`;\n\n return apkName;\n}\n"],"names":["resolveInstallApkNameAsync","debug","require","device","appName","buildType","flavors","apkVariantDirectory","availableCPUs","getDeviceABIsAsync","push","DeviceABI","universal","join","availableCPU","apkName","getApkFileName","apkPath","path","fs","existsSync","cpuArch","reduce","rest","flavor"],"mappings":"AAAA;;;;QAQsBA,0BAA0B,GAA1BA,0BAA0B;AARjC,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAG+B,IAAA,IAAmC,WAAnC,mCAAmC,CAAA;;;;;;AAEzF,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,wCAAwC,CAAC,AAAsB,AAAC;AAExF,eAAeF,0BAA0B,CAC9CG,MAAoC,EACpC,EAAEC,OAAO,CAAA,EAAEC,SAAS,CAAA,EAAEC,OAAO,CAAA,EAAEC,mBAAmB,CAAA,EAAe,EACjE;IACA,MAAMC,aAAa,GAAG,MAAMC,CAAAA,GAAAA,IAAkB,AAAQ,CAAA,mBAAR,CAACN,MAAM,CAAC,AAAC;IACvDK,aAAa,CAACE,IAAI,CAACC,IAAS,UAAA,CAACC,SAAS,CAAC,CAAC;IAExCX,KAAK,CAAC,kBAAkB,GAAGO,aAAa,CAACK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrDZ,KAAK,CAAC,qBAAqB,GAAGM,mBAAmB,CAAC,CAAC;IAEnD,sCAAsC;IACtC,KAAK,MAAMO,YAAY,IAAIN,aAAa,CAAE;QACxC,MAAMO,OAAO,GAAGC,cAAc,CAACZ,OAAO,EAAEC,SAAS,EAAEC,OAAO,EAAEQ,YAAY,CAAC,AAAC;QAC1E,MAAMG,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACN,mBAAmB,EAAEQ,OAAO,CAAC,AAAC;QACxDd,KAAK,CAAC,sBAAsB,EAAEgB,OAAO,CAAC,CAAC;QACvC,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;YAC1B,OAAOF,OAAO,CAAC;SAChB;KACF;IAED,uEAAuE;IACvE,MAAMA,OAAO,GAAGC,cAAc,CAACZ,OAAO,EAAEC,SAAS,EAAEC,OAAO,CAAC,AAAC;IAC5D,MAAMW,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACN,mBAAmB,EAAEQ,OAAO,CAAC,AAAC;IACxDd,KAAK,CAAC,+BAA+B,EAAEgB,OAAO,CAAC,CAAC;IAChD,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;QAC1B,OAAOF,OAAO,CAAC;KAChB;IAED,OAAO,IAAI,CAAC;CACb;AAED,SAASC,cAAc,CACrBZ,OAAe,EACfC,SAAiB,EACjBC,OAAyB,EACzBe,OAAuB,EACvB;IACA,IAAIN,OAAO,GAAG,CAAC,EAAEX,OAAO,CAAC,CAAC,CAAC,AAAC;IAC5B,IAAIE,OAAO,EAAE;QACXS,OAAO,IAAIT,OAAO,CAACgB,MAAM,CAAC,CAACC,IAAI,EAAEC,MAAM,GAAK,CAAC,EAAED,IAAI,CAAC,EAAEC,MAAM,CAAC,CAAC,CAAC;QAAA,EAAE,EAAE,CAAC,CAAC;KACtE;IACD,IAAIH,OAAO,EAAE;QACXN,OAAO,IAAI,CAAC,EAAEM,OAAO,CAAC,CAAC,CAAC,CAAC;KAC1B;IACDN,OAAO,IAAI,CAAC,EAAEV,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAOU,OAAO,CAAC;CAChB"}
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.resolveOptionsAsync = resolveOptionsAsync;
6
- var _resolveBundlerProps = require("../resolveBundlerProps");
7
6
  var _resolveDevice = require("./resolveDevice");
8
7
  var _resolveGradleProps = require("./resolveGradleProps");
9
8
  var _resolveLaunchProps = require("./resolveLaunchProps");
9
+ var _resolveBundlerProps = require("../resolveBundlerProps");
10
10
  async function resolveOptionsAsync(projectRoot, options) {
11
11
  var _variant;
12
12
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/run/android/resolveOptions.ts"],"sourcesContent":["import { AndroidDeviceManager } from '../../start/platforms/android/AndroidDeviceManager';\nimport { BundlerProps, resolveBundlerPropsAsync } from '../resolveBundlerProps';\nimport { resolveDeviceAsync } from './resolveDevice';\nimport { GradleProps, resolveGradleProps } from './resolveGradleProps';\nimport { LaunchProps, resolveLaunchPropsAsync } from './resolveLaunchProps';\n\nexport type Options = {\n variant?: string;\n device?: boolean | string;\n port?: number;\n bundler?: boolean;\n install?: boolean;\n buildCache?: boolean;\n};\n\nexport type ResolvedOptions = GradleProps &\n BundlerProps &\n LaunchProps & {\n variant: string;\n buildCache: boolean;\n device: AndroidDeviceManager;\n install: boolean;\n };\n\nexport async function resolveOptionsAsync(\n projectRoot: string,\n options: Options\n): Promise<ResolvedOptions> {\n return {\n ...(await resolveBundlerPropsAsync(projectRoot, options)),\n ...resolveGradleProps(projectRoot, options),\n ...(await resolveLaunchPropsAsync(projectRoot)),\n variant: options.variant ?? 'debug',\n // Resolve the device based on the provided device id or prompt\n // from a list of devices (connected or simulated) that are filtered by the scheme.\n device: await resolveDeviceAsync(options.device),\n buildCache: !!options.buildCache,\n install: !!options.install,\n };\n}\n"],"names":["resolveOptionsAsync","projectRoot","options","resolveBundlerPropsAsync","resolveGradleProps","resolveLaunchPropsAsync","variant","device","resolveDeviceAsync","buildCache","install"],"mappings":"AAAA;;;;QAwBsBA,mBAAmB,GAAnBA,mBAAmB;AAvBc,IAAA,oBAAwB,WAAxB,wBAAwB,CAAA;AAC5C,IAAA,cAAiB,WAAjB,iBAAiB,CAAA;AACJ,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AACjB,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AAoBpE,eAAeA,mBAAmB,CACvCC,WAAmB,EACnBC,OAAgB,EACU;QAKfA,QAAe;IAJ1B,OAAO;QACL,GAAI,MAAMC,CAAAA,GAAAA,oBAAwB,AAAsB,CAAA,yBAAtB,CAACF,WAAW,EAAEC,OAAO,CAAC;QACxD,GAAGE,CAAAA,GAAAA,mBAAkB,AAAsB,CAAA,mBAAtB,CAACH,WAAW,EAAEC,OAAO,CAAC;QAC3C,GAAI,MAAMG,CAAAA,GAAAA,mBAAuB,AAAa,CAAA,wBAAb,CAACJ,WAAW,CAAC;QAC9CK,OAAO,EAAEJ,CAAAA,QAAe,GAAfA,OAAO,CAACI,OAAO,YAAfJ,QAAe,GAAI,OAAO;QACnC,+DAA+D;QAC/D,mFAAmF;QACnFK,MAAM,EAAE,MAAMC,CAAAA,GAAAA,cAAkB,AAAgB,CAAA,mBAAhB,CAACN,OAAO,CAACK,MAAM,CAAC;QAChDE,UAAU,EAAE,CAAC,CAACP,OAAO,CAACO,UAAU;QAChCC,OAAO,EAAE,CAAC,CAACR,OAAO,CAACQ,OAAO;KAC3B,CAAC;CACH"}
1
+ {"version":3,"sources":["../../../../src/run/android/resolveOptions.ts"],"sourcesContent":["import { resolveDeviceAsync } from './resolveDevice';\nimport { GradleProps, resolveGradleProps } from './resolveGradleProps';\nimport { LaunchProps, resolveLaunchPropsAsync } from './resolveLaunchProps';\nimport { AndroidDeviceManager } from '../../start/platforms/android/AndroidDeviceManager';\nimport { BundlerProps, resolveBundlerPropsAsync } from '../resolveBundlerProps';\n\nexport type Options = {\n variant?: string;\n device?: boolean | string;\n port?: number;\n bundler?: boolean;\n install?: boolean;\n buildCache?: boolean;\n};\n\nexport type ResolvedOptions = GradleProps &\n BundlerProps &\n LaunchProps & {\n variant: string;\n buildCache: boolean;\n device: AndroidDeviceManager;\n install: boolean;\n };\n\nexport async function resolveOptionsAsync(\n projectRoot: string,\n options: Options\n): Promise<ResolvedOptions> {\n return {\n ...(await resolveBundlerPropsAsync(projectRoot, options)),\n ...resolveGradleProps(projectRoot, options),\n ...(await resolveLaunchPropsAsync(projectRoot)),\n variant: options.variant ?? 'debug',\n // Resolve the device based on the provided device id or prompt\n // from a list of devices (connected or simulated) that are filtered by the scheme.\n device: await resolveDeviceAsync(options.device),\n buildCache: !!options.buildCache,\n install: !!options.install,\n };\n}\n"],"names":["resolveOptionsAsync","projectRoot","options","resolveBundlerPropsAsync","resolveGradleProps","resolveLaunchPropsAsync","variant","device","resolveDeviceAsync","buildCache","install"],"mappings":"AAAA;;;;QAwBsBA,mBAAmB,GAAnBA,mBAAmB;AAxBN,IAAA,cAAiB,WAAjB,iBAAiB,CAAA;AACJ,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AACjB,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AAEpB,IAAA,oBAAwB,WAAxB,wBAAwB,CAAA;AAoBxE,eAAeA,mBAAmB,CACvCC,WAAmB,EACnBC,OAAgB,EACU;QAKfA,QAAe;IAJ1B,OAAO;QACL,GAAI,MAAMC,CAAAA,GAAAA,oBAAwB,AAAsB,CAAA,yBAAtB,CAACF,WAAW,EAAEC,OAAO,CAAC;QACxD,GAAGE,CAAAA,GAAAA,mBAAkB,AAAsB,CAAA,mBAAtB,CAACH,WAAW,EAAEC,OAAO,CAAC;QAC3C,GAAI,MAAMG,CAAAA,GAAAA,mBAAuB,AAAa,CAAA,wBAAb,CAACJ,WAAW,CAAC;QAC9CK,OAAO,EAAEJ,CAAAA,QAAe,GAAfA,OAAO,CAACI,OAAO,YAAfJ,QAAe,GAAI,OAAO;QACnC,+DAA+D;QAC/D,mFAAmF;QACnFK,MAAM,EAAE,MAAMC,CAAAA,GAAAA,cAAkB,AAAgB,CAAA,mBAAhB,CAACN,OAAO,CAACK,MAAM,CAAC;QAChDE,UAAU,EAAE,CAAC,CAACP,OAAO,CAACO,UAAU;QAChCC,OAAO,EAAE,CAAC,CAACR,OAAO,CAACQ,OAAO;KAC3B,CAAC;CACH"}
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  exports.runAndroidAsync = runAndroidAsync;
6
6
  var _path = _interopRequireDefault(require("path"));
7
+ var _resolveInstallApkName = require("./resolveInstallApkName");
8
+ var _resolveOptions = require("./resolveOptions");
7
9
  var _log = require("../../log");
8
10
  var _gradle = require("../../start/platforms/android/gradle");
9
11
  var _nodeEnv = require("../../utils/nodeEnv");
@@ -11,8 +13,6 @@ var _scheme = require("../../utils/scheme");
11
13
  var _ensureNativeProject = require("../ensureNativeProject");
12
14
  var _hints = require("../hints");
13
15
  var _startBundler = require("../startBundler");
14
- var _resolveInstallApkName = require("./resolveInstallApkName");
15
- var _resolveOptions = require("./resolveOptions");
16
16
  function _interopRequireDefault(obj) {
17
17
  return obj && obj.__esModule ? obj : {
18
18
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/run/android/runAndroidAsync.ts"],"sourcesContent":["import path from 'path';\n\nimport { Log } from '../../log';\nimport { assembleAsync, installAsync } from '../../start/platforms/android/gradle';\nimport { setNodeEnv } from '../../utils/nodeEnv';\nimport { getSchemesForAndroidAsync } from '../../utils/scheme';\nimport { ensureNativeProjectAsync } from '../ensureNativeProject';\nimport { logProjectLogsLocation } from '../hints';\nimport { startBundlerAsync } from '../startBundler';\nimport { resolveInstallApkNameAsync } from './resolveInstallApkName';\nimport { Options, ResolvedOptions, resolveOptionsAsync } from './resolveOptions';\n\nconst debug = require('debug')('expo:run:android');\n\nexport async function runAndroidAsync(projectRoot: string, { install, ...options }: Options) {\n // NOTE: This is a guess, the developer can overwrite with `NODE_ENV`.\n setNodeEnv(options.variant === 'release' ? 'production' : 'development');\n require('@expo/env').load(projectRoot);\n\n await ensureNativeProjectAsync(projectRoot, { platform: 'android', install });\n\n const props = await resolveOptionsAsync(projectRoot, options);\n\n debug('Package name: ' + props.packageName);\n Log.log('› Building app...');\n\n const androidProjectRoot = path.join(projectRoot, 'android');\n\n await assembleAsync(androidProjectRoot, {\n variant: props.variant,\n port: props.port,\n appName: props.appName,\n buildCache: props.buildCache,\n });\n\n const manager = await startBundlerAsync(projectRoot, {\n port: props.port,\n // If a scheme is specified then use that instead of the package name.\n scheme: (await getSchemesForAndroidAsync(projectRoot))?.[0],\n headless: !props.shouldStartBundler,\n });\n\n await installAppAsync(androidProjectRoot, props);\n\n await manager.getDefaultDevServer().openCustomRuntimeAsync(\n 'emulator',\n {\n applicationId: props.packageName,\n },\n { device: props.device.device }\n );\n\n if (props.shouldStartBundler) {\n logProjectLogsLocation();\n }\n}\n\nasync function installAppAsync(androidProjectRoot: string, props: ResolvedOptions) {\n // Find the APK file path\n const apkFile = await resolveInstallApkNameAsync(props.device.device, props);\n\n if (apkFile) {\n // Attempt to install the APK from the file path\n const binaryPath = path.join(props.apkVariantDirectory, apkFile);\n debug('Installing:', binaryPath);\n await props.device.installAppAsync(binaryPath);\n } else {\n // If we cannot resolve the APK file path then we can attempt to install using Gradle.\n // This offers more advanced resolution that we may not have first class support for.\n Log.log('› Failed to locate binary file, installing with Gradle...');\n await installAsync(androidProjectRoot, {\n variant: props.variant ?? 'debug',\n appName: props.appName ?? 'app',\n port: props.port,\n });\n }\n}\n"],"names":["runAndroidAsync","debug","require","projectRoot","install","options","setNodeEnv","variant","load","ensureNativeProjectAsync","platform","props","resolveOptionsAsync","packageName","Log","log","androidProjectRoot","path","join","assembleAsync","port","appName","buildCache","manager","startBundlerAsync","scheme","getSchemesForAndroidAsync","headless","shouldStartBundler","installAppAsync","getDefaultDevServer","openCustomRuntimeAsync","applicationId","device","logProjectLogsLocation","apkFile","resolveInstallApkNameAsync","binaryPath","apkVariantDirectory","installAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/run/android/runAndroidAsync.ts"],"sourcesContent":["import path from 'path';\n\nimport { resolveInstallApkNameAsync } from './resolveInstallApkName';\nimport { Options, ResolvedOptions, resolveOptionsAsync } from './resolveOptions';\nimport { Log } from '../../log';\nimport { assembleAsync, installAsync } from '../../start/platforms/android/gradle';\nimport { setNodeEnv } from '../../utils/nodeEnv';\nimport { getSchemesForAndroidAsync } from '../../utils/scheme';\nimport { ensureNativeProjectAsync } from '../ensureNativeProject';\nimport { logProjectLogsLocation } from '../hints';\nimport { startBundlerAsync } from '../startBundler';\n\nconst debug = require('debug')('expo:run:android');\n\nexport async function runAndroidAsync(projectRoot: string, { install, ...options }: Options) {\n // NOTE: This is a guess, the developer can overwrite with `NODE_ENV`.\n setNodeEnv(options.variant === 'release' ? 'production' : 'development');\n require('@expo/env').load(projectRoot);\n\n await ensureNativeProjectAsync(projectRoot, { platform: 'android', install });\n\n const props = await resolveOptionsAsync(projectRoot, options);\n\n debug('Package name: ' + props.packageName);\n Log.log('› Building app...');\n\n const androidProjectRoot = path.join(projectRoot, 'android');\n\n await assembleAsync(androidProjectRoot, {\n variant: props.variant,\n port: props.port,\n appName: props.appName,\n buildCache: props.buildCache,\n });\n\n const manager = await startBundlerAsync(projectRoot, {\n port: props.port,\n // If a scheme is specified then use that instead of the package name.\n scheme: (await getSchemesForAndroidAsync(projectRoot))?.[0],\n headless: !props.shouldStartBundler,\n });\n\n await installAppAsync(androidProjectRoot, props);\n\n await manager.getDefaultDevServer().openCustomRuntimeAsync(\n 'emulator',\n {\n applicationId: props.packageName,\n },\n { device: props.device.device }\n );\n\n if (props.shouldStartBundler) {\n logProjectLogsLocation();\n }\n}\n\nasync function installAppAsync(androidProjectRoot: string, props: ResolvedOptions) {\n // Find the APK file path\n const apkFile = await resolveInstallApkNameAsync(props.device.device, props);\n\n if (apkFile) {\n // Attempt to install the APK from the file path\n const binaryPath = path.join(props.apkVariantDirectory, apkFile);\n debug('Installing:', binaryPath);\n await props.device.installAppAsync(binaryPath);\n } else {\n // If we cannot resolve the APK file path then we can attempt to install using Gradle.\n // This offers more advanced resolution that we may not have first class support for.\n Log.log('› Failed to locate binary file, installing with Gradle...');\n await installAsync(androidProjectRoot, {\n variant: props.variant ?? 'debug',\n appName: props.appName ?? 'app',\n port: props.port,\n });\n }\n}\n"],"names":["runAndroidAsync","debug","require","projectRoot","install","options","setNodeEnv","variant","load","ensureNativeProjectAsync","platform","props","resolveOptionsAsync","packageName","Log","log","androidProjectRoot","path","join","assembleAsync","port","appName","buildCache","manager","startBundlerAsync","scheme","getSchemesForAndroidAsync","headless","shouldStartBundler","installAppAsync","getDefaultDevServer","openCustomRuntimeAsync","applicationId","device","logProjectLogsLocation","apkFile","resolveInstallApkNameAsync","binaryPath","apkVariantDirectory","installAsync"],"mappings":"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"}
@@ -16,13 +16,13 @@ var _childProcess = require("child_process");
16
16
  var _fs = _interopRequireDefault(require("fs"));
17
17
  var _os = _interopRequireDefault(require("os"));
18
18
  var _path = _interopRequireDefault(require("path"));
19
+ var _configureCodeSigning = require("./codeSigning/configureCodeSigning");
20
+ var _simulatorCodeSigning = require("./codeSigning/simulatorCodeSigning");
19
21
  var Log = _interopRequireWildcard(require("../../log"));
20
22
  var _dir = require("../../utils/dir");
21
23
  var _env = require("../../utils/env");
22
24
  var _errors = require("../../utils/errors");
23
25
  var _terminal = require("../../utils/terminal");
24
- var _configureCodeSigning = require("./codeSigning/configureCodeSigning");
25
- var _simulatorCodeSigning = require("./codeSigning/simulatorCodeSigning");
26
26
  function _interopRequireDefault(obj) {
27
27
  return obj && obj.__esModule ? obj : {
28
28
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/run/ios/XcodeBuild.ts"],"sourcesContent":["import { ExpoRunFormatter } from '@expo/xcpretty';\nimport chalk from 'chalk';\nimport { spawn, SpawnOptionsWithoutStdio } from 'child_process';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport * as Log from '../../log';\nimport { ensureDirectory } from '../../utils/dir';\nimport { env } from '../../utils/env';\nimport { AbortCommandError, CommandError } from '../../utils/errors';\nimport { getUserTerminal } from '../../utils/terminal';\nimport { BuildProps, ProjectInfo } from './XcodeBuild.types';\nimport { ensureDeviceIsCodeSignedForDeploymentAsync } from './codeSigning/configureCodeSigning';\nimport { simulatorBuildRequiresCodeSigning } from './codeSigning/simulatorCodeSigning';\nexport function logPrettyItem(message: string) {\n Log.log(chalk`{whiteBright \\u203A} ${message}`);\n}\n\n/**\n *\n * @returns '/Users/evanbacon/Library/Developer/Xcode/DerivedData/myapp-gpgjqjodrxtervaufttwnsgimhrx/Build/Products/Debug-iphonesimulator/myapp.app'\n */\nexport function getAppBinaryPath(buildOutput: string) {\n // Matches what's used in \"Bundle React Native code and images\" script.\n // Requires that `-hideShellScriptEnvironment` is not included in the build command (extra logs).\n\n // Like `\\=/Users/evanbacon/Library/Developer/Xcode/DerivedData/Exponent-anpuosnglkxokahjhfszejloqfvo/Build/Products/Debug-iphonesimulator`\n const CONFIGURATION_BUILD_DIR = extractEnvVariableFromBuild(\n buildOutput,\n 'CONFIGURATION_BUILD_DIR'\n ).sort(\n // Longer name means more suffixes, we want the shortest possible one to be first.\n // Massive projects (like Expo Go) can sometimes print multiple different sets of environment variables.\n // This can become an issue with some\n (a, b) => a.length - b.length\n );\n // Like `Exponent.app`\n const UNLOCALIZED_RESOURCES_FOLDER_PATH = extractEnvVariableFromBuild(\n buildOutput,\n 'UNLOCALIZED_RESOURCES_FOLDER_PATH'\n );\n\n const binaryPath = path.join(\n // Use the shortest defined env variable (usually there's just one).\n CONFIGURATION_BUILD_DIR[0],\n // Use the last defined env variable.\n UNLOCALIZED_RESOURCES_FOLDER_PATH[UNLOCALIZED_RESOURCES_FOLDER_PATH.length - 1]\n );\n\n // If the app has a space in the name it'll fail because it isn't escaped properly by Xcode.\n return getEscapedPath(binaryPath);\n}\n\nexport function getEscapedPath(filePath: string): string {\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n const unescapedPath = filePath.split(/\\\\ /).join(' ');\n if (fs.existsSync(unescapedPath)) {\n return unescapedPath;\n }\n throw new CommandError(\n 'XCODE_BUILD',\n `Unexpected: Generated app at path \"${filePath}\" cannot be read, the app cannot be installed. Please report this and build onto a simulator.`\n );\n}\n\nexport function extractEnvVariableFromBuild(buildOutput: string, variableName: string) {\n // Xcode can sometimes escape `=` with a backslash or put the value in quotes\n const reg = new RegExp(`export ${variableName}\\\\\\\\?=(.*)$`, 'mg');\n const matched = [...buildOutput.matchAll(reg)];\n\n if (!matched || !matched.length) {\n throw new CommandError(\n 'XCODE_BUILD',\n `Malformed xcodebuild results: \"${variableName}\" variable was not generated in build output. Please report this issue and run your project with Xcode instead.`\n );\n }\n return matched.map((value) => value[1]).filter(Boolean) as string[];\n}\n\nexport function getProcessOptions({\n packager,\n shouldSkipInitialBundling,\n terminal,\n port,\n}: {\n packager: boolean;\n shouldSkipInitialBundling?: boolean;\n terminal: string | undefined;\n port: number;\n}): SpawnOptionsWithoutStdio {\n const SKIP_BUNDLING = shouldSkipInitialBundling ? '1' : undefined;\n if (packager) {\n return {\n env: {\n ...process.env,\n RCT_TERMINAL: terminal,\n SKIP_BUNDLING,\n RCT_METRO_PORT: port.toString(),\n },\n };\n }\n\n return {\n env: {\n ...process.env,\n RCT_TERMINAL: terminal,\n SKIP_BUNDLING,\n // Always skip launching the packager from a build script.\n // The script is used for people building their project directly from Xcode.\n // This essentially means \"› Running script 'Start Packager'\" does nothing.\n RCT_NO_LAUNCH_PACKAGER: 'true',\n // FORCE_BUNDLING: '0'\n },\n };\n}\n\nexport async function getXcodeBuildArgsAsync(\n props: Pick<\n BuildProps,\n | 'buildCache'\n | 'projectRoot'\n | 'xcodeProject'\n | 'configuration'\n | 'scheme'\n | 'device'\n | 'isSimulator'\n >\n): Promise<string[]> {\n const args = [\n props.xcodeProject.isWorkspace ? '-workspace' : '-project',\n props.xcodeProject.name,\n '-configuration',\n props.configuration,\n '-scheme',\n props.scheme,\n '-destination',\n `id=${props.device.udid}`,\n ];\n\n if (!props.isSimulator || simulatorBuildRequiresCodeSigning(props.projectRoot)) {\n const developmentTeamId = await ensureDeviceIsCodeSignedForDeploymentAsync(props.projectRoot);\n if (developmentTeamId) {\n args.push(\n `DEVELOPMENT_TEAM=${developmentTeamId}`,\n '-allowProvisioningUpdates',\n '-allowProvisioningDeviceRegistration'\n );\n }\n }\n\n // Add last\n if (props.buildCache === false) {\n args.push(\n // Will first clean the derived data folder.\n 'clean',\n // Then build step must be added otherwise the process will simply clean and exit.\n 'build'\n );\n }\n return args;\n}\n\nfunction spawnXcodeBuild(\n args: string[],\n options: SpawnOptionsWithoutStdio,\n { onData }: { onData: (data: string) => void }\n): Promise<{ code: number | null; results: string; error: string }> {\n const buildProcess = spawn('xcodebuild', args, options);\n\n let results = '';\n let error = '';\n\n buildProcess.stdout.on('data', (data: Buffer) => {\n const stringData = data.toString();\n results += stringData;\n onData(stringData);\n });\n\n buildProcess.stderr.on('data', (data: Buffer) => {\n const stringData = data instanceof Buffer ? data.toString() : data;\n error += stringData;\n });\n\n return new Promise(async (resolve, reject) => {\n buildProcess.on('close', (code: number) => {\n resolve({ code, results, error });\n });\n });\n}\n\nasync function spawnXcodeBuildWithFlush(\n args: string[],\n options: SpawnOptionsWithoutStdio,\n { onFlush }: { onFlush: (data: string) => void }\n): Promise<{ code: number | null; results: string; error: string }> {\n let currentBuffer = '';\n\n // Data can be sent in chunks that would have no relevance to our regex\n // this can cause massive slowdowns, so we need to ensure the data is complete before attempting to parse it.\n function flushBuffer() {\n if (!currentBuffer) {\n return;\n }\n\n const data = currentBuffer;\n // Reset buffer.\n currentBuffer = '';\n // Process data.\n onFlush(data);\n }\n\n const data = await spawnXcodeBuild(args, options, {\n onData(stringData) {\n currentBuffer += stringData;\n // Only flush the data if we have a full line.\n if (currentBuffer.endsWith(os.EOL)) {\n flushBuffer();\n }\n },\n });\n\n // Flush log data at the end just in case we missed something.\n flushBuffer();\n return data;\n}\n\nasync function spawnXcodeBuildWithFormat(\n args: string[],\n options: SpawnOptionsWithoutStdio,\n { projectRoot, xcodeProject }: { projectRoot: string; xcodeProject: ProjectInfo }\n): Promise<{ code: number | null; results: string; error: string; formatter: ExpoRunFormatter }> {\n Log.debug(` xcodebuild ${args.join(' ')}`);\n\n logPrettyItem(chalk.bold`Planning build`);\n\n const formatter = ExpoRunFormatter.create(projectRoot, {\n xcodeProject,\n isDebug: env.EXPO_DEBUG,\n });\n\n const results = await spawnXcodeBuildWithFlush(args, options, {\n onFlush(data) {\n // Process data.\n for (const line of formatter.pipe(data)) {\n // Log parsed results.\n Log.log(line);\n }\n },\n });\n\n Log.debug(`Exited with code: ${results.code}`);\n\n if (\n // User cancelled with ctrl-c\n results.code === null ||\n // Build interrupted\n results.code === 75\n ) {\n throw new AbortCommandError();\n }\n\n Log.log(formatter.getBuildSummary());\n\n return { ...results, formatter };\n}\n\nexport async function buildAsync(props: BuildProps): Promise<string> {\n const args = await getXcodeBuildArgsAsync(props);\n\n const { projectRoot, xcodeProject, shouldSkipInitialBundling, port } = props;\n\n const { code, results, formatter, error } = await spawnXcodeBuildWithFormat(\n args,\n getProcessOptions({\n packager: false,\n terminal: getUserTerminal(),\n shouldSkipInitialBundling,\n port,\n }),\n {\n projectRoot,\n xcodeProject,\n }\n );\n\n const logFilePath = writeBuildLogs(projectRoot, results, error);\n\n if (code !== 0) {\n // Determine if the logger found any errors;\n const wasErrorPresented = !!formatter.errors.length;\n\n if (wasErrorPresented) {\n // This has a flaw, if the user is missing a file, and there is a script error, only the missing file error will be shown.\n // They will only see the script error if they fix the missing file and rerun.\n // The flaw can be fixed by catching script errors in the custom logger.\n throw new CommandError(\n `Failed to build iOS project. \"xcodebuild\" exited with error code ${code}.`\n );\n }\n\n _assertXcodeBuildResults(code, results, error, xcodeProject, logFilePath);\n }\n return results;\n}\n\n// Exposed for testing.\nexport function _assertXcodeBuildResults(\n code: number | null,\n results: string,\n error: string,\n xcodeProject: { name: string },\n logFilePath: string\n): void {\n const errorTitle = `Failed to build iOS project. \"xcodebuild\" exited with error code ${code}.`;\n\n const throwWithMessage = (message: string): never => {\n throw new CommandError(\n `${errorTitle}\\nTo view more error logs, try building the app with Xcode directly, by opening ${xcodeProject.name}.\\n\\n` +\n message +\n `Build logs written to ${chalk.underline(logFilePath)}`\n );\n };\n\n const localizedError = error.match(/NSLocalizedFailure = \"(.*)\"/)?.[1];\n\n if (localizedError) {\n throwWithMessage(chalk.bold(localizedError) + '\\n\\n');\n }\n // Show all the log info because often times the error is coming from a shell script,\n // that invoked a node script, that started metro, which threw an error.\n\n throwWithMessage(results + '\\n\\n' + error);\n}\n\nfunction writeBuildLogs(projectRoot: string, buildOutput: string, errorOutput: string) {\n const [logFilePath, errorFilePath] = getErrorLogFilePath(projectRoot);\n\n fs.writeFileSync(logFilePath, buildOutput);\n fs.writeFileSync(errorFilePath, errorOutput);\n return logFilePath;\n}\n\nfunction getErrorLogFilePath(projectRoot: string): [string, string] {\n const folder = path.join(projectRoot, '.expo');\n ensureDirectory(folder);\n return [path.join(folder, 'xcodebuild.log'), path.join(folder, 'xcodebuild-error.log')];\n}\n"],"names":["logPrettyItem","getAppBinaryPath","getEscapedPath","extractEnvVariableFromBuild","getProcessOptions","getXcodeBuildArgsAsync","buildAsync","_assertXcodeBuildResults","Log","message","log","chalk","buildOutput","CONFIGURATION_BUILD_DIR","sort","a","b","length","UNLOCALIZED_RESOURCES_FOLDER_PATH","binaryPath","path","join","filePath","fs","existsSync","unescapedPath","split","CommandError","variableName","reg","RegExp","matched","matchAll","map","value","filter","Boolean","packager","shouldSkipInitialBundling","terminal","port","SKIP_BUNDLING","undefined","env","process","RCT_TERMINAL","RCT_METRO_PORT","toString","RCT_NO_LAUNCH_PACKAGER","props","args","xcodeProject","isWorkspace","name","configuration","scheme","device","udid","isSimulator","simulatorBuildRequiresCodeSigning","projectRoot","developmentTeamId","ensureDeviceIsCodeSignedForDeploymentAsync","push","buildCache","spawnXcodeBuild","options","onData","buildProcess","spawn","results","error","stdout","on","data","stringData","stderr","Buffer","Promise","resolve","reject","code","spawnXcodeBuildWithFlush","onFlush","currentBuffer","flushBuffer","endsWith","os","EOL","spawnXcodeBuildWithFormat","debug","bold","formatter","ExpoRunFormatter","create","isDebug","EXPO_DEBUG","line","pipe","AbortCommandError","getBuildSummary","getUserTerminal","logFilePath","writeBuildLogs","wasErrorPresented","errors","errorTitle","throwWithMessage","underline","localizedError","match","errorOutput","errorFilePath","getErrorLogFilePath","writeFileSync","folder","ensureDirectory"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/run/ios/XcodeBuild.ts"],"sourcesContent":["import { ExpoRunFormatter } from '@expo/xcpretty';\nimport chalk from 'chalk';\nimport { spawn, SpawnOptionsWithoutStdio } from 'child_process';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { BuildProps, ProjectInfo } from './XcodeBuild.types';\nimport { ensureDeviceIsCodeSignedForDeploymentAsync } from './codeSigning/configureCodeSigning';\nimport { simulatorBuildRequiresCodeSigning } from './codeSigning/simulatorCodeSigning';\nimport * as Log from '../../log';\nimport { ensureDirectory } from '../../utils/dir';\nimport { env } from '../../utils/env';\nimport { AbortCommandError, CommandError } from '../../utils/errors';\nimport { getUserTerminal } from '../../utils/terminal';\nexport function logPrettyItem(message: string) {\n Log.log(chalk`{whiteBright \\u203A} ${message}`);\n}\n\n/**\n *\n * @returns '/Users/evanbacon/Library/Developer/Xcode/DerivedData/myapp-gpgjqjodrxtervaufttwnsgimhrx/Build/Products/Debug-iphonesimulator/myapp.app'\n */\nexport function getAppBinaryPath(buildOutput: string) {\n // Matches what's used in \"Bundle React Native code and images\" script.\n // Requires that `-hideShellScriptEnvironment` is not included in the build command (extra logs).\n\n // Like `\\=/Users/evanbacon/Library/Developer/Xcode/DerivedData/Exponent-anpuosnglkxokahjhfszejloqfvo/Build/Products/Debug-iphonesimulator`\n const CONFIGURATION_BUILD_DIR = extractEnvVariableFromBuild(\n buildOutput,\n 'CONFIGURATION_BUILD_DIR'\n ).sort(\n // Longer name means more suffixes, we want the shortest possible one to be first.\n // Massive projects (like Expo Go) can sometimes print multiple different sets of environment variables.\n // This can become an issue with some\n (a, b) => a.length - b.length\n );\n // Like `Exponent.app`\n const UNLOCALIZED_RESOURCES_FOLDER_PATH = extractEnvVariableFromBuild(\n buildOutput,\n 'UNLOCALIZED_RESOURCES_FOLDER_PATH'\n );\n\n const binaryPath = path.join(\n // Use the shortest defined env variable (usually there's just one).\n CONFIGURATION_BUILD_DIR[0],\n // Use the last defined env variable.\n UNLOCALIZED_RESOURCES_FOLDER_PATH[UNLOCALIZED_RESOURCES_FOLDER_PATH.length - 1]\n );\n\n // If the app has a space in the name it'll fail because it isn't escaped properly by Xcode.\n return getEscapedPath(binaryPath);\n}\n\nexport function getEscapedPath(filePath: string): string {\n if (fs.existsSync(filePath)) {\n return filePath;\n }\n const unescapedPath = filePath.split(/\\\\ /).join(' ');\n if (fs.existsSync(unescapedPath)) {\n return unescapedPath;\n }\n throw new CommandError(\n 'XCODE_BUILD',\n `Unexpected: Generated app at path \"${filePath}\" cannot be read, the app cannot be installed. Please report this and build onto a simulator.`\n );\n}\n\nexport function extractEnvVariableFromBuild(buildOutput: string, variableName: string) {\n // Xcode can sometimes escape `=` with a backslash or put the value in quotes\n const reg = new RegExp(`export ${variableName}\\\\\\\\?=(.*)$`, 'mg');\n const matched = [...buildOutput.matchAll(reg)];\n\n if (!matched || !matched.length) {\n throw new CommandError(\n 'XCODE_BUILD',\n `Malformed xcodebuild results: \"${variableName}\" variable was not generated in build output. Please report this issue and run your project with Xcode instead.`\n );\n }\n return matched.map((value) => value[1]).filter(Boolean) as string[];\n}\n\nexport function getProcessOptions({\n packager,\n shouldSkipInitialBundling,\n terminal,\n port,\n}: {\n packager: boolean;\n shouldSkipInitialBundling?: boolean;\n terminal: string | undefined;\n port: number;\n}): SpawnOptionsWithoutStdio {\n const SKIP_BUNDLING = shouldSkipInitialBundling ? '1' : undefined;\n if (packager) {\n return {\n env: {\n ...process.env,\n RCT_TERMINAL: terminal,\n SKIP_BUNDLING,\n RCT_METRO_PORT: port.toString(),\n },\n };\n }\n\n return {\n env: {\n ...process.env,\n RCT_TERMINAL: terminal,\n SKIP_BUNDLING,\n // Always skip launching the packager from a build script.\n // The script is used for people building their project directly from Xcode.\n // This essentially means \"› Running script 'Start Packager'\" does nothing.\n RCT_NO_LAUNCH_PACKAGER: 'true',\n // FORCE_BUNDLING: '0'\n },\n };\n}\n\nexport async function getXcodeBuildArgsAsync(\n props: Pick<\n BuildProps,\n | 'buildCache'\n | 'projectRoot'\n | 'xcodeProject'\n | 'configuration'\n | 'scheme'\n | 'device'\n | 'isSimulator'\n >\n): Promise<string[]> {\n const args = [\n props.xcodeProject.isWorkspace ? '-workspace' : '-project',\n props.xcodeProject.name,\n '-configuration',\n props.configuration,\n '-scheme',\n props.scheme,\n '-destination',\n `id=${props.device.udid}`,\n ];\n\n if (!props.isSimulator || simulatorBuildRequiresCodeSigning(props.projectRoot)) {\n const developmentTeamId = await ensureDeviceIsCodeSignedForDeploymentAsync(props.projectRoot);\n if (developmentTeamId) {\n args.push(\n `DEVELOPMENT_TEAM=${developmentTeamId}`,\n '-allowProvisioningUpdates',\n '-allowProvisioningDeviceRegistration'\n );\n }\n }\n\n // Add last\n if (props.buildCache === false) {\n args.push(\n // Will first clean the derived data folder.\n 'clean',\n // Then build step must be added otherwise the process will simply clean and exit.\n 'build'\n );\n }\n return args;\n}\n\nfunction spawnXcodeBuild(\n args: string[],\n options: SpawnOptionsWithoutStdio,\n { onData }: { onData: (data: string) => void }\n): Promise<{ code: number | null; results: string; error: string }> {\n const buildProcess = spawn('xcodebuild', args, options);\n\n let results = '';\n let error = '';\n\n buildProcess.stdout.on('data', (data: Buffer) => {\n const stringData = data.toString();\n results += stringData;\n onData(stringData);\n });\n\n buildProcess.stderr.on('data', (data: Buffer) => {\n const stringData = data instanceof Buffer ? data.toString() : data;\n error += stringData;\n });\n\n return new Promise(async (resolve, reject) => {\n buildProcess.on('close', (code: number) => {\n resolve({ code, results, error });\n });\n });\n}\n\nasync function spawnXcodeBuildWithFlush(\n args: string[],\n options: SpawnOptionsWithoutStdio,\n { onFlush }: { onFlush: (data: string) => void }\n): Promise<{ code: number | null; results: string; error: string }> {\n let currentBuffer = '';\n\n // Data can be sent in chunks that would have no relevance to our regex\n // this can cause massive slowdowns, so we need to ensure the data is complete before attempting to parse it.\n function flushBuffer() {\n if (!currentBuffer) {\n return;\n }\n\n const data = currentBuffer;\n // Reset buffer.\n currentBuffer = '';\n // Process data.\n onFlush(data);\n }\n\n const data = await spawnXcodeBuild(args, options, {\n onData(stringData) {\n currentBuffer += stringData;\n // Only flush the data if we have a full line.\n if (currentBuffer.endsWith(os.EOL)) {\n flushBuffer();\n }\n },\n });\n\n // Flush log data at the end just in case we missed something.\n flushBuffer();\n return data;\n}\n\nasync function spawnXcodeBuildWithFormat(\n args: string[],\n options: SpawnOptionsWithoutStdio,\n { projectRoot, xcodeProject }: { projectRoot: string; xcodeProject: ProjectInfo }\n): Promise<{ code: number | null; results: string; error: string; formatter: ExpoRunFormatter }> {\n Log.debug(` xcodebuild ${args.join(' ')}`);\n\n logPrettyItem(chalk.bold`Planning build`);\n\n const formatter = ExpoRunFormatter.create(projectRoot, {\n xcodeProject,\n isDebug: env.EXPO_DEBUG,\n });\n\n const results = await spawnXcodeBuildWithFlush(args, options, {\n onFlush(data) {\n // Process data.\n for (const line of formatter.pipe(data)) {\n // Log parsed results.\n Log.log(line);\n }\n },\n });\n\n Log.debug(`Exited with code: ${results.code}`);\n\n if (\n // User cancelled with ctrl-c\n results.code === null ||\n // Build interrupted\n results.code === 75\n ) {\n throw new AbortCommandError();\n }\n\n Log.log(formatter.getBuildSummary());\n\n return { ...results, formatter };\n}\n\nexport async function buildAsync(props: BuildProps): Promise<string> {\n const args = await getXcodeBuildArgsAsync(props);\n\n const { projectRoot, xcodeProject, shouldSkipInitialBundling, port } = props;\n\n const { code, results, formatter, error } = await spawnXcodeBuildWithFormat(\n args,\n getProcessOptions({\n packager: false,\n terminal: getUserTerminal(),\n shouldSkipInitialBundling,\n port,\n }),\n {\n projectRoot,\n xcodeProject,\n }\n );\n\n const logFilePath = writeBuildLogs(projectRoot, results, error);\n\n if (code !== 0) {\n // Determine if the logger found any errors;\n const wasErrorPresented = !!formatter.errors.length;\n\n if (wasErrorPresented) {\n // This has a flaw, if the user is missing a file, and there is a script error, only the missing file error will be shown.\n // They will only see the script error if they fix the missing file and rerun.\n // The flaw can be fixed by catching script errors in the custom logger.\n throw new CommandError(\n `Failed to build iOS project. \"xcodebuild\" exited with error code ${code}.`\n );\n }\n\n _assertXcodeBuildResults(code, results, error, xcodeProject, logFilePath);\n }\n return results;\n}\n\n// Exposed for testing.\nexport function _assertXcodeBuildResults(\n code: number | null,\n results: string,\n error: string,\n xcodeProject: { name: string },\n logFilePath: string\n): void {\n const errorTitle = `Failed to build iOS project. \"xcodebuild\" exited with error code ${code}.`;\n\n const throwWithMessage = (message: string): never => {\n throw new CommandError(\n `${errorTitle}\\nTo view more error logs, try building the app with Xcode directly, by opening ${xcodeProject.name}.\\n\\n` +\n message +\n `Build logs written to ${chalk.underline(logFilePath)}`\n );\n };\n\n const localizedError = error.match(/NSLocalizedFailure = \"(.*)\"/)?.[1];\n\n if (localizedError) {\n throwWithMessage(chalk.bold(localizedError) + '\\n\\n');\n }\n // Show all the log info because often times the error is coming from a shell script,\n // that invoked a node script, that started metro, which threw an error.\n\n throwWithMessage(results + '\\n\\n' + error);\n}\n\nfunction writeBuildLogs(projectRoot: string, buildOutput: string, errorOutput: string) {\n const [logFilePath, errorFilePath] = getErrorLogFilePath(projectRoot);\n\n fs.writeFileSync(logFilePath, buildOutput);\n fs.writeFileSync(errorFilePath, errorOutput);\n return logFilePath;\n}\n\nfunction getErrorLogFilePath(projectRoot: string): [string, string] {\n const folder = path.join(projectRoot, '.expo');\n ensureDirectory(folder);\n return [path.join(folder, 'xcodebuild.log'), path.join(folder, 'xcodebuild-error.log')];\n}\n"],"names":["logPrettyItem","getAppBinaryPath","getEscapedPath","extractEnvVariableFromBuild","getProcessOptions","getXcodeBuildArgsAsync","buildAsync","_assertXcodeBuildResults","Log","message","log","chalk","buildOutput","CONFIGURATION_BUILD_DIR","sort","a","b","length","UNLOCALIZED_RESOURCES_FOLDER_PATH","binaryPath","path","join","filePath","fs","existsSync","unescapedPath","split","CommandError","variableName","reg","RegExp","matched","matchAll","map","value","filter","Boolean","packager","shouldSkipInitialBundling","terminal","port","SKIP_BUNDLING","undefined","env","process","RCT_TERMINAL","RCT_METRO_PORT","toString","RCT_NO_LAUNCH_PACKAGER","props","args","xcodeProject","isWorkspace","name","configuration","scheme","device","udid","isSimulator","simulatorBuildRequiresCodeSigning","projectRoot","developmentTeamId","ensureDeviceIsCodeSignedForDeploymentAsync","push","buildCache","spawnXcodeBuild","options","onData","buildProcess","spawn","results","error","stdout","on","data","stringData","stderr","Buffer","Promise","resolve","reject","code","spawnXcodeBuildWithFlush","onFlush","currentBuffer","flushBuffer","endsWith","os","EOL","spawnXcodeBuildWithFormat","debug","bold","formatter","ExpoRunFormatter","create","isDebug","EXPO_DEBUG","line","pipe","AbortCommandError","getBuildSummary","getUserTerminal","logFilePath","writeBuildLogs","wasErrorPresented","errors","errorTitle","throwWithMessage","underline","localizedError","match","errorOutput","errorFilePath","getErrorLogFilePath","writeFileSync","folder","ensureDirectory"],"mappings":"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"}
@@ -7,15 +7,15 @@ exports.runOnDevice = runOnDevice;
7
7
  var _debug = _interopRequireDefault(require("debug"));
8
8
  var _fs = _interopRequireDefault(require("fs"));
9
9
  var _path = _interopRequireDefault(require("path"));
10
+ var _clientManager = require("./ClientManager");
11
+ var _lockdowndClient = require("./client/LockdowndClient");
12
+ var _usbmuxdClient = require("./client/UsbmuxdClient");
13
+ var _afcprotocol = require("./protocol/AFCProtocol");
10
14
  var _log = require("../../../log");
11
15
  var _xcodeDeveloperDiskImagePrerequisite = require("../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite");
12
16
  var _delay = require("../../../utils/delay");
13
17
  var _errors = require("../../../utils/errors");
14
18
  var _exit = require("../../../utils/exit");
15
- var _clientManager = require("./ClientManager");
16
- var _lockdowndClient = require("./client/LockdowndClient");
17
- var _usbmuxdClient = require("./client/UsbmuxdClient");
18
- var _afcprotocol = require("./protocol/AFCProtocol");
19
19
  function _interopRequireDefault(obj) {
20
20
  return obj && obj.__esModule ? obj : {
21
21
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/run/ios/appleDevice/AppleDevice.ts"],"sourcesContent":["import Debug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { ClientManager } from './ClientManager';\nimport { IPLookupResult, OnInstallProgressCallback } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { UsbmuxdClient } from './client/UsbmuxdClient';\nimport { AFC_STATUS, AFCError } from './protocol/AFCProtocol';\n\nconst debug = Debug('expo:apple-device');\n\n// NOTE(EvanBacon): I have a feeling this shape will change with new iOS versions (tested against iOS 15).\nexport interface ConnectedDevice {\n /** @example `00008101-001964A22629003A` */\n udid: string;\n /** @example `Evan's phone` */\n name: string;\n /** @example `iPhone13,4` */\n model: string;\n /** @example `device` */\n deviceType: 'device' | 'catalyst';\n /** @example `USB` */\n connectionType: 'USB' | 'Network';\n /** @example `15.4.1` */\n osVersion: string;\n}\n\n/** @returns a list of connected Apple devices. */\nexport async function getConnectedDevicesAsync(): Promise<ConnectedDevice[]> {\n const client = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const devices = await client.getDevices();\n client.socket.end();\n\n return Promise.all(\n devices.map(async (device): Promise<ConnectedDevice> => {\n const socket = await new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket()).connect(\n device,\n 62078\n );\n const deviceValues = await new LockdowndClient(socket).getAllValues();\n socket.end();\n // TODO(EvanBacon): Add support for osType (ipad, watchos, etc)\n return {\n // TODO(EvanBacon): Better name\n name: deviceValues.DeviceName ?? deviceValues.ProductType ?? 'unknown iOS device',\n model: deviceValues.ProductType,\n osVersion: deviceValues.ProductVersion,\n deviceType: 'device',\n connectionType: device.Properties.ConnectionType,\n udid: device.Properties.SerialNumber,\n };\n })\n );\n}\n\n/** Install and run an Apple app binary on a connected Apple device. */\nexport async function runOnDevice({\n udid,\n appPath,\n bundleId,\n waitForApp,\n deltaPath,\n onProgress,\n}: {\n /** Apple device UDID */\n udid: string;\n /** File path to the app binary (ipa) */\n appPath: string;\n /** Bundle identifier for the app at `appPath` */\n bundleId: string;\n /** Wait for the app to launch before returning */\n waitForApp: boolean;\n /** File path to the app deltas folder to use for faster subsequent installs */\n deltaPath: string;\n /** Callback to be called with progress updates */\n onProgress: OnInstallProgressCallback;\n}) {\n const clientManager = await ClientManager.create(udid);\n\n try {\n await mountDeveloperDiskImage(clientManager);\n\n const packageName = path.basename(appPath);\n const destPackagePath = path.join('PublicStaging', packageName);\n\n await uploadApp(clientManager, { appBinaryPath: appPath, destinationPath: destPackagePath });\n\n const installer = await clientManager.getInstallationProxyClient();\n await installer.installApp(\n destPackagePath,\n bundleId,\n {\n // https://github.com/ios-control/ios-deploy/blob/0f2ffb1e564aa67a2dfca7cdf13de47ce489d835/src/ios-deploy/ios-deploy.m#L2491-L2508\n ApplicationsType: 'Any',\n\n CFBundleIdentifier: bundleId,\n CloseOnInvalidate: '1',\n InvalidateOnDetach: '1',\n IsUserInitiated: '1',\n // Disable checking for wifi devices, this is nominally faster.\n PreferWifi: '0',\n // Only info I could find on these:\n // https://github.com/wwxxyx/Quectel_BG96/blob/310876f90fc1093a59e45e381160eddcc31697d0/Apple_Homekit/homekit_certification_tools/ATS%206/ATS%206/ATS.app/Contents/Frameworks/CaptureKit.framework/Versions/A/Resources/MobileDevice/MobileInstallation.h#L112-L121\n PackageType: 'Developer',\n ShadowParentKey: deltaPath,\n // SkipUninstall: '1'\n },\n onProgress\n );\n\n const {\n // TODO(EvanBacon): This can be undefined when querying App Clips.\n [bundleId]: appInfo,\n } = await installer.lookupApp([bundleId]);\n\n if (appInfo) {\n // launch fails with EBusy or ENotFound if you try to launch immediately after install\n await delayAsync(200);\n const debugServerClient = await launchApp(clientManager, { appInfo, detach: !waitForApp });\n if (waitForApp) {\n installExitHooks(async () => {\n // causes continue() to return\n debugServerClient.halt();\n // give continue() time to return response\n await delayAsync(64);\n });\n\n debug(`Waiting for app to close...\\n`);\n const result = await debugServerClient.continue();\n // TODO: I have no idea what this packet means yet (successful close?)\n // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app\n if (result !== 'W00') {\n await debugServerClient.kill();\n }\n }\n } else {\n Log.warn(`App \"${bundleId}\" installed but couldn't be launched. Open on device manually.`);\n }\n } finally {\n clientManager.end();\n }\n}\n\n/** Mount the developer disk image for Xcode. */\nasync function mountDeveloperDiskImage(clientManager: ClientManager) {\n const imageMounter = await clientManager.getMobileImageMounterClient();\n // Check if already mounted. If not, mount.\n if (!(await imageMounter.lookupImage()).ImageSignature) {\n // verify DeveloperDiskImage exists (TODO: how does this work on Windows/Linux?)\n // TODO: if windows/linux, download?\n const version = await (await clientManager.getLockdowndClient()).getValue('ProductVersion');\n const developerDiskImagePath = await XcodeDeveloperDiskImagePrerequisite.instance.assertAsync({\n version,\n });\n const developerDiskImageSig = fs.readFileSync(`${developerDiskImagePath}.signature`);\n await imageMounter.uploadImage(developerDiskImagePath, developerDiskImageSig);\n await imageMounter.mountImage(developerDiskImagePath, developerDiskImageSig);\n }\n}\n\nasync function uploadApp(\n clientManager: ClientManager,\n { appBinaryPath, destinationPath }: { appBinaryPath: string; destinationPath: string }\n) {\n const afcClient = await clientManager.getAFCClient();\n try {\n await afcClient.getFileInfo('PublicStaging');\n } catch (err: any) {\n if (err instanceof AFCError && err.status === AFC_STATUS.OBJECT_NOT_FOUND) {\n await afcClient.makeDirectory('PublicStaging');\n } else {\n throw err;\n }\n }\n await afcClient.uploadDirectory(appBinaryPath, destinationPath);\n}\n\nasync function launchApp(\n clientManager: ClientManager,\n { appInfo, detach }: { appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n let tries = 0;\n while (tries < 3) {\n const debugServerClient = await clientManager.getDebugserverClient();\n await debugServerClient.setMaxPacketSize(1024);\n await debugServerClient.setWorkingDir(appInfo.Container);\n await debugServerClient.launchApp(appInfo.Path, appInfo.CFBundleExecutable);\n\n const result = await debugServerClient.checkLaunchSuccess();\n if (result === 'OK') {\n if (detach) {\n // https://github.com/libimobiledevice/libimobiledevice/blob/25059d4c7d75e03aab516af2929d7c6e6d4c17de/tools/idevicedebug.c#L455-L464\n const res = await debugServerClient.sendCommand('D', []);\n debug('Disconnect from debug server request:', res);\n if (res !== 'OK') {\n console.warn(\n 'Something went wrong while attempting to disconnect from iOS debug server, you may need to reopen the app manually.'\n );\n }\n }\n\n return debugServerClient;\n } else if (result === 'EBusy' || result === 'ENotFound') {\n debug('Device busy or app not found, trying to launch again in .5s...');\n tries++;\n debugServerClient.socket.end();\n await delayAsync(500);\n } else {\n throw new CommandError(`There was an error launching app: ${result}`);\n }\n }\n throw new CommandError('Unable to launch app, number of tries exceeded');\n}\n"],"names":["getConnectedDevicesAsync","runOnDevice","debug","Debug","client","UsbmuxdClient","connectUsbmuxdSocket","devices","getDevices","socket","end","Promise","all","map","device","connect","deviceValues","LockdowndClient","getAllValues","name","DeviceName","ProductType","model","osVersion","ProductVersion","deviceType","connectionType","Properties","ConnectionType","udid","SerialNumber","appPath","bundleId","waitForApp","deltaPath","onProgress","clientManager","ClientManager","create","mountDeveloperDiskImage","packageName","path","basename","destPackagePath","join","uploadApp","appBinaryPath","destinationPath","installer","getInstallationProxyClient","installApp","ApplicationsType","CFBundleIdentifier","CloseOnInvalidate","InvalidateOnDetach","IsUserInitiated","PreferWifi","PackageType","ShadowParentKey","appInfo","lookupApp","delayAsync","debugServerClient","launchApp","detach","installExitHooks","halt","result","continue","kill","Log","warn","imageMounter","getMobileImageMounterClient","lookupImage","ImageSignature","version","getLockdowndClient","getValue","developerDiskImagePath","XcodeDeveloperDiskImagePrerequisite","instance","assertAsync","developerDiskImageSig","fs","readFileSync","uploadImage","mountImage","afcClient","getAFCClient","getFileInfo","err","AFCError","status","AFC_STATUS","OBJECT_NOT_FOUND","makeDirectory","uploadDirectory","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/run/ios/appleDevice/AppleDevice.ts"],"sourcesContent":["import Debug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ClientManager } from './ClientManager';\nimport { IPLookupResult, OnInstallProgressCallback } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { UsbmuxdClient } from './client/UsbmuxdClient';\nimport { AFC_STATUS, AFCError } from './protocol/AFCProtocol';\nimport { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\n\nconst debug = Debug('expo:apple-device');\n\n// NOTE(EvanBacon): I have a feeling this shape will change with new iOS versions (tested against iOS 15).\nexport interface ConnectedDevice {\n /** @example `00008101-001964A22629003A` */\n udid: string;\n /** @example `Evan's phone` */\n name: string;\n /** @example `iPhone13,4` */\n model: string;\n /** @example `device` */\n deviceType: 'device' | 'catalyst';\n /** @example `USB` */\n connectionType: 'USB' | 'Network';\n /** @example `15.4.1` */\n osVersion: string;\n}\n\n/** @returns a list of connected Apple devices. */\nexport async function getConnectedDevicesAsync(): Promise<ConnectedDevice[]> {\n const client = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const devices = await client.getDevices();\n client.socket.end();\n\n return Promise.all(\n devices.map(async (device): Promise<ConnectedDevice> => {\n const socket = await new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket()).connect(\n device,\n 62078\n );\n const deviceValues = await new LockdowndClient(socket).getAllValues();\n socket.end();\n // TODO(EvanBacon): Add support for osType (ipad, watchos, etc)\n return {\n // TODO(EvanBacon): Better name\n name: deviceValues.DeviceName ?? deviceValues.ProductType ?? 'unknown iOS device',\n model: deviceValues.ProductType,\n osVersion: deviceValues.ProductVersion,\n deviceType: 'device',\n connectionType: device.Properties.ConnectionType,\n udid: device.Properties.SerialNumber,\n };\n })\n );\n}\n\n/** Install and run an Apple app binary on a connected Apple device. */\nexport async function runOnDevice({\n udid,\n appPath,\n bundleId,\n waitForApp,\n deltaPath,\n onProgress,\n}: {\n /** Apple device UDID */\n udid: string;\n /** File path to the app binary (ipa) */\n appPath: string;\n /** Bundle identifier for the app at `appPath` */\n bundleId: string;\n /** Wait for the app to launch before returning */\n waitForApp: boolean;\n /** File path to the app deltas folder to use for faster subsequent installs */\n deltaPath: string;\n /** Callback to be called with progress updates */\n onProgress: OnInstallProgressCallback;\n}) {\n const clientManager = await ClientManager.create(udid);\n\n try {\n await mountDeveloperDiskImage(clientManager);\n\n const packageName = path.basename(appPath);\n const destPackagePath = path.join('PublicStaging', packageName);\n\n await uploadApp(clientManager, { appBinaryPath: appPath, destinationPath: destPackagePath });\n\n const installer = await clientManager.getInstallationProxyClient();\n await installer.installApp(\n destPackagePath,\n bundleId,\n {\n // https://github.com/ios-control/ios-deploy/blob/0f2ffb1e564aa67a2dfca7cdf13de47ce489d835/src/ios-deploy/ios-deploy.m#L2491-L2508\n ApplicationsType: 'Any',\n\n CFBundleIdentifier: bundleId,\n CloseOnInvalidate: '1',\n InvalidateOnDetach: '1',\n IsUserInitiated: '1',\n // Disable checking for wifi devices, this is nominally faster.\n PreferWifi: '0',\n // Only info I could find on these:\n // https://github.com/wwxxyx/Quectel_BG96/blob/310876f90fc1093a59e45e381160eddcc31697d0/Apple_Homekit/homekit_certification_tools/ATS%206/ATS%206/ATS.app/Contents/Frameworks/CaptureKit.framework/Versions/A/Resources/MobileDevice/MobileInstallation.h#L112-L121\n PackageType: 'Developer',\n ShadowParentKey: deltaPath,\n // SkipUninstall: '1'\n },\n onProgress\n );\n\n const {\n // TODO(EvanBacon): This can be undefined when querying App Clips.\n [bundleId]: appInfo,\n } = await installer.lookupApp([bundleId]);\n\n if (appInfo) {\n // launch fails with EBusy or ENotFound if you try to launch immediately after install\n await delayAsync(200);\n const debugServerClient = await launchApp(clientManager, { appInfo, detach: !waitForApp });\n if (waitForApp) {\n installExitHooks(async () => {\n // causes continue() to return\n debugServerClient.halt();\n // give continue() time to return response\n await delayAsync(64);\n });\n\n debug(`Waiting for app to close...\\n`);\n const result = await debugServerClient.continue();\n // TODO: I have no idea what this packet means yet (successful close?)\n // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app\n if (result !== 'W00') {\n await debugServerClient.kill();\n }\n }\n } else {\n Log.warn(`App \"${bundleId}\" installed but couldn't be launched. Open on device manually.`);\n }\n } finally {\n clientManager.end();\n }\n}\n\n/** Mount the developer disk image for Xcode. */\nasync function mountDeveloperDiskImage(clientManager: ClientManager) {\n const imageMounter = await clientManager.getMobileImageMounterClient();\n // Check if already mounted. If not, mount.\n if (!(await imageMounter.lookupImage()).ImageSignature) {\n // verify DeveloperDiskImage exists (TODO: how does this work on Windows/Linux?)\n // TODO: if windows/linux, download?\n const version = await (await clientManager.getLockdowndClient()).getValue('ProductVersion');\n const developerDiskImagePath = await XcodeDeveloperDiskImagePrerequisite.instance.assertAsync({\n version,\n });\n const developerDiskImageSig = fs.readFileSync(`${developerDiskImagePath}.signature`);\n await imageMounter.uploadImage(developerDiskImagePath, developerDiskImageSig);\n await imageMounter.mountImage(developerDiskImagePath, developerDiskImageSig);\n }\n}\n\nasync function uploadApp(\n clientManager: ClientManager,\n { appBinaryPath, destinationPath }: { appBinaryPath: string; destinationPath: string }\n) {\n const afcClient = await clientManager.getAFCClient();\n try {\n await afcClient.getFileInfo('PublicStaging');\n } catch (err: any) {\n if (err instanceof AFCError && err.status === AFC_STATUS.OBJECT_NOT_FOUND) {\n await afcClient.makeDirectory('PublicStaging');\n } else {\n throw err;\n }\n }\n await afcClient.uploadDirectory(appBinaryPath, destinationPath);\n}\n\nasync function launchApp(\n clientManager: ClientManager,\n { appInfo, detach }: { appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n let tries = 0;\n while (tries < 3) {\n const debugServerClient = await clientManager.getDebugserverClient();\n await debugServerClient.setMaxPacketSize(1024);\n await debugServerClient.setWorkingDir(appInfo.Container);\n await debugServerClient.launchApp(appInfo.Path, appInfo.CFBundleExecutable);\n\n const result = await debugServerClient.checkLaunchSuccess();\n if (result === 'OK') {\n if (detach) {\n // https://github.com/libimobiledevice/libimobiledevice/blob/25059d4c7d75e03aab516af2929d7c6e6d4c17de/tools/idevicedebug.c#L455-L464\n const res = await debugServerClient.sendCommand('D', []);\n debug('Disconnect from debug server request:', res);\n if (res !== 'OK') {\n console.warn(\n 'Something went wrong while attempting to disconnect from iOS debug server, you may need to reopen the app manually.'\n );\n }\n }\n\n return debugServerClient;\n } else if (result === 'EBusy' || result === 'ENotFound') {\n debug('Device busy or app not found, trying to launch again in .5s...');\n tries++;\n debugServerClient.socket.end();\n await delayAsync(500);\n } else {\n throw new CommandError(`There was an error launching app: ${result}`);\n }\n }\n throw new CommandError('Unable to launch app, number of tries exceeded');\n}\n"],"names":["getConnectedDevicesAsync","runOnDevice","debug","Debug","client","UsbmuxdClient","connectUsbmuxdSocket","devices","getDevices","socket","end","Promise","all","map","device","connect","deviceValues","LockdowndClient","getAllValues","name","DeviceName","ProductType","model","osVersion","ProductVersion","deviceType","connectionType","Properties","ConnectionType","udid","SerialNumber","appPath","bundleId","waitForApp","deltaPath","onProgress","clientManager","ClientManager","create","mountDeveloperDiskImage","packageName","path","basename","destPackagePath","join","uploadApp","appBinaryPath","destinationPath","installer","getInstallationProxyClient","installApp","ApplicationsType","CFBundleIdentifier","CloseOnInvalidate","InvalidateOnDetach","IsUserInitiated","PreferWifi","PackageType","ShadowParentKey","appInfo","lookupApp","delayAsync","debugServerClient","launchApp","detach","installExitHooks","halt","result","continue","kill","Log","warn","imageMounter","getMobileImageMounterClient","lookupImage","ImageSignature","version","getLockdowndClient","getValue","developerDiskImagePath","XcodeDeveloperDiskImagePrerequisite","instance","assertAsync","developerDiskImageSig","fs","readFileSync","uploadImage","mountImage","afcClient","getAFCClient","getFileInfo","err","AFCError","status","AFC_STATUS","OBJECT_NOT_FOUND","makeDirectory","uploadDirectory","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError"],"mappings":"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"}
@@ -4,13 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  var _stream = require("stream");
6
6
  var tls = _interopRequireWildcard(require("tls"));
7
- var _errors = require("../../../utils/errors");
8
7
  var _afcclient = require("./client/AFCClient");
9
8
  var _debugserverClient = require("./client/DebugserverClient");
10
9
  var _installationProxyClient = require("./client/InstallationProxyClient");
11
10
  var _lockdowndClient = require("./client/LockdowndClient");
12
11
  var _mobileImageMounterClient = require("./client/MobileImageMounterClient");
13
12
  var _usbmuxdClient = require("./client/UsbmuxdClient");
13
+ var _errors = require("../../../utils/errors");
14
14
  function _interopRequireWildcard(obj) {
15
15
  if (obj && obj.__esModule) {
16
16
  return obj;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/run/ios/appleDevice/ClientManager.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Socket } from 'net';\nimport { Duplex } from 'stream';\nimport * as tls from 'tls';\n\nimport { CommandError } from '../../../utils/errors';\nimport { AFCClient } from './client/AFCClient';\nimport { DebugserverClient } from './client/DebugserverClient';\nimport { InstallationProxyClient } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { MobileImageMounterClient } from './client/MobileImageMounterClient';\nimport { ServiceClient } from './client/ServiceClient';\nimport { UsbmuxdClient, UsbmuxdDevice, UsbmuxdPairRecord } from './client/UsbmuxdClient';\n\nexport class ClientManager {\n private connections: Socket[];\n constructor(\n public pairRecord: UsbmuxdPairRecord,\n public device: UsbmuxdDevice,\n private lockdowndClient: LockdowndClient\n ) {\n this.connections = [lockdowndClient.socket];\n }\n\n static async create(udid?: string) {\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const device = await usbmuxClient.getDevice(udid);\n const pairRecord = await usbmuxClient.readPairRecord(device.Properties.SerialNumber);\n const lockdownSocket = await usbmuxClient.connect(device, 62078);\n const lockdownClient = new LockdowndClient(lockdownSocket);\n await lockdownClient.doHandshake(pairRecord);\n return new ClientManager(pairRecord, device, lockdownClient);\n }\n\n async getUsbmuxdClient() {\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n this.connections.push(usbmuxClient.socket);\n return usbmuxClient;\n }\n\n async getLockdowndClient() {\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const lockdownSocket = await usbmuxClient.connect(this.device, 62078);\n const lockdownClient = new LockdowndClient(lockdownSocket);\n this.connections.push(lockdownClient.socket);\n return lockdownClient;\n }\n\n async getLockdowndClientWithHandshake() {\n const lockdownClient = await this.getLockdowndClient();\n await lockdownClient.doHandshake(this.pairRecord);\n return lockdownClient;\n }\n\n async getAFCClient() {\n return this.getServiceClient('com.apple.afc', AFCClient);\n }\n\n async getInstallationProxyClient() {\n return this.getServiceClient('com.apple.mobile.installation_proxy', InstallationProxyClient);\n }\n\n async getMobileImageMounterClient() {\n return this.getServiceClient('com.apple.mobile.mobile_image_mounter', MobileImageMounterClient);\n }\n\n async getDebugserverClient() {\n try {\n // iOS 14 added support for a secure debug service so try to connect to that first\n return await this.getServiceClient(\n 'com.apple.debugserver.DVTSecureSocketProxy',\n DebugserverClient\n );\n } catch {\n // otherwise, fall back to the previous implementation\n return this.getServiceClient('com.apple.debugserver', DebugserverClient, true);\n }\n }\n\n private async getServiceClient<T extends ServiceClient<any>>(\n name: string,\n ServiceType: new (...args: any[]) => T,\n disableSSL = false\n ) {\n const { port: servicePort, enableServiceSSL } = await this.lockdowndClient.startService(name);\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n let usbmuxdSocket = await usbmuxClient.connect(this.device, servicePort);\n\n if (enableServiceSSL) {\n const tlsOptions: tls.ConnectionOptions = {\n rejectUnauthorized: false,\n secureContext: tls.createSecureContext({\n // Avoid using `secureProtocol` fixing the socket to a single TLS version.\n // Newer Node versions might not support older TLS versions.\n // By using the default `minVersion` and `maxVersion` options,\n // The socket will automatically use the appropriate TLS version.\n // See: https://nodejs.org/api/tls.html#tlscreatesecurecontextoptions\n cert: this.pairRecord.RootCertificate,\n key: this.pairRecord.RootPrivateKey,\n }),\n };\n\n // Some services seem to not support TLS/SSL after the initial handshake\n // More info: https://github.com/libimobiledevice/libimobiledevice/issues/793\n if (disableSSL) {\n // According to https://nodejs.org/api/tls.html#tls_tls_connect_options_callback we can\n // pass any Duplex in to tls.connect instead of a Socket. So we'll use our proxy to keep\n // the TLS wrapper and underlying usbmuxd socket separate.\n const proxy: any = new UsbmuxdProxy(usbmuxdSocket);\n tlsOptions.socket = proxy;\n\n await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(\n new CommandError('APPLE_DEVICE', 'The TLS handshake failed to complete after 5s.')\n );\n }, 5000);\n tls.connect(tlsOptions, function (this: tls.TLSSocket) {\n clearTimeout(timeoutId);\n // After the handshake, we don't need TLS or the proxy anymore,\n // since we'll just pass in the naked usbmuxd socket to the service client\n this.destroy();\n resolve();\n });\n });\n } else {\n tlsOptions.socket = usbmuxdSocket;\n usbmuxdSocket = tls.connect(tlsOptions);\n }\n }\n const client = new ServiceType(usbmuxdSocket);\n this.connections.push(client.socket);\n return client;\n }\n\n end() {\n for (const socket of this.connections) {\n // may already be closed\n try {\n socket.end();\n } catch {}\n }\n }\n}\n\nclass UsbmuxdProxy extends Duplex {\n constructor(private usbmuxdSock: Socket) {\n super();\n\n this.usbmuxdSock.on('data', (data) => {\n this.push(data);\n });\n }\n\n _write(chunk: any, encoding: string, callback: (err?: Error) => void) {\n this.usbmuxdSock.write(chunk);\n callback();\n }\n\n _read(size: number) {\n // Stub so we don't error, since we push everything we get from usbmuxd as it comes in.\n // TODO: better way to do this?\n }\n\n _destroy() {\n this.usbmuxdSock.removeAllListeners();\n }\n}\n"],"names":["tls","ClientManager","constructor","pairRecord","device","lockdowndClient","connections","socket","create","udid","usbmuxClient","UsbmuxdClient","connectUsbmuxdSocket","getDevice","readPairRecord","Properties","SerialNumber","lockdownSocket","connect","lockdownClient","LockdowndClient","doHandshake","getUsbmuxdClient","push","getLockdowndClient","getLockdowndClientWithHandshake","getAFCClient","getServiceClient","AFCClient","getInstallationProxyClient","InstallationProxyClient","getMobileImageMounterClient","MobileImageMounterClient","getDebugserverClient","DebugserverClient","name","ServiceType","disableSSL","port","servicePort","enableServiceSSL","startService","usbmuxdSocket","tlsOptions","rejectUnauthorized","secureContext","createSecureContext","cert","RootCertificate","key","RootPrivateKey","proxy","UsbmuxdProxy","Promise","resolve","reject","timeoutId","setTimeout","CommandError","clearTimeout","destroy","client","end","Duplex","usbmuxdSock","on","data","_write","chunk","encoding","callback","write","_read","size","_destroy","removeAllListeners"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/run/ios/appleDevice/ClientManager.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { Socket } from 'net';\nimport { Duplex } from 'stream';\nimport * as tls from 'tls';\n\nimport { AFCClient } from './client/AFCClient';\nimport { DebugserverClient } from './client/DebugserverClient';\nimport { InstallationProxyClient } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { MobileImageMounterClient } from './client/MobileImageMounterClient';\nimport { ServiceClient } from './client/ServiceClient';\nimport { UsbmuxdClient, UsbmuxdDevice, UsbmuxdPairRecord } from './client/UsbmuxdClient';\nimport { CommandError } from '../../../utils/errors';\n\nexport class ClientManager {\n private connections: Socket[];\n constructor(\n public pairRecord: UsbmuxdPairRecord,\n public device: UsbmuxdDevice,\n private lockdowndClient: LockdowndClient\n ) {\n this.connections = [lockdowndClient.socket];\n }\n\n static async create(udid?: string) {\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const device = await usbmuxClient.getDevice(udid);\n const pairRecord = await usbmuxClient.readPairRecord(device.Properties.SerialNumber);\n const lockdownSocket = await usbmuxClient.connect(device, 62078);\n const lockdownClient = new LockdowndClient(lockdownSocket);\n await lockdownClient.doHandshake(pairRecord);\n return new ClientManager(pairRecord, device, lockdownClient);\n }\n\n async getUsbmuxdClient() {\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n this.connections.push(usbmuxClient.socket);\n return usbmuxClient;\n }\n\n async getLockdowndClient() {\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const lockdownSocket = await usbmuxClient.connect(this.device, 62078);\n const lockdownClient = new LockdowndClient(lockdownSocket);\n this.connections.push(lockdownClient.socket);\n return lockdownClient;\n }\n\n async getLockdowndClientWithHandshake() {\n const lockdownClient = await this.getLockdowndClient();\n await lockdownClient.doHandshake(this.pairRecord);\n return lockdownClient;\n }\n\n async getAFCClient() {\n return this.getServiceClient('com.apple.afc', AFCClient);\n }\n\n async getInstallationProxyClient() {\n return this.getServiceClient('com.apple.mobile.installation_proxy', InstallationProxyClient);\n }\n\n async getMobileImageMounterClient() {\n return this.getServiceClient('com.apple.mobile.mobile_image_mounter', MobileImageMounterClient);\n }\n\n async getDebugserverClient() {\n try {\n // iOS 14 added support for a secure debug service so try to connect to that first\n return await this.getServiceClient(\n 'com.apple.debugserver.DVTSecureSocketProxy',\n DebugserverClient\n );\n } catch {\n // otherwise, fall back to the previous implementation\n return this.getServiceClient('com.apple.debugserver', DebugserverClient, true);\n }\n }\n\n private async getServiceClient<T extends ServiceClient<any>>(\n name: string,\n ServiceType: new (...args: any[]) => T,\n disableSSL = false\n ) {\n const { port: servicePort, enableServiceSSL } = await this.lockdowndClient.startService(name);\n const usbmuxClient = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n let usbmuxdSocket = await usbmuxClient.connect(this.device, servicePort);\n\n if (enableServiceSSL) {\n const tlsOptions: tls.ConnectionOptions = {\n rejectUnauthorized: false,\n secureContext: tls.createSecureContext({\n // Avoid using `secureProtocol` fixing the socket to a single TLS version.\n // Newer Node versions might not support older TLS versions.\n // By using the default `minVersion` and `maxVersion` options,\n // The socket will automatically use the appropriate TLS version.\n // See: https://nodejs.org/api/tls.html#tlscreatesecurecontextoptions\n cert: this.pairRecord.RootCertificate,\n key: this.pairRecord.RootPrivateKey,\n }),\n };\n\n // Some services seem to not support TLS/SSL after the initial handshake\n // More info: https://github.com/libimobiledevice/libimobiledevice/issues/793\n if (disableSSL) {\n // According to https://nodejs.org/api/tls.html#tls_tls_connect_options_callback we can\n // pass any Duplex in to tls.connect instead of a Socket. So we'll use our proxy to keep\n // the TLS wrapper and underlying usbmuxd socket separate.\n const proxy: any = new UsbmuxdProxy(usbmuxdSocket);\n tlsOptions.socket = proxy;\n\n await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(\n new CommandError('APPLE_DEVICE', 'The TLS handshake failed to complete after 5s.')\n );\n }, 5000);\n tls.connect(tlsOptions, function (this: tls.TLSSocket) {\n clearTimeout(timeoutId);\n // After the handshake, we don't need TLS or the proxy anymore,\n // since we'll just pass in the naked usbmuxd socket to the service client\n this.destroy();\n resolve();\n });\n });\n } else {\n tlsOptions.socket = usbmuxdSocket;\n usbmuxdSocket = tls.connect(tlsOptions);\n }\n }\n const client = new ServiceType(usbmuxdSocket);\n this.connections.push(client.socket);\n return client;\n }\n\n end() {\n for (const socket of this.connections) {\n // may already be closed\n try {\n socket.end();\n } catch {}\n }\n }\n}\n\nclass UsbmuxdProxy extends Duplex {\n constructor(private usbmuxdSock: Socket) {\n super();\n\n this.usbmuxdSock.on('data', (data) => {\n this.push(data);\n });\n }\n\n _write(chunk: any, encoding: string, callback: (err?: Error) => void) {\n this.usbmuxdSock.write(chunk);\n callback();\n }\n\n _read(size: number) {\n // Stub so we don't error, since we push everything we get from usbmuxd as it comes in.\n // TODO: better way to do this?\n }\n\n _destroy() {\n this.usbmuxdSock.removeAllListeners();\n }\n}\n"],"names":["tls","ClientManager","constructor","pairRecord","device","lockdowndClient","connections","socket","create","udid","usbmuxClient","UsbmuxdClient","connectUsbmuxdSocket","getDevice","readPairRecord","Properties","SerialNumber","lockdownSocket","connect","lockdownClient","LockdowndClient","doHandshake","getUsbmuxdClient","push","getLockdowndClient","getLockdowndClientWithHandshake","getAFCClient","getServiceClient","AFCClient","getInstallationProxyClient","InstallationProxyClient","getMobileImageMounterClient","MobileImageMounterClient","getDebugserverClient","DebugserverClient","name","ServiceType","disableSSL","port","servicePort","enableServiceSSL","startService","usbmuxdSocket","tlsOptions","rejectUnauthorized","secureContext","createSecureContext","cert","RootCertificate","key","RootPrivateKey","proxy","UsbmuxdProxy","Promise","resolve","reject","timeoutId","setTimeout","CommandError","clearTimeout","destroy","client","end","Duplex","usbmuxdSock","on","data","_write","chunk","encoding","callback","write","_read","size","_destroy","removeAllListeners"],"mappings":"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"}
@@ -6,9 +6,9 @@ var _debug = _interopRequireDefault(require("debug"));
6
6
  var fs = _interopRequireWildcard(require("fs"));
7
7
  var path = _interopRequireWildcard(require("path"));
8
8
  var _util = require("util");
9
+ var _serviceClient = require("./ServiceClient");
9
10
  var _errors = require("../../../../utils/errors");
10
11
  var _afcprotocol = require("../protocol/AFCProtocol");
11
- var _serviceClient = require("./ServiceClient");
12
12
  function _interopRequireDefault(obj) {
13
13
  return obj && obj.__esModule ? obj : {
14
14
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/AFCClient.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport Debug from 'debug';\nimport * as fs from 'fs';\nimport { Socket } from 'net';\nimport * as path from 'path';\nimport { promisify } from 'util';\n\nimport { CommandError } from '../../../../utils/errors';\nimport {\n AFC_FILE_OPEN_FLAGS,\n AFC_OPS,\n AFC_STATUS,\n AFCError,\n AFCProtocolClient,\n AFCResponse,\n} from '../protocol/AFCProtocol';\nimport { ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:afc');\nconst MAX_OPEN_FILES = 240;\n\nexport class AFCClient extends ServiceClient<AFCProtocolClient> {\n constructor(public socket: Socket) {\n super(socket, new AFCProtocolClient(socket));\n }\n\n async getFileInfo(path: string): Promise<string[]> {\n debug(`getFileInfo: ${path}`);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.GET_FILE_INFO,\n data: toCString(path),\n });\n debug(`getFileInfo:response: %O`, response);\n\n const strings: string[] = [];\n let currentString = '';\n const tokens = response.data;\n tokens.forEach((token) => {\n if (token === 0) {\n strings.push(currentString);\n currentString = '';\n } else {\n currentString += String.fromCharCode(token);\n }\n });\n return strings;\n }\n\n async writeFile(fd: Buffer, data: Buffer): Promise<AFCResponse> {\n debug(`writeFile: ${Array.prototype.toString.call(fd)} data size: ${data.length}`);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.FILE_WRITE,\n data: fd,\n payload: data,\n });\n\n debug(`writeFile:response:`, response);\n return response;\n }\n\n protected async openFile(path: string): Promise<Buffer> {\n debug(`openFile: ${path}`);\n // mode + path + null terminator\n const data = Buffer.alloc(8 + path.length + 1);\n // write mode\n data.writeUInt32LE(AFC_FILE_OPEN_FLAGS.WRONLY, 0);\n // then path to file\n toCString(path).copy(data, 8);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.FILE_OPEN,\n data,\n });\n\n // debug(`openFile:response:`, response);\n\n if (response.operation === AFC_OPS.FILE_OPEN_RES) {\n return response.data;\n }\n\n throw new CommandError(\n 'APPLE_DEVICE_AFC',\n `There was an unknown error opening file ${path}, response: ${Array.prototype.toString.call(\n response.data\n )}`\n );\n }\n\n protected async closeFile(fd: Buffer): Promise<AFCResponse> {\n debug(`closeFile fd: ${Array.prototype.toString.call(fd)}`);\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.FILE_CLOSE,\n data: fd,\n });\n\n debug(`closeFile:response:`, response);\n return response;\n }\n\n protected async uploadFile(srcPath: string, destPath: string): Promise<void> {\n debug(`uploadFile: ${srcPath}, ${destPath}`);\n\n // read local file and get fd of destination\n const [srcFile, destFile] = await Promise.all([\n await promisify(fs.readFile)(srcPath),\n await this.openFile(destPath),\n ]);\n\n try {\n await this.writeFile(destFile, srcFile);\n await this.closeFile(destFile);\n } catch (err) {\n await this.closeFile(destFile);\n throw err;\n }\n }\n\n async makeDirectory(path: string): Promise<AFCResponse> {\n debug(`makeDirectory: ${path}`);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.MAKE_DIR,\n data: toCString(path),\n });\n\n debug(`makeDirectory:response:`, response);\n return response;\n }\n\n async uploadDirectory(srcPath: string, destPath: string): Promise<void> {\n debug(`uploadDirectory: ${srcPath}`);\n await this.makeDirectory(destPath);\n\n // AFC doesn't seem to give out more than 240 file handles,\n // so we delay any requests that would push us over until more open up\n let numOpenFiles = 0;\n const pendingFileUploads: (() => void)[] = [];\n const _this = this;\n return uploadDir(srcPath);\n\n async function uploadDir(dirPath: string): Promise<void> {\n const promises: Promise<void>[] = [];\n for (const file of fs.readdirSync(dirPath)) {\n const filePath = path.join(dirPath, file);\n const remotePath = path.join(destPath, path.relative(srcPath, filePath));\n if (fs.lstatSync(filePath).isDirectory()) {\n promises.push(_this.makeDirectory(remotePath).then(() => uploadDir(filePath)));\n } else {\n // Create promise to add to promises array\n // this way it can be resolved once a pending upload has finished\n let resolve: (val?: any) => void;\n let reject: (err: AFCError) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n promises.push(promise);\n\n // wrap upload in a function in case we need to save it for later\n const uploadFile = (tries = 0) => {\n numOpenFiles++;\n _this\n .uploadFile(filePath, remotePath)\n .then(() => {\n resolve();\n numOpenFiles--;\n const fn = pendingFileUploads.pop();\n if (fn) {\n fn();\n }\n })\n .catch((err: AFCError) => {\n // Couldn't get fd for whatever reason, try again\n // # of retries is arbitrary and can be adjusted\n if (err.status === AFC_STATUS.NO_RESOURCES && tries < 10) {\n debug(`Received NO_RESOURCES from AFC, retrying ${filePath} upload. ${tries}`);\n uploadFile(tries++);\n } else {\n numOpenFiles--;\n reject(err);\n }\n });\n };\n\n if (numOpenFiles < MAX_OPEN_FILES) {\n uploadFile();\n } else {\n debug(\n `numOpenFiles >= ${MAX_OPEN_FILES}, adding to pending queue. Length: ${pendingFileUploads.length}`\n );\n pendingFileUploads.push(uploadFile);\n }\n }\n }\n await Promise.all(promises);\n }\n }\n}\n\nfunction toCString(s: string) {\n const buf = Buffer.alloc(s.length + 1);\n const len = buf.write(s);\n buf.writeUInt8(0, len);\n return buf;\n}\n"],"names":["fs","path","debug","Debug","MAX_OPEN_FILES","AFCClient","ServiceClient","constructor","socket","AFCProtocolClient","getFileInfo","response","protocolClient","sendMessage","operation","AFC_OPS","GET_FILE_INFO","data","toCString","strings","currentString","tokens","forEach","token","push","String","fromCharCode","writeFile","fd","Array","prototype","toString","call","length","FILE_WRITE","payload","openFile","Buffer","alloc","writeUInt32LE","AFC_FILE_OPEN_FLAGS","WRONLY","copy","FILE_OPEN","FILE_OPEN_RES","CommandError","closeFile","FILE_CLOSE","uploadFile","srcPath","destPath","srcFile","destFile","Promise","all","promisify","readFile","err","makeDirectory","MAKE_DIR","uploadDirectory","numOpenFiles","pendingFileUploads","_this","uploadDir","dirPath","promises","file","readdirSync","filePath","join","remotePath","relative","lstatSync","isDirectory","then","resolve","reject","promise","res","rej","tries","fn","pop","catch","status","AFC_STATUS","NO_RESOURCES","s","buf","len","write","writeUInt8"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/AFCClient.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport Debug from 'debug';\nimport * as fs from 'fs';\nimport { Socket } from 'net';\nimport * as path from 'path';\nimport { promisify } from 'util';\n\nimport { ServiceClient } from './ServiceClient';\nimport { CommandError } from '../../../../utils/errors';\nimport {\n AFC_FILE_OPEN_FLAGS,\n AFC_OPS,\n AFC_STATUS,\n AFCError,\n AFCProtocolClient,\n AFCResponse,\n} from '../protocol/AFCProtocol';\n\nconst debug = Debug('expo:apple-device:client:afc');\nconst MAX_OPEN_FILES = 240;\n\nexport class AFCClient extends ServiceClient<AFCProtocolClient> {\n constructor(public socket: Socket) {\n super(socket, new AFCProtocolClient(socket));\n }\n\n async getFileInfo(path: string): Promise<string[]> {\n debug(`getFileInfo: ${path}`);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.GET_FILE_INFO,\n data: toCString(path),\n });\n debug(`getFileInfo:response: %O`, response);\n\n const strings: string[] = [];\n let currentString = '';\n const tokens = response.data;\n tokens.forEach((token) => {\n if (token === 0) {\n strings.push(currentString);\n currentString = '';\n } else {\n currentString += String.fromCharCode(token);\n }\n });\n return strings;\n }\n\n async writeFile(fd: Buffer, data: Buffer): Promise<AFCResponse> {\n debug(`writeFile: ${Array.prototype.toString.call(fd)} data size: ${data.length}`);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.FILE_WRITE,\n data: fd,\n payload: data,\n });\n\n debug(`writeFile:response:`, response);\n return response;\n }\n\n protected async openFile(path: string): Promise<Buffer> {\n debug(`openFile: ${path}`);\n // mode + path + null terminator\n const data = Buffer.alloc(8 + path.length + 1);\n // write mode\n data.writeUInt32LE(AFC_FILE_OPEN_FLAGS.WRONLY, 0);\n // then path to file\n toCString(path).copy(data, 8);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.FILE_OPEN,\n data,\n });\n\n // debug(`openFile:response:`, response);\n\n if (response.operation === AFC_OPS.FILE_OPEN_RES) {\n return response.data;\n }\n\n throw new CommandError(\n 'APPLE_DEVICE_AFC',\n `There was an unknown error opening file ${path}, response: ${Array.prototype.toString.call(\n response.data\n )}`\n );\n }\n\n protected async closeFile(fd: Buffer): Promise<AFCResponse> {\n debug(`closeFile fd: ${Array.prototype.toString.call(fd)}`);\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.FILE_CLOSE,\n data: fd,\n });\n\n debug(`closeFile:response:`, response);\n return response;\n }\n\n protected async uploadFile(srcPath: string, destPath: string): Promise<void> {\n debug(`uploadFile: ${srcPath}, ${destPath}`);\n\n // read local file and get fd of destination\n const [srcFile, destFile] = await Promise.all([\n await promisify(fs.readFile)(srcPath),\n await this.openFile(destPath),\n ]);\n\n try {\n await this.writeFile(destFile, srcFile);\n await this.closeFile(destFile);\n } catch (err) {\n await this.closeFile(destFile);\n throw err;\n }\n }\n\n async makeDirectory(path: string): Promise<AFCResponse> {\n debug(`makeDirectory: ${path}`);\n\n const response = await this.protocolClient.sendMessage({\n operation: AFC_OPS.MAKE_DIR,\n data: toCString(path),\n });\n\n debug(`makeDirectory:response:`, response);\n return response;\n }\n\n async uploadDirectory(srcPath: string, destPath: string): Promise<void> {\n debug(`uploadDirectory: ${srcPath}`);\n await this.makeDirectory(destPath);\n\n // AFC doesn't seem to give out more than 240 file handles,\n // so we delay any requests that would push us over until more open up\n let numOpenFiles = 0;\n const pendingFileUploads: (() => void)[] = [];\n const _this = this;\n return uploadDir(srcPath);\n\n async function uploadDir(dirPath: string): Promise<void> {\n const promises: Promise<void>[] = [];\n for (const file of fs.readdirSync(dirPath)) {\n const filePath = path.join(dirPath, file);\n const remotePath = path.join(destPath, path.relative(srcPath, filePath));\n if (fs.lstatSync(filePath).isDirectory()) {\n promises.push(_this.makeDirectory(remotePath).then(() => uploadDir(filePath)));\n } else {\n // Create promise to add to promises array\n // this way it can be resolved once a pending upload has finished\n let resolve: (val?: any) => void;\n let reject: (err: AFCError) => void;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n promises.push(promise);\n\n // wrap upload in a function in case we need to save it for later\n const uploadFile = (tries = 0) => {\n numOpenFiles++;\n _this\n .uploadFile(filePath, remotePath)\n .then(() => {\n resolve();\n numOpenFiles--;\n const fn = pendingFileUploads.pop();\n if (fn) {\n fn();\n }\n })\n .catch((err: AFCError) => {\n // Couldn't get fd for whatever reason, try again\n // # of retries is arbitrary and can be adjusted\n if (err.status === AFC_STATUS.NO_RESOURCES && tries < 10) {\n debug(`Received NO_RESOURCES from AFC, retrying ${filePath} upload. ${tries}`);\n uploadFile(tries++);\n } else {\n numOpenFiles--;\n reject(err);\n }\n });\n };\n\n if (numOpenFiles < MAX_OPEN_FILES) {\n uploadFile();\n } else {\n debug(\n `numOpenFiles >= ${MAX_OPEN_FILES}, adding to pending queue. Length: ${pendingFileUploads.length}`\n );\n pendingFileUploads.push(uploadFile);\n }\n }\n }\n await Promise.all(promises);\n }\n }\n}\n\nfunction toCString(s: string) {\n const buf = Buffer.alloc(s.length + 1);\n const len = buf.write(s);\n buf.writeUInt8(0, len);\n return buf;\n}\n"],"names":["fs","path","debug","Debug","MAX_OPEN_FILES","AFCClient","ServiceClient","constructor","socket","AFCProtocolClient","getFileInfo","response","protocolClient","sendMessage","operation","AFC_OPS","GET_FILE_INFO","data","toCString","strings","currentString","tokens","forEach","token","push","String","fromCharCode","writeFile","fd","Array","prototype","toString","call","length","FILE_WRITE","payload","openFile","Buffer","alloc","writeUInt32LE","AFC_FILE_OPEN_FLAGS","WRONLY","copy","FILE_OPEN","FILE_OPEN_RES","CommandError","closeFile","FILE_CLOSE","uploadFile","srcPath","destPath","srcFile","destFile","Promise","all","promisify","readFile","err","makeDirectory","MAKE_DIR","uploadDirectory","numOpenFiles","pendingFileUploads","_this","uploadDir","dirPath","promises","file","readdirSync","filePath","join","remotePath","relative","lstatSync","isDirectory","then","resolve","reject","promise","res","rej","tries","fn","pop","catch","status","AFC_STATUS","NO_RESOURCES","s","buf","len","write","writeUInt8"],"mappings":"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"}
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  var _debug = _interopRequireDefault(require("debug"));
6
6
  var path = _interopRequireWildcard(require("path"));
7
- var _gdbprotocol = require("../protocol/GDBProtocol");
8
7
  var _serviceClient = require("./ServiceClient");
8
+ var _gdbprotocol = require("../protocol/GDBProtocol");
9
9
  function _interopRequireDefault(obj) {
10
10
  return obj && obj.__esModule ? obj : {
11
11
  default: obj
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/DebugserverClient.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport Debug from 'debug';\nimport { Socket } from 'net';\nimport * as path from 'path';\n\nimport { GDBProtocolClient } from '../protocol/GDBProtocol';\nimport { ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:debugserver');\n\nexport class DebugserverClient extends ServiceClient<GDBProtocolClient> {\n constructor(public socket: Socket) {\n super(socket, new GDBProtocolClient(socket));\n }\n\n async setMaxPacketSize(size: number) {\n return this.sendCommand('QSetMaxPacketSize:', [size.toString()]);\n }\n\n async setWorkingDir(workingDir: string) {\n return this.sendCommand('QSetWorkingDir:', [workingDir]);\n }\n\n async checkLaunchSuccess() {\n return this.sendCommand('qLaunchSuccess', []);\n }\n\n async attachByName(name: string) {\n const hexName = Buffer.from(name).toString('hex');\n return this.sendCommand(`vAttachName;${hexName}`, []);\n }\n\n async continue() {\n return this.sendCommand('c', []);\n }\n\n halt() {\n // ^C\n debug('Sending ^C to debugserver');\n return this.protocolClient.socket.write('\\u0003');\n }\n\n async kill() {\n debug(`kill`);\n const msg: any = { cmd: 'k', args: [] };\n return this.protocolClient.sendMessage(msg, (resp: string, resolve: any) => {\n debug(`kill:response: ${resp}`);\n this.protocolClient.socket.write('+');\n const parts = resp.split(';');\n for (const part of parts) {\n if (part.includes('description')) {\n // description:{hex encoded message like: \"Terminated with signal 9\"}\n resolve(Buffer.from(part.split(':')[1], 'hex').toString('ascii'));\n }\n }\n });\n }\n\n // TODO support app args\n // https://sourceware.org/gdb/onlinedocs/gdb/Packets.html#Packets\n // A arglen,argnum,arg,\n async launchApp(appPath: string, executableName: string) {\n const fullPath = path.join(appPath, executableName);\n const hexAppPath = Buffer.from(fullPath).toString('hex');\n const appCommand = `A${hexAppPath.length},0,${hexAppPath}`;\n return this.sendCommand(appCommand, []);\n }\n\n async sendCommand(cmd: string, args: string[]) {\n const msg = { cmd, args };\n debug(`Sending command: ${cmd}, args: ${args}`);\n const resp = await this.protocolClient.sendMessage(msg);\n // we need to ACK as well\n this.protocolClient.socket.write('+');\n return resp;\n }\n}\n"],"names":["path","debug","Debug","DebugserverClient","ServiceClient","constructor","socket","GDBProtocolClient","setMaxPacketSize","size","sendCommand","toString","setWorkingDir","workingDir","checkLaunchSuccess","attachByName","name","hexName","Buffer","from","continue","halt","protocolClient","write","kill","msg","cmd","args","sendMessage","resp","resolve","parts","split","part","includes","launchApp","appPath","executableName","fullPath","join","hexAppPath","appCommand","length"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/DebugserverClient.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport Debug from 'debug';\nimport { Socket } from 'net';\nimport * as path from 'path';\n\nimport { ServiceClient } from './ServiceClient';\nimport { GDBProtocolClient } from '../protocol/GDBProtocol';\n\nconst debug = Debug('expo:apple-device:client:debugserver');\n\nexport class DebugserverClient extends ServiceClient<GDBProtocolClient> {\n constructor(public socket: Socket) {\n super(socket, new GDBProtocolClient(socket));\n }\n\n async setMaxPacketSize(size: number) {\n return this.sendCommand('QSetMaxPacketSize:', [size.toString()]);\n }\n\n async setWorkingDir(workingDir: string) {\n return this.sendCommand('QSetWorkingDir:', [workingDir]);\n }\n\n async checkLaunchSuccess() {\n return this.sendCommand('qLaunchSuccess', []);\n }\n\n async attachByName(name: string) {\n const hexName = Buffer.from(name).toString('hex');\n return this.sendCommand(`vAttachName;${hexName}`, []);\n }\n\n async continue() {\n return this.sendCommand('c', []);\n }\n\n halt() {\n // ^C\n debug('Sending ^C to debugserver');\n return this.protocolClient.socket.write('\\u0003');\n }\n\n async kill() {\n debug(`kill`);\n const msg: any = { cmd: 'k', args: [] };\n return this.protocolClient.sendMessage(msg, (resp: string, resolve: any) => {\n debug(`kill:response: ${resp}`);\n this.protocolClient.socket.write('+');\n const parts = resp.split(';');\n for (const part of parts) {\n if (part.includes('description')) {\n // description:{hex encoded message like: \"Terminated with signal 9\"}\n resolve(Buffer.from(part.split(':')[1], 'hex').toString('ascii'));\n }\n }\n });\n }\n\n // TODO support app args\n // https://sourceware.org/gdb/onlinedocs/gdb/Packets.html#Packets\n // A arglen,argnum,arg,\n async launchApp(appPath: string, executableName: string) {\n const fullPath = path.join(appPath, executableName);\n const hexAppPath = Buffer.from(fullPath).toString('hex');\n const appCommand = `A${hexAppPath.length},0,${hexAppPath}`;\n return this.sendCommand(appCommand, []);\n }\n\n async sendCommand(cmd: string, args: string[]) {\n const msg = { cmd, args };\n debug(`Sending command: ${cmd}, args: ${args}`);\n const resp = await this.protocolClient.sendMessage(msg);\n // we need to ACK as well\n this.protocolClient.socket.write('+');\n return resp;\n }\n}\n"],"names":["path","debug","Debug","DebugserverClient","ServiceClient","constructor","socket","GDBProtocolClient","setMaxPacketSize","size","sendCommand","toString","setWorkingDir","workingDir","checkLaunchSuccess","attachByName","name","hexName","Buffer","from","continue","halt","protocolClient","write","kill","msg","cmd","args","sendMessage","resp","resolve","parts","split","part","includes","launchApp","appPath","executableName","fullPath","join","hexAppPath","appCommand","length"],"mappings":"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"}