@expo/cli 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -0
- package/build/bin/cli +125 -0
- package/build/bin/cli.map +1 -0
- package/build/src/api/endpoint.js +17 -0
- package/build/src/api/endpoint.js.map +1 -0
- package/build/src/api/getExpoGoIntermediateCertificate.js +21 -0
- package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -0
- package/build/src/api/getExpoSchema.js +69 -0
- package/build/src/api/getExpoSchema.js.map +1 -0
- package/build/src/api/getNativeModuleVersions.js +31 -0
- package/build/src/api/getNativeModuleVersions.js.map +1 -0
- package/build/src/api/getProject.js +19 -0
- package/build/src/api/getProject.js.map +1 -0
- package/build/src/api/getProjectDevelopmentCertificate.js +24 -0
- package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -0
- package/build/src/api/getVersions.js +37 -0
- package/build/src/api/getVersions.js.map +1 -0
- package/build/src/api/graphql/client.js +104 -0
- package/build/src/api/graphql/client.js.map +1 -0
- package/build/src/api/graphql/generated.js +113 -0
- package/build/src/api/graphql/generated.js.map +1 -0
- package/build/src/api/graphql/queries/UserQuery.js +43 -0
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -0
- package/build/src/api/rest/cache/FileSystemCache.js +79 -0
- package/build/src/api/rest/cache/FileSystemCache.js.map +1 -0
- package/build/src/api/rest/cache/response.js +31 -0
- package/build/src/api/rest/cache/response.js.map +1 -0
- package/build/src/api/rest/cache/wrapFetchWithCache.js +156 -0
- package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -0
- package/build/src/api/rest/client.js +94 -0
- package/build/src/api/rest/client.js.map +1 -0
- package/build/src/api/rest/client.types.js +6 -0
- package/build/src/api/rest/client.types.js.map +1 -0
- package/build/src/api/rest/wrapFetchWithBaseUrl.js +20 -0
- package/build/src/api/rest/wrapFetchWithBaseUrl.js.map +1 -0
- package/build/src/api/rest/wrapFetchWithOffline.js +39 -0
- package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -0
- package/build/src/api/rest/wrapFetchWithProgress.js +59 -0
- package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -0
- package/build/src/api/settings.js +11 -0
- package/build/src/api/settings.js.map +1 -0
- package/build/src/api/signManifest.js +38 -0
- package/build/src/api/signManifest.js.map +1 -0
- package/build/src/api/updateDevelopmentSession.js +74 -0
- package/build/src/api/updateDevelopmentSession.js.map +1 -0
- package/build/src/api/user/UserSettings.js +71 -0
- package/build/src/api/user/UserSettings.js.map +1 -0
- package/build/src/api/user/actions.js +97 -0
- package/build/src/api/user/actions.js.map +1 -0
- package/build/src/api/user/otp.js +139 -0
- package/build/src/api/user/otp.js.map +1 -0
- package/build/src/api/user/user.js +114 -0
- package/build/src/api/user/user.js.map +1 -0
- package/build/src/config/configAsync.js +118 -0
- package/build/src/config/configAsync.js.map +1 -0
- package/build/src/config/index.js +85 -0
- package/build/src/config/index.js.map +1 -0
- package/build/src/install/checkPackages.js +74 -0
- package/build/src/install/checkPackages.js.map +1 -0
- package/build/src/install/index.js +76 -0
- package/build/src/install/index.js.map +1 -0
- package/build/src/install/installAsync.js +103 -0
- package/build/src/install/installAsync.js.map +1 -0
- package/build/src/install/resolveOptions.js +99 -0
- package/build/src/install/resolveOptions.js.map +1 -0
- package/build/src/install/utils/autoAddConfigPlugins.js +87 -0
- package/build/src/install/utils/autoAddConfigPlugins.js.map +1 -0
- package/build/src/log.js +74 -0
- package/build/src/log.js.map +1 -0
- package/build/src/login/index.js +76 -0
- package/build/src/login/index.js.map +1 -0
- package/build/src/logout/index.js +63 -0
- package/build/src/logout/index.js.map +1 -0
- package/build/src/prebuild/clearNativeFolder.js +137 -0
- package/build/src/prebuild/clearNativeFolder.js.map +1 -0
- package/build/src/prebuild/configureProjectAsync.js +68 -0
- package/build/src/prebuild/configureProjectAsync.js.map +1 -0
- package/build/src/prebuild/copyTemplateFiles.js +124 -0
- package/build/src/prebuild/copyTemplateFiles.js.map +1 -0
- package/build/src/prebuild/ensureConfigAsync.js +86 -0
- package/build/src/prebuild/ensureConfigAsync.js.map +1 -0
- package/build/src/prebuild/index.js +101 -0
- package/build/src/prebuild/index.js.map +1 -0
- package/build/src/prebuild/prebuildAsync.js +112 -0
- package/build/src/prebuild/prebuildAsync.js.map +1 -0
- package/build/src/prebuild/resolveOptions.js +97 -0
- package/build/src/prebuild/resolveOptions.js.map +1 -0
- package/build/src/prebuild/resolveTemplate.js +157 -0
- package/build/src/prebuild/resolveTemplate.js.map +1 -0
- package/build/src/prebuild/updateFromTemplate.js +102 -0
- package/build/src/prebuild/updateFromTemplate.js.map +1 -0
- package/build/src/prebuild/updatePackageJson.js +236 -0
- package/build/src/prebuild/updatePackageJson.js.map +1 -0
- package/build/src/prebuild/writeMetroConfig.js +89 -0
- package/build/src/prebuild/writeMetroConfig.js.map +1 -0
- package/build/src/register/index.js +63 -0
- package/build/src/register/index.js.map +1 -0
- package/build/src/register/registerAsync.js +37 -0
- package/build/src/register/registerAsync.js.map +1 -0
- package/build/src/start/doctor/Prerequisite.js +47 -0
- package/build/src/start/doctor/Prerequisite.js.map +1 -0
- package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js +68 -0
- package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -0
- package/build/src/start/doctor/apple/XcodePrerequisite.js +115 -0
- package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -0
- package/build/src/start/doctor/apple/XcrunPrerequisite.js +65 -0
- package/build/src/start/doctor/apple/XcrunPrerequisite.js.map +1 -0
- package/build/src/start/doctor/dependencies/bundledNativeModules.js +64 -0
- package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -0
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +131 -0
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -0
- package/build/src/start/doctor/dependencies/getMissingPackages.js +95 -0
- package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -0
- package/build/src/start/doctor/dependencies/getVersionedPackages.js +119 -0
- package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -0
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +147 -0
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -0
- package/build/src/start/doctor/ngrok/ExternalModule.js +164 -0
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -0
- package/build/src/start/doctor/ngrok/NgrokResolver.js +17 -0
- package/build/src/start/doctor/ngrok/NgrokResolver.js.map +1 -0
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +142 -0
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -0
- package/build/src/start/doctor/typescript/updateTSConfig.js +92 -0
- package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +112 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -0
- package/build/src/start/index.js +126 -0
- package/build/src/start/index.js.map +1 -0
- package/build/src/start/interface/KeyPressHandler.js +99 -0
- package/build/src/start/interface/KeyPressHandler.js.map +1 -0
- package/build/src/start/interface/commandsTable.js +175 -0
- package/build/src/start/interface/commandsTable.js.map +1 -0
- package/build/src/start/interface/interactiveActions.js +134 -0
- package/build/src/start/interface/interactiveActions.js.map +1 -0
- package/build/src/start/interface/startInterface.js +217 -0
- package/build/src/start/interface/startInterface.js.map +1 -0
- package/build/src/start/platforms/AppIdResolver.js +44 -0
- package/build/src/start/platforms/AppIdResolver.js.map +1 -0
- package/build/src/start/platforms/DeviceManager.js +43 -0
- package/build/src/start/platforms/DeviceManager.js.map +1 -0
- package/build/src/start/platforms/ExpoGoInstaller.js +108 -0
- package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -0
- package/build/src/start/platforms/PlatformManager.js +96 -0
- package/build/src/start/platforms/PlatformManager.js.map +1 -0
- package/build/src/start/platforms/android/ADBServer.js +127 -0
- package/build/src/start/platforms/android/ADBServer.js.map +1 -0
- package/build/src/start/platforms/android/AndroidAppIdResolver.js +40 -0
- package/build/src/start/platforms/android/AndroidAppIdResolver.js.map +1 -0
- package/build/src/start/platforms/android/AndroidDeviceManager.js +171 -0
- package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -0
- package/build/src/start/platforms/android/AndroidPlatformManager.js +35 -0
- package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -0
- package/build/src/start/platforms/android/activateWindow.js +78 -0
- package/build/src/start/platforms/android/activateWindow.js.map +1 -0
- package/build/src/start/platforms/android/adb.js +230 -0
- package/build/src/start/platforms/android/adb.js.map +1 -0
- package/build/src/start/platforms/android/adbReverse.js +84 -0
- package/build/src/start/platforms/android/adbReverse.js.map +1 -0
- package/build/src/start/platforms/android/emulator.js +118 -0
- package/build/src/start/platforms/android/emulator.js.map +1 -0
- package/build/src/start/platforms/android/getDevices.js +36 -0
- package/build/src/start/platforms/android/getDevices.js.map +1 -0
- package/build/src/start/platforms/android/promptAndroidDevice.js +60 -0
- package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -0
- package/build/src/start/platforms/ios/AppleAppIdResolver.js +46 -0
- package/build/src/start/platforms/ios/AppleAppIdResolver.js.map +1 -0
- package/build/src/start/platforms/ios/AppleDeviceManager.js +201 -0
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -0
- package/build/src/start/platforms/ios/ApplePlatformManager.js +31 -0
- package/build/src/start/platforms/ios/ApplePlatformManager.js.map +1 -0
- package/build/src/start/platforms/ios/assertSystemRequirements.js +16 -0
- package/build/src/start/platforms/ios/assertSystemRequirements.js.map +1 -0
- package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js +85 -0
- package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js.map +1 -0
- package/build/src/start/platforms/ios/getBestSimulator.js +101 -0
- package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -0
- package/build/src/start/platforms/ios/promptAppleDevice.js +60 -0
- package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -0
- package/build/src/start/platforms/ios/simctl.js +229 -0
- package/build/src/start/platforms/ios/simctl.js.map +1 -0
- package/build/src/start/platforms/ios/xcrun.js +67 -0
- package/build/src/start/platforms/ios/xcrun.js.map +1 -0
- package/build/src/start/project/devices.js +77 -0
- package/build/src/start/project/devices.js.map +1 -0
- package/build/src/start/project/dotExpo.js +74 -0
- package/build/src/start/project/dotExpo.js.map +1 -0
- package/build/src/start/project/settings.js +13 -0
- package/build/src/start/project/settings.js.map +1 -0
- package/build/src/start/resolveOptions.js +156 -0
- package/build/src/start/resolveOptions.js.map +1 -0
- package/build/src/start/server/AsyncNgrok.js +173 -0
- package/build/src/start/server/AsyncNgrok.js.map +1 -0
- package/build/src/start/server/BundlerDevServer.js +252 -0
- package/build/src/start/server/BundlerDevServer.js.map +1 -0
- package/build/src/start/server/DevServerManager.js +142 -0
- package/build/src/start/server/DevServerManager.js.map +1 -0
- package/build/src/start/server/DevelopmentSession.js +104 -0
- package/build/src/start/server/DevelopmentSession.js.map +1 -0
- package/build/src/start/server/UrlCreator.js +158 -0
- package/build/src/start/server/UrlCreator.js.map +1 -0
- package/build/src/start/server/metro/MetroBundlerDevServer.js +100 -0
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -0
- package/build/src/start/server/metro/MetroTerminalReporter.js +178 -0
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -0
- package/build/src/start/server/metro/TerminalReporter.js +87 -0
- package/build/src/start/server/metro/TerminalReporter.js.map +1 -0
- package/build/src/start/server/metro/TerminalReporter.types.js +6 -0
- package/build/src/start/server/metro/TerminalReporter.types.js.map +1 -0
- package/build/src/start/server/metro/instantiateMetro.js +53 -0
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -0
- package/build/src/start/server/metro/resolveFromProject.js +38 -0
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -0
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +145 -0
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +185 -0
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ExpoMiddleware.js +78 -0
- package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js +70 -0
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ManifestMiddleware.js +177 -0
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +69 -0
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/createDevServerMiddleware.js +24 -0
- package/build/src/start/server/middleware/createDevServerMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/resolveAssets.js +107 -0
- package/build/src/start/server/middleware/resolveAssets.js.map +1 -0
- package/build/src/start/server/middleware/resolveEntryPoint.js +37 -0
- package/build/src/start/server/middleware/resolveEntryPoint.js.map +1 -0
- package/build/src/start/server/middleware/resolvePlatform.js +32 -0
- package/build/src/start/server/middleware/resolvePlatform.js.map +1 -0
- package/build/src/start/server/middleware/server.types.js +6 -0
- package/build/src/start/server/middleware/server.types.js.map +1 -0
- package/build/src/start/server/openPlatforms.js +30 -0
- package/build/src/start/server/openPlatforms.js.map +1 -0
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +303 -0
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -0
- package/build/src/start/server/webpack/formatWebpackMessages.js +94 -0
- package/build/src/start/server/webpack/formatWebpackMessages.js.map +1 -0
- package/build/src/start/server/webpack/resolveFromProject.js +43 -0
- package/build/src/start/server/webpack/resolveFromProject.js.map +1 -0
- package/build/src/start/server/webpack/tls.js +72 -0
- package/build/src/start/server/webpack/tls.js.map +1 -0
- package/build/src/start/startAsync.js +150 -0
- package/build/src/start/startAsync.js.map +1 -0
- package/build/src/utils/FileNotifier.js +71 -0
- package/build/src/utils/FileNotifier.js.map +1 -0
- package/build/src/utils/analytics/getDevClientProperties.js +41 -0
- package/build/src/utils/analytics/getDevClientProperties.js.map +1 -0
- package/build/src/utils/analytics/rudderstackClient.js +106 -0
- package/build/src/utils/analytics/rudderstackClient.js.map +1 -0
- package/build/src/utils/ansi.js +17 -0
- package/build/src/utils/ansi.js.map +1 -0
- package/build/src/utils/args.js +63 -0
- package/build/src/utils/args.js.map +1 -0
- package/build/src/utils/array.js +27 -0
- package/build/src/utils/array.js.map +1 -0
- package/build/src/utils/cocoapods.js +143 -0
- package/build/src/utils/cocoapods.js.map +1 -0
- package/build/src/utils/codesigning.js +283 -0
- package/build/src/utils/codesigning.js.map +1 -0
- package/build/src/utils/createFileTransform.js +89 -0
- package/build/src/utils/createFileTransform.js.map +1 -0
- package/build/src/utils/delay.js +39 -0
- package/build/src/utils/delay.js.map +1 -0
- package/build/src/utils/dir.js +34 -0
- package/build/src/utils/dir.js.map +1 -0
- package/build/src/utils/downloadAppAsync.js +71 -0
- package/build/src/utils/downloadAppAsync.js.map +1 -0
- package/build/src/utils/downloadExpoGoAsync.js +93 -0
- package/build/src/utils/downloadExpoGoAsync.js.map +1 -0
- package/build/src/utils/editor.js +60 -0
- package/build/src/utils/editor.js.map +1 -0
- package/build/src/utils/env.js +59 -0
- package/build/src/utils/env.js.map +1 -0
- package/build/src/utils/errors.js +69 -0
- package/build/src/utils/errors.js.map +1 -0
- package/build/src/utils/exit.js +90 -0
- package/build/src/utils/exit.js.map +1 -0
- package/build/src/utils/findUp.js +33 -0
- package/build/src/utils/findUp.js.map +1 -0
- package/build/src/utils/fn.js +32 -0
- package/build/src/utils/fn.js.map +1 -0
- package/build/src/utils/getOrPromptApplicationId.js +183 -0
- package/build/src/utils/getOrPromptApplicationId.js.map +1 -0
- package/build/src/utils/getRunningProcess.js +92 -0
- package/build/src/utils/getRunningProcess.js.map +1 -0
- package/build/src/utils/git.js +88 -0
- package/build/src/utils/git.js.map +1 -0
- package/build/src/utils/glob.js +65 -0
- package/build/src/utils/glob.js.map +1 -0
- package/build/src/utils/ip.js +16 -0
- package/build/src/utils/ip.js.map +1 -0
- package/build/src/utils/isModuleSymlinked.js +37 -0
- package/build/src/utils/isModuleSymlinked.js.map +1 -0
- package/build/src/utils/link.js +31 -0
- package/build/src/utils/link.js.map +1 -0
- package/build/src/utils/mergeGitIgnorePaths.js +112 -0
- package/build/src/utils/mergeGitIgnorePaths.js.map +1 -0
- package/build/src/utils/modifyConfigAsync.js +68 -0
- package/build/src/utils/modifyConfigAsync.js.map +1 -0
- package/build/src/utils/modifyConfigPlugins.js +51 -0
- package/build/src/utils/modifyConfigPlugins.js.map +1 -0
- package/build/src/utils/nodeModules.js +118 -0
- package/build/src/utils/nodeModules.js.map +1 -0
- package/build/src/utils/npm.js +144 -0
- package/build/src/utils/npm.js.map +1 -0
- package/build/src/utils/obj.js +45 -0
- package/build/src/utils/obj.js.map +1 -0
- package/build/src/utils/ora.js +102 -0
- package/build/src/utils/ora.js.map +1 -0
- package/build/src/utils/port.js +130 -0
- package/build/src/utils/port.js.map +1 -0
- package/build/src/utils/profile.js +63 -0
- package/build/src/utils/profile.js.map +1 -0
- package/build/src/utils/progress.js +15 -0
- package/build/src/utils/progress.js.map +1 -0
- package/build/src/utils/prompts.js +127 -0
- package/build/src/utils/prompts.js.map +1 -0
- package/build/src/utils/scheme.js +106 -0
- package/build/src/utils/scheme.js.map +1 -0
- package/build/src/utils/tar.js +59 -0
- package/build/src/utils/tar.js.map +1 -0
- package/build/src/utils/url.js +67 -0
- package/build/src/utils/url.js.map +1 -0
- package/build/src/utils/validateApplicationId.js +90 -0
- package/build/src/utils/validateApplicationId.js.map +1 -0
- package/build/src/whoami/index.js +63 -0
- package/build/src/whoami/index.js.map +1 -0
- package/build/src/whoami/whoamiAsync.js +44 -0
- package/build/src/whoami/whoamiAsync.js.map +1 -0
- package/package.json +128 -4
- package/static/loading-page/index.html +270 -0
- package/index.js +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
var _assert = _interopRequireDefault(require("assert"));
|
|
6
|
+
var _chalk = _interopRequireDefault(require("chalk"));
|
|
7
|
+
var Log = _interopRequireWildcard(require("../../../log"));
|
|
8
|
+
var _errors = require("../../../utils/errors");
|
|
9
|
+
var _url = require("../../../utils/url");
|
|
10
|
+
var _deviceManager = require("../DeviceManager");
|
|
11
|
+
var _expoGoInstaller = require("../ExpoGoInstaller");
|
|
12
|
+
var _activateWindow = require("./activateWindow");
|
|
13
|
+
var AndroidDebugBridge = _interopRequireWildcard(require("./adb"));
|
|
14
|
+
var _emulator = require("./emulator");
|
|
15
|
+
var _getDevices = require("./getDevices");
|
|
16
|
+
var _promptAndroidDevice = require("./promptAndroidDevice");
|
|
17
|
+
function _interopRequireDefault(obj) {
|
|
18
|
+
return obj && obj.__esModule ? obj : {
|
|
19
|
+
default: obj
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function _interopRequireWildcard(obj) {
|
|
23
|
+
if (obj && obj.__esModule) {
|
|
24
|
+
return obj;
|
|
25
|
+
} else {
|
|
26
|
+
var newObj = {};
|
|
27
|
+
if (obj != null) {
|
|
28
|
+
for(var key in obj){
|
|
29
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
30
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
31
|
+
if (desc.get || desc.set) {
|
|
32
|
+
Object.defineProperty(newObj, key, desc);
|
|
33
|
+
} else {
|
|
34
|
+
newObj[key] = obj[key];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
newObj.default = obj;
|
|
40
|
+
return newObj;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const EXPO_GO_APPLICATION_IDENTIFIER = "host.exp.exponent";
|
|
44
|
+
class AndroidDeviceManager extends _deviceManager.DeviceManager {
|
|
45
|
+
static async resolveAsync({ device , shouldPrompt } = {}) {
|
|
46
|
+
if (device) {
|
|
47
|
+
const manager = new AndroidDeviceManager(device);
|
|
48
|
+
if (!await manager.attemptToStartAsync()) {
|
|
49
|
+
throw new _errors.AbortCommandError();
|
|
50
|
+
}
|
|
51
|
+
return manager;
|
|
52
|
+
}
|
|
53
|
+
const devices = await (0, _getDevices).getDevicesAsync();
|
|
54
|
+
const _device = shouldPrompt ? await (0, _promptAndroidDevice).promptForDeviceAsync(devices) : devices[0];
|
|
55
|
+
return AndroidDeviceManager.resolveAsync({
|
|
56
|
+
device: _device,
|
|
57
|
+
shouldPrompt: false
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
get name() {
|
|
61
|
+
// TODO: Maybe strip `_` from the device name?
|
|
62
|
+
return this.device.name;
|
|
63
|
+
}
|
|
64
|
+
get identifier() {
|
|
65
|
+
var _pid;
|
|
66
|
+
return (_pid = this.device.pid) != null ? _pid : "unknown";
|
|
67
|
+
}
|
|
68
|
+
async getAppVersionAsync(applicationId) {
|
|
69
|
+
var ref;
|
|
70
|
+
const info = await AndroidDebugBridge.getPackageInfoAsync(this.device, {
|
|
71
|
+
appId: applicationId
|
|
72
|
+
});
|
|
73
|
+
const regex = /versionName=([0-9.]+)/;
|
|
74
|
+
var ref1;
|
|
75
|
+
return (ref1 = (ref = regex.exec(info)) == null ? void 0 : ref[1]) != null ? ref1 : null;
|
|
76
|
+
}
|
|
77
|
+
async attemptToStartAsync() {
|
|
78
|
+
// TODO: Add a light-weight method for checking since a device could disconnect.
|
|
79
|
+
if (!await AndroidDebugBridge.isDeviceBootedAsync(this.device)) {
|
|
80
|
+
this.device = await (0, _emulator).startDeviceAsync(this.device);
|
|
81
|
+
}
|
|
82
|
+
if (!this.device.isAuthorized) {
|
|
83
|
+
AndroidDebugBridge.logUnauthorized(this.device);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return this.device;
|
|
87
|
+
}
|
|
88
|
+
async startAsync() {
|
|
89
|
+
const device = await this.attemptToStartAsync();
|
|
90
|
+
(0, _assert).default(device, `Failed to boot emulator.`);
|
|
91
|
+
return this.device;
|
|
92
|
+
}
|
|
93
|
+
async installAppAsync(binaryPath) {
|
|
94
|
+
await AndroidDebugBridge.installAsync(this.device, {
|
|
95
|
+
filePath: binaryPath
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async uninstallAppAsync(appId) {
|
|
99
|
+
// we need to check if the app is installed, else we might bump into "Failure [DELETE_FAILED_INTERNAL_ERROR]"
|
|
100
|
+
const isInstalled = await this.isAppInstalledAsync(appId);
|
|
101
|
+
if (!isInstalled) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
await AndroidDebugBridge.uninstallAsync(this.device, {
|
|
106
|
+
appId
|
|
107
|
+
});
|
|
108
|
+
} catch (e) {
|
|
109
|
+
Log.error(`Could not uninstall app "${appId}" from your device, please uninstall it manually and try again.`);
|
|
110
|
+
throw e;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* @param launchActivity Activity to launch `[application identifier]/.[main activity name]`, ex: `com.bacon.app/.MainActivity`
|
|
115
|
+
*/ async launchActivityAsync(launchActivity) {
|
|
116
|
+
try {
|
|
117
|
+
return await AndroidDebugBridge.launchActivityAsync(this.device, {
|
|
118
|
+
launchActivity
|
|
119
|
+
});
|
|
120
|
+
} catch (error) {
|
|
121
|
+
let errorMessage = `Couldn't open Android app with activity "${launchActivity}" on device "${this.name}".`;
|
|
122
|
+
if (error instanceof _errors.CommandError && error.code === "APP_NOT_INSTALLED") {
|
|
123
|
+
errorMessage += `\nThe app might not be installed, try installing it with: ${_chalk.default.bold(`npx expo run:android -d ${this.name}`)}`;
|
|
124
|
+
}
|
|
125
|
+
errorMessage += _chalk.default.gray(`\n${error.message}`);
|
|
126
|
+
error.message = errorMessage;
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async isAppInstalledAsync(applicationId) {
|
|
131
|
+
return await AndroidDebugBridge.isPackageInstalledAsync(this.device, applicationId);
|
|
132
|
+
}
|
|
133
|
+
async openUrlAsync(url) {
|
|
134
|
+
// Non-compliant URLs will be treated as application identifiers.
|
|
135
|
+
if (!(0, _url).validateUrl(url, {
|
|
136
|
+
requireProtocol: true
|
|
137
|
+
})) {
|
|
138
|
+
await this.launchActivityAsync(url);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const parsed = new URL(url);
|
|
142
|
+
if (parsed.protocol === "exp:") {
|
|
143
|
+
// NOTE(brentvatne): temporary workaround! launch Expo Go first, then
|
|
144
|
+
// launch the project!
|
|
145
|
+
// https://github.com/expo/expo/issues/7772
|
|
146
|
+
// adb shell monkey -p host.exp.exponent -c android.intent.category.LAUNCHER 1
|
|
147
|
+
// Note: this is not needed in Expo Development Client, it only applies to Expo Go
|
|
148
|
+
await AndroidDebugBridge.openAppIdAsync({
|
|
149
|
+
pid: this.device.pid
|
|
150
|
+
}, {
|
|
151
|
+
applicationId: EXPO_GO_APPLICATION_IDENTIFIER
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
await AndroidDebugBridge.openUrlAsync({
|
|
155
|
+
pid: this.device.pid
|
|
156
|
+
}, {
|
|
157
|
+
url
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async activateWindowAsync() {
|
|
161
|
+
// Bring the emulator window to the front on macos devices.
|
|
162
|
+
await (0, _activateWindow).activateWindowAsync(this.device);
|
|
163
|
+
}
|
|
164
|
+
async ensureExpoGoAsync(sdkVersion) {
|
|
165
|
+
const installer = new _expoGoInstaller.ExpoGoInstaller("android", EXPO_GO_APPLICATION_IDENTIFIER, sdkVersion);
|
|
166
|
+
return installer.ensureAsync(this);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.AndroidDeviceManager = AndroidDeviceManager;
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=AndroidDeviceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/platforms/android/AndroidDeviceManager.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../../log';\nimport { AbortCommandError, CommandError } from '../../../utils/errors';\nimport { validateUrl } from '../../../utils/url';\nimport { DeviceManager } from '../DeviceManager';\nimport { ExpoGoInstaller } from '../ExpoGoInstaller';\nimport { BaseResolveDeviceProps } from '../PlatformManager';\nimport { activateWindowAsync } from './activateWindow';\nimport * as AndroidDebugBridge from './adb';\nimport { startDeviceAsync } from './emulator';\nimport { getDevicesAsync } from './getDevices';\nimport { promptForDeviceAsync } from './promptAndroidDevice';\n\nconst EXPO_GO_APPLICATION_IDENTIFIER = 'host.exp.exponent';\n\nexport class AndroidDeviceManager extends DeviceManager<AndroidDebugBridge.Device> {\n static async resolveAsync({\n device,\n shouldPrompt,\n }: BaseResolveDeviceProps<AndroidDebugBridge.Device> = {}): Promise<AndroidDeviceManager> {\n if (device) {\n const manager = new AndroidDeviceManager(device);\n if (!(await manager.attemptToStartAsync())) {\n throw new AbortCommandError();\n }\n return manager;\n }\n\n const devices = await getDevicesAsync();\n const _device = shouldPrompt ? await promptForDeviceAsync(devices) : devices[0];\n return AndroidDeviceManager.resolveAsync({ device: _device, shouldPrompt: false });\n }\n\n get name() {\n // TODO: Maybe strip `_` from the device name?\n return this.device.name;\n }\n\n get identifier(): string {\n return this.device.pid ?? 'unknown';\n }\n\n async getAppVersionAsync(applicationId: string): Promise<string | null> {\n const info = await AndroidDebugBridge.getPackageInfoAsync(this.device, {\n appId: applicationId,\n });\n\n const regex = /versionName=([0-9.]+)/;\n return regex.exec(info)?.[1] ?? null;\n }\n\n protected async attemptToStartAsync(): Promise<AndroidDebugBridge.Device | null> {\n // TODO: Add a light-weight method for checking since a device could disconnect.\n if (!(await AndroidDebugBridge.isDeviceBootedAsync(this.device))) {\n this.device = await startDeviceAsync(this.device);\n }\n\n if (!this.device.isAuthorized) {\n AndroidDebugBridge.logUnauthorized(this.device);\n return null;\n }\n\n return this.device;\n }\n\n async startAsync(): Promise<AndroidDebugBridge.Device> {\n const device = await this.attemptToStartAsync();\n assert(device, `Failed to boot emulator.`);\n return this.device;\n }\n\n async installAppAsync(binaryPath: string) {\n await AndroidDebugBridge.installAsync(this.device, {\n filePath: binaryPath,\n });\n }\n\n async uninstallAppAsync(appId: string) {\n // we need to check if the app is installed, else we might bump into \"Failure [DELETE_FAILED_INTERNAL_ERROR]\"\n const isInstalled = await this.isAppInstalledAsync(appId);\n if (!isInstalled) {\n return;\n }\n\n try {\n await AndroidDebugBridge.uninstallAsync(this.device, {\n appId,\n });\n } catch (e) {\n Log.error(\n `Could not uninstall app \"${appId}\" from your device, please uninstall it manually and try again.`\n );\n throw e;\n }\n }\n\n /**\n * @param launchActivity Activity to launch `[application identifier]/.[main activity name]`, ex: `com.bacon.app/.MainActivity`\n */\n async launchActivityAsync(launchActivity: string): Promise<string> {\n try {\n return await AndroidDebugBridge.launchActivityAsync(this.device, {\n launchActivity,\n });\n } catch (error: any) {\n let errorMessage = `Couldn't open Android app with activity \"${launchActivity}\" on device \"${this.name}\".`;\n if (error instanceof CommandError && error.code === 'APP_NOT_INSTALLED') {\n errorMessage += `\\nThe app might not be installed, try installing it with: ${chalk.bold(\n `npx expo run:android -d ${this.name}`\n )}`;\n }\n errorMessage += chalk.gray(`\\n${error.message}`);\n error.message = errorMessage;\n throw error;\n }\n }\n\n async isAppInstalledAsync(applicationId: string) {\n return await AndroidDebugBridge.isPackageInstalledAsync(this.device, applicationId);\n }\n\n async openUrlAsync(url: string) {\n // Non-compliant URLs will be treated as application identifiers.\n if (!validateUrl(url, { requireProtocol: true })) {\n await this.launchActivityAsync(url);\n return;\n }\n\n const parsed = new URL(url);\n\n if (parsed.protocol === 'exp:') {\n // NOTE(brentvatne): temporary workaround! launch Expo Go first, then\n // launch the project!\n // https://github.com/expo/expo/issues/7772\n // adb shell monkey -p host.exp.exponent -c android.intent.category.LAUNCHER 1\n // Note: this is not needed in Expo Development Client, it only applies to Expo Go\n await AndroidDebugBridge.openAppIdAsync(\n { pid: this.device.pid },\n { applicationId: EXPO_GO_APPLICATION_IDENTIFIER }\n );\n }\n\n await AndroidDebugBridge.openUrlAsync({ pid: this.device.pid }, { url });\n }\n\n async activateWindowAsync() {\n // Bring the emulator window to the front on macos devices.\n await activateWindowAsync(this.device);\n }\n\n async ensureExpoGoAsync(sdkVersion?: string): Promise<boolean> {\n const installer = new ExpoGoInstaller('android', EXPO_GO_APPLICATION_IDENTIFIER, sdkVersion);\n return installer.ensureAsync(this);\n }\n}\n"],"names":["Log","AndroidDebugBridge","EXPO_GO_APPLICATION_IDENTIFIER","AndroidDeviceManager","DeviceManager","resolveAsync","device","shouldPrompt","manager","attemptToStartAsync","AbortCommandError","devices","getDevicesAsync","_device","promptForDeviceAsync","name","identifier","pid","getAppVersionAsync","applicationId","regex","info","getPackageInfoAsync","appId","exec","isDeviceBootedAsync","startDeviceAsync","isAuthorized","logUnauthorized","startAsync","assert","installAppAsync","binaryPath","installAsync","filePath","uninstallAppAsync","isInstalled","isAppInstalledAsync","uninstallAsync","e","error","launchActivityAsync","launchActivity","errorMessage","CommandError","code","chalk","bold","gray","message","isPackageInstalledAsync","openUrlAsync","url","validateUrl","requireProtocol","parsed","URL","protocol","openAppIdAsync","activateWindowAsync","ensureExpoGoAsync","sdkVersion","installer","ExpoGoInstaller","ensureAsync"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
var _platformManager = require("../PlatformManager");
|
|
6
|
+
var _androidAppIdResolver = require("./AndroidAppIdResolver");
|
|
7
|
+
var _androidDeviceManager = require("./AndroidDeviceManager");
|
|
8
|
+
var _adbReverse = require("./adbReverse");
|
|
9
|
+
class AndroidPlatformManager extends _platformManager.PlatformManager {
|
|
10
|
+
constructor(projectRoot, port, options){
|
|
11
|
+
super(projectRoot, {
|
|
12
|
+
platform: "android",
|
|
13
|
+
...options,
|
|
14
|
+
resolveDeviceAsync: _androidDeviceManager.AndroidDeviceManager.resolveAsync
|
|
15
|
+
});
|
|
16
|
+
this.projectRoot = projectRoot;
|
|
17
|
+
this.port = port;
|
|
18
|
+
}
|
|
19
|
+
async openAsync(options, resolveSettings) {
|
|
20
|
+
await (0, _adbReverse).startAdbReverseAsync([
|
|
21
|
+
this.port
|
|
22
|
+
]);
|
|
23
|
+
return super.openAsync(options, resolveSettings);
|
|
24
|
+
}
|
|
25
|
+
_getAppIdResolver() {
|
|
26
|
+
return new _androidAppIdResolver.AndroidAppIdResolver(this.projectRoot);
|
|
27
|
+
}
|
|
28
|
+
_resolveAlternativeLaunchUrl(applicationId, props) {
|
|
29
|
+
var ref;
|
|
30
|
+
return (ref = props == null ? void 0 : props.launchActivity) != null ? ref : `${applicationId}/.MainActivity`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.AndroidPlatformManager = AndroidPlatformManager;
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=AndroidPlatformManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/platforms/android/AndroidPlatformManager.ts"],"sourcesContent":["import { AppIdResolver } from '../AppIdResolver';\nimport { BaseOpenInCustomProps, BaseResolveDeviceProps, PlatformManager } from '../PlatformManager';\nimport { AndroidAppIdResolver } from './AndroidAppIdResolver';\nimport { AndroidDeviceManager } from './AndroidDeviceManager';\nimport { Device } from './adb';\nimport { startAdbReverseAsync } from './adbReverse';\n\ninterface AndroidOpenInCustomProps extends BaseOpenInCustomProps {\n launchActivity?: string;\n}\n\nexport class AndroidPlatformManager extends PlatformManager<Device, AndroidOpenInCustomProps> {\n constructor(\n protected projectRoot: string,\n protected port: number,\n options: {\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 URL. */\n getCustomRuntimeUrl: (props?: { scheme?: string }) => string | null;\n }\n ) {\n super(projectRoot, {\n platform: 'android',\n ...options,\n resolveDeviceAsync: AndroidDeviceManager.resolveAsync,\n });\n }\n\n async openAsync(\n options:\n | { runtime: 'expo' | 'web' }\n | { runtime: 'custom'; props?: Partial<AndroidOpenInCustomProps> },\n resolveSettings?: Partial<BaseResolveDeviceProps<Device>>\n ): Promise<{ url: string }> {\n await startAdbReverseAsync([this.port]);\n return super.openAsync(options, resolveSettings);\n }\n\n _getAppIdResolver(): AppIdResolver {\n return new AndroidAppIdResolver(this.projectRoot);\n }\n\n _resolveAlternativeLaunchUrl(\n applicationId: string,\n props?: Partial<AndroidOpenInCustomProps>\n ): string {\n return props?.launchActivity ?? `${applicationId}/.MainActivity`;\n }\n}\n"],"names":["AndroidPlatformManager","PlatformManager","constructor","projectRoot","port","options","platform","resolveDeviceAsync","AndroidDeviceManager","resolveAsync","openAsync","resolveSettings","startAdbReverseAsync","_getAppIdResolver","AndroidAppIdResolver","_resolveAlternativeLaunchUrl","applicationId","props","launchActivity"],"mappings":"AAAA;;;;AAC+E,IAAA,gBAAoB,WAApB,oBAAoB,CAAA;AAC9D,IAAA,qBAAwB,WAAxB,wBAAwB,CAAA;AACxB,IAAA,qBAAwB,WAAxB,wBAAwB,CAAA;AAExB,IAAA,WAAc,WAAd,cAAc,CAAA;AAM5C,MAAMA,sBAAsB,SAASC,gBAAe,gBAAA;IACzDC,YACYC,WAAmB,EACnBC,IAAY,EACtBC,OAOC,CACD;QACA,KAAK,CAACF,WAAW,EAAE;YACjBG,QAAQ,EAAE,SAAS;YACnB,GAAGD,OAAO;YACVE,kBAAkB,EAAEC,qBAAoB,qBAAA,CAACC,YAAY;SACtD,CAAC,CAAC;aAfON,WAAmB,GAAnBA,WAAmB;aACnBC,IAAY,GAAZA,IAAY;KAevB;IAED,MAAMM,SAAS,CACbL,OAEoE,EACpEM,eAAyD,EAC/B;QAC1B,MAAMC,CAAAA,GAAAA,WAAoB,AAAa,CAAA,qBAAb,CAAC;YAAC,IAAI,CAACR,IAAI;SAAC,CAAC,CAAC;QACxC,OAAO,KAAK,CAACM,SAAS,CAACL,OAAO,EAAEM,eAAe,CAAC,CAAC;KAClD;IAEDE,iBAAiB,GAAkB;QACjC,OAAO,IAAIC,qBAAoB,qBAAA,CAAC,IAAI,CAACX,WAAW,CAAC,CAAC;KACnD;IAEDY,4BAA4B,CAC1BC,aAAqB,EACrBC,KAAyC,EACjC;YACDA,GAAqB;QAA5B,OAAOA,CAAAA,GAAqB,GAArBA,KAAK,QAAgB,GAArBA,KAAAA,CAAqB,GAArBA,KAAK,CAAEC,cAAc,YAArBD,GAAqB,GAAI,CAAC,EAAED,aAAa,CAAC,cAAc,CAAC,CAAC;KAClE;CACF;QAxCYhB,sBAAsB,GAAtBA,sBAAsB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.activateWindowAsync = activateWindowAsync;
|
|
6
|
+
var osascript = _interopRequireWildcard(require("@expo/osascript"));
|
|
7
|
+
var _childProcess = require("child_process");
|
|
8
|
+
var Log = _interopRequireWildcard(require("../../../log"));
|
|
9
|
+
function _interopRequireWildcard(obj) {
|
|
10
|
+
if (obj && obj.__esModule) {
|
|
11
|
+
return obj;
|
|
12
|
+
} else {
|
|
13
|
+
var newObj = {};
|
|
14
|
+
if (obj != null) {
|
|
15
|
+
for(var key in obj){
|
|
16
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
17
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
18
|
+
if (desc.get || desc.set) {
|
|
19
|
+
Object.defineProperty(newObj, key, desc);
|
|
20
|
+
} else {
|
|
21
|
+
newObj[key] = obj[key];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
newObj.default = obj;
|
|
27
|
+
return newObj;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function getUnixPID(port) {
|
|
31
|
+
var ref;
|
|
32
|
+
// Runs like `lsof -i:8081 -P -t -sTCP:LISTEN`
|
|
33
|
+
const args = [
|
|
34
|
+
`-i:${port}`,
|
|
35
|
+
"-P",
|
|
36
|
+
"-t",
|
|
37
|
+
"-sTCP:LISTEN"
|
|
38
|
+
];
|
|
39
|
+
Log.debug("lsof " + args.join(" "));
|
|
40
|
+
return (ref = (0, _childProcess).execFileSync("lsof", args, {
|
|
41
|
+
encoding: "utf8",
|
|
42
|
+
stdio: [
|
|
43
|
+
"pipe",
|
|
44
|
+
"pipe",
|
|
45
|
+
"ignore"
|
|
46
|
+
]
|
|
47
|
+
}).split("\n")[0]) == null ? void 0 : ref.trim == null ? void 0 : ref.trim();
|
|
48
|
+
}
|
|
49
|
+
async function activateWindowAsync(device) {
|
|
50
|
+
var ref;
|
|
51
|
+
if (// only mac is supported for now.
|
|
52
|
+
process.platform !== "darwin" || // can only focus emulators
|
|
53
|
+
device.type !== "emulator") {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Google Emulator ID: `emulator-5554` -> `5554`
|
|
57
|
+
const androidPid = (ref = device.pid.match(/-(\d+)/)) == null ? void 0 : ref[1];
|
|
58
|
+
if (!androidPid) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
// Unix PID
|
|
62
|
+
const pid = getUnixPID(androidPid);
|
|
63
|
+
if (!pid) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
await osascript.execAsync(`
|
|
68
|
+
tell application "System Events"
|
|
69
|
+
set frontmost of the first process whose unix id is ${pid} to true
|
|
70
|
+
end tell`);
|
|
71
|
+
return true;
|
|
72
|
+
} catch {
|
|
73
|
+
// noop -- this feature is very specific and subject to failure.
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=activateWindow.js.map
|
|
@@ -0,0 +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 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 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","process","platform","type","androidPid","pid","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;QAW7EA,GAA2B;IAV9C,IACE,iCAAiC;IACjCC,OAAO,CAACC,QAAQ,KAAK,QAAQ,IAC7B,2BAA2B;IAC3BF,MAAM,CAACG,IAAI,KAAK,UAAU,EAC1B;QACA,OAAO,KAAK,CAAC;KACd;IAED,gDAAgD;IAChD,MAAMC,UAAU,GAAGJ,CAAAA,GAA2B,GAA3BA,MAAM,CAACK,GAAG,CAAEC,KAAK,UAAU,SAAK,GAAhCN,KAAAA,CAAgC,GAAhCA,GAA2B,AAAE,CAAC,CAAC,CAAC,AAAC;IACpD,IAAI,CAACI,UAAU,EAAE;QACf,OAAO,KAAK,CAAC;KACd;IACD,WAAW;IACX,MAAMC,GAAG,GAAGf,UAAU,CAACc,UAAU,CAAC,AAAC;IAEnC,IAAI,CAACC,GAAG,EAAE;QACR,OAAO,KAAK,CAAC;KACd;IACD,IAAI;QACF,MAAMjB,SAAS,CAACmB,SAAS,CAAC,CAAC;;0DAE2B,EAAEF,GAAG,CAAC;YACpD,CAAC,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;KACb,CAAC,OAAM;QACN,gEAAgE;QAChE,OAAO,KAAK,CAAC;KACd;CACF"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.getServer = getServer;
|
|
6
|
+
exports.logUnauthorized = logUnauthorized;
|
|
7
|
+
exports.isPackageInstalledAsync = isPackageInstalledAsync;
|
|
8
|
+
exports.launchActivityAsync = launchActivityAsync;
|
|
9
|
+
exports.openAppIdAsync = openAppIdAsync;
|
|
10
|
+
exports.openUrlAsync = openUrlAsync;
|
|
11
|
+
exports.uninstallAsync = uninstallAsync;
|
|
12
|
+
exports.getPackageInfoAsync = getPackageInfoAsync;
|
|
13
|
+
exports.installAsync = installAsync;
|
|
14
|
+
exports.adbArgs = adbArgs;
|
|
15
|
+
exports.getAttachedDevicesAsync = getAttachedDevicesAsync;
|
|
16
|
+
exports.getAdbNameForDeviceIdAsync = getAdbNameForDeviceIdAsync;
|
|
17
|
+
exports.isDeviceBootedAsync = isDeviceBootedAsync;
|
|
18
|
+
exports.isBootAnimationCompleteAsync = isBootAnimationCompleteAsync;
|
|
19
|
+
exports.getPropertyDataForDeviceAsync = getPropertyDataForDeviceAsync;
|
|
20
|
+
var _chalk = _interopRequireDefault(require("chalk"));
|
|
21
|
+
var _os = _interopRequireDefault(require("os"));
|
|
22
|
+
var Log = _interopRequireWildcard(require("../../../log"));
|
|
23
|
+
var _errors = require("../../../utils/errors");
|
|
24
|
+
var _link = require("../../../utils/link");
|
|
25
|
+
var _adbserver = require("./ADBServer");
|
|
26
|
+
function _interopRequireDefault(obj) {
|
|
27
|
+
return obj && obj.__esModule ? obj : {
|
|
28
|
+
default: obj
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function _interopRequireWildcard(obj) {
|
|
32
|
+
if (obj && obj.__esModule) {
|
|
33
|
+
return obj;
|
|
34
|
+
} else {
|
|
35
|
+
var newObj = {};
|
|
36
|
+
if (obj != null) {
|
|
37
|
+
for(var key in obj){
|
|
38
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
39
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
40
|
+
if (desc.get || desc.set) {
|
|
41
|
+
Object.defineProperty(newObj, key, desc);
|
|
42
|
+
} else {
|
|
43
|
+
newObj[key] = obj[key];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
newObj.default = obj;
|
|
49
|
+
return newObj;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const CANT_START_ACTIVITY_ERROR = "Activity not started, unable to resolve Intent";
|
|
53
|
+
let _server;
|
|
54
|
+
function getServer() {
|
|
55
|
+
_server != null ? _server : _server = new _adbserver.ADBServer();
|
|
56
|
+
return _server;
|
|
57
|
+
}
|
|
58
|
+
function logUnauthorized(device) {
|
|
59
|
+
Log.warn(`\nThis computer is not authorized for developing on ${_chalk.default.bold(device.name)}. ${_chalk.default.dim((0, _link).learnMore("https://expo.fyi/authorize-android-device"))}`);
|
|
60
|
+
}
|
|
61
|
+
async function isPackageInstalledAsync(device, androidPackage) {
|
|
62
|
+
const packages = await getServer().runAsync(adbArgs(device.pid, "shell", "pm", "list", "packages", androidPackage));
|
|
63
|
+
const lines = packages.split(/\r?\n/);
|
|
64
|
+
for(let i = 0; i < lines.length; i++){
|
|
65
|
+
const line = lines[i].trim();
|
|
66
|
+
if (line === `package:${androidPackage}`) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
async function launchActivityAsync(device, { launchActivity }) {
|
|
73
|
+
return openAsync(adbArgs(device.pid, "shell", "am", "start", "-a", "android.intent.action.RUN", // FLAG_ACTIVITY_SINGLE_TOP -- If set, the activity will not be launched if it is already running at the top of the history stack.
|
|
74
|
+
"-f", "0x20000000", // Activity to open first: com.bacon.app/.MainActivity
|
|
75
|
+
"-n", launchActivity));
|
|
76
|
+
}
|
|
77
|
+
async function openAppIdAsync(device, { applicationId }) {
|
|
78
|
+
return openAsync(adbArgs(device.pid, "shell", "monkey", "-p", applicationId, "-c", "android.intent.category.LAUNCHER", "1"));
|
|
79
|
+
}
|
|
80
|
+
async function openUrlAsync(device, { url }) {
|
|
81
|
+
return openAsync(adbArgs(device.pid, "shell", "am", "start", "-a", "android.intent.action.VIEW", "-d", url));
|
|
82
|
+
}
|
|
83
|
+
/** Runs a generic command watches for common errors in order to throw with an expected code. */ async function openAsync(args) {
|
|
84
|
+
const results = await getServer().runAsync(args);
|
|
85
|
+
if (results.includes(CANT_START_ACTIVITY_ERROR) || results.match(/Error: Activity class .* does not exist\./g)) {
|
|
86
|
+
throw new _errors.CommandError("APP_NOT_INSTALLED", results.substring(results.indexOf("Error: ")));
|
|
87
|
+
}
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
async function uninstallAsync(device, { appId }) {
|
|
91
|
+
return await getServer().runAsync(adbArgs(device.pid, "uninstall", appId));
|
|
92
|
+
}
|
|
93
|
+
async function getPackageInfoAsync(device, { appId }) {
|
|
94
|
+
return await getServer().runAsync(adbArgs(device.pid, "shell", "dumpsys", "package", appId));
|
|
95
|
+
}
|
|
96
|
+
async function installAsync(device, { filePath }) {
|
|
97
|
+
// TODO: Handle the `INSTALL_FAILED_INSUFFICIENT_STORAGE` error.
|
|
98
|
+
return await getServer().runAsync(adbArgs(device.pid, "install", "-r", "-d", filePath));
|
|
99
|
+
}
|
|
100
|
+
function adbArgs(pid, ...options) {
|
|
101
|
+
const args = [];
|
|
102
|
+
if (pid) {
|
|
103
|
+
args.push("-s", pid);
|
|
104
|
+
}
|
|
105
|
+
return args.concat(options);
|
|
106
|
+
}
|
|
107
|
+
async function getAttachedDevicesAsync() {
|
|
108
|
+
const output = await getServer().runAsync([
|
|
109
|
+
"devices",
|
|
110
|
+
"-l"
|
|
111
|
+
]);
|
|
112
|
+
const splitItems = output.trim().replace(/\n$/, "").split(_os.default.EOL);
|
|
113
|
+
// First line is `"List of devices attached"`, remove it
|
|
114
|
+
// @ts-ignore: todo
|
|
115
|
+
const attachedDevices = splitItems.slice(1, splitItems.length).map((line)=>{
|
|
116
|
+
// unauthorized: ['FA8251A00719', 'unauthorized', 'usb:338690048X', 'transport_id:5']
|
|
117
|
+
// authorized: ['FA8251A00719', 'device', 'usb:336592896X', 'product:walleye', 'model:Pixel_2', 'device:walleye', 'transport_id:4']
|
|
118
|
+
// emulator: ['emulator-5554', 'offline', 'transport_id:1']
|
|
119
|
+
const props = line.split(" ").filter(Boolean);
|
|
120
|
+
const isAuthorized = props[1] !== "unauthorized";
|
|
121
|
+
const type = line.includes("emulator") ? "emulator" : "device";
|
|
122
|
+
return {
|
|
123
|
+
props,
|
|
124
|
+
type,
|
|
125
|
+
isAuthorized
|
|
126
|
+
};
|
|
127
|
+
}).filter(({ props: [pid] })=>!!pid
|
|
128
|
+
);
|
|
129
|
+
const devicePromises = attachedDevices.map(async (props)=>{
|
|
130
|
+
const { type , props: [pid, ...deviceInfo] , isAuthorized , } = props;
|
|
131
|
+
let name = null;
|
|
132
|
+
if (type === "device") {
|
|
133
|
+
if (isAuthorized) {
|
|
134
|
+
// Possibly formatted like `model:Pixel_2`
|
|
135
|
+
// Transform to `Pixel_2`
|
|
136
|
+
const modelItem = deviceInfo.find((info)=>info.includes("model:")
|
|
137
|
+
);
|
|
138
|
+
if (modelItem) {
|
|
139
|
+
name = modelItem.replace("model:", "");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// unauthorized devices don't have a name available to read
|
|
143
|
+
if (!name) {
|
|
144
|
+
// Device FA8251A00719
|
|
145
|
+
name = `Device ${pid}`;
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
var ref;
|
|
149
|
+
// Given an emulator pid, get the emulator name which can be used to start the emulator later.
|
|
150
|
+
name = (ref = await getAdbNameForDeviceIdAsync({
|
|
151
|
+
pid
|
|
152
|
+
})) != null ? ref : "";
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
pid,
|
|
156
|
+
name,
|
|
157
|
+
type,
|
|
158
|
+
isAuthorized,
|
|
159
|
+
isBooted: true
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
return Promise.all(devicePromises);
|
|
163
|
+
}
|
|
164
|
+
async function getAdbNameForDeviceIdAsync(device) {
|
|
165
|
+
const results = await getServer().runAsync(adbArgs(device.pid, "emu", "avd", "name"));
|
|
166
|
+
if (results.match(/could not connect to TCP port .*: Connection refused/)) {
|
|
167
|
+
// Can also occur when the emulator does not exist.
|
|
168
|
+
throw new _errors.CommandError("EMULATOR_NOT_FOUND", results);
|
|
169
|
+
}
|
|
170
|
+
var ref;
|
|
171
|
+
return (ref = results.trim().split(/\r?\n/).shift()) != null ? ref : null;
|
|
172
|
+
}
|
|
173
|
+
async function isDeviceBootedAsync({ name } = {}) {
|
|
174
|
+
const devices = await getAttachedDevicesAsync();
|
|
175
|
+
if (!name) {
|
|
176
|
+
var ref;
|
|
177
|
+
return (ref = devices[0]) != null ? ref : null;
|
|
178
|
+
}
|
|
179
|
+
var ref1;
|
|
180
|
+
return (ref1 = devices.find((device)=>device.name === name
|
|
181
|
+
)) != null ? ref1 : null;
|
|
182
|
+
}
|
|
183
|
+
// Can sometimes be null
|
|
184
|
+
// http://developer.android.com/ndk/guides/abis.html
|
|
185
|
+
const PROP_BOOT_ANIMATION_STATE = "init.svc.bootanim";
|
|
186
|
+
async function isBootAnimationCompleteAsync(pid) {
|
|
187
|
+
try {
|
|
188
|
+
const props = await getPropertyDataForDeviceAsync({
|
|
189
|
+
pid
|
|
190
|
+
}, PROP_BOOT_ANIMATION_STATE);
|
|
191
|
+
return !!props[PROP_BOOT_ANIMATION_STATE].match(/stopped/);
|
|
192
|
+
} catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async function getPropertyDataForDeviceAsync(device, prop) {
|
|
197
|
+
// @ts-ignore
|
|
198
|
+
const propCommand = adbArgs(...[
|
|
199
|
+
device.pid,
|
|
200
|
+
"shell",
|
|
201
|
+
"getprop",
|
|
202
|
+
prop
|
|
203
|
+
].filter(Boolean));
|
|
204
|
+
try {
|
|
205
|
+
// Prevent reading as UTF8.
|
|
206
|
+
const results = await getServer().getFileOutputAsync(propCommand);
|
|
207
|
+
// Like:
|
|
208
|
+
// [wifi.direct.interface]: [p2p-dev-wlan0]
|
|
209
|
+
// [wifi.interface]: [wlan0]
|
|
210
|
+
if (prop) {
|
|
211
|
+
return {
|
|
212
|
+
[prop]: results
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return parseAdbDeviceProperties(results);
|
|
216
|
+
} catch (error) {
|
|
217
|
+
// TODO: Ensure error has message and not stderr
|
|
218
|
+
throw new _errors.CommandError(`Failed to get properties for device (${device.pid}): ${error.message}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function parseAdbDeviceProperties(devicePropertiesString) {
|
|
222
|
+
const properties = {};
|
|
223
|
+
const propertyExp = /\[(.*?)\]: \[(.*?)\]/gm;
|
|
224
|
+
for (const match of devicePropertiesString.matchAll(propertyExp)){
|
|
225
|
+
properties[match[1]] = match[2];
|
|
226
|
+
}
|
|
227
|
+
return properties;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
//# sourceMappingURL=adb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/platforms/android/adb.ts"],"sourcesContent":["import chalk from 'chalk';\nimport os from 'os';\n\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { learnMore } from '../../../utils/link';\nimport { ADBServer } from './ADBServer';\n\n/** Represents a connected Android device. */\nexport type Device = {\n /** Process ID. */\n pid?: string;\n /** Name of the device, also used as the ID for opening devices. */\n name: string;\n /** Is emulator or connected device. */\n type: 'emulator' | 'device';\n /** Is the device booted (emulator). */\n isBooted: boolean;\n /** Is device authorized for developing. https://expo.fyi/authorize-android-device */\n isAuthorized: boolean;\n};\n\ntype DeviceContext = Pick<Device, 'pid'>;\n\ntype DeviceProperties = Record<string, string>;\n\nconst CANT_START_ACTIVITY_ERROR = 'Activity not started, unable to resolve Intent';\n\nlet _server: ADBServer | null;\n\n/** Return the lazily loaded ADB server instance. */\nexport function getServer() {\n _server ??= new ADBServer();\n return _server;\n}\n\n/** Logs an FYI message about authorizing your device. */\nexport function logUnauthorized(device: Device) {\n Log.warn(\n `\\nThis computer is not authorized for developing on ${chalk.bold(device.name)}. ${chalk.dim(\n learnMore('https://expo.fyi/authorize-android-device')\n )}`\n );\n}\n\n/** Returns true if the provided package name is installed on the provided Android device. */\nexport async function isPackageInstalledAsync(\n device: DeviceContext,\n androidPackage: string\n): Promise<boolean> {\n const packages = await getServer().runAsync(\n adbArgs(device.pid, 'shell', 'pm', 'list', 'packages', androidPackage)\n );\n\n const lines = packages.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === `package:${androidPackage}`) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @param device.pid Process ID of the Android device to launch.\n * @param props.launchActivity Activity to launch `[application identifier]/.[main activity name]`, ex: `com.bacon.app/.MainActivity`\n */\nexport async function launchActivityAsync(\n device: DeviceContext,\n {\n launchActivity,\n }: {\n launchActivity: string;\n }\n) {\n return openAsync(\n adbArgs(\n device.pid,\n 'shell',\n 'am',\n 'start',\n '-a',\n 'android.intent.action.RUN',\n // FLAG_ACTIVITY_SINGLE_TOP -- If set, the activity will not be launched if it is already running at the top of the history stack.\n '-f',\n '0x20000000',\n // Activity to open first: com.bacon.app/.MainActivity\n '-n',\n launchActivity\n )\n );\n}\n\n/**\n * @param device.pid Process ID of the Android device to launch.\n * @param props.applicationId package name to launch.\n */\nexport async function openAppIdAsync(\n device: DeviceContext,\n {\n applicationId,\n }: {\n applicationId: string;\n }\n) {\n return openAsync(\n adbArgs(\n device.pid,\n 'shell',\n 'monkey',\n '-p',\n applicationId,\n '-c',\n 'android.intent.category.LAUNCHER',\n '1'\n )\n );\n}\n\n/**\n * @param device.pid Process ID of the Android device to launch.\n * @param props.url URL to launch.\n */\nexport async function openUrlAsync(\n device: DeviceContext,\n {\n url,\n }: {\n url: string;\n }\n) {\n return openAsync(\n adbArgs(device.pid, 'shell', 'am', 'start', '-a', 'android.intent.action.VIEW', '-d', url)\n );\n}\n\n/** Runs a generic command watches for common errors in order to throw with an expected code. */\nasync function openAsync(args: string[]): Promise<string> {\n const results = await getServer().runAsync(args);\n if (\n results.includes(CANT_START_ACTIVITY_ERROR) ||\n results.match(/Error: Activity class .* does not exist\\./g)\n ) {\n throw new CommandError('APP_NOT_INSTALLED', results.substring(results.indexOf('Error: ')));\n }\n return results;\n}\n\n/** Uninstall an app given its Android package name. */\nexport async function uninstallAsync(\n device: DeviceContext,\n { appId }: { appId: string }\n): Promise<string> {\n return await getServer().runAsync(adbArgs(device.pid, 'uninstall', appId));\n}\n\n/** Get package info from an app based on its Android package name. */\nexport async function getPackageInfoAsync(\n device: DeviceContext,\n { appId }: { appId: string }\n): Promise<string> {\n return await getServer().runAsync(adbArgs(device.pid, 'shell', 'dumpsys', 'package', appId));\n}\n\n/** Install an app on a connected device. */\nexport async function installAsync(device: DeviceContext, { filePath }: { filePath: string }) {\n // TODO: Handle the `INSTALL_FAILED_INSUFFICIENT_STORAGE` error.\n return await getServer().runAsync(adbArgs(device.pid, 'install', '-r', '-d', filePath));\n}\n\n/** Format ADB args with process ID. */\nexport function adbArgs(pid: Device['pid'], ...options: string[]): string[] {\n const args = [];\n if (pid) {\n args.push('-s', pid);\n }\n return args.concat(options);\n}\n\n// TODO: This is very expensive for some operations.\nexport async function getAttachedDevicesAsync(): Promise<Device[]> {\n const output = await getServer().runAsync(['devices', '-l']);\n\n const splitItems = output.trim().replace(/\\n$/, '').split(os.EOL);\n // First line is `\"List of devices attached\"`, remove it\n // @ts-ignore: todo\n const attachedDevices: {\n props: string[];\n type: Device['type'];\n isAuthorized: Device['isAuthorized'];\n }[] = splitItems\n .slice(1, splitItems.length)\n .map((line) => {\n // unauthorized: ['FA8251A00719', 'unauthorized', 'usb:338690048X', 'transport_id:5']\n // authorized: ['FA8251A00719', 'device', 'usb:336592896X', 'product:walleye', 'model:Pixel_2', 'device:walleye', 'transport_id:4']\n // emulator: ['emulator-5554', 'offline', 'transport_id:1']\n const props = line.split(' ').filter(Boolean);\n\n const isAuthorized = props[1] !== 'unauthorized';\n const type = line.includes('emulator') ? 'emulator' : 'device';\n return { props, type, isAuthorized };\n })\n .filter(({ props: [pid] }) => !!pid);\n\n const devicePromises = attachedDevices.map<Promise<Device>>(async (props) => {\n const {\n type,\n props: [pid, ...deviceInfo],\n isAuthorized,\n } = props;\n\n let name: string | null = null;\n\n if (type === 'device') {\n if (isAuthorized) {\n // Possibly formatted like `model:Pixel_2`\n // Transform to `Pixel_2`\n const modelItem = deviceInfo.find((info) => info.includes('model:'));\n if (modelItem) {\n name = modelItem.replace('model:', '');\n }\n }\n // unauthorized devices don't have a name available to read\n if (!name) {\n // Device FA8251A00719\n name = `Device ${pid}`;\n }\n } else {\n // Given an emulator pid, get the emulator name which can be used to start the emulator later.\n name = (await getAdbNameForDeviceIdAsync({ pid })) ?? '';\n }\n\n return {\n pid,\n name,\n type,\n isAuthorized,\n isBooted: true,\n };\n });\n\n return Promise.all(devicePromises);\n}\n\n/**\n * Return the Emulator name for an emulator ID, this can be used to determine if an emulator is booted.\n *\n * @param device.pid a value like `emulator-5554` from `abd devices`\n */\nexport async function getAdbNameForDeviceIdAsync(device: DeviceContext): Promise<string | null> {\n const results = await getServer().runAsync(adbArgs(device.pid, 'emu', 'avd', 'name'));\n\n if (results.match(/could not connect to TCP port .*: Connection refused/)) {\n // Can also occur when the emulator does not exist.\n throw new CommandError('EMULATOR_NOT_FOUND', results);\n }\n\n return results.trim().split(/\\r?\\n/).shift() ?? null;\n}\n\nexport async function isDeviceBootedAsync({\n name,\n}: { name?: string } = {}): Promise<Device | null> {\n const devices = await getAttachedDevicesAsync();\n\n if (!name) {\n return devices[0] ?? null;\n }\n\n return devices.find((device) => device.name === name) ?? null;\n}\n\n// Can sometimes be null\n// http://developer.android.com/ndk/guides/abis.html\nconst PROP_BOOT_ANIMATION_STATE = 'init.svc.bootanim';\n\n/**\n * Returns true when a device's splash screen animation has stopped.\n * This can be used to detect when a device is fully booted and ready to use.\n *\n * @param pid\n */\nexport async function isBootAnimationCompleteAsync(pid?: string): Promise<boolean> {\n try {\n const props = await getPropertyDataForDeviceAsync({ pid }, PROP_BOOT_ANIMATION_STATE);\n return !!props[PROP_BOOT_ANIMATION_STATE].match(/stopped/);\n } catch {\n return false;\n }\n}\n\nexport async function getPropertyDataForDeviceAsync(\n device: DeviceContext,\n prop?: string\n): Promise<DeviceProperties> {\n // @ts-ignore\n const propCommand = adbArgs(...[device.pid, 'shell', 'getprop', prop].filter(Boolean));\n try {\n // Prevent reading as UTF8.\n const results = await getServer().getFileOutputAsync(propCommand);\n // Like:\n // [wifi.direct.interface]: [p2p-dev-wlan0]\n // [wifi.interface]: [wlan0]\n\n if (prop) {\n return {\n [prop]: results,\n };\n }\n return parseAdbDeviceProperties(results);\n } catch (error: any) {\n // TODO: Ensure error has message and not stderr\n throw new CommandError(`Failed to get properties for device (${device.pid}): ${error.message}`);\n }\n}\n\nfunction parseAdbDeviceProperties(devicePropertiesString: string) {\n const properties: DeviceProperties = {};\n const propertyExp = /\\[(.*?)\\]: \\[(.*?)\\]/gm;\n for (const match of devicePropertiesString.matchAll(propertyExp)) {\n properties[match[1]] = match[2];\n }\n return properties;\n}\n"],"names":["getServer","logUnauthorized","isPackageInstalledAsync","launchActivityAsync","openAppIdAsync","openUrlAsync","uninstallAsync","getPackageInfoAsync","installAsync","adbArgs","getAttachedDevicesAsync","getAdbNameForDeviceIdAsync","isDeviceBootedAsync","isBootAnimationCompleteAsync","getPropertyDataForDeviceAsync","Log","CANT_START_ACTIVITY_ERROR","_server","ADBServer","device","warn","chalk","bold","name","dim","learnMore","androidPackage","packages","runAsync","pid","lines","split","i","length","line","trim","launchActivity","openAsync","applicationId","url","args","results","includes","match","CommandError","substring","indexOf","appId","filePath","options","push","concat","output","splitItems","replace","os","EOL","attachedDevices","slice","map","props","filter","Boolean","isAuthorized","type","devicePromises","deviceInfo","modelItem","find","info","isBooted","Promise","all","shift","devices","PROP_BOOT_ANIMATION_STATE","prop","propCommand","getFileOutputAsync","parseAdbDeviceProperties","error","message","devicePropertiesString","properties","propertyExp","matchAll"],"mappings":"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"}
|