@expo/cli 0.1.4 → 0.2.1

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 (190) hide show
  1. package/build/bin/cli +83 -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 +14 -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/start/doctor/apple/SimulatorAppPrerequisite.js +2 -0
  64. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -1
  65. package/build/src/start/doctor/apple/XcodePrerequisite.js +2 -0
  66. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  67. package/build/src/start/doctor/dependencies/bundledNativeModules.js +3 -2
  68. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  69. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +7 -13
  70. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  71. package/build/src/start/doctor/dependencies/getMissingPackages.js +3 -24
  72. package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -1
  73. package/build/src/start/doctor/dependencies/getVersionedPackages.js +2 -23
  74. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  75. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +17 -9
  76. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  77. package/build/src/start/doctor/ngrok/ExternalModule.js +2 -1
  78. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  79. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +4 -3
  80. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  81. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +29 -31
  82. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  83. package/build/src/start/interface/KeyPressHandler.js +2 -0
  84. package/build/src/start/interface/KeyPressHandler.js.map +1 -1
  85. package/build/src/start/interface/interactiveActions.js +5 -5
  86. package/build/src/start/interface/interactiveActions.js.map +1 -1
  87. package/build/src/start/interface/startInterface.js +3 -2
  88. package/build/src/start/interface/startInterface.js.map +1 -1
  89. package/build/src/start/platforms/ExpoGoInstaller.js +2 -1
  90. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  91. package/build/src/start/platforms/PlatformManager.js +4 -24
  92. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  93. package/build/src/start/platforms/android/ADBServer.js +17 -32
  94. package/build/src/start/platforms/android/ADBServer.js.map +1 -1
  95. package/build/src/start/platforms/android/AndroidSdk.js +41 -0
  96. package/build/src/start/platforms/android/AndroidSdk.js.map +1 -0
  97. package/build/src/start/platforms/android/activateWindow.js +4 -4
  98. package/build/src/start/platforms/android/activateWindow.js.map +1 -1
  99. package/build/src/start/platforms/android/adb.js +8 -3
  100. package/build/src/start/platforms/android/adb.js.map +1 -1
  101. package/build/src/start/platforms/android/adbReverse.js +3 -2
  102. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  103. package/build/src/start/platforms/android/gradle.js +2 -2
  104. package/build/src/start/platforms/android/gradle.js.map +1 -1
  105. package/build/src/start/platforms/ios/getBestSimulator.js +4 -4
  106. package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
  107. package/build/src/start/platforms/ios/xcrun.js +2 -23
  108. package/build/src/start/platforms/ios/xcrun.js.map +1 -1
  109. package/build/src/start/project/devices.js +2 -0
  110. package/build/src/start/project/devices.js.map +1 -1
  111. package/build/src/start/server/AsyncNgrok.js +6 -5
  112. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  113. package/build/src/start/server/BundlerDevServer.js +15 -8
  114. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  115. package/build/src/start/server/DevServerManager.js +15 -5
  116. package/build/src/start/server/DevServerManager.js.map +1 -1
  117. package/build/src/start/server/DevelopmentSession.js +4 -0
  118. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  119. package/build/src/start/server/UrlCreator.js +10 -3
  120. package/build/src/start/server/UrlCreator.js.map +1 -1
  121. package/build/src/start/server/metro/MetroBundlerDevServer.js +9 -0
  122. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  123. package/build/src/start/server/metro/TerminalReporter.js +5 -0
  124. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  125. package/build/src/start/server/metro/instantiateMetro.js +11 -1
  126. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  127. package/build/src/start/server/metro/resolveFromProject.js +8 -0
  128. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  129. package/build/src/start/server/metro/withMetroMultiPlatform.js +115 -0
  130. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -0
  131. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
  132. package/build/src/start/server/middleware/ExpoMiddleware.js +9 -4
  133. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  134. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js +24 -0
  135. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -0
  136. package/build/src/start/server/middleware/InterstitialPageMiddleware.js +2 -0
  137. package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
  138. package/build/src/start/server/middleware/ManifestMiddleware.js +57 -6
  139. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  140. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +6 -1
  141. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  142. package/build/src/start/server/middleware/ServeStaticMiddleware.js +62 -0
  143. package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -0
  144. package/build/src/start/server/platformBundlers.js +18 -0
  145. package/build/src/start/server/platformBundlers.js.map +1 -0
  146. package/build/src/start/server/webTemplate.js +68 -0
  147. package/build/src/start/server/webTemplate.js.map +1 -0
  148. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +59 -19
  149. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  150. package/build/src/start/server/webpack/compile.js +64 -0
  151. package/build/src/start/server/webpack/compile.js.map +1 -0
  152. package/build/src/start/startAsync.js +21 -17
  153. package/build/src/start/startAsync.js.map +1 -1
  154. package/build/src/utils/FileNotifier.js +5 -2
  155. package/build/src/utils/FileNotifier.js.map +1 -1
  156. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  157. package/build/src/utils/downloadAppAsync.js +3 -2
  158. package/build/src/utils/downloadAppAsync.js.map +1 -1
  159. package/build/src/utils/downloadExpoGoAsync.js +7 -32
  160. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  161. package/build/src/utils/editor.js +3 -2
  162. package/build/src/utils/editor.js.map +1 -1
  163. package/build/src/utils/env.js +3 -0
  164. package/build/src/utils/env.js.map +1 -1
  165. package/build/src/utils/exit.js +4 -25
  166. package/build/src/utils/exit.js.map +1 -1
  167. package/build/src/utils/getRunningProcess.js +6 -2
  168. package/build/src/utils/getRunningProcess.js.map +1 -1
  169. package/build/src/utils/nodeModules.js +13 -102
  170. package/build/src/utils/nodeModules.js.map +1 -1
  171. package/build/src/utils/npm.js +3 -24
  172. package/build/src/utils/npm.js.map +1 -1
  173. package/build/src/utils/ora.js +1 -13
  174. package/build/src/utils/ora.js.map +1 -1
  175. package/build/src/utils/progress.js +46 -0
  176. package/build/src/utils/progress.js.map +1 -1
  177. package/build/src/utils/prompts.js +4 -4
  178. package/build/src/utils/prompts.js.map +1 -1
  179. package/build/src/utils/tar.js +3 -0
  180. package/build/src/utils/tar.js.map +1 -1
  181. package/build/src/utils/validateApplicationId.js +9 -2
  182. package/build/src/utils/validateApplicationId.js.map +1 -1
  183. package/build/src/utils/variadic.js +47 -0
  184. package/build/src/utils/variadic.js.map +1 -0
  185. package/package.json +12 -8
  186. package/static/template/babel.config.js +6 -0
  187. package/static/template/index.html +117 -0
  188. package/static/template/metro.config.js +4 -0
  189. package/static/template/serve.json +13 -0
  190. package/static/template/webpack.config.js +7 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/interface/interactiveActions.ts"],"sourcesContent":["import { openJsInspector, queryAllInspectorAppsAsync } from '@expo/dev-server';\nimport assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { learnMore } from '../../utils/link';\nimport { selectAsync } from '../../utils/prompts';\nimport { DevServerManager } from '../server/DevServerManager';\nimport { BLT, printHelp, printItem, printQRCode, printUsage, StartOptions } from './commandsTable';\n\n/** Wraps the DevServerManager and adds an interface for user actions. */\nexport class DevServerManagerActions {\n constructor(private devServerManager: DevServerManager) {}\n\n printDevServerInfo(\n options: Pick<StartOptions, 'devClient' | 'isWebSocketsEnabled' | 'platforms'>\n ) {\n // If native dev server is running, print its URL.\n if (this.devServerManager.getNativeDevServerPort()) {\n try {\n const url = this.devServerManager.getDefaultDevServer().getNativeRuntimeUrl()!;\n\n printQRCode(url);\n Log.log(printItem(chalk`Metro waiting on {underline ${url}}`));\n // TODO: if development build, change this message!\n Log.log(printItem('Scan the QR code above with Expo Go (Android) or the Camera app (iOS)'));\n } catch (error) {\n // @ts-ignore: If there is no development build scheme, then skip the QR code.\n if (error.code !== 'NO_DEV_CLIENT_SCHEME') {\n throw error;\n } else {\n const serverUrl = this.devServerManager.getDefaultDevServer().getDevServerUrl();\n Log.log(printItem(chalk`Metro waiting on {underline ${serverUrl}}`));\n Log.log(printItem(`Linking is disabled because the client scheme cannot be resolved.`));\n }\n }\n }\n\n const webUrl = this.devServerManager\n .getWebDevServer()\n ?.getDevServerUrl({ hostType: 'localhost' });\n if (webUrl) {\n Log.log();\n Log.log(printItem(chalk`Webpack waiting on {underline ${webUrl}}`));\n Log.log(\n chalk.gray(printItem('Expo Webpack (web) is in beta, and subject to breaking changes!'))\n );\n }\n\n printUsage(options, { verbose: false });\n printHelp();\n Log.log();\n }\n\n async openJsInspectorAsync() {\n Log.log('Opening JavaScript inspector in the browser...');\n const port = this.devServerManager.getNativeDevServerPort();\n assert(port, 'Metro dev server is not running');\n const metroServerOrigin = `http://localhost:${port}`;\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n if (!apps.length) {\n Log.warn(\n `No compatible apps connected. This feature is only available for apps using the Hermes runtime. ${learnMore(\n 'https://docs.expo.dev/guides/using-hermes/'\n )}`\n );\n return;\n }\n for (const app of apps) {\n openJsInspector(app);\n }\n }\n\n reloadApp() {\n Log.log(`${BLT} Reloading apps`);\n // Send reload requests over the dev servers\n this.devServerManager.broadcastMessage('reload');\n }\n\n async openMoreToolsAsync() {\n try {\n // Options match: Chrome > View > Developer\n const value = await selectAsync(chalk`Dev tools {dim (native only)}`, [\n { title: 'Inspect elements', value: 'toggleElementInspector' },\n { title: 'Toggle performance monitor', value: 'togglePerformanceMonitor' },\n { title: 'Toggle developer menu', value: 'toggleDevMenu' },\n { title: 'Reload app', value: 'reload' },\n // TODO: Maybe a \"View Source\" option to open code.\n // Toggling Remote JS Debugging is pretty rough, so leaving it disabled.\n // { title: 'Toggle Remote Debugging', value: 'toggleRemoteDebugging' },\n ]);\n this.devServerManager.broadcastMessage('sendDevCommand', { name: value });\n } catch (error: any) {\n Log.debug(error);\n // do nothing\n } finally {\n printHelp();\n }\n }\n\n toggleDevMenu() {\n Log.log(`${BLT} Toggling dev menu`);\n this.devServerManager.broadcastMessage('devMenu');\n }\n}\n"],"names":["Log","DevServerManagerActions","constructor","devServerManager","printDevServerInfo","options","getNativeDevServerPort","url","getDefaultDevServer","getNativeRuntimeUrl","printQRCode","log","printItem","chalk","error","code","serverUrl","getDevServerUrl","webUrl","getWebDevServer","hostType","gray","printUsage","verbose","printHelp","openJsInspectorAsync","port","assert","metroServerOrigin","apps","queryAllInspectorAppsAsync","length","warn","learnMore","app","openJsInspector","reloadApp","BLT","broadcastMessage","openMoreToolsAsync","value","selectAsync","title","name","debug","toggleDevMenu"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/interface/interactiveActions.ts"],"sourcesContent":["import { openJsInspector, queryAllInspectorAppsAsync } from '@expo/dev-server';\nimport assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { learnMore } from '../../utils/link';\nimport { selectAsync } from '../../utils/prompts';\nimport { DevServerManager } from '../server/DevServerManager';\nimport { BLT, printHelp, printItem, printQRCode, printUsage, StartOptions } from './commandsTable';\n\nconst debug = require('debug')('expo:start:interface:interactiveActions') as typeof console.log;\n\n/** Wraps the DevServerManager and adds an interface for user actions. */\nexport class DevServerManagerActions {\n constructor(private devServerManager: DevServerManager) {}\n\n printDevServerInfo(\n options: Pick<StartOptions, 'devClient' | 'isWebSocketsEnabled' | 'platforms'>\n ) {\n // If native dev server is running, print its URL.\n if (this.devServerManager.getNativeDevServerPort()) {\n try {\n const url = this.devServerManager.getDefaultDevServer().getNativeRuntimeUrl()!;\n\n printQRCode(url);\n Log.log(printItem(chalk`Metro waiting on {underline ${url}}`));\n // TODO: if development build, change this message!\n Log.log(printItem('Scan the QR code above with Expo Go (Android) or the Camera app (iOS)'));\n } catch (error) {\n // @ts-ignore: If there is no development build scheme, then skip the QR code.\n if (error.code !== 'NO_DEV_CLIENT_SCHEME') {\n throw error;\n } else {\n const serverUrl = this.devServerManager.getDefaultDevServer().getDevServerUrl();\n Log.log(printItem(chalk`Metro waiting on {underline ${serverUrl}}`));\n Log.log(printItem(`Linking is disabled because the client scheme cannot be resolved.`));\n }\n }\n }\n\n const webDevServer = this.devServerManager.getWebDevServer();\n const webUrl = webDevServer?.getDevServerUrl({ hostType: 'localhost' });\n if (webUrl) {\n Log.log();\n Log.log(printItem(chalk`Web is waiting on {underline ${webUrl}}`));\n }\n\n printUsage(options, { verbose: false });\n printHelp();\n Log.log();\n }\n\n async openJsInspectorAsync() {\n Log.log('Opening JavaScript inspector in the browser...');\n const port = this.devServerManager.getNativeDevServerPort();\n assert(port, 'Metro dev server is not running');\n const metroServerOrigin = `http://localhost:${port}`;\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n if (!apps.length) {\n Log.warn(\n `No compatible apps connected. This feature is only available for apps using the Hermes runtime. ${learnMore(\n 'https://docs.expo.dev/guides/using-hermes/'\n )}`\n );\n return;\n }\n for (const app of apps) {\n openJsInspector(app);\n }\n }\n\n reloadApp() {\n Log.log(`${BLT} Reloading apps`);\n // Send reload requests over the dev servers\n this.devServerManager.broadcastMessage('reload');\n }\n\n async openMoreToolsAsync() {\n try {\n // Options match: Chrome > View > Developer\n const value = await selectAsync(chalk`Dev tools {dim (native only)}`, [\n { title: 'Inspect elements', value: 'toggleElementInspector' },\n { title: 'Toggle performance monitor', value: 'togglePerformanceMonitor' },\n { title: 'Toggle developer menu', value: 'toggleDevMenu' },\n { title: 'Reload app', value: 'reload' },\n // TODO: Maybe a \"View Source\" option to open code.\n // Toggling Remote JS Debugging is pretty rough, so leaving it disabled.\n // { title: 'Toggle Remote Debugging', value: 'toggleRemoteDebugging' },\n ]);\n this.devServerManager.broadcastMessage('sendDevCommand', { name: value });\n } catch (error: any) {\n debug(error);\n // do nothing\n } finally {\n printHelp();\n }\n }\n\n toggleDevMenu() {\n Log.log(`${BLT} Toggling dev menu`);\n this.devServerManager.broadcastMessage('devMenu');\n }\n}\n"],"names":["Log","debug","require","DevServerManagerActions","constructor","devServerManager","printDevServerInfo","options","getNativeDevServerPort","url","getDefaultDevServer","getNativeRuntimeUrl","printQRCode","log","printItem","chalk","error","code","serverUrl","getDevServerUrl","webDevServer","getWebDevServer","webUrl","hostType","printUsage","verbose","printHelp","openJsInspectorAsync","port","assert","metroServerOrigin","apps","queryAllInspectorAppsAsync","length","warn","learnMore","app","openJsInspector","reloadApp","BLT","broadcastMessage","openMoreToolsAsync","value","selectAsync","title","name","toggleDevMenu"],"mappings":"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"}
@@ -40,6 +40,7 @@ function _interopRequireWildcard(obj) {
40
40
  return newObj;
41
41
  }
42
42
  }
43
+ const debug = require("debug")("expo:start:interface:startInterface");
43
44
  const CTRL_C = "\x03";
44
45
  const CTRL_D = "\x04";
45
46
  const CTRL_L = "\f";
@@ -173,12 +174,12 @@ async function startInterfaceAsync(devServerManager, options) {
173
174
  }
174
175
  const isDisabled = !platforms.includes("web");
175
176
  if (isDisabled) {
176
- Log.debug("Web is disabled");
177
+ debug("Web is disabled");
177
178
  break;
178
179
  }
179
180
  // Ensure the Webpack dev server is running first
180
181
  if (!devServerManager.getWebDevServer()) {
181
- Log.debug("Starting up webpack dev server");
182
+ debug("Starting up webpack dev server");
182
183
  await devServerManager.ensureWebDevServerRunningAsync();
183
184
  // When this is the first time webpack is started, reprint the connection info.
184
185
  actions.printDevServerInfo(usageOptions);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/interface/startInterface.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { openInEditorAsync } from '../../utils/editor';\nimport { AbortCommandError } from '../../utils/errors';\nimport { getAllSpinners, ora } from '../../utils/ora';\nimport { getProgressBar, setProgressBar } from '../../utils/progress';\nimport { addInteractionListener, pauseInteractions } from '../../utils/prompts';\nimport { WebSupportProjectPrerequisite } from '../doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../server/DevServerManager';\nimport { KeyPressHandler } from './KeyPressHandler';\nimport { BLT, printHelp, printUsage, StartOptions } from './commandsTable';\nimport { DevServerManagerActions } from './interactiveActions';\n\nconst CTRL_C = '\\u0003';\nconst CTRL_D = '\\u0004';\nconst CTRL_L = '\\u000C';\n\nconst PLATFORM_SETTINGS: Record<\n string,\n { name: string; key: 'android' | 'ios'; launchTarget: 'emulator' | 'simulator' }\n> = {\n android: {\n name: 'Android',\n key: 'android',\n launchTarget: 'emulator',\n },\n ios: {\n name: 'iOS',\n key: 'ios',\n launchTarget: 'simulator',\n },\n};\n\nexport async function startInterfaceAsync(\n devServerManager: DevServerManager,\n options: Pick<StartOptions, 'platforms'>\n) {\n const actions = new DevServerManagerActions(devServerManager);\n\n const isWebSocketsEnabled = devServerManager.getDefaultDevServer()?.isTargetingNative();\n\n const usageOptions = {\n isWebSocketsEnabled,\n devClient: devServerManager.options.devClient,\n ...options,\n };\n\n actions.printDevServerInfo(usageOptions);\n\n const onPressAsync = async (key: string) => {\n // Auxillary commands all escape.\n switch (key) {\n case CTRL_C:\n case CTRL_D: {\n // Prevent terminal UI from accepting commands while the process is closing.\n // Without this, fast typers will close the server then start typing their\n // next command and have a bunch of unrelated things pop up.\n pauseInteractions();\n\n const spinners = getAllSpinners();\n spinners.forEach((spinner) => {\n spinner.fail();\n });\n\n const currentProgress = getProgressBar();\n if (currentProgress) {\n currentProgress.terminate();\n setProgressBar(null);\n }\n const spinner = ora({ text: 'Stopping server', color: 'white' }).start();\n try {\n await devServerManager.stopAsync();\n spinner.stopAndPersist({ text: 'Stopped server', symbol: `\\u203A` });\n // @ts-ignore: Argument of type '\"SIGINT\"' is not assignable to parameter of type '\"disconnect\"'.\n process.emit('SIGINT');\n\n // TODO: Is this the right place to do this?\n process.exit();\n } catch (error) {\n spinner.fail('Failed to stop server');\n throw error;\n }\n break;\n }\n case CTRL_L:\n return Log.clear();\n case '?':\n return printUsage(usageOptions, { verbose: true });\n }\n\n // Optionally enabled\n\n if (isWebSocketsEnabled) {\n switch (key) {\n case 'm':\n return actions.toggleDevMenu();\n case 'M':\n return actions.openMoreToolsAsync();\n }\n }\n\n const { platforms = ['ios', 'android', 'web'] } = options;\n\n if (['i', 'a'].includes(key.toLowerCase())) {\n const platform = key.toLowerCase() === 'i' ? 'ios' : 'android';\n\n const shouldPrompt = ['I', 'A'].includes(key);\n if (shouldPrompt) {\n Log.clear();\n }\n\n const server = devServerManager.getDefaultDevServer();\n const settings = PLATFORM_SETTINGS[platform];\n\n Log.log(`${BLT} Opening on ${settings.name}...`);\n\n if (server.isTargetingNative() && !platforms.includes(settings.key)) {\n Log.warn(\n chalk`${settings.name} is disabled, enable it by adding {bold ${settings.key}} to the platforms array in your app.json or app.config.js`\n );\n } else {\n try {\n await server.openPlatformAsync(settings.launchTarget, { shouldPrompt });\n printHelp();\n } catch (error: any) {\n if (!(error instanceof AbortCommandError)) {\n Log.exception(error);\n }\n }\n }\n // Break out early.\n return;\n }\n\n switch (key) {\n case 'w': {\n try {\n await devServerManager.ensureProjectPrerequisiteAsync(WebSupportProjectPrerequisite);\n if (!platforms.includes('web')) {\n platforms.push('web');\n options.platforms?.push('web');\n }\n } catch (e: any) {\n Log.warn(e.message);\n break;\n }\n\n const isDisabled = !platforms.includes('web');\n if (isDisabled) {\n Log.debug('Web is disabled');\n // Use warnings from the web support setup.\n break;\n }\n\n // Ensure the Webpack dev server is running first\n if (!devServerManager.getWebDevServer()) {\n Log.debug('Starting up webpack dev server');\n await devServerManager.ensureWebDevServerRunningAsync();\n // When this is the first time webpack is started, reprint the connection info.\n actions.printDevServerInfo(usageOptions);\n }\n\n Log.log(`${BLT} Open in the web browser...`);\n try {\n await devServerManager.getWebDevServer()?.openPlatformAsync('desktop');\n printHelp();\n } catch (error: any) {\n if (!(error instanceof AbortCommandError)) {\n Log.exception(error);\n }\n }\n break;\n }\n case 'c':\n Log.clear();\n return actions.printDevServerInfo(usageOptions);\n case 'j':\n return actions.openJsInspectorAsync();\n case 'r':\n return actions.reloadApp();\n case 'o':\n Log.log(`${BLT} Opening the editor...`);\n return openInEditorAsync(devServerManager.projectRoot);\n }\n };\n\n const keyPressHandler = new KeyPressHandler(onPressAsync);\n\n const listener = keyPressHandler.createInteractionListener();\n\n addInteractionListener(listener);\n\n // Start observing...\n keyPressHandler.startInterceptingKeyStrokes();\n}\n"],"names":["startInterfaceAsync","Log","CTRL_C","CTRL_D","CTRL_L","PLATFORM_SETTINGS","android","name","key","launchTarget","ios","devServerManager","options","actions","DevServerManagerActions","isWebSocketsEnabled","getDefaultDevServer","isTargetingNative","usageOptions","devClient","printDevServerInfo","onPressAsync","pauseInteractions","spinners","getAllSpinners","forEach","spinner","fail","currentProgress","getProgressBar","terminate","setProgressBar","ora","text","color","start","stopAsync","stopAndPersist","symbol","process","emit","exit","error","clear","printUsage","verbose","toggleDevMenu","openMoreToolsAsync","platforms","includes","toLowerCase","platform","shouldPrompt","server","settings","log","BLT","warn","chalk","openPlatformAsync","printHelp","AbortCommandError","exception","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","push","e","message","isDisabled","debug","getWebDevServer","ensureWebDevServerRunningAsync","openJsInspectorAsync","reloadApp","openInEditorAsync","projectRoot","keyPressHandler","KeyPressHandler","listener","createInteractionListener","addInteractionListener","startInterceptingKeyStrokes"],"mappings":"AAAA;;;;QAkCsBA,mBAAmB,GAAnBA,mBAAmB;AAlCvB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,WAAW,EAAjB;AACmB,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AACpB,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AAClB,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;AACN,IAAA,SAAsB,WAAtB,sBAAsB,CAAA;AACX,IAAA,QAAqB,WAArB,qBAAqB,CAAA;AACjC,IAAA,8BAA6C,WAA7C,6CAA6C,CAAA;AAE3D,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AACM,IAAA,cAAiB,WAAjB,iBAAiB,CAAA;AAClC,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9D,MAAMC,MAAM,GAAG,MAAQ,AAAC;AACxB,MAAMC,MAAM,GAAG,MAAQ,AAAC;AACxB,MAAMC,MAAM,GAAG,IAAQ,AAAC;AAExB,MAAMC,iBAAiB,GAGnB;IACFC,OAAO,EAAE;QACPC,IAAI,EAAE,SAAS;QACfC,GAAG,EAAE,SAAS;QACdC,YAAY,EAAE,UAAU;KACzB;IACDC,GAAG,EAAE;QACHH,IAAI,EAAE,KAAK;QACXC,GAAG,EAAE,KAAK;QACVC,YAAY,EAAE,WAAW;KAC1B;CACF,AAAC;AAEK,eAAeT,mBAAmB,CACvCW,gBAAkC,EAClCC,OAAwC,EACxC;QAG4BD,IAAsC;IAFlE,MAAME,OAAO,GAAG,IAAIC,mBAAuB,wBAAA,CAACH,gBAAgB,CAAC,AAAC;IAE9D,MAAMI,mBAAmB,GAAGJ,CAAAA,IAAsC,GAAtCA,gBAAgB,CAACK,mBAAmB,EAAE,SAAmB,GAAzDL,KAAAA,CAAyD,GAAzDA,IAAsC,CAAEM,iBAAiB,EAAE,AAAC;IAExF,MAAMC,YAAY,GAAG;QACnBH,mBAAmB;QACnBI,SAAS,EAAER,gBAAgB,CAACC,OAAO,CAACO,SAAS;QAC7C,GAAGP,OAAO;KACX,AAAC;IAEFC,OAAO,CAACO,kBAAkB,CAACF,YAAY,CAAC,CAAC;IAEzC,MAAMG,YAAY,GAAG,OAAOb,GAAW,GAAK;QAC1C,iCAAiC;QACjC,OAAQA,GAAG;YACT,KAAKN,MAAM,CAAC;YACZ,KAAKC,MAAM;gBAAE;oBACX,4EAA4E;oBAC5E,0EAA0E;oBAC1E,4DAA4D;oBAC5DmB,CAAAA,GAAAA,QAAiB,AAAE,CAAA,kBAAF,EAAE,CAAC;oBAEpB,MAAMC,QAAQ,GAAGC,CAAAA,GAAAA,IAAc,AAAE,CAAA,eAAF,EAAE,AAAC;oBAClCD,QAAQ,CAACE,OAAO,CAAC,CAACC,OAAO,GAAK;wBAC5BA,OAAO,CAACC,IAAI,EAAE,CAAC;qBAChB,CAAC,CAAC;oBAEH,MAAMC,eAAe,GAAGC,CAAAA,GAAAA,SAAc,AAAE,CAAA,eAAF,EAAE,AAAC;oBACzC,IAAID,eAAe,EAAE;wBACnBA,eAAe,CAACE,SAAS,EAAE,CAAC;wBAC5BC,CAAAA,GAAAA,SAAc,AAAM,CAAA,eAAN,CAAC,IAAI,CAAC,CAAC;qBACtB;oBACD,MAAML,QAAO,GAAGM,CAAAA,GAAAA,IAAG,AAA6C,CAAA,IAA7C,CAAC;wBAAEC,IAAI,EAAE,iBAAiB;wBAAEC,KAAK,EAAE,OAAO;qBAAE,CAAC,CAACC,KAAK,EAAE,AAAC;oBACzE,IAAI;wBACF,MAAMxB,gBAAgB,CAACyB,SAAS,EAAE,CAAC;wBACnCV,QAAO,CAACW,cAAc,CAAC;4BAAEJ,IAAI,EAAE,gBAAgB;4BAAEK,MAAM,EAAE,CAAC,MAAM,CAAC;yBAAE,CAAC,CAAC;wBACrE,iGAAiG;wBACjGC,OAAO,CAACC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAEvB,4CAA4C;wBAC5CD,OAAO,CAACE,IAAI,EAAE,CAAC;qBAChB,CAAC,OAAOC,KAAK,EAAE;wBACdhB,QAAO,CAACC,IAAI,CAAC,uBAAuB,CAAC,CAAC;wBACtC,MAAMe,KAAK,CAAC;qBACb;oBACD,MAAM;iBACP;YACD,KAAKtC,MAAM;gBACT,OAAOH,GAAG,CAAC0C,KAAK,EAAE,CAAC;YACrB,KAAK,GAAG;gBACN,OAAOC,CAAAA,GAAAA,cAAU,AAAiC,CAAA,WAAjC,CAAC1B,YAAY,EAAE;oBAAE2B,OAAO,EAAE,IAAI;iBAAE,CAAC,CAAC;SACtD;QAED,qBAAqB;QAErB,IAAI9B,mBAAmB,EAAE;YACvB,OAAQP,GAAG;gBACT,KAAK,GAAG;oBACN,OAAOK,OAAO,CAACiC,aAAa,EAAE,CAAC;gBACjC,KAAK,GAAG;oBACN,OAAOjC,OAAO,CAACkC,kBAAkB,EAAE,CAAC;aACvC;SACF;QAED,MAAM,EAAEC,SAAS,EAAG;YAAC,KAAK;YAAE,SAAS;YAAE,KAAK;SAAC,CAAA,EAAE,GAAGpC,OAAO,AAAC;QAE1D,IAAI;YAAC,GAAG;YAAE,GAAG;SAAC,CAACqC,QAAQ,CAACzC,GAAG,CAAC0C,WAAW,EAAE,CAAC,EAAE;YAC1C,MAAMC,QAAQ,GAAG3C,GAAG,CAAC0C,WAAW,EAAE,KAAK,GAAG,GAAG,KAAK,GAAG,SAAS,AAAC;YAE/D,MAAME,YAAY,GAAG;gBAAC,GAAG;gBAAE,GAAG;aAAC,CAACH,QAAQ,CAACzC,GAAG,CAAC,AAAC;YAC9C,IAAI4C,YAAY,EAAE;gBAChBnD,GAAG,CAAC0C,KAAK,EAAE,CAAC;aACb;YAED,MAAMU,MAAM,GAAG1C,gBAAgB,CAACK,mBAAmB,EAAE,AAAC;YACtD,MAAMsC,QAAQ,GAAGjD,iBAAiB,CAAC8C,QAAQ,CAAC,AAAC;YAE7ClD,GAAG,CAACsD,GAAG,CAAC,CAAC,EAAEC,cAAG,IAAA,CAAC,YAAY,EAAEF,QAAQ,CAAC/C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAEjD,IAAI8C,MAAM,CAACpC,iBAAiB,EAAE,IAAI,CAAC+B,SAAS,CAACC,QAAQ,CAACK,QAAQ,CAAC9C,GAAG,CAAC,EAAE;gBACnEP,GAAG,CAACwD,IAAI,CACNC,MAAK,QAAA,CAAC,EAAEJ,QAAQ,CAAC/C,IAAI,CAAC,wCAAwC,EAAE+C,QAAQ,CAAC9C,GAAG,CAAC,0DAA0D,CAAC,CACzI,CAAC;aACH,MAAM;gBACL,IAAI;oBACF,MAAM6C,MAAM,CAACM,iBAAiB,CAACL,QAAQ,CAAC7C,YAAY,EAAE;wBAAE2C,YAAY;qBAAE,CAAC,CAAC;oBACxEQ,CAAAA,GAAAA,cAAS,AAAE,CAAA,UAAF,EAAE,CAAC;iBACb,CAAC,OAAOlB,KAAK,EAAO;oBACnB,IAAI,CAAC,CAACA,KAAK,YAAYmB,OAAiB,kBAAA,CAAC,EAAE;wBACzC5D,GAAG,CAAC6D,SAAS,CAACpB,KAAK,CAAC,CAAC;qBACtB;iBACF;aACF;YACD,mBAAmB;YACnB,OAAO;SACR;QAED,OAAQlC,GAAG;YACT,KAAK,GAAG;gBAAE;oBACR,IAAI;wBACF,MAAMG,gBAAgB,CAACoD,8BAA8B,CAACC,8BAA6B,8BAAA,CAAC,CAAC;wBACrF,IAAI,CAAChB,SAAS,CAACC,QAAQ,CAAC,KAAK,CAAC,EAAE;gCAE9BrC,GAAiB;4BADjBoC,SAAS,CAACiB,IAAI,CAAC,KAAK,CAAC,CAAC;4BACtBrD,CAAAA,GAAiB,GAAjBA,OAAO,CAACoC,SAAS,SAAM,GAAvBpC,KAAAA,CAAuB,GAAvBA,GAAiB,CAAEqD,IAAI,CAAC,KAAK,CAAC,AA7I1C,CA6I2C;yBAChC;qBACF,CAAC,OAAOC,CAAC,EAAO;wBACfjE,GAAG,CAACwD,IAAI,CAACS,CAAC,CAACC,OAAO,CAAC,CAAC;wBACpB,MAAM;qBACP;oBAED,MAAMC,UAAU,GAAG,CAACpB,SAAS,CAACC,QAAQ,CAAC,KAAK,CAAC,AAAC;oBAC9C,IAAImB,UAAU,EAAE;wBACdnE,GAAG,CAACoE,KAAK,CAAC,iBAAiB,CAAC,CAAC;wBAE7B,MAAM;qBACP;oBAED,iDAAiD;oBACjD,IAAI,CAAC1D,gBAAgB,CAAC2D,eAAe,EAAE,EAAE;wBACvCrE,GAAG,CAACoE,KAAK,CAAC,gCAAgC,CAAC,CAAC;wBAC5C,MAAM1D,gBAAgB,CAAC4D,8BAA8B,EAAE,CAAC;wBACxD,+EAA+E;wBAC/E1D,OAAO,CAACO,kBAAkB,CAACF,YAAY,CAAC,CAAC;qBAC1C;oBAEDjB,GAAG,CAACsD,GAAG,CAAC,CAAC,EAAEC,cAAG,IAAA,CAAC,2BAA2B,CAAC,CAAC,CAAC;oBAC7C,IAAI;4BACI7C,IAAkC;wBAAxC,OAAMA,CAAAA,IAAkC,GAAlCA,gBAAgB,CAAC2D,eAAe,EAAE,SAAmB,GAArD3D,KAAAA,CAAqD,GAArDA,IAAkC,CAAEgD,iBAAiB,CAAC,SAAS,CAAC,CAAA,CAAC;wBACvEC,CAAAA,GAAAA,cAAS,AAAE,CAAA,UAAF,EAAE,CAAC;qBACb,CAAC,OAAOlB,KAAK,EAAO;wBACnB,IAAI,CAAC,CAACA,KAAK,YAAYmB,OAAiB,kBAAA,CAAC,EAAE;4BACzC5D,GAAG,CAAC6D,SAAS,CAACpB,KAAK,CAAC,CAAC;yBACtB;qBACF;oBACD,MAAM;iBACP;YACD,KAAK,GAAG;gBACNzC,GAAG,CAAC0C,KAAK,EAAE,CAAC;gBACZ,OAAO9B,OAAO,CAACO,kBAAkB,CAACF,YAAY,CAAC,CAAC;YAClD,KAAK,GAAG;gBACN,OAAOL,OAAO,CAAC2D,oBAAoB,EAAE,CAAC;YACxC,KAAK,GAAG;gBACN,OAAO3D,OAAO,CAAC4D,SAAS,EAAE,CAAC;YAC7B,KAAK,GAAG;gBACNxE,GAAG,CAACsD,GAAG,CAAC,CAAC,EAAEC,cAAG,IAAA,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACxC,OAAOkB,CAAAA,GAAAA,OAAiB,AAA8B,CAAA,kBAA9B,CAAC/D,gBAAgB,CAACgE,WAAW,CAAC,CAAC;SAC1D;KACF,AAAC;IAEF,MAAMC,eAAe,GAAG,IAAIC,gBAAe,gBAAA,CAACxD,YAAY,CAAC,AAAC;IAE1D,MAAMyD,QAAQ,GAAGF,eAAe,CAACG,yBAAyB,EAAE,AAAC;IAE7DC,CAAAA,GAAAA,QAAsB,AAAU,CAAA,uBAAV,CAACF,QAAQ,CAAC,CAAC;IAEjC,qBAAqB;IACrBF,eAAe,CAACK,2BAA2B,EAAE,CAAC;CAC/C"}
1
+ {"version":3,"sources":["../../../../src/start/interface/startInterface.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { openInEditorAsync } from '../../utils/editor';\nimport { AbortCommandError } from '../../utils/errors';\nimport { getAllSpinners, ora } from '../../utils/ora';\nimport { getProgressBar, setProgressBar } from '../../utils/progress';\nimport { addInteractionListener, pauseInteractions } from '../../utils/prompts';\nimport { WebSupportProjectPrerequisite } from '../doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../server/DevServerManager';\nimport { KeyPressHandler } from './KeyPressHandler';\nimport { BLT, printHelp, printUsage, StartOptions } from './commandsTable';\nimport { DevServerManagerActions } from './interactiveActions';\n\nconst debug = require('debug')('expo:start:interface:startInterface') as typeof console.log;\n\nconst CTRL_C = '\\u0003';\nconst CTRL_D = '\\u0004';\nconst CTRL_L = '\\u000C';\n\nconst PLATFORM_SETTINGS: Record<\n string,\n { name: string; key: 'android' | 'ios'; launchTarget: 'emulator' | 'simulator' }\n> = {\n android: {\n name: 'Android',\n key: 'android',\n launchTarget: 'emulator',\n },\n ios: {\n name: 'iOS',\n key: 'ios',\n launchTarget: 'simulator',\n },\n};\n\nexport async function startInterfaceAsync(\n devServerManager: DevServerManager,\n options: Pick<StartOptions, 'platforms'>\n) {\n const actions = new DevServerManagerActions(devServerManager);\n\n const isWebSocketsEnabled = devServerManager.getDefaultDevServer()?.isTargetingNative();\n\n const usageOptions = {\n isWebSocketsEnabled,\n devClient: devServerManager.options.devClient,\n ...options,\n };\n\n actions.printDevServerInfo(usageOptions);\n\n const onPressAsync = async (key: string) => {\n // Auxillary commands all escape.\n switch (key) {\n case CTRL_C:\n case CTRL_D: {\n // Prevent terminal UI from accepting commands while the process is closing.\n // Without this, fast typers will close the server then start typing their\n // next command and have a bunch of unrelated things pop up.\n pauseInteractions();\n\n const spinners = getAllSpinners();\n spinners.forEach((spinner) => {\n spinner.fail();\n });\n\n const currentProgress = getProgressBar();\n if (currentProgress) {\n currentProgress.terminate();\n setProgressBar(null);\n }\n const spinner = ora({ text: 'Stopping server', color: 'white' }).start();\n try {\n await devServerManager.stopAsync();\n spinner.stopAndPersist({ text: 'Stopped server', symbol: `\\u203A` });\n // @ts-ignore: Argument of type '\"SIGINT\"' is not assignable to parameter of type '\"disconnect\"'.\n process.emit('SIGINT');\n\n // TODO: Is this the right place to do this?\n process.exit();\n } catch (error) {\n spinner.fail('Failed to stop server');\n throw error;\n }\n break;\n }\n case CTRL_L:\n return Log.clear();\n case '?':\n return printUsage(usageOptions, { verbose: true });\n }\n\n // Optionally enabled\n\n if (isWebSocketsEnabled) {\n switch (key) {\n case 'm':\n return actions.toggleDevMenu();\n case 'M':\n return actions.openMoreToolsAsync();\n }\n }\n\n const { platforms = ['ios', 'android', 'web'] } = options;\n\n if (['i', 'a'].includes(key.toLowerCase())) {\n const platform = key.toLowerCase() === 'i' ? 'ios' : 'android';\n\n const shouldPrompt = ['I', 'A'].includes(key);\n if (shouldPrompt) {\n Log.clear();\n }\n\n const server = devServerManager.getDefaultDevServer();\n const settings = PLATFORM_SETTINGS[platform];\n\n Log.log(`${BLT} Opening on ${settings.name}...`);\n\n if (server.isTargetingNative() && !platforms.includes(settings.key)) {\n Log.warn(\n chalk`${settings.name} is disabled, enable it by adding {bold ${settings.key}} to the platforms array in your app.json or app.config.js`\n );\n } else {\n try {\n await server.openPlatformAsync(settings.launchTarget, { shouldPrompt });\n printHelp();\n } catch (error: any) {\n if (!(error instanceof AbortCommandError)) {\n Log.exception(error);\n }\n }\n }\n // Break out early.\n return;\n }\n\n switch (key) {\n case 'w': {\n try {\n await devServerManager.ensureProjectPrerequisiteAsync(WebSupportProjectPrerequisite);\n if (!platforms.includes('web')) {\n platforms.push('web');\n options.platforms?.push('web');\n }\n } catch (e: any) {\n Log.warn(e.message);\n break;\n }\n\n const isDisabled = !platforms.includes('web');\n if (isDisabled) {\n debug('Web is disabled');\n // Use warnings from the web support setup.\n break;\n }\n\n // Ensure the Webpack dev server is running first\n if (!devServerManager.getWebDevServer()) {\n debug('Starting up webpack dev server');\n await devServerManager.ensureWebDevServerRunningAsync();\n // When this is the first time webpack is started, reprint the connection info.\n actions.printDevServerInfo(usageOptions);\n }\n\n Log.log(`${BLT} Open in the web browser...`);\n try {\n await devServerManager.getWebDevServer()?.openPlatformAsync('desktop');\n printHelp();\n } catch (error: any) {\n if (!(error instanceof AbortCommandError)) {\n Log.exception(error);\n }\n }\n break;\n }\n case 'c':\n Log.clear();\n return actions.printDevServerInfo(usageOptions);\n case 'j':\n return actions.openJsInspectorAsync();\n case 'r':\n return actions.reloadApp();\n case 'o':\n Log.log(`${BLT} Opening the editor...`);\n return openInEditorAsync(devServerManager.projectRoot);\n }\n };\n\n const keyPressHandler = new KeyPressHandler(onPressAsync);\n\n const listener = keyPressHandler.createInteractionListener();\n\n addInteractionListener(listener);\n\n // Start observing...\n keyPressHandler.startInterceptingKeyStrokes();\n}\n"],"names":["startInterfaceAsync","Log","debug","require","CTRL_C","CTRL_D","CTRL_L","PLATFORM_SETTINGS","android","name","key","launchTarget","ios","devServerManager","options","actions","DevServerManagerActions","isWebSocketsEnabled","getDefaultDevServer","isTargetingNative","usageOptions","devClient","printDevServerInfo","onPressAsync","pauseInteractions","spinners","getAllSpinners","forEach","spinner","fail","currentProgress","getProgressBar","terminate","setProgressBar","ora","text","color","start","stopAsync","stopAndPersist","symbol","process","emit","exit","error","clear","printUsage","verbose","toggleDevMenu","openMoreToolsAsync","platforms","includes","toLowerCase","platform","shouldPrompt","server","settings","log","BLT","warn","chalk","openPlatformAsync","printHelp","AbortCommandError","exception","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","push","e","message","isDisabled","getWebDevServer","ensureWebDevServerRunningAsync","openJsInspectorAsync","reloadApp","openInEditorAsync","projectRoot","keyPressHandler","KeyPressHandler","listener","createInteractionListener","addInteractionListener","startInterceptingKeyStrokes"],"mappings":"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"}
@@ -34,6 +34,7 @@ function _interopRequireWildcard(obj) {
34
34
  return newObj;
35
35
  }
36
36
  }
37
+ const debug = require("debug")("expo:utils:ExpoGoInstaller");
37
38
  class ExpoGoInstaller {
38
39
  // Keep a list of [platform-deviceId] so we can prevent asking multiple times if a user wants to upgrade.
39
40
  // This can prevent annoying interactions when they don't want to upgrade for whatever reason.
@@ -49,7 +50,7 @@ class ExpoGoInstaller {
49
50
  return true;
50
51
  }
51
52
  const version = await this._getExpectedClientVersionAsync();
52
- Log.debug(`Expected Expo Go version: ${version}, installed version: ${installedVersion}`);
53
+ debug(`Expected Expo Go version: ${version}, installed version: ${installedVersion}`);
53
54
  return version ? _semver.default.lt(installedVersion, version) : true;
54
55
  }
55
56
  /** Returns the expected version of Expo Go given the project SDK Version. Exposed for testing. */ async _getExpectedClientVersionAsync() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/platforms/ExpoGoInstaller.ts"],"sourcesContent":["import semver from 'semver';\n\nimport { getVersionsAsync } from '../../api/getVersions';\nimport * as Log from '../../log';\nimport { downloadExpoGoAsync } from '../../utils/downloadExpoGoAsync';\nimport { logNewSection } from '../../utils/ora';\nimport { confirmAsync } from '../../utils/prompts';\nimport type { DeviceManager } from './DeviceManager';\n\n/** Given a platform, appId, and sdkVersion, this module will ensure that Expo Go is up-to-date on the provided device. */\nexport class ExpoGoInstaller<IDevice> {\n // Keep a list of [platform-deviceId] so we can prevent asking multiple times if a user wants to upgrade.\n // This can prevent annoying interactions when they don't want to upgrade for whatever reason.\n static cache: Record<string, boolean> = {};\n\n constructor(\n private platform: 'ios' | 'android',\n // Ultimately this should be inlined since we know the platform.\n private appId: string,\n private sdkVersion?: string\n ) {}\n\n /** Returns true if the installed app matching the previously provided `appId` is outdated. */\n async isClientOutdatedAsync(device: DeviceManager<IDevice>): Promise<boolean> {\n const installedVersion = await device.getAppVersionAsync(this.appId);\n if (!installedVersion) {\n return true;\n }\n const version = await this._getExpectedClientVersionAsync();\n Log.debug(`Expected Expo Go version: ${version}, installed version: ${installedVersion}`);\n return version ? semver.lt(installedVersion, version) : true;\n }\n\n /** Returns the expected version of Expo Go given the project SDK Version. Exposed for testing. */\n async _getExpectedClientVersionAsync(): Promise<string | null> {\n const versions = await getVersionsAsync();\n // Like `sdkVersions['44.0.0']['androidClientVersion'] = '1.0.0'`\n const specificVersion =\n versions?.sdkVersions?.[this.sdkVersion!]?.[`${this.platform}ClientVersion`];\n const latestVersion = versions[`${this.platform}Version`];\n return specificVersion ?? latestVersion ?? null;\n }\n\n /** Returns a boolean indicating if Expo Go should be installed. Returns `true` if the app was uninstalled. */\n async uninstallExpoGoIfOutdatedAsync(deviceManager: DeviceManager<IDevice>): Promise<boolean> {\n const cacheId = `${this.platform}-${deviceManager.identifier}`;\n\n if (ExpoGoInstaller.cache[cacheId]) {\n return false;\n }\n if (await this.isClientOutdatedAsync(deviceManager)) {\n // Only prompt once per device, per run.\n ExpoGoInstaller.cache[cacheId] = true;\n const confirm = await confirmAsync({\n initial: true,\n message: `Expo Go on ${deviceManager.name} is outdated, would you like to upgrade?`,\n });\n if (confirm) {\n // Don't need to uninstall to update on iOS.\n if (this.platform !== 'ios') {\n Log.log(`Uninstalling Expo Go from ${this.platform} device ${deviceManager.name}.`);\n await deviceManager.uninstallAppAsync(this.appId);\n }\n return true;\n }\n }\n return false;\n }\n\n /** Check if a given device has Expo Go installed, if not then download and install it. */\n async ensureAsync(deviceManager: DeviceManager<IDevice>): Promise<boolean> {\n let shouldInstall = !(await deviceManager.isAppInstalledAsync(this.appId));\n\n if (!shouldInstall) {\n shouldInstall = await this.uninstallExpoGoIfOutdatedAsync(deviceManager);\n }\n\n if (shouldInstall) {\n // Download the Expo Go app from the Expo servers.\n const binaryPath = await downloadExpoGoAsync(this.platform, { sdkVersion: this.sdkVersion });\n // Install the app on the device.\n const ora = logNewSection(`Installing Expo Go on ${deviceManager.name}`);\n try {\n await deviceManager.installAppAsync(binaryPath);\n } finally {\n ora.stop();\n }\n return true;\n }\n return false;\n }\n}\n"],"names":["Log","ExpoGoInstaller","cache","constructor","platform","appId","sdkVersion","isClientOutdatedAsync","device","installedVersion","getAppVersionAsync","version","_getExpectedClientVersionAsync","debug","semver","lt","versions","getVersionsAsync","specificVersion","sdkVersions","latestVersion","uninstallExpoGoIfOutdatedAsync","deviceManager","cacheId","identifier","confirm","confirmAsync","initial","message","name","log","uninstallAppAsync","ensureAsync","shouldInstall","isAppInstalledAsync","binaryPath","downloadExpoGoAsync","ora","logNewSection","installAppAsync","stop"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/platforms/ExpoGoInstaller.ts"],"sourcesContent":["import semver from 'semver';\n\nimport { getVersionsAsync } from '../../api/getVersions';\nimport * as Log from '../../log';\nimport { downloadExpoGoAsync } from '../../utils/downloadExpoGoAsync';\nimport { logNewSection } from '../../utils/ora';\nimport { confirmAsync } from '../../utils/prompts';\nimport type { DeviceManager } from './DeviceManager';\n\nconst debug = require('debug')('expo:utils:ExpoGoInstaller') as typeof console.log;\n\n/** Given a platform, appId, and sdkVersion, this module will ensure that Expo Go is up-to-date on the provided device. */\nexport class ExpoGoInstaller<IDevice> {\n // Keep a list of [platform-deviceId] so we can prevent asking multiple times if a user wants to upgrade.\n // This can prevent annoying interactions when they don't want to upgrade for whatever reason.\n static cache: Record<string, boolean> = {};\n\n constructor(\n private platform: 'ios' | 'android',\n // Ultimately this should be inlined since we know the platform.\n private appId: string,\n private sdkVersion?: string\n ) {}\n\n /** Returns true if the installed app matching the previously provided `appId` is outdated. */\n async isClientOutdatedAsync(device: DeviceManager<IDevice>): Promise<boolean> {\n const installedVersion = await device.getAppVersionAsync(this.appId);\n if (!installedVersion) {\n return true;\n }\n const version = await this._getExpectedClientVersionAsync();\n debug(`Expected Expo Go version: ${version}, installed version: ${installedVersion}`);\n return version ? semver.lt(installedVersion, version) : true;\n }\n\n /** Returns the expected version of Expo Go given the project SDK Version. Exposed for testing. */\n async _getExpectedClientVersionAsync(): Promise<string | null> {\n const versions = await getVersionsAsync();\n // Like `sdkVersions['44.0.0']['androidClientVersion'] = '1.0.0'`\n const specificVersion =\n versions?.sdkVersions?.[this.sdkVersion!]?.[`${this.platform}ClientVersion`];\n const latestVersion = versions[`${this.platform}Version`];\n return specificVersion ?? latestVersion ?? null;\n }\n\n /** Returns a boolean indicating if Expo Go should be installed. Returns `true` if the app was uninstalled. */\n async uninstallExpoGoIfOutdatedAsync(deviceManager: DeviceManager<IDevice>): Promise<boolean> {\n const cacheId = `${this.platform}-${deviceManager.identifier}`;\n\n if (ExpoGoInstaller.cache[cacheId]) {\n return false;\n }\n if (await this.isClientOutdatedAsync(deviceManager)) {\n // Only prompt once per device, per run.\n ExpoGoInstaller.cache[cacheId] = true;\n const confirm = await confirmAsync({\n initial: true,\n message: `Expo Go on ${deviceManager.name} is outdated, would you like to upgrade?`,\n });\n if (confirm) {\n // Don't need to uninstall to update on iOS.\n if (this.platform !== 'ios') {\n Log.log(`Uninstalling Expo Go from ${this.platform} device ${deviceManager.name}.`);\n await deviceManager.uninstallAppAsync(this.appId);\n }\n return true;\n }\n }\n return false;\n }\n\n /** Check if a given device has Expo Go installed, if not then download and install it. */\n async ensureAsync(deviceManager: DeviceManager<IDevice>): Promise<boolean> {\n let shouldInstall = !(await deviceManager.isAppInstalledAsync(this.appId));\n\n if (!shouldInstall) {\n shouldInstall = await this.uninstallExpoGoIfOutdatedAsync(deviceManager);\n }\n\n if (shouldInstall) {\n // Download the Expo Go app from the Expo servers.\n const binaryPath = await downloadExpoGoAsync(this.platform, { sdkVersion: this.sdkVersion });\n // Install the app on the device.\n const ora = logNewSection(`Installing Expo Go on ${deviceManager.name}`);\n try {\n await deviceManager.installAppAsync(binaryPath);\n } finally {\n ora.stop();\n }\n return true;\n }\n return false;\n }\n}\n"],"names":["Log","debug","require","ExpoGoInstaller","cache","constructor","platform","appId","sdkVersion","isClientOutdatedAsync","device","installedVersion","getAppVersionAsync","version","_getExpectedClientVersionAsync","semver","lt","versions","getVersionsAsync","specificVersion","sdkVersions","latestVersion","uninstallExpoGoIfOutdatedAsync","deviceManager","cacheId","identifier","confirm","confirmAsync","initial","message","name","log","uninstallAppAsync","ensureAsync","shouldInstall","isAppInstalledAsync","binaryPath","downloadExpoGoAsync","ora","logNewSection","installAppAsync","stop"],"mappings":"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"}
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  var _config = require("@expo/config");
6
6
  var _assert = _interopRequireDefault(require("assert"));
7
- var Log = _interopRequireWildcard(require("../../log"));
8
7
  var _rudderstackClient = require("../../utils/analytics/rudderstackClient");
9
8
  var _errors = require("../../utils/errors");
10
9
  var _link = require("../../utils/link");
@@ -13,27 +12,7 @@ function _interopRequireDefault(obj) {
13
12
  default: obj
14
13
  };
15
14
  }
16
- function _interopRequireWildcard(obj) {
17
- if (obj && obj.__esModule) {
18
- return obj;
19
- } else {
20
- var newObj = {};
21
- if (obj != null) {
22
- for(var key in obj){
23
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
24
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
25
- if (desc.get || desc.set) {
26
- Object.defineProperty(newObj, key, desc);
27
- } else {
28
- newObj[key] = obj[key];
29
- }
30
- }
31
- }
32
- }
33
- newObj.default = obj;
34
- return newObj;
35
- }
36
- }
15
+ const debug = require("debug")("expo:start:platforms:platformManager");
37
16
  class PlatformManager {
38
17
  constructor(projectRoot, props){
39
18
  this.projectRoot = projectRoot;
@@ -62,11 +41,12 @@ class PlatformManager {
62
41
  };
63
42
  }
64
43
  async openProjectInCustomRuntimeAsync(resolveSettings = {}, props = {}) {
65
- Log.debug(`open custom (${Object.entries(props).map(([k, v])=>`${k}: ${v}`
44
+ debug(`open custom (${Object.entries(props).map(([k, v])=>`${k}: ${v}`
66
45
  ).join(", ")})`);
67
46
  let url = this.props.getCustomRuntimeUrl({
68
47
  scheme: props.scheme
69
48
  });
49
+ debug(`Opening project in custom runtime: ${url} -- %O`, props);
70
50
  var _applicationId;
71
51
  // TODO: It's unclear why we do application id validation when opening with a URL
72
52
  const applicationId = (_applicationId = props.applicationId) != null ? _applicationId : await this._getAppIdResolver().getAppIdAsync();
@@ -90,7 +70,7 @@ class PlatformManager {
90
70
  };
91
71
  }
92
72
  /** Launch the project on a device given the input runtime. */ async openAsync(options, resolveSettings = {}) {
93
- Log.debug(`open (runtime: ${options.runtime}, platform: ${this.props.platform}, device: %O, shouldPrompt: ${resolveSettings.shouldPrompt})`, resolveSettings.device);
73
+ debug(`open (runtime: ${options.runtime}, platform: ${this.props.platform}, device: %O, shouldPrompt: ${resolveSettings.shouldPrompt})`, resolveSettings.device);
94
74
  if (options.runtime === "expo") {
95
75
  return this.openProjectInExpoGoAsync(resolveSettings);
96
76
  } else if (options.runtime === "web") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/platforms/PlatformManager.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport assert from 'assert';\n\nimport * as Log from '../../log';\nimport { logEvent } from '../../utils/analytics/rudderstackClient';\nimport { CommandError, UnimplementedError } from '../../utils/errors';\nimport { learnMore } from '../../utils/link';\nimport { AppIdResolver } from './AppIdResolver';\nimport { DeviceManager } from './DeviceManager';\n\nexport interface BaseOpenInCustomProps {\n scheme?: string;\n applicationId?: string | null;\n}\n\nexport interface BaseResolveDeviceProps<IDevice> {\n /** Should prompt the user to select a device. */\n shouldPrompt?: boolean;\n /** The target device to use. */\n device?: IDevice;\n}\n\n/** An abstract class for launching a URL on a device. */\nexport class PlatformManager<\n IDevice,\n IOpenInCustomProps extends BaseOpenInCustomProps = BaseOpenInCustomProps,\n IResolveDeviceProps extends BaseResolveDeviceProps<IDevice> = BaseResolveDeviceProps<IDevice>\n> {\n constructor(\n protected projectRoot: string,\n protected props: {\n platform: 'ios' | 'android';\n /** Get the base URL for the dev server hosting this platform manager. */\n getDevServerUrl: () => string | null;\n /** Expo Go URL */\n getExpoGoUrl: () => string | null;\n /** Dev Client */\n getCustomRuntimeUrl: (props?: { scheme?: string }) => string | null;\n /** Resolve a device, this function should automatically handle opening the device and asserting any system validations. */\n resolveDeviceAsync: (\n resolver?: Partial<IResolveDeviceProps>\n ) => Promise<DeviceManager<IDevice>>;\n }\n ) {}\n\n /** Returns the project application identifier or asserts that one is not defined. Exposed for testing. */\n _getAppIdResolver(): AppIdResolver {\n throw new UnimplementedError();\n }\n\n protected async openProjectInExpoGoAsync(\n resolveSettings: Partial<IResolveDeviceProps> = {}\n ): Promise<{ url: string }> {\n const url = this.props.getExpoGoUrl();\n // This should never happen, but just in case...\n assert(url, 'Could not get dev server URL');\n\n const deviceManager = await this.props.resolveDeviceAsync(resolveSettings);\n deviceManager.logOpeningUrl(url);\n\n // TODO: Expensive, we should only do this once.\n const { exp } = getConfig(this.projectRoot);\n const installedExpo = await deviceManager.ensureExpoGoAsync(exp.sdkVersion);\n\n await deviceManager.activateWindowAsync();\n await deviceManager.openUrlAsync(url);\n\n logEvent('Open Url on Device', {\n platform: this.props.platform,\n installedExpo,\n });\n\n return { url };\n }\n\n private async openProjectInCustomRuntimeAsync(\n resolveSettings: Partial<IResolveDeviceProps> = {},\n props: Partial<IOpenInCustomProps> = {}\n ): Promise<{ url: string }> {\n Log.debug(\n `open custom (${Object.entries(props)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ')})`\n );\n\n let url = this.props.getCustomRuntimeUrl({ scheme: props.scheme });\n // TODO: It's unclear why we do application id validation when opening with a URL\n const applicationId = props.applicationId ?? (await this._getAppIdResolver().getAppIdAsync());\n\n const deviceManager = await this.props.resolveDeviceAsync(resolveSettings);\n\n if (!(await deviceManager.isAppInstalledAsync(applicationId))) {\n throw new CommandError(\n `The development client (${applicationId}) for this project is not installed. ` +\n `Please build and install the client on the device first.\\n${learnMore(\n 'https://docs.expo.dev/development/build/'\n )}`\n );\n }\n\n // TODO: Rethink analytics\n logEvent('Open Url on Device', {\n platform: this.props.platform,\n installedExpo: false,\n });\n\n if (!url) {\n url = this._resolveAlternativeLaunchUrl(applicationId, props);\n }\n\n deviceManager.logOpeningUrl(url);\n await deviceManager.activateWindowAsync();\n await deviceManager.openUrlAsync(url);\n\n return {\n url,\n };\n }\n\n /** Launch the project on a device given the input runtime. */\n async openAsync(\n options:\n | {\n runtime: 'expo' | 'web';\n }\n | {\n runtime: 'custom';\n props?: Partial<IOpenInCustomProps>;\n },\n resolveSettings: Partial<IResolveDeviceProps> = {}\n ): Promise<{ url: string }> {\n Log.debug(\n `open (runtime: ${options.runtime}, platform: ${this.props.platform}, device: %O, shouldPrompt: ${resolveSettings.shouldPrompt})`,\n resolveSettings.device\n );\n if (options.runtime === 'expo') {\n return this.openProjectInExpoGoAsync(resolveSettings);\n } else if (options.runtime === 'web') {\n return this.openWebProjectAsync(resolveSettings);\n } else if (options.runtime === 'custom') {\n return this.openProjectInCustomRuntimeAsync(resolveSettings, options.props);\n } else {\n throw new CommandError(`Invalid runtime target: ${options.runtime}`);\n }\n }\n\n /** Open the current web project (Webpack) in a device . */\n private async openWebProjectAsync(resolveSettings: Partial<IResolveDeviceProps> = {}): Promise<{\n url: string;\n }> {\n const url = this.props.getDevServerUrl();\n assert(url, 'Dev server is not running.');\n\n const deviceManager = await this.props.resolveDeviceAsync(resolveSettings);\n deviceManager.logOpeningUrl(url);\n await deviceManager.activateWindowAsync();\n await deviceManager.openUrlAsync(url);\n\n return { url };\n }\n\n /** If the launch URL cannot be determined (`custom` runtimes) then an alternative string can be provided to open the device. Often a device ID or activity to launch. Exposed for testing. */\n _resolveAlternativeLaunchUrl(\n applicationId: string,\n props: Partial<IOpenInCustomProps> = {}\n ): string {\n throw new UnimplementedError();\n }\n}\n"],"names":["Log","PlatformManager","constructor","projectRoot","props","_getAppIdResolver","UnimplementedError","openProjectInExpoGoAsync","resolveSettings","url","getExpoGoUrl","assert","deviceManager","resolveDeviceAsync","logOpeningUrl","exp","getConfig","installedExpo","ensureExpoGoAsync","sdkVersion","activateWindowAsync","openUrlAsync","logEvent","platform","openProjectInCustomRuntimeAsync","debug","Object","entries","map","k","v","join","getCustomRuntimeUrl","scheme","applicationId","getAppIdAsync","isAppInstalledAsync","CommandError","learnMore","_resolveAlternativeLaunchUrl","openAsync","options","runtime","shouldPrompt","device","openWebProjectAsync","getDevServerUrl"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/platforms/PlatformManager.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport assert from 'assert';\n\nimport { logEvent } from '../../utils/analytics/rudderstackClient';\nimport { CommandError, UnimplementedError } from '../../utils/errors';\nimport { learnMore } from '../../utils/link';\nimport { AppIdResolver } from './AppIdResolver';\nimport { DeviceManager } from './DeviceManager';\n\nconst debug = require('debug')('expo:start:platforms:platformManager') as typeof console.log;\n\nexport interface BaseOpenInCustomProps {\n scheme?: string;\n applicationId?: string | null;\n}\n\nexport interface BaseResolveDeviceProps<IDevice> {\n /** Should prompt the user to select a device. */\n shouldPrompt?: boolean;\n /** The target device to use. */\n device?: IDevice;\n}\n\n/** An abstract class for launching a URL on a device. */\nexport class PlatformManager<\n IDevice,\n IOpenInCustomProps extends BaseOpenInCustomProps = BaseOpenInCustomProps,\n IResolveDeviceProps extends BaseResolveDeviceProps<IDevice> = BaseResolveDeviceProps<IDevice>\n> {\n constructor(\n protected projectRoot: string,\n protected props: {\n platform: 'ios' | 'android';\n /** Get the base URL for the dev server hosting this platform manager. */\n getDevServerUrl: () => string | null;\n /** Expo Go URL */\n getExpoGoUrl: () => string | null;\n /** Dev Client */\n getCustomRuntimeUrl: (props?: { scheme?: string }) => string | null;\n /** Resolve a device, this function should automatically handle opening the device and asserting any system validations. */\n resolveDeviceAsync: (\n resolver?: Partial<IResolveDeviceProps>\n ) => Promise<DeviceManager<IDevice>>;\n }\n ) {}\n\n /** Returns the project application identifier or asserts that one is not defined. Exposed for testing. */\n _getAppIdResolver(): AppIdResolver {\n throw new UnimplementedError();\n }\n\n protected async openProjectInExpoGoAsync(\n resolveSettings: Partial<IResolveDeviceProps> = {}\n ): Promise<{ url: string }> {\n const url = this.props.getExpoGoUrl();\n // This should never happen, but just in case...\n assert(url, 'Could not get dev server URL');\n\n const deviceManager = await this.props.resolveDeviceAsync(resolveSettings);\n deviceManager.logOpeningUrl(url);\n\n // TODO: Expensive, we should only do this once.\n const { exp } = getConfig(this.projectRoot);\n const installedExpo = await deviceManager.ensureExpoGoAsync(exp.sdkVersion);\n\n await deviceManager.activateWindowAsync();\n await deviceManager.openUrlAsync(url);\n\n logEvent('Open Url on Device', {\n platform: this.props.platform,\n installedExpo,\n });\n\n return { url };\n }\n\n private async openProjectInCustomRuntimeAsync(\n resolveSettings: Partial<IResolveDeviceProps> = {},\n props: Partial<IOpenInCustomProps> = {}\n ): Promise<{ url: string }> {\n debug(\n `open custom (${Object.entries(props)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ')})`\n );\n\n let url = this.props.getCustomRuntimeUrl({ scheme: props.scheme });\n debug(`Opening project in custom runtime: ${url} -- %O`, props);\n // TODO: It's unclear why we do application id validation when opening with a URL\n const applicationId = props.applicationId ?? (await this._getAppIdResolver().getAppIdAsync());\n\n const deviceManager = await this.props.resolveDeviceAsync(resolveSettings);\n\n if (!(await deviceManager.isAppInstalledAsync(applicationId))) {\n throw new CommandError(\n `The development client (${applicationId}) for this project is not installed. ` +\n `Please build and install the client on the device first.\\n${learnMore(\n 'https://docs.expo.dev/development/build/'\n )}`\n );\n }\n\n // TODO: Rethink analytics\n logEvent('Open Url on Device', {\n platform: this.props.platform,\n installedExpo: false,\n });\n\n if (!url) {\n url = this._resolveAlternativeLaunchUrl(applicationId, props);\n }\n\n deviceManager.logOpeningUrl(url);\n await deviceManager.activateWindowAsync();\n await deviceManager.openUrlAsync(url);\n\n return {\n url,\n };\n }\n\n /** Launch the project on a device given the input runtime. */\n async openAsync(\n options:\n | {\n runtime: 'expo' | 'web';\n }\n | {\n runtime: 'custom';\n props?: Partial<IOpenInCustomProps>;\n },\n resolveSettings: Partial<IResolveDeviceProps> = {}\n ): Promise<{ url: string }> {\n debug(\n `open (runtime: ${options.runtime}, platform: ${this.props.platform}, device: %O, shouldPrompt: ${resolveSettings.shouldPrompt})`,\n resolveSettings.device\n );\n if (options.runtime === 'expo') {\n return this.openProjectInExpoGoAsync(resolveSettings);\n } else if (options.runtime === 'web') {\n return this.openWebProjectAsync(resolveSettings);\n } else if (options.runtime === 'custom') {\n return this.openProjectInCustomRuntimeAsync(resolveSettings, options.props);\n } else {\n throw new CommandError(`Invalid runtime target: ${options.runtime}`);\n }\n }\n\n /** Open the current web project (Webpack) in a device . */\n private async openWebProjectAsync(resolveSettings: Partial<IResolveDeviceProps> = {}): Promise<{\n url: string;\n }> {\n const url = this.props.getDevServerUrl();\n assert(url, 'Dev server is not running.');\n\n const deviceManager = await this.props.resolveDeviceAsync(resolveSettings);\n deviceManager.logOpeningUrl(url);\n await deviceManager.activateWindowAsync();\n await deviceManager.openUrlAsync(url);\n\n return { url };\n }\n\n /** If the launch URL cannot be determined (`custom` runtimes) then an alternative string can be provided to open the device. Often a device ID or activity to launch. Exposed for testing. */\n _resolveAlternativeLaunchUrl(\n applicationId: string,\n props: Partial<IOpenInCustomProps> = {}\n ): string {\n throw new UnimplementedError();\n }\n}\n"],"names":["debug","require","PlatformManager","constructor","projectRoot","props","_getAppIdResolver","UnimplementedError","openProjectInExpoGoAsync","resolveSettings","url","getExpoGoUrl","assert","deviceManager","resolveDeviceAsync","logOpeningUrl","exp","getConfig","installedExpo","ensureExpoGoAsync","sdkVersion","activateWindowAsync","openUrlAsync","logEvent","platform","openProjectInCustomRuntimeAsync","Object","entries","map","k","v","join","getCustomRuntimeUrl","scheme","applicationId","getAppIdAsync","isAppInstalledAsync","CommandError","learnMore","_resolveAlternativeLaunchUrl","openAsync","options","runtime","shouldPrompt","device","openWebProjectAsync","getDevServerUrl"],"mappings":"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"}
@@ -4,45 +4,30 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  var _spawnAsync = _interopRequireDefault(require("@expo/spawn-async"));
6
6
  var _childProcess = require("child_process");
7
- var Log = _interopRequireWildcard(require("../../../log"));
7
+ var _log = require("../../../log");
8
8
  var _errors = require("../../../utils/errors");
9
9
  var _exit = require("../../../utils/exit");
10
+ var _androidSdk = require("./AndroidSdk");
10
11
  function _interopRequireDefault(obj) {
11
12
  return obj && obj.__esModule ? obj : {
12
13
  default: obj
13
14
  };
14
15
  }
15
- function _interopRequireWildcard(obj) {
16
- if (obj && obj.__esModule) {
17
- return obj;
18
- } else {
19
- var newObj = {};
20
- if (obj != null) {
21
- for(var key in obj){
22
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
23
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
24
- if (desc.get || desc.set) {
25
- Object.defineProperty(newObj, key, desc);
26
- } else {
27
- newObj[key] = obj[key];
28
- }
29
- }
30
- }
31
- }
32
- newObj.default = obj;
33
- return newObj;
34
- }
35
- }
16
+ const debug = require("debug")("expo:start:platforms:android:adbServer");
36
17
  const BEGINNING_OF_ADB_ERROR_MESSAGE = "error: ";
37
18
  class ADBServer {
38
19
  isRunning = false;
39
20
  removeExitHook = ()=>{};
40
21
  /** Returns the command line reference to ADB. */ getAdbExecutablePath() {
41
- // https://developer.android.com/studio/command-line/variables
42
- // TODO: Add ANDROID_SDK_ROOT support as well https://github.com/expo/expo/pull/16516#discussion_r820037917
43
- if (process.env.ANDROID_HOME) {
44
- return `${process.env.ANDROID_HOME}/platform-tools/adb`;
22
+ try {
23
+ const sdkRoot = (0, _androidSdk).assertSdkRoot();
24
+ if (sdkRoot) {
25
+ return `${sdkRoot}/platform-tools/adb`;
26
+ }
27
+ } catch (error) {
28
+ _log.Log.warn(error.message);
45
29
  }
30
+ _log.Log.debug("Failed to resolve the Android SDK path, falling back to global adb executable");
46
31
  return "adb";
47
32
  }
48
33
  /** Start the ADB server. */ async startAsync() {
@@ -65,9 +50,9 @@ class ADBServer {
65
50
  return isStarted;
66
51
  }
67
52
  /** Kill the ADB server. */ async stopAsync() {
68
- Log.debug("Stopping ADB server");
53
+ debug("Stopping ADB server");
69
54
  if (!this.isRunning) {
70
- Log.debug("ADB server is not running");
55
+ debug("ADB server is not running");
71
56
  return false;
72
57
  }
73
58
  this.removeExitHook();
@@ -77,10 +62,10 @@ class ADBServer {
77
62
  ]);
78
63
  return true;
79
64
  } catch (error) {
80
- Log.error("Failed to stop ADB server: " + error.message);
65
+ _log.Log.error("Failed to stop ADB server: " + error.message);
81
66
  return false;
82
67
  } finally{
83
- Log.debug("Stopped ADB server");
68
+ debug("Stopped ADB server");
84
69
  this.isRunning = false;
85
70
  }
86
71
  }
@@ -88,7 +73,7 @@ class ADBServer {
88
73
  // TODO: Add a global package that installs adb to the path.
89
74
  const adb = this.getAdbExecutablePath();
90
75
  await this.startAsync();
91
- Log.debug([
76
+ debug([
92
77
  adb,
93
78
  ...args
94
79
  ].join(" "));
@@ -103,7 +88,7 @@ class ADBServer {
103
88
  encoding: "latin1",
104
89
  stdio: "pipe"
105
90
  }));
106
- Log.debug("[ADB] File output:\n", results);
91
+ debug("[ADB] File output:\n", results);
107
92
  return results;
108
93
  }
109
94
  /** Formats error info. */ async resolveAdbPromise(promise) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/platforms/android/ADBServer.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport { execFileSync } from 'child_process';\n\nimport * as Log from '../../../log';\nimport { AbortCommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\n\nconst BEGINNING_OF_ADB_ERROR_MESSAGE = 'error: ';\n\n// This is a tricky class since it controls a system state (side-effects).\n// A more ideal solution would be to implement ADB in JS.\n// The main reason this is a class is to control the flow of testing.\n\nexport class ADBServer {\n isRunning: boolean = false;\n removeExitHook: () => void = () => {};\n\n /** Returns the command line reference to ADB. */\n getAdbExecutablePath(): string {\n // https://developer.android.com/studio/command-line/variables\n // TODO: Add ANDROID_SDK_ROOT support as well https://github.com/expo/expo/pull/16516#discussion_r820037917\n if (process.env.ANDROID_HOME) {\n return `${process.env.ANDROID_HOME}/platform-tools/adb`;\n }\n return 'adb';\n }\n\n /** Start the ADB server. */\n async startAsync(): Promise<boolean> {\n if (this.isRunning) {\n return false;\n }\n // clean up\n this.removeExitHook = installExitHooks(() => {\n if (this.isRunning) {\n this.stopAsync();\n }\n });\n const adb = this.getAdbExecutablePath();\n const result = await this.resolveAdbPromise(spawnAsync(adb, ['start-server']));\n const lines = result.stderr.trim().split(/\\r?\\n/);\n const isStarted = lines.includes('* daemon started successfully');\n this.isRunning = isStarted;\n return isStarted;\n }\n\n /** Kill the ADB server. */\n async stopAsync(): Promise<boolean> {\n Log.debug('Stopping ADB server');\n\n if (!this.isRunning) {\n Log.debug('ADB server is not running');\n return false;\n }\n this.removeExitHook();\n try {\n await this.runAsync(['kill-server']);\n return true;\n } catch (error: any) {\n Log.error('Failed to stop ADB server: ' + error.message);\n return false;\n } finally {\n Log.debug('Stopped ADB server');\n this.isRunning = false;\n }\n }\n\n /** Execute an ADB command with given args. */\n async runAsync(args: string[]): Promise<string> {\n // TODO: Add a global package that installs adb to the path.\n const adb = this.getAdbExecutablePath();\n\n await this.startAsync();\n\n Log.debug([adb, ...args].join(' '));\n const result = await this.resolveAdbPromise(spawnAsync(adb, args));\n return result.output.join('\\n');\n }\n\n /** Get ADB file output. Useful for reading device state/settings. */\n async getFileOutputAsync(args: string[]): Promise<string> {\n // TODO: Add a global package that installs adb to the path.\n const adb = this.getAdbExecutablePath();\n\n await this.startAsync();\n\n const results = await this.resolveAdbPromise(\n execFileSync(adb, args, {\n encoding: 'latin1',\n stdio: 'pipe',\n })\n );\n Log.debug('[ADB] File output:\\n', results);\n return results;\n }\n\n /** Formats error info. */\n async resolveAdbPromise<T>(promise: T | Promise<T>): Promise<T> {\n try {\n return await promise;\n } catch (error: any) {\n // User pressed ctrl+c to cancel the process...\n if (error.signal === 'SIGINT') {\n throw new AbortCommandError();\n }\n // TODO: Support heap corruption for adb 29 (process exits with code -1073740940) (windows and linux)\n let errorMessage = (error.stderr || error.stdout || error.message).trim();\n if (errorMessage.startsWith(BEGINNING_OF_ADB_ERROR_MESSAGE)) {\n errorMessage = errorMessage.substring(BEGINNING_OF_ADB_ERROR_MESSAGE.length);\n }\n error.message = errorMessage;\n throw error;\n }\n }\n}\n"],"names":["Log","BEGINNING_OF_ADB_ERROR_MESSAGE","ADBServer","isRunning","removeExitHook","getAdbExecutablePath","process","env","ANDROID_HOME","startAsync","installExitHooks","stopAsync","adb","result","resolveAdbPromise","spawnAsync","lines","stderr","trim","split","isStarted","includes","debug","runAsync","error","message","args","join","output","getFileOutputAsync","results","execFileSync","encoding","stdio","promise","signal","AbortCommandError","errorMessage","stdout","startsWith","substring","length"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/platforms/android/ADBServer.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport { execFileSync } from 'child_process';\n\nimport { Log } from '../../../log';\nimport { AbortCommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { assertSdkRoot } from './AndroidSdk';\n\nconst debug = require('debug')('expo:start:platforms:android:adbServer') as typeof console.log;\n\nconst BEGINNING_OF_ADB_ERROR_MESSAGE = 'error: ';\n\n// This is a tricky class since it controls a system state (side-effects).\n// A more ideal solution would be to implement ADB in JS.\n// The main reason this is a class is to control the flow of testing.\n\nexport class ADBServer {\n isRunning: boolean = false;\n removeExitHook: () => void = () => {};\n\n /** Returns the command line reference to ADB. */\n getAdbExecutablePath(): string {\n try {\n const sdkRoot = assertSdkRoot();\n if (sdkRoot) {\n return `${sdkRoot}/platform-tools/adb`;\n }\n } catch (error: any) {\n Log.warn(error.message);\n }\n\n Log.debug('Failed to resolve the Android SDK path, falling back to global adb executable');\n return 'adb';\n }\n\n /** Start the ADB server. */\n async startAsync(): Promise<boolean> {\n if (this.isRunning) {\n return false;\n }\n // clean up\n this.removeExitHook = installExitHooks(() => {\n if (this.isRunning) {\n this.stopAsync();\n }\n });\n const adb = this.getAdbExecutablePath();\n const result = await this.resolveAdbPromise(spawnAsync(adb, ['start-server']));\n const lines = result.stderr.trim().split(/\\r?\\n/);\n const isStarted = lines.includes('* daemon started successfully');\n this.isRunning = isStarted;\n return isStarted;\n }\n\n /** Kill the ADB server. */\n async stopAsync(): Promise<boolean> {\n debug('Stopping ADB server');\n\n if (!this.isRunning) {\n debug('ADB server is not running');\n return false;\n }\n this.removeExitHook();\n try {\n await this.runAsync(['kill-server']);\n return true;\n } catch (error: any) {\n Log.error('Failed to stop ADB server: ' + error.message);\n return false;\n } finally {\n debug('Stopped ADB server');\n this.isRunning = false;\n }\n }\n\n /** Execute an ADB command with given args. */\n async runAsync(args: string[]): Promise<string> {\n // TODO: Add a global package that installs adb to the path.\n const adb = this.getAdbExecutablePath();\n\n await this.startAsync();\n\n debug([adb, ...args].join(' '));\n const result = await this.resolveAdbPromise(spawnAsync(adb, args));\n return result.output.join('\\n');\n }\n\n /** Get ADB file output. Useful for reading device state/settings. */\n async getFileOutputAsync(args: string[]): Promise<string> {\n // TODO: Add a global package that installs adb to the path.\n const adb = this.getAdbExecutablePath();\n\n await this.startAsync();\n\n const results = await this.resolveAdbPromise(\n execFileSync(adb, args, {\n encoding: 'latin1',\n stdio: 'pipe',\n })\n );\n debug('[ADB] File output:\\n', results);\n return results;\n }\n\n /** Formats error info. */\n async resolveAdbPromise<T>(promise: T | Promise<T>): Promise<T> {\n try {\n return await promise;\n } catch (error: any) {\n // User pressed ctrl+c to cancel the process...\n if (error.signal === 'SIGINT') {\n throw new AbortCommandError();\n }\n // TODO: Support heap corruption for adb 29 (process exits with code -1073740940) (windows and linux)\n let errorMessage = (error.stderr || error.stdout || error.message).trim();\n if (errorMessage.startsWith(BEGINNING_OF_ADB_ERROR_MESSAGE)) {\n errorMessage = errorMessage.substring(BEGINNING_OF_ADB_ERROR_MESSAGE.length);\n }\n error.message = errorMessage;\n throw error;\n }\n }\n}\n"],"names":["debug","require","BEGINNING_OF_ADB_ERROR_MESSAGE","ADBServer","isRunning","removeExitHook","getAdbExecutablePath","sdkRoot","assertSdkRoot","error","Log","warn","message","startAsync","installExitHooks","stopAsync","adb","result","resolveAdbPromise","spawnAsync","lines","stderr","trim","split","isStarted","includes","runAsync","args","join","output","getFileOutputAsync","results","execFileSync","encoding","stdio","promise","signal","AbortCommandError","errorMessage","stdout","startsWith","substring","length"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.assertSdkRoot = assertSdkRoot;
6
+ var _assert = _interopRequireDefault(require("assert"));
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+ var _os = _interopRequireDefault(require("os"));
9
+ var _path = _interopRequireDefault(require("path"));
10
+ function _interopRequireDefault(obj) {
11
+ return obj && obj.__esModule ? obj : {
12
+ default: obj
13
+ };
14
+ }
15
+ /**
16
+ * The default Android SDK locations per platform.
17
+ * @see https://developer.android.com/studio/run/emulator-commandline#filedir
18
+ * @see https://developer.android.com/studio/intro/studio-config#optimize-studio-windows
19
+ */ const ANDROID_DEFAULT_LOCATION = {
20
+ darwin: _path.default.join(_os.default.homedir(), "Library", "Android", "sdk"),
21
+ linux: _path.default.join(_os.default.homedir(), "Android", "sdk"),
22
+ win32: _path.default.join(_os.default.homedir(), "AppData", "Local", "Android", "Sdk")
23
+ };
24
+ function assertSdkRoot() {
25
+ if (process.env.ANDROID_HOME) {
26
+ (0, _assert).default(_fs.default.existsSync(process.env.ANDROID_HOME), `Failed to resolve the Android SDK path. ANDROID_HOME is set to a non-existing path: ${process.env.ANDROID_HOME}`);
27
+ return process.env.ANDROID_HOME;
28
+ }
29
+ if (process.env.ANDROID_SDK_ROOT) {
30
+ (0, _assert).default(_fs.default.existsSync(process.env.ANDROID_SDK_ROOT), `Failed to resolve the Android SDK path. Deprecated ANDROID_SDK_ROOT is set to a non-existing path: ${process.env.ANDROID_SDK_ROOT}. Use ANDROID_HOME instead.`);
31
+ return process.env.ANDROID_SDK_ROOT;
32
+ }
33
+ const defaultLocation = ANDROID_DEFAULT_LOCATION[process.platform];
34
+ if (defaultLocation) {
35
+ (0, _assert).default(_fs.default.existsSync(defaultLocation), `Failed to resolve the Android SDK path. Default install location not found: ${defaultLocation}. Use ANDROID_HOME to set the Android SDK location.`);
36
+ return defaultLocation;
37
+ }
38
+ return null;
39
+ }
40
+
41
+ //# sourceMappingURL=AndroidSdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/platforms/android/AndroidSdk.ts"],"sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\n/**\n * The default Android SDK locations per platform.\n * @see https://developer.android.com/studio/run/emulator-commandline#filedir\n * @see https://developer.android.com/studio/intro/studio-config#optimize-studio-windows\n */\nconst ANDROID_DEFAULT_LOCATION: Readonly<Partial<Record<NodeJS.Platform, string>>> = {\n darwin: path.join(os.homedir(), 'Library', 'Android', 'sdk'),\n linux: path.join(os.homedir(), 'Android', 'sdk'),\n win32: path.join(os.homedir(), 'AppData', 'Local', 'Android', 'Sdk'),\n};\n\n/**\n * Resolve and validate the root folder where the Android SDK has been installed.\n * This checks both `ANDROID_HOME`, `ANDROID_SDK_ROOT`, and the default path for the current platform.\n * @see https://developer.android.com/studio/command-line/variables\n */\nexport function assertSdkRoot() {\n if (process.env.ANDROID_HOME) {\n assert(\n fs.existsSync(process.env.ANDROID_HOME),\n `Failed to resolve the Android SDK path. ANDROID_HOME is set to a non-existing path: ${process.env.ANDROID_HOME}`\n );\n return process.env.ANDROID_HOME;\n }\n\n if (process.env.ANDROID_SDK_ROOT) {\n assert(\n fs.existsSync(process.env.ANDROID_SDK_ROOT),\n `Failed to resolve the Android SDK path. Deprecated ANDROID_SDK_ROOT is set to a non-existing path: ${process.env.ANDROID_SDK_ROOT}. Use ANDROID_HOME instead.`\n );\n return process.env.ANDROID_SDK_ROOT;\n }\n\n const defaultLocation = ANDROID_DEFAULT_LOCATION[process.platform];\n if (defaultLocation) {\n assert(\n fs.existsSync(defaultLocation),\n `Failed to resolve the Android SDK path. Default install location not found: ${defaultLocation}. Use ANDROID_HOME to set the Android SDK location.`\n );\n return defaultLocation;\n }\n\n return null;\n}\n"],"names":["assertSdkRoot","ANDROID_DEFAULT_LOCATION","darwin","path","join","os","homedir","linux","win32","process","env","ANDROID_HOME","assert","fs","existsSync","ANDROID_SDK_ROOT","defaultLocation","platform"],"mappings":"AAAA;;;;QAqBgBA,aAAa,GAAbA,aAAa;AArBV,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACZ,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACJ,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;;;;;;AAEvB;;;;GAIG,CACH,MAAMC,wBAAwB,GAAuD;IACnFC,MAAM,EAAEC,KAAI,QAAA,CAACC,IAAI,CAACC,GAAE,QAAA,CAACC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;IAC5DC,KAAK,EAAEJ,KAAI,QAAA,CAACC,IAAI,CAACC,GAAE,QAAA,CAACC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC;IAChDE,KAAK,EAAEL,KAAI,QAAA,CAACC,IAAI,CAACC,GAAE,QAAA,CAACC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC;CACrE,AAAC;AAOK,SAASN,aAAa,GAAG;IAC9B,IAAIS,OAAO,CAACC,GAAG,CAACC,YAAY,EAAE;QAC5BC,CAAAA,GAAAA,OAAM,AAGL,CAAA,QAHK,CACJC,GAAE,QAAA,CAACC,UAAU,CAACL,OAAO,CAACC,GAAG,CAACC,YAAY,CAAC,EACvC,CAAC,oFAAoF,EAAEF,OAAO,CAACC,GAAG,CAACC,YAAY,CAAC,CAAC,CAClH,CAAC;QACF,OAAOF,OAAO,CAACC,GAAG,CAACC,YAAY,CAAC;KACjC;IAED,IAAIF,OAAO,CAACC,GAAG,CAACK,gBAAgB,EAAE;QAChCH,CAAAA,GAAAA,OAAM,AAGL,CAAA,QAHK,CACJC,GAAE,QAAA,CAACC,UAAU,CAACL,OAAO,CAACC,GAAG,CAACK,gBAAgB,CAAC,EAC3C,CAAC,mGAAmG,EAAEN,OAAO,CAACC,GAAG,CAACK,gBAAgB,CAAC,2BAA2B,CAAC,CAChK,CAAC;QACF,OAAON,OAAO,CAACC,GAAG,CAACK,gBAAgB,CAAC;KACrC;IAED,MAAMC,eAAe,GAAGf,wBAAwB,CAACQ,OAAO,CAACQ,QAAQ,CAAC,AAAC;IACnE,IAAID,eAAe,EAAE;QACnBJ,CAAAA,GAAAA,OAAM,AAGL,CAAA,QAHK,CACJC,GAAE,QAAA,CAACC,UAAU,CAACE,eAAe,CAAC,EAC9B,CAAC,4EAA4E,EAAEA,eAAe,CAAC,mDAAmD,CAAC,CACpJ,CAAC;QACF,OAAOA,eAAe,CAAC;KACxB;IAED,OAAO,IAAI,CAAC;CACb"}
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  exports.activateWindowAsync = activateWindowAsync;
6
6
  var osascript = _interopRequireWildcard(require("@expo/osascript"));
7
7
  var _childProcess = require("child_process");
8
- var Log = _interopRequireWildcard(require("../../../log"));
9
8
  function _interopRequireWildcard(obj) {
10
9
  if (obj && obj.__esModule) {
11
10
  return obj;
@@ -27,6 +26,7 @@ function _interopRequireWildcard(obj) {
27
26
  return newObj;
28
27
  }
29
28
  }
29
+ const debug = require("debug")("expo:start:platforms:android:activateWindow");
30
30
  function getUnixPID(port) {
31
31
  var ref;
32
32
  // Runs like `lsof -i:8081 -P -t -sTCP:LISTEN`
@@ -36,7 +36,7 @@ function getUnixPID(port) {
36
36
  "-t",
37
37
  "-sTCP:LISTEN"
38
38
  ];
39
- Log.debug("lsof " + args.join(" "));
39
+ debug("lsof " + args.join(" "));
40
40
  return (ref = (0, _childProcess).execFileSync("lsof", args, {
41
41
  encoding: "utf8",
42
42
  stdio: [
@@ -48,7 +48,7 @@ function getUnixPID(port) {
48
48
  }
49
49
  async function activateWindowAsync(device) {
50
50
  var ref;
51
- Log.debug(`Activating window for device (pid: ${device.pid}, type: ${device.type})`);
51
+ debug(`Activating window for device (pid: ${device.pid}, type: ${device.type})`);
52
52
  if (// only mac is supported for now.
53
53
  process.platform !== "darwin" || // can only focus emulators
54
54
  device.type !== "emulator") {
@@ -64,7 +64,7 @@ async function activateWindowAsync(device) {
64
64
  if (!pid) {
65
65
  return false;
66
66
  }
67
- Log.debug(`Activate window for pid:`, pid);
67
+ debug(`Activate window for pid:`, pid);
68
68
  try {
69
69
  await osascript.execAsync(`
70
70
  tell application "System Events"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/platforms/android/activateWindow.ts"],"sourcesContent":["import * as osascript from '@expo/osascript';\nimport { execFileSync } from 'child_process';\n\nimport * as Log from '../../../log';\nimport { Device } from './adb';\n\nfunction getUnixPID(port: number | string): string {\n // Runs like `lsof -i:8081 -P -t -sTCP:LISTEN`\n const args = [`-i:${port}`, '-P', '-t', '-sTCP:LISTEN'];\n Log.debug('lsof ' + args.join(' '));\n return execFileSync('lsof', args, {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'ignore'],\n })\n .split('\\n')[0]\n ?.trim?.();\n}\n\n/** Activate the Emulator window on macOS. */\nexport async function activateWindowAsync(device: Pick<Device, 'type' | 'pid'>): Promise<boolean> {\n Log.debug(`Activating window for device (pid: ${device.pid}, type: ${device.type})`);\n if (\n // only mac is supported for now.\n process.platform !== 'darwin' ||\n // can only focus emulators\n device.type !== 'emulator'\n ) {\n return false;\n }\n\n // Google Emulator ID: `emulator-5554` -> `5554`\n const androidPid = device.pid!.match(/-(\\d+)/)?.[1];\n if (!androidPid) {\n return false;\n }\n // Unix PID\n const pid = getUnixPID(androidPid);\n\n if (!pid) {\n return false;\n }\n Log.debug(`Activate window for pid:`, pid);\n try {\n await osascript.execAsync(`\n tell application \"System Events\"\n set frontmost of the first process whose unix id is ${pid} to true\n end tell`);\n return true;\n } catch {\n // noop -- this feature is very specific and subject to failure.\n return false;\n }\n}\n"],"names":["activateWindowAsync","osascript","Log","getUnixPID","port","execFileSync","args","debug","join","encoding","stdio","split","trim","device","pid","type","process","platform","androidPid","match","execAsync"],"mappings":"AAAA;;;;QAmBsBA,mBAAmB,GAAnBA,mBAAmB;AAnB7BC,IAAAA,SAAS,mCAAM,iBAAiB,EAAvB;AACQ,IAAA,aAAe,WAAf,eAAe,CAAA;AAEhCC,IAAAA,GAAG,mCAAM,cAAc,EAApB;;;;;;;;;;;;;;;;;;;;;;AAGf,SAASC,UAAU,CAACC,IAAqB,EAAU;QAI1CC,GAIU;IAPjB,8CAA8C;IAC9C,MAAMC,IAAI,GAAG;QAAC,CAAC,GAAG,EAAEF,IAAI,CAAC,CAAC;QAAE,IAAI;QAAE,IAAI;QAAE,cAAc;KAAC,AAAC;IACxDF,GAAG,CAACK,KAAK,CAAC,OAAO,GAAGD,IAAI,CAACE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAOH,CAAAA,GAIU,GAJVA,CAAAA,GAAAA,aAAY,AAGjB,CAAA,aAHiB,CAAC,MAAM,EAAEC,IAAI,EAAE;QAChCG,QAAQ,EAAE,MAAM;QAChBC,KAAK,EAAE;YAAC,MAAM;YAAE,MAAM;YAAE,QAAQ;SAAC;KAClC,CAAC,CACCC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SACT,GALDN,KAAAA,CAKC,GALDA,GAIU,CACbO,IAAI,QAAI,GALLP,KAAAA,CAKK,GALLA,GAIU,CACbO,IAAI,EAAI,CAAC;CACd;AAGM,eAAeZ,mBAAmB,CAACa,MAAoC,EAAoB;QAY7EA,GAA2B;IAX9CX,GAAG,CAACK,KAAK,CAAC,CAAC,mCAAmC,EAAEM,MAAM,CAACC,GAAG,CAAC,QAAQ,EAAED,MAAM,CAACE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,IACE,iCAAiC;IACjCC,OAAO,CAACC,QAAQ,KAAK,QAAQ,IAC7B,2BAA2B;IAC3BJ,MAAM,CAACE,IAAI,KAAK,UAAU,EAC1B;QACA,OAAO,KAAK,CAAC;KACd;IAED,gDAAgD;IAChD,MAAMG,UAAU,GAAGL,CAAAA,GAA2B,GAA3BA,MAAM,CAACC,GAAG,CAAEK,KAAK,UAAU,SAAK,GAAhCN,KAAAA,CAAgC,GAAhCA,GAA2B,AAAE,CAAC,CAAC,CAAC,AAAC;IACpD,IAAI,CAACK,UAAU,EAAE;QACf,OAAO,KAAK,CAAC;KACd;IACD,WAAW;IACX,MAAMJ,GAAG,GAAGX,UAAU,CAACe,UAAU,CAAC,AAAC;IAEnC,IAAI,CAACJ,GAAG,EAAE;QACR,OAAO,KAAK,CAAC;KACd;IACDZ,GAAG,CAACK,KAAK,CAAC,CAAC,wBAAwB,CAAC,EAAEO,GAAG,CAAC,CAAC;IAC3C,IAAI;QACF,MAAMb,SAAS,CAACmB,SAAS,CAAC,CAAC;;0DAE2B,EAAEN,GAAG,CAAC;YACpD,CAAC,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;KACb,CAAC,OAAM;QACN,gEAAgE;QAChE,OAAO,KAAK,CAAC;KACd;CACF"}
1
+ {"version":3,"sources":["../../../../../src/start/platforms/android/activateWindow.ts"],"sourcesContent":["import * as osascript from '@expo/osascript';\nimport { execFileSync } from 'child_process';\n\nimport { Device } from './adb';\n\nconst debug = require('debug')('expo:start:platforms:android:activateWindow') as typeof console.log;\n\nfunction getUnixPID(port: number | string): string {\n // Runs like `lsof -i:8081 -P -t -sTCP:LISTEN`\n const args = [`-i:${port}`, '-P', '-t', '-sTCP:LISTEN'];\n debug('lsof ' + args.join(' '));\n return execFileSync('lsof', args, {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'ignore'],\n })\n .split('\\n')[0]\n ?.trim?.();\n}\n\n/** Activate the Emulator window on macOS. */\nexport async function activateWindowAsync(device: Pick<Device, 'type' | 'pid'>): Promise<boolean> {\n debug(`Activating window for device (pid: ${device.pid}, type: ${device.type})`);\n if (\n // only mac is supported for now.\n process.platform !== 'darwin' ||\n // can only focus emulators\n device.type !== 'emulator'\n ) {\n return false;\n }\n\n // Google Emulator ID: `emulator-5554` -> `5554`\n const androidPid = device.pid!.match(/-(\\d+)/)?.[1];\n if (!androidPid) {\n return false;\n }\n // Unix PID\n const pid = getUnixPID(androidPid);\n\n if (!pid) {\n return false;\n }\n debug(`Activate window for pid:`, pid);\n try {\n await osascript.execAsync(`\n tell application \"System Events\"\n set frontmost of the first process whose unix id is ${pid} to true\n end tell`);\n return true;\n } catch {\n // noop -- this feature is very specific and subject to failure.\n return false;\n }\n}\n"],"names":["activateWindowAsync","osascript","debug","require","getUnixPID","port","execFileSync","args","join","encoding","stdio","split","trim","device","pid","type","process","platform","androidPid","match","execAsync"],"mappings":"AAAA;;;;QAoBsBA,mBAAmB,GAAnBA,mBAAmB;AApB7BC,IAAAA,SAAS,mCAAM,iBAAiB,EAAvB;AACQ,IAAA,aAAe,WAAf,eAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;AAI5C,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,6CAA6C,CAAC,AAAsB,AAAC;AAEpG,SAASC,UAAU,CAACC,IAAqB,EAAU;QAI1CC,GAIU;IAPjB,8CAA8C;IAC9C,MAAMC,IAAI,GAAG;QAAC,CAAC,GAAG,EAAEF,IAAI,CAAC,CAAC;QAAE,IAAI;QAAE,IAAI;QAAE,cAAc;KAAC,AAAC;IACxDH,KAAK,CAAC,OAAO,GAAGK,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,OAAOF,CAAAA,GAIU,GAJVA,CAAAA,GAAAA,aAAY,AAGjB,CAAA,aAHiB,CAAC,MAAM,EAAEC,IAAI,EAAE;QAChCE,QAAQ,EAAE,MAAM;QAChBC,KAAK,EAAE;YAAC,MAAM;YAAE,MAAM;YAAE,QAAQ;SAAC;KAClC,CAAC,CACCC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SACT,GALDL,KAAAA,CAKC,GALDA,GAIU,CACbM,IAAI,QAAI,GALLN,KAAAA,CAKK,GALLA,GAIU,CACbM,IAAI,EAAI,CAAC;CACd;AAGM,eAAeZ,mBAAmB,CAACa,MAAoC,EAAoB;QAY7EA,GAA2B;IAX9CX,KAAK,CAAC,CAAC,mCAAmC,EAAEW,MAAM,CAACC,GAAG,CAAC,QAAQ,EAAED,MAAM,CAACE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IACE,iCAAiC;IACjCC,OAAO,CAACC,QAAQ,KAAK,QAAQ,IAC7B,2BAA2B;IAC3BJ,MAAM,CAACE,IAAI,KAAK,UAAU,EAC1B;QACA,OAAO,KAAK,CAAC;KACd;IAED,gDAAgD;IAChD,MAAMG,UAAU,GAAGL,CAAAA,GAA2B,GAA3BA,MAAM,CAACC,GAAG,CAAEK,KAAK,UAAU,SAAK,GAAhCN,KAAAA,CAAgC,GAAhCA,GAA2B,AAAE,CAAC,CAAC,CAAC,AAAC;IACpD,IAAI,CAACK,UAAU,EAAE;QACf,OAAO,KAAK,CAAC;KACd;IACD,WAAW;IACX,MAAMJ,GAAG,GAAGV,UAAU,CAACc,UAAU,CAAC,AAAC;IAEnC,IAAI,CAACJ,GAAG,EAAE;QACR,OAAO,KAAK,CAAC;KACd;IACDZ,KAAK,CAAC,CAAC,wBAAwB,CAAC,EAAEY,GAAG,CAAC,CAAC;IACvC,IAAI;QACF,MAAMb,SAAS,CAACmB,SAAS,CAAC,CAAC;;0DAE2B,EAAEN,GAAG,CAAC;YACpD,CAAC,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;KACb,CAAC,OAAM;QACN,gEAAgE;QAChE,OAAO,KAAK,CAAC;KACd;CACF"}