@expo/cli 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/build/bin/cli +83 -4
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/api/rest/wrapFetchWithOffline.js +2 -23
  4. package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
  5. package/build/src/customize/customizeAsync.js +40 -0
  6. package/build/src/customize/customizeAsync.js.map +1 -0
  7. package/build/src/customize/generate.js +77 -0
  8. package/build/src/customize/generate.js.map +1 -0
  9. package/build/src/customize/index.js +41 -0
  10. package/build/src/customize/index.js.map +1 -0
  11. package/build/src/customize/resolveOptions.js +18 -0
  12. package/build/src/customize/resolveOptions.js.map +1 -0
  13. package/build/src/customize/templates.js +118 -0
  14. package/build/src/customize/templates.js.map +1 -0
  15. package/build/src/export/createMetadataJson.js +10 -7
  16. package/build/src/export/createMetadataJson.js.map +1 -1
  17. package/build/src/export/exportApp.js +32 -0
  18. package/build/src/export/exportApp.js.map +1 -1
  19. package/build/src/export/exportAssets.js +2 -3
  20. package/build/src/export/exportAssets.js.map +1 -1
  21. package/build/src/export/fork-bundleAsync.js +51 -34
  22. package/build/src/export/fork-bundleAsync.js.map +1 -1
  23. package/build/src/export/index.js +14 -10
  24. package/build/src/export/index.js.map +1 -1
  25. package/build/src/export/printBundleSizes.js +27 -48
  26. package/build/src/export/printBundleSizes.js.map +1 -1
  27. package/build/src/export/resolveOptions.js +44 -5
  28. package/build/src/export/resolveOptions.js.map +1 -1
  29. package/build/src/export/saveAssets.js +2 -1
  30. package/build/src/export/saveAssets.js.map +1 -1
  31. package/build/src/export/web/exportWebAsync.js +37 -0
  32. package/build/src/export/web/exportWebAsync.js.map +1 -0
  33. package/build/src/export/web/index.js +66 -0
  34. package/build/src/export/web/index.js.map +1 -0
  35. package/build/src/export/web/resolveOptions.js +13 -0
  36. package/build/src/export/web/resolveOptions.js.map +1 -0
  37. package/build/src/export/writeContents.js.map +1 -1
  38. package/build/src/install/checkPackages.js +2 -1
  39. package/build/src/install/checkPackages.js.map +1 -1
  40. package/build/src/install/index.js +1 -0
  41. package/build/src/install/index.js.map +1 -1
  42. package/build/src/install/installAsync.js +13 -5
  43. package/build/src/install/installAsync.js.map +1 -1
  44. package/build/src/install/resolveOptions.js +12 -65
  45. package/build/src/install/resolveOptions.js.map +1 -1
  46. package/build/src/install/utils/autoAddConfigPlugins.js +5 -26
  47. package/build/src/install/utils/autoAddConfigPlugins.js.map +1 -1
  48. package/build/src/log.js.map +1 -1
  49. package/build/src/prebuild/copyTemplateFiles.js +5 -23
  50. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  51. package/build/src/prebuild/index.js +18 -12
  52. package/build/src/prebuild/index.js.map +1 -1
  53. package/build/src/prebuild/prebuildAsync.js +11 -12
  54. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  55. package/build/src/prebuild/resolveOptions.js +17 -0
  56. package/build/src/prebuild/resolveOptions.js.map +1 -1
  57. package/build/src/prebuild/resolveTemplate.js +2 -1
  58. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  59. package/build/src/prebuild/updatePackageJson.js +5 -5
  60. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  61. package/build/src/run/android/resolveInstallApkName.js +5 -26
  62. package/build/src/run/android/resolveInstallApkName.js.map +1 -1
  63. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js +2 -0
  64. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -1
  65. package/build/src/start/doctor/apple/XcodePrerequisite.js +2 -0
  66. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  67. package/build/src/start/doctor/dependencies/bundledNativeModules.js +3 -2
  68. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  69. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +7 -13
  70. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  71. package/build/src/start/doctor/dependencies/getMissingPackages.js +3 -24
  72. package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -1
  73. package/build/src/start/doctor/dependencies/getVersionedPackages.js +2 -23
  74. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  75. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +17 -9
  76. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  77. package/build/src/start/doctor/ngrok/ExternalModule.js +2 -1
  78. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  79. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +4 -3
  80. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  81. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +29 -31
  82. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  83. package/build/src/start/interface/KeyPressHandler.js +2 -0
  84. package/build/src/start/interface/KeyPressHandler.js.map +1 -1
  85. package/build/src/start/interface/interactiveActions.js +5 -5
  86. package/build/src/start/interface/interactiveActions.js.map +1 -1
  87. package/build/src/start/interface/startInterface.js +3 -2
  88. package/build/src/start/interface/startInterface.js.map +1 -1
  89. package/build/src/start/platforms/ExpoGoInstaller.js +2 -1
  90. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  91. package/build/src/start/platforms/PlatformManager.js +4 -24
  92. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  93. package/build/src/start/platforms/android/ADBServer.js +17 -32
  94. package/build/src/start/platforms/android/ADBServer.js.map +1 -1
  95. package/build/src/start/platforms/android/AndroidSdk.js +41 -0
  96. package/build/src/start/platforms/android/AndroidSdk.js.map +1 -0
  97. package/build/src/start/platforms/android/activateWindow.js +4 -4
  98. package/build/src/start/platforms/android/activateWindow.js.map +1 -1
  99. package/build/src/start/platforms/android/adb.js +8 -3
  100. package/build/src/start/platforms/android/adb.js.map +1 -1
  101. package/build/src/start/platforms/android/adbReverse.js +3 -2
  102. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  103. package/build/src/start/platforms/android/gradle.js +2 -2
  104. package/build/src/start/platforms/android/gradle.js.map +1 -1
  105. package/build/src/start/platforms/ios/getBestSimulator.js +4 -4
  106. package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
  107. package/build/src/start/platforms/ios/xcrun.js +2 -23
  108. package/build/src/start/platforms/ios/xcrun.js.map +1 -1
  109. package/build/src/start/project/devices.js +2 -0
  110. package/build/src/start/project/devices.js.map +1 -1
  111. package/build/src/start/server/AsyncNgrok.js +6 -5
  112. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  113. package/build/src/start/server/BundlerDevServer.js +15 -8
  114. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  115. package/build/src/start/server/DevServerManager.js +15 -5
  116. package/build/src/start/server/DevServerManager.js.map +1 -1
  117. package/build/src/start/server/DevelopmentSession.js +4 -0
  118. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  119. package/build/src/start/server/UrlCreator.js +10 -3
  120. package/build/src/start/server/UrlCreator.js.map +1 -1
  121. package/build/src/start/server/metro/MetroBundlerDevServer.js +9 -0
  122. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  123. package/build/src/start/server/metro/TerminalReporter.js +5 -0
  124. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  125. package/build/src/start/server/metro/instantiateMetro.js +11 -1
  126. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  127. package/build/src/start/server/metro/resolveFromProject.js +8 -0
  128. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  129. package/build/src/start/server/metro/withMetroMultiPlatform.js +115 -0
  130. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -0
  131. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
  132. package/build/src/start/server/middleware/ExpoMiddleware.js +9 -4
  133. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  134. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js +24 -0
  135. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -0
  136. package/build/src/start/server/middleware/InterstitialPageMiddleware.js +2 -0
  137. package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
  138. package/build/src/start/server/middleware/ManifestMiddleware.js +57 -6
  139. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  140. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +6 -1
  141. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  142. package/build/src/start/server/middleware/ServeStaticMiddleware.js +62 -0
  143. package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -0
  144. package/build/src/start/server/platformBundlers.js +18 -0
  145. package/build/src/start/server/platformBundlers.js.map +1 -0
  146. package/build/src/start/server/webTemplate.js +68 -0
  147. package/build/src/start/server/webTemplate.js.map +1 -0
  148. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +59 -19
  149. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  150. package/build/src/start/server/webpack/compile.js +64 -0
  151. package/build/src/start/server/webpack/compile.js.map +1 -0
  152. package/build/src/start/startAsync.js +21 -17
  153. package/build/src/start/startAsync.js.map +1 -1
  154. package/build/src/utils/FileNotifier.js +5 -2
  155. package/build/src/utils/FileNotifier.js.map +1 -1
  156. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  157. package/build/src/utils/downloadAppAsync.js +3 -2
  158. package/build/src/utils/downloadAppAsync.js.map +1 -1
  159. package/build/src/utils/downloadExpoGoAsync.js +7 -32
  160. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  161. package/build/src/utils/editor.js +3 -2
  162. package/build/src/utils/editor.js.map +1 -1
  163. package/build/src/utils/env.js +3 -0
  164. package/build/src/utils/env.js.map +1 -1
  165. package/build/src/utils/exit.js +4 -25
  166. package/build/src/utils/exit.js.map +1 -1
  167. package/build/src/utils/getRunningProcess.js +6 -2
  168. package/build/src/utils/getRunningProcess.js.map +1 -1
  169. package/build/src/utils/nodeModules.js +13 -102
  170. package/build/src/utils/nodeModules.js.map +1 -1
  171. package/build/src/utils/npm.js +3 -24
  172. package/build/src/utils/npm.js.map +1 -1
  173. package/build/src/utils/ora.js +1 -13
  174. package/build/src/utils/ora.js.map +1 -1
  175. package/build/src/utils/progress.js +46 -0
  176. package/build/src/utils/progress.js.map +1 -1
  177. package/build/src/utils/prompts.js +4 -4
  178. package/build/src/utils/prompts.js.map +1 -1
  179. package/build/src/utils/tar.js +3 -0
  180. package/build/src/utils/tar.js.map +1 -1
  181. package/build/src/utils/validateApplicationId.js +9 -2
  182. package/build/src/utils/validateApplicationId.js.map +1 -1
  183. package/build/src/utils/variadic.js +47 -0
  184. package/build/src/utils/variadic.js.map +1 -0
  185. package/package.json +12 -8
  186. package/static/template/babel.config.js +6 -0
  187. package/static/template/index.html +117 -0
  188. package/static/template/metro.config.js +4 -0
  189. package/static/template/serve.json +13 -0
  190. package/static/template/webpack.config.js +7 -0
