UNPKG

@expo/cli

Version:
278 lines (277 loc) 10.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { ensureSimulatorOpenAsync: ()=>ensureSimulatorOpenAsync, AppleDeviceManager: ()=>AppleDeviceManager }); function _osascript() { const data = /*#__PURE__*/ _interopRequireWildcard(require("@expo/osascript")); _osascript = function() { return data; }; return data; } function _assert() { const data = /*#__PURE__*/ _interopRequireDefault(require("assert")); _assert = function() { return data; }; return data; } function _chalk() { const data = /*#__PURE__*/ _interopRequireDefault(require("chalk")); _chalk = function() { return data; }; return data; } function _fs() { const data = /*#__PURE__*/ _interopRequireDefault(require("fs")); _fs = function() { return data; }; return data; } function _path() { const data = /*#__PURE__*/ _interopRequireDefault(require("path")); _path = function() { return data; }; return data; } const _assertSystemRequirements = require("./assertSystemRequirements"); const _ensureSimulatorAppRunning = require("./ensureSimulatorAppRunning"); const _getBestSimulator = require("./getBestSimulator"); const _promptAppleDevice = require("./promptAppleDevice"); const _simctl = /*#__PURE__*/ _interopRequireWildcard(require("./simctl")); const _delay = require("../../../utils/delay"); const _errors = require("../../../utils/errors"); const _plist = require("../../../utils/plist"); const _url = require("../../../utils/url"); const _deviceManager = require("../DeviceManager"); const _expoGoInstaller = require("../ExpoGoInstaller"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const debug = require("debug")("expo:start:platforms:ios:AppleDeviceManager"); const EXPO_GO_BUNDLE_IDENTIFIER = "host.exp.Exponent"; async function ensureSimulatorOpenAsync({ udid , osType } = {}, tryAgain = true) { // Use a default simulator if none was specified if (!udid) { // If a simulator is open, side step the entire booting sequence. const simulatorOpenedByApp = await (0, _getBestSimulator.getBestBootedSimulatorAsync)({ osType }); if (simulatorOpenedByApp) { return simulatorOpenedByApp; } // Otherwise, find the best possible simulator from user defaults and continue const bestUdid = await (0, _getBestSimulator.getBestUnbootedSimulatorAsync)({ osType }); if (!bestUdid) { throw new _errors.CommandError("No simulators found."); } udid = bestUdid; } const bootedDevice = await (0, _delay.waitForActionAsync)({ action: ()=>{ // Just for the type check. (0, _assert().default)(udid); return _simctl.bootAsync({ udid }); } }); if (!bootedDevice) { // Give it a second chance, this might not be needed but it could potentially lead to a better UX on slower devices. if (tryAgain) { return await ensureSimulatorOpenAsync({ udid, osType }, false); } // TODO: We should eliminate all needs for a timeout error, it's bad UX to get an error about the simulator not starting while the user can clearly see it starting on their slow computer. throw new _errors.CommandError("SIMULATOR_TIMEOUT", `Simulator didn't boot fast enough. Try opening Simulator first, then running your app.`); } return bootedDevice; } class AppleDeviceManager extends _deviceManager.DeviceManager { static assertSystemRequirementsAsync = _assertSystemRequirements.assertSystemRequirementsAsync; static async resolveAsync({ device , shouldPrompt } = {}) { if (shouldPrompt) { const devices = await (0, _getBestSimulator.getSelectableSimulatorsAsync)(device); device = await (0, _promptAppleDevice.promptAppleDeviceAsync)(devices, device == null ? void 0 : device.osType); } const booted = await ensureSimulatorOpenAsync(device); return new AppleDeviceManager(booted); } get name() { return this.device.name; } get identifier() { return this.device.udid; } async getAppVersionAsync(appId, { containerPath } = {}) { return await _simctl.getInfoPlistValueAsync(this.device, { appId, key: "CFBundleShortVersionString", containerPath }); } async startAsync() { return ensureSimulatorOpenAsync({ osType: this.device.osType, udid: this.device.udid }); } async launchApplicationIdAsync(appId) { try { const result = await _simctl.openAppIdAsync(this.device, { appId }); if (result.status === 0) { await this.activateWindowAsync(); } else { throw new _errors.CommandError(result.stderr); } } catch (error) { let errorMessage = `Couldn't open iOS app with ID "${appId}" on device "${this.name}".`; if (error instanceof _errors.CommandError && error.code === "APP_NOT_INSTALLED") { if (appId === EXPO_GO_BUNDLE_IDENTIFIER) { errorMessage = `Couldn't open Expo Go app on device "${this.name}". Please install.`; } else { errorMessage += `\nThe app might not be installed, try installing it with: ${_chalk().default.bold(`npx expo run:ios -d ${this.device.udid}`)}`; } } if (error.stderr) { errorMessage += _chalk().default.gray(`\n${error.stderr}`); } else if (error.message) { errorMessage += _chalk().default.gray(`\n${error.message}`); } throw new _errors.CommandError(errorMessage); } } async installAppAsync(filePath) { await _simctl.installAsync(this.device, { filePath }); await this.waitForAppInstalledAsync(await this.getApplicationIdFromBundle(filePath)); } async getApplicationIdFromBundle(filePath) { debug("getApplicationIdFromBundle:", filePath); const builtInfoPlistPath = _path().default.join(filePath, "Info.plist"); if (_fs().default.existsSync(builtInfoPlistPath)) { const { CFBundleIdentifier } = await (0, _plist.parsePlistAsync)(builtInfoPlistPath); debug("getApplicationIdFromBundle: using built Info.plist", CFBundleIdentifier); return CFBundleIdentifier; } debug("getApplicationIdFromBundle: no Info.plist found"); return EXPO_GO_BUNDLE_IDENTIFIER; } async waitForAppInstalledAsync(applicationId) { while(true){ if (await this.isAppInstalledAndIfSoReturnContainerPathForIOSAsync(applicationId)) { return true; } await (0, _delay.delayAsync)(100); } } async uninstallAppAsync(appId) { await _simctl.uninstallAsync(this.device, { appId }); } async isAppInstalledAndIfSoReturnContainerPathForIOSAsync(appId) { var ref; return (ref = await _simctl.getContainerPathAsync(this.device, { appId })) != null ? ref : false; } async openUrlAsync(url, options = {}) { // Non-compliant URLs will be treated as application identifiers. if (!(0, _url.validateUrl)(url, { requireProtocol: true })) { return await this.launchApplicationIdAsync(url); } try { await _simctl.openUrlAsync(this.device, { url, appId: options.appId }); } catch (error) { // 194 means the device does not conform to a given URL, in this case we'll assume that the desired app is not installed. if (error.status === 194) { // An error was encountered processing the command (domain=NSOSStatusErrorDomain, code=-10814): // The operation couldn’t be completed. (OSStatus error -10814.) // // This can be thrown when no app conforms to the URI scheme that we attempted to open. throw new _errors.CommandError("APP_NOT_INSTALLED", `Device ${this.device.name} (${this.device.udid}) has no app to handle the URI: ${url}`); } throw error; } } async activateWindowAsync() { await (0, _ensureSimulatorAppRunning.ensureSimulatorAppRunningAsync)(this.device); // TODO: Focus the individual window await _osascript().execAsync(`tell application "Simulator" to activate`); } getExpoGoAppId() { return EXPO_GO_BUNDLE_IDENTIFIER; } async ensureExpoGoAsync(sdkVersion) { const installer = new _expoGoInstaller.ExpoGoInstaller("ios", EXPO_GO_BUNDLE_IDENTIFIER, sdkVersion); return installer.ensureAsync(this); } } //# sourceMappingURL=AppleDeviceManager.js.map