@expo/cli 0.18.1 → 0.18.3

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/build/bin/cli CHANGED
@@ -120,7 +120,7 @@ const args = (0, _arg().default)({
120
120
  });
121
121
  if (args["--version"]) {
122
122
  // Version is added in the build script.
123
- console.log("0.18.1");
123
+ console.log("0.18.3");
124
124
  process.exit(0);
125
125
  }
126
126
  if (args["--non-interactive"]) {
@@ -21,9 +21,9 @@ const lintAsync = async (projectRoot)=>{
21
21
  }
22
22
  const manager = (0, _packageManager().createForProject)(projectRoot);
23
23
  try {
24
- await manager.runAsync([
25
- "run",
26
- "lint"
24
+ await manager.runBinAsync([
25
+ "eslint",
26
+ "."
27
27
  ]);
28
28
  } catch (error) {
29
29
  process.exit(error.status);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lint/lintAsync.ts"],"sourcesContent":["import { createForProject } from '@expo/package-manager';\n\nimport { ESLintProjectPrerequisite } from './ESlintPrerequisite';\n\nexport const lintAsync = async (projectRoot: string) => {\n const prerequisite = new ESLintProjectPrerequisite(projectRoot);\n if (!(await prerequisite.assertAsync())) {\n await prerequisite.bootstrapAsync();\n }\n\n const manager = createForProject(projectRoot);\n try {\n await manager.runAsync(['run', 'lint']);\n } catch (error: any) {\n process.exit(error.status);\n }\n};\n"],"names":["lintAsync","projectRoot","prerequisite","ESLintProjectPrerequisite","assertAsync","bootstrapAsync","manager","createForProject","runAsync","error","process","exit","status"],"mappings":"AAAA;;;;+BAIaA,WAAS;;aAATA,SAAS;;;yBAJW,uBAAuB;;;;;;oCAEd,sBAAsB;AAEzD,MAAMA,SAAS,GAAG,OAAOC,WAAmB,GAAK;IACtD,MAAMC,YAAY,GAAG,IAAIC,mBAAyB,0BAAA,CAACF,WAAW,CAAC,AAAC;IAChE,IAAI,CAAE,MAAMC,YAAY,CAACE,WAAW,EAAE,AAAC,EAAE;QACvC,MAAMF,YAAY,CAACG,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,MAAMC,OAAO,GAAGC,IAAAA,eAAgB,EAAA,iBAAA,EAACN,WAAW,CAAC,AAAC;IAC9C,IAAI;QACF,MAAMK,OAAO,CAACE,QAAQ,CAAC;YAAC,KAAK;YAAE,MAAM;SAAC,CAAC,CAAC;IAC1C,EAAE,OAAOC,KAAK,EAAO;QACnBC,OAAO,CAACC,IAAI,CAACF,KAAK,CAACG,MAAM,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,AAAC"}
1
+ {"version":3,"sources":["../../../src/lint/lintAsync.ts"],"sourcesContent":["import { createForProject } from '@expo/package-manager';\n\nimport { ESLintProjectPrerequisite } from './ESlintPrerequisite';\n\nexport const lintAsync = async (projectRoot: string) => {\n const prerequisite = new ESLintProjectPrerequisite(projectRoot);\n if (!(await prerequisite.assertAsync())) {\n await prerequisite.bootstrapAsync();\n }\n\n const manager = createForProject(projectRoot);\n try {\n await manager.runBinAsync(['eslint', '.']);\n } catch (error: any) {\n process.exit(error.status);\n }\n};\n"],"names":["lintAsync","projectRoot","prerequisite","ESLintProjectPrerequisite","assertAsync","bootstrapAsync","manager","createForProject","runBinAsync","error","process","exit","status"],"mappings":"AAAA;;;;+BAIaA,WAAS;;aAATA,SAAS;;;yBAJW,uBAAuB;;;;;;oCAEd,sBAAsB;AAEzD,MAAMA,SAAS,GAAG,OAAOC,WAAmB,GAAK;IACtD,MAAMC,YAAY,GAAG,IAAIC,mBAAyB,0BAAA,CAACF,WAAW,CAAC,AAAC;IAChE,IAAI,CAAE,MAAMC,YAAY,CAACE,WAAW,EAAE,AAAC,EAAE;QACvC,MAAMF,YAAY,CAACG,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,MAAMC,OAAO,GAAGC,IAAAA,eAAgB,EAAA,iBAAA,EAACN,WAAW,CAAC,AAAC;IAC9C,IAAI;QACF,MAAMK,OAAO,CAACE,WAAW,CAAC;YAAC,QAAQ;YAAE,GAAG;SAAC,CAAC,CAAC;IAC7C,EAAE,OAAOC,KAAK,EAAO;QACnBC,OAAO,CAACC,IAAI,CAACF,KAAK,CAACG,MAAM,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,AAAC"}
@@ -10,8 +10,7 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  getConnectedDevicesAsync: ()=>getConnectedDevicesAsync,
13
- runOnDevice: ()=>runOnDevice,
14
- launchAppWithDeviceCtl: ()=>launchAppWithDeviceCtl
13
+ runOnDevice: ()=>runOnDevice
15
14
  });
16
15
  function _debug() {
17
16
  const data = /*#__PURE__*/ _interopRequireDefault(require("debug"));
@@ -40,17 +39,85 @@ const _usbmuxdClient = require("./client/UsbmuxdClient");
40
39
  const _afcprotocol = require("./protocol/AFCProtocol");
41
40
  const _log = require("../../../log");
42
41
  const _xcodeDeveloperDiskImagePrerequisite = require("../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite");
43
- const _xcrun = require("../../../start/platforms/ios/xcrun");
42
+ const _devicectl = /*#__PURE__*/ _interopRequireWildcard(require("../../../start/platforms/ios/devicectl"));
43
+ const _array = require("../../../utils/array");
44
44
  const _delay = require("../../../utils/delay");
45
45
  const _errors = require("../../../utils/errors");
46
46
  const _exit = require("../../../utils/exit");
47
+ const _profile = require("../../../utils/profile");
47
48
  function _interopRequireDefault(obj) {
48
49
  return obj && obj.__esModule ? obj : {
49
50
  default: obj
50
51
  };
51
52
  }
53
+ function _getRequireWildcardCache(nodeInterop) {
54
+ if (typeof WeakMap !== "function") return null;
55
+ var cacheBabelInterop = new WeakMap();
56
+ var cacheNodeInterop = new WeakMap();
57
+ return (_getRequireWildcardCache = function(nodeInterop) {
58
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
59
+ })(nodeInterop);
60
+ }
61
+ function _interopRequireWildcard(obj, nodeInterop) {
62
+ if (!nodeInterop && obj && obj.__esModule) {
63
+ return obj;
64
+ }
65
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
66
+ return {
67
+ default: obj
68
+ };
69
+ }
70
+ var cache = _getRequireWildcardCache(nodeInterop);
71
+ if (cache && cache.has(obj)) {
72
+ return cache.get(obj);
73
+ }
74
+ var newObj = {};
75
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
76
+ for(var key in obj){
77
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
78
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
79
+ if (desc && (desc.get || desc.set)) {
80
+ Object.defineProperty(newObj, key, desc);
81
+ } else {
82
+ newObj[key] = obj[key];
83
+ }
84
+ }
85
+ }
86
+ newObj.default = obj;
87
+ if (cache) {
88
+ cache.set(obj, newObj);
89
+ }
90
+ return newObj;
91
+ }
52
92
  const debug = (0, _debug().default)("expo:apple-device");
93
+ async function getConnectedDevicesUsingNativeToolsAsync() {
94
+ return (await _devicectl.getConnectedAppleDevicesAsync())// Filter out unpaired devices.
95
+ // TODO: We could improve this logic in the future to attempt pairing if specified.
96
+ .filter((device)=>device.connectionProperties.pairingState === "paired").map((device)=>{
97
+ return {
98
+ name: device.deviceProperties.name,
99
+ model: device.hardwareProperties.productType,
100
+ osVersion: device.deviceProperties.osVersionNumber,
101
+ udid: device.hardwareProperties.udid,
102
+ deviceType: "device",
103
+ connectionType: device.connectionProperties.transportType === "localNetwork" ? "Network" : "USB"
104
+ };
105
+ });
106
+ }
53
107
  async function getConnectedDevicesAsync() {
108
+ const devices = await Promise.all([
109
+ // Prioritize native tools since they can provide more accurate information.
110
+ // NOTE: xcrun is substantially slower than custom tooling. +1.5s vs 9ms.
111
+ (0, _profile.profile)(getConnectedDevicesUsingNativeToolsAsync)(),
112
+ (0, _profile.profile)(getConnectedDevicesUsingCustomToolingAsync)(),
113
+ ]);
114
+ return (0, _array.uniqBy)(devices.flat(), (device)=>device.udid);
115
+ }
116
+ /**
117
+ * This supports devices that are running OS versions older than iOS 17.
118
+ *
119
+ * @returns a list of connected Apple devices.
120
+ */ async function getConnectedDevicesUsingCustomToolingAsync() {
54
121
  const client = new _usbmuxdClient.UsbmuxdClient(_usbmuxdClient.UsbmuxdClient.connectUsbmuxdSocket());
55
122
  const devices = await client.getDevices();
56
123
  client.socket.end();
@@ -72,6 +139,13 @@ async function getConnectedDevicesAsync() {
72
139
  }));
