@expo/cli 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +1 -1
  2. package/build/bin/cli +12 -3
  3. package/build/bin/cli.map +1 -1
  4. package/build/src/api/getExpoGoIntermediateCertificate.js +0 -2
  5. package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -1
  6. package/build/src/api/getProjectDevelopmentCertificate.js +0 -2
  7. package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -1
  8. package/build/src/api/graphql/queries/AppQuery.js +39 -0
  9. package/build/src/api/graphql/queries/AppQuery.js.map +1 -0
  10. package/build/src/api/graphql/queries/UserQuery.js +10 -3
  11. package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
  12. package/build/src/api/graphql/types/App.js +23 -0
  13. package/build/src/api/graphql/types/App.js.map +1 -0
  14. package/build/src/api/signManifest.js +0 -12
  15. package/build/src/api/signManifest.js.map +1 -1
  16. package/build/src/api/user/UserSettings.js.map +1 -1
  17. package/build/src/api/user/user.js.map +1 -1
  18. package/build/src/config/configAsync.js +3 -0
  19. package/build/src/config/configAsync.js.map +1 -1
  20. package/build/src/customize/customizeAsync.js +3 -0
  21. package/build/src/customize/customizeAsync.js.map +1 -1
  22. package/build/src/export/createBundles.js +7 -3
  23. package/build/src/export/createBundles.js.map +1 -1
  24. package/build/src/export/embed/exportEmbedAsync.js +24 -0
  25. package/build/src/export/embed/exportEmbedAsync.js.map +1 -0
  26. package/build/src/export/embed/index.js +117 -0
  27. package/build/src/export/embed/index.js.map +1 -0
  28. package/build/src/export/embed/resolveOptions.js +63 -0
  29. package/build/src/export/embed/resolveOptions.js.map +1 -0
  30. package/build/src/export/exportApp.js +56 -29
  31. package/build/src/export/exportApp.js.map +1 -1
  32. package/build/src/export/exportAssets.js +17 -0
  33. package/build/src/export/exportAssets.js.map +1 -1
  34. package/build/src/export/exportAsync.js +3 -0
  35. package/build/src/export/exportAsync.js.map +1 -1
  36. package/build/src/export/exportStaticAsync.js +179 -0
  37. package/build/src/export/exportStaticAsync.js.map +1 -0
  38. package/build/src/export/fork-bundleAsync.js +15 -42
  39. package/build/src/export/fork-bundleAsync.js.map +1 -1
  40. package/build/src/export/html.js +21 -0
  41. package/build/src/export/html.js.map +1 -0
  42. package/build/src/export/printBundleSizes.js +2 -2
  43. package/build/src/export/printBundleSizes.js.map +1 -1
  44. package/build/src/export/web/exportWebAsync.js +3 -0
  45. package/build/src/export/web/exportWebAsync.js.map +1 -1
  46. package/build/src/export/writeContents.js +5 -2
  47. package/build/src/export/writeContents.js.map +1 -1
  48. package/build/src/graphql/generated.js +462 -0
  49. package/build/src/graphql/generated.js.map +1 -0
  50. package/build/src/install/installAsync.js +3 -0
  51. package/build/src/install/installAsync.js.map +1 -1
  52. package/build/src/prebuild/clearNativeFolder.js +6 -1
  53. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  54. package/build/src/prebuild/ensureConfigAsync.js +1 -12
  55. package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
  56. package/build/src/prebuild/prebuildAsync.js +7 -2
  57. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  58. package/build/src/prebuild/resolveOptions.js +7 -8
  59. package/build/src/prebuild/resolveOptions.js.map +1 -1
  60. package/build/src/prebuild/resolveTemplate.js +5 -0
  61. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  62. package/build/src/prebuild/updateFromTemplate.js +6 -1
  63. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  64. package/build/src/prebuild/validateTemplatePlatforms.js +48 -0
  65. package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -0
  66. package/build/src/run/android/runAndroidAsync.js +4 -0
  67. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  68. package/build/src/run/ios/appleDevice/AppleDevice.js +25 -19
  69. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
  70. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
  71. package/build/src/run/ios/options/resolveNativeScheme.js +13 -4
  72. package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -1
  73. package/build/src/run/ios/runIosAsync.js +3 -0
  74. package/build/src/run/ios/runIosAsync.js.map +1 -1
  75. package/build/src/run/startBundler.js +4 -0
  76. package/build/src/run/startBundler.js.map +1 -1
  77. package/build/src/start/doctor/Prerequisite.js.map +1 -1
  78. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +12 -6
  79. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  80. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +1 -3
  81. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  82. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +31 -5
  83. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  84. package/build/src/start/doctor/typescript/updateTSConfig.js +6 -0
  85. package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
  86. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +1 -0
  87. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  88. package/build/src/start/platforms/android/adb.js +1 -1
  89. package/build/src/start/platforms/android/adb.js.map +1 -1
  90. package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
  91. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  92. package/build/src/start/server/BundlerDevServer.js +16 -2
  93. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  94. package/build/src/start/server/DevServerManager.js +33 -2
  95. package/build/src/start/server/DevServerManager.js.map +1 -1
  96. package/build/src/start/server/getStaticRenderFunctions.js +166 -0
  97. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -0
  98. package/build/src/start/server/metro/MetroBundlerDevServer.js +279 -3
  99. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  100. package/build/src/start/server/metro/MetroTerminalReporter.js +2 -34
  101. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  102. package/build/src/start/server/metro/externals.js +95 -0
  103. package/build/src/start/server/metro/externals.js.map +1 -0
  104. package/build/src/start/server/metro/getCssModulesFromBundler.js +77 -0
  105. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -0
  106. package/build/src/start/server/metro/inspector-proxy/index.js +2 -2
  107. package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
  108. package/build/src/start/server/metro/inspector-proxy/proxy.js +1 -3
  109. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +1 -1
  110. package/build/src/start/server/metro/instantiateMetro.js +44 -48
  111. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  112. package/build/src/start/server/metro/metroErrorInterface.js +114 -0
  113. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -0
  114. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js +51 -0
  115. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -0
  116. package/build/src/start/server/metro/resolveFromProject.js +26 -3
  117. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  118. package/build/src/start/server/metro/router.js +4 -0
  119. package/build/src/start/server/metro/router.js.map +1 -1
  120. package/build/src/start/server/metro/runServer-fork.js +108 -0
  121. package/build/src/start/server/metro/runServer-fork.js.map +1 -0
  122. package/build/src/start/server/metro/symbolicate.js +6 -0
  123. package/build/src/start/server/metro/symbolicate.js.map +1 -0
  124. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +70 -0
  125. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -0
  126. package/build/src/start/server/metro/withMetroMultiPlatform.js +181 -44
  127. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  128. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +8 -1
  129. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
  130. package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
  131. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +38 -32
  132. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  133. package/build/src/start/server/middleware/ManifestMiddleware.js +53 -19
  134. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  135. package/build/src/start/server/type-generation/expo-env.js +27 -0
  136. package/build/src/start/server/type-generation/expo-env.js.map +1 -0
  137. package/build/src/start/server/type-generation/index.js +49 -0
  138. package/build/src/start/server/type-generation/index.js.map +1 -0
  139. package/build/src/start/server/type-generation/routes.js +292 -0
  140. package/build/src/start/server/type-generation/routes.js.map +1 -0
  141. package/build/src/start/server/type-generation/tsconfig.js +89 -0
  142. package/build/src/start/server/type-generation/tsconfig.js.map +1 -0
  143. package/build/src/start/server/webTemplate.js +20 -4
  144. package/build/src/start/server/webTemplate.js.map +1 -1
  145. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +4 -6
  146. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  147. package/build/src/start/startAsync.js +30 -8
  148. package/build/src/start/startAsync.js.map +1 -1
  149. package/build/src/utils/FileNotifier.js +11 -4
  150. package/build/src/utils/FileNotifier.js.map +1 -1
  151. package/build/src/utils/analytics/getMetroProperties.js +1 -1
  152. package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
  153. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  154. package/build/src/utils/codesigning.js +31 -7
  155. package/build/src/utils/codesigning.js.map +1 -1
  156. package/build/src/utils/env.js +3 -0
  157. package/build/src/utils/env.js.map +1 -1
  158. package/build/src/utils/mergeGitIgnorePaths.js +42 -0
  159. package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
  160. package/build/src/utils/nodeEnv.js +11 -0
  161. package/build/src/utils/nodeEnv.js.map +1 -0
  162. package/build/src/utils/resolveArgs.js +43 -0
  163. package/build/src/utils/resolveArgs.js.map +1 -1
  164. package/build/src/utils/template.js +21 -0
  165. package/build/src/utils/template.js.map +1 -0
  166. package/build/src/utils/tsconfig/evaluateTsConfig.js +61 -0
  167. package/build/src/utils/tsconfig/evaluateTsConfig.js.map +1 -0
  168. package/build/src/utils/tsconfig/loadTsConfigPaths.js +69 -0
  169. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -0
  170. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js +88 -0
  171. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js.map +1 -0
  172. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +41 -0
  173. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -0
  174. package/package.json +16 -8
  175. package/static/template/metro.config.js +4 -1
  176. package/build/src/api/getProject.js +0 -19
  177. package/build/src/api/getProject.js.map +0 -1
  178. package/build/src/api/graphql/generated.js +0 -113
  179. package/build/src/api/graphql/generated.js.map +0 -1
@@ -7,6 +7,7 @@ exports.runOnDevice = runOnDevice;
7
7
  var _debug = _interopRequireDefault(require("debug"));
8
8
  var _fs = _interopRequireDefault(require("fs"));
9
9
  var _path = _interopRequireDefault(require("path"));
10
+ var _log = require("../../../log");
10
11
  var _xcodeDeveloperDiskImagePrerequisite = require("../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite");
11
12
  var _delay = require("../../../utils/delay");
12
13
  var _errors = require("../../../utils/errors");
@@ -67,29 +68,34 @@ async function runOnDevice({ udid , appPath , bundleId , waitForApp , deltaPath
67
68
  PackageType: "Developer",
68
69
  ShadowParentKey: deltaPath
69
70
  }, onProgress);
