@expo/cli 0.1.3 → 0.2.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 (289) hide show
  1. package/build/bin/cli +89 -4
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/api/rest/wrapFetchWithOffline.js +2 -23
  4. package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
  5. package/build/src/customize/customizeAsync.js +40 -0
  6. package/build/src/customize/customizeAsync.js.map +1 -0
  7. package/build/src/customize/generate.js +77 -0
  8. package/build/src/customize/generate.js.map +1 -0
  9. package/build/src/customize/index.js +41 -0
  10. package/build/src/customize/index.js.map +1 -0
  11. package/build/src/customize/resolveOptions.js +18 -0
  12. package/build/src/customize/resolveOptions.js.map +1 -0
  13. package/build/src/customize/templates.js +118 -0
  14. package/build/src/customize/templates.js.map +1 -0
  15. package/build/src/export/createMetadataJson.js +10 -7
  16. package/build/src/export/createMetadataJson.js.map +1 -1
  17. package/build/src/export/exportApp.js +32 -0
  18. package/build/src/export/exportApp.js.map +1 -1
  19. package/build/src/export/exportAssets.js +2 -3
  20. package/build/src/export/exportAssets.js.map +1 -1
  21. package/build/src/export/fork-bundleAsync.js +51 -34
  22. package/build/src/export/fork-bundleAsync.js.map +1 -1
  23. package/build/src/export/index.js +15 -10
  24. package/build/src/export/index.js.map +1 -1
  25. package/build/src/export/printBundleSizes.js +27 -48
  26. package/build/src/export/printBundleSizes.js.map +1 -1
  27. package/build/src/export/resolveOptions.js +44 -5
  28. package/build/src/export/resolveOptions.js.map +1 -1
  29. package/build/src/export/saveAssets.js +2 -1
  30. package/build/src/export/saveAssets.js.map +1 -1
  31. package/build/src/export/web/exportWebAsync.js +37 -0
  32. package/build/src/export/web/exportWebAsync.js.map +1 -0
  33. package/build/src/export/web/index.js +66 -0
  34. package/build/src/export/web/index.js.map +1 -0
  35. package/build/src/export/web/resolveOptions.js +13 -0
  36. package/build/src/export/web/resolveOptions.js.map +1 -0
  37. package/build/src/export/writeContents.js.map +1 -1
  38. package/build/src/install/checkPackages.js +2 -1
  39. package/build/src/install/checkPackages.js.map +1 -1
  40. package/build/src/install/index.js +1 -0
  41. package/build/src/install/index.js.map +1 -1
  42. package/build/src/install/installAsync.js +13 -5
  43. package/build/src/install/installAsync.js.map +1 -1
  44. package/build/src/install/resolveOptions.js +12 -65
  45. package/build/src/install/resolveOptions.js.map +1 -1
  46. package/build/src/install/utils/autoAddConfigPlugins.js +5 -26
  47. package/build/src/install/utils/autoAddConfigPlugins.js.map +1 -1
  48. package/build/src/log.js.map +1 -1
  49. package/build/src/prebuild/copyTemplateFiles.js +5 -23
  50. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  51. package/build/src/prebuild/index.js +18 -12
  52. package/build/src/prebuild/index.js.map +1 -1
  53. package/build/src/prebuild/prebuildAsync.js +11 -12
  54. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  55. package/build/src/prebuild/resolveOptions.js +17 -0
  56. package/build/src/prebuild/resolveOptions.js.map +1 -1
  57. package/build/src/prebuild/resolveTemplate.js +2 -1
  58. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  59. package/build/src/prebuild/updatePackageJson.js +5 -5
  60. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  61. package/build/src/run/android/resolveInstallApkName.js +5 -26
  62. package/build/src/run/android/resolveInstallApkName.js.map +1 -1
  63. package/build/src/run/android/runAndroidAsync.js +3 -3
  64. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  65. package/build/src/run/ensureNativeProject.js +3 -0
  66. package/build/src/run/ensureNativeProject.js.map +1 -1
  67. package/build/src/run/hints.js +1 -1
  68. package/build/src/run/hints.js.map +1 -1
  69. package/build/src/run/ios/XcodeBuild.js +275 -0
  70. package/build/src/run/ios/XcodeBuild.js.map +1 -0
  71. package/build/src/run/ios/XcodeBuild.types.js +6 -0
  72. package/build/src/run/ios/XcodeBuild.types.js.map +1 -0
  73. package/build/src/run/ios/appleDevice/AppleDevice.js +161 -0
  74. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -0
  75. package/build/src/run/ios/appleDevice/ClientManager.js +161 -0
  76. package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -0
  77. package/build/src/run/ios/appleDevice/client/AFCClient.js +195 -0
  78. package/build/src/run/ios/appleDevice/client/AFCClient.js.map +1 -0
  79. package/build/src/run/ios/appleDevice/client/DebugserverClient.js +107 -0
  80. package/build/src/run/ios/appleDevice/client/DebugserverClient.js.map +1 -0
  81. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js +97 -0
  82. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -0
  83. package/build/src/run/ios/appleDevice/client/LockdowndClient.js +140 -0
  84. package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -0
  85. package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js +91 -0
  86. package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js.map +1 -0
  87. package/build/src/run/ios/appleDevice/client/ServiceClient.js +21 -0
  88. package/build/src/run/ios/appleDevice/client/ServiceClient.js.map +1 -0
  89. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js +117 -0
  90. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js.map +1 -0
  91. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +90 -0
  92. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -0
  93. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js +332 -0
  94. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js.map +1 -0
  95. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js +115 -0
  96. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -0
  97. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js +126 -0
  98. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js.map +1 -0
  99. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js +74 -0
  100. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js.map +1 -0
  101. package/build/src/run/ios/appleDevice/protocol/UsbmuxProtocol.js +65 -0
  102. package/build/src/run/ios/appleDevice/protocol/UsbmuxProtocol.js.map +1 -0
  103. package/build/src/run/ios/codeSigning/Security.js +85 -0
  104. package/build/src/run/ios/codeSigning/Security.js.map +1 -0
  105. package/build/src/run/ios/codeSigning/configureCodeSigning.js +77 -0
  106. package/build/src/run/ios/codeSigning/configureCodeSigning.js.map +1 -0
  107. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js +102 -0
  108. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js.map +1 -0
  109. package/build/src/run/ios/codeSigning/settings.js +21 -0
  110. package/build/src/run/ios/codeSigning/settings.js.map +1 -0
  111. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js +76 -0
  112. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js.map +1 -0
  113. package/build/src/run/ios/index.js +98 -0
  114. package/build/src/run/ios/index.js.map +1 -0
  115. package/build/src/run/ios/launchApp.js +75 -0
  116. package/build/src/run/ios/launchApp.js.map +1 -0
  117. package/build/src/run/ios/options/promptDevice.js +50 -0
  118. package/build/src/run/ios/options/promptDevice.js.map +1 -0
  119. package/build/src/run/ios/options/resolveDevice.js +92 -0
  120. package/build/src/run/ios/options/resolveDevice.js.map +1 -0
  121. package/build/src/run/ios/options/resolveNativeScheme.js +92 -0
  122. package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -0
  123. package/build/src/run/ios/options/resolveOptions.js +44 -0
  124. package/build/src/run/ios/options/resolveOptions.js.map +1 -0
  125. package/build/src/run/ios/options/resolveXcodeProject.js +39 -0
  126. package/build/src/run/ios/options/resolveXcodeProject.js.map +1 -0
  127. package/build/src/run/ios/runIosAsync.js +85 -0
  128. package/build/src/run/ios/runIosAsync.js.map +1 -0
  129. package/build/src/run/resolveBundlerProps.js +9 -6
  130. package/build/src/run/resolveBundlerProps.js.map +1 -1
  131. package/build/src/run/startBundler.js +4 -2
  132. package/build/src/run/startBundler.js.map +1 -1
  133. package/build/src/start/doctor/Prerequisite.js +4 -4
  134. package/build/src/start/doctor/Prerequisite.js.map +1 -1
  135. package/build/src/start/doctor/SecurityBinPrerequisite.js +27 -0
  136. package/build/src/start/doctor/SecurityBinPrerequisite.js.map +1 -0
  137. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js +2 -0
  138. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -1
  139. package/build/src/start/doctor/apple/XcodeDeveloperDiskImagePrerequisite.js +69 -0
  140. package/build/src/start/doctor/apple/XcodeDeveloperDiskImagePrerequisite.js.map +1 -0
  141. package/build/src/start/doctor/apple/XcodePrerequisite.js +2 -0
  142. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  143. package/build/src/start/doctor/dependencies/bundledNativeModules.js +3 -2
  144. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  145. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +7 -13
  146. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  147. package/build/src/start/doctor/dependencies/getMissingPackages.js +3 -24
  148. package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -1
  149. package/build/src/start/doctor/dependencies/getVersionedPackages.js +2 -23
  150. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  151. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +17 -9
  152. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  153. package/build/src/start/doctor/ngrok/ExternalModule.js +2 -1
  154. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  155. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +4 -3
  156. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  157. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +32 -31
  158. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  159. package/build/src/start/interface/KeyPressHandler.js +2 -0
  160. package/build/src/start/interface/KeyPressHandler.js.map +1 -1
  161. package/build/src/start/interface/interactiveActions.js +5 -5
  162. package/build/src/start/interface/interactiveActions.js.map +1 -1
  163. package/build/src/start/interface/startInterface.js +3 -2
  164. package/build/src/start/interface/startInterface.js.map +1 -1
  165. package/build/src/start/platforms/ExpoGoInstaller.js +2 -1
  166. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  167. package/build/src/start/platforms/PlatformManager.js +4 -24
  168. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  169. package/build/src/start/platforms/android/ADBServer.js +17 -32
  170. package/build/src/start/platforms/android/ADBServer.js.map +1 -1
  171. package/build/src/start/platforms/android/AndroidSdk.js +41 -0
  172. package/build/src/start/platforms/android/AndroidSdk.js.map +1 -0
  173. package/build/src/start/platforms/android/activateWindow.js +4 -4
  174. package/build/src/start/platforms/android/activateWindow.js.map +1 -1
  175. package/build/src/start/platforms/android/adb.js +8 -3
  176. package/build/src/start/platforms/android/adb.js.map +1 -1
  177. package/build/src/start/platforms/android/adbReverse.js +3 -2
  178. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  179. package/build/src/start/platforms/android/emulator.js +8 -0
  180. package/build/src/start/platforms/android/emulator.js.map +1 -1
  181. package/build/src/start/platforms/android/gradle.js +2 -2
  182. package/build/src/start/platforms/android/gradle.js.map +1 -1
  183. package/build/src/start/platforms/android/promptAndroidDevice.js +1 -5
  184. package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -1
  185. package/build/src/start/platforms/ios/AppleDeviceManager.js +5 -1
  186. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  187. package/build/src/start/platforms/ios/getBestSimulator.js +4 -4
  188. package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
  189. package/build/src/start/platforms/ios/promptAppleDevice.js +1 -5
  190. package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -1
  191. package/build/src/start/platforms/ios/simctl.js +14 -0
  192. package/build/src/start/platforms/ios/simctl.js.map +1 -1
  193. package/build/src/start/platforms/ios/simctlLogging.js +220 -0
  194. package/build/src/start/platforms/ios/simctlLogging.js.map +1 -0
  195. package/build/src/start/platforms/ios/xcrun.js +2 -23
  196. package/build/src/start/platforms/ios/xcrun.js.map +1 -1
  197. package/build/src/start/project/devices.js +2 -0
  198. package/build/src/start/project/devices.js.map +1 -1
  199. package/build/src/start/server/AsyncNgrok.js +6 -5
  200. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  201. package/build/src/start/server/BundlerDevServer.js +15 -8
  202. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  203. package/build/src/start/server/DevServerManager.js +15 -5
  204. package/build/src/start/server/DevServerManager.js.map +1 -1
  205. package/build/src/start/server/DevelopmentSession.js +4 -0
  206. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  207. package/build/src/start/server/UrlCreator.js +10 -3
  208. package/build/src/start/server/UrlCreator.js.map +1 -1
  209. package/build/src/start/server/metro/MetroBundlerDevServer.js +9 -0
  210. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  211. package/build/src/start/server/metro/TerminalReporter.js +5 -0
  212. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  213. package/build/src/start/server/metro/instantiateMetro.js +11 -1
  214. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  215. package/build/src/start/server/metro/resolveFromProject.js +8 -0
  216. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  217. package/build/src/start/server/metro/withMetroMultiPlatform.js +115 -0
  218. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -0
  219. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
  220. package/build/src/start/server/middleware/ExpoMiddleware.js +9 -4
  221. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  222. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js +24 -0
  223. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -0
  224. package/build/src/start/server/middleware/InterstitialPageMiddleware.js +2 -0
  225. package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
  226. package/build/src/start/server/middleware/ManifestMiddleware.js +57 -6
  227. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  228. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +6 -1
  229. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  230. package/build/src/start/server/middleware/ServeStaticMiddleware.js +62 -0
  231. package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -0
  232. package/build/src/start/server/platformBundlers.js +18 -0
  233. package/build/src/start/server/platformBundlers.js.map +1 -0
  234. package/build/src/start/server/webTemplate.js +68 -0
  235. package/build/src/start/server/webTemplate.js.map +1 -0
  236. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +59 -19
  237. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  238. package/build/src/start/server/webpack/compile.js +64 -0
  239. package/build/src/start/server/webpack/compile.js.map +1 -0
  240. package/build/src/start/startAsync.js +21 -17
  241. package/build/src/start/startAsync.js.map +1 -1
  242. package/build/src/utils/FileNotifier.js +5 -2
  243. package/build/src/utils/FileNotifier.js.map +1 -1
  244. package/build/src/utils/analytics/rudderstackClient.js +30 -3
  245. package/build/src/utils/analytics/rudderstackClient.js.map +1 -1
  246. package/build/src/utils/cocoapods.js +47 -0
  247. package/build/src/utils/cocoapods.js.map +1 -1
  248. package/build/src/utils/dir.js +6 -1
  249. package/build/src/utils/dir.js.map +1 -1
  250. package/build/src/utils/downloadAppAsync.js +3 -2
  251. package/build/src/utils/downloadAppAsync.js.map +1 -1
  252. package/build/src/utils/downloadExpoGoAsync.js +7 -32
  253. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  254. package/build/src/utils/editor.js +3 -2
  255. package/build/src/utils/editor.js.map +1 -1
  256. package/build/src/utils/env.js +3 -0
  257. package/build/src/utils/env.js.map +1 -1
  258. package/build/src/utils/exit.js +4 -25
  259. package/build/src/utils/exit.js.map +1 -1
  260. package/build/src/utils/getRunningProcess.js +6 -2
  261. package/build/src/utils/getRunningProcess.js.map +1 -1
  262. package/build/src/utils/nodeModules.js +13 -102
  263. package/build/src/utils/nodeModules.js.map +1 -1
  264. package/build/src/utils/npm.js +3 -24
  265. package/build/src/utils/npm.js.map +1 -1
  266. package/build/src/utils/ora.js +1 -13
  267. package/build/src/utils/ora.js.map +1 -1
  268. package/build/src/utils/plist.js +59 -0
  269. package/build/src/utils/plist.js.map +1 -0
  270. package/build/src/utils/progress.js +46 -0
  271. package/build/src/utils/progress.js.map +1 -1
  272. package/build/src/utils/prompts.js +19 -3
  273. package/build/src/utils/prompts.js.map +1 -1
  274. package/build/src/utils/resolveArgs.js +4 -1
  275. package/build/src/utils/resolveArgs.js.map +1 -1
  276. package/build/src/utils/tar.js +3 -0
  277. package/build/src/utils/tar.js.map +1 -1
  278. package/build/src/utils/terminal.js +10 -0
  279. package/build/src/utils/terminal.js.map +1 -0
  280. package/build/src/utils/validateApplicationId.js +9 -2
  281. package/build/src/utils/validateApplicationId.js.map +1 -1
  282. package/build/src/utils/variadic.js +47 -0
  283. package/build/src/utils/variadic.js.map +1 -0
  284. package/package.json +14 -10
  285. package/static/template/babel.config.js +6 -0
  286. package/static/template/index.html +117 -0
  287. package/static/template/metro.config.js +4 -0
  288. package/static/template/serve.json +13 -0
  289. package/static/template/webpack.config.js +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/InstallationProxyClient.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';\n\nimport { LockdownProtocolClient } from '../protocol/LockdownProtocol';\nimport type { LockdownCommand, LockdownResponse } from '../protocol/LockdownProtocol';\nimport { ResponseError, ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:installation_proxy');\n\nexport type OnInstallProgressCallback = (props: {\n status: string;\n isComplete: boolean;\n // copiedFiles: number;\n progress: number;\n}) => void;\n\ninterface IPOptions {\n ApplicationsType?: 'Any';\n PackageType?: 'Developer';\n CFBundleIdentifier?: string;\n ReturnAttributes?: ('CFBundleIdentifier' | 'CFBundleExecutable' | 'Container' | 'Path')[];\n BundleIDs?: string[];\n [key: string]: undefined | string | string[];\n}\n\ninterface IPInstallPercentCompleteResponseItem extends LockdownResponse {\n PercentComplete: number;\n}\n\ninterface IPInstallCFBundleIdentifierResponseItem {\n CFBundleIdentifier: string;\n}\n\ninterface IPInstallCompleteResponseItem extends LockdownResponse {\n Status: 'Complete';\n}\n/*\n * [{ \"PercentComplete\": 5, \"Status\": \"CreatingStagingDirectory\" }]\n * ...\n * [{ \"PercentComplete\": 90, \"Status\": \"GeneratingApplicationMap\" }]\n * [{ \"CFBundleIdentifier\": \"my.company.app\" }]\n * [{ \"Status\": \"Complete\" }]\n */\ntype IPInstallPercentCompleteResponse = IPInstallPercentCompleteResponseItem[];\ntype IPInstallCFBundleIdentifierResponse = IPInstallCFBundleIdentifierResponseItem[];\ntype IPInstallCompleteResponse = IPInstallCompleteResponseItem[];\n\ninterface IPMessage extends LockdownCommand {\n Command: string;\n ClientOptions: IPOptions;\n}\n\ninterface IPLookupResponseItem extends LockdownResponse {\n LookupResult: IPLookupResult;\n}\n/*\n * [{\n * LookupResult: IPLookupResult,\n * Status: \"Complete\"\n * }]\n */\ntype IPLookupResponse = IPLookupResponseItem[];\n\nexport interface IPLookupResult {\n // BundleId\n [key: string]: {\n Container: string;\n CFBundleIdentifier: string;\n CFBundleExecutable: string;\n Path: string;\n };\n}\n\nfunction isIPLookupResponse(resp: any): resp is IPLookupResponse {\n return resp.length && resp[0].LookupResult !== undefined;\n}\n\nfunction isIPInstallPercentCompleteResponse(resp: any): resp is IPInstallPercentCompleteResponse {\n return resp.length && resp[0].PercentComplete !== undefined;\n}\n\nfunction isIPInstallCFBundleIdentifierResponse(\n resp: any\n): resp is IPInstallCFBundleIdentifierResponse {\n return resp.length && resp[0].CFBundleIdentifier !== undefined;\n}\n\nfunction isIPInstallCompleteResponse(resp: any): resp is IPInstallCompleteResponse {\n return resp.length && resp[0].Status === 'Complete';\n}\n\nexport class InstallationProxyClient extends ServiceClient<LockdownProtocolClient<IPMessage>> {\n constructor(public socket: Socket) {\n super(socket, new LockdownProtocolClient(socket));\n }\n\n async lookupApp(\n bundleIds: string[],\n options: IPOptions = {\n ReturnAttributes: ['Path', 'Container', 'CFBundleExecutable', 'CFBundleIdentifier'],\n ApplicationsType: 'Any',\n }\n ) {\n debug(`lookupApp, options: ${JSON.stringify(options)}`);\n\n let resp = await this.protocolClient.sendMessage({\n Command: 'Lookup',\n ClientOptions: {\n BundleIDs: bundleIds,\n ...options,\n },\n });\n if (resp && !Array.isArray(resp)) resp = [resp];\n if (isIPLookupResponse(resp)) {\n return resp[0].LookupResult;\n } else {\n throw new ResponseError(`There was an error looking up app`, resp);\n }\n }\n\n async installApp(\n packagePath: string,\n bundleId: string,\n options: IPOptions = {\n ApplicationsType: 'Any',\n PackageType: 'Developer',\n },\n onProgress: OnInstallProgressCallback\n ) {\n debug(`installApp, packagePath: ${packagePath}, bundleId: ${bundleId}`);\n\n return this.protocolClient.sendMessage(\n {\n Command: 'Install',\n PackagePath: packagePath,\n ClientOptions: {\n CFBundleIdentifier: bundleId,\n ...options,\n },\n },\n (resp, resolve, reject) => {\n if (resp && !Array.isArray(resp)) resp = [resp];\n\n if (isIPInstallCompleteResponse(resp)) {\n onProgress({\n isComplete: true,\n progress: 100,\n status: resp[0].Status,\n });\n resolve();\n } else if (isIPInstallPercentCompleteResponse(resp)) {\n onProgress({\n isComplete: false,\n progress: resp[0].PercentComplete,\n status: resp[0].Status,\n });\n debug(`Installation status: ${resp[0].Status}, %${resp[0].PercentComplete}`);\n } else if (isIPInstallCFBundleIdentifierResponse(resp)) {\n debug(`Installed app: ${resp[0].CFBundleIdentifier}`);\n } else {\n reject(\n new ResponseError(\n 'There was an error installing app: ' + require('util').inspect(resp),\n resp\n )\n );\n }\n }\n );\n }\n}\n"],"names":["debug","Debug","isIPLookupResponse","resp","length","LookupResult","undefined","isIPInstallPercentCompleteResponse","PercentComplete","isIPInstallCFBundleIdentifierResponse","CFBundleIdentifier","isIPInstallCompleteResponse","Status","InstallationProxyClient","ServiceClient","constructor","socket","LockdownProtocolClient","lookupApp","bundleIds","options","ReturnAttributes","ApplicationsType","JSON","stringify","protocolClient","sendMessage","Command","ClientOptions","BundleIDs","Array","isArray","ResponseError","installApp","packagePath","bundleId","PackageType","onProgress","PackagePath","resolve","reject","isComplete","progress","status","require","inspect"],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ var _debug = _interopRequireDefault(require("debug"));
6
+ var tls = _interopRequireWildcard(require("tls"));
7
+ var _lockdownProtocol = require("../protocol/LockdownProtocol");
8
+ var _serviceClient = require("./ServiceClient");
9
+ function _interopRequireDefault(obj) {
10
+ return obj && obj.__esModule ? obj : {
11
+ default: obj
12
+ };
13
+ }
14
+ function _interopRequireWildcard(obj) {
15
+ if (obj && obj.__esModule) {
16
+ return obj;
17
+ } else {
18
+ var newObj = {};
19
+ if (obj != null) {
20
+ for(var key in obj){
21
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
22
+ var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
23
+ if (desc.get || desc.set) {
24
+ Object.defineProperty(newObj, key, desc);
25
+ } else {
26
+ newObj[key] = obj[key];
27
+ }
28
+ }
29
+ }
30
+ }
31
+ newObj.default = obj;
32
+ return newObj;
33
+ }
34
+ }
35
+ const debug = (0, _debug).default("expo:apple-device:client:lockdownd");
36
+ function isLockdowndServiceResponse(resp) {
37
+ return resp.Request === "StartService" && resp.Service !== undefined && resp.Port !== undefined;
38
+ }
39
+ function isLockdowndSessionResponse(resp) {
40
+ return resp.Request === "StartSession";
41
+ }
42
+ function isLockdowndAllValuesResponse(resp) {
43
+ return resp.Request === "GetValue" && resp.Value !== undefined;
44
+ }
45
+ function isLockdowndValueResponse(resp) {
46
+ return resp.Request === "GetValue" && resp.Key !== undefined && typeof resp.Value === "string";
47
+ }
48
+ function isLockdowndQueryTypeResponse(resp) {
49
+ return resp.Request === "QueryType" && resp.Type !== undefined;
50
+ }
51
+ class LockdowndClient extends _serviceClient.ServiceClient {
52
+ constructor(socket){
53
+ super(socket, new _lockdownProtocol.LockdownProtocolClient(socket));
54
+ this.socket = socket;
55
+ }
56
+ async startService(name) {
57
+ debug(`startService: ${name}`);
58
+ const resp = await this.protocolClient.sendMessage({
59
+ Request: "StartService",
60
+ Service: name
61
+ });
62
+ if (isLockdowndServiceResponse(resp)) {
63
+ return {
64
+ port: resp.Port,
65
+ enableServiceSSL: !!resp.EnableServiceSSL
66
+ };
67
+ } else {
68
+ throw new _serviceClient.ResponseError(`Error starting service ${name}`, resp);
69
+ }
70
+ }
71
+ async startSession(pairRecord) {
72
+ debug(`startSession: ${pairRecord}`);
73
+ const resp = await this.protocolClient.sendMessage({
74
+ Request: "StartSession",
75
+ HostID: pairRecord.HostID,
76
+ SystemBUID: pairRecord.SystemBUID
77
+ });
78
+ if (isLockdowndSessionResponse(resp)) {
79
+ if (resp.EnableSessionSSL) {
80
+ this.protocolClient.socket = new tls.TLSSocket(this.protocolClient.socket, {
81
+ secureContext: tls.createSecureContext({
82
+ secureProtocol: "TLSv1_method",
83
+ cert: pairRecord.RootCertificate,
84
+ key: pairRecord.RootPrivateKey
85
+ })
86
+ });
87
+ debug(`Socket upgraded to TLS connection`);
88
+ }
89
+ // TODO: save sessionID for StopSession?
90
+ } else {
91
+ throw new _serviceClient.ResponseError("Error starting session", resp);
92
+ }
93
+ }
94
+ async getAllValues() {
95
+ debug(`getAllValues`);
96
+ const resp = await this.protocolClient.sendMessage({
97
+ Request: "GetValue"
98
+ });
99
+ if (isLockdowndAllValuesResponse(resp)) {
100
+ return resp.Value;
101
+ } else {
102
+ throw new _serviceClient.ResponseError("Error getting lockdown value", resp);
103
+ }
104
+ }
105
+ async getValue(val) {
106
+ debug(`getValue: ${val}`);
107
+ const resp = await this.protocolClient.sendMessage({
108
+ Request: "GetValue",
109
+ Key: val
110
+ });
111
+ if (isLockdowndValueResponse(resp)) {
112
+ return resp.Value;
113
+ } else {
114
+ throw new _serviceClient.ResponseError("Error getting lockdown value", resp);
115
+ }
116
+ }
117
+ async queryType() {
118
+ debug("queryType");
119
+ const resp = await this.protocolClient.sendMessage({
120
+ Request: "QueryType"
121
+ });
122
+ if (isLockdowndQueryTypeResponse(resp)) {
123
+ return resp.Type;
124
+ } else {
125
+ throw new _serviceClient.ResponseError("Error getting lockdown query type", resp);
126
+ }
127
+ }
128
+ async doHandshake(pairRecord) {
129
+ debug("doHandshake");
130
+ // if (await this.lockdownQueryType() !== 'com.apple.mobile.lockdown') {
131
+ // throw new CommandError('Invalid type received from lockdown handshake');
132
+ // }
133
+ // await this.getLockdownValue('ProductVersion');
134
+ // TODO: validate pair and pair
135
+ await this.startSession(pairRecord);
136
+ }
137
+ }
138
+ exports.LockdowndClient = LockdowndClient;
139
+
140
+ //# sourceMappingURL=LockdowndClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/LockdowndClient.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 tls from 'tls';\n\nimport { LockdownProtocolClient } from '../protocol/LockdownProtocol';\nimport { ResponseError, ServiceClient } from './ServiceClient';\nimport { UsbmuxdPairRecord } from './UsbmuxdClient';\n\nconst debug = Debug('expo:apple-device:client:lockdownd');\n\nexport interface DeviceValues {\n BasebandCertId: number;\n BasebandKeyHashInformation: {\n AKeyStatus: number;\n SKeyHash: Buffer;\n SKeyStatus: number;\n };\n BasebandSerialNumber: Buffer;\n BasebandVersion: string;\n BoardId: number;\n BuildVersion: string;\n ChipID: number;\n DeviceClass: string;\n DeviceColor: string;\n DeviceName: string;\n DieID: number;\n HardwareModel: string;\n HasSiDP: boolean;\n PartitionType: string;\n ProductName: string;\n ProductType: string;\n ProductVersion: string;\n ProductionSOC: boolean;\n ProtocolVersion: string;\n TelephonyCapability: boolean;\n UniqueChipID: number;\n UniqueDeviceID: string;\n WiFiAddress: string;\n [key: string]: any;\n}\n\ninterface LockdowndServiceResponse {\n Request: 'StartService';\n Service: string;\n Port: number;\n EnableServiceSSL?: boolean; // Only on iOS 13+\n}\n\ninterface LockdowndSessionResponse {\n Request: 'StartSession';\n EnableSessionSSL: boolean;\n}\n\ninterface LockdowndAllValuesResponse {\n Request: 'GetValue';\n Value: DeviceValues;\n}\n\ninterface LockdowndValueResponse {\n Request: 'GetValue';\n Key: string;\n Value: string;\n}\n\ninterface LockdowndQueryTypeResponse {\n Request: 'QueryType';\n Type: string;\n}\n\nfunction isLockdowndServiceResponse(resp: any): resp is LockdowndServiceResponse {\n return resp.Request === 'StartService' && resp.Service !== undefined && resp.Port !== undefined;\n}\n\nfunction isLockdowndSessionResponse(resp: any): resp is LockdowndSessionResponse {\n return resp.Request === 'StartSession';\n}\n\nfunction isLockdowndAllValuesResponse(resp: any): resp is LockdowndAllValuesResponse {\n return resp.Request === 'GetValue' && resp.Value !== undefined;\n}\n\nfunction isLockdowndValueResponse(resp: any): resp is LockdowndValueResponse {\n return resp.Request === 'GetValue' && resp.Key !== undefined && typeof resp.Value === 'string';\n}\n\nfunction isLockdowndQueryTypeResponse(resp: any): resp is LockdowndQueryTypeResponse {\n return resp.Request === 'QueryType' && resp.Type !== undefined;\n}\n\nexport class LockdowndClient extends ServiceClient<LockdownProtocolClient> {\n constructor(public socket: Socket) {\n super(socket, new LockdownProtocolClient(socket));\n }\n\n async startService(name: string) {\n debug(`startService: ${name}`);\n\n const resp = await this.protocolClient.sendMessage({\n Request: 'StartService',\n Service: name,\n });\n\n if (isLockdowndServiceResponse(resp)) {\n return { port: resp.Port, enableServiceSSL: !!resp.EnableServiceSSL };\n } else {\n throw new ResponseError(`Error starting service ${name}`, resp);\n }\n }\n\n async startSession(pairRecord: UsbmuxdPairRecord) {\n debug(`startSession: ${pairRecord}`);\n\n const resp = await this.protocolClient.sendMessage({\n Request: 'StartSession',\n HostID: pairRecord.HostID,\n SystemBUID: pairRecord.SystemBUID,\n });\n\n if (isLockdowndSessionResponse(resp)) {\n if (resp.EnableSessionSSL) {\n this.protocolClient.socket = new tls.TLSSocket(this.protocolClient.socket, {\n secureContext: tls.createSecureContext({\n secureProtocol: 'TLSv1_method',\n cert: pairRecord.RootCertificate,\n key: pairRecord.RootPrivateKey,\n }),\n });\n debug(`Socket upgraded to TLS connection`);\n }\n // TODO: save sessionID for StopSession?\n } else {\n throw new ResponseError('Error starting session', resp);\n }\n }\n\n async getAllValues() {\n debug(`getAllValues`);\n\n const resp = await this.protocolClient.sendMessage({ Request: 'GetValue' });\n\n if (isLockdowndAllValuesResponse(resp)) {\n return resp.Value;\n } else {\n throw new ResponseError('Error getting lockdown value', resp);\n }\n }\n\n async getValue(val: string) {\n debug(`getValue: ${val}`);\n\n const resp = await this.protocolClient.sendMessage({\n Request: 'GetValue',\n Key: val,\n });\n\n if (isLockdowndValueResponse(resp)) {\n return resp.Value;\n } else {\n throw new ResponseError('Error getting lockdown value', resp);\n }\n }\n\n async queryType() {\n debug('queryType');\n\n const resp = await this.protocolClient.sendMessage({\n Request: 'QueryType',\n });\n\n if (isLockdowndQueryTypeResponse(resp)) {\n return resp.Type;\n } else {\n throw new ResponseError('Error getting lockdown query type', resp);\n }\n }\n\n async doHandshake(pairRecord: UsbmuxdPairRecord) {\n debug('doHandshake');\n\n // if (await this.lockdownQueryType() !== 'com.apple.mobile.lockdown') {\n // throw new CommandError('Invalid type received from lockdown handshake');\n // }\n // await this.getLockdownValue('ProductVersion');\n // TODO: validate pair and pair\n await this.startSession(pairRecord);\n }\n}\n"],"names":["tls","debug","Debug","isLockdowndServiceResponse","resp","Request","Service","undefined","Port","isLockdowndSessionResponse","isLockdowndAllValuesResponse","Value","isLockdowndValueResponse","Key","isLockdowndQueryTypeResponse","Type","LockdowndClient","ServiceClient","constructor","socket","LockdownProtocolClient","startService","name","protocolClient","sendMessage","port","enableServiceSSL","EnableServiceSSL","ResponseError","startSession","pairRecord","HostID","SystemBUID","EnableSessionSSL","TLSSocket","secureContext","createSecureContext","secureProtocol","cert","RootCertificate","key","RootPrivateKey","getAllValues","getValue","val","queryType","doHandshake"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ var _debug = _interopRequireDefault(require("debug"));
6
+ var fs = _interopRequireWildcard(require("fs"));
7
+ var _lockdownProtocol = require("../protocol/LockdownProtocol");
8
+ var _serviceClient = require("./ServiceClient");
9
+ function _interopRequireDefault(obj) {
10
+ return obj && obj.__esModule ? obj : {
11
+ default: obj
12
+ };
13
+ }
14
+ function _interopRequireWildcard(obj) {
15
+ if (obj && obj.__esModule) {
16
+ return obj;
17
+ } else {
18
+ var newObj = {};
19
+ if (obj != null) {
20
+ for(var key in obj){
21
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
22
+ var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
23
+ if (desc.get || desc.set) {
24
+ Object.defineProperty(newObj, key, desc);
25
+ } else {
26
+ newObj[key] = obj[key];
27
+ }
28
+ }
29
+ }
30
+ }
31
+ newObj.default = obj;
32
+ return newObj;
33
+ }
34
+ }
35
+ const debug = (0, _debug).default("expo:apple-device:client:mobile_image_mounter");
36
+ function isMIMUploadCompleteResponse(resp) {
37
+ return resp.Status === "Complete";
38
+ }
39
+ function isMIMUploadReceiveBytesResponse(resp) {
40
+ return resp.Status === "ReceiveBytesAck";
41
+ }
42
+ class MobileImageMounterClient extends _serviceClient.ServiceClient {
43
+ constructor(socket){
44
+ super(socket, new _lockdownProtocol.LockdownProtocolClient(socket));
45
+ }
46
+ async mountImage(imagePath, imageSig) {
47
+ debug(`mountImage: ${imagePath}`);
48
+ const resp = await this.protocolClient.sendMessage({
49
+ Command: "MountImage",
50
+ ImagePath: imagePath,
51
+ ImageSignature: imageSig,
52
+ ImageType: "Developer"
53
+ });
54
+ if (!(0, _lockdownProtocol).isLockdownResponse(resp) || resp.Status !== "Complete") {
55
+ throw new _serviceClient.ResponseError(`There was an error mounting ${imagePath} on device`, resp);
56
+ }
57
+ }
58
+ async uploadImage(imagePath, imageSig) {
59
+ debug(`uploadImage: ${imagePath}`);
60
+ const imageSize = fs.statSync(imagePath).size;
61
+ return this.protocolClient.sendMessage({
62
+ Command: "ReceiveBytes",
63
+ ImageSize: imageSize,
64
+ ImageSignature: imageSig,
65
+ ImageType: "Developer"
66
+ }, (resp, resolve, reject)=>{
67
+ if (isMIMUploadReceiveBytesResponse(resp)) {
68
+ const imageStream = fs.createReadStream(imagePath);
69
+ imageStream.pipe(this.protocolClient.socket, {
70
+ end: false
71
+ });
72
+ imageStream.on("error", (err)=>reject(err)
73
+ );
74
+ } else if (isMIMUploadCompleteResponse(resp)) {
75
+ resolve();
76
+ } else {
77
+ reject(new _serviceClient.ResponseError(`There was an error uploading image ${imagePath} to the device`, resp));
78
+ }
79
+ });
80
+ }
81
+ async lookupImage() {
82
+ debug("lookupImage");
83
+ return this.protocolClient.sendMessage({
84
+ Command: "LookupImage",
85
+ ImageType: "Developer"
86
+ });
87
+ }
88
+ }
89
+ exports.MobileImageMounterClient = MobileImageMounterClient;
90
+
91
+ //# sourceMappingURL=MobileImageMounterClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/MobileImageMounterClient.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';\n\nimport type { LockdownCommand, LockdownResponse } from '../protocol/LockdownProtocol';\nimport { isLockdownResponse, LockdownProtocolClient } from '../protocol/LockdownProtocol';\nimport { ResponseError, ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:mobile_image_mounter');\n\nexport type MIMMountResponse = LockdownResponse;\n\nexport interface MIMMessage extends LockdownCommand {\n ImageType: string;\n}\n\nexport interface MIMLookupResponse extends LockdownResponse {\n ImageSignature?: string;\n}\n\nexport interface MIMUploadCompleteResponse extends LockdownResponse {\n Status: 'Complete';\n}\n\nexport interface MIMUploadReceiveBytesResponse extends LockdownResponse {\n Status: 'ReceiveBytesAck';\n}\n\nfunction isMIMUploadCompleteResponse(resp: any): resp is MIMUploadCompleteResponse {\n return resp.Status === 'Complete';\n}\n\nfunction isMIMUploadReceiveBytesResponse(resp: any): resp is MIMUploadReceiveBytesResponse {\n return resp.Status === 'ReceiveBytesAck';\n}\n\nexport class MobileImageMounterClient extends ServiceClient<LockdownProtocolClient<MIMMessage>> {\n constructor(socket: Socket) {\n super(socket, new LockdownProtocolClient(socket));\n }\n\n async mountImage(imagePath: string, imageSig: Buffer) {\n debug(`mountImage: ${imagePath}`);\n\n const resp = await this.protocolClient.sendMessage({\n Command: 'MountImage',\n ImagePath: imagePath,\n ImageSignature: imageSig,\n ImageType: 'Developer',\n });\n\n if (!isLockdownResponse(resp) || resp.Status !== 'Complete') {\n throw new ResponseError(`There was an error mounting ${imagePath} on device`, resp);\n }\n }\n\n async uploadImage(imagePath: string, imageSig: Buffer) {\n debug(`uploadImage: ${imagePath}`);\n\n const imageSize = fs.statSync(imagePath).size;\n return this.protocolClient.sendMessage(\n {\n Command: 'ReceiveBytes',\n ImageSize: imageSize,\n ImageSignature: imageSig,\n ImageType: 'Developer',\n },\n (resp: any, resolve, reject) => {\n if (isMIMUploadReceiveBytesResponse(resp)) {\n const imageStream = fs.createReadStream(imagePath);\n imageStream.pipe(this.protocolClient.socket, { end: false });\n imageStream.on('error', (err) => reject(err));\n } else if (isMIMUploadCompleteResponse(resp)) {\n resolve();\n } else {\n reject(\n new ResponseError(`There was an error uploading image ${imagePath} to the device`, resp)\n );\n }\n }\n );\n }\n\n async lookupImage() {\n debug('lookupImage');\n\n return this.protocolClient.sendMessage<MIMLookupResponse>({\n Command: 'LookupImage',\n ImageType: 'Developer',\n });\n }\n}\n"],"names":["fs","debug","Debug","isMIMUploadCompleteResponse","resp","Status","isMIMUploadReceiveBytesResponse","MobileImageMounterClient","ServiceClient","constructor","socket","LockdownProtocolClient","mountImage","imagePath","imageSig","protocolClient","sendMessage","Command","ImagePath","ImageSignature","ImageType","isLockdownResponse","ResponseError","uploadImage","imageSize","statSync","size","ImageSize","resolve","reject","imageStream","createReadStream","pipe","end","on","err","lookupImage"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ var _errors = require("../../../../utils/errors");
6
+ class ServiceClient {
7
+ constructor(socket, protocolClient){
8
+ this.socket = socket;
9
+ this.protocolClient = protocolClient;
10
+ }
11
+ }
12
+ exports.ServiceClient = ServiceClient;
13
+ class ResponseError extends _errors.CommandError {
14
+ constructor(msg, response){
15
+ super(msg);
16
+ this.response = response;
17
+ }
18
+ }
19
+ exports.ResponseError = ResponseError;
20
+
21
+ //# sourceMappingURL=ServiceClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/ServiceClient.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';\n\nimport { CommandError } from '../../../../utils/errors';\nimport { ProtocolClient } from '../protocol/AbstractProtocol';\n\nexport abstract class ServiceClient<T extends ProtocolClient> {\n constructor(public socket: Socket, protected protocolClient: T) {}\n}\n\nexport class ResponseError extends CommandError {\n constructor(msg: string, public response: any) {\n super(msg);\n }\n}\n"],"names":["ServiceClient","constructor","socket","protocolClient","ResponseError","CommandError","msg","response"],"mappings":"AAOA;;;;AAE6B,IAAA,OAA0B,WAA1B,0BAA0B,CAAA;AAGhD,MAAeA,aAAa;IACjCC,YAAmBC,MAAc,EAAYC,cAAiB,CAAE;aAA7CD,MAAc,GAAdA,MAAc;aAAYC,cAAiB,GAAjBA,cAAiB;KAAI;CACnE;QAFqBH,aAAa,GAAbA,aAAa;AAI5B,MAAMI,aAAa,SAASC,OAAY,aAAA;IAC7CJ,YAAYK,GAAW,EAASC,QAAa,CAAE;QAC7C,KAAK,CAACD,GAAG,CAAC,CAAC;aADmBC,QAAa,GAAbA,QAAa;KAE5C;CACF;QAJYH,aAAa,GAAbA,aAAa"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ var _plist = _interopRequireDefault(require("@expo/plist"));
6
+ var _debug = _interopRequireDefault(require("debug"));
7
+ var _net = require("net");
8
+ var _errors = require("../../../../utils/errors");
9
+ var _plist1 = require("../../../../utils/plist");
10
+ var _usbmuxProtocol = require("../protocol/UsbmuxProtocol");
11
+ var _serviceClient = require("./ServiceClient");
12
+ function _interopRequireDefault(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
17
+ const debug = (0, _debug).default("expo:apple-device:client:usbmuxd");
18
+ function isUsbmuxdConnectResponse(resp) {
19
+ return resp.MessageType === "Result" && resp.Number !== undefined;
20
+ }
21
+ function isUsbmuxdDeviceResponse(resp) {
22
+ return resp.DeviceList !== undefined;
23
+ }
24
+ function isUsbmuxdPairRecordResponse(resp) {
25
+ return resp.PairRecordData !== undefined;
26
+ }
27
+ class UsbmuxdClient extends _serviceClient.ServiceClient {
28
+ constructor(socket){
29
+ super(socket, new _usbmuxProtocol.UsbmuxProtocolClient(socket));
30
+ this.socket = socket;
31
+ }
32
+ static connectUsbmuxdSocket() {
33
+ debug("connectUsbmuxdSocket");
34
+ if (process.platform === "win32") {
35
+ return (0, _net).connect({
36
+ port: 27015,
37
+ host: "localhost"
38
+ });
39
+ } else {
40
+ return (0, _net).connect({
41
+ path: "/var/run/usbmuxd"
42
+ });
43
+ }
44
+ }
45
+ async connect(device, port) {
46
+ debug(`connect: ${device.DeviceID} on port ${port}`);
47
+ debug(`connect:device: %O`, device);
48
+ const response = await this.protocolClient.sendMessage({
49
+ messageType: "Connect",
50
+ extraFields: {
51
+ DeviceID: device.DeviceID,
52
+ PortNumber: htons(port)
53
+ }
54
+ });
55
+ debug(`connect:device:response: %O`, response);
56
+ if (isUsbmuxdConnectResponse(response) && response.Number === 0) {
57
+ return this.protocolClient.socket;
58
+ } else {
59
+ throw new _serviceClient.ResponseError(`There was an error connecting to the USB connected device (id: ${device.DeviceID}, port: ${port})`, response);
60
+ }
61
+ }
62
+ async getDevices() {
63
+ debug("getDevices");
64
+ const resp = await this.protocolClient.sendMessage({
65
+ messageType: "ListDevices"
66
+ });
67
+ if (isUsbmuxdDeviceResponse(resp)) {
68
+ return resp.DeviceList;
69
+ } else {
70
+ throw new _serviceClient.ResponseError("Invalid response from getDevices", resp);
71
+ }
72
+ }
73
+ async getDevice(udid) {
74
+ debug(`getDevice ${udid ? "udid: " + udid : ""}`);
75
+ const devices = await this.getDevices();
76
+ if (!devices.length) {
77
+ throw new _errors.CommandError("APPLE_DEVICE_USBMUXD", "No devices found");
78
+ }
79
+ if (!udid) {
80
+ return devices[0];
81
+ }
82
+ for (const device of devices){
83
+ if (device.Properties && device.Properties.SerialNumber === udid) {
84
+ return device;
85
+ }
86
+ }
87
+ throw new _errors.CommandError("APPLE_DEVICE_USBMUXD", `No device found (udid: ${udid})`);
88
+ }
89
+ async readPairRecord(udid) {
90
+ debug(`readPairRecord: ${udid}`);
91
+ const resp = await this.protocolClient.sendMessage({
92
+ messageType: "ReadPairRecord",
93
+ extraFields: {
94
+ PairRecordID: udid
95
+ }
96
+ });
97
+ if (isUsbmuxdPairRecordResponse(resp)) {
98
+ // the pair record can be created as a binary plist
99
+ const BPLIST_MAGIC = Buffer.from("bplist00");
100
+ if (BPLIST_MAGIC.compare(resp.PairRecordData, 0, 8) === 0) {
101
+ debug("Binary plist pair record detected.");
102
+ return (0, _plist1).parsePlistBuffer(resp.PairRecordData)[0];
103
+ } else {
104
+ // TODO: use parsePlistBuffer
105
+ return _plist.default.parse(resp.PairRecordData.toString()); // TODO: type guard
106
+ }
107
+ } else {
108
+ throw new _serviceClient.ResponseError(`There was an error reading pair record for device (udid: ${udid})`, resp);
109
+ }
110
+ }
111
+ }
112
+ exports.UsbmuxdClient = UsbmuxdClient;
113
+ function htons(n) {
114
+ return (n & 255) << 8 | n >> 8 & 255;
115
+ }
116
+
117
+ //# sourceMappingURL=UsbmuxdClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/UsbmuxdClient.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 plist from '@expo/plist';\nimport Debug from 'debug';\nimport { Socket, connect } from 'net';\n\nimport { CommandError } from '../../../../utils/errors';\nimport { parsePlistBuffer } from '../../../../utils/plist';\nimport { UsbmuxProtocolClient } from '../protocol/UsbmuxProtocol';\nimport { ResponseError, ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:usbmuxd');\n\nexport interface UsbmuxdDeviceProperties {\n /** 480000000 */\n ConnectionSpeed: number;\n /** 'USB' */\n ConnectionType: 'USB';\n /** 7 */\n DeviceID: number;\n /** 339738624 */\n LocationID: number;\n /** 4776 */\n ProductID: number;\n /** '00008101-001964A22629003A' */\n SerialNumber: string;\n /** '00008101-001964A22629003A' */\n UDID: string;\n /** '00008101001964A22629003A' */\n USBSerialNumber: string;\n}\n\nexport interface UsbmuxdDevice {\n /** 7 */\n DeviceID: number;\n MessageType: 'Attached'; // TODO: what else?\n Properties: UsbmuxdDeviceProperties;\n}\n\nexport interface UsbmuxdConnectResponse {\n MessageType: 'Result';\n Number: number;\n}\n\nexport interface UsbmuxdDeviceResponse {\n DeviceList: UsbmuxdDevice[];\n}\n\nexport interface UsbmuxdPairRecordResponse {\n PairRecordData: Buffer;\n}\n\nexport interface UsbmuxdPairRecord {\n DeviceCertificate: Buffer;\n EscrowBag: Buffer;\n HostCertificate: Buffer;\n HostID: string;\n HostPrivateKey: Buffer;\n RootCertificate: Buffer;\n RootPrivateKey: Buffer;\n SystemBUID: string;\n WiFiMACAddress: string;\n}\n\nfunction isUsbmuxdConnectResponse(resp: any): resp is UsbmuxdConnectResponse {\n return resp.MessageType === 'Result' && resp.Number !== undefined;\n}\n\nfunction isUsbmuxdDeviceResponse(resp: any): resp is UsbmuxdDeviceResponse {\n return resp.DeviceList !== undefined;\n}\n\nfunction isUsbmuxdPairRecordResponse(resp: any): resp is UsbmuxdPairRecordResponse {\n return resp.PairRecordData !== undefined;\n}\n\nexport class UsbmuxdClient extends ServiceClient<UsbmuxProtocolClient> {\n constructor(public socket: Socket) {\n super(socket, new UsbmuxProtocolClient(socket));\n }\n\n static connectUsbmuxdSocket(): Socket {\n debug('connectUsbmuxdSocket');\n if (process.platform === 'win32') {\n return connect({ port: 27015, host: 'localhost' });\n } else {\n return connect({ path: '/var/run/usbmuxd' });\n }\n }\n\n async connect(device: Pick<UsbmuxdDevice, 'DeviceID'>, port: number): Promise<Socket> {\n debug(`connect: ${device.DeviceID} on port ${port}`);\n debug(`connect:device: %O`, device);\n\n const response = await this.protocolClient.sendMessage({\n messageType: 'Connect',\n extraFields: {\n DeviceID: device.DeviceID,\n PortNumber: htons(port),\n },\n });\n debug(`connect:device:response: %O`, response);\n\n if (isUsbmuxdConnectResponse(response) && response.Number === 0) {\n return this.protocolClient.socket;\n } else {\n throw new ResponseError(\n `There was an error connecting to the USB connected device (id: ${device.DeviceID}, port: ${port})`,\n response\n );\n }\n }\n\n async getDevices(): Promise<UsbmuxdDevice[]> {\n debug('getDevices');\n\n const resp = await this.protocolClient.sendMessage({\n messageType: 'ListDevices',\n });\n\n if (isUsbmuxdDeviceResponse(resp)) {\n return resp.DeviceList;\n } else {\n throw new ResponseError('Invalid response from getDevices', resp);\n }\n }\n\n async getDevice(udid?: string): Promise<UsbmuxdDevice> {\n debug(`getDevice ${udid ? 'udid: ' + udid : ''}`);\n const devices = await this.getDevices();\n\n if (!devices.length) {\n throw new CommandError('APPLE_DEVICE_USBMUXD', 'No devices found');\n }\n\n if (!udid) {\n return devices[0];\n }\n\n for (const device of devices) {\n if (device.Properties && device.Properties.SerialNumber === udid) {\n return device;\n }\n }\n\n throw new CommandError('APPLE_DEVICE_USBMUXD', `No device found (udid: ${udid})`);\n }\n\n async readPairRecord(udid: string): Promise<UsbmuxdPairRecord> {\n debug(`readPairRecord: ${udid}`);\n\n const resp = await this.protocolClient.sendMessage({\n messageType: 'ReadPairRecord',\n extraFields: { PairRecordID: udid },\n });\n\n if (isUsbmuxdPairRecordResponse(resp)) {\n // the pair record can be created as a binary plist\n const BPLIST_MAGIC = Buffer.from('bplist00');\n if (BPLIST_MAGIC.compare(resp.PairRecordData, 0, 8) === 0) {\n debug('Binary plist pair record detected.');\n return parsePlistBuffer(resp.PairRecordData)[0];\n } else {\n // TODO: use parsePlistBuffer\n return plist.parse(resp.PairRecordData.toString()) as any; // TODO: type guard\n }\n } else {\n throw new ResponseError(\n `There was an error reading pair record for device (udid: ${udid})`,\n resp\n );\n }\n }\n}\n\nfunction htons(n: number): number {\n return ((n & 0xff) << 8) | ((n >> 8) & 0xff);\n}\n"],"names":["debug","Debug","isUsbmuxdConnectResponse","resp","MessageType","Number","undefined","isUsbmuxdDeviceResponse","DeviceList","isUsbmuxdPairRecordResponse","PairRecordData","UsbmuxdClient","ServiceClient","constructor","socket","UsbmuxProtocolClient","connectUsbmuxdSocket","process","platform","connect","port","host","path","device","DeviceID","response","protocolClient","sendMessage","messageType","extraFields","PortNumber","htons","ResponseError","getDevices","getDevice","udid","devices","length","CommandError","Properties","SerialNumber","readPairRecord","PairRecordID","BPLIST_MAGIC","Buffer","from","compare","parsePlistBuffer","plist","parse","toString","n"],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getAppDeltaDirectory = getAppDeltaDirectory;
6
+ exports.installOnDeviceAsync = installOnDeviceAsync;
7
+ var _chalk = _interopRequireDefault(require("chalk"));
8
+ var _os = _interopRequireDefault(require("os"));
9
+ var _path = _interopRequireDefault(require("path"));
10
+ var _dir = require("../../../utils/dir");
11
+ var _env = require("../../../utils/env");
12
+ var _errors = require("../../../utils/errors");
13
+ var _ora = require("../../../utils/ora");
14
+ var _prompts = require("../../../utils/prompts");
15
+ var AppleDevice = _interopRequireWildcard(require("./AppleDevice"));
16
+ function _interopRequireDefault(obj) {
17
+ return obj && obj.__esModule ? obj : {
18
+ default: obj
19
+ };
20
+ }
21
+ function _interopRequireWildcard(obj) {
22
+ if (obj && obj.__esModule) {
23
+ return obj;
24
+ } else {
25
+ var newObj = {};
26
+ if (obj != null) {
27
+ for(var key in obj){
28
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
29
+ var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
30
+ if (desc.get || desc.set) {
31
+ Object.defineProperty(newObj, key, desc);
32
+ } else {
33
+ newObj[key] = obj[key];
34
+ }
35
+ }
36
+ }
37
+ }
38
+ newObj.default = obj;
39
+ return newObj;
40
+ }
41
+ }
42
+ function getAppDeltaDirectory(bundleId) {
43
+ // TODO: Maybe use .expo folder instead for debugging
44
+ // TODO: Reuse existing folder from xcode?
45
+ const deltaFolder = _path.default.join(_os.default.tmpdir(), "ios", "app-delta", bundleId);
46
+ (0, _dir).ensureDirectory(deltaFolder);
47
+ return deltaFolder;
48
+ }
49
+ async function installOnDeviceAsync(props) {
50
+ const { bundle , bundleIdentifier , appDeltaDirectory , udid , deviceName } = props;
51
+ let indicator;
52
+ try {
53
+ // TODO: Connect for logs
54
+ await AppleDevice.runOnDevice({
55
+ udid,
56
+ appPath: bundle,
57
+ bundleId: bundleIdentifier,
58
+ waitForApp: false,
59
+ deltaPath: appDeltaDirectory,
60
+ onProgress ({ status , isComplete , progress }) {
61
+ if (!indicator) {
62
+ indicator = (0, _ora).ora(status).start();
63
+ }
64
+ indicator.text = `${_chalk.default.bold(status)} ${progress}%`;
65
+ if (isComplete) {
66
+ indicator.succeed();
67
+ }
68
+ }
69
+ });
70
+ } catch (error) {
71
+ if (indicator) {
72
+ indicator.fail();
73
+ }
74
+ if (error.code === "APPLE_DEVICE_LOCKED") {
75
+ var ref;
76
+ // Get the app name from the binary path.
77
+ const appName = (ref = _path.default.basename(bundle).split(".")[0]) != null ? ref : "app";
78
+ if (!_env.env.CI && await (0, _prompts).confirmAsync({
79
+ message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,
80
+ initial: true
81
+ })) {
82
+ return installOnDeviceAsync(props);
83
+ }
84
+ throw new _errors.CommandError(`Cannot launch ${appName} on ${deviceName} because the device is locked.`);
85
+ }
86
+ throw error;
87
+ }
88
+ }
89
+
90
+ //# sourceMappingURL=installOnDeviceAsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/run/ios/appleDevice/installOnDeviceAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Ora } from 'ora';\nimport os from 'os';\nimport path from 'path';\n\nimport { ensureDirectory } from '../../../utils/dir';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { ora } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\nimport * as AppleDevice from './AppleDevice';\n\n/** Get the app_delta folder for faster subsequent rebuilds on devices. */\nexport function getAppDeltaDirectory(bundleId: string): string {\n // TODO: Maybe use .expo folder instead for debugging\n // TODO: Reuse existing folder from xcode?\n const deltaFolder = path.join(os.tmpdir(), 'ios', 'app-delta', bundleId);\n ensureDirectory(deltaFolder);\n return deltaFolder;\n}\n\n/**\n * Wraps the apple device method for installing and running an app,\n * adds indicator and retry loop for when the device is locked.\n */\nexport async function installOnDeviceAsync(props: {\n bundle: string;\n bundleIdentifier: string;\n appDeltaDirectory: string;\n udid: string;\n deviceName: string;\n}): Promise<void> {\n const { bundle, bundleIdentifier, appDeltaDirectory, udid, deviceName } = props;\n let indicator: Ora | undefined;\n\n try {\n // TODO: Connect for logs\n await AppleDevice.runOnDevice({\n udid,\n appPath: bundle,\n bundleId: bundleIdentifier,\n waitForApp: false,\n deltaPath: appDeltaDirectory,\n onProgress({\n status,\n isComplete,\n progress,\n }: {\n status: string;\n isComplete: boolean;\n progress: number;\n }) {\n if (!indicator) {\n indicator = ora(status).start();\n }\n indicator.text = `${chalk.bold(status)} ${progress}%`;\n if (isComplete) {\n indicator.succeed();\n }\n },\n });\n } catch (error: any) {\n if (indicator) {\n indicator.fail();\n }\n if (error.code === 'APPLE_DEVICE_LOCKED') {\n // Get the app name from the binary path.\n const appName = path.basename(bundle).split('.')[0] ?? 'app';\n if (\n !env.CI &&\n (await confirmAsync({\n message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,\n initial: true,\n }))\n ) {\n return installOnDeviceAsync(props);\n }\n throw new CommandError(\n `Cannot launch ${appName} on ${deviceName} because the device is locked.`\n );\n }\n throw error;\n }\n}\n"],"names":["getAppDeltaDirectory","installOnDeviceAsync","AppleDevice","bundleId","deltaFolder","path","join","os","tmpdir","ensureDirectory","props","bundle","bundleIdentifier","appDeltaDirectory","udid","deviceName","indicator","runOnDevice","appPath","waitForApp","deltaPath","onProgress","status","isComplete","progress","ora","start","text","chalk","bold","succeed","error","fail","code","appName","basename","split","env","CI","confirmAsync","message","initial","CommandError"],"mappings":"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"}