73
140
  }
74
141
  async function runOnDevice({ udid , appPath , bundleId , waitForApp , deltaPath , onProgress }) {
142
+ debug("Running on device:", {
143
+ udid,
144
+ appPath,
145
+ bundleId,
146
+ waitForApp,
147
+ deltaPath
148
+ });
75
149
  const clientManager = await _clientManager.ClientManager.create(udid);
76
150
  try {
77
151
  await mountDeveloperDiskImage(clientManager);
@@ -187,32 +261,6 @@ async function launchAppWithUsbmux(clientManager, { appInfo , detach }) {
187
261
  }
188
262
  throw new _errors.CommandError("Unable to launch app, number of tries exceeded");
189
263
  }
190
- async function launchAppWithDeviceCtl(deviceId, bundleId) {
191
- try {
192
- await (0, _xcrun.xcrunAsync)([
193
- "devicectl",
194
- "device",
195
- "process",
196
- "launch",
197
- "--device",
198
- deviceId,
199
- bundleId
200
- ]);
201
- } catch (error) {
202
- if ("stderr" in error) {
203
- const errorCodes = getDeviceCtlErrorCodes(error.stderr);
204
- if (errorCodes.includes("Locked")) {
205
- throw new _errors.CommandError("APPLE_DEVICE_LOCKED", "Device is locked, unlock and try again.");
206
- }
207
- }
208
- throw new _errors.CommandError(`There was an error launching app: ${error}`);
209
- }
210
- }
211
- /** Find all error codes from the output log */ function getDeviceCtlErrorCodes(log) {
212
- return [
213
- ...log.matchAll(/BSErrorCodeDescription\s+=\s+(.*)$/gim)
214
- ].map(([_line, code])=>code);
215
- }
216
264
  /**
217
265
  * iOS 17 introduces a new protocol called RemoteXPC.
218
266
  * This is not yet implemented, so we fallback to devicectl.
@@ -230,7 +278,7 @@ async function launchAppWithDeviceCtl(deviceId, bundleId) {
230
278
  const deviceId = clientManager.device.Properties.SerialNumber;
231
279
  clientManager.end();
232
280
  // Fallback to devicectl for iOS 17 support
233
- return await launchAppWithDeviceCtl(deviceId, bundleId);
281
+ return await (0, _devicectl.launchAppWithDeviceCtl)(deviceId, bundleId);
234
282
  }
235
283
  }
236
284
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/run/ios/appleDevice/AppleDevice.ts"],"sourcesContent":["import Debug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ClientManager } from './ClientManager';\nimport { IPLookupResult, OnInstallProgressCallback } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { UsbmuxdClient } from './client/UsbmuxdClient';\nimport { AFC_STATUS, AFCError } from './protocol/AFCProtocol';\nimport { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport { xcrunAsync } from '../../../start/platforms/ios/xcrun';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\n\nconst debug = Debug('expo:apple-device');\n\n// NOTE(EvanBacon): I have a feeling this shape will change with new iOS versions (tested against iOS 15).\nexport interface ConnectedDevice {\n /** @example `00008101-001964A22629003A` */\n udid: string;\n /** @example `Evan's phone` */\n name: string;\n /** @example `iPhone13,4` */\n model: string;\n /** @example `device` */\n deviceType: 'device' | 'catalyst';\n /** @example `USB` */\n connectionType: 'USB' | 'Network';\n /** @example `15.4.1` */\n osVersion: string;\n}\n\n/** @returns a list of connected Apple devices. */\nexport async function getConnectedDevicesAsync(): Promise<ConnectedDevice[]> {\n const client = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const devices = await client.getDevices();\n client.socket.end();\n\n return Promise.all(\n devices.map(async (device): Promise<ConnectedDevice> => {\n const socket = await new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket()).connect(\n device,\n 62078\n );\n const deviceValues = await new LockdowndClient(socket).getAllValues();\n socket.end();\n // TODO(EvanBacon): Add support for osType (ipad, watchos, etc)\n return {\n // TODO(EvanBacon): Better name\n name: deviceValues.DeviceName ?? deviceValues.ProductType ?? 'unknown iOS device',\n model: deviceValues.ProductType,\n osVersion: deviceValues.ProductVersion,\n deviceType: 'device',\n connectionType: device.Properties.ConnectionType,\n udid: device.Properties.SerialNumber,\n };\n })\n );\n}\n\n/** Install and run an Apple app binary on a connected Apple device. */\nexport async function runOnDevice({\n udid,\n appPath,\n bundleId,\n waitForApp,\n deltaPath,\n onProgress,\n}: {\n /** Apple device UDID */\n udid: string;\n /** File path to the app binary (ipa) */\n appPath: string;\n /** Bundle identifier for the app at `appPath` */\n bundleId: string;\n /** Wait for the app to launch before returning */\n waitForApp: boolean;\n /** File path to the app deltas folder to use for faster subsequent installs */\n deltaPath: string;\n /** Callback to be called with progress updates */\n onProgress: OnInstallProgressCallback;\n}) {\n const clientManager = await ClientManager.create(udid);\n\n try {\n await mountDeveloperDiskImage(clientManager);\n\n const packageName = path.basename(appPath);\n const destPackagePath = path.join('PublicStaging', packageName);\n\n await uploadApp(clientManager, { appBinaryPath: appPath, destinationPath: destPackagePath });\n\n const installer = await clientManager.getInstallationProxyClient();\n await installer.installApp(\n destPackagePath,\n bundleId,\n {\n // https://github.com/ios-control/ios-deploy/blob/0f2ffb1e564aa67a2dfca7cdf13de47ce489d835/src/ios-deploy/ios-deploy.m#L2491-L2508\n ApplicationsType: 'Any',\n\n CFBundleIdentifier: bundleId,\n CloseOnInvalidate: '1',\n InvalidateOnDetach: '1',\n IsUserInitiated: '1',\n // Disable checking for wifi devices, this is nominally faster.\n PreferWifi: '0',\n // Only info I could find on these:\n // https://github.com/wwxxyx/Quectel_BG96/blob/310876f90fc1093a59e45e381160eddcc31697d0/Apple_Homekit/homekit_certification_tools/ATS%206/ATS%206/ATS.app/Contents/Frameworks/CaptureKit.framework/Versions/A/Resources/MobileDevice/MobileInstallation.h#L112-L121\n PackageType: 'Developer',\n ShadowParentKey: deltaPath,\n // SkipUninstall: '1'\n },\n onProgress\n );\n\n const {\n // TODO(EvanBacon): This can be undefined when querying App Clips.\n [bundleId]: appInfo,\n } = await installer.lookupApp([bundleId]);\n\n if (appInfo) {\n // launch fails with EBusy or ENotFound if you try to launch immediately after install\n await delayAsync(200);\n const debugServerClient = await launchApp(clientManager, {\n bundleId,\n appInfo,\n detach: !waitForApp,\n });\n\n if (waitForApp && debugServerClient) {\n installExitHooks(async () => {\n // causes continue() to return\n debugServerClient.halt();\n // give continue() time to return response\n await delayAsync(64);\n });\n\n debug(`Waiting for app to close...\\n`);\n const result = await debugServerClient.continue();\n // TODO: I have no idea what this packet means yet (successful close?)\n // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app\n if (result !== 'W00') {\n await debugServerClient.kill();\n }\n }\n } else {\n Log.warn(`App \"${bundleId}\" installed but couldn't be launched. Open on device manually.`);\n }\n } finally {\n clientManager.end();\n }\n}\n\n/** Mount the developer disk image for Xcode. */\nasync function mountDeveloperDiskImage(clientManager: ClientManager) {\n const imageMounter = await clientManager.getMobileImageMounterClient();\n // Check if already mounted. If not, mount.\n if (!(await imageMounter.lookupImage()).ImageSignature) {\n // verify DeveloperDiskImage exists (TODO: how does this work on Windows/Linux?)\n // TODO: if windows/linux, download?\n const version = await (await clientManager.getLockdowndClient()).getValue('ProductVersion');\n const developerDiskImagePath = await XcodeDeveloperDiskImagePrerequisite.instance.assertAsync({\n version,\n });\n const developerDiskImageSig = fs.readFileSync(`${developerDiskImagePath}.signature`);\n await imageMounter.uploadImage(developerDiskImagePath, developerDiskImageSig);\n await imageMounter.mountImage(developerDiskImagePath, developerDiskImageSig);\n }\n}\n\nasync function uploadApp(\n clientManager: ClientManager,\n { appBinaryPath, destinationPath }: { appBinaryPath: string; destinationPath: string }\n) {\n const afcClient = await clientManager.getAFCClient();\n try {\n await afcClient.getFileInfo('PublicStaging');\n } catch (err: any) {\n if (err instanceof AFCError && err.status === AFC_STATUS.OBJECT_NOT_FOUND) {\n await afcClient.makeDirectory('PublicStaging');\n } else {\n throw err;\n }\n }\n await afcClient.uploadDirectory(appBinaryPath, destinationPath);\n}\n\nasync function launchAppWithUsbmux(\n clientManager: ClientManager,\n { appInfo, detach }: { appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n let tries = 0;\n while (tries < 3) {\n const debugServerClient = await clientManager.getDebugserverClient();\n await debugServerClient.setMaxPacketSize(1024);\n await debugServerClient.setWorkingDir(appInfo.Container);\n await debugServerClient.launchApp(appInfo.Path, appInfo.CFBundleExecutable);\n\n const result = await debugServerClient.checkLaunchSuccess();\n if (result === 'OK') {\n if (detach) {\n // https://github.com/libimobiledevice/libimobiledevice/blob/25059d4c7d75e03aab516af2929d7c6e6d4c17de/tools/idevicedebug.c#L455-L464\n const res = await debugServerClient.sendCommand('D', []);\n debug('Disconnect from debug server request:', res);\n if (res !== 'OK') {\n console.warn(\n 'Something went wrong while attempting to disconnect from iOS debug server, you may need to reopen the app manually.'\n );\n }\n }\n\n return debugServerClient;\n } else if (result === 'EBusy' || result === 'ENotFound') {\n debug('Device busy or app not found, trying to launch again in .5s...');\n tries++;\n debugServerClient.socket.end();\n await delayAsync(500);\n } else {\n throw new CommandError(`There was an error launching app: ${result}`);\n }\n }\n throw new CommandError('Unable to launch app, number of tries exceeded');\n}\n\n/** @internal Exposed for testing */\nexport async function launchAppWithDeviceCtl(deviceId: string, bundleId: string) {\n try {\n await xcrunAsync(['devicectl', 'device', 'process', 'launch', '--device', deviceId, bundleId]);\n } catch (error: any) {\n if ('stderr' in error) {\n const errorCodes = getDeviceCtlErrorCodes(error.stderr);\n if (errorCodes.includes('Locked')) {\n throw new CommandError('APPLE_DEVICE_LOCKED', 'Device is locked, unlock and try again.');\n }\n }\n\n throw new CommandError(`There was an error launching app: ${error}`);\n }\n}\n\n/** Find all error codes from the output log */\nfunction getDeviceCtlErrorCodes(log: string): string[] {\n return [...log.matchAll(/BSErrorCodeDescription\\s+=\\s+(.*)$/gim)].map(([_line, code]) => code);\n}\n\n/**\n * iOS 17 introduces a new protocol called RemoteXPC.\n * This is not yet implemented, so we fallback to devicectl.\n *\n * @see https://github.com/doronz88/pymobiledevice3/blob/master/misc/RemoteXPC.md#process-remoted\n */\nasync function launchApp(\n clientManager: ClientManager,\n {\n bundleId,\n appInfo,\n detach,\n }: { bundleId: string; appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n try {\n return await launchAppWithUsbmux(clientManager, { appInfo, detach });\n } catch (error) {\n debug('Failed to launch app with Usbmuxd, falling back to xcrun...', error);\n\n // Get the device UDID and close the connection, to allow `xcrun devicectl` to connect\n const deviceId = clientManager.device.Properties.SerialNumber;\n clientManager.end();\n\n // Fallback to devicectl for iOS 17 support\n return await launchAppWithDeviceCtl(deviceId, bundleId);\n }\n}\n"],"names":["getConnectedDevicesAsync","runOnDevice","launchAppWithDeviceCtl","debug","Debug","client","UsbmuxdClient","connectUsbmuxdSocket","devices","getDevices","socket","end","Promise","all","map","device","connect","deviceValues","LockdowndClient","getAllValues","name","DeviceName","ProductType","model","osVersion","ProductVersion","deviceType","connectionType","Properties","ConnectionType","udid","SerialNumber","appPath","bundleId","waitForApp","deltaPath","onProgress","clientManager","ClientManager","create","mountDeveloperDiskImage","packageName","path","basename","destPackagePath","join","uploadApp","appBinaryPath","destinationPath","installer","getInstallationProxyClient","installApp","ApplicationsType","CFBundleIdentifier","CloseOnInvalidate","InvalidateOnDetach","IsUserInitiated","PreferWifi","PackageType","ShadowParentKey","appInfo","lookupApp","delayAsync","debugServerClient","launchApp","detach","installExitHooks","halt","result","continue","kill","Log","warn","imageMounter","getMobileImageMounterClient","lookupImage","ImageSignature","version","getLockdowndClient","getValue","developerDiskImagePath","XcodeDeveloperDiskImagePrerequisite","instance","assertAsync","developerDiskImageSig","fs","readFileSync","uploadImage","mountImage","afcClient","getAFCClient","getFileInfo","err","AFCError","status","AFC_STATUS","OBJECT_NOT_FOUND","makeDirectory","uploadDirectory","launchAppWithUsbmux","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError","deviceId","xcrunAsync","error","errorCodes","getDeviceCtlErrorCodes","stderr","includes","log","matchAll","_line","code"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/run/ios/appleDevice/AppleDevice.ts"],"sourcesContent":["import Debug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ClientManager } from './ClientManager';\nimport { IPLookupResult, OnInstallProgressCallback } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { UsbmuxdClient } from './client/UsbmuxdClient';\nimport { AFC_STATUS, AFCError } from './protocol/AFCProtocol';\nimport { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport * as devicectl from '../../../start/platforms/ios/devicectl';\nimport { launchAppWithDeviceCtl } from '../../../start/platforms/ios/devicectl';\nimport { uniqBy } from '../../../utils/array';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { profile } from '../../../utils/profile';\n\nconst debug = Debug('expo:apple-device');\n\n// NOTE(EvanBacon): I have a feeling this shape will change with new iOS versions (tested against iOS 15).\nexport interface ConnectedDevice {\n /** @example `00008101-001964A22629003A` */\n udid: string;\n /** @example `Evan's phone` */\n name: string;\n /** @example `iPhone13,4` */\n model: string;\n /** @example `device` */\n deviceType: 'device' | 'catalyst';\n /** @example `USB` */\n connectionType: 'USB' | 'Network';\n /** @example `15.4.1` */\n osVersion: string;\n}\n\nasync function getConnectedDevicesUsingNativeToolsAsync(): Promise<ConnectedDevice[]> {\n return (\n (await devicectl.getConnectedAppleDevicesAsync())\n // Filter out unpaired devices.\n // TODO: We could improve this logic in the future to attempt pairing if specified.\n .filter((device) => device.connectionProperties.pairingState === 'paired')\n .map((device) => {\n return {\n name: device.deviceProperties.name,\n model: device.hardwareProperties.productType,\n osVersion: device.deviceProperties.osVersionNumber,\n udid: device.hardwareProperties.udid,\n deviceType: 'device',\n connectionType:\n device.connectionProperties.transportType === 'localNetwork' ? 'Network' : 'USB',\n };\n })\n );\n}\n\n/** @returns a list of connected Apple devices. */\nexport async function getConnectedDevicesAsync(): Promise<ConnectedDevice[]> {\n const devices = await Promise.all([\n // Prioritize native tools since they can provide more accurate information.\n // NOTE: xcrun is substantially slower than custom tooling. +1.5s vs 9ms.\n profile(getConnectedDevicesUsingNativeToolsAsync)(),\n profile(getConnectedDevicesUsingCustomToolingAsync)(),\n ]);\n\n return uniqBy(devices.flat(), (device) => device.udid);\n}\n\n/**\n * This supports devices that are running OS versions older than iOS 17.\n *\n * @returns a list of connected Apple devices.\n */\nasync function getConnectedDevicesUsingCustomToolingAsync(): Promise<ConnectedDevice[]> {\n const client = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const devices = await client.getDevices();\n client.socket.end();\n\n return Promise.all(\n devices.map(async (device): Promise<ConnectedDevice> => {\n const socket = await new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket()).connect(\n device,\n 62078\n );\n const deviceValues = await new LockdowndClient(socket).getAllValues();\n socket.end();\n // TODO(EvanBacon): Add support for osType (ipad, watchos, etc)\n return {\n // TODO(EvanBacon): Better name\n name: deviceValues.DeviceName ?? deviceValues.ProductType ?? 'unknown iOS device',\n model: deviceValues.ProductType,\n osVersion: deviceValues.ProductVersion,\n deviceType: 'device',\n connectionType: device.Properties.ConnectionType,\n udid: device.Properties.SerialNumber,\n };\n })\n );\n}\n\n/** Install and run an Apple app binary on a connected Apple device. */\nexport async function runOnDevice({\n udid,\n appPath,\n bundleId,\n waitForApp,\n deltaPath,\n onProgress,\n}: {\n /** Apple device UDID */\n udid: string;\n /** File path to the app binary (ipa) */\n appPath: string;\n /** Bundle identifier for the app at `appPath` */\n bundleId: string;\n /** Wait for the app to launch before returning */\n waitForApp: boolean;\n /** File path to the app deltas folder to use for faster subsequent installs */\n deltaPath: string;\n /** Callback to be called with progress updates */\n onProgress: OnInstallProgressCallback;\n}) {\n debug('Running on device:', { udid, appPath, bundleId, waitForApp, deltaPath });\n\n const clientManager = await ClientManager.create(udid);\n\n try {\n await mountDeveloperDiskImage(clientManager);\n\n const packageName = path.basename(appPath);\n const destPackagePath = path.join('PublicStaging', packageName);\n\n await uploadApp(clientManager, { appBinaryPath: appPath, destinationPath: destPackagePath });\n\n const installer = await clientManager.getInstallationProxyClient();\n await installer.installApp(\n destPackagePath,\n bundleId,\n {\n // https://github.com/ios-control/ios-deploy/blob/0f2ffb1e564aa67a2dfca7cdf13de47ce489d835/src/ios-deploy/ios-deploy.m#L2491-L2508\n ApplicationsType: 'Any',\n\n CFBundleIdentifier: bundleId,\n CloseOnInvalidate: '1',\n InvalidateOnDetach: '1',\n IsUserInitiated: '1',\n // Disable checking for wifi devices, this is nominally faster.\n PreferWifi: '0',\n // Only info I could find on these:\n // https://github.com/wwxxyx/Quectel_BG96/blob/310876f90fc1093a59e45e381160eddcc31697d0/Apple_Homekit/homekit_certification_tools/ATS%206/ATS%206/ATS.app/Contents/Frameworks/CaptureKit.framework/Versions/A/Resources/MobileDevice/MobileInstallation.h#L112-L121\n PackageType: 'Developer',\n ShadowParentKey: deltaPath,\n // SkipUninstall: '1'\n },\n onProgress\n );\n\n const {\n // TODO(EvanBacon): This can be undefined when querying App Clips.\n [bundleId]: appInfo,\n } = await installer.lookupApp([bundleId]);\n\n if (appInfo) {\n // launch fails with EBusy or ENotFound if you try to launch immediately after install\n await delayAsync(200);\n const debugServerClient = await launchApp(clientManager, {\n bundleId,\n appInfo,\n detach: !waitForApp,\n });\n\n if (waitForApp && debugServerClient) {\n installExitHooks(async () => {\n // causes continue() to return\n debugServerClient.halt();\n // give continue() time to return response\n await delayAsync(64);\n });\n\n debug(`Waiting for app to close...\\n`);\n const result = await debugServerClient.continue();\n // TODO: I have no idea what this packet means yet (successful close?)\n // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app\n if (result !== 'W00') {\n await debugServerClient.kill();\n }\n }\n } else {\n Log.warn(`App \"${bundleId}\" installed but couldn't be launched. Open on device manually.`);\n }\n } finally {\n clientManager.end();\n }\n}\n\n/** Mount the developer disk image for Xcode. */\nasync function mountDeveloperDiskImage(clientManager: ClientManager) {\n const imageMounter = await clientManager.getMobileImageMounterClient();\n // Check if already mounted. If not, mount.\n if (!(await imageMounter.lookupImage()).ImageSignature) {\n // verify DeveloperDiskImage exists (TODO: how does this work on Windows/Linux?)\n // TODO: if windows/linux, download?\n const version = await (await clientManager.getLockdowndClient()).getValue('ProductVersion');\n const developerDiskImagePath = await XcodeDeveloperDiskImagePrerequisite.instance.assertAsync({\n version,\n });\n const developerDiskImageSig = fs.readFileSync(`${developerDiskImagePath}.signature`);\n await imageMounter.uploadImage(developerDiskImagePath, developerDiskImageSig);\n await imageMounter.mountImage(developerDiskImagePath, developerDiskImageSig);\n }\n}\n\nasync function uploadApp(\n clientManager: ClientManager,\n { appBinaryPath, destinationPath }: { appBinaryPath: string; destinationPath: string }\n) {\n const afcClient = await clientManager.getAFCClient();\n try {\n await afcClient.getFileInfo('PublicStaging');\n } catch (err: any) {\n if (err instanceof AFCError && err.status === AFC_STATUS.OBJECT_NOT_FOUND) {\n await afcClient.makeDirectory('PublicStaging');\n } else {\n throw err;\n }\n }\n await afcClient.uploadDirectory(appBinaryPath, destinationPath);\n}\n\nasync function launchAppWithUsbmux(\n clientManager: ClientManager,\n { appInfo, detach }: { appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n let tries = 0;\n while (tries < 3) {\n const debugServerClient = await clientManager.getDebugserverClient();\n await debugServerClient.setMaxPacketSize(1024);\n await debugServerClient.setWorkingDir(appInfo.Container);\n await debugServerClient.launchApp(appInfo.Path, appInfo.CFBundleExecutable);\n\n const result = await debugServerClient.checkLaunchSuccess();\n if (result === 'OK') {\n if (detach) {\n // https://github.com/libimobiledevice/libimobiledevice/blob/25059d4c7d75e03aab516af2929d7c6e6d4c17de/tools/idevicedebug.c#L455-L464\n const res = await debugServerClient.sendCommand('D', []);\n debug('Disconnect from debug server request:', res);\n if (res !== 'OK') {\n console.warn(\n 'Something went wrong while attempting to disconnect from iOS debug server, you may need to reopen the app manually.'\n );\n }\n }\n\n return debugServerClient;\n } else if (result === 'EBusy' || result === 'ENotFound') {\n debug('Device busy or app not found, trying to launch again in .5s...');\n tries++;\n debugServerClient.socket.end();\n await delayAsync(500);\n } else {\n throw new CommandError(`There was an error launching app: ${result}`);\n }\n }\n throw new CommandError('Unable to launch app, number of tries exceeded');\n}\n\n/**\n * iOS 17 introduces a new protocol called RemoteXPC.\n * This is not yet implemented, so we fallback to devicectl.\n *\n * @see https://github.com/doronz88/pymobiledevice3/blob/master/misc/RemoteXPC.md#process-remoted\n */\nasync function launchApp(\n clientManager: ClientManager,\n {\n bundleId,\n appInfo,\n detach,\n }: { bundleId: string; appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n try {\n return await launchAppWithUsbmux(clientManager, { appInfo, detach });\n } catch (error) {\n debug('Failed to launch app with Usbmuxd, falling back to xcrun...', error);\n\n // Get the device UDID and close the connection, to allow `xcrun devicectl` to connect\n const deviceId = clientManager.device.Properties.SerialNumber;\n clientManager.end();\n\n // Fallback to devicectl for iOS 17 support\n return await launchAppWithDeviceCtl(deviceId, bundleId);\n }\n}\n"],"names":["getConnectedDevicesAsync","runOnDevice","debug","Debug","getConnectedDevicesUsingNativeToolsAsync","devicectl","getConnectedAppleDevicesAsync","filter","device","connectionProperties","pairingState","map","name","deviceProperties","model","hardwareProperties","productType","osVersion","osVersionNumber","udid","deviceType","connectionType","transportType","devices","Promise","all","profile","getConnectedDevicesUsingCustomToolingAsync","uniqBy","flat","client","UsbmuxdClient","connectUsbmuxdSocket","getDevices","socket","end","connect","deviceValues","LockdowndClient","getAllValues","DeviceName","ProductType","ProductVersion","Properties","ConnectionType","SerialNumber","appPath","bundleId","waitForApp","deltaPath","onProgress","clientManager","ClientManager","create","mountDeveloperDiskImage","packageName","path","basename","destPackagePath","join","uploadApp","appBinaryPath","destinationPath","installer","getInstallationProxyClient","installApp","ApplicationsType","CFBundleIdentifier","CloseOnInvalidate","InvalidateOnDetach","IsUserInitiated","PreferWifi","PackageType","ShadowParentKey","appInfo","lookupApp","delayAsync","debugServerClient","launchApp","detach","installExitHooks","halt","result","continue","kill","Log","warn","imageMounter","getMobileImageMounterClient","lookupImage","ImageSignature","version","getLockdowndClient","getValue","developerDiskImagePath","XcodeDeveloperDiskImagePrerequisite","instance","assertAsync","developerDiskImageSig","fs","readFileSync","uploadImage","mountImage","afcClient","getAFCClient","getFileInfo","err","AFCError","status","AFC_STATUS","OBJECT_NOT_FOUND","makeDirectory","uploadDirectory","launchAppWithUsbmux","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError","error","deviceId","launchAppWithDeviceCtl"],"mappings":"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"}
@@ -34,6 +34,7 @@ function _path() {
34
34
  return data;
35
35
  }
36
36
  const _appleDevice = /*#__PURE__*/ _interopRequireWildcard(require("./AppleDevice"));
37
+ const _devicectl = /*#__PURE__*/ _interopRequireWildcard(require("../../../start/platforms/ios/devicectl"));
37
38
  const _dir = require("../../../utils/dir");
38
39
  const _errors = require("../../../utils/errors");
39
40
  const _interactive = require("../../../utils/interactive");
@@ -112,6 +113,19 @@ async function installOnDeviceAsync(props) {
112
113
  }
113
114
  });
114
115
  } catch (error) {
116
+ if (error instanceof _errors.CommandError) {
117
+ if (error.code === "APPLE_DEVICE_USBMUXD") {
118
+ // Couldn't find device, could be OTA...
119
+ // Fallback on much slower devicectl method which supports OTA installs.
120
+ if (_devicectl.hasDevicectlEverBeenInstalled()) {
121
+ // This should never happen.
122
+ if (indicator) {
123
+ indicator.clear();
124
+ }
125
+ return await _devicectl.installAndLaunchAppAsync(props);
126
+ }
127
+ }
128
+ }
115
129
  if (indicator) {
116
130
  indicator.fail();
117
131
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/run/ios/appleDevice/installOnDeviceAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Ora } from 'ora';\nimport os from 'os';\nimport path from 'path';\n\nimport * as AppleDevice from './AppleDevice';\nimport { ensureDirectory } from '../../../utils/dir';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { ora } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\n/** Get the app_delta folder for faster subsequent rebuilds on devices. */\nexport function getAppDeltaDirectory(bundleId: string): string {\n // TODO: Maybe use .expo folder instead for debugging\n // TODO: Reuse existing folder from xcode?\n const deltaFolder = path.join(os.tmpdir(), 'ios', 'app-delta', bundleId);\n ensureDirectory(deltaFolder);\n return deltaFolder;\n}\n\n/**\n * Wraps the apple device method for installing and running an app,\n * adds indicator and retry loop for when the device is locked.\n */\nexport async function installOnDeviceAsync(props: {\n bundle: string;\n bundleIdentifier: string;\n appDeltaDirectory: string;\n udid: string;\n deviceName: string;\n}): Promise<void> {\n const { bundle, bundleIdentifier, appDeltaDirectory, udid, deviceName } = props;\n let indicator: Ora | undefined;\n\n try {\n // TODO: Connect for logs\n await AppleDevice.runOnDevice({\n udid,\n appPath: bundle,\n bundleId: bundleIdentifier,\n waitForApp: false,\n deltaPath: appDeltaDirectory,\n onProgress({\n status,\n isComplete,\n progress,\n }: {\n status: string;\n isComplete: boolean;\n progress: number;\n }) {\n if (!indicator) {\n indicator = ora(status).start();\n }\n indicator.text = `${chalk.bold(status)} ${progress}%`;\n if (isComplete) {\n indicator.succeed();\n }\n },\n });\n } catch (error: any) {\n if (indicator) {\n indicator.fail();\n }\n if (error.code === 'APPLE_DEVICE_LOCKED') {\n // Get the app name from the binary path.\n const appName = path.basename(bundle).split('.')[0] ?? 'app';\n if (\n isInteractive() &&\n (await confirmAsync({\n message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,\n initial: true,\n }))\n ) {\n return installOnDeviceAsync(props);\n }\n throw new CommandError(\n `Cannot launch ${appName} on ${deviceName} because the device is locked.`\n );\n }\n throw error;\n }\n}\n"],"names":["getAppDeltaDirectory","installOnDeviceAsync","bundleId","deltaFolder","path","join","os","tmpdir","ensureDirectory","props","bundle","bundleIdentifier","appDeltaDirectory","udid","deviceName","indicator","AppleDevice","runOnDevice","appPath","waitForApp","deltaPath","onProgress","status","isComplete","progress","ora","start","text","chalk","bold","succeed","error","fail","code","appName","basename","split","isInteractive","confirmAsync","message","initial","CommandError"],"mappings":"AAAA;;;;;;;;;;;IAagBA,oBAAoB,MAApBA,oBAAoB;IAYdC,oBAAoB,MAApBA,oBAAoB;;;8DAzBxB,OAAO;;;;;;;8DAEV,IAAI;;;;;;;8DACF,MAAM;;;;;;mEAEM,eAAe;qBACZ,oBAAoB;wBACvB,uBAAuB;6BACtB,4BAA4B;qBACtC,oBAAoB;yBACX,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAG9C,SAASD,oBAAoB,CAACE,QAAgB,EAAU;IAC7D,qDAAqD;IACrD,0CAA0C;IAC1C,MAAMC,WAAW,GAAGC,KAAI,EAAA,QAAA,CAACC,IAAI,CAACC,GAAE,EAAA,QAAA,CAACC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAEL,QAAQ,CAAC,AAAC;IACzEM,IAAAA,IAAe,gBAAA,EAACL,WAAW,CAAC,CAAC;IAC7B,OAAOA,WAAW,CAAC;AACrB,CAAC;AAMM,eAAeF,oBAAoB,CAACQ,KAM1C,EAAiB;IAChB,MAAM,EAAEC,MAAM,CAAA,EAAEC,gBAAgB,CAAA,EAAEC,iBAAiB,CAAA,EAAEC,IAAI,CAAA,EAAEC,UAAU,CAAA,EAAE,GAAGL,KAAK,AAAC;IAChF,IAAIM,SAAS,AAAiB,AAAC;IAE/B,IAAI;QACF,yBAAyB;QACzB,MAAMC,YAAW,CAACC,WAAW,CAAC;YAC5BJ,IAAI;YACJK,OAAO,EAAER,MAAM;YACfR,QAAQ,EAAES,gBAAgB;YAC1BQ,UAAU,EAAE,KAAK;YACjBC,SAAS,EAAER,iBAAiB;YAC5BS,UAAU,EAAC,EACTC,MAAM,CAAA,EACNC,UAAU,CAAA,EACVC,QAAQ,CAAA,EAKT,EAAE;gBACD,IAAI,CAACT,SAAS,EAAE;oBACdA,SAAS,GAAGU,IAAAA,IAAG,IAAA,EAACH,MAAM,CAAC,CAACI,KAAK,EAAE,CAAC;gBAClC,CAAC;gBACDX,SAAS,CAACY,IAAI,GAAG,CAAC,EAAEC,MAAK,EAAA,QAAA,CAACC,IAAI,CAACP,MAAM,CAAC,CAAC,CAAC,EAAEE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAID,UAAU,EAAE;oBACdR,SAAS,CAACe,OAAO,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,EAAE,OAAOC,KAAK,EAAO;QACnB,IAAIhB,SAAS,EAAE;YACbA,SAAS,CAACiB,IAAI,EAAE,CAAC;QACnB,CAAC;QACD,IAAID,KAAK,CAACE,IAAI,KAAK,qBAAqB,EAAE;gBAExB7B,GAAmC;YADnD,yCAAyC;YACzC,MAAM8B,OAAO,GAAG9B,CAAAA,GAAmC,GAAnCA,KAAI,EAAA,QAAA,CAAC+B,QAAQ,CAACzB,MAAM,CAAC,CAAC0B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAnChC,GAAmC,GAAI,KAAK,AAAC;YAC7D,IACEiC,IAAAA,YAAa,cAAA,GAAE,IACd,MAAMC,IAAAA,QAAY,aAAA,EAAC;gBAClBC,OAAO,EAAE,CAAC,cAAc,EAAEL,OAAO,CAAC,sCAAsC,EAAEpB,UAAU,CAAC,eAAe,CAAC;gBACrG0B,OAAO,EAAE,IAAI;aACd,CAAC,AAAC,EACH;gBACA,OAAOvC,oBAAoB,CAACQ,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,IAAIgC,OAAY,aAAA,CACpB,CAAC,cAAc,EAAEP,OAAO,CAAC,IAAI,EAAEpB,UAAU,CAAC,8BAA8B,CAAC,CAC1E,CAAC;QACJ,CAAC;QACD,MAAMiB,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"sources":["../../../../../src/run/ios/appleDevice/installOnDeviceAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Ora } from 'ora';\nimport os from 'os';\nimport path from 'path';\n\nimport * as AppleDevice from './AppleDevice';\nimport * as devicectl from '../../../start/platforms/ios/devicectl';\nimport { ensureDirectory } from '../../../utils/dir';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { ora } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\n/** Get the app_delta folder for faster subsequent rebuilds on devices. */\nexport function getAppDeltaDirectory(bundleId: string): string {\n // TODO: Maybe use .expo folder instead for debugging\n // TODO: Reuse existing folder from xcode?\n const deltaFolder = path.join(os.tmpdir(), 'ios', 'app-delta', bundleId);\n ensureDirectory(deltaFolder);\n return deltaFolder;\n}\n\n/**\n * Wraps the apple device method for installing and running an app,\n * adds indicator and retry loop for when the device is locked.\n */\nexport async function installOnDeviceAsync(props: {\n bundle: string;\n bundleIdentifier: string;\n appDeltaDirectory: string;\n udid: string;\n deviceName: string;\n}): Promise<void> {\n const { bundle, bundleIdentifier, appDeltaDirectory, udid, deviceName } = props;\n let indicator: Ora | undefined;\n\n try {\n // TODO: Connect for logs\n await AppleDevice.runOnDevice({\n udid,\n appPath: bundle,\n bundleId: bundleIdentifier,\n waitForApp: false,\n deltaPath: appDeltaDirectory,\n onProgress({\n status,\n isComplete,\n progress,\n }: {\n status: string;\n isComplete: boolean;\n progress: number;\n }) {\n if (!indicator) {\n indicator = ora(status).start();\n }\n indicator.text = `${chalk.bold(status)} ${progress}%`;\n if (isComplete) {\n indicator.succeed();\n }\n },\n });\n } catch (error: any) {\n if (error instanceof CommandError) {\n if (error.code === 'APPLE_DEVICE_USBMUXD') {\n // Couldn't find device, could be OTA...\n // Fallback on much slower devicectl method which supports OTA installs.\n if (devicectl.hasDevicectlEverBeenInstalled()) {\n // This should never happen.\n if (indicator) {\n indicator.clear();\n }\n return await devicectl.installAndLaunchAppAsync(props);\n }\n }\n }\n\n if (indicator) {\n indicator.fail();\n }\n if (error.code === 'APPLE_DEVICE_LOCKED') {\n // Get the app name from the binary path.\n const appName = path.basename(bundle).split('.')[0] ?? 'app';\n if (\n isInteractive() &&\n (await confirmAsync({\n message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,\n initial: true,\n }))\n ) {\n return installOnDeviceAsync(props);\n }\n throw new CommandError(\n `Cannot launch ${appName} on ${deviceName} because the device is locked.`\n );\n }\n throw error;\n }\n}\n"],"names":["getAppDeltaDirectory","installOnDeviceAsync","bundleId","deltaFolder","path","join","os","tmpdir","ensureDirectory","props","bundle","bundleIdentifier","appDeltaDirectory","udid","deviceName","indicator","AppleDevice","runOnDevice","appPath","waitForApp","deltaPath","onProgress","status","isComplete","progress","ora","start","text","chalk","bold","succeed","error","CommandError","code","devicectl","hasDevicectlEverBeenInstalled","clear","installAndLaunchAppAsync","fail","appName","basename","split","isInteractive","confirmAsync","message","initial"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/ensureDependenciesAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { getMissingPackagesAsync, ResolvedPackage } from './getMissingPackages';\nimport { installAsync } from '../../../install/installAsync';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { logNewSection } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\nexport async function ensureDependenciesAsync(\n projectRoot: string,\n {\n exp = getConfig(projectRoot).exp,\n requiredPackages,\n warningMessage,\n installMessage,\n // Don't prompt in CI\n skipPrompt = !isInteractive(),\n isProjectMutable = isInteractive(),\n }: {\n exp?: ExpoConfig;\n installMessage: string;\n warningMessage: string;\n requiredPackages: ResolvedPackage[];\n skipPrompt?: boolean;\n /** Project can be mutated in the current environment. */\n isProjectMutable?: boolean;\n }\n): Promise<boolean> {\n const { missing } = await getMissingPackagesAsync(projectRoot, {\n sdkVersion: exp.sdkVersion,\n requiredPackages,\n });\n if (!missing.length) {\n return true;\n }\n\n // Prompt to install or bail out...\n const readableMissingPackages = missing\n .map(({ pkg, version }) => (version ? [pkg, version].join('@') : pkg))\n .join(', ');\n\n let title = installMessage;\n\n if (skipPrompt && !isProjectMutable) {\n title += '\\n\\n';\n } else {\n let confirm = skipPrompt;\n if (skipPrompt) {\n // Automatically install packages without prompting.\n Log.log(wrapForTerminal(title + ` Installing ${chalk.cyan(readableMissingPackages)}`));\n } else {\n confirm = await confirmAsync({\n message: wrapForTerminal(\n title + ` Would you like to install ${chalk.cyan(readableMissingPackages)}?`\n ),\n initial: true,\n });\n }\n\n if (confirm) {\n // Format with version if available.\n const [packages, devPackages] = missing.reduce(\n ([deps, devDeps], p) => {\n const pkg = p.version ? [p.pkg, p.version].join('@') : p.pkg;\n if (p.dev) {\n return [deps, devDeps.concat(pkg)];\n }\n return [deps.concat(pkg), devDeps];\n },\n [[], []] as [string[], string[]]\n );\n\n if (packages.length) {\n await installPackagesAsync(projectRoot, {\n packages,\n });\n }\n\n if (devPackages.length) {\n await installPackagesAsync(projectRoot, {\n packages: devPackages,\n dev: true,\n });\n }\n\n // Try again but skip prompting twice, simply fail if the packages didn't install correctly.\n return await ensureDependenciesAsync(projectRoot, {\n skipPrompt: true,\n installMessage,\n warningMessage,\n requiredPackages,\n });\n }\n\n // Reset the title so it doesn't print twice in interactive mode.\n title = '';\n }\n\n const installCommand = 'npx expo install ' + missing.map(({ pkg }) => pkg).join(' ');\n\n const disableMessage = warningMessage;\n\n const solution = `Please install ${chalk.bold(\n readableMissingPackages\n )} by running:\\n\\n ${chalk.reset.bold(installCommand)}\\n\\n`;\n\n // This prevents users from starting a misconfigured JS or TS project by default.\n throw new CommandError(wrapForTerminal(title + solution + disableMessage + '\\n'));\n}\n\n/** Wrap long messages to fit smaller terminals. */\nfunction wrapForTerminal(message: string): string {\n return wrapAnsi(message, process.stdout.columns || 80);\n}\n\n/** Create the bash install command from a given set of packages and settings. */\nexport function createInstallCommand({\n packages,\n}: {\n packages: {\n file: string;\n pkg: string;\n version?: string | undefined;\n }[];\n}) {\n return 'npx expo install ' + packages.map(({ pkg }) => pkg).join(' ');\n}\n\n/** Install packages in the project. */\nasync function installPackagesAsync(\n projectRoot: string,\n { packages, dev }: { packages: string[]; dev?: boolean }\n) {\n const packagesStr = chalk.bold(packages.join(', '));\n Log.log();\n const installingPackageStep = logNewSection(`Installing ${packagesStr}`);\n try {\n await installAsync(packages, { projectRoot, dev });\n } catch (e: any) {\n installingPackageStep.fail(`Failed to install ${packagesStr} with error: ${e.message}`);\n throw e;\n }\n installingPackageStep.succeed(`Installed ${packagesStr}`);\n}\n"],"names":["ensureDependenciesAsync","createInstallCommand","projectRoot","exp","getConfig","requiredPackages","warningMessage","installMessage","skipPrompt","isInteractive","isProjectMutable","missing","getMissingPackagesAsync","sdkVersion","length","readableMissingPackages","map","pkg","version","join","title","confirm","Log","log","wrapForTerminal","chalk","cyan","confirmAsync","message","initial","packages","devPackages","reduce","deps","devDeps","p","dev","concat","installPackagesAsync","installCommand","disableMessage","solution","bold","reset","CommandError","wrapAnsi","process","stdout","columns","packagesStr","installingPackageStep","logNewSection","installAsync","e","fail","succeed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/ensureDependenciesAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { getMissingPackagesAsync, ResolvedPackage } from './getMissingPackages';\nimport { installAsync } from '../../../install/installAsync';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { logNewSection } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\nexport type EnsureDependenciesOptions = {\n /** The packages and/or version ranges that should be enforced in the project */\n requiredPackages: ResolvedPackage[];\n /** The user-facing message when the required packages are missing or incorrect */\n installMessage: string;\n /** The user-facing message when users aborted the installation */\n warningMessage: string;\n /** A previously loaded Expo configuration (loads when omitted) */\n exp?: ExpoConfig;\n /** If the prompts asking users to install should be skipped (defaults to false, in CI defaults to true) */\n skipPrompt?: boolean;\n /** Project can be mutated in the current environment (defaults to true, in CI defaults to false) */\n isProjectMutable?: boolean;\n};\n\nexport async function ensureDependenciesAsync(\n projectRoot: string,\n {\n exp = getConfig(projectRoot).exp,\n requiredPackages,\n warningMessage,\n installMessage,\n // Don't prompt in CI\n skipPrompt = !isInteractive(),\n isProjectMutable = isInteractive(),\n }: EnsureDependenciesOptions\n): Promise<boolean> {\n const { missing } = await getMissingPackagesAsync(projectRoot, {\n sdkVersion: exp.sdkVersion,\n requiredPackages,\n });\n if (!missing.length) {\n return true;\n }\n\n // Prompt to install or bail out...\n const readableMissingPackages = missing\n .map(({ pkg, version }) => (version ? [pkg, version].join('@') : pkg))\n .join(', ');\n\n let title = installMessage;\n\n if (skipPrompt && !isProjectMutable) {\n title += '\\n\\n';\n } else {\n let confirm = skipPrompt;\n if (skipPrompt) {\n // Automatically install packages without prompting.\n Log.log(wrapForTerminal(title + ` Installing ${chalk.cyan(readableMissingPackages)}`));\n } else {\n confirm = await confirmAsync({\n message: wrapForTerminal(\n title + ` Would you like to install ${chalk.cyan(readableMissingPackages)}?`\n ),\n initial: true,\n });\n }\n\n if (confirm) {\n // Format with version if available.\n const [packages, devPackages] = missing.reduce(\n ([deps, devDeps], p) => {\n const pkg = p.version ? [p.pkg, p.version].join('@') : p.pkg;\n if (p.dev) {\n return [deps, devDeps.concat(pkg)];\n }\n return [deps.concat(pkg), devDeps];\n },\n [[], []] as [string[], string[]]\n );\n\n if (packages.length) {\n await installPackagesAsync(projectRoot, {\n packages,\n });\n }\n\n if (devPackages.length) {\n await installPackagesAsync(projectRoot, {\n packages: devPackages,\n dev: true,\n });\n }\n\n // Try again but skip prompting twice, simply fail if the packages didn't install correctly.\n return await ensureDependenciesAsync(projectRoot, {\n skipPrompt: true,\n installMessage,\n warningMessage,\n requiredPackages,\n });\n }\n\n // Reset the title so it doesn't print twice in interactive mode.\n title = '';\n }\n\n const installCommand = 'npx expo install ' + missing.map(({ pkg }) => pkg).join(' ');\n\n const disableMessage = warningMessage;\n\n const solution = `Please install ${chalk.bold(\n readableMissingPackages\n )} by running:\\n\\n ${chalk.reset.bold(installCommand)}\\n\\n`;\n\n // This prevents users from starting a misconfigured JS or TS project by default.\n throw new CommandError(wrapForTerminal(title + solution + disableMessage + '\\n'));\n}\n\n/** Wrap long messages to fit smaller terminals. */\nfunction wrapForTerminal(message: string): string {\n return wrapAnsi(message, process.stdout.columns || 80);\n}\n\n/** Create the bash install command from a given set of packages and settings. */\nexport function createInstallCommand({\n packages,\n}: {\n packages: {\n file: string;\n pkg: string;\n version?: string | undefined;\n }[];\n}) {\n return 'npx expo install ' + packages.map(({ pkg }) => pkg).join(' ');\n}\n\n/** Install packages in the project. */\nasync function installPackagesAsync(\n projectRoot: string,\n { packages, dev }: { packages: string[]; dev?: boolean }\n) {\n const packagesStr = chalk.bold(packages.join(', '));\n Log.log();\n const installingPackageStep = logNewSection(`Installing ${packagesStr}`);\n try {\n await installAsync(packages, { projectRoot, dev });\n } catch (e: any) {\n installingPackageStep.fail(`Failed to install ${packagesStr} with error: ${e.message}`);\n throw e;\n }\n installingPackageStep.succeed(`Installed ${packagesStr}`);\n}\n"],"names":["ensureDependenciesAsync","createInstallCommand","projectRoot","exp","getConfig","requiredPackages","warningMessage","installMessage","skipPrompt","isInteractive","isProjectMutable","missing","getMissingPackagesAsync","sdkVersion","length","readableMissingPackages","map","pkg","version","join","title","confirm","Log","log","wrapForTerminal","chalk","cyan","confirmAsync","message","initial","packages","devPackages","reduce","deps","devDeps","p","dev","concat","installPackagesAsync","installCommand","disableMessage","solution","bold","reset","CommandError","wrapAnsi","process","stdout","columns","packagesStr","installingPackageStep","logNewSection","installAsync","e","fail","succeed"],"mappings":"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"}