70
- const { [bundleId]: appInfo } = await installer.lookupApp([
71
+ const { // TODO(EvanBacon): This can be undefined when querying App Clips.
72
+ [bundleId]: appInfo , } = await installer.lookupApp([
71
73
  bundleId
72
74
  ]);
73
- // launch fails with EBusy or ENotFound if you try to launch immediately after install
74
- await (0, _delay).delayAsync(200);
75
- const debugServerClient = await launchApp(clientManager, {
76
- appInfo,
77
- detach: !waitForApp
78
- });
79
- if (waitForApp) {
80
- (0, _exit).installExitHooks(async ()=>{
81
- // causes continue() to return
82
- debugServerClient.halt();
83
- // give continue() time to return response
84
- await (0, _delay).delayAsync(64);
75
+ if (appInfo) {
76
+ // launch fails with EBusy or ENotFound if you try to launch immediately after install
77
+ await (0, _delay).delayAsync(200);
78
+ const debugServerClient = await launchApp(clientManager, {
79
+ appInfo,
80
+ detach: !waitForApp
85
81
  });
86
- debug(`Waiting for app to close...\n`);
87
- const result = await debugServerClient.continue();
88
- // TODO: I have no idea what this packet means yet (successful close?)
89
- // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app
90
- if (result !== "W00") {
91
- await debugServerClient.kill();
82
+ if (waitForApp) {
83
+ (0, _exit).installExitHooks(async ()=>{
84
+ // causes continue() to return
85
+ debugServerClient.halt();
86
+ // give continue() time to return response
87
+ await (0, _delay).delayAsync(64);
88
+ });
89
+ debug(`Waiting for app to close...\n`);
90
+ const result = await debugServerClient.continue();
91
+ // TODO: I have no idea what this packet means yet (successful close?)
92
+ // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app
93
+ if (result !== "W00") {
94
+ await debugServerClient.kill();
95
+ }
92
96
  }
97
+ } else {
98
+ _log.Log.warn(`App "${bundleId}" installed but couldn't be launched. Open on device manually.`);
93
99
  }
94
100
  } finally{
95
101
  clientManager.end();
@@ -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 { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\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';\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 { [bundleId]: appInfo } = await installer.lookupApp([bundleId]);\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, { appInfo, detach: !waitForApp });\n if (waitForApp) {\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 } 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 launchApp(\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"],"names":["getConnectedDevicesAsync","runOnDevice","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","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","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","warn","CommandError"],"mappings":"AAAA;;;;QAiCsBA,wBAAwB,GAAxBA,wBAAwB;QA4BxBC,WAAW,GAAXA,WAAW;AA7Df,IAAA,MAAO,kCAAP,OAAO,EAAA;AACV,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAE6B,IAAA,oCAAiE,WAAjE,iEAAiE,CAAA;AAC1F,IAAA,MAAsB,WAAtB,sBAAsB,CAAA;AACpB,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;AACnB,IAAA,KAAqB,WAArB,qBAAqB,CAAA;AACxB,IAAA,cAAiB,WAAjB,iBAAiB,CAAA;AAEf,IAAA,gBAA0B,WAA1B,0BAA0B,CAAA;AAC5B,IAAA,cAAwB,WAAxB,wBAAwB,CAAA;AACjB,IAAA,YAAwB,WAAxB,wBAAwB,CAAA;;;;;;AAE7D,MAAMC,KAAK,GAAGC,CAAAA,GAAAA,MAAK,AAAqB,CAAA,QAArB,CAAC,mBAAmB,CAAC,AAAC;AAmBlC,eAAeH,wBAAwB,GAA+B;IAC3E,MAAMI,MAAM,GAAG,IAAIC,cAAa,cAAA,CAACA,cAAa,cAAA,CAACC,oBAAoB,EAAE,CAAC,AAAC;IACvE,MAAMC,OAAO,GAAG,MAAMH,MAAM,CAACI,UAAU,EAAE,AAAC;IAC1CJ,MAAM,CAACK,MAAM,CAACC,GAAG,EAAE,CAAC;IAEpB,OAAOC,OAAO,CAACC,GAAG,CAChBL,OAAO,CAACM,GAAG,CAAC,OAAOC,MAAM,GAA+B;QACtD,MAAML,MAAM,GAAG,MAAM,IAAIJ,cAAa,cAAA,CAACA,cAAa,cAAA,CAACC,oBAAoB,EAAE,CAAC,CAACS,OAAO,CAClFD,MAAM,EACN,KAAK,CACN,AAAC;QACF,MAAME,YAAY,GAAG,MAAM,IAAIC,gBAAe,gBAAA,CAACR,MAAM,CAAC,CAACS,YAAY,EAAE,AAAC;QACtET,MAAM,CAACC,GAAG,EAAE,CAAC;YAILM,WAAuB,EAAvBA,GAAmD;QAH3D,+DAA+D;QAC/D,OAAO;YACL,+BAA+B;YAC/BG,IAAI,EAAEH,CAAAA,GAAmD,GAAnDA,CAAAA,WAAuB,GAAvBA,YAAY,CAACI,UAAU,YAAvBJ,WAAuB,GAAIA,YAAY,CAACK,WAAW,YAAnDL,GAAmD,GAAI,oBAAoB;YACjFM,KAAK,EAAEN,YAAY,CAACK,WAAW;YAC/BE,SAAS,EAAEP,YAAY,CAACQ,cAAc;YACtCC,UAAU,EAAE,QAAQ;YACpBC,cAAc,EAAEZ,MAAM,CAACa,UAAU,CAACC,cAAc;YAChDC,IAAI,EAAEf,MAAM,CAACa,UAAU,CAACG,YAAY;SACrC,CAAC;KACH,CAAC,CACH,CAAC;CACH;AAGM,eAAe7B,WAAW,CAAC,EAChC4B,IAAI,CAAA,EACJE,OAAO,CAAA,EACPC,QAAQ,CAAA,EACRC,UAAU,CAAA,EACVC,SAAS,CAAA,EACTC,UAAU,CAAA,EAcX,EAAE;IACD,MAAMC,aAAa,GAAG,MAAMC,cAAa,cAAA,CAACC,MAAM,CAACT,IAAI,CAAC,AAAC;IAEvD,IAAI;QACF,MAAMU,uBAAuB,CAACH,aAAa,CAAC,CAAC;QAE7C,MAAMI,WAAW,GAAGC,KAAI,QAAA,CAACC,QAAQ,CAACX,OAAO,CAAC,AAAC;QAC3C,MAAMY,eAAe,GAAGF,KAAI,QAAA,CAACG,IAAI,CAAC,eAAe,EAAEJ,WAAW,CAAC,AAAC;QAEhE,MAAMK,SAAS,CAACT,aAAa,EAAE;YAAEU,aAAa,EAAEf,OAAO;YAAEgB,eAAe,EAAEJ,eAAe;SAAE,CAAC,CAAC;QAE7F,MAAMK,SAAS,GAAG,MAAMZ,aAAa,CAACa,0BAA0B,EAAE,AAAC;QACnE,MAAMD,SAAS,CAACE,UAAU,CACxBP,eAAe,EACfX,QAAQ,EACR;YACE,kIAAkI;YAClImB,gBAAgB,EAAE,KAAK;YAEvBC,kBAAkB,EAAEpB,QAAQ;YAC5BqB,iBAAiB,EAAE,GAAG;YACtBC,kBAAkB,EAAE,GAAG;YACvBC,eAAe,EAAE,GAAG;YACpB,+DAA+D;YAC/DC,UAAU,EAAE,GAAG;YACf,mCAAmC;YACnC,mQAAmQ;YACnQC,WAAW,EAAE,WAAW;YACxBC,eAAe,EAAExB,SAAS;SAE3B,EACDC,UAAU,CACX,CAAC;QAEF,MAAM,EAAE,CAACH,QAAQ,CAAC,EAAE2B,OAAO,CAAA,EAAE,GAAG,MAAMX,SAAS,CAACY,SAAS,CAAC;YAAC5B,QAAQ;SAAC,CAAC,AAAC;QACtE,sFAAsF;QACtF,MAAM6B,CAAAA,GAAAA,MAAU,AAAK,CAAA,WAAL,CAAC,GAAG,CAAC,CAAC;QACtB,MAAMC,iBAAiB,GAAG,MAAMC,SAAS,CAAC3B,aAAa,EAAE;YAAEuB,OAAO;YAAEK,MAAM,EAAE,CAAC/B,UAAU;SAAE,CAAC,AAAC;QAC3F,IAAIA,UAAU,EAAE;YACdgC,CAAAA,GAAAA,KAAgB,AAKd,CAAA,iBALc,CAAC,UAAY;gBAC3B,8BAA8B;gBAC9BH,iBAAiB,CAACI,IAAI,EAAE,CAAC;gBACzB,0CAA0C;gBAC1C,MAAML,CAAAA,GAAAA,MAAU,AAAI,CAAA,WAAJ,CAAC,EAAE,CAAC,CAAC;aACtB,CAAC,CAAC;YAEH3D,KAAK,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACvC,MAAMiE,MAAM,GAAG,MAAML,iBAAiB,CAACM,QAAQ,EAAE,AAAC;YAClD,sEAAsE;YACtE,oFAAoF;YACpF,IAAID,MAAM,KAAK,KAAK,EAAE;gBACpB,MAAML,iBAAiB,CAACO,IAAI,EAAE,CAAC;aAChC;SACF;KACF,QAAS;QACRjC,aAAa,CAAC1B,GAAG,EAAE,CAAC;KACrB;CACF;AAED,gDAAgD,CAChD,eAAe6B,uBAAuB,CAACH,aAA4B,EAAE;IACnE,MAAMkC,YAAY,GAAG,MAAMlC,aAAa,CAACmC,2BAA2B,EAAE,AAAC;IACvE,2CAA2C;IAC3C,IAAI,CAAC,CAAC,MAAMD,YAAY,CAACE,WAAW,EAAE,CAAC,CAACC,cAAc,EAAE;QACtD,gFAAgF;QAChF,oCAAoC;QACpC,MAAMC,OAAO,GAAG,MAAM,CAAC,MAAMtC,aAAa,CAACuC,kBAAkB,EAAE,CAAC,CAACC,QAAQ,CAAC,gBAAgB,CAAC,AAAC;QAC5F,MAAMC,sBAAsB,GAAG,MAAMC,oCAAmC,oCAAA,CAACC,QAAQ,CAACC,WAAW,CAAC;YAC5FN,OAAO;SACR,CAAC,AAAC;QACH,MAAMO,qBAAqB,GAAGC,GAAE,QAAA,CAACC,YAAY,CAAC,CAAC,EAAEN,sBAAsB,CAAC,UAAU,CAAC,CAAC,AAAC;QACrF,MAAMP,YAAY,CAACc,WAAW,CAACP,sBAAsB,EAAEI,qBAAqB,CAAC,CAAC;QAC9E,MAAMX,YAAY,CAACe,UAAU,CAACR,sBAAsB,EAAEI,qBAAqB,CAAC,CAAC;KAC9E;CACF;AAED,eAAepC,SAAS,CACtBT,aAA4B,EAC5B,EAAEU,aAAa,CAAA,EAAEC,eAAe,CAAA,EAAsD,EACtF;IACA,MAAMuC,SAAS,GAAG,MAAMlD,aAAa,CAACmD,YAAY,EAAE,AAAC;IACrD,IAAI;QACF,MAAMD,SAAS,CAACE,WAAW,CAAC,eAAe,CAAC,CAAC;KAC9C,CAAC,OAAOC,GAAG,EAAO;QACjB,IAAIA,GAAG,YAAYC,YAAQ,SAAA,IAAID,GAAG,CAACE,MAAM,KAAKC,YAAU,WAAA,CAACC,gBAAgB,EAAE;YACzE,MAAMP,SAAS,CAACQ,aAAa,CAAC,eAAe,CAAC,CAAC;SAChD,MAAM;YACL,MAAML,GAAG,CAAC;SACX;KACF;IACD,MAAMH,SAAS,CAACS,eAAe,CAACjD,aAAa,EAAEC,eAAe,CAAC,CAAC;CACjE;AAED,eAAegB,SAAS,CACtB3B,aAA4B,EAC5B,EAAEuB,OAAO,CAAA,EAAEK,MAAM,CAAA,EAAyD,EAC1E;IACA,IAAIgC,KAAK,GAAG,CAAC,AAAC;IACd,MAAOA,KAAK,GAAG,CAAC,CAAE;QAChB,MAAMlC,iBAAiB,GAAG,MAAM1B,aAAa,CAAC6D,oBAAoB,EAAE,AAAC;QACrE,MAAMnC,iBAAiB,CAACoC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAMpC,iBAAiB,CAACqC,aAAa,CAACxC,OAAO,CAACyC,SAAS,CAAC,CAAC;QACzD,MAAMtC,iBAAiB,CAACC,SAAS,CAACJ,OAAO,CAAC0C,IAAI,EAAE1C,OAAO,CAAC2C,kBAAkB,CAAC,CAAC;QAE5E,MAAMnC,MAAM,GAAG,MAAML,iBAAiB,CAACyC,kBAAkB,EAAE,AAAC;QAC5D,IAAIpC,MAAM,KAAK,IAAI,EAAE;YACnB,IAAIH,MAAM,EAAE;gBACV,oIAAoI;gBACpI,MAAMwC,GAAG,GAAG,MAAM1C,iBAAiB,CAAC2C,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,AAAC;gBACzDvG,KAAK,CAAC,uCAAuC,EAAEsG,GAAG,CAAC,CAAC;gBACpD,IAAIA,GAAG,KAAK,IAAI,EAAE;oBAChBE,OAAO,CAACC,IAAI,CACV,qHAAqH,CACtH,CAAC;iBACH;aACF;YAED,OAAO7C,iBAAiB,CAAC;SAC1B,MAAM,IAAIK,MAAM,KAAK,OAAO,IAAIA,MAAM,KAAK,WAAW,EAAE;YACvDjE,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACxE8F,KAAK,EAAE,CAAC;YACRlC,iBAAiB,CAACrD,MAAM,CAACC,GAAG,EAAE,CAAC;YAC/B,MAAMmD,CAAAA,GAAAA,MAAU,AAAK,CAAA,WAAL,CAAC,GAAG,CAAC,CAAC;SACvB,MAAM;YACL,MAAM,IAAI+C,OAAY,aAAA,CAAC,CAAC,kCAAkC,EAAEzC,MAAM,CAAC,CAAC,CAAC,CAAC;SACvE;KACF;IACD,MAAM,IAAIyC,OAAY,aAAA,CAAC,gDAAgD,CAAC,CAAC;CAC1E"}
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 { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\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';\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, { appInfo, detach: !waitForApp });\n if (waitForApp) {\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 launchApp(\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"],"names":["getConnectedDevicesAsync","runOnDevice","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","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/InstallationProxyClient.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport Debug from 'debug';\nimport { Socket } from 'net';\n\nimport { LockdownProtocolClient } from '../protocol/LockdownProtocol';\nimport type { LockdownCommand, LockdownResponse } from '../protocol/LockdownProtocol';\nimport { ResponseError, ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:installation_proxy');\n\nexport type OnInstallProgressCallback = (props: {\n status: string;\n isComplete: boolean;\n // copiedFiles: number;\n progress: number;\n}) => void;\n\ninterface IPOptions {\n ApplicationsType?: 'Any';\n PackageType?: 'Developer';\n CFBundleIdentifier?: string;\n ReturnAttributes?: ('CFBundleIdentifier' | 'CFBundleExecutable' | 'Container' | 'Path')[];\n BundleIDs?: string[];\n [key: string]: undefined | string | string[];\n}\n\ninterface IPInstallPercentCompleteResponseItem extends LockdownResponse {\n PercentComplete: number;\n}\n\ninterface IPInstallCFBundleIdentifierResponseItem {\n CFBundleIdentifier: string;\n}\n\ninterface IPInstallCompleteResponseItem extends LockdownResponse {\n Status: 'Complete';\n}\n/*\n * [{ \"PercentComplete\": 5, \"Status\": \"CreatingStagingDirectory\" }]\n * ...\n * [{ \"PercentComplete\": 90, \"Status\": \"GeneratingApplicationMap\" }]\n * [{ \"CFBundleIdentifier\": \"my.company.app\" }]\n * [{ \"Status\": \"Complete\" }]\n */\ntype IPInstallPercentCompleteResponse = IPInstallPercentCompleteResponseItem[];\ntype IPInstallCFBundleIdentifierResponse = IPInstallCFBundleIdentifierResponseItem[];\ntype IPInstallCompleteResponse = IPInstallCompleteResponseItem[];\n\ninterface IPMessage extends LockdownCommand {\n Command: string;\n ClientOptions: IPOptions;\n}\n\ninterface IPLookupResponseItem extends LockdownResponse {\n LookupResult: IPLookupResult;\n}\n/*\n * [{\n * LookupResult: IPLookupResult,\n * Status: \"Complete\"\n * }]\n */\ntype IPLookupResponse = IPLookupResponseItem[];\n\nexport interface IPLookupResult {\n // BundleId\n [key: string]: {\n Container: string;\n CFBundleIdentifier: string;\n CFBundleExecutable: string;\n Path: string;\n };\n}\n\nfunction isIPLookupResponse(resp: any): resp is IPLookupResponse {\n return resp.length && resp[0].LookupResult !== undefined;\n}\n\nfunction isIPInstallPercentCompleteResponse(resp: any): resp is IPInstallPercentCompleteResponse {\n return resp.length && resp[0].PercentComplete !== undefined;\n}\n\nfunction isIPInstallCFBundleIdentifierResponse(\n resp: any\n): resp is IPInstallCFBundleIdentifierResponse {\n return resp.length && resp[0].CFBundleIdentifier !== undefined;\n}\n\nfunction isIPInstallCompleteResponse(resp: any): resp is IPInstallCompleteResponse {\n return resp.length && resp[0].Status === 'Complete';\n}\n\nexport class InstallationProxyClient extends ServiceClient<LockdownProtocolClient<IPMessage>> {\n constructor(public socket: Socket) {\n super(socket, new LockdownProtocolClient(socket));\n }\n\n async lookupApp(\n bundleIds: string[],\n options: IPOptions = {\n ReturnAttributes: ['Path', 'Container', 'CFBundleExecutable', 'CFBundleIdentifier'],\n ApplicationsType: 'Any',\n }\n ) {\n debug(`lookupApp, options: ${JSON.stringify(options)}`);\n\n let resp = await this.protocolClient.sendMessage({\n Command: 'Lookup',\n ClientOptions: {\n BundleIDs: bundleIds,\n ...options,\n },\n });\n if (resp && !Array.isArray(resp)) resp = [resp];\n if (isIPLookupResponse(resp)) {\n return resp[0].LookupResult;\n } else {\n throw new ResponseError(`There was an error looking up app`, resp);\n }\n }\n\n async installApp(\n packagePath: string,\n bundleId: string,\n options: IPOptions = {\n ApplicationsType: 'Any',\n PackageType: 'Developer',\n },\n onProgress: OnInstallProgressCallback\n ) {\n debug(`installApp, packagePath: ${packagePath}, bundleId: ${bundleId}`);\n\n return this.protocolClient.sendMessage(\n {\n Command: 'Install',\n PackagePath: packagePath,\n ClientOptions: {\n CFBundleIdentifier: bundleId,\n ...options,\n },\n },\n (resp, resolve, reject) => {\n if (resp && !Array.isArray(resp)) resp = [resp];\n\n if (isIPInstallCompleteResponse(resp)) {\n onProgress({\n isComplete: true,\n progress: 100,\n status: resp[0].Status,\n });\n resolve();\n } else if (isIPInstallPercentCompleteResponse(resp)) {\n onProgress({\n isComplete: false,\n progress: resp[0].PercentComplete,\n status: resp[0].Status,\n });\n debug(`Installation status: ${resp[0].Status}, %${resp[0].PercentComplete}`);\n } else if (isIPInstallCFBundleIdentifierResponse(resp)) {\n debug(`Installed app: ${resp[0].CFBundleIdentifier}`);\n } else {\n reject(\n new ResponseError(\n 'There was an error installing app: ' + require('util').inspect(resp),\n resp\n )\n );\n }\n }\n );\n }\n}\n"],"names":["debug","Debug","isIPLookupResponse","resp","length","LookupResult","undefined","isIPInstallPercentCompleteResponse","PercentComplete","isIPInstallCFBundleIdentifierResponse","CFBundleIdentifier","isIPInstallCompleteResponse","Status","InstallationProxyClient","ServiceClient","constructor","socket","LockdownProtocolClient","lookupApp","bundleIds","options","ReturnAttributes","ApplicationsType","JSON","stringify","protocolClient","sendMessage","Command","ClientOptions","BundleIDs","Array","isArray","ResponseError","installApp","packagePath","bundleId","PackageType","onProgress","PackagePath","resolve","reject","isComplete","progress","status","require","inspect"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/run/ios/appleDevice/client/InstallationProxyClient.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport Debug from 'debug';\nimport { Socket } from 'net';\n\nimport { LockdownProtocolClient } from '../protocol/LockdownProtocol';\nimport type { LockdownCommand, LockdownResponse } from '../protocol/LockdownProtocol';\nimport { ResponseError, ServiceClient } from './ServiceClient';\n\nconst debug = Debug('expo:apple-device:client:installation_proxy');\n\nexport type OnInstallProgressCallback = (props: {\n status: string;\n isComplete: boolean;\n // copiedFiles: number;\n progress: number;\n}) => void;\n\ninterface IPOptions {\n ApplicationsType?: 'Any';\n PackageType?: 'Developer';\n CFBundleIdentifier?: string;\n\n ReturnAttributes?: (\n | 'CFBundleIdentifier'\n | 'ApplicationDSID'\n | 'ApplicationType'\n | 'CFBundleExecutable'\n | 'CFBundleDisplayName'\n | 'CFBundleIconFile'\n | 'CFBundleName'\n | 'CFBundleShortVersionString'\n | 'CFBundleSupportedPlatforms'\n | 'CFBundleURLTypes'\n | 'CodeInfoIdentifier'\n | 'Container'\n | 'Entitlements'\n | 'HasSettingsBundle'\n | 'IsUpgradeable'\n | 'MinimumOSVersion'\n | 'Path'\n | 'SignerIdentity'\n | 'UIDeviceFamily'\n | 'UIFileSharingEnabled'\n | 'UIStatusBarHidden'\n | 'UISupportedInterfaceOrientations'\n )[];\n BundleIDs?: string[];\n [key: string]: undefined | string | string[];\n}\n\ninterface IPInstallPercentCompleteResponseItem extends LockdownResponse {\n PercentComplete: number;\n}\n\ninterface IPInstallCFBundleIdentifierResponseItem {\n CFBundleIdentifier: string;\n}\n\ninterface IPInstallCompleteResponseItem extends LockdownResponse {\n Status: 'Complete';\n}\n/*\n * [{ \"PercentComplete\": 5, \"Status\": \"CreatingStagingDirectory\" }]\n * ...\n * [{ \"PercentComplete\": 90, \"Status\": \"GeneratingApplicationMap\" }]\n * [{ \"CFBundleIdentifier\": \"my.company.app\" }]\n * [{ \"Status\": \"Complete\" }]\n */\ntype IPInstallPercentCompleteResponse = IPInstallPercentCompleteResponseItem[];\ntype IPInstallCFBundleIdentifierResponse = IPInstallCFBundleIdentifierResponseItem[];\ntype IPInstallCompleteResponse = IPInstallCompleteResponseItem[];\n\ninterface IPMessage extends LockdownCommand {\n Command: string;\n ClientOptions: IPOptions;\n}\n\ninterface IPLookupResponseItem extends LockdownResponse {\n LookupResult: IPLookupResult;\n}\n/*\n * [{\n * LookupResult: IPLookupResult,\n * Status: \"Complete\"\n * }]\n */\ntype IPLookupResponse = IPLookupResponseItem[];\n\nexport interface IPLookupResult {\n // BundleId\n [key: string]: {\n Container: string;\n CFBundleIdentifier: string;\n CFBundleExecutable: string;\n Path: string;\n };\n}\n\nfunction isIPLookupResponse(resp: any): resp is IPLookupResponse {\n return resp.length && resp[0].LookupResult !== undefined;\n}\n\nfunction isIPInstallPercentCompleteResponse(resp: any): resp is IPInstallPercentCompleteResponse {\n return resp.length && resp[0].PercentComplete !== undefined;\n}\n\nfunction isIPInstallCFBundleIdentifierResponse(\n resp: any\n): resp is IPInstallCFBundleIdentifierResponse {\n return resp.length && resp[0].CFBundleIdentifier !== undefined;\n}\n\nfunction isIPInstallCompleteResponse(resp: any): resp is IPInstallCompleteResponse {\n return resp.length && resp[0].Status === 'Complete';\n}\n\nexport class InstallationProxyClient extends ServiceClient<LockdownProtocolClient<IPMessage>> {\n constructor(public socket: Socket) {\n super(socket, new LockdownProtocolClient(socket));\n }\n\n async lookupApp(\n bundleIds: string[],\n options: IPOptions = {\n ReturnAttributes: ['Path', 'Container', 'CFBundleExecutable', 'CFBundleIdentifier'],\n ApplicationsType: 'Any',\n }\n ) {\n debug(`lookupApp, options: ${JSON.stringify(options)}`);\n\n let resp = await this.protocolClient.sendMessage({\n Command: 'Lookup',\n ClientOptions: {\n BundleIDs: bundleIds,\n ...options,\n },\n });\n if (resp && !Array.isArray(resp)) resp = [resp];\n if (isIPLookupResponse(resp)) {\n return resp[0].LookupResult;\n } else {\n throw new ResponseError(`There was an error looking up app`, resp);\n }\n }\n\n async installApp(\n packagePath: string,\n bundleId: string,\n options: IPOptions = {\n ApplicationsType: 'Any',\n PackageType: 'Developer',\n },\n onProgress: OnInstallProgressCallback\n ) {\n debug(`installApp, packagePath: ${packagePath}, bundleId: ${bundleId}`);\n\n return this.protocolClient.sendMessage(\n {\n Command: 'Install',\n PackagePath: packagePath,\n ClientOptions: {\n CFBundleIdentifier: bundleId,\n ...options,\n },\n },\n (resp, resolve, reject) => {\n if (resp && !Array.isArray(resp)) resp = [resp];\n\n if (isIPInstallCompleteResponse(resp)) {\n onProgress({\n isComplete: true,\n progress: 100,\n status: resp[0].Status,\n });\n resolve();\n } else if (isIPInstallPercentCompleteResponse(resp)) {\n onProgress({\n isComplete: false,\n progress: resp[0].PercentComplete,\n status: resp[0].Status,\n });\n debug(`Installation status: ${resp[0].Status}, %${resp[0].PercentComplete}`);\n } else if (isIPInstallCFBundleIdentifierResponse(resp)) {\n debug(`Installed app: ${resp[0].CFBundleIdentifier}`);\n } else {\n reject(\n new ResponseError(\n 'There was an error installing app: ' + require('util').inspect(resp),\n resp\n )\n );\n }\n }\n );\n }\n}\n"],"names":["debug","Debug","isIPLookupResponse","resp","length","LookupResult","undefined","isIPInstallPercentCompleteResponse","PercentComplete","isIPInstallCFBundleIdentifierResponse","CFBundleIdentifier","isIPInstallCompleteResponse","Status","InstallationProxyClient","ServiceClient","constructor","socket","LockdownProtocolClient","lookupApp","bundleIds","options","ReturnAttributes","ApplicationsType","JSON","stringify","protocolClient","sendMessage","Command","ClientOptions","BundleIDs","Array","isArray","ResponseError","installApp","packagePath","bundleId","PackageType","onProgress","PackagePath","resolve","reject","isComplete","progress","status","require","inspect"],"mappings":"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"}
@@ -38,6 +38,7 @@ function _interopRequireWildcard(obj) {
38
38
  return newObj;
39
39
  }
40
40
  }
41
+ const debug = require("debug")("expo:run:ios:options:resolveNativeScheme");
41
42
  async function resolveNativeSchemePropsAsync(projectRoot, options, xcodeProject) {
42
43
  var ref;
43
44
  return (ref = await promptOrQueryNativeSchemeAsync(projectRoot, options)) != null ? ref : getDefaultNativeScheme(projectRoot, options, xcodeProject);
@@ -76,13 +77,21 @@ async function promptOrQueryNativeSchemeAsync(projectRoot, { scheme , configurat
76
77
  function getDefaultNativeScheme(projectRoot, options, xcodeProject) {
77
78
  // If the resolution failed then we should just use the first runnable scheme that
78
79
  // matches the provided configuration.
79
- const resolvedScheme = (0, _profile).profile(_configPlugins.IOSConfig.BuildScheme.getRunnableSchemesFromXcodeproj)(projectRoot, {
80
+ const resolvedSchemes = (0, _profile).profile(_configPlugins.IOSConfig.BuildScheme.getRunnableSchemesFromXcodeproj)(projectRoot, {
80
81
  configuration: options.configuration
81
- })[0];
82
+ });
83
+ // If there are multiple schemes, then the default should be the application.
84
+ if (resolvedSchemes.length > 1) {
85
+ var ref;
86
+ const scheme = (ref = resolvedSchemes.find(({ type })=>type === _configPlugins.IOSConfig.Target.TargetType.APPLICATION
87
+ )) != null ? ref : resolvedSchemes[0];
88
+ debug(`Using default scheme: ${scheme.name}`);
89
+ return scheme;
90
+ }
82
91
  // If we couldn't find the scheme, then we'll guess at it,
83
92
  // this is needed for cases where the native code hasn't been generated yet.
84
- if (resolvedScheme) {
85
- return resolvedScheme;
93
+ if (resolvedSchemes[0]) {
94
+ return resolvedSchemes[0];
86
95
  }
87
96
  return {
88
97
  name: _path.default.basename(xcodeProject.name, _path.default.extname(xcodeProject.name))
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/run/ios/options/resolveNativeScheme.ts"],"sourcesContent":["import { IOSConfig } from '@expo/config-plugins';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { profile } from '../../../utils/profile';\nimport { selectAsync } from '../../../utils/prompts';\nimport { Options, ProjectInfo, XcodeConfiguration } from '../XcodeBuild.types';\n\ntype NativeSchemeProps = {\n name: string;\n osType?: string;\n};\n\nexport async function resolveNativeSchemePropsAsync(\n projectRoot: string,\n options: Pick<Options, 'scheme' | 'configuration'>,\n xcodeProject: ProjectInfo\n): Promise<NativeSchemeProps> {\n return (\n (await promptOrQueryNativeSchemeAsync(projectRoot, options)) ??\n getDefaultNativeScheme(projectRoot, options, xcodeProject)\n );\n}\n\n/** Resolve the native iOS build `scheme` for a given `configuration`. If the `scheme` isn't provided then the user will be prompted to select one. */\nexport async function promptOrQueryNativeSchemeAsync(\n projectRoot: string,\n { scheme, configuration }: { scheme?: string | boolean; configuration?: XcodeConfiguration }\n): Promise<NativeSchemeProps | null> {\n const schemes = IOSConfig.BuildScheme.getRunnableSchemesFromXcodeproj(projectRoot, {\n configuration,\n });\n if (!schemes.length) {\n throw new CommandError('IOS_MALFORMED', 'No native iOS build schemes found');\n }\n\n if (scheme === true) {\n if (schemes.length === 1) {\n Log.log(`Auto selecting only available scheme: ${schemes[0].name}`);\n return schemes[0];\n }\n const resolvedSchemeName = await selectAsync(\n 'Select a scheme',\n schemes.map((value) => {\n const isApp =\n value.type === IOSConfig.Target.TargetType.APPLICATION && value.osType === 'iOS';\n return {\n value: value.name,\n title: isApp ? chalk.bold(value.name) + chalk.gray(' (app)') : value.name,\n };\n }),\n {\n nonInteractiveHelp: `--scheme: argument must be provided with a string in non-interactive mode. Valid choices are: ${schemes.join(\n ', '\n )}`,\n }\n );\n return schemes.find(({ name }) => resolvedSchemeName === name) ?? null;\n }\n // Attempt to match the schemes up so we can open the correct simulator\n return scheme ? schemes.find(({ name }) => name === scheme) || { name: scheme } : null;\n}\n\nexport function getDefaultNativeScheme(\n projectRoot: string,\n options: Pick<Options, 'configuration'>,\n xcodeProject: ProjectInfo\n): NativeSchemeProps {\n // If the resolution failed then we should just use the first runnable scheme that\n // matches the provided configuration.\n const resolvedScheme = profile(IOSConfig.BuildScheme.getRunnableSchemesFromXcodeproj)(\n projectRoot,\n {\n configuration: options.configuration,\n }\n )[0];\n\n // If we couldn't find the scheme, then we'll guess at it,\n // this is needed for cases where the native code hasn't been generated yet.\n if (resolvedScheme) {\n return resolvedScheme;\n }\n return {\n name: path.basename(xcodeProject.name, path.extname(xcodeProject.name)),\n };\n}\n"],"names":["resolveNativeSchemePropsAsync","promptOrQueryNativeSchemeAsync","getDefaultNativeScheme","Log","projectRoot","options","xcodeProject","scheme","configuration","schemes","IOSConfig","BuildScheme","getRunnableSchemesFromXcodeproj","length","CommandError","log","name","resolvedSchemeName","selectAsync","map","value","isApp","type","Target","TargetType","APPLICATION","osType","title","chalk","bold","gray","nonInteractiveHelp","join","find","resolvedScheme","profile","path","basename","extname"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/run/ios/options/resolveNativeScheme.ts"],"sourcesContent":["import { IOSConfig } from '@expo/config-plugins';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { profile } from '../../../utils/profile';\nimport { selectAsync } from '../../../utils/prompts';\nimport { Options, ProjectInfo, XcodeConfiguration } from '../XcodeBuild.types';\n\nconst debug = require('debug')('expo:run:ios:options:resolveNativeScheme') as typeof console.log;\n\ntype NativeSchemeProps = {\n name: string;\n osType?: string;\n};\n\nexport async function resolveNativeSchemePropsAsync(\n projectRoot: string,\n options: Pick<Options, 'scheme' | 'configuration'>,\n xcodeProject: ProjectInfo\n): Promise<NativeSchemeProps> {\n return (\n (await promptOrQueryNativeSchemeAsync(projectRoot, options)) ??\n getDefaultNativeScheme(projectRoot, options, xcodeProject)\n );\n}\n\n/** Resolve the native iOS build `scheme` for a given `configuration`. If the `scheme` isn't provided then the user will be prompted to select one. */\nexport async function promptOrQueryNativeSchemeAsync(\n projectRoot: string,\n { scheme, configuration }: { scheme?: string | boolean; configuration?: XcodeConfiguration }\n): Promise<NativeSchemeProps | null> {\n const schemes = IOSConfig.BuildScheme.getRunnableSchemesFromXcodeproj(projectRoot, {\n configuration,\n });\n if (!schemes.length) {\n throw new CommandError('IOS_MALFORMED', 'No native iOS build schemes found');\n }\n\n if (scheme === true) {\n if (schemes.length === 1) {\n Log.log(`Auto selecting only available scheme: ${schemes[0].name}`);\n return schemes[0];\n }\n const resolvedSchemeName = await selectAsync(\n 'Select a scheme',\n schemes.map((value) => {\n const isApp =\n value.type === IOSConfig.Target.TargetType.APPLICATION && value.osType === 'iOS';\n return {\n value: value.name,\n title: isApp ? chalk.bold(value.name) + chalk.gray(' (app)') : value.name,\n };\n }),\n {\n nonInteractiveHelp: `--scheme: argument must be provided with a string in non-interactive mode. Valid choices are: ${schemes.join(\n ', '\n )}`,\n }\n );\n return schemes.find(({ name }) => resolvedSchemeName === name) ?? null;\n }\n // Attempt to match the schemes up so we can open the correct simulator\n return scheme ? schemes.find(({ name }) => name === scheme) || { name: scheme } : null;\n}\n\nexport function getDefaultNativeScheme(\n projectRoot: string,\n options: Pick<Options, 'configuration'>,\n xcodeProject: Pick<ProjectInfo, 'name'>\n): NativeSchemeProps {\n // If the resolution failed then we should just use the first runnable scheme that\n // matches the provided configuration.\n const resolvedSchemes = profile(IOSConfig.BuildScheme.getRunnableSchemesFromXcodeproj)(\n projectRoot,\n {\n configuration: options.configuration,\n }\n );\n\n // If there are multiple schemes, then the default should be the application.\n if (resolvedSchemes.length > 1) {\n const scheme =\n resolvedSchemes.find(({ type }) => type === IOSConfig.Target.TargetType.APPLICATION) ??\n resolvedSchemes[0];\n debug(`Using default scheme: ${scheme.name}`);\n return scheme;\n }\n\n // If we couldn't find the scheme, then we'll guess at it,\n // this is needed for cases where the native code hasn't been generated yet.\n if (resolvedSchemes[0]) {\n return resolvedSchemes[0];\n }\n return {\n name: path.basename(xcodeProject.name, path.extname(xcodeProject.name)),\n };\n}\n"],"names":["resolveNativeSchemePropsAsync","promptOrQueryNativeSchemeAsync","getDefaultNativeScheme","Log","debug","require","projectRoot","options","xcodeProject","scheme","configuration","schemes","IOSConfig","BuildScheme","getRunnableSchemesFromXcodeproj","length","CommandError","log","name","resolvedSchemeName","selectAsync","map","value","isApp","type","Target","TargetType","APPLICATION","osType","title","chalk","bold","gray","nonInteractiveHelp","join","find","resolvedSchemes","profile","path","basename","extname"],"mappings":"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"}
@@ -6,6 +6,7 @@ exports.runIosAsync = runIosAsync;
6
6
  var _chalk = _interopRequireDefault(require("chalk"));
7
7
  var Log = _interopRequireWildcard(require("../../log"));
8
8
  var _cocoapods = require("../../utils/cocoapods");
9
+ var _nodeEnv = require("../../utils/nodeEnv");
9
10
  var _profile = require("../../utils/profile");
10
11
  var _scheme = require("../../utils/scheme");
11
12
  var _ensureNativeProject = require("../ensureNativeProject");
@@ -42,6 +43,8 @@ function _interopRequireWildcard(obj) {
42
43
  }
43
44
  async function runIosAsync(projectRoot, options) {
44
45
  var ref;
46
+ (0, _nodeEnv).setNodeEnv(options.configuration === "Release" ? "production" : "development");
47
+ require("@expo/env").load(projectRoot);
45
48
  assertPlatform();
46
49
  const install = !!options.install;
47
50
  if (await (0, _ensureNativeProject).ensureNativeProjectAsync(projectRoot, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/run/ios/runIosAsync.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { maybePromptToSyncPodsAsync } from '../../utils/cocoapods';\nimport { profile } from '../../utils/profile';\nimport { getSchemesForIosAsync } from '../../utils/scheme';\nimport { ensureNativeProjectAsync } from '../ensureNativeProject';\nimport { logProjectLogsLocation } from '../hints';\nimport { startBundlerAsync } from '../startBundler';\nimport * as XcodeBuild from './XcodeBuild';\nimport { Options } from './XcodeBuild.types';\nimport { launchAppAsync } from './launchApp';\nimport { resolveOptionsAsync } from './options/resolveOptions';\n\nexport async function runIosAsync(projectRoot: string, options: Options) {\n assertPlatform();\n\n const install = !!options.install;\n\n if ((await ensureNativeProjectAsync(projectRoot, { platform: 'ios', install })) && install) {\n await maybePromptToSyncPodsAsync(projectRoot);\n }\n\n // Resolve the CLI arguments into useable options.\n const props = await resolveOptionsAsync(projectRoot, options);\n\n // Spawn the `xcodebuild` process to create the app binary.\n const buildOutput = await XcodeBuild.buildAsync(props);\n\n // Find the path to the built app binary, this will be used to install the binary\n // on a device.\n const binaryPath = await profile(XcodeBuild.getAppBinaryPath)(buildOutput);\n\n // Start the dev server which creates all of the required info for\n // launching the app on a simulator.\n const manager = await startBundlerAsync(projectRoot, {\n port: props.port,\n headless: !props.shouldStartBundler,\n // If a scheme is specified then use that instead of the package name.\n scheme: (await getSchemesForIosAsync(projectRoot))?.[0],\n });\n\n // Install and launch the app binary on a device.\n await launchAppAsync(binaryPath, manager, {\n isSimulator: props.isSimulator,\n device: props.device,\n shouldStartBundler: props.shouldStartBundler,\n });\n\n // Log the location of the JS logs for the device.\n if (props.shouldStartBundler) {\n logProjectLogsLocation();\n }\n}\n\nfunction assertPlatform() {\n if (process.platform !== 'darwin') {\n Log.exit(\n chalk`iOS apps can only be built on macOS devices. Use {cyan eas build -p ios} to build in the cloud.`\n );\n }\n}\n"],"names":["runIosAsync","Log","XcodeBuild","projectRoot","options","assertPlatform","install","ensureNativeProjectAsync","platform","maybePromptToSyncPodsAsync","props","resolveOptionsAsync","buildOutput","buildAsync","binaryPath","profile","getAppBinaryPath","manager","startBundlerAsync","port","headless","shouldStartBundler","scheme","getSchemesForIosAsync","launchAppAsync","isSimulator","device","logProjectLogsLocation","process","exit","chalk"],"mappings":"AAAA;;;;QAcsBA,WAAW,GAAXA,WAAW;AAdf,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,WAAW,EAAjB;AAC4B,IAAA,UAAuB,WAAvB,uBAAuB,CAAA;AAC1C,IAAA,QAAqB,WAArB,qBAAqB,CAAA;AACP,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AACjB,IAAA,oBAAwB,WAAxB,wBAAwB,CAAA;AAC1B,IAAA,MAAU,WAAV,UAAU,CAAA;AACf,IAAA,aAAiB,WAAjB,iBAAiB,CAAA;AACvCC,IAAAA,UAAU,mCAAM,cAAc,EAApB;AAES,IAAA,UAAa,WAAb,aAAa,CAAA;AACR,IAAA,eAA0B,WAA1B,0BAA0B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEvD,eAAeF,WAAW,CAACG,WAAmB,EAAEC,OAAgB,EAAE;QAyB7D,GAA0C;IAxBpDC,cAAc,EAAE,CAAC;IAEjB,MAAMC,OAAO,GAAG,CAAC,CAACF,OAAO,CAACE,OAAO,AAAC;IAElC,IAAI,AAAC,MAAMC,CAAAA,GAAAA,oBAAwB,AAA2C,CAAA,yBAA3C,CAACJ,WAAW,EAAE;QAAEK,QAAQ,EAAE,KAAK;QAAEF,OAAO;KAAE,CAAC,IAAKA,OAAO,EAAE;QAC1F,MAAMG,CAAAA,GAAAA,UAA0B,AAAa,CAAA,2BAAb,CAACN,WAAW,CAAC,CAAC;KAC/C;IAED,kDAAkD;IAClD,MAAMO,KAAK,GAAG,MAAMC,CAAAA,GAAAA,eAAmB,AAAsB,CAAA,oBAAtB,CAACR,WAAW,EAAEC,OAAO,CAAC,AAAC;IAE9D,2DAA2D;IAC3D,MAAMQ,WAAW,GAAG,MAAMV,UAAU,CAACW,UAAU,CAACH,KAAK,CAAC,AAAC;IAEvD,iFAAiF;IACjF,eAAe;IACf,MAAMI,UAAU,GAAG,MAAMC,CAAAA,GAAAA,QAAO,AAA6B,CAAA,QAA7B,CAACb,UAAU,CAACc,gBAAgB,CAAC,CAACJ,WAAW,CAAC,AAAC;IAE3E,kEAAkE;IAClE,oCAAoC;IACpC,MAAMK,OAAO,GAAG,MAAMC,CAAAA,GAAAA,aAAiB,AAKrC,CAAA,kBALqC,CAACf,WAAW,EAAE;QACnDgB,IAAI,EAAET,KAAK,CAACS,IAAI;QAChBC,QAAQ,EAAE,CAACV,KAAK,CAACW,kBAAkB;QACnC,sEAAsE;QACtEC,MAAM,EAAE,CAAA,GAA0C,GAAzC,MAAMC,CAAAA,GAAAA,OAAqB,AAAa,CAAA,sBAAb,CAACpB,WAAW,CAAC,SAAM,GAA/C,KAAA,CAA+C,GAA/C,GAA0C,AAAE,CAAC,CAAC,CAAC;KACxD,CAAC,AAAC;IAEH,iDAAiD;IACjD,MAAMqB,CAAAA,GAAAA,UAAc,AAIlB,CAAA,eAJkB,CAACV,UAAU,EAAEG,OAAO,EAAE;QACxCQ,WAAW,EAAEf,KAAK,CAACe,WAAW;QAC9BC,MAAM,EAAEhB,KAAK,CAACgB,MAAM;QACpBL,kBAAkB,EAAEX,KAAK,CAACW,kBAAkB;KAC7C,CAAC,CAAC;IAEH,kDAAkD;IAClD,IAAIX,KAAK,CAACW,kBAAkB,EAAE;QAC5BM,CAAAA,GAAAA,MAAsB,AAAE,CAAA,uBAAF,EAAE,CAAC;KAC1B;CACF;AAED,SAAStB,cAAc,GAAG;IACxB,IAAIuB,OAAO,CAACpB,QAAQ,KAAK,QAAQ,EAAE;QACjCP,GAAG,CAAC4B,IAAI,CACNC,MAAK,QAAA,CAAC,+FAA+F,CAAC,CACvG,CAAC;KACH;CACF"}
1
+ {"version":3,"sources":["../../../../src/run/ios/runIosAsync.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { maybePromptToSyncPodsAsync } from '../../utils/cocoapods';\nimport { setNodeEnv } from '../../utils/nodeEnv';\nimport { profile } from '../../utils/profile';\nimport { getSchemesForIosAsync } from '../../utils/scheme';\nimport { ensureNativeProjectAsync } from '../ensureNativeProject';\nimport { logProjectLogsLocation } from '../hints';\nimport { startBundlerAsync } from '../startBundler';\nimport * as XcodeBuild from './XcodeBuild';\nimport { Options } from './XcodeBuild.types';\nimport { launchAppAsync } from './launchApp';\nimport { resolveOptionsAsync } from './options/resolveOptions';\n\nexport async function runIosAsync(projectRoot: string, options: Options) {\n setNodeEnv(options.configuration === 'Release' ? 'production' : 'development');\n require('@expo/env').load(projectRoot);\n\n assertPlatform();\n\n const install = !!options.install;\n\n if ((await ensureNativeProjectAsync(projectRoot, { platform: 'ios', install })) && install) {\n await maybePromptToSyncPodsAsync(projectRoot);\n }\n\n // Resolve the CLI arguments into useable options.\n const props = await resolveOptionsAsync(projectRoot, options);\n\n // Spawn the `xcodebuild` process to create the app binary.\n const buildOutput = await XcodeBuild.buildAsync(props);\n\n // Find the path to the built app binary, this will be used to install the binary\n // on a device.\n const binaryPath = await profile(XcodeBuild.getAppBinaryPath)(buildOutput);\n\n // Start the dev server which creates all of the required info for\n // launching the app on a simulator.\n const manager = await startBundlerAsync(projectRoot, {\n port: props.port,\n headless: !props.shouldStartBundler,\n // If a scheme is specified then use that instead of the package name.\n scheme: (await getSchemesForIosAsync(projectRoot))?.[0],\n });\n\n // Install and launch the app binary on a device.\n await launchAppAsync(binaryPath, manager, {\n isSimulator: props.isSimulator,\n device: props.device,\n shouldStartBundler: props.shouldStartBundler,\n });\n\n // Log the location of the JS logs for the device.\n if (props.shouldStartBundler) {\n logProjectLogsLocation();\n }\n}\n\nfunction assertPlatform() {\n if (process.platform !== 'darwin') {\n Log.exit(\n chalk`iOS apps can only be built on macOS devices. Use {cyan eas build -p ios} to build in the cloud.`\n );\n }\n}\n"],"names":["runIosAsync","Log","XcodeBuild","projectRoot","options","setNodeEnv","configuration","require","load","assertPlatform","install","ensureNativeProjectAsync","platform","maybePromptToSyncPodsAsync","props","resolveOptionsAsync","buildOutput","buildAsync","binaryPath","profile","getAppBinaryPath","manager","startBundlerAsync","port","headless","shouldStartBundler","scheme","getSchemesForIosAsync","launchAppAsync","isSimulator","device","logProjectLogsLocation","process","exit","chalk"],"mappings":"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"}
@@ -72,6 +72,10 @@ async function startBundlerAsync(projectRoot, { port , headless , scheme }) {
72
72
  Log.log(_chalk.default`Waiting on {underline ${url}}`);
73
73
  }
74
74
  }
75
+ if (!options.headless) {
76
+ await devServerManager.watchEnvironmentVariables();
77
+ await devServerManager.bootstrapTypeScriptAsync();
78
+ }
75
79
  return devServerManager;
76
80
  }
77
81
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/run/startBundler.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport * as Log from '../log';\nimport { startInterfaceAsync } from '../start/interface/startInterface';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { isInteractive } from '../utils/interactive';\n\nexport async function startBundlerAsync(\n projectRoot: string,\n {\n port,\n headless,\n scheme,\n }: {\n port: number;\n headless?: boolean;\n scheme?: string;\n }\n): Promise<DevServerManager> {\n const options = {\n port,\n headless,\n devClient: true,\n\n location: {\n scheme,\n },\n };\n\n const devServerManager = new DevServerManager(projectRoot, options);\n\n await devServerManager.startAsync([\n {\n // TODO: Allow swapping this value for another bundler.\n type: 'metro',\n options,\n },\n ]);\n\n // Present the Terminal UI.\n if (!headless && isInteractive()) {\n // Only read the config if we are going to use the results.\n const { exp } = getConfig(projectRoot, {\n // We don't need very many fields here, just use the lightest possible read.\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n await startInterfaceAsync(devServerManager, {\n platforms: exp.platforms ?? [],\n });\n } else {\n // Display the server location in CI...\n const url = devServerManager.getDefaultDevServer()?.getDevServerUrl();\n if (url) {\n Log.log(chalk`Waiting on {underline ${url}}`);\n }\n }\n return devServerManager;\n}\n"],"names":["startBundlerAsync","Log","projectRoot","port","headless","scheme","options","devClient","location","devServerManager","DevServerManager","startAsync","type","isInteractive","exp","getConfig","skipSDKVersionRequirement","skipPlugins","startInterfaceAsync","platforms","url","getDefaultDevServer","getDevServerUrl","log","chalk"],"mappings":"AAAA;;;;QAQsBA,iBAAiB,GAAjBA,iBAAiB;AARb,IAAA,OAAc,WAAd,cAAc,CAAA;AACtB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACqB,IAAA,eAAmC,WAAnC,mCAAmC,CAAA;AACtC,IAAA,iBAAkC,WAAlC,kCAAkC,CAAA;AACrC,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7C,eAAeD,iBAAiB,CACrCE,WAAmB,EACnB,EACEC,IAAI,CAAA,EACJC,QAAQ,CAAA,EACRC,MAAM,CAAA,EAKP,EAC0B;IAC3B,MAAMC,OAAO,GAAG;QACdH,IAAI;QACJC,QAAQ;QACRG,SAAS,EAAE,IAAI;QAEfC,QAAQ,EAAE;YACRH,MAAM;SACP;KACF,AAAC;IAEF,MAAMI,gBAAgB,GAAG,IAAIC,iBAAgB,iBAAA,CAACR,WAAW,EAAEI,OAAO,CAAC,AAAC;IAEpE,MAAMG,gBAAgB,CAACE,UAAU,CAAC;QAChC;YACE,uDAAuD;YACvDC,IAAI,EAAE,OAAO;YACbN,OAAO;SACR;KACF,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,CAACF,QAAQ,IAAIS,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,EAAE;QAChC,2DAA2D;QAC3D,MAAM,EAAEC,GAAG,CAAA,EAAE,GAAGC,CAAAA,GAAAA,OAAS,AAIvB,CAAA,UAJuB,CAACb,WAAW,EAAE;YACrC,4EAA4E;YAC5Ec,yBAAyB,EAAE,IAAI;YAC/BC,WAAW,EAAE,IAAI;SAClB,CAAC,AAAC;YAEUH,UAAa;QAD1B,MAAMI,CAAAA,GAAAA,eAAmB,AAEvB,CAAA,oBAFuB,CAACT,gBAAgB,EAAE;YAC1CU,SAAS,EAAEL,CAAAA,UAAa,GAAbA,GAAG,CAACK,SAAS,YAAbL,UAAa,GAAI,EAAE;SAC/B,CAAC,CAAC;KACJ,MAAM;YAEOL,GAAsC;QADlD,uCAAuC;QACvC,MAAMW,GAAG,GAAGX,CAAAA,GAAsC,GAAtCA,gBAAgB,CAACY,mBAAmB,EAAE,SAAiB,GAAvDZ,KAAAA,CAAuD,GAAvDA,GAAsC,CAAEa,eAAe,EAAE,AAAC;QACtE,IAAIF,GAAG,EAAE;YACPnB,GAAG,CAACsB,GAAG,CAACC,MAAK,QAAA,CAAC,sBAAsB,EAAEJ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;KACF;IACD,OAAOX,gBAAgB,CAAC;CACzB"}
1
+ {"version":3,"sources":["../../../src/run/startBundler.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport * as Log from '../log';\nimport { startInterfaceAsync } from '../start/interface/startInterface';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { isInteractive } from '../utils/interactive';\n\nexport async function startBundlerAsync(\n projectRoot: string,\n {\n port,\n headless,\n scheme,\n }: {\n port: number;\n headless?: boolean;\n scheme?: string;\n }\n): Promise<DevServerManager> {\n const options = {\n port,\n headless,\n devClient: true,\n\n location: {\n scheme,\n },\n };\n\n const devServerManager = new DevServerManager(projectRoot, options);\n\n await devServerManager.startAsync([\n {\n // TODO: Allow swapping this value for another bundler.\n type: 'metro',\n options,\n },\n ]);\n\n // Present the Terminal UI.\n if (!headless && isInteractive()) {\n // Only read the config if we are going to use the results.\n const { exp } = getConfig(projectRoot, {\n // We don't need very many fields here, just use the lightest possible read.\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n await startInterfaceAsync(devServerManager, {\n platforms: exp.platforms ?? [],\n });\n } else {\n // Display the server location in CI...\n const url = devServerManager.getDefaultDevServer()?.getDevServerUrl();\n if (url) {\n Log.log(chalk`Waiting on {underline ${url}}`);\n }\n }\n\n if (!options.headless) {\n await devServerManager.watchEnvironmentVariables();\n await devServerManager.bootstrapTypeScriptAsync();\n }\n\n return devServerManager;\n}\n"],"names":["startBundlerAsync","Log","projectRoot","port","headless","scheme","options","devClient","location","devServerManager","DevServerManager","startAsync","type","isInteractive","exp","getConfig","skipSDKVersionRequirement","skipPlugins","startInterfaceAsync","platforms","url","getDefaultDevServer","getDevServerUrl","log","chalk","watchEnvironmentVariables","bootstrapTypeScriptAsync"],"mappings":"AAAA;;;;QAQsBA,iBAAiB,GAAjBA,iBAAiB;AARb,IAAA,OAAc,WAAd,cAAc,CAAA;AACtB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACqB,IAAA,eAAmC,WAAnC,mCAAmC,CAAA;AACtC,IAAA,iBAAkC,WAAlC,kCAAkC,CAAA;AACrC,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7C,eAAeD,iBAAiB,CACrCE,WAAmB,EACnB,EACEC,IAAI,CAAA,EACJC,QAAQ,CAAA,EACRC,MAAM,CAAA,EAKP,EAC0B;IAC3B,MAAMC,OAAO,GAAG;QACdH,IAAI;QACJC,QAAQ;QACRG,SAAS,EAAE,IAAI;QAEfC,QAAQ,EAAE;YACRH,MAAM;SACP;KACF,AAAC;IAEF,MAAMI,gBAAgB,GAAG,IAAIC,iBAAgB,iBAAA,CAACR,WAAW,EAAEI,OAAO,CAAC,AAAC;IAEpE,MAAMG,gBAAgB,CAACE,UAAU,CAAC;QAChC;YACE,uDAAuD;YACvDC,IAAI,EAAE,OAAO;YACbN,OAAO;SACR;KACF,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,CAACF,QAAQ,IAAIS,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,EAAE;QAChC,2DAA2D;QAC3D,MAAM,EAAEC,GAAG,CAAA,EAAE,GAAGC,CAAAA,GAAAA,OAAS,AAIvB,CAAA,UAJuB,CAACb,WAAW,EAAE;YACrC,4EAA4E;YAC5Ec,yBAAyB,EAAE,IAAI;YAC/BC,WAAW,EAAE,IAAI;SAClB,CAAC,AAAC;YAEUH,UAAa;QAD1B,MAAMI,CAAAA,GAAAA,eAAmB,AAEvB,CAAA,oBAFuB,CAACT,gBAAgB,EAAE;YAC1CU,SAAS,EAAEL,CAAAA,UAAa,GAAbA,GAAG,CAACK,SAAS,YAAbL,UAAa,GAAI,EAAE;SAC/B,CAAC,CAAC;KACJ,MAAM;YAEOL,GAAsC;QADlD,uCAAuC;QACvC,MAAMW,GAAG,GAAGX,CAAAA,GAAsC,GAAtCA,gBAAgB,CAACY,mBAAmB,EAAE,SAAiB,GAAvDZ,KAAAA,CAAuD,GAAvDA,GAAsC,CAAEa,eAAe,EAAE,AAAC;QACtE,IAAIF,GAAG,EAAE;YACPnB,GAAG,CAACsB,GAAG,CAACC,MAAK,QAAA,CAAC,sBAAsB,EAAEJ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;KACF;IAED,IAAI,CAACd,OAAO,CAACF,QAAQ,EAAE;QACrB,MAAMK,gBAAgB,CAACgB,yBAAyB,EAAE,CAAC;QACnD,MAAMhB,gBAAgB,CAACiB,wBAAwB,EAAE,CAAC;KACnD;IAED,OAAOjB,gBAAgB,CAAC;CACzB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/doctor/Prerequisite.ts"],"sourcesContent":["import { CommandError, UnimplementedError } from '../../utils/errors';\nimport { memoize } from '../../utils/fn';\n\n/** An error that is memoized and asserted whenever a Prerequisite.assertAsync is subsequently called. */\nexport class PrerequisiteCommandError extends CommandError {\n constructor(code: string, message: string = '') {\n super(message ? 'VALIDATE_' + code : code, message);\n }\n}\n\nexport class Prerequisite<T = void, TProps = void> {\n /** Memoized results of `assertImplementation` */\n private _assertAsync: (props: TProps) => Promise<T>;\n\n constructor() {\n this._assertAsync = memoize(this.assertImplementation.bind(this));\n }\n\n /** An optional warning to call before running the memoized assertion. */\n protected cachedError?: PrerequisiteCommandError;\n\n /** Reset the assertion memo and warning message. */\n public resetAssertion(props: TProps) {\n this.cachedError = undefined;\n this._assertAsync = memoize(this.assertImplementation.bind(this));\n }\n\n async assertAsync(props: TProps): Promise<T> {\n if (this.cachedError) {\n throw this.cachedError;\n }\n try {\n return await this._assertAsync(props);\n } catch (error) {\n if (error instanceof PrerequisiteCommandError) {\n this.cachedError = error;\n }\n throw error;\n }\n }\n\n /** Exposed for testing. */\n async assertImplementation(props: TProps): Promise<T> {\n throw new UnimplementedError();\n }\n}\n\n/** A prerequisite that is project specific. */\nexport class ProjectPrerequisite extends Prerequisite {\n constructor(protected projectRoot: string) {\n super();\n }\n}\n"],"names":["PrerequisiteCommandError","CommandError","constructor","code","message","Prerequisite","_assertAsync","memoize","assertImplementation","bind","resetAssertion","props","cachedError","undefined","assertAsync","error","UnimplementedError","ProjectPrerequisite","projectRoot"],"mappings":"AAAA;;;;AAAiD,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AAC7C,IAAA,GAAgB,WAAhB,gBAAgB,CAAA;AAGjC,MAAMA,wBAAwB,SAASC,OAAY,aAAA;IACxDC,YAAYC,IAAY,EAAEC,OAAe,GAAG,EAAE,CAAE;QAC9C,KAAK,CAACA,OAAO,GAAG,WAAW,GAAGD,IAAI,GAAGA,IAAI,EAAEC,OAAO,CAAC,CAAC;KACrD;CACF;QAJYJ,wBAAwB,GAAxBA,wBAAwB;AAM9B,MAAMK,YAAY;IAIvBH,aAAc;QACZ,IAAI,CAACI,YAAY,GAAGC,CAAAA,GAAAA,GAAO,AAAsC,CAAA,QAAtC,CAAC,IAAI,CAACC,oBAAoB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACnE;IAKD,oDAAoD,CACpD,AAAOC,cAAc,CAACC,KAAa,EAAE;QACnC,IAAI,CAACC,WAAW,GAAGC,SAAS,CAAC;QAC7B,IAAI,CAACP,YAAY,GAAGC,CAAAA,GAAAA,GAAO,AAAsC,CAAA,QAAtC,CAAC,IAAI,CAACC,oBAAoB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACnE;IAED,MAAMK,WAAW,CAACH,KAAa,EAAc;QAC3C,IAAI,IAAI,CAACC,WAAW,EAAE;YACpB,MAAM,IAAI,CAACA,WAAW,CAAC;SACxB;QACD,IAAI;YACF,OAAO,MAAM,IAAI,CAACN,YAAY,CAACK,KAAK,CAAC,CAAC;SACvC,CAAC,OAAOI,KAAK,EAAE;YACd,IAAIA,KAAK,YAAYf,wBAAwB,EAAE;gBAC7C,IAAI,CAACY,WAAW,GAAGG,KAAK,CAAC;aAC1B;YACD,MAAMA,KAAK,CAAC;SACb;KACF;IAED,2BAA2B,CAC3B,MAAMP,oBAAoB,CAACG,KAAa,EAAc;QACpD,MAAM,IAAIK,OAAkB,mBAAA,EAAE,CAAC;KAChC;CACF;QAnCYX,YAAY,GAAZA,YAAY;AAsClB,MAAMY,mBAAmB,SAASZ,YAAY;IACnDH,YAAsBgB,WAAmB,CAAE;QACzC,KAAK,EAAE,CAAC;aADYA,WAAmB,GAAnBA,WAAmB;KAExC;CACF;QAJYD,mBAAmB,GAAnBA,mBAAmB"}
1
+ {"version":3,"sources":["../../../../src/start/doctor/Prerequisite.ts"],"sourcesContent":["import { CommandError, UnimplementedError } from '../../utils/errors';\nimport { memoize } from '../../utils/fn';\n\n/** An error that is memoized and asserted whenever a Prerequisite.assertAsync is subsequently called. */\nexport class PrerequisiteCommandError extends CommandError {\n constructor(code: string, message: string = '') {\n super(message ? 'VALIDATE_' + code : code, message);\n }\n}\n\nexport class Prerequisite<T = void, TProps = void> {\n /** Memoized results of `assertImplementation` */\n private _assertAsync: (props: TProps) => Promise<T>;\n\n constructor() {\n this._assertAsync = memoize(this.assertImplementation.bind(this));\n }\n\n /** An optional warning to call before running the memoized assertion. */\n protected cachedError?: PrerequisiteCommandError;\n\n /** Reset the assertion memo and warning message. */\n public resetAssertion(props: TProps) {\n this.cachedError = undefined;\n this._assertAsync = memoize(this.assertImplementation.bind(this));\n }\n\n async assertAsync(props: TProps): Promise<T> {\n if (this.cachedError) {\n throw this.cachedError;\n }\n try {\n return await this._assertAsync(props);\n } catch (error) {\n if (error instanceof PrerequisiteCommandError) {\n this.cachedError = error;\n }\n throw error;\n }\n }\n\n /** Exposed for testing. */\n async assertImplementation(props: TProps): Promise<T> {\n throw new UnimplementedError();\n }\n}\n\n/** A prerequisite that is project specific. */\nexport class ProjectPrerequisite<T = void, TProps = void> extends Prerequisite<T, TProps> {\n constructor(protected projectRoot: string) {\n super();\n }\n}\n"],"names":["PrerequisiteCommandError","CommandError","constructor","code","message","Prerequisite","_assertAsync","memoize","assertImplementation","bind","resetAssertion","props","cachedError","undefined","assertAsync","error","UnimplementedError","ProjectPrerequisite","projectRoot"],"mappings":"AAAA;;;;AAAiD,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AAC7C,IAAA,GAAgB,WAAhB,gBAAgB,CAAA;AAGjC,MAAMA,wBAAwB,SAASC,OAAY,aAAA;IACxDC,YAAYC,IAAY,EAAEC,OAAe,GAAG,EAAE,CAAE;QAC9C,KAAK,CAACA,OAAO,GAAG,WAAW,GAAGD,IAAI,GAAGA,IAAI,EAAEC,OAAO,CAAC,CAAC;KACrD;CACF;QAJYJ,wBAAwB,GAAxBA,wBAAwB;AAM9B,MAAMK,YAAY;IAIvBH,aAAc;QACZ,IAAI,CAACI,YAAY,GAAGC,CAAAA,GAAAA,GAAO,AAAsC,CAAA,QAAtC,CAAC,IAAI,CAACC,oBAAoB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACnE;IAKD,oDAAoD,CACpD,AAAOC,cAAc,CAACC,KAAa,EAAE;QACnC,IAAI,CAACC,WAAW,GAAGC,SAAS,CAAC;QAC7B,IAAI,CAACP,YAAY,GAAGC,CAAAA,GAAAA,GAAO,AAAsC,CAAA,QAAtC,CAAC,IAAI,CAACC,oBAAoB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACnE;IAED,MAAMK,WAAW,CAACH,KAAa,EAAc;QAC3C,IAAI,IAAI,CAACC,WAAW,EAAE;YACpB,MAAM,IAAI,CAACA,WAAW,CAAC;SACxB;QACD,IAAI;YACF,OAAO,MAAM,IAAI,CAACN,YAAY,CAACK,KAAK,CAAC,CAAC;SACvC,CAAC,OAAOI,KAAK,EAAE;YACd,IAAIA,KAAK,YAAYf,wBAAwB,EAAE;gBAC7C,IAAI,CAACY,WAAW,GAAGG,KAAK,CAAC;aAC1B;YACD,MAAMA,KAAK,CAAC;SACb;KACF;IAED,2BAA2B,CAC3B,MAAMP,oBAAoB,CAACG,KAAa,EAAc;QACpD,MAAM,IAAIK,OAAkB,mBAAA,EAAE,CAAC;KAChC;CACF;QAnCYX,YAAY,GAAZA,YAAY;AAsClB,MAAMY,mBAAmB,SAAkCZ,YAAY;IAC5EH,YAAsBgB,WAAmB,CAAE;QACzC,KAAK,EAAE,CAAC;aADYA,WAAmB,GAAnBA,WAAmB;KAExC;CACF;QAJYD,mBAAmB,GAAnBA,mBAAmB"}
@@ -41,7 +41,7 @@ function _interopRequireWildcard(obj) {
41
41
  }
42
42
  }
43
43
  async function ensureDependenciesAsync(projectRoot, { exp =(0, _config).getConfig(projectRoot).exp , requiredPackages , warningMessage , installMessage , // Don't prompt in CI
44
- skipPrompt =!(0, _interactive).isInteractive() }) {
44
+ skipPrompt =!(0, _interactive).isInteractive() , isProjectMutable =(0, _interactive).isInteractive() }) {
45
45
  const { missing } = await (0, _getMissingPackages).getMissingPackagesAsync(projectRoot, {
46
46
  sdkVersion: exp.sdkVersion,
47
47
  requiredPackages
@@ -56,13 +56,19 @@ skipPrompt =!(0, _interactive).isInteractive() }) {
56
56
  ].join("@") : pkg
57
57
  ).join(", ");
58
58
  let title = installMessage;
59
- if (skipPrompt) {
59
+ if (skipPrompt && !isProjectMutable) {
60
60
  title += "\n\n";
61
61
  } else {
62
- const confirm = await (0, _prompts).confirmAsync({
63
- message: wrapForTerminal(title + ` Would you like to install ${_chalk.default.cyan(readableMissingPackages)}?`),
64
- initial: true
65
- });
62
+ let confirm = skipPrompt;
63
+ if (skipPrompt) {
64
+ // Automatically install packages without prompting.
65
+ Log.log(wrapForTerminal(title + ` Installing ${_chalk.default.cyan(readableMissingPackages)}`));
66
+ } else {
67
+ confirm = await (0, _prompts).confirmAsync({
68
+ message: wrapForTerminal(title + ` Would you like to install ${_chalk.default.cyan(readableMissingPackages)}?`),
69
+ initial: true
70
+ });
71
+ }
66
72
  if (confirm) {
67
73
  // Format with version if available.
68
74
  const packages = missing.map(({ pkg , version })=>version ? [
@@ -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 { 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';\nimport { getMissingPackagesAsync, ResolvedPackage } from './getMissingPackages';\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 }: {\n exp?: ExpoConfig;\n installMessage: string;\n warningMessage: string;\n requiredPackages: ResolvedPackage[];\n skipPrompt?: 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) {\n title += '\\n\\n';\n } else {\n const confirm = await confirmAsync({\n message: wrapForTerminal(\n title + ` Would you like to install ${chalk.cyan(readableMissingPackages)}?`\n ),\n initial: true,\n });\n\n if (confirm) {\n // Format with version if available.\n const packages = missing.map(({ pkg, version }) =>\n version ? [pkg, version].join('@') : pkg\n );\n // Install packages with versions\n await installPackagesAsync(projectRoot, {\n packages,\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 = createInstallCommand({\n packages: missing,\n });\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 (\n 'npx expo install ' +\n packages\n .map(({ pkg, version }) => {\n if (version) {\n return [pkg, version].join('@');\n }\n return pkg;\n })\n .join(' ')\n );\n}\n\n/** Install packages in the project. */\nasync function installPackagesAsync(projectRoot: string, { packages }: { packages: string[] }) {\n const packagesStr = chalk.bold(packages.join(', '));\n Log.log();\n const installingPackageStep = logNewSection(`Installing ${packagesStr}`);\n try {\n await installAsync(packages, { projectRoot });\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","Log","projectRoot","exp","getConfig","requiredPackages","warningMessage","installMessage","skipPrompt","isInteractive","missing","getMissingPackagesAsync","sdkVersion","length","readableMissingPackages","map","pkg","version","join","title","confirm","confirmAsync","message","wrapForTerminal","chalk","cyan","initial","packages","installPackagesAsync","installCommand","disableMessage","solution","bold","reset","CommandError","wrapAnsi","process","stdout","columns","packagesStr","log","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 { 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';\nimport { getMissingPackagesAsync, ResolvedPackage } from './getMissingPackages';\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 = missing.map(({ pkg, version }) =>\n version ? [pkg, version].join('@') : pkg\n );\n // Install packages with versions\n await installPackagesAsync(projectRoot, {\n packages,\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 = createInstallCommand({\n packages: missing,\n });\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 (\n 'npx expo install ' +\n packages\n .map(({ pkg, version }) => {\n if (version) {\n return [pkg, version].join('@');\n }\n return pkg;\n })\n .join(' ')\n );\n}\n\n/** Install packages in the project. */\nasync function installPackagesAsync(projectRoot: string, { packages }: { packages: string[] }) {\n const packagesStr = chalk.bold(packages.join(', '));\n Log.log();\n const installingPackageStep = logNewSection(`Installing ${packagesStr}`);\n try {\n await installAsync(packages, { projectRoot });\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","Log","projectRoot","exp","getConfig","requiredPackages","warningMessage","installMessage","skipPrompt","isInteractive","isProjectMutable","missing","getMissingPackagesAsync","sdkVersion","length","readableMissingPackages","map","pkg","version","join","title","confirm","log","wrapForTerminal","chalk","cyan","confirmAsync","message","initial","packages","installPackagesAsync","installCommand","disableMessage","solution","bold","reset","CommandError","wrapAnsi","process","stdout","columns","packagesStr","installingPackageStep","logNewSection","installAsync","e","fail","succeed"],"mappings":"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"}
@@ -60,9 +60,7 @@ function logIncorrectDependencies(incorrectDeps) {
60
60
  Log.warn(_chalk.default`Some dependencies are incompatible with the installed {bold expo} version:`);
61
61
  incorrectDeps.forEach((dep)=>logInvalidDependency(dep)
62
62
  );
63
- const requiredVersions = incorrectDeps.map(({ packageName , expectedVersionOrRange })=>`${packageName}@${expectedVersionOrRange}`
64
- );
65
- Log.warn("Your project may not work correctly until you install the correct versions of the packages.\n" + _chalk.default`Install individual packages by running {inverse npx expo install ${requiredVersions.join(" ")}}`);
63
+ Log.warn("Your project may not work correctly until you install the correct versions of the packages.\n" + _chalk.default`Fix with: {bold npx expo install --fix}`);
66
64
  return false;
67
65
  }
68
66
  async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (APISettings.isOffline) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n const requiredVersions = incorrectDeps.map(\n ({ packageName, expectedVersionOrRange }) => `${packageName}@${expectedVersionOrRange}`\n );\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Install individual packages by running {inverse npx expo install ${requiredVersions.join(\n ' '\n )}}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n const incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce((acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n }, {} as Record<string, string>);\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","APISettings","isOffline","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","requiredVersions","map","join","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects","packageType","findDependencyType"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (APISettings.isOffline) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Fix with: {bold npx expo install --fix}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n const incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce((acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n }, {} as Record<string, string>);\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","APISettings","isOffline","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","map","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects","packageType","findDependencyType"],"mappings":"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"}