@@ -46,7 +46,7 @@ function _interopRequireWildcard(obj) {
46
46
  async function updatePackageJSONAsync(projectRoot, { templateDirectory , pkg , skipDependencyUpdate }) {
47
47
  const updatingPackageJsonStep = (0, _ora).logNewSection("Updating your package.json scripts, dependencies, and main file");
48
48
  const templatePkg = (0, _config).getPackageJson(templateDirectory);
49
- const results = _modifyPackageJson(projectRoot, {
49
+ const results = modifyPackageJson(projectRoot, {
50
50
  templatePkg,
51
51
  pkg,
52
52
  skipDependencyUpdate
@@ -72,7 +72,7 @@ async function updatePackageJSONAsync(projectRoot, { templateDirectory , pkg , s
72
72
  * @param props.pkg Current package.json as JSON.
73
73
  * @param props.skipDependencyUpdate Array of dependencies to skip updating.
74
74
  * @returns
75
- */ function _modifyPackageJson(projectRoot, { templatePkg , pkg , skipDependencyUpdate }) {
75
+ */ function modifyPackageJson(projectRoot, { templatePkg , pkg , skipDependencyUpdate }) {
76
76
  updatePkgScripts({
77
77
  pkg
78
78
  });
@@ -101,10 +101,10 @@ function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDepe
101
101
  ...pkg1.dependencies
102
102
  });
103
103
  const requiredDependencies = [
104
+ "expo",
105
+ "expo-splash-screen",
104
106
  "react",
105
- "react-native-unimodules",
106
- "react-native",
107
- "expo-updates",
107
+ "react-native"
108
108
  ].filter((depKey)=>!!defaultDependencies[depKey]
109
109
  );
110
110
  const symlinkedPackages = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/prebuild/updatePackageJson.ts"],"sourcesContent":["import { getPackageJson, PackageJSONConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as Log from '../log';\nimport { isModuleSymlinked } from '../utils/isModuleSymlinked';\nimport { logNewSection } from '../utils/ora';\n\nexport type DependenciesMap = { [key: string]: string | number };\n\nexport type PackageJsonModificationResults = DependenciesModificationResults & {\n removedMainField: string | null;\n};\n\nexport type DependenciesModificationResults = {\n /** Indicates that new values were added to the `dependencies` object in the `package.json`. */\n hasNewDependencies: boolean;\n /** Indicates that new values were added to the `devDependencies` object in the `package.json`. */\n hasNewDevDependencies: boolean;\n};\n\n/** Modifies the `package.json` with `_modifyPackageJson` and format/displays the results. */\nexport async function updatePackageJSONAsync(\n projectRoot: string,\n {\n templateDirectory,\n pkg,\n skipDependencyUpdate,\n }: {\n templateDirectory: string;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): Promise<DependenciesModificationResults> {\n const updatingPackageJsonStep = logNewSection(\n 'Updating your package.json scripts, dependencies, and main file'\n );\n\n const templatePkg = getPackageJson(templateDirectory);\n\n const results = _modifyPackageJson(projectRoot, {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n });\n\n await fs.promises.writeFile(\n path.resolve(projectRoot, 'package.json'),\n // Add new line to match the format of running yarn.\n // This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.\n JSON.stringify(pkg, null, 2) + '\\n'\n );\n\n updatingPackageJsonStep.succeed(\n 'Updated package.json and added index.js entry point for iOS and Android'\n );\n\n if (results.removedMainField) {\n Log.log(\n `\\u203A Removed ${chalk.bold(\n `\"main\": \"${results.removedMainField}\"`\n )} from package.json because we recommend using index.js as main instead\\n`\n );\n }\n\n return results;\n}\n\n/**\n * Make required modifications to the `package.json` file as a JSON object.\n *\n * 1. Update `package.json` `scripts`.\n * 2. Update `package.json` `dependencies` and `devDependencies`.\n * 3. Update `package.json` `main`.\n *\n * @param projectRoot The root directory of the project.\n * @param props.templatePkg Template project package.json as JSON.\n * @param props.pkg Current package.json as JSON.\n * @param props.skipDependencyUpdate Array of dependencies to skip updating.\n * @returns\n */\nfunction _modifyPackageJson(\n projectRoot: string,\n {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n }: {\n templatePkg: PackageJSONConfig;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): PackageJsonModificationResults {\n updatePkgScripts({ pkg });\n\n const results = updatePkgDependencies(projectRoot, {\n pkg,\n templatePkg,\n skipDependencyUpdate,\n });\n\n const removedMainField = updatePkgMain({ pkg });\n\n return { ...results, removedMainField };\n}\n\n/**\n * Update package.json dependencies by combining the dependencies in the project we are ejecting\n * with the dependencies in the template project. Does the same for devDependencies.\n *\n * - The template may have some dependencies beyond react/react-native/react-native-unimodules,\n * for example RNGH and Reanimated. We should prefer the version that is already being used\n * in the project for those, but swap the react/react-native/react-native-unimodules versions\n * with the ones in the template.\n * - The same applies to expo-updates -- since some native project configuration may depend on the\n * version, we should always use the version of expo-updates in the template.\n *\n * > Exposed for testing.\n */\nexport function updatePkgDependencies(\n projectRoot: string,\n {\n pkg,\n templatePkg,\n skipDependencyUpdate = [],\n }: {\n pkg: PackageJSONConfig;\n templatePkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): DependenciesModificationResults {\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n const { dependencies, devDependencies } = templatePkg;\n const defaultDependencies = createDependenciesMap(dependencies);\n const defaultDevDependencies = createDependenciesMap(devDependencies);\n\n const combinedDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDependencies,\n ...pkg.dependencies,\n });\n\n const requiredDependencies = [\n 'react',\n 'react-native-unimodules',\n 'react-native',\n 'expo-updates',\n ].filter((depKey) => !!defaultDependencies[depKey]);\n\n const symlinkedPackages: string[] = [];\n\n for (const dependenciesKey of requiredDependencies) {\n if (\n // If the local package.json defined the dependency that we want to overwrite...\n pkg.dependencies?.[dependenciesKey]\n ) {\n if (\n // Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).\n isModuleSymlinked(projectRoot, { moduleId: dependenciesKey, isSilent: true })\n ) {\n // If the package is in the project's package.json and it's symlinked, then skip overwriting it.\n symlinkedPackages.push(dependenciesKey);\n continue;\n }\n if (skipDependencyUpdate.includes(dependenciesKey)) {\n continue;\n }\n }\n combinedDependencies[dependenciesKey] = defaultDependencies[dependenciesKey];\n }\n\n if (symlinkedPackages.length) {\n Log.log(\n `\\u203A Using symlinked ${symlinkedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')} instead of recommended version(s).`\n );\n }\n\n const combinedDevDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDevDependencies,\n ...pkg.devDependencies,\n });\n\n // Only change the dependencies if the normalized hash changes, this helps to reduce meaningless changes.\n const hasNewDependencies =\n hashForDependencyMap(pkg.dependencies) !== hashForDependencyMap(combinedDependencies);\n const hasNewDevDependencies =\n hashForDependencyMap(pkg.devDependencies) !== hashForDependencyMap(combinedDevDependencies);\n // Save the dependencies\n if (hasNewDependencies) {\n // Use Object.assign to preserve the original order of dependencies, this makes it easier to see what changed in the git diff.\n pkg.dependencies = Object.assign(pkg.dependencies ?? {}, combinedDependencies);\n }\n if (hasNewDevDependencies) {\n // Same as with dependencies\n pkg.devDependencies = Object.assign(pkg.devDependencies ?? {}, combinedDevDependencies);\n }\n\n return {\n hasNewDependencies,\n hasNewDevDependencies,\n };\n}\n\n/**\n * Create an object of type DependenciesMap a dependencies object or throw if not valid.\n *\n * @param dependencies - ideally an object of type {[key]: string} - if not then this will error.\n */\nexport function createDependenciesMap(dependencies: any): DependenciesMap {\n if (typeof dependencies !== 'object') {\n throw new Error(`Dependency map is invalid, expected object but got ${typeof dependencies}`);\n } else if (!dependencies) {\n return {};\n }\n\n const outputMap: DependenciesMap = {};\n\n for (const key of Object.keys(dependencies)) {\n const value = dependencies[key];\n if (typeof value === 'string') {\n outputMap[key] = value;\n } else {\n throw new Error(\n `Dependency for key \\`${key}\\` should be a \\`string\\`, instead got: \\`{ ${key}: ${JSON.stringify(\n value\n )} }\\``\n );\n }\n }\n return outputMap;\n}\n\n/**\n * Update package.json scripts - `npm start` should default to `expo\n * start --dev-client` rather than `expo start` after ejecting, for example.\n */\nfunction updatePkgScripts({ pkg }: { pkg: PackageJSONConfig }) {\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n if (!pkg.scripts.start?.includes('--dev-client')) {\n pkg.scripts.start = 'expo start --dev-client';\n }\n if (!pkg.scripts.android?.includes('run')) {\n pkg.scripts.android = 'expo run:android';\n }\n if (!pkg.scripts.ios?.includes('run')) {\n pkg.scripts.ios = 'expo run:ios';\n }\n}\n\n/**\n * Add new app entry points\n */\nfunction updatePkgMain({ pkg }: { pkg: PackageJSONConfig }): string | null {\n let removedPkgMain: null | string = null;\n // Check that the pkg.main doesn't match:\n // - ./node_modules/expo/AppEntry\n // - ./node_modules/expo/AppEntry.js\n // - node_modules/expo/AppEntry.js\n // - expo/AppEntry.js\n // - expo/AppEntry\n if (shouldDeleteMainField(pkg.main)) {\n // Save the custom\n removedPkgMain = pkg.main;\n delete pkg.main;\n }\n\n return removedPkgMain;\n}\n\n/**\n * Returns true if the input string matches the default expo main field.\n *\n * - ./node_modules/expo/AppEntry\n * - ./node_modules/expo/AppEntry.js\n * - node_modules/expo/AppEntry.js\n * - expo/AppEntry.js\n * - expo/AppEntry\n *\n * @param input package.json main field\n */\nexport function isPkgMainExpoAppEntry(input?: string): boolean {\n const main = input || '';\n if (main.startsWith('./')) {\n return main.includes('node_modules/expo/AppEntry');\n }\n return main.includes('expo/AppEntry');\n}\n\nfunction normalizeDependencyMap(deps: DependenciesMap): string[] {\n return Object.keys(deps)\n .map((dependency) => `${dependency}@${deps[dependency]}`)\n .sort();\n}\n\nexport function hashForDependencyMap(deps: DependenciesMap = {}): string {\n const depsList = normalizeDependencyMap(deps);\n const depsString = depsList.join('\\n');\n return createFileHash(depsString);\n}\n\nexport function createFileHash(contents: string): string {\n // this doesn't need to be secure, the shorter the better.\n return crypto.createHash('sha1').update(contents).digest('hex');\n}\n\nexport function shouldDeleteMainField(main?: any): boolean {\n if (!main || !isPkgMainExpoAppEntry(main)) {\n return false;\n }\n\n return !main?.startsWith('index.');\n}\n"],"names":["updatePackageJSONAsync","updatePkgDependencies","createDependenciesMap","isPkgMainExpoAppEntry","hashForDependencyMap","createFileHash","shouldDeleteMainField","Log","projectRoot","templateDirectory","pkg","skipDependencyUpdate","updatingPackageJsonStep","logNewSection","templatePkg","getPackageJson","results","_modifyPackageJson","fs","promises","writeFile","path","resolve","JSON","stringify","succeed","removedMainField","log","chalk","bold","updatePkgScripts","updatePkgMain","devDependencies","dependencies","defaultDependencies","defaultDevDependencies","combinedDependencies","requiredDependencies","filter","depKey","symlinkedPackages","dependenciesKey","isModuleSymlinked","moduleId","isSilent","push","includes","length","map","join","combinedDevDependencies","hasNewDependencies","hasNewDevDependencies","Object","assign","Error","outputMap","key","keys","value","scripts","start","android","ios","removedPkgMain","main","input","startsWith","normalizeDependencyMap","deps","dependency","sort","depsList","depsString","contents","crypto","createHash","update","digest"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/prebuild/updatePackageJson.ts"],"sourcesContent":["import { getPackageJson, PackageJSONConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as Log from '../log';\nimport { isModuleSymlinked } from '../utils/isModuleSymlinked';\nimport { logNewSection } from '../utils/ora';\n\nexport type DependenciesMap = { [key: string]: string | number };\n\nexport type PackageJsonModificationResults = DependenciesModificationResults & {\n removedMainField: string | null;\n};\n\nexport type DependenciesModificationResults = {\n /** Indicates that new values were added to the `dependencies` object in the `package.json`. */\n hasNewDependencies: boolean;\n /** Indicates that new values were added to the `devDependencies` object in the `package.json`. */\n hasNewDevDependencies: boolean;\n};\n\n/** Modifies the `package.json` with `modifyPackageJson` and format/displays the results. */\nexport async function updatePackageJSONAsync(\n projectRoot: string,\n {\n templateDirectory,\n pkg,\n skipDependencyUpdate,\n }: {\n templateDirectory: string;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): Promise<DependenciesModificationResults> {\n const updatingPackageJsonStep = logNewSection(\n 'Updating your package.json scripts, dependencies, and main file'\n );\n\n const templatePkg = getPackageJson(templateDirectory);\n\n const results = modifyPackageJson(projectRoot, {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n });\n\n await fs.promises.writeFile(\n path.resolve(projectRoot, 'package.json'),\n // Add new line to match the format of running yarn.\n // This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.\n JSON.stringify(pkg, null, 2) + '\\n'\n );\n\n updatingPackageJsonStep.succeed(\n 'Updated package.json and added index.js entry point for iOS and Android'\n );\n\n if (results.removedMainField) {\n Log.log(\n `\\u203A Removed ${chalk.bold(\n `\"main\": \"${results.removedMainField}\"`\n )} from package.json because we recommend using index.js as main instead\\n`\n );\n }\n\n return results;\n}\n\n/**\n * Make required modifications to the `package.json` file as a JSON object.\n *\n * 1. Update `package.json` `scripts`.\n * 2. Update `package.json` `dependencies` and `devDependencies`.\n * 3. Update `package.json` `main`.\n *\n * @param projectRoot The root directory of the project.\n * @param props.templatePkg Template project package.json as JSON.\n * @param props.pkg Current package.json as JSON.\n * @param props.skipDependencyUpdate Array of dependencies to skip updating.\n * @returns\n */\nfunction modifyPackageJson(\n projectRoot: string,\n {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n }: {\n templatePkg: PackageJSONConfig;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): PackageJsonModificationResults {\n updatePkgScripts({ pkg });\n\n const results = updatePkgDependencies(projectRoot, {\n pkg,\n templatePkg,\n skipDependencyUpdate,\n });\n\n const removedMainField = updatePkgMain({ pkg });\n\n return { ...results, removedMainField };\n}\n\n/**\n * Update package.json dependencies by combining the dependencies in the project we are ejecting\n * with the dependencies in the template project. Does the same for devDependencies.\n *\n * - The template may have some dependencies beyond react/react-native/react-native-unimodules,\n * for example RNGH and Reanimated. We should prefer the version that is already being used\n * in the project for those, but swap the react/react-native/react-native-unimodules versions\n * with the ones in the template.\n * - The same applies to expo-updates -- since some native project configuration may depend on the\n * version, we should always use the version of expo-updates in the template.\n *\n * > Exposed for testing.\n */\nexport function updatePkgDependencies(\n projectRoot: string,\n {\n pkg,\n templatePkg,\n skipDependencyUpdate = [],\n }: {\n pkg: PackageJSONConfig;\n templatePkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): DependenciesModificationResults {\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n const { dependencies, devDependencies } = templatePkg;\n const defaultDependencies = createDependenciesMap(dependencies);\n const defaultDevDependencies = createDependenciesMap(devDependencies);\n\n const combinedDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDependencies,\n ...pkg.dependencies,\n });\n\n const requiredDependencies = ['expo', 'expo-splash-screen', 'react', 'react-native'].filter(\n (depKey) => !!defaultDependencies[depKey]\n );\n\n const symlinkedPackages: string[] = [];\n\n for (const dependenciesKey of requiredDependencies) {\n if (\n // If the local package.json defined the dependency that we want to overwrite...\n pkg.dependencies?.[dependenciesKey]\n ) {\n if (\n // Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).\n isModuleSymlinked(projectRoot, { moduleId: dependenciesKey, isSilent: true })\n ) {\n // If the package is in the project's package.json and it's symlinked, then skip overwriting it.\n symlinkedPackages.push(dependenciesKey);\n continue;\n }\n if (skipDependencyUpdate.includes(dependenciesKey)) {\n continue;\n }\n }\n combinedDependencies[dependenciesKey] = defaultDependencies[dependenciesKey];\n }\n\n if (symlinkedPackages.length) {\n Log.log(\n `\\u203A Using symlinked ${symlinkedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')} instead of recommended version(s).`\n );\n }\n\n const combinedDevDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDevDependencies,\n ...pkg.devDependencies,\n });\n\n // Only change the dependencies if the normalized hash changes, this helps to reduce meaningless changes.\n const hasNewDependencies =\n hashForDependencyMap(pkg.dependencies) !== hashForDependencyMap(combinedDependencies);\n const hasNewDevDependencies =\n hashForDependencyMap(pkg.devDependencies) !== hashForDependencyMap(combinedDevDependencies);\n // Save the dependencies\n if (hasNewDependencies) {\n // Use Object.assign to preserve the original order of dependencies, this makes it easier to see what changed in the git diff.\n pkg.dependencies = Object.assign(pkg.dependencies ?? {}, combinedDependencies);\n }\n if (hasNewDevDependencies) {\n // Same as with dependencies\n pkg.devDependencies = Object.assign(pkg.devDependencies ?? {}, combinedDevDependencies);\n }\n\n return {\n hasNewDependencies,\n hasNewDevDependencies,\n };\n}\n\n/**\n * Create an object of type DependenciesMap a dependencies object or throw if not valid.\n *\n * @param dependencies - ideally an object of type {[key]: string} - if not then this will error.\n */\nexport function createDependenciesMap(dependencies: any): DependenciesMap {\n if (typeof dependencies !== 'object') {\n throw new Error(`Dependency map is invalid, expected object but got ${typeof dependencies}`);\n } else if (!dependencies) {\n return {};\n }\n\n const outputMap: DependenciesMap = {};\n\n for (const key of Object.keys(dependencies)) {\n const value = dependencies[key];\n if (typeof value === 'string') {\n outputMap[key] = value;\n } else {\n throw new Error(\n `Dependency for key \\`${key}\\` should be a \\`string\\`, instead got: \\`{ ${key}: ${JSON.stringify(\n value\n )} }\\``\n );\n }\n }\n return outputMap;\n}\n\n/**\n * Update package.json scripts - `npm start` should default to `expo\n * start --dev-client` rather than `expo start` after ejecting, for example.\n */\nfunction updatePkgScripts({ pkg }: { pkg: PackageJSONConfig }) {\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n if (!pkg.scripts.start?.includes('--dev-client')) {\n pkg.scripts.start = 'expo start --dev-client';\n }\n if (!pkg.scripts.android?.includes('run')) {\n pkg.scripts.android = 'expo run:android';\n }\n if (!pkg.scripts.ios?.includes('run')) {\n pkg.scripts.ios = 'expo run:ios';\n }\n}\n\n/**\n * Add new app entry points\n */\nfunction updatePkgMain({ pkg }: { pkg: PackageJSONConfig }): string | null {\n let removedPkgMain: null | string = null;\n // Check that the pkg.main doesn't match:\n // - ./node_modules/expo/AppEntry\n // - ./node_modules/expo/AppEntry.js\n // - node_modules/expo/AppEntry.js\n // - expo/AppEntry.js\n // - expo/AppEntry\n if (shouldDeleteMainField(pkg.main)) {\n // Save the custom\n removedPkgMain = pkg.main;\n delete pkg.main;\n }\n\n return removedPkgMain;\n}\n\n/**\n * Returns true if the input string matches the default expo main field.\n *\n * - ./node_modules/expo/AppEntry\n * - ./node_modules/expo/AppEntry.js\n * - node_modules/expo/AppEntry.js\n * - expo/AppEntry.js\n * - expo/AppEntry\n *\n * @param input package.json main field\n */\nexport function isPkgMainExpoAppEntry(input?: string): boolean {\n const main = input || '';\n if (main.startsWith('./')) {\n return main.includes('node_modules/expo/AppEntry');\n }\n return main.includes('expo/AppEntry');\n}\n\nfunction normalizeDependencyMap(deps: DependenciesMap): string[] {\n return Object.keys(deps)\n .map((dependency) => `${dependency}@${deps[dependency]}`)\n .sort();\n}\n\nexport function hashForDependencyMap(deps: DependenciesMap = {}): string {\n const depsList = normalizeDependencyMap(deps);\n const depsString = depsList.join('\\n');\n return createFileHash(depsString);\n}\n\nexport function createFileHash(contents: string): string {\n // this doesn't need to be secure, the shorter the better.\n return crypto.createHash('sha1').update(contents).digest('hex');\n}\n\nexport function shouldDeleteMainField(main?: any): boolean {\n if (!main || !isPkgMainExpoAppEntry(main)) {\n return false;\n }\n\n return !main?.startsWith('index.');\n}\n"],"names":["updatePackageJSONAsync","updatePkgDependencies","createDependenciesMap","isPkgMainExpoAppEntry","hashForDependencyMap","createFileHash","shouldDeleteMainField","Log","projectRoot","templateDirectory","pkg","skipDependencyUpdate","updatingPackageJsonStep","logNewSection","templatePkg","getPackageJson","results","modifyPackageJson","fs","promises","writeFile","path","resolve","JSON","stringify","succeed","removedMainField","log","chalk","bold","updatePkgScripts","updatePkgMain","devDependencies","dependencies","defaultDependencies","defaultDevDependencies","combinedDependencies","requiredDependencies","filter","depKey","symlinkedPackages","dependenciesKey","isModuleSymlinked","moduleId","isSilent","push","includes","length","map","join","combinedDevDependencies","hasNewDependencies","hasNewDevDependencies","Object","assign","Error","outputMap","key","keys","value","scripts","start","android","ios","removedPkgMain","main","input","startsWith","normalizeDependencyMap","deps","dependency","sort","depsList","depsString","contents","crypto","createHash","update","digest"],"mappings":"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"}
@@ -5,44 +5,23 @@ Object.defineProperty(exports, "__esModule", {
5
5
  exports.resolveInstallApkNameAsync = resolveInstallApkNameAsync;
6
6
  var _fs = _interopRequireDefault(require("fs"));
7
7
  var _path = _interopRequireDefault(require("path"));
8
- var Log = _interopRequireWildcard(require("../../log"));
9
8
  var _adb = require("../../start/platforms/android/adb");
10
9
  function _interopRequireDefault(obj) {
11
10
  return obj && obj.__esModule ? obj : {
12
11
  default: obj
13
12
  };
14
13
  }
15
- function _interopRequireWildcard(obj) {
16
- if (obj && obj.__esModule) {
17
- return obj;
18
- } else {
19
- var newObj = {};
20
- if (obj != null) {
21
- for(var key in obj){
22
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
23
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
24
- if (desc.get || desc.set) {
25
- Object.defineProperty(newObj, key, desc);
26
- } else {
27
- newObj[key] = obj[key];
28
- }
29
- }
30
- }
31
- }
32
- newObj.default = obj;
33
- return newObj;
34
- }
35
- }
14
+ const debug = require("debug")("expo:run:android:resolveInstallApkName");
36
15
  async function resolveInstallApkNameAsync(device, { appName , buildType , flavors , apkVariantDirectory }) {
37
16
  const availableCPUs = await (0, _adb).getDeviceABIsAsync(device);
38
17
  availableCPUs.push(_adb.DeviceABI.universal);
39
- Log.debug("Supported ABIs: " + availableCPUs.join(", "));
40
- Log.debug("Searching for APK: " + apkVariantDirectory);
18
+ debug("Supported ABIs: " + availableCPUs.join(", "));
19
+ debug("Searching for APK: " + apkVariantDirectory);
41
20
  // Check for cpu specific builds first
42
21
  for (const availableCPU of availableCPUs){
43
22
  const apkName = getApkFileName(appName, buildType, flavors, availableCPU);
44
23
  const apkPath = _path.default.join(apkVariantDirectory, apkName);
45
- Log.debug("Checking for APK at:", apkPath);
24
+ debug("Checking for APK at:", apkPath);
46
25
  if (_fs.default.existsSync(apkPath)) {
47
26
  return apkName;
48
27
  }
@@ -50,7 +29,7 @@ async function resolveInstallApkNameAsync(device, { appName , buildType , flavor
50
29
  // Otherwise use the default apk named after the variant: app-debug.apk
51
30
  const apkName = getApkFileName(appName, buildType, flavors);
52
31
  const apkPath = _path.default.join(apkVariantDirectory, apkName);
53
- Log.debug("Checking for fallback APK at:", apkPath);
32
+ debug("Checking for fallback APK at:", apkPath);
54
33
  if (_fs.default.existsSync(apkPath)) {
55
34
  return apkName;
56
35
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/run/android/resolveInstallApkName.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport * as Log from '../../log';\nimport { Device, DeviceABI, getDeviceABIsAsync } from '../../start/platforms/android/adb';\nimport { GradleProps } from './resolveGradleProps';\n\nexport async function resolveInstallApkNameAsync(\n device: Pick<Device, 'name' | 'pid'>,\n { appName, buildType, flavors, apkVariantDirectory }: GradleProps\n) {\n const availableCPUs = await getDeviceABIsAsync(device);\n availableCPUs.push(DeviceABI.universal);\n\n Log.debug('Supported ABIs: ' + availableCPUs.join(', '));\n Log.debug('Searching for APK: ' + apkVariantDirectory);\n\n // Check for cpu specific builds first\n for (const availableCPU of availableCPUs) {\n const apkName = getApkFileName(appName, buildType, flavors, availableCPU);\n const apkPath = path.join(apkVariantDirectory, apkName);\n Log.debug('Checking for APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n }\n\n // Otherwise use the default apk named after the variant: app-debug.apk\n const apkName = getApkFileName(appName, buildType, flavors);\n const apkPath = path.join(apkVariantDirectory, apkName);\n Log.debug('Checking for fallback APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n\n return null;\n}\n\nfunction getApkFileName(\n appName: string,\n buildType: string,\n flavors?: string[] | null,\n cpuArch?: string | null\n) {\n let apkName = `${appName}-`;\n if (flavors) {\n apkName += flavors.reduce((rest, flavor) => `${rest}${flavor}-`, '');\n }\n if (cpuArch) {\n apkName += `${cpuArch}-`;\n }\n apkName += `${buildType}.apk`;\n\n return apkName;\n}\n"],"names":["resolveInstallApkNameAsync","Log","device","appName","buildType","flavors","apkVariantDirectory","availableCPUs","getDeviceABIsAsync","push","DeviceABI","universal","debug","join","availableCPU","apkName","getApkFileName","apkPath","path","fs","existsSync","cpuArch","reduce","rest","flavor"],"mappings":"AAAA;;;;QAOsBA,0BAA0B,GAA1BA,0BAA0B;AAPjC,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEXC,IAAAA,GAAG,mCAAM,WAAW,EAAjB;AACuC,IAAA,IAAmC,WAAnC,mCAAmC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGlF,eAAeD,0BAA0B,CAC9CE,MAAoC,EACpC,EAAEC,OAAO,CAAA,EAAEC,SAAS,CAAA,EAAEC,OAAO,CAAA,EAAEC,mBAAmB,CAAA,EAAe,EACjE;IACA,MAAMC,aAAa,GAAG,MAAMC,CAAAA,GAAAA,IAAkB,AAAQ,CAAA,mBAAR,CAACN,MAAM,CAAC,AAAC;IACvDK,aAAa,CAACE,IAAI,CAACC,IAAS,UAAA,CAACC,SAAS,CAAC,CAAC;IAExCV,GAAG,CAACW,KAAK,CAAC,kBAAkB,GAAGL,aAAa,CAACM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzDZ,GAAG,CAACW,KAAK,CAAC,qBAAqB,GAAGN,mBAAmB,CAAC,CAAC;IAEvD,sCAAsC;IACtC,KAAK,MAAMQ,YAAY,IAAIP,aAAa,CAAE;QACxC,MAAMQ,OAAO,GAAGC,cAAc,CAACb,OAAO,EAAEC,SAAS,EAAEC,OAAO,EAAES,YAAY,CAAC,AAAC;QAC1E,MAAMG,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACP,mBAAmB,EAAES,OAAO,CAAC,AAAC;QACxDd,GAAG,CAACW,KAAK,CAAC,sBAAsB,EAAEK,OAAO,CAAC,CAAC;QAC3C,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;YAC1B,OAAOF,OAAO,CAAC;SAChB;KACF;IAED,uEAAuE;IACvE,MAAMA,OAAO,GAAGC,cAAc,CAACb,OAAO,EAAEC,SAAS,EAAEC,OAAO,CAAC,AAAC;IAC5D,MAAMY,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACP,mBAAmB,EAAES,OAAO,CAAC,AAAC;IACxDd,GAAG,CAACW,KAAK,CAAC,+BAA+B,EAAEK,OAAO,CAAC,CAAC;IACpD,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;QAC1B,OAAOF,OAAO,CAAC;KAChB;IAED,OAAO,IAAI,CAAC;CACb;AAED,SAASC,cAAc,CACrBb,OAAe,EACfC,SAAiB,EACjBC,OAAyB,EACzBgB,OAAuB,EACvB;IACA,IAAIN,OAAO,GAAG,CAAC,EAAEZ,OAAO,CAAC,CAAC,CAAC,AAAC;IAC5B,IAAIE,OAAO,EAAE;QACXU,OAAO,IAAIV,OAAO,CAACiB,MAAM,CAAC,CAACC,IAAI,EAAEC,MAAM,GAAK,CAAC,EAAED,IAAI,CAAC,EAAEC,MAAM,CAAC,CAAC,CAAC;QAAA,EAAE,EAAE,CAAC,CAAC;KACtE;IACD,IAAIH,OAAO,EAAE;QACXN,OAAO,IAAI,CAAC,EAAEM,OAAO,CAAC,CAAC,CAAC,CAAC;KAC1B;IACDN,OAAO,IAAI,CAAC,EAAEX,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAOW,OAAO,CAAC;CAChB"}
1
+ {"version":3,"sources":["../../../../src/run/android/resolveInstallApkName.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { Device, DeviceABI, getDeviceABIsAsync } from '../../start/platforms/android/adb';\nimport { GradleProps } from './resolveGradleProps';\n\nconst debug = require('debug')('expo:run:android:resolveInstallApkName') as typeof console.log;\n\nexport async function resolveInstallApkNameAsync(\n device: Pick<Device, 'name' | 'pid'>,\n { appName, buildType, flavors, apkVariantDirectory }: GradleProps\n) {\n const availableCPUs = await getDeviceABIsAsync(device);\n availableCPUs.push(DeviceABI.universal);\n\n debug('Supported ABIs: ' + availableCPUs.join(', '));\n debug('Searching for APK: ' + apkVariantDirectory);\n\n // Check for cpu specific builds first\n for (const availableCPU of availableCPUs) {\n const apkName = getApkFileName(appName, buildType, flavors, availableCPU);\n const apkPath = path.join(apkVariantDirectory, apkName);\n debug('Checking for APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n }\n\n // Otherwise use the default apk named after the variant: app-debug.apk\n const apkName = getApkFileName(appName, buildType, flavors);\n const apkPath = path.join(apkVariantDirectory, apkName);\n debug('Checking for fallback APK at:', apkPath);\n if (fs.existsSync(apkPath)) {\n return apkName;\n }\n\n return null;\n}\n\nfunction getApkFileName(\n appName: string,\n buildType: string,\n flavors?: string[] | null,\n cpuArch?: string | null\n) {\n let apkName = `${appName}-`;\n if (flavors) {\n apkName += flavors.reduce((rest, flavor) => `${rest}${flavor}-`, '');\n }\n if (cpuArch) {\n apkName += `${cpuArch}-`;\n }\n apkName += `${buildType}.apk`;\n\n return apkName;\n}\n"],"names":["resolveInstallApkNameAsync","debug","require","device","appName","buildType","flavors","apkVariantDirectory","availableCPUs","getDeviceABIsAsync","push","DeviceABI","universal","join","availableCPU","apkName","getApkFileName","apkPath","path","fs","existsSync","cpuArch","reduce","rest","flavor"],"mappings":"AAAA;;;;QAQsBA,0BAA0B,GAA1BA,0BAA0B;AARjC,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAE+B,IAAA,IAAmC,WAAnC,mCAAmC,CAAA;;;;;;AAGzF,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,wCAAwC,CAAC,AAAsB,AAAC;AAExF,eAAeF,0BAA0B,CAC9CG,MAAoC,EACpC,EAAEC,OAAO,CAAA,EAAEC,SAAS,CAAA,EAAEC,OAAO,CAAA,EAAEC,mBAAmB,CAAA,EAAe,EACjE;IACA,MAAMC,aAAa,GAAG,MAAMC,CAAAA,GAAAA,IAAkB,AAAQ,CAAA,mBAAR,CAACN,MAAM,CAAC,AAAC;IACvDK,aAAa,CAACE,IAAI,CAACC,IAAS,UAAA,CAACC,SAAS,CAAC,CAAC;IAExCX,KAAK,CAAC,kBAAkB,GAAGO,aAAa,CAACK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrDZ,KAAK,CAAC,qBAAqB,GAAGM,mBAAmB,CAAC,CAAC;IAEnD,sCAAsC;IACtC,KAAK,MAAMO,YAAY,IAAIN,aAAa,CAAE;QACxC,MAAMO,OAAO,GAAGC,cAAc,CAACZ,OAAO,EAAEC,SAAS,EAAEC,OAAO,EAAEQ,YAAY,CAAC,AAAC;QAC1E,MAAMG,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACN,mBAAmB,EAAEQ,OAAO,CAAC,AAAC;QACxDd,KAAK,CAAC,sBAAsB,EAAEgB,OAAO,CAAC,CAAC;QACvC,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;YAC1B,OAAOF,OAAO,CAAC;SAChB;KACF;IAED,uEAAuE;IACvE,MAAMA,OAAO,GAAGC,cAAc,CAACZ,OAAO,EAAEC,SAAS,EAAEC,OAAO,CAAC,AAAC;IAC5D,MAAMW,OAAO,GAAGC,KAAI,QAAA,CAACL,IAAI,CAACN,mBAAmB,EAAEQ,OAAO,CAAC,AAAC;IACxDd,KAAK,CAAC,+BAA+B,EAAEgB,OAAO,CAAC,CAAC;IAChD,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACH,OAAO,CAAC,EAAE;QAC1B,OAAOF,OAAO,CAAC;KAChB;IAED,OAAO,IAAI,CAAC;CACb;AAED,SAASC,cAAc,CACrBZ,OAAe,EACfC,SAAiB,EACjBC,OAAyB,EACzBe,OAAuB,EACvB;IACA,IAAIN,OAAO,GAAG,CAAC,EAAEX,OAAO,CAAC,CAAC,CAAC,AAAC;IAC5B,IAAIE,OAAO,EAAE;QACXS,OAAO,IAAIT,OAAO,CAACgB,MAAM,CAAC,CAACC,IAAI,EAAEC,MAAM,GAAK,CAAC,EAAED,IAAI,CAAC,EAAEC,MAAM,CAAC,CAAC,CAAC;QAAA,EAAE,EAAE,CAAC,CAAC;KACtE;IACD,IAAIH,OAAO,EAAE;QACXN,OAAO,IAAI,CAAC,EAAEM,OAAO,CAAC,CAAC,CAAC,CAAC;KAC1B;IACDN,OAAO,IAAI,CAAC,EAAEV,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAOU,OAAO,CAAC;CAChB"}
@@ -32,6 +32,7 @@ function _interopRequireWildcard(obj) {
32
32
  return newObj;
33
33
  }
34
34
  }
35
+ const debug = require("debug")("expo:doctor:apple:simulatorApp");
35
36
  async function getSimulatorAppIdAsync() {
36
37
  try {
37
38
  return (await (0, _osascript).execAsync('id of app "Simulator"')).trim();
@@ -51,6 +52,7 @@ class SimulatorAppPrerequisite extends _prerequisite.Prerequisite {
51
52
  if (result !== "com.apple.iphonesimulator" && result !== "com.apple.CoreSimulator.SimulatorTrampoline") {
52
53
  throw new _prerequisite.PrerequisiteCommandError("SIMULATOR_APP", "Simulator is installed but is identified as '" + result + "'; don't know what that is.");
53
54
  }
55
+ debug(`Simulator app id: ${result}`);
54
56
  try {
55
57
  // make sure we can run simctl
56
58
  await (0, _spawnAsync).default("xcrun", [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/apple/SimulatorAppPrerequisite.ts"],"sourcesContent":["import { execAsync } from '@expo/osascript';\nimport spawnAsync from '@expo/spawn-async';\n\nimport * as Log from '../../../log';\nimport { Prerequisite, PrerequisiteCommandError } from '../Prerequisite';\n\nasync function getSimulatorAppIdAsync(): Promise<string | null> {\n try {\n return (await execAsync('id of app \"Simulator\"')).trim();\n } catch {\n // This error may occur in CI where the users intends to install just the simulators but no Xcode.\n }\n return null;\n}\n\nexport class SimulatorAppPrerequisite extends Prerequisite {\n static instance = new SimulatorAppPrerequisite();\n\n async assertImplementation(): Promise<void> {\n const result = await getSimulatorAppIdAsync();\n if (!result) {\n // This error may occur in CI where the users intends to install just the simulators but no Xcode.\n throw new PrerequisiteCommandError(\n 'SIMULATOR_APP',\n \"Can't determine id of Simulator app; the Simulator is most likely not installed on this machine. Run `sudo xcode-select -s /Applications/Xcode.app`\"\n );\n }\n if (\n result !== 'com.apple.iphonesimulator' &&\n result !== 'com.apple.CoreSimulator.SimulatorTrampoline'\n ) {\n throw new PrerequisiteCommandError(\n 'SIMULATOR_APP',\n \"Simulator is installed but is identified as '\" + result + \"'; don't know what that is.\"\n );\n }\n\n try {\n // make sure we can run simctl\n await spawnAsync('xcrun', ['simctl', 'help']);\n } catch (error: any) {\n Log.warn(`Unable to run simctl:\\n${error.toString()}`);\n throw new PrerequisiteCommandError(\n 'SIMCTL',\n 'xcrun is not configured correctly. Ensure `sudo xcode-select --reset` works before running this command again.'\n );\n }\n }\n}\n"],"names":["Log","getSimulatorAppIdAsync","execAsync","trim","SimulatorAppPrerequisite","Prerequisite","instance","assertImplementation","result","PrerequisiteCommandError","spawnAsync","error","warn","toString"],"mappings":"AAAA;;;;AAA0B,IAAA,UAAiB,WAAjB,iBAAiB,CAAA;AACpB,IAAA,WAAmB,kCAAnB,mBAAmB,EAAA;AAE9BA,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACwC,IAAA,aAAiB,WAAjB,iBAAiB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAExE,eAAeC,sBAAsB,GAA2B;IAC9D,IAAI;QACF,OAAO,CAAC,MAAMC,CAAAA,GAAAA,UAAS,AAAyB,CAAA,UAAzB,CAAC,uBAAuB,CAAC,CAAC,CAACC,IAAI,EAAE,CAAC;KAC1D,CAAC,OAAM;IACN,kGAAkG;KACnG;IACD,OAAO,IAAI,CAAC;CACb;AAEM,MAAMC,wBAAwB,SAASC,aAAY,aAAA;IACxD,OAAOC,QAAQ,GAAG,IAAIF,wBAAwB,EAAE,CAAC;IAEjD,MAAMG,oBAAoB,GAAkB;QAC1C,MAAMC,MAAM,GAAG,MAAMP,sBAAsB,EAAE,AAAC;QAC9C,IAAI,CAACO,MAAM,EAAE;YACX,kGAAkG;YAClG,MAAM,IAAIC,aAAwB,yBAAA,CAChC,eAAe,EACf,qJAAqJ,CACtJ,CAAC;SACH;QACD,IACED,MAAM,KAAK,2BAA2B,IACtCA,MAAM,KAAK,6CAA6C,EACxD;YACA,MAAM,IAAIC,aAAwB,yBAAA,CAChC,eAAe,EACf,+CAA+C,GAAGD,MAAM,GAAG,6BAA6B,CACzF,CAAC;SACH;QAED,IAAI;YACF,8BAA8B;YAC9B,MAAME,CAAAA,GAAAA,WAAU,AAA6B,CAAA,QAA7B,CAAC,OAAO,EAAE;gBAAC,QAAQ;gBAAE,MAAM;aAAC,CAAC,CAAC;SAC/C,CAAC,OAAOC,KAAK,EAAO;YACnBX,GAAG,CAACY,IAAI,CAAC,CAAC,uBAAuB,EAAED,KAAK,CAACE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,IAAIJ,aAAwB,yBAAA,CAChC,QAAQ,EACR,gHAAgH,CACjH,CAAC;SACH;KACF;CACF;QAjCYL,wBAAwB,GAAxBA,wBAAwB"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/apple/SimulatorAppPrerequisite.ts"],"sourcesContent":["import { execAsync } from '@expo/osascript';\nimport spawnAsync from '@expo/spawn-async';\n\nimport * as Log from '../../../log';\nimport { Prerequisite, PrerequisiteCommandError } from '../Prerequisite';\n\nconst debug = require('debug')('expo:doctor:apple:simulatorApp') as typeof console.log;\n\nasync function getSimulatorAppIdAsync(): Promise<string | null> {\n try {\n return (await execAsync('id of app \"Simulator\"')).trim();\n } catch {\n // This error may occur in CI where the users intends to install just the simulators but no Xcode.\n }\n return null;\n}\n\nexport class SimulatorAppPrerequisite extends Prerequisite {\n static instance = new SimulatorAppPrerequisite();\n\n async assertImplementation(): Promise<void> {\n const result = await getSimulatorAppIdAsync();\n if (!result) {\n // This error may occur in CI where the users intends to install just the simulators but no Xcode.\n throw new PrerequisiteCommandError(\n 'SIMULATOR_APP',\n \"Can't determine id of Simulator app; the Simulator is most likely not installed on this machine. Run `sudo xcode-select -s /Applications/Xcode.app`\"\n );\n }\n if (\n result !== 'com.apple.iphonesimulator' &&\n result !== 'com.apple.CoreSimulator.SimulatorTrampoline'\n ) {\n throw new PrerequisiteCommandError(\n 'SIMULATOR_APP',\n \"Simulator is installed but is identified as '\" + result + \"'; don't know what that is.\"\n );\n }\n debug(`Simulator app id: ${result}`);\n\n try {\n // make sure we can run simctl\n await spawnAsync('xcrun', ['simctl', 'help']);\n } catch (error: any) {\n Log.warn(`Unable to run simctl:\\n${error.toString()}`);\n throw new PrerequisiteCommandError(\n 'SIMCTL',\n 'xcrun is not configured correctly. Ensure `sudo xcode-select --reset` works before running this command again.'\n );\n }\n }\n}\n"],"names":["Log","debug","require","getSimulatorAppIdAsync","execAsync","trim","SimulatorAppPrerequisite","Prerequisite","instance","assertImplementation","result","PrerequisiteCommandError","spawnAsync","error","warn","toString"],"mappings":"AAAA;;;;AAA0B,IAAA,UAAiB,WAAjB,iBAAiB,CAAA;AACpB,IAAA,WAAmB,kCAAnB,mBAAmB,EAAA;AAE9BA,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACwC,IAAA,aAAiB,WAAjB,iBAAiB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAExE,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,gCAAgC,CAAC,AAAsB,AAAC;AAEvF,eAAeC,sBAAsB,GAA2B;IAC9D,IAAI;QACF,OAAO,CAAC,MAAMC,CAAAA,GAAAA,UAAS,AAAyB,CAAA,UAAzB,CAAC,uBAAuB,CAAC,CAAC,CAACC,IAAI,EAAE,CAAC;KAC1D,CAAC,OAAM;IACN,kGAAkG;KACnG;IACD,OAAO,IAAI,CAAC;CACb;AAEM,MAAMC,wBAAwB,SAASC,aAAY,aAAA;IACxD,OAAOC,QAAQ,GAAG,IAAIF,wBAAwB,EAAE,CAAC;IAEjD,MAAMG,oBAAoB,GAAkB;QAC1C,MAAMC,MAAM,GAAG,MAAMP,sBAAsB,EAAE,AAAC;QAC9C,IAAI,CAACO,MAAM,EAAE;YACX,kGAAkG;YAClG,MAAM,IAAIC,aAAwB,yBAAA,CAChC,eAAe,EACf,qJAAqJ,CACtJ,CAAC;SACH;QACD,IACED,MAAM,KAAK,2BAA2B,IACtCA,MAAM,KAAK,6CAA6C,EACxD;YACA,MAAM,IAAIC,aAAwB,yBAAA,CAChC,eAAe,EACf,+CAA+C,GAAGD,MAAM,GAAG,6BAA6B,CACzF,CAAC;SACH;QACDT,KAAK,CAAC,CAAC,kBAAkB,EAAES,MAAM,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI;YACF,8BAA8B;YAC9B,MAAME,CAAAA,GAAAA,WAAU,AAA6B,CAAA,QAA7B,CAAC,OAAO,EAAE;gBAAC,QAAQ;gBAAE,MAAM;aAAC,CAAC,CAAC;SAC/C,CAAC,OAAOC,KAAK,EAAO;YACnBb,GAAG,CAACc,IAAI,CAAC,CAAC,uBAAuB,EAAED,KAAK,CAACE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,IAAIJ,aAAwB,yBAAA,CAChC,QAAQ,EACR,gHAAgH,CACjH,CAAC;SACH;KACF;CACF;QAlCYL,wBAAwB,GAAxBA,wBAAwB"}
@@ -36,6 +36,7 @@ function _interopRequireWildcard(obj) {
36
36
  return newObj;
37
37
  }
38
38
  }
39
+ const debug = require("debug")("expo:doctor:apple:xcode");
39
40
  // Based on the RN docs (Aug 2020).
40
41
  const MIN_XCODE_VERSION = 9.4;
41
42
  const APP_STORE_ID = "497799835";
@@ -98,6 +99,7 @@ class XcodePrerequisite extends _prerequisite.Prerequisite {
98
99
  * Ensure Xcode is installed and recent enough to be used with Expo.
99
100
  */ async assertImplementation() {
100
101
  const version = (0, _profile).profile(getXcodeVersionAsync)();
102
+ debug(`Xcode version: ${version}`);
101
103
  if (!version) {
102
104
  // Almost certainly Xcode isn't installed.
103
105
  await promptToOpenAppStoreAsync(`Xcode needs to be installed (don't worry, you won't have to use it), would you like to continue to the App Store?`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/apple/XcodePrerequisite.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { AbortCommandError } from '../../../utils/errors';\nimport { profile } from '../../../utils/profile';\nimport { confirmAsync } from '../../../utils/prompts';\nimport { Prerequisite } from '../Prerequisite';\n\n// Based on the RN docs (Aug 2020).\nconst MIN_XCODE_VERSION = 9.4;\nconst APP_STORE_ID = '497799835';\n\nconst SUGGESTED_XCODE_VERSION = `${MIN_XCODE_VERSION}.0`;\n\nconst promptToOpenAppStoreAsync = async (message: string) => {\n // This prompt serves no purpose accept informing the user what to do next, we could just open the App Store but it could be confusing if they don't know what's going on.\n const confirm = await confirmAsync({ initial: true, message });\n if (confirm) {\n Log.log(`Going to the App Store, re-run Expo when Xcode has finished installing.`);\n openAppStore(APP_STORE_ID);\n }\n};\n\n/** Exposed for testing, use `getXcodeVersion` */\nexport const getXcodeVersionAsync = (): string | null | false => {\n try {\n const last = execSync('xcodebuild -version', { stdio: 'pipe' })\n .toString()\n .match(/^Xcode (\\d+\\.\\d+)/)?.[1];\n // Convert to a semver string\n if (last) {\n const version = `${last}.0`;\n\n if (!semver.valid(version)) {\n // Not sure why this would happen, if it does we should add a more confident error message.\n Log.error(`Xcode version is in an unknown format: ${version}`);\n return false;\n }\n\n return version;\n }\n // not sure what's going on\n Log.error(\n 'Unable to check Xcode version. Command ran successfully but no version number was found.'\n );\n } catch {\n // not installed\n }\n return null;\n};\n\n/**\n * Open a link to the App Store. Just link in mobile apps, **never** redirect without prompting first.\n *\n * @param appId\n */\nfunction openAppStore(appId: string) {\n const link = getAppStoreLink(appId);\n execSync(`open ${link}`, { stdio: 'ignore' });\n}\n\nfunction getAppStoreLink(appId: string): string {\n if (process.platform === 'darwin') {\n // TODO: Is there ever a case where the macappstore isn't available on mac?\n return `macappstore://itunes.apple.com/app/id${appId}`;\n }\n return `https://apps.apple.com/us/app/id${appId}`;\n}\n\nexport class XcodePrerequisite extends Prerequisite {\n static instance = new XcodePrerequisite();\n\n /**\n * Ensure Xcode is installed and recent enough to be used with Expo.\n */\n async assertImplementation(): Promise<void> {\n const version = profile(getXcodeVersionAsync)();\n if (!version) {\n // Almost certainly Xcode isn't installed.\n await promptToOpenAppStoreAsync(\n `Xcode needs to be installed (don't worry, you won't have to use it), would you like to continue to the App Store?`\n );\n throw new AbortCommandError();\n }\n\n if (semver.lt(version, SUGGESTED_XCODE_VERSION)) {\n // Xcode version is too old.\n await promptToOpenAppStoreAsync(\n `Xcode (${version}) needs to be updated to at least version ${MIN_XCODE_VERSION}, would you like to continue to the App Store?`\n );\n throw new AbortCommandError();\n }\n }\n}\n"],"names":["Log","MIN_XCODE_VERSION","APP_STORE_ID","SUGGESTED_XCODE_VERSION","promptToOpenAppStoreAsync","message","confirm","confirmAsync","initial","log","openAppStore","getXcodeVersionAsync","execSync","last","stdio","toString","match","version","semver","valid","error","appId","link","getAppStoreLink","process","platform","XcodePrerequisite","Prerequisite","instance","assertImplementation","profile","AbortCommandError","lt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/apple/XcodePrerequisite.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { AbortCommandError } from '../../../utils/errors';\nimport { profile } from '../../../utils/profile';\nimport { confirmAsync } from '../../../utils/prompts';\nimport { Prerequisite } from '../Prerequisite';\n\nconst debug = require('debug')('expo:doctor:apple:xcode') as typeof console.log;\n\n// Based on the RN docs (Aug 2020).\nconst MIN_XCODE_VERSION = 9.4;\nconst APP_STORE_ID = '497799835';\n\nconst SUGGESTED_XCODE_VERSION = `${MIN_XCODE_VERSION}.0`;\n\nconst promptToOpenAppStoreAsync = async (message: string) => {\n // This prompt serves no purpose accept informing the user what to do next, we could just open the App Store but it could be confusing if they don't know what's going on.\n const confirm = await confirmAsync({ initial: true, message });\n if (confirm) {\n Log.log(`Going to the App Store, re-run Expo when Xcode has finished installing.`);\n openAppStore(APP_STORE_ID);\n }\n};\n\n/** Exposed for testing, use `getXcodeVersion` */\nexport const getXcodeVersionAsync = (): string | null | false => {\n try {\n const last = execSync('xcodebuild -version', { stdio: 'pipe' })\n .toString()\n .match(/^Xcode (\\d+\\.\\d+)/)?.[1];\n // Convert to a semver string\n if (last) {\n const version = `${last}.0`;\n\n if (!semver.valid(version)) {\n // Not sure why this would happen, if it does we should add a more confident error message.\n Log.error(`Xcode version is in an unknown format: ${version}`);\n return false;\n }\n\n return version;\n }\n // not sure what's going on\n Log.error(\n 'Unable to check Xcode version. Command ran successfully but no version number was found.'\n );\n } catch {\n // not installed\n }\n return null;\n};\n\n/**\n * Open a link to the App Store. Just link in mobile apps, **never** redirect without prompting first.\n *\n * @param appId\n */\nfunction openAppStore(appId: string) {\n const link = getAppStoreLink(appId);\n execSync(`open ${link}`, { stdio: 'ignore' });\n}\n\nfunction getAppStoreLink(appId: string): string {\n if (process.platform === 'darwin') {\n // TODO: Is there ever a case where the macappstore isn't available on mac?\n return `macappstore://itunes.apple.com/app/id${appId}`;\n }\n return `https://apps.apple.com/us/app/id${appId}`;\n}\n\nexport class XcodePrerequisite extends Prerequisite {\n static instance = new XcodePrerequisite();\n\n /**\n * Ensure Xcode is installed and recent enough to be used with Expo.\n */\n async assertImplementation(): Promise<void> {\n const version = profile(getXcodeVersionAsync)();\n debug(`Xcode version: ${version}`);\n if (!version) {\n // Almost certainly Xcode isn't installed.\n await promptToOpenAppStoreAsync(\n `Xcode needs to be installed (don't worry, you won't have to use it), would you like to continue to the App Store?`\n );\n throw new AbortCommandError();\n }\n\n if (semver.lt(version, SUGGESTED_XCODE_VERSION)) {\n // Xcode version is too old.\n await promptToOpenAppStoreAsync(\n `Xcode (${version}) needs to be updated to at least version ${MIN_XCODE_VERSION}, would you like to continue to the App Store?`\n );\n throw new AbortCommandError();\n }\n }\n}\n"],"names":["Log","debug","require","MIN_XCODE_VERSION","APP_STORE_ID","SUGGESTED_XCODE_VERSION","promptToOpenAppStoreAsync","message","confirm","confirmAsync","initial","log","openAppStore","getXcodeVersionAsync","execSync","last","stdio","toString","match","version","semver","valid","error","appId","link","getAppStoreLink","process","platform","XcodePrerequisite","Prerequisite","instance","assertImplementation","profile","AbortCommandError","lt"],"mappings":"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"}
@@ -36,16 +36,17 @@ function _interopRequireWildcard(obj) {
36
36
  return newObj;
37
37
  }
38
38
  }
39
+ const debug = require("debug")("expo:doctor:dependencies:bundledNativeModules");
39
40
  async function getVersionedNativeModulesAsync(projectRoot, sdkVersion) {
40
41
  if (sdkVersion !== "UNVERSIONED" && !_settings.APISettings.isOffline) {
41
42
  try {
42
- Log.debug("Fetching bundled native modules from the server...");
43
+ debug("Fetching bundled native modules from the server...");
43
44
  return await (0, _getNativeModuleVersions).getNativeModuleVersionsAsync(sdkVersion);
44
45
  } catch {
45
46
  Log.warn(_chalk.default`Unable to reach Expo servers. Falling back to using the cached dependency map ({bold bundledNativeModules.json}) from the package "{bold expo}" installed in your project.`);
46
47
  }
47
48
  }
48
- Log.debug("Fetching bundled native modules from the local JSON file...");
49
+ debug("Fetching bundled native modules from the local JSON file...");
49
50
  return await getBundledNativeModulesAsync(projectRoot);
50
51
  }
51
52
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/bundledNativeModules.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\n\nimport { getNativeModuleVersionsAsync } from '../../../api/getNativeModuleVersions';\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\n\nexport type BundledNativeModules = Record<string, string>;\n\n/**\n * Gets the bundledNativeModules.json for a given SDK version:\n * - Tries to fetch the data from the /sdks/:sdkVersion/native-modules API endpoint.\n * - If the data is missing on the server (it can happen for SDKs that are yet fully released)\n * or there's a downtime, reads the local .json file from the \"expo\" package.\n * - For UNVERSIONED, returns the local .json file contents.\n */\nexport async function getVersionedNativeModulesAsync(\n projectRoot: string,\n sdkVersion: string\n): Promise<BundledNativeModules> {\n if (sdkVersion !== 'UNVERSIONED' && !APISettings.isOffline) {\n try {\n Log.debug('Fetching bundled native modules from the server...');\n return await getNativeModuleVersionsAsync(sdkVersion);\n } catch {\n Log.warn(\n chalk`Unable to reach Expo servers. Falling back to using the cached dependency map ({bold bundledNativeModules.json}) from the package \"{bold expo}\" installed in your project.`\n );\n }\n }\n\n Log.debug('Fetching bundled native modules from the local JSON file...');\n return await getBundledNativeModulesAsync(projectRoot);\n}\n\n/**\n * Get the legacy static `bundledNativeModules.json` file\n * that's shipped with the version of `expo` that the project has installed.\n */\nasync function getBundledNativeModulesAsync(projectRoot: string): Promise<BundledNativeModules> {\n // TODO: Revisit now that this code is in the `expo` package.\n const bundledNativeModulesPath = resolveFrom.silent(\n projectRoot,\n 'expo/bundledNativeModules.json'\n );\n if (!bundledNativeModulesPath) {\n Log.log();\n throw new CommandError(\n chalk`The dependency map {bold expo/bundledNativeModules.json} cannot be found, please ensure you have the package \"{bold expo}\" installed in your project.`\n );\n }\n return await JsonFile.readAsync<BundledNativeModules>(bundledNativeModulesPath);\n}\n"],"names":["getVersionedNativeModulesAsync","Log","projectRoot","sdkVersion","APISettings","isOffline","debug","getNativeModuleVersionsAsync","warn","chalk","getBundledNativeModulesAsync","bundledNativeModulesPath","resolveFrom","silent","log","CommandError","JsonFile","readAsync"],"mappings":"AAAA;;;;QAkBsBA,8BAA8B,GAA9BA,8BAA8B;AAlB/B,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACpB,IAAA,MAAO,kCAAP,OAAO,EAAA;AACD,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEO,IAAA,wBAAsC,WAAtC,sCAAsC,CAAA;AACvD,IAAA,SAAuB,WAAvB,uBAAuB,CAAA;AACvCC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACc,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAW7C,eAAeD,8BAA8B,CAClDE,WAAmB,EACnBC,UAAkB,EACa;IAC/B,IAAIA,UAAU,KAAK,aAAa,IAAI,CAACC,SAAW,YAAA,CAACC,SAAS,EAAE;QAC1D,IAAI;YACFJ,GAAG,CAACK,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAChE,OAAO,MAAMC,CAAAA,GAAAA,wBAA4B,AAAY,CAAA,6BAAZ,CAACJ,UAAU,CAAC,CAAC;SACvD,CAAC,OAAM;YACNF,GAAG,CAACO,IAAI,CACNC,MAAK,QAAA,CAAC,0KAA0K,CAAC,CAClL,CAAC;SACH;KACF;IAEDR,GAAG,CAACK,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACzE,OAAO,MAAMI,4BAA4B,CAACR,WAAW,CAAC,CAAC;CACxD;AAED;;;GAGG,CACH,eAAeQ,4BAA4B,CAACR,WAAmB,EAAiC;IAC9F,6DAA6D;IAC7D,MAAMS,wBAAwB,GAAGC,YAAW,QAAA,CAACC,MAAM,CACjDX,WAAW,EACX,gCAAgC,CACjC,AAAC;IACF,IAAI,CAACS,wBAAwB,EAAE;QAC7BV,GAAG,CAACa,GAAG,EAAE,CAAC;QACV,MAAM,IAAIC,OAAY,aAAA,CACpBN,MAAK,QAAA,CAAC,qJAAqJ,CAAC,CAC7J,CAAC;KACH;IACD,OAAO,MAAMO,SAAQ,QAAA,CAACC,SAAS,CAAuBN,wBAAwB,CAAC,CAAC;CACjF"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/bundledNativeModules.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\n\nimport { getNativeModuleVersionsAsync } from '../../../api/getNativeModuleVersions';\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')(\n 'expo:doctor:dependencies:bundledNativeModules'\n) as typeof console.log;\n\nexport type BundledNativeModules = Record<string, string>;\n\n/**\n * Gets the bundledNativeModules.json for a given SDK version:\n * - Tries to fetch the data from the /sdks/:sdkVersion/native-modules API endpoint.\n * - If the data is missing on the server (it can happen for SDKs that are yet fully released)\n * or there's a downtime, reads the local .json file from the \"expo\" package.\n * - For UNVERSIONED, returns the local .json file contents.\n */\nexport async function getVersionedNativeModulesAsync(\n projectRoot: string,\n sdkVersion: string\n): Promise<BundledNativeModules> {\n if (sdkVersion !== 'UNVERSIONED' && !APISettings.isOffline) {\n try {\n debug('Fetching bundled native modules from the server...');\n return await getNativeModuleVersionsAsync(sdkVersion);\n } catch {\n Log.warn(\n chalk`Unable to reach Expo servers. Falling back to using the cached dependency map ({bold bundledNativeModules.json}) from the package \"{bold expo}\" installed in your project.`\n );\n }\n }\n\n debug('Fetching bundled native modules from the local JSON file...');\n return await getBundledNativeModulesAsync(projectRoot);\n}\n\n/**\n * Get the legacy static `bundledNativeModules.json` file\n * that's shipped with the version of `expo` that the project has installed.\n */\nasync function getBundledNativeModulesAsync(projectRoot: string): Promise<BundledNativeModules> {\n // TODO: Revisit now that this code is in the `expo` package.\n const bundledNativeModulesPath = resolveFrom.silent(\n projectRoot,\n 'expo/bundledNativeModules.json'\n );\n if (!bundledNativeModulesPath) {\n Log.log();\n throw new CommandError(\n chalk`The dependency map {bold expo/bundledNativeModules.json} cannot be found, please ensure you have the package \"{bold expo}\" installed in your project.`\n );\n }\n return await JsonFile.readAsync<BundledNativeModules>(bundledNativeModulesPath);\n}\n"],"names":["getVersionedNativeModulesAsync","Log","debug","require","projectRoot","sdkVersion","APISettings","isOffline","getNativeModuleVersionsAsync","warn","chalk","getBundledNativeModulesAsync","bundledNativeModulesPath","resolveFrom","silent","log","CommandError","JsonFile","readAsync"],"mappings":"AAAA;;;;QAsBsBA,8BAA8B,GAA9BA,8BAA8B;AAtB/B,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACpB,IAAA,MAAO,kCAAP,OAAO,EAAA;AACD,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEO,IAAA,wBAAsC,WAAtC,sCAAsC,CAAA;AACvD,IAAA,SAAuB,WAAvB,uBAAuB,CAAA;AACvCC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACc,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpD,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAC5B,+CAA+C,CAChD,AAAsB,AAAC;AAWjB,eAAeH,8BAA8B,CAClDI,WAAmB,EACnBC,UAAkB,EACa;IAC/B,IAAIA,UAAU,KAAK,aAAa,IAAI,CAACC,SAAW,YAAA,CAACC,SAAS,EAAE;QAC1D,IAAI;YACFL,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC5D,OAAO,MAAMM,CAAAA,GAAAA,wBAA4B,AAAY,CAAA,6BAAZ,CAACH,UAAU,CAAC,CAAC;SACvD,CAAC,OAAM;YACNJ,GAAG,CAACQ,IAAI,CACNC,MAAK,QAAA,CAAC,0KAA0K,CAAC,CAClL,CAAC;SACH;KACF;IAEDR,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACrE,OAAO,MAAMS,4BAA4B,CAACP,WAAW,CAAC,CAAC;CACxD;AAED;;;GAGG,CACH,eAAeO,4BAA4B,CAACP,WAAmB,EAAiC;IAC9F,6DAA6D;IAC7D,MAAMQ,wBAAwB,GAAGC,YAAW,QAAA,CAACC,MAAM,CACjDV,WAAW,EACX,gCAAgC,CACjC,AAAC;IACF,IAAI,CAACQ,wBAAwB,EAAE;QAC7BX,GAAG,CAACc,GAAG,EAAE,CAAC;QACV,MAAM,IAAIC,OAAY,aAAA,CACpBN,MAAK,QAAA,CAAC,qJAAqJ,CAAC,CAC7J,CAAC;KACH;IACD,OAAO,MAAMO,SAAQ,QAAA,CAACC,SAAS,CAAuBN,wBAAwB,CAAC,CAAC;CACjF"}
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  exports.ensureDependenciesAsync = ensureDependenciesAsync;
6
6
  exports.createInstallCommand = createInstallCommand;
7
7
  var _config = require("@expo/config");
8
- var PackageManager = _interopRequireWildcard(require("@expo/package-manager"));
9
8
  var _chalk = _interopRequireDefault(require("chalk"));
10
9
  var _wrapAnsi = _interopRequireDefault(require("wrap-ansi"));
10
+ var _installAsync = require("../../../install/installAsync");
11
11
  var Log = _interopRequireWildcard(require("../../../log"));
12
12
  var _env = require("../../../utils/env");
13
13
  var _errors = require("../../../utils/errors");
@@ -55,7 +55,6 @@ skipPrompt =_env.env.CI }) {
55
55
  version
56
56
  ].join("@") : pkg
57
57
  ).join(", ");
58
- const isYarn = PackageManager.isUsingYarn(projectRoot);
59
58
  let title = installMessage;
60
59
  if (skipPrompt) {
61
60
  title += "\n\n";
@@ -73,7 +72,6 @@ skipPrompt =_env.env.CI }) {
73
72
  );
74
73
  // Install packages with versions
75
74
  await installPackagesAsync(projectRoot, {
76
- isYarn,
77
75
  packages
78
76
  });
79
77
  // Try again but skip prompting twice, simply fail if the packages didn't install correctly.
@@ -88,7 +86,6 @@ skipPrompt =_env.env.CI }) {
88
86
  title = "";
89
87
  }
90
88
  const installCommand = createInstallCommand({
91
- isYarn,
92
89
  packages: missing
93
90
  });
94
91
  const disableMessage = warningMessage;
@@ -99,8 +96,8 @@ skipPrompt =_env.env.CI }) {
99
96
  /** Wrap long messages to fit smaller terminals. */ function wrapForTerminal(message) {
100
97
  return (0, _wrapAnsi).default(message, process.stdout.columns || 80);
101
98
  }
102
- function createInstallCommand({ isYarn , packages }) {
103
- return (isYarn ? "yarn add" : "npm install") + " " + packages.map(({ pkg , version })=>{
99
+ function createInstallCommand({ packages }) {
100
+ return "npx expo install " + packages.map(({ pkg , version })=>{
104
101
  if (version) {
105
102
  return [
106
103
  pkg,
@@ -110,17 +107,14 @@ function createInstallCommand({ isYarn , packages }) {
110
107
  return pkg;
111
108
  }).join(" ");
112
109
  }
113
- /** Install packages in the project. */ async function installPackagesAsync(projectRoot, { isYarn , packages }) {
114
- const packageManager = PackageManager.createForProject(projectRoot, {
115
- yarn: isYarn,
116
- log: Log.log,
117
- silent: !_env.env.EXPO_DEBUG
118
- });
110
+ /** Install packages in the project. */ async function installPackagesAsync(projectRoot, { packages }) {
119
111
  const packagesStr = _chalk.default.bold(packages.join(", "));
120
112
  Log.log();
121
113
  const installingPackageStep = (0, _ora).logNewSection(`Installing ${packagesStr}`);
122
114
  try {
123
- await packageManager.addAsync(...packages);
115
+ await (0, _installAsync).installAsync(packages, {
116
+ projectRoot
117
+ });
124
118
  } catch (e) {
125
119
  installingPackageStep.fail(`Failed to install ${packagesStr} with error: ${e.message}`);
126
120
  throw e;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/ensureDependenciesAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport * as PackageManager from '@expo/package-manager';\nimport chalk from 'chalk';\nimport wrapAnsi from 'wrap-ansi';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\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 = env.CI,\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 const isYarn = PackageManager.isUsingYarn(projectRoot);\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 isYarn,\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({ isYarn, packages: missing });\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 isYarn,\n packages,\n}: {\n isYarn: boolean;\n packages: {\n file: string;\n pkg: string;\n version?: string | undefined;\n }[];\n}) {\n return (\n (isYarn ? 'yarn add' : 'npm install') +\n ' ' +\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(\n projectRoot: string,\n { isYarn, packages }: { isYarn: boolean; packages: string[] }\n) {\n const packageManager = PackageManager.createForProject(projectRoot, {\n yarn: isYarn,\n log: Log.log,\n silent: !env.EXPO_DEBUG,\n });\n\n const packagesStr = chalk.bold(packages.join(', '));\n Log.log();\n const installingPackageStep = logNewSection(`Installing ${packagesStr}`);\n try {\n await packageManager.addAsync(...packages);\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","PackageManager","Log","projectRoot","exp","getConfig","requiredPackages","warningMessage","installMessage","skipPrompt","env","CI","missing","getMissingPackagesAsync","sdkVersion","length","readableMissingPackages","map","pkg","version","join","isYarn","isUsingYarn","title","confirm","confirmAsync","message","wrapForTerminal","chalk","cyan","initial","packages","installPackagesAsync","installCommand","disableMessage","solution","bold","reset","CommandError","wrapAnsi","process","stdout","columns","packageManager","createForProject","yarn","log","silent","EXPO_DEBUG","packagesStr","installingPackageStep","logNewSection","addAsync","e","fail","succeed"],"mappings":"AAAA;;;;QAYsBA,uBAAuB,GAAvBA,uBAAuB;QAqF7BC,oBAAoB,GAApBA,oBAAoB;AAjGE,IAAA,OAAc,WAAd,cAAc,CAAA;AACxCC,IAAAA,cAAc,mCAAM,uBAAuB,EAA7B;AACR,IAAA,MAAO,kCAAP,OAAO,EAAA;AACJ,IAAA,SAAW,kCAAX,WAAW,EAAA;AAEpBC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACK,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACX,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;AACtB,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACrB,IAAA,QAAwB,WAAxB,wBAAwB,CAAA;AACI,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAExE,eAAeH,uBAAuB,CAC3CI,WAAmB,EACnB,EACEC,GAAG,EAAGC,CAAAA,GAAAA,OAAS,AAAa,CAAA,UAAb,CAACF,WAAW,CAAC,CAACC,GAAG,CAAA,EAChCE,gBAAgB,CAAA,EAChBC,cAAc,CAAA,EACdC,cAAc,CAAA,EACd,qBAAqB;AACrBC,UAAU,EAAGC,IAAG,IAAA,CAACC,EAAE,CAAA,EAOpB,EACiB;IAClB,MAAM,EAAEC,OAAO,CAAA,EAAE,GAAG,MAAMC,CAAAA,GAAAA,mBAAuB,AAG/C,CAAA,wBAH+C,CAACV,WAAW,EAAE;QAC7DW,UAAU,EAAEV,GAAG,CAACU,UAAU;QAC1BR,gBAAgB;KACjB,CAAC,AAAC;IACH,IAAI,CAACM,OAAO,CAACG,MAAM,EAAE;QACnB,OAAO,IAAI,CAAC;KACb;IAED,mCAAmC;IACnC,MAAMC,uBAAuB,GAAGJ,OAAO,CACpCK,GAAG,CAAC,CAAC,EAAEC,GAAG,CAAA,EAAEC,OAAO,CAAA,EAAE,GAAMA,OAAO,GAAG;YAACD,GAAG;YAAEC,OAAO;SAAC,CAACC,IAAI,CAAC,GAAG,CAAC,GAAGF,GAAG;IAAC,CAAC,CACrEE,IAAI,CAAC,IAAI,CAAC,AAAC;IAEd,MAAMC,MAAM,GAAGpB,cAAc,CAACqB,WAAW,CAACnB,WAAW,CAAC,AAAC;IAEvD,IAAIoB,KAAK,GAAGf,cAAc,AAAC;IAE3B,IAAIC,UAAU,EAAE;QACdc,KAAK,IAAI,MAAM,CAAC;KACjB,MAAM;QACL,MAAMC,OAAO,GAAG,MAAMC,CAAAA,GAAAA,QAAY,AAKhC,CAAA,aALgC,CAAC;YACjCC,OAAO,EAAEC,eAAe,CACtBJ,KAAK,GAAG,CAAC,2BAA2B,EAAEK,MAAK,QAAA,CAACC,IAAI,CAACb,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAC7E;YACDc,OAAO,EAAE,IAAI;SACd,CAAC,AAAC;QAEH,IAAIN,OAAO,EAAE;YACX,oCAAoC;YACpC,MAAMO,QAAQ,GAAGnB,OAAO,CAACK,GAAG,CAAC,CAAC,EAAEC,GAAG,CAAA,EAAEC,OAAO,CAAA,EAAE,GAC5CA,OAAO,GAAG;oBAACD,GAAG;oBAAEC,OAAO;iBAAC,CAACC,IAAI,CAAC,GAAG,CAAC,GAAGF,GAAG;YAAA,CACzC,AAAC;YACF,iCAAiC;YACjC,MAAMc,oBAAoB,CAAC7B,WAAW,EAAE;gBACtCkB,MAAM;gBACNU,QAAQ;aACT,CAAC,CAAC;YACH,4FAA4F;YAC5F,OAAO,MAAMhC,uBAAuB,CAACI,WAAW,EAAE;gBAChDM,UAAU,EAAE,IAAI;gBAChBD,cAAc;gBACdD,cAAc;gBACdD,gBAAgB;aACjB,CAAC,CAAC;SACJ;QAED,iEAAiE;QACjEiB,KAAK,GAAG,EAAE,CAAC;KACZ;IAED,MAAMU,cAAc,GAAGjC,oBAAoB,CAAC;QAAEqB,MAAM;QAAEU,QAAQ,EAAEnB,OAAO;KAAE,CAAC,AAAC;IAE3E,MAAMsB,cAAc,GAAG3B,cAAc,AAAC;IAEtC,MAAM4B,QAAQ,GAAG,CAAC,eAAe,EAAEP,MAAK,QAAA,CAACQ,IAAI,CAC3CpB,uBAAuB,CACxB,CAAC,kBAAkB,EAAEY,MAAK,QAAA,CAACS,KAAK,CAACD,IAAI,CAACH,cAAc,CAAC,CAAC,IAAI,CAAC,AAAC;IAE7D,iFAAiF;IACjF,MAAM,IAAIK,OAAY,aAAA,CAACX,eAAe,CAACJ,KAAK,GAAGY,QAAQ,GAAGD,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC;CACnF;AAED,oDAAoD,CACpD,SAASP,eAAe,CAACD,OAAe,EAAU;IAChD,OAAOa,CAAAA,GAAAA,SAAQ,AAAuC,CAAA,QAAvC,CAACb,OAAO,EAAEc,OAAO,CAACC,MAAM,CAACC,OAAO,IAAI,EAAE,CAAC,CAAC;CACxD;AAGM,SAAS1C,oBAAoB,CAAC,EACnCqB,MAAM,CAAA,EACNU,QAAQ,CAAA,EAQT,EAAE;IACD,OACE,CAACV,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC,GACrC,GAAG,GACHU,QAAQ,CACLd,GAAG,CAAC,CAAC,EAAEC,GAAG,CAAA,EAAEC,OAAO,CAAA,EAAE,GAAK;QACzB,IAAIA,OAAO,EAAE;YACX,OAAO;gBAACD,GAAG;gBAAEC,OAAO;aAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;SACjC;QACD,OAAOF,GAAG,CAAC;KACZ,CAAC,CACDE,IAAI,CAAC,GAAG,CAAC,CACZ;CACH;AAED,uCAAuC,CACvC,eAAeY,oBAAoB,CACjC7B,WAAmB,EACnB,EAAEkB,MAAM,CAAA,EAAEU,QAAQ,CAAA,EAA2C,EAC7D;IACA,MAAMY,cAAc,GAAG1C,cAAc,CAAC2C,gBAAgB,CAACzC,WAAW,EAAE;QAClE0C,IAAI,EAAExB,MAAM;QACZyB,GAAG,EAAE5C,GAAG,CAAC4C,GAAG;QACZC,MAAM,EAAE,CAACrC,IAAG,IAAA,CAACsC,UAAU;KACxB,CAAC,AAAC;IAEH,MAAMC,WAAW,GAAGrB,MAAK,QAAA,CAACQ,IAAI,CAACL,QAAQ,CAACX,IAAI,CAAC,IAAI,CAAC,CAAC,AAAC;IACpDlB,GAAG,CAAC4C,GAAG,EAAE,CAAC;IACV,MAAMI,qBAAqB,GAAGC,CAAAA,GAAAA,IAAa,AAA6B,CAAA,cAA7B,CAAC,CAAC,WAAW,EAAEF,WAAW,CAAC,CAAC,CAAC,AAAC;IACzE,IAAI;QACF,MAAMN,cAAc,CAACS,QAAQ,IAAIrB,QAAQ,CAAC,CAAC;KAC5C,CAAC,OAAOsB,CAAC,EAAO;QACfH,qBAAqB,CAACI,IAAI,CAAC,CAAC,kBAAkB,EAAEL,WAAW,CAAC,aAAa,EAAEI,CAAC,CAAC3B,OAAO,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM2B,CAAC,CAAC;KACT;IACDH,qBAAqB,CAACK,OAAO,CAAC,CAAC,UAAU,EAAEN,WAAW,CAAC,CAAC,CAAC,CAAC;CAC3D"}
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 { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\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 = env.CI,\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","env","CI","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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"}
@@ -9,34 +9,13 @@ exports.mutatePackagesWithKnownVersionsAsync = mutatePackagesWithKnownVersionsAs
9
9
  var _jsonFile = _interopRequireDefault(require("@expo/json-file"));
10
10
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
11
11
  var _semver = _interopRequireDefault(require("semver"));
12
- var Log = _interopRequireWildcard(require("../../../log"));
13
12
  var _getVersionedPackages = require("./getVersionedPackages");
14
13
  function _interopRequireDefault(obj) {
15
14
  return obj && obj.__esModule ? obj : {
16
15
  default: obj
17
16
  };
18
17
  }
19
- function _interopRequireWildcard(obj) {
20
- if (obj && obj.__esModule) {
21
- return obj;
22
- } else {
23
- var newObj = {};
24
- if (obj != null) {
25
- for(var key in obj){
26
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
27
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
28
- if (desc.get || desc.set) {
29
- Object.defineProperty(newObj, key, desc);
30
- } else {
31
- newObj[key] = obj[key];
32
- }
33
- }
34
- }
35
- }
36
- newObj.default = obj;
37
- return newObj;
38
- }
39
- }
18
+ const debug = require("debug")("expo:doctor:dependencies:getMissingPackages");
40
19
  function collectMissingPackages(projectRoot, requiredPackages) {
41
20
  const resolutions = {};
42
21
  const missingPackages = requiredPackages.filter((p)=>{
@@ -55,7 +34,7 @@ function collectMissingPackages(projectRoot, requiredPackages) {
55
34
  function versionSatisfiesRequiredPackage(packageJsonFilePath, resolvedPackage) {
56
35
  // If the version is specified, check that it satisfies the installed version.
57
36
  if (!resolvedPackage.version) {
58
- Log.debug(`Required package "${resolvedPackage.pkg}" found (no version constraint specified).`);
37
+ debug(`Required package "${resolvedPackage.pkg}" found (no version constraint specified).`);
59
38
  return true;
60
39
  }
61
40
  const pkgJson = _jsonFile.default.read(packageJsonFilePath);
@@ -64,7 +43,7 @@ function versionSatisfiesRequiredPackage(packageJsonFilePath, resolvedPackage) {
64
43
  _semver.default.satisfies(pkgJson.version, resolvedPackage.version)) {
65
44
  return true;
66
45
  }
67
- Log.debug(`Installed package "${resolvedPackage.pkg}" does not satisfy version constraint "${resolvedPackage.version}" (version: "${pkgJson.version}")`);
46
+ debug(`Installed package "${resolvedPackage.pkg}" does not satisfy version constraint "${resolvedPackage.version}" (version: "${pkgJson.version}")`);
68
47
  return false;
69
48
  }
70
49
  async function getMissingPackagesAsync(projectRoot, { sdkVersion , requiredPackages }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/getMissingPackages.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nexport type ResolvedPackage = {\n /** Module ID pointing to the library `package.json`. */\n file: string;\n /** NPM package name. */\n pkg: string;\n /** Required version range. */\n version?: string;\n /** If the dependency should be installed as a `devDependency` */\n dev?: boolean;\n};\n\n/** Given a set of required packages, this method returns a list of missing packages. */\nexport function collectMissingPackages(\n projectRoot: string,\n requiredPackages: ResolvedPackage[]\n): {\n missing: ResolvedPackage[];\n resolutions: Record<string, string>;\n} {\n const resolutions: Record<string, string> = {};\n\n const missingPackages = requiredPackages.filter((p) => {\n const resolved = resolveFrom.silent(projectRoot, p.file);\n if (!resolved || !versionSatisfiesRequiredPackage(resolved, p)) {\n return true;\n }\n resolutions[p.pkg] = resolved;\n return false;\n });\n\n return { missing: missingPackages, resolutions };\n}\n\nexport function versionSatisfiesRequiredPackage(\n packageJsonFilePath: string,\n resolvedPackage: Pick<ResolvedPackage, 'version' | 'pkg'>\n): boolean {\n // If the version is specified, check that it satisfies the installed version.\n if (!resolvedPackage.version) {\n Log.debug(`Required package \"${resolvedPackage.pkg}\" found (no version constraint specified).`);\n return true;\n }\n\n const pkgJson = JsonFile.read(packageJsonFilePath);\n if (\n // package.json has version.\n typeof pkgJson.version === 'string' &&\n // semver satisfaction.\n semver.satisfies(pkgJson.version, resolvedPackage.version)\n ) {\n return true;\n }\n Log.debug(\n `Installed package \"${resolvedPackage.pkg}\" does not satisfy version constraint \"${resolvedPackage.version}\" (version: \"${pkgJson.version}\")`\n );\n return false;\n}\n\n/**\n * Collect missing packages given a list of required packages.\n * Any missing packages will be versioned to the known versions for the current SDK.\n *\n * @param projectRoot\n * @param props.requiredPackages list of required packages to check for\n * @returns list of missing packages and resolutions to existing packages.\n */\nexport async function getMissingPackagesAsync(\n projectRoot: string,\n {\n sdkVersion,\n requiredPackages,\n }: {\n sdkVersion?: string;\n requiredPackages: ResolvedPackage[];\n }\n): Promise<{\n missing: ResolvedPackage[];\n resolutions: Record<string, string>;\n}> {\n const results = collectMissingPackages(projectRoot, requiredPackages);\n if (!results.missing.length) {\n return results;\n }\n\n // Ensure the versions are right for the SDK that the project is currently using.\n await mutatePackagesWithKnownVersionsAsync(projectRoot, sdkVersion, results.missing);\n\n return results;\n}\n\nexport async function mutatePackagesWithKnownVersionsAsync(\n projectRoot: string,\n sdkVersion: string | undefined,\n packages: ResolvedPackage[]\n) {\n // Ensure the versions are right for the SDK that the project is currently using.\n const relatedPackages = await getCombinedKnownVersionsAsync({ projectRoot, sdkVersion });\n for (const pkg of packages) {\n if (\n // Only use the SDK versions if the package does not already have a hardcoded version.\n // We do this because some packages have API coded into the CLI which expects an exact version.\n !pkg.version &&\n pkg.pkg in relatedPackages\n ) {\n pkg.version = relatedPackages[pkg.pkg];\n }\n }\n return packages;\n}\n"],"names":["collectMissingPackages","versionSatisfiesRequiredPackage","getMissingPackagesAsync","mutatePackagesWithKnownVersionsAsync","Log","projectRoot","requiredPackages","resolutions","missingPackages","filter","p","resolved","resolveFrom","silent","file","pkg","missing","packageJsonFilePath","resolvedPackage","version","debug","pkgJson","JsonFile","read","semver","satisfies","sdkVersion","results","length","packages","relatedPackages","getCombinedKnownVersionsAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/getMissingPackages.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:getMissingPackages') as typeof console.log;\n\nexport type ResolvedPackage = {\n /** Module ID pointing to the library `package.json`. */\n file: string;\n /** NPM package name. */\n pkg: string;\n /** Required version range. */\n version?: string;\n /** If the dependency should be installed as a `devDependency` */\n dev?: boolean;\n};\n\n/** Given a set of required packages, this method returns a list of missing packages. */\nexport function collectMissingPackages(\n projectRoot: string,\n requiredPackages: ResolvedPackage[]\n): {\n missing: ResolvedPackage[];\n resolutions: Record<string, string>;\n} {\n const resolutions: Record<string, string> = {};\n\n const missingPackages = requiredPackages.filter((p) => {\n const resolved = resolveFrom.silent(projectRoot, p.file);\n if (!resolved || !versionSatisfiesRequiredPackage(resolved, p)) {\n return true;\n }\n resolutions[p.pkg] = resolved;\n return false;\n });\n\n return { missing: missingPackages, resolutions };\n}\n\nexport function versionSatisfiesRequiredPackage(\n packageJsonFilePath: string,\n resolvedPackage: Pick<ResolvedPackage, 'version' | 'pkg'>\n): boolean {\n // If the version is specified, check that it satisfies the installed version.\n if (!resolvedPackage.version) {\n debug(`Required package \"${resolvedPackage.pkg}\" found (no version constraint specified).`);\n return true;\n }\n\n const pkgJson = JsonFile.read(packageJsonFilePath);\n if (\n // package.json has version.\n typeof pkgJson.version === 'string' &&\n // semver satisfaction.\n semver.satisfies(pkgJson.version, resolvedPackage.version)\n ) {\n return true;\n }\n debug(\n `Installed package \"${resolvedPackage.pkg}\" does not satisfy version constraint \"${resolvedPackage.version}\" (version: \"${pkgJson.version}\")`\n );\n return false;\n}\n\n/**\n * Collect missing packages given a list of required packages.\n * Any missing packages will be versioned to the known versions for the current SDK.\n *\n * @param projectRoot\n * @param props.requiredPackages list of required packages to check for\n * @returns list of missing packages and resolutions to existing packages.\n */\nexport async function getMissingPackagesAsync(\n projectRoot: string,\n {\n sdkVersion,\n requiredPackages,\n }: {\n sdkVersion?: string;\n requiredPackages: ResolvedPackage[];\n }\n): Promise<{\n missing: ResolvedPackage[];\n resolutions: Record<string, string>;\n}> {\n const results = collectMissingPackages(projectRoot, requiredPackages);\n if (!results.missing.length) {\n return results;\n }\n\n // Ensure the versions are right for the SDK that the project is currently using.\n await mutatePackagesWithKnownVersionsAsync(projectRoot, sdkVersion, results.missing);\n\n return results;\n}\n\nexport async function mutatePackagesWithKnownVersionsAsync(\n projectRoot: string,\n sdkVersion: string | undefined,\n packages: ResolvedPackage[]\n) {\n // Ensure the versions are right for the SDK that the project is currently using.\n const relatedPackages = await getCombinedKnownVersionsAsync({ projectRoot, sdkVersion });\n for (const pkg of packages) {\n if (\n // Only use the SDK versions if the package does not already have a hardcoded version.\n // We do this because some packages have API coded into the CLI which expects an exact version.\n !pkg.version &&\n pkg.pkg in relatedPackages\n ) {\n pkg.version = relatedPackages[pkg.pkg];\n }\n }\n return packages;\n}\n"],"names":["collectMissingPackages","versionSatisfiesRequiredPackage","getMissingPackagesAsync","mutatePackagesWithKnownVersionsAsync","debug","require","projectRoot","requiredPackages","resolutions","missingPackages","filter","p","resolved","resolveFrom","silent","file","pkg","missing","packageJsonFilePath","resolvedPackage","version","pkgJson","JsonFile","read","semver","satisfies","sdkVersion","results","length","packages","relatedPackages","getCombinedKnownVersionsAsync"],"mappings":"AAAA;;;;QAoBgBA,sBAAsB,GAAtBA,sBAAsB;QAqBtBC,+BAA+B,GAA/BA,+BAA+B;QAiCzBC,uBAAuB,GAAvBA,uBAAuB;QAwBvBC,oCAAoC,GAApCA,oCAAoC;AAlGrC,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACd,IAAA,YAAc,kCAAd,cAAc,EAAA;AACnB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AAEmB,IAAA,qBAAwB,WAAxB,wBAAwB,CAAA;;;;;;AAEtE,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,6CAA6C,CAAC,AAAsB,AAAC;AAc7F,SAASL,sBAAsB,CACpCM,WAAmB,EACnBC,gBAAmC,EAInC;IACA,MAAMC,WAAW,GAA2B,EAAE,AAAC;IAE/C,MAAMC,eAAe,GAAGF,gBAAgB,CAACG,MAAM,CAAC,CAACC,CAAC,GAAK;QACrD,MAAMC,QAAQ,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACR,WAAW,EAAEK,CAAC,CAACI,IAAI,CAAC,AAAC;QACzD,IAAI,CAACH,QAAQ,IAAI,CAACX,+BAA+B,CAACW,QAAQ,EAAED,CAAC,CAAC,EAAE;YAC9D,OAAO,IAAI,CAAC;SACb;QACDH,WAAW,CAACG,CAAC,CAACK,GAAG,CAAC,GAAGJ,QAAQ,CAAC;QAC9B,OAAO,KAAK,CAAC;KACd,CAAC,AAAC;IAEH,OAAO;QAAEK,OAAO,EAAER,eAAe;QAAED,WAAW;KAAE,CAAC;CAClD;AAEM,SAASP,+BAA+B,CAC7CiB,mBAA2B,EAC3BC,eAAyD,EAChD;IACT,8EAA8E;IAC9E,IAAI,CAACA,eAAe,CAACC,OAAO,EAAE;QAC5BhB,KAAK,CAAC,CAAC,kBAAkB,EAAEe,eAAe,CAACH,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC;KACb;IAED,MAAMK,OAAO,GAAGC,SAAQ,QAAA,CAACC,IAAI,CAACL,mBAAmB,CAAC,AAAC;IACnD,IACE,4BAA4B;IAC5B,OAAOG,OAAO,CAACD,OAAO,KAAK,QAAQ,IACnC,uBAAuB;IACvBI,OAAM,QAAA,CAACC,SAAS,CAACJ,OAAO,CAACD,OAAO,EAAED,eAAe,CAACC,OAAO,CAAC,EAC1D;QACA,OAAO,IAAI,CAAC;KACb;IACDhB,KAAK,CACH,CAAC,mBAAmB,EAAEe,eAAe,CAACH,GAAG,CAAC,uCAAuC,EAAEG,eAAe,CAACC,OAAO,CAAC,aAAa,EAAEC,OAAO,CAACD,OAAO,CAAC,EAAE,CAAC,CAC9I,CAAC;IACF,OAAO,KAAK,CAAC;CACd;AAUM,eAAelB,uBAAuB,CAC3CI,WAAmB,EACnB,EACEoB,UAAU,CAAA,EACVnB,gBAAgB,CAAA,EAIjB,EAIA;IACD,MAAMoB,OAAO,GAAG3B,sBAAsB,CAACM,WAAW,EAAEC,gBAAgB,CAAC,AAAC;IACtE,IAAI,CAACoB,OAAO,CAACV,OAAO,CAACW,MAAM,EAAE;QAC3B,OAAOD,OAAO,CAAC;KAChB;IAED,iFAAiF;IACjF,MAAMxB,oCAAoC,CAACG,WAAW,EAAEoB,UAAU,EAAEC,OAAO,CAACV,OAAO,CAAC,CAAC;IAErF,OAAOU,OAAO,CAAC;CAChB;AAEM,eAAexB,oCAAoC,CACxDG,WAAmB,EACnBoB,UAA8B,EAC9BG,QAA2B,EAC3B;IACA,iFAAiF;IACjF,MAAMC,eAAe,GAAG,MAAMC,CAAAA,GAAAA,qBAA6B,AAA6B,CAAA,8BAA7B,CAAC;QAAEzB,WAAW;QAAEoB,UAAU;KAAE,CAAC,AAAC;IACzF,KAAK,MAAMV,GAAG,IAAIa,QAAQ,CAAE;QAC1B,IACE,sFAAsF;QACtF,+FAA+F;QAC/F,CAACb,GAAG,CAACI,OAAO,IACZJ,GAAG,CAACA,GAAG,IAAIc,eAAe,EAC1B;YACAd,GAAG,CAACI,OAAO,GAAGU,eAAe,CAACd,GAAG,CAACA,GAAG,CAAC,CAAC;SACxC;KACF;IACD,OAAOa,QAAQ,CAAC;CACjB"}
@@ -8,34 +8,13 @@ exports.getVersionedPackagesAsync = getVersionedPackagesAsync;
8
8
  exports.getOperationLog = getOperationLog;
9
9
  var _npmPackageArg = _interopRequireDefault(require("npm-package-arg"));
10
10
  var _getVersions = require("../../../api/getVersions");
11
- var Log = _interopRequireWildcard(require("../../../log"));
12
11
  var _bundledNativeModules = require("./bundledNativeModules");
13
12
  function _interopRequireDefault(obj) {
14
13
  return obj && obj.__esModule ? obj : {
15
14
  default: obj
16
15
  };
17
16
  }
18
- function _interopRequireWildcard(obj) {
19
- if (obj && obj.__esModule) {
20
- return obj;
21
- } else {
22
- var newObj = {};
23
- if (obj != null) {
24
- for(var key in obj){
25
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
26
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
27
- if (desc.get || desc.set) {
28
- Object.defineProperty(newObj, key, desc);
29
- } else {
30
- newObj[key] = obj[key];
31
- }
32
- }
33
- }
34
- }
35
- newObj.default = obj;
36
- return newObj;
37
- }
38
- }
17
+ const debug = require("debug")("expo:doctor:dependencies:getVersionedPackages");
39
18
  /** Adds `react-dom`, `react`, and `react-native` to the list of known package versions (`relatedPackages`) */ function normalizeSdkVersionObject(version) {
40
19
  if (!version) {
41
20
  return {};
@@ -68,7 +47,7 @@ async function getRemoteVersionsForSdkAsync({ sdkVersion , skipCache } = {}) {
68
47
  });
69
48
  // We only want versioned dependencies so skip if they cannot be found.
70
49
  if (!sdkVersion || !(sdkVersion in sdkVersions)) {
71
- Log.debug(`Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(sdkVersions).join(", ")})`);
50
+ debug(`Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(sdkVersions).join(", ")})`);
72
51
  return {};
73
52
  }
74
53
  const version = sdkVersions[sdkVersion];