@expo/cli 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/build/bin/cli +13 -5
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/api/getVersions.js.map +1 -1
  4. package/build/src/api/rest/cache/response.js.map +1 -1
  5. package/build/src/api/rest/client.js +2 -2
  6. package/build/src/api/rest/client.js.map +1 -1
  7. package/build/src/api/user/actions.js +1 -1
  8. package/build/src/api/user/actions.js.map +1 -1
  9. package/build/src/customize/typescript.js +3 -1
  10. package/build/src/customize/typescript.js.map +1 -1
  11. package/build/src/export/createMetadataJson.js +5 -3
  12. package/build/src/export/createMetadataJson.js.map +1 -1
  13. package/build/src/export/embed/exportEmbedAsync.js +92 -18
  14. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  15. package/build/src/export/embed/resolveOptions.js +3 -3
  16. package/build/src/export/embed/resolveOptions.js.map +1 -1
  17. package/build/src/export/embed/xcodeCompilerLogger.js +97 -0
  18. package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -0
  19. package/build/src/export/exportApp.js +106 -130
  20. package/build/src/export/exportApp.js.map +1 -1
  21. package/build/src/export/exportAssets.js +93 -38
  22. package/build/src/export/exportAssets.js.map +1 -1
  23. package/build/src/export/exportAsync.js +1 -1
  24. package/build/src/export/exportAsync.js.map +1 -1
  25. package/build/src/export/exportHermes.js +0 -90
  26. package/build/src/export/exportHermes.js.map +1 -1
  27. package/build/src/export/exportStaticAsync.js +165 -101
  28. package/build/src/export/exportStaticAsync.js.map +1 -1
  29. package/build/src/export/favicon.js +13 -5
  30. package/build/src/export/favicon.js.map +1 -1
  31. package/build/src/export/fork-bundleAsync.js +84 -57
  32. package/build/src/export/fork-bundleAsync.js.map +1 -1
  33. package/build/src/export/index.js +9 -7
  34. package/build/src/export/index.js.map +1 -1
  35. package/build/src/export/metroAssetLocalPath.js +101 -0
  36. package/build/src/export/metroAssetLocalPath.js.map +1 -0
  37. package/build/src/export/persistMetroAssets.js +115 -31
  38. package/build/src/export/persistMetroAssets.js.map +1 -1
  39. package/build/src/export/publicFolder.js +7 -0
  40. package/build/src/export/publicFolder.js.map +1 -1
  41. package/build/src/export/resolveOptions.js +1 -1
  42. package/build/src/export/resolveOptions.js.map +1 -1
  43. package/build/src/export/saveAssets.js +168 -43
  44. package/build/src/export/saveAssets.js.map +1 -1
  45. package/build/src/export/web/exportWebAsync.js +1 -1
  46. package/build/src/export/web/exportWebAsync.js.map +1 -1
  47. package/build/src/export/writeContents.js +8 -106
  48. package/build/src/export/writeContents.js.map +1 -1
  49. package/build/src/install/applyPlugins.js +52 -0
  50. package/build/src/install/applyPlugins.js.map +1 -0
  51. package/build/src/install/checkPackages.js +2 -2
  52. package/build/src/install/checkPackages.js.map +1 -1
  53. package/build/src/install/fixPackages.js +84 -0
  54. package/build/src/install/fixPackages.js.map +1 -0
  55. package/build/src/install/installAsync.js +50 -60
  56. package/build/src/install/installAsync.js.map +1 -1
  57. package/build/src/install/installExpoPackage.js +79 -0
  58. package/build/src/install/installExpoPackage.js.map +1 -0
  59. package/build/src/prebuild/clearNativeFolder.js +1 -1
  60. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  61. package/build/src/prebuild/configureProjectAsync.js +3 -3
  62. package/build/src/prebuild/configureProjectAsync.js.map +1 -1
  63. package/build/src/prebuild/copyTemplateFiles.js +21 -30
  64. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  65. package/build/src/prebuild/prebuildAsync.js +45 -16
  66. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  67. package/build/src/prebuild/resolveOptions.js +2 -2
  68. package/build/src/prebuild/resolveOptions.js.map +1 -1
  69. package/build/src/prebuild/updateFromTemplate.js +6 -6
  70. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  71. package/build/src/prebuild/updatePackageJson.js +49 -36
  72. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  73. package/build/src/prebuild/validateTemplatePlatforms.js +2 -2
  74. package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -1
  75. package/build/src/run/hints.js +4 -0
  76. package/build/src/run/hints.js.map +1 -1
  77. package/build/src/run/index.js +101 -0
  78. package/build/src/run/index.js.map +1 -0
  79. package/build/src/start/doctor/dependencies/bundledNativeModules.js +2 -2
  80. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  81. package/build/src/start/doctor/dependencies/getVersionedPackages.js +22 -7
  82. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  83. package/build/src/start/doctor/dependencies/resolvePackages.js +66 -0
  84. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -0
  85. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +22 -33
  86. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  87. package/build/src/start/interface/interactiveActions.js +54 -19
  88. package/build/src/start/interface/interactiveActions.js.map +1 -1
  89. package/build/src/start/server/BundlerDevServer.js +14 -10
  90. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  91. package/build/src/start/server/DevServerManager.js +6 -1
  92. package/build/src/start/server/DevServerManager.js.map +1 -1
  93. package/build/src/start/server/DevToolsPluginManager.js +63 -0
  94. package/build/src/start/server/DevToolsPluginManager.js.map +1 -0
  95. package/build/src/start/server/getStaticRenderFunctions.js +25 -23
  96. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  97. package/build/src/start/server/metro/MetroBundlerDevServer.js +76 -69
  98. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  99. package/build/src/start/server/metro/MetroTerminalReporter.js +6 -2
  100. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  101. package/build/src/start/server/metro/TerminalReporter.js +18 -1
  102. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  103. package/build/src/start/server/metro/bundleApiRoutes.js +5 -3
  104. package/build/src/start/server/metro/bundleApiRoutes.js.map +1 -1
  105. package/build/src/start/server/metro/createExpoMetroResolver.js +80 -46
  106. package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
  107. package/build/src/start/server/metro/createJResolver.js +152 -0
  108. package/build/src/start/server/metro/createJResolver.js.map +1 -0
  109. package/build/src/start/server/metro/createServerRouteMiddleware.js +15 -2
  110. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  111. package/build/src/start/server/metro/{inspector-proxy/device.js → debugging/InspectorDevice.js} +10 -38
  112. package/build/src/start/server/metro/debugging/InspectorDevice.js.map +1 -0
  113. package/build/src/start/server/metro/debugging/InspectorProxy.js +116 -0
  114. package/build/src/start/server/metro/debugging/InspectorProxy.js.map +1 -0
  115. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +45 -0
  116. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -0
  117. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/NetworkResponse.js +3 -4
  118. package/build/src/start/server/metro/debugging/inspectorHandlers/NetworkResponse.js.map +1 -0
  119. package/build/src/start/server/metro/debugging/inspectorHandlers/PageReload.js.map +1 -0
  120. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerGetPossibleBreakpoints.js +5 -6
  121. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -0
  122. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerScriptParsed.js +3 -2
  123. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerScriptParsed.js.map +1 -0
  124. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerSetBreakpointByUrl.js +3 -2
  125. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -0
  126. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js +24 -0
  127. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js.map +1 -0
  128. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeGetProperties.js +5 -4
  129. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeGetProperties.js.map +1 -0
  130. package/build/src/start/server/metro/debugging/inspectorHandlers/types.js.map +1 -0
  131. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js +20 -0
  132. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js.map +1 -0
  133. package/build/src/start/server/metro/externals.js +25 -3
  134. package/build/src/start/server/metro/externals.js.map +1 -1
  135. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  136. package/build/src/start/server/metro/instantiateMetro.js +40 -15
  137. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  138. package/build/src/start/server/metro/metroErrorInterface.js +3 -2
  139. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  140. package/build/src/start/server/metro/router.js +5 -6
  141. package/build/src/start/server/metro/router.js.map +1 -1
  142. package/build/src/start/server/metro/runServer-fork.js +17 -27
  143. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  144. package/build/src/start/server/metro/serializeHtml.js +59 -0
  145. package/build/src/start/server/metro/serializeHtml.js.map +1 -0
  146. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +1 -2
  147. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
  148. package/build/src/start/server/metro/withMetroMultiPlatform.js +237 -214
  149. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  150. package/build/src/start/server/metro/withMetroResolvers.js +114 -40
  151. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
  152. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js +61 -0
  153. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js.map +1 -0
  154. package/build/src/start/server/middleware/ExpoMiddleware.js +2 -2
  155. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  156. package/build/src/start/server/middleware/ManifestMiddleware.js +22 -66
  157. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  158. package/build/src/start/server/middleware/inspector/JsInspector.js +23 -2
  159. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  160. package/build/src/start/server/middleware/inspector/LaunchBrowser.js +30 -26
  161. package/build/src/start/server/middleware/inspector/LaunchBrowser.js.map +1 -1
  162. package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js +7 -7
  163. package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js.map +1 -1
  164. package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js +5 -2
  165. package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js.map +1 -1
  166. package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js +3 -2
  167. package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js.map +1 -1
  168. package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js +8 -7
  169. package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js.map +1 -1
  170. package/build/src/start/server/middleware/metroOptions.js +176 -0
  171. package/build/src/start/server/middleware/metroOptions.js.map +1 -0
  172. package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
  173. package/build/src/start/server/type-generation/__typetests__/route.test.js +11 -3
  174. package/build/src/start/server/type-generation/__typetests__/route.test.js.map +1 -1
  175. package/build/src/start/server/type-generation/routes.js +6 -4
  176. package/build/src/start/server/type-generation/routes.js.map +1 -1
  177. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +1 -1
  178. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  179. package/build/src/utils/analytics/getMetroDebugProperties.js +1 -2
  180. package/build/src/utils/analytics/getMetroDebugProperties.js.map +1 -1
  181. package/build/src/utils/analytics/getMetroProperties.js +1 -2
  182. package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
  183. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  184. package/build/src/utils/args.js +4 -2
  185. package/build/src/utils/args.js.map +1 -1
  186. package/build/src/utils/cocoapods.js +1 -1
  187. package/build/src/utils/cocoapods.js.map +1 -1
  188. package/build/src/utils/codesigning.js +11 -1
  189. package/build/src/utils/codesigning.js.map +1 -1
  190. package/build/src/utils/dir.js +18 -8
  191. package/build/src/utils/dir.js.map +1 -1
  192. package/build/src/utils/env.js +10 -1
  193. package/build/src/utils/env.js.map +1 -1
  194. package/build/src/utils/getOrPromptApplicationId.js +2 -4
  195. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  196. package/build/src/utils/prompts.js +1 -28
  197. package/build/src/utils/prompts.js.map +1 -1
  198. package/build/src/utils/tsconfig/loadTsConfigPaths.js +3 -11
  199. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
  200. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +22 -12
  201. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
  202. package/package.json +19 -18
  203. package/static/shims/react-native-web/dist/cjs/exports/AppRegistry/AppContainer.js +13 -0
  204. package/static/shims/react-native-web/dist/exports/AppRegistry/AppContainer.js +12 -0
  205. package/static/template/index.html +14 -95
  206. package/build/src/export/printBundleSizes.js +0 -101
  207. package/build/src/export/printBundleSizes.js.map +0 -1
  208. package/build/src/start/server/metro/inspector-proxy/device.js.map +0 -1
  209. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +0 -1
  210. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +0 -1
  211. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +0 -1
  212. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +0 -1
  213. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +0 -1
  214. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +0 -1
  215. package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +0 -1
  216. package/build/src/start/server/metro/inspector-proxy/index.js +0 -27
  217. package/build/src/start/server/metro/inspector-proxy/index.js.map +0 -1
  218. package/build/src/start/server/metro/inspector-proxy/proxy.js +0 -169
  219. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +0 -1
  220. package/build/src/start/server/metro/resolveFromProject.js +0 -90
  221. package/build/src/start/server/metro/resolveFromProject.js.map +0 -1
  222. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +0 -64
  223. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +0 -1
  224. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/PageReload.js +0 -0
  225. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/types.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/prebuild/updateFromTemplate.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport { ModPlatform } from '@expo/config-plugins';\nimport chalk from 'chalk';\n\nimport { copyTemplateFilesAsync, createCopyFilesSuccessMessage } from './copyTemplateFiles';\nimport { cloneTemplateAsync } from './resolveTemplate';\nimport { DependenciesModificationResults, updatePackageJSONAsync } from './updatePackageJson';\nimport { validateTemplatePlatforms } from './validateTemplatePlatforms';\nimport * as Log from '../log';\nimport { AbortCommandError, SilentError } from '../utils/errors';\nimport { logNewSection } from '../utils/ora';\nimport { profile } from '../utils/profile';\n\n/**\n * Creates local native files from an input template file path.\n *\n * @return `true` if the project is ejecting, and `false` if it's syncing.\n */\nexport async function updateFromTemplateAsync(\n projectRoot: string,\n {\n exp,\n pkg,\n template,\n templateDirectory,\n platforms,\n skipDependencyUpdate,\n }: {\n /** Expo Config */\n exp: ExpoConfig;\n /** package.json as JSON */\n pkg: PackageJSONConfig;\n /** Template reference ID. */\n template?: string;\n /** Directory to write the template to before copying into the project. */\n templateDirectory?: string;\n /** List of platforms to clone. */\n platforms: ModPlatform[];\n /** List of dependencies to skip updating. */\n skipDependencyUpdate?: string[];\n }\n): Promise<\n {\n /** Indicates if new files were created in the project. */\n hasNewProjectFiles: boolean;\n /** Indicates that the project needs to run `pod install` */\n needsPodInstall: boolean;\n } & DependenciesModificationResults\n> {\n if (!templateDirectory) {\n const temporary = await import('tempy');\n templateDirectory = temporary.directory();\n }\n\n const copiedPaths = await profile(cloneTemplateAndCopyToProjectAsync)({\n projectRoot,\n template,\n templateDirectory,\n exp,\n platforms,\n });\n\n const depsResults = await profile(updatePackageJSONAsync)(projectRoot, {\n templateDirectory,\n pkg,\n skipDependencyUpdate,\n });\n\n return {\n hasNewProjectFiles: !!copiedPaths.length,\n // If the iOS folder changes or new packages are added, we should rerun pod install.\n needsPodInstall:\n copiedPaths.includes('ios') ||\n depsResults.hasNewDependencies ||\n depsResults.hasNewDevDependencies,\n ...depsResults,\n };\n}\n\n/**\n * Extract the template and copy the ios and android directories over to the project directory.\n *\n * @return `true` if any project files were created.\n */\nasync function cloneTemplateAndCopyToProjectAsync({\n projectRoot,\n templateDirectory,\n template,\n exp,\n platforms: unknownPlatforms,\n}: {\n projectRoot: string;\n templateDirectory: string;\n template?: string;\n exp: Pick<ExpoConfig, 'name' | 'sdkVersion'>;\n platforms: ModPlatform[];\n}): Promise<string[]> {\n const platformDirectories = unknownPlatforms\n .map((platform) => `./${platform}`)\n .reverse()\n .join(' and ');\n\n const pluralized = unknownPlatforms.length > 1 ? 'directories' : 'directory';\n const ora = logNewSection(\n `Creating native project ${pluralized} (${platformDirectories}) and updating .gitignore`\n );\n\n try {\n await cloneTemplateAsync({ templateDirectory, template, exp, ora });\n\n const platforms = await validateTemplatePlatforms({\n templateDirectory,\n platforms: unknownPlatforms,\n });\n\n const results = await copyTemplateFilesAsync(projectRoot, {\n templateDirectory,\n platforms,\n });\n\n ora.succeed(createCopyFilesSuccessMessage(platforms, results));\n\n return results.copiedPaths;\n } catch (e: any) {\n if (!(e instanceof AbortCommandError)) {\n Log.error(e.message);\n }\n ora.fail('Failed to create the native project.');\n Log.log(\n chalk.yellow(\n 'You may want to delete the `./ios` and/or `./android` directories before trying again.'\n )\n );\n throw new SilentError(e);\n }\n}\n"],"names":["updateFromTemplateAsync","Log","projectRoot","exp","pkg","template","templateDirectory","platforms","skipDependencyUpdate","temporary","directory","copiedPaths","profile","cloneTemplateAndCopyToProjectAsync","depsResults","updatePackageJSONAsync","hasNewProjectFiles","length","needsPodInstall","includes","hasNewDependencies","hasNewDevDependencies","unknownPlatforms","platformDirectories","map","platform","reverse","join","pluralized","ora","logNewSection","cloneTemplateAsync","validateTemplatePlatforms","results","copyTemplateFilesAsync","succeed","createCopyFilesSuccessMessage","e","AbortCommandError","error","message","fail","log","chalk","yellow","SilentError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/prebuild/updateFromTemplate.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport { ModPlatform } from '@expo/config-plugins';\nimport chalk from 'chalk';\n\nimport { copyTemplateFiles, createCopyFilesSuccessMessage } from './copyTemplateFiles';\nimport { cloneTemplateAsync } from './resolveTemplate';\nimport { DependenciesModificationResults, updatePackageJSONAsync } from './updatePackageJson';\nimport { validateTemplatePlatforms } from './validateTemplatePlatforms';\nimport * as Log from '../log';\nimport { AbortCommandError, SilentError } from '../utils/errors';\nimport { logNewSection } from '../utils/ora';\nimport { profile } from '../utils/profile';\n\n/**\n * Creates local native files from an input template file path.\n *\n * @return `true` if the project is prebuilding, and `false` if it's syncing.\n */\nexport async function updateFromTemplateAsync(\n projectRoot: string,\n {\n exp,\n pkg,\n template,\n templateDirectory,\n platforms,\n skipDependencyUpdate,\n }: {\n /** Expo Config */\n exp: ExpoConfig;\n /** package.json as JSON */\n pkg: PackageJSONConfig;\n /** Template reference ID. */\n template?: string;\n /** Directory to write the template to before copying into the project. */\n templateDirectory?: string;\n /** List of platforms to clone. */\n platforms: ModPlatform[];\n /** List of dependencies to skip updating. */\n skipDependencyUpdate?: string[];\n }\n): Promise<\n {\n /** Indicates if new files were created in the project. */\n hasNewProjectFiles: boolean;\n /** Indicates that the project needs to run `pod install` */\n needsPodInstall: boolean;\n } & DependenciesModificationResults\n> {\n if (!templateDirectory) {\n const temporary = await import('tempy');\n templateDirectory = temporary.directory();\n }\n\n const copiedPaths = await profile(cloneTemplateAndCopyToProjectAsync)({\n projectRoot,\n template,\n templateDirectory,\n exp,\n platforms,\n });\n\n const depsResults = await profile(updatePackageJSONAsync)(projectRoot, {\n templateDirectory,\n pkg,\n skipDependencyUpdate,\n });\n\n return {\n hasNewProjectFiles: !!copiedPaths.length,\n // If the iOS folder changes or new packages are added, we should rerun pod install.\n needsPodInstall: copiedPaths.includes('ios') || !!depsResults.changedDependencies.length,\n ...depsResults,\n };\n}\n\n/**\n * Extract the template and copy the ios and android directories over to the project directory.\n *\n * @return `true` if any project files were created.\n */\nasync function cloneTemplateAndCopyToProjectAsync({\n projectRoot,\n templateDirectory,\n template,\n exp,\n platforms: unknownPlatforms,\n}: {\n projectRoot: string;\n templateDirectory: string;\n template?: string;\n exp: Pick<ExpoConfig, 'name' | 'sdkVersion'>;\n platforms: ModPlatform[];\n}): Promise<string[]> {\n const platformDirectories = unknownPlatforms\n .map((platform) => `./${platform}`)\n .reverse()\n .join(' and ');\n\n const pluralized = unknownPlatforms.length > 1 ? 'directories' : 'directory';\n const ora = logNewSection(`Creating native ${pluralized} (${platformDirectories})`);\n\n try {\n await cloneTemplateAsync({ templateDirectory, template, exp, ora });\n\n const platforms = validateTemplatePlatforms({\n templateDirectory,\n platforms: unknownPlatforms,\n });\n\n const results = copyTemplateFiles(projectRoot, {\n templateDirectory,\n platforms,\n });\n\n ora.succeed(createCopyFilesSuccessMessage(platforms, results));\n\n return results.copiedPaths;\n } catch (e: any) {\n if (!(e instanceof AbortCommandError)) {\n Log.error(e.message);\n }\n ora.fail(`Failed to create the native ${pluralized}`);\n Log.log(\n chalk.yellow(\n chalk`You may want to delete the {bold ./ios} and/or {bold ./android} directories before trying again.`\n )\n );\n throw new SilentError(e);\n }\n}\n"],"names":["updateFromTemplateAsync","Log","projectRoot","exp","pkg","template","templateDirectory","platforms","skipDependencyUpdate","temporary","directory","copiedPaths","profile","cloneTemplateAndCopyToProjectAsync","depsResults","updatePackageJSONAsync","hasNewProjectFiles","length","needsPodInstall","includes","changedDependencies","unknownPlatforms","platformDirectories","map","platform","reverse","join","pluralized","ora","logNewSection","cloneTemplateAsync","validateTemplatePlatforms","results","copyTemplateFiles","succeed","createCopyFilesSuccessMessage","e","AbortCommandError","error","message","fail","log","chalk","yellow","SilentError"],"mappings":"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"}
@@ -42,25 +42,28 @@ function _interopRequireWildcard(obj) {
42
42
  return newObj;
43
43
  }
44
44
  }
45
- async function updatePackageJSONAsync(projectRoot, { templateDirectory , pkg , skipDependencyUpdate }) {
46
- const updatingPackageJsonStep = (0, _ora).logNewSection("Updating your package.json scripts, dependencies, and main file");
47
- const templatePkg = (0, _config).getPackageJson(templateDirectory);
45
+ async function updatePackageJSONAsync(projectRoot, { templateDirectory , templatePkg =(0, _config).getPackageJson(templateDirectory) , pkg , skipDependencyUpdate }) {
46
+ const updatingPackageJsonStep = (0, _ora).logNewSection("Updating package.json");
48
47
  const results = modifyPackageJson(projectRoot, {
49
48
  templatePkg,
50
49
  pkg,
51
50
  skipDependencyUpdate
52
51
  });
53
- await _fs.default.promises.writeFile(_path.default.resolve(projectRoot, "package.json"), // Add new line to match the format of running yarn.
54
- // This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.
55
- JSON.stringify(pkg, null, 2) + "\n");
56
- updatingPackageJsonStep.succeed("Updated package.json and added index.js entry point for iOS and Android");
52
+ const hasChanges = results.changedDependencies.length || results.scriptsChanged;
53
+ // NOTE: This is effectively bundler caching and subject to breakage if the inputs don't match the mutations.
54
+ if (hasChanges) {
55
+ await _fs.default.promises.writeFile(_path.default.resolve(projectRoot, "package.json"), // Add new line to match the format of running yarn.
56
+ // This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.
57
+ JSON.stringify(pkg, null, 2) + "\n");
58
+ }
59
+ updatingPackageJsonStep.succeed("Updated package.json" + (hasChanges ? "" : _chalk.default.dim(` | no changes`)));
57
60
  return results;
58
61
  }
59
62
  /**
60
63
  * Make required modifications to the `package.json` file as a JSON object.
61
64
  *
62
65
  * 1. Update `package.json` `scripts`.
63
- * 2. Update `package.json` `dependencies` and `devDependencies`.
66
+ * 2. Update `package.json` `dependencies` (not `devDependencies`).
64
67
  * 3. Update `package.json` `main`.
65
68
  *
66
69
  * @param projectRoot The root directory of the project.
@@ -69,33 +72,43 @@ async function updatePackageJSONAsync(projectRoot, { templateDirectory , pkg , s
69
72
  * @param props.skipDependencyUpdate Array of dependencies to skip updating.
70
73
  * @returns
71
74
  */ function modifyPackageJson(projectRoot, { templatePkg , pkg , skipDependencyUpdate }) {
72
- updatePkgScripts({
75
+ const scriptsChanged = updatePkgScripts({
73
76
  pkg
74
77
  });
75
78
  // TODO: Move to `npx expo-doctor`
76
- return updatePkgDependencies(projectRoot, {
77
- pkg,
78
- templatePkg,
79
- skipDependencyUpdate
80
- });
79
+ return {
80
+ scriptsChanged,
81
+ ...updatePkgDependencies(projectRoot, {
82
+ pkg,
83
+ templatePkg,
84
+ skipDependencyUpdate
85
+ })
86
+ };
81
87
  }
82
88
  function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDependencyUpdate =[] }) {
83
- if (!pkg1.devDependencies) {
84
- pkg1.devDependencies = {};
85
- }
86
- const { dependencies , devDependencies } = templatePkg;
89
+ const { dependencies } = templatePkg;
90
+ // The default values come from the bare-minimum template's package.json.
91
+ // Users can change this by using different templates with the `--template` flag.
92
+ // The main reason for allowing the changing of dependencies would be to include
93
+ // dependencies that are required for the native project to build. For example,
94
+ // it does not need to include dependencies that are used in the JS-code only.
87
95
  const defaultDependencies = createDependenciesMap(dependencies);
88
- const defaultDevDependencies = createDependenciesMap(devDependencies);
96
+ // NOTE: This is a hack to ensure this doesn't trigger an extraneous change in the `package.json`
97
+ // it isn't required for anything in the `ios` and `android` folders.
98
+ delete defaultDependencies["expo-status-bar"];
99
+ // NOTE: Expo splash screen is installed by default in the template but the config plugin also lives in prebuild-config
100
+ // so we can delete it to prevent an extraneous change in the `package.json`.
101
+ delete defaultDependencies["expo-splash-screen"];
89
102
  const combinedDependencies = createDependenciesMap({
90
103
  ...defaultDependencies,
91
104
  ...pkg1.dependencies
92
105
  });
93
106
  // These dependencies are only added, not overwritten from the project
94
107
  const requiredDependencies = [
108
+ // TODO: This is no longer required because it's this same package.
95
109
  "expo",
96
- "expo-splash-screen",
97
- "react",
98
- "react-native"
110
+ // TODO: Drop this somehow.
111
+ "react-native",
99
112
  ].filter((depKey)=>!!defaultDependencies[depKey]
100
113
  );
101
114
  const symlinkedPackages = [];
@@ -132,29 +145,25 @@ function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDepe
132
145
  Log.warn(`\u203A Using current versions instead of recommended ${nonRecommendedPackages.map((pkg)=>_chalk.default.bold(pkg)
133
146
  ).join(", ")}.`);
134
147
  }
135
- const combinedDevDependencies = createDependenciesMap({
136
- ...defaultDevDependencies,
137
- ...pkg1.devDependencies
138
- });
139
148
  // Only change the dependencies if the normalized hash changes, this helps to reduce meaningless changes.
140
149
  const hasNewDependencies = hashForDependencyMap(pkg1.dependencies) !== hashForDependencyMap(combinedDependencies);
141
- const hasNewDevDependencies = hashForDependencyMap(pkg1.devDependencies) !== hashForDependencyMap(combinedDevDependencies);
142
150
  // Save the dependencies
151
+ let changedDependencies = [];
143
152
  if (hasNewDependencies) {
144
153
  var _dependencies;
154
+ changedDependencies = diffKeys(combinedDependencies, (_dependencies = pkg1.dependencies) != null ? _dependencies : {}).sort();
155
+ var _dependencies1;
145
156
  // Use Object.assign to preserve the original order of dependencies, this makes it easier to see what changed in the git diff.
146
- pkg1.dependencies = Object.assign((_dependencies = pkg1.dependencies) != null ? _dependencies : {}, combinedDependencies);
147
- }
148
- if (hasNewDevDependencies) {
149
- var _devDependencies;
150
- // Same as with dependencies
151
- pkg1.devDependencies = Object.assign((_devDependencies = pkg1.devDependencies) != null ? _devDependencies : {}, combinedDevDependencies);
157
+ pkg1.dependencies = Object.assign((_dependencies1 = pkg1.dependencies) != null ? _dependencies1 : {}, combinedDependencies);
152
158
  }
153
159
  return {
154
- hasNewDependencies,
155
- hasNewDevDependencies
160
+ changedDependencies
156
161
  };
157
162
  }
163
+ function diffKeys(a, b) {
164
+ return Object.keys(a).filter((key)=>a[key] !== b[key]
165
+ );
166
+ }
158
167
  function createDependenciesMap(dependencies) {
159
168
  if (typeof dependencies !== "object") {
160
169
  throw new Error(`Dependency map is invalid, expected object but got ${typeof dependencies}`);
@@ -174,18 +183,22 @@ function createDependenciesMap(dependencies) {
174
183
  }
175
184
  /**
176
185
  * Update package.json scripts - `npm start` should default to `expo
177
- * start --dev-client` rather than `expo start` after ejecting, for example.
186
+ * start --dev-client` rather than `expo start` after prebuilding, for example.
178
187
  */ function updatePkgScripts({ pkg }) {
179
188
  var ref, ref1;
189
+ let hasChanged = false;
180
190
  if (!pkg.scripts) {
181
191
  pkg.scripts = {};
182
192
  }
183
193
  if (!((ref = pkg.scripts.android) == null ? void 0 : ref.includes("run"))) {
184
194
  pkg.scripts.android = "expo run:android";
195
+ hasChanged = true;
185
196
  }
186
197
  if (!((ref1 = pkg.scripts.ios) == null ? void 0 : ref1.includes("run"))) {
187
198
  pkg.scripts.ios = "expo run:ios";
199
+ hasChanged = true;
188
200
  }
201
+ return hasChanged;
189
202
  }
190
203
  function normalizeDependencyMap(deps) {
191
204
  return Object.keys(deps).map((dependency)=>`${dependency}@${deps[dependency]}`
@@ -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';\nimport { intersects as semverIntersects, Range as SemverRange } from 'semver';\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 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 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) {\n updatePkgScripts({ pkg });\n\n // TODO: Move to `npx expo-doctor`\n return updatePkgDependencies(projectRoot, {\n pkg,\n templatePkg,\n skipDependencyUpdate,\n });\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 /** @deprecated Required packages are not overwritten, only added when missing */\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 // These dependencies are only added, not overwritten from the project\n const requiredDependencies = ['expo', 'expo-splash-screen', 'react', 'react-native'].filter(\n (depKey) => !!defaultDependencies[depKey]\n );\n\n const symlinkedPackages: string[] = [];\n const nonRecommendedPackages: string[] = [];\n\n for (const dependenciesKey of requiredDependencies) {\n // If the local package.json defined the dependency that we want to overwrite...\n if (pkg.dependencies?.[dependenciesKey]) {\n // Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).\n if (isModuleSymlinked(projectRoot, { moduleId: dependenciesKey, isSilent: true })) {\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\n // Do not modify manually skipped dependencies\n if (skipDependencyUpdate.includes(dependenciesKey)) {\n continue;\n }\n\n // Warn users for outdated dependencies when prebuilding\n const hasRecommendedVersion = versionRangesIntersect(\n pkg.dependencies[dependenciesKey],\n String(defaultDependencies[dependenciesKey])\n );\n if (!hasRecommendedVersion) {\n nonRecommendedPackages.push(`${dependenciesKey}@${defaultDependencies[dependenciesKey]}`);\n }\n }\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 if (nonRecommendedPackages.length) {\n Log.warn(\n `\\u203A Using current versions instead of recommended ${nonRecommendedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')}.`\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.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\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\n/**\n * Determine if two semver ranges are overlapping or intersecting.\n * This is a safe version of `semver.intersects` that does not throw.\n */\nfunction versionRangesIntersect(rangeA: string | SemverRange, rangeB: string | SemverRange) {\n try {\n return semverIntersects(rangeA, rangeB);\n } catch {\n return false;\n }\n}\n"],"names":["updatePackageJSONAsync","updatePkgDependencies","createDependenciesMap","hashForDependencyMap","createFileHash","Log","projectRoot","templateDirectory","pkg","skipDependencyUpdate","updatingPackageJsonStep","logNewSection","templatePkg","getPackageJson","results","modifyPackageJson","fs","promises","writeFile","path","resolve","JSON","stringify","succeed","updatePkgScripts","devDependencies","dependencies","defaultDependencies","defaultDevDependencies","combinedDependencies","requiredDependencies","filter","depKey","symlinkedPackages","nonRecommendedPackages","dependenciesKey","isModuleSymlinked","moduleId","isSilent","push","includes","hasRecommendedVersion","versionRangesIntersect","String","length","log","map","chalk","bold","join","warn","combinedDevDependencies","hasNewDependencies","hasNewDevDependencies","Object","assign","Error","outputMap","key","keys","value","scripts","android","ios","normalizeDependencyMap","deps","dependency","sort","depsList","depsString","contents","crypto","createHash","update","digest","rangeA","rangeB","semverIntersects"],"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';\nimport { intersects as semverIntersects, Range as SemverRange } from 'semver';\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 DependenciesModificationResults = {\n /** A list of new values were added to the `dependencies` object in the `package.json`. */\n changedDependencies: string[];\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 templatePkg = getPackageJson(templateDirectory),\n pkg,\n skipDependencyUpdate,\n }: {\n templateDirectory: string;\n templatePkg?: PackageJSONConfig;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): Promise<DependenciesModificationResults> {\n const updatingPackageJsonStep = logNewSection('Updating package.json');\n\n const results = modifyPackageJson(projectRoot, {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n });\n\n const hasChanges = results.changedDependencies.length || results.scriptsChanged;\n\n // NOTE: This is effectively bundler caching and subject to breakage if the inputs don't match the mutations.\n if (hasChanges) {\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\n updatingPackageJsonStep.succeed(\n 'Updated package.json' + (hasChanges ? '' : chalk.dim(` | no changes`))\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` (not `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 /** @deprecated Required packages are not overwritten, only added when missing */\n skipDependencyUpdate?: string[];\n }\n) {\n const scriptsChanged = updatePkgScripts({ pkg });\n\n // TODO: Move to `npx expo-doctor`\n return {\n scriptsChanged,\n ...updatePkgDependencies(projectRoot, {\n pkg,\n templatePkg,\n skipDependencyUpdate,\n }),\n };\n}\n\n/**\n * Update `package.json` dependencies by combining the `dependencies` in the\n * project we are creating with the dependencies in the template project.\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 /** @deprecated Required packages are not overwritten, only added when missing */\n skipDependencyUpdate?: string[];\n }\n): DependenciesModificationResults {\n const { dependencies } = templatePkg;\n // The default values come from the bare-minimum template's package.json.\n // Users can change this by using different templates with the `--template` flag.\n // The main reason for allowing the changing of dependencies would be to include\n // dependencies that are required for the native project to build. For example,\n // it does not need to include dependencies that are used in the JS-code only.\n const defaultDependencies = createDependenciesMap(dependencies);\n\n // NOTE: This is a hack to ensure this doesn't trigger an extraneous change in the `package.json`\n // it isn't required for anything in the `ios` and `android` folders.\n delete defaultDependencies['expo-status-bar'];\n // NOTE: Expo splash screen is installed by default in the template but the config plugin also lives in prebuild-config\n // so we can delete it to prevent an extraneous change in the `package.json`.\n delete defaultDependencies['expo-splash-screen'];\n\n const combinedDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDependencies,\n ...pkg.dependencies,\n });\n\n // These dependencies are only added, not overwritten from the project\n const requiredDependencies = [\n // TODO: This is no longer required because it's this same package.\n 'expo',\n // TODO: Drop this somehow.\n 'react-native',\n ].filter((depKey) => !!defaultDependencies[depKey]);\n\n const symlinkedPackages: string[] = [];\n const nonRecommendedPackages: string[] = [];\n\n for (const dependenciesKey of requiredDependencies) {\n // If the local package.json defined the dependency that we want to overwrite...\n if (pkg.dependencies?.[dependenciesKey]) {\n // Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).\n if (isModuleSymlinked(projectRoot, { moduleId: dependenciesKey, isSilent: true })) {\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\n // Do not modify manually skipped dependencies\n if (skipDependencyUpdate.includes(dependenciesKey)) {\n continue;\n }\n\n // Warn users for outdated dependencies when prebuilding\n const hasRecommendedVersion = versionRangesIntersect(\n pkg.dependencies[dependenciesKey],\n String(defaultDependencies[dependenciesKey])\n );\n if (!hasRecommendedVersion) {\n nonRecommendedPackages.push(`${dependenciesKey}@${defaultDependencies[dependenciesKey]}`);\n }\n }\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 if (nonRecommendedPackages.length) {\n Log.warn(\n `\\u203A Using current versions instead of recommended ${nonRecommendedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')}.`\n );\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 // Save the dependencies\n let changedDependencies: string[] = [];\n if (hasNewDependencies) {\n changedDependencies = diffKeys(combinedDependencies, pkg.dependencies ?? {}).sort();\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\n return {\n changedDependencies,\n };\n}\n\nfunction diffKeys(a: Record<string, any>, b: Record<string, any>): string[] {\n return Object.keys(a).filter((key) => a[key] !== b[key]);\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 prebuilding, for example.\n */\nfunction updatePkgScripts({ pkg }: { pkg: PackageJSONConfig }) {\n let hasChanged = false;\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n if (!pkg.scripts.android?.includes('run')) {\n pkg.scripts.android = 'expo run:android';\n hasChanged = true;\n }\n if (!pkg.scripts.ios?.includes('run')) {\n pkg.scripts.ios = 'expo run:ios';\n hasChanged = true;\n }\n return hasChanged;\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\n/**\n * Determine if two semver ranges are overlapping or intersecting.\n * This is a safe version of `semver.intersects` that does not throw.\n */\nfunction versionRangesIntersect(rangeA: string | SemverRange, rangeB: string | SemverRange) {\n try {\n return semverIntersects(rangeA, rangeB);\n } catch {\n return false;\n }\n}\n"],"names":["updatePackageJSONAsync","updatePkgDependencies","createDependenciesMap","hashForDependencyMap","createFileHash","Log","projectRoot","templateDirectory","templatePkg","getPackageJson","pkg","skipDependencyUpdate","updatingPackageJsonStep","logNewSection","results","modifyPackageJson","hasChanges","changedDependencies","length","scriptsChanged","fs","promises","writeFile","path","resolve","JSON","stringify","succeed","chalk","dim","updatePkgScripts","dependencies","defaultDependencies","combinedDependencies","requiredDependencies","filter","depKey","symlinkedPackages","nonRecommendedPackages","dependenciesKey","isModuleSymlinked","moduleId","isSilent","push","includes","hasRecommendedVersion","versionRangesIntersect","String","log","map","bold","join","warn","hasNewDependencies","diffKeys","sort","Object","assign","a","b","keys","key","Error","outputMap","value","hasChanged","scripts","android","ios","normalizeDependencyMap","deps","dependency","depsList","depsString","contents","crypto","createHash","update","digest","rangeA","rangeB","semverIntersects"],"mappings":"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"}
@@ -33,10 +33,10 @@ function _interopRequireWildcard(obj) {
33
33
  return newObj;
34
34
  }
35
35
  }
36
- async function validateTemplatePlatforms({ templateDirectory , platforms }) {
36
+ function validateTemplatePlatforms({ templateDirectory , platforms }) {
37
37
  const existingPlatforms = [];
38
38
  for (const platform of platforms){
39
- if (await (0, _dir).directoryExistsAsync(_path.default.join(templateDirectory, platform))) {
39
+ if ((0, _dir).directoryExistsSync(_path.default.join(templateDirectory, platform))) {
40
40
  existingPlatforms.push(platform);
41
41
  } else {
42
42
  Log.warn(_chalk.default`⚠️ Skipping platform ${platform}. Use a template that contains native files for ${platform} (./${platform}).`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/prebuild/validateTemplatePlatforms.ts"],"sourcesContent":["import { ModPlatform } from '@expo/config-plugins';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport * as Log from '../log';\nimport { directoryExistsAsync } from '../utils/dir';\n\nexport async function validateTemplatePlatforms({\n templateDirectory,\n platforms,\n}: {\n templateDirectory: string;\n platforms: ModPlatform[];\n}) {\n const existingPlatforms: ModPlatform[] = [];\n\n for (const platform of platforms) {\n if (await directoryExistsAsync(path.join(templateDirectory, platform))) {\n existingPlatforms.push(platform);\n } else {\n Log.warn(\n chalk`⚠️ Skipping platform ${platform}. Use a template that contains native files for ${platform} (./${platform}).`\n );\n }\n }\n\n return existingPlatforms;\n}\n"],"names":["validateTemplatePlatforms","Log","templateDirectory","platforms","existingPlatforms","platform","directoryExistsAsync","path","join","push","warn","chalk"],"mappings":"AAAA;;;;QAOsBA,yBAAyB,GAAzBA,yBAAyB;AAN7B,IAAA,MAAO,kCAAP,OAAO,EAAA;AACR,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEXC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACsB,IAAA,IAAc,WAAd,cAAc,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5C,eAAeD,yBAAyB,CAAC,EAC9CE,iBAAiB,CAAA,EACjBC,SAAS,CAAA,EAIV,EAAE;IACD,MAAMC,iBAAiB,GAAkB,EAAE,AAAC;IAE5C,KAAK,MAAMC,QAAQ,IAAIF,SAAS,CAAE;QAChC,IAAI,MAAMG,CAAAA,GAAAA,IAAoB,AAAwC,CAAA,qBAAxC,CAACC,KAAI,QAAA,CAACC,IAAI,CAACN,iBAAiB,EAAEG,QAAQ,CAAC,CAAC,EAAE;YACtED,iBAAiB,CAACK,IAAI,CAACJ,QAAQ,CAAC,CAAC;SAClC,MAAM;YACLJ,GAAG,CAACS,IAAI,CACNC,MAAK,QAAA,CAAC,0BAAsB,EAAEN,QAAQ,CAAC,gDAAgD,EAAEA,QAAQ,CAAC,IAAI,EAAEA,QAAQ,CAAC,EAAE,CAAC,CACrH,CAAC;SACH;KACF;IAED,OAAOD,iBAAiB,CAAC;CAC1B"}
1
+ {"version":3,"sources":["../../../src/prebuild/validateTemplatePlatforms.ts"],"sourcesContent":["import { ModPlatform } from '@expo/config-plugins';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport * as Log from '../log';\nimport { directoryExistsSync } from '../utils/dir';\n\nexport function validateTemplatePlatforms({\n templateDirectory,\n platforms,\n}: {\n templateDirectory: string;\n platforms: ModPlatform[];\n}) {\n const existingPlatforms: ModPlatform[] = [];\n\n for (const platform of platforms) {\n if (directoryExistsSync(path.join(templateDirectory, platform))) {\n existingPlatforms.push(platform);\n } else {\n Log.warn(\n chalk`⚠️ Skipping platform ${platform}. Use a template that contains native files for ${platform} (./${platform}).`\n );\n }\n }\n\n return existingPlatforms;\n}\n"],"names":["validateTemplatePlatforms","Log","templateDirectory","platforms","existingPlatforms","platform","directoryExistsSync","path","join","push","warn","chalk"],"mappings":"AAAA;;;;QAOgBA,yBAAyB,GAAzBA,yBAAyB;AANvB,IAAA,MAAO,kCAAP,OAAO,EAAA;AACR,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEXC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACqB,IAAA,IAAc,WAAd,cAAc,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3C,SAASD,yBAAyB,CAAC,EACxCE,iBAAiB,CAAA,EACjBC,SAAS,CAAA,EAIV,EAAE;IACD,MAAMC,iBAAiB,GAAkB,EAAE,AAAC;IAE5C,KAAK,MAAMC,QAAQ,IAAIF,SAAS,CAAE;QAChC,IAAIG,CAAAA,GAAAA,IAAmB,AAAwC,CAAA,oBAAxC,CAACC,KAAI,QAAA,CAACC,IAAI,CAACN,iBAAiB,EAAEG,QAAQ,CAAC,CAAC,EAAE;YAC/DD,iBAAiB,CAACK,IAAI,CAACJ,QAAQ,CAAC,CAAC;SAClC,MAAM;YACLJ,GAAG,CAACS,IAAI,CACNC,MAAK,QAAA,CAAC,0BAAsB,EAAEN,QAAQ,CAAC,gDAAgD,EAAEA,QAAQ,CAAC,IAAI,EAAEA,QAAQ,CAAC,EAAE,CAAC,CACrH,CAAC;SACH;KACF;IAED,OAAOD,iBAAiB,CAAC;CAC1B"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.logDeviceArgument = logDeviceArgument;
6
+ exports.logPlatformRunCommand = logPlatformRunCommand;
6
7
  exports.logProjectLogsLocation = logProjectLogsLocation;
7
8
  var _chalk = _interopRequireDefault(require("chalk"));
8
9
  var _log = require("../log");
@@ -15,6 +16,9 @@ function _interopRequireDefault(obj) {
15
16
  function logDeviceArgument(id) {
16
17
  _log.Log.log(_chalk.default.dim`› Using --device ${id}`);
17
18
  }
19
+ function logPlatformRunCommand(platform, argv = []) {
20
+ _log.Log.log(_chalk.default.dim(`› Using expo run:${platform} ${argv.join(" ")}`));
21
+ }
18
22
  function logProjectLogsLocation() {
19
23
  _log.Log.log(_chalk.default`\n› Logs for your project will appear below.${(0, _interactive).isInteractive() ? _chalk.default.dim(` Press Ctrl+C to exit.`) : ""}`);
20
24
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/run/hints.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { Log } from '../log';\nimport { isInteractive } from '../utils/interactive';\n\n/** Log the device argument to use for the next run: `Using --device foobar` */\nexport function logDeviceArgument(id: string) {\n Log.log(chalk.dim`› Using --device ${id}`);\n}\n\nexport function logProjectLogsLocation() {\n Log.log(\n chalk`\\n› Logs for your project will appear below.${\n isInteractive() ? chalk.dim(` Press Ctrl+C to exit.`) : ''\n }`\n );\n}\n"],"names":["logDeviceArgument","logProjectLogsLocation","id","Log","log","chalk","dim","isInteractive"],"mappings":"AAAA;;;;QAMgBA,iBAAiB,GAAjBA,iBAAiB;QAIjBC,sBAAsB,GAAtBA,sBAAsB;AAVpB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEL,IAAA,IAAQ,WAAR,QAAQ,CAAA;AACE,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;;;;;;AAG7C,SAASD,iBAAiB,CAACE,EAAU,EAAE;IAC5CC,IAAG,IAAA,CAACC,GAAG,CAACC,MAAK,QAAA,CAACC,GAAG,CAAC,mBAAmB,EAAEJ,EAAE,CAAC,CAAC,CAAC,CAAC;CAC9C;AAEM,SAASD,sBAAsB,GAAG;IACvCE,IAAG,IAAA,CAACC,GAAG,CACLC,MAAK,QAAA,CAAC,8CAA4C,EAChDE,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,GAAGF,MAAK,QAAA,CAACC,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAC3D,CAAC,CACH,CAAC;CACH"}
1
+ {"version":3,"sources":["../../../src/run/hints.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { Log } from '../log';\nimport { isInteractive } from '../utils/interactive';\n\n/** Log the device argument to use for the next run: `Using --device foobar` */\nexport function logDeviceArgument(id: string) {\n Log.log(chalk.dim`› Using --device ${id}`);\n}\n\nexport function logPlatformRunCommand(platform: string, argv: string[] = []) {\n Log.log(chalk.dim(`› Using expo run:${platform} ${argv.join(' ')}`));\n}\n\nexport function logProjectLogsLocation() {\n Log.log(\n chalk`\\n› Logs for your project will appear below.${\n isInteractive() ? chalk.dim(` Press Ctrl+C to exit.`) : ''\n }`\n );\n}\n"],"names":["logDeviceArgument","logPlatformRunCommand","logProjectLogsLocation","id","Log","log","chalk","dim","platform","argv","join","isInteractive"],"mappings":"AAAA;;;;QAMgBA,iBAAiB,GAAjBA,iBAAiB;QAIjBC,qBAAqB,GAArBA,qBAAqB;QAIrBC,sBAAsB,GAAtBA,sBAAsB;AAdpB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEL,IAAA,IAAQ,WAAR,QAAQ,CAAA;AACE,IAAA,YAAsB,WAAtB,sBAAsB,CAAA;;;;;;AAG7C,SAASF,iBAAiB,CAACG,EAAU,EAAE;IAC5CC,IAAG,IAAA,CAACC,GAAG,CAACC,MAAK,QAAA,CAACC,GAAG,CAAC,mBAAmB,EAAEJ,EAAE,CAAC,CAAC,CAAC,CAAC;CAC9C;AAEM,SAASF,qBAAqB,CAACO,QAAgB,EAAEC,IAAc,GAAG,EAAE,EAAE;IAC3EL,IAAG,IAAA,CAACC,GAAG,CAACC,MAAK,QAAA,CAACC,GAAG,CAAC,CAAC,mBAAmB,EAAEC,QAAQ,CAAC,CAAC,EAAEC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACxE;AAEM,SAASR,sBAAsB,GAAG;IACvCE,IAAG,IAAA,CAACC,GAAG,CACLC,MAAK,QAAA,CAAC,8CAA4C,EAChDK,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,GAAGL,MAAK,QAAA,CAACC,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAC3D,CAAC,CACH,CAAC;CACH"}
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.expoRun = void 0;
7
+ var _chalk = _interopRequireDefault(require("chalk"));
8
+ var _hints = require("./hints");
9
+ var _args = require("../utils/args");
10
+ var _errors = require("../utils/errors");
11
+ function _interopRequireDefault(obj) {
12
+ return obj && obj.__esModule ? obj : {
13
+ default: obj
14
+ };
15
+ }
16
+ function _interopRequireWildcard(obj) {
17
+ if (obj && obj.__esModule) {
18
+ return obj;
19
+ } else {
20
+ var newObj = {};
21
+ if (obj != null) {
22
+ for(var key in obj){
23
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
24
+ var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
25
+ if (desc.get || desc.set) {
26
+ Object.defineProperty(newObj, key, desc);
27
+ } else {
28
+ newObj[key] = obj[key];
29
+ }
30
+ }
31
+ }
32
+ }
33
+ newObj.default = obj;
34
+ return newObj;
35
+ }
36
+ }
37
+ const expoRun = async (argv)=>{
38
+ const args = (0, _args).assertWithOptionsArgs({
39
+ // Types
40
+ "--help": Boolean,
41
+ // Aliases
42
+ "-h": "--help"
43
+ }, {
44
+ argv,
45
+ // Allow additional flags for both android and ios commands
46
+ permissive: true
47
+ });
48
+ try {
49
+ var __;
50
+ let [platform] = (__ = args._) != null ? __ : [];
51
+ // Workaround, filter `--flag` as platform
52
+ if (platform == null ? void 0 : platform.startsWith("-")) {
53
+ platform = "";
54
+ }
55
+ // Remove the platform from raw arguments, when provided
56
+ const argsWithoutPlatform = !platform ? argv : argv == null ? void 0 : argv.splice(1);
57
+ // Do not capture `--help` when platform is provided
58
+ if (!platform && args["--help"]) {
59
+ (0, _args).printHelp("Run the native app locally", `npx expo run <android|ios>`, _chalk.default`{dim $} npx expo run <android|ios> --help Output usage information`);
60
+ }
61
+ if (!platform) {
62
+ const { selectAsync } = await Promise.resolve().then(function() {
63
+ return _interopRequireWildcard(require("../utils/prompts.js"));
64
+ });
65
+ platform = await selectAsync("Select the platform to run", [
66
+ {
67
+ title: "Android",
68
+ value: "android"
69
+ },
70
+ {
71
+ title: "iOS",
72
+ value: "ios"
73
+ },
74
+ ]);
75
+ }
76
+ (0, _hints).logPlatformRunCommand(platform, argsWithoutPlatform);
77
+ switch(platform){
78
+ case "android":
79
+ {
80
+ const { expoRunAndroid } = await Promise.resolve().then(function() {
81
+ return _interopRequireWildcard(require("./android/index.js"));
82
+ });
83
+ return expoRunAndroid(argsWithoutPlatform);
84
+ }
85
+ case "ios":
86
+ {
87
+ const { expoRunIos } = await Promise.resolve().then(function() {
88
+ return _interopRequireWildcard(require("./ios/index.js"));
89
+ });
90
+ return expoRunIos(argsWithoutPlatform);
91
+ }
92
+ default:
93
+ throw new _errors.CommandError("UNSUPPORTED_PLATFORM", `Unsupported platform: ${platform}`);
94
+ }
95
+ } catch (error) {
96
+ (0, _errors).logCmdError(error);
97
+ }
98
+ };
99
+ exports.expoRun = expoRun;
100
+
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/run/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport chalk from 'chalk';\n\nimport { logPlatformRunCommand } from './hints';\nimport { Command } from '../../bin/cli';\nimport { assertWithOptionsArgs, printHelp } from '../utils/args';\nimport { CommandError, logCmdError } from '../utils/errors';\n\nexport const expoRun: Command = async (argv) => {\n const args = assertWithOptionsArgs(\n {\n // Types\n '--help': Boolean,\n // Aliases\n '-h': '--help',\n },\n {\n argv,\n // Allow additional flags for both android and ios commands\n permissive: true,\n }\n );\n\n try {\n let [platform] = args._ ?? [];\n\n // Workaround, filter `--flag` as platform\n if (platform?.startsWith('-')) {\n platform = '';\n }\n\n // Remove the platform from raw arguments, when provided\n const argsWithoutPlatform = !platform ? argv : argv?.splice(1);\n\n // Do not capture `--help` when platform is provided\n if (!platform && args['--help']) {\n printHelp(\n 'Run the native app locally',\n `npx expo run <android|ios>`,\n chalk`{dim $} npx expo run <android|ios> --help Output usage information`\n );\n }\n\n if (!platform) {\n const { selectAsync } = await import('../utils/prompts.js');\n platform = await selectAsync('Select the platform to run', [\n { title: 'Android', value: 'android' },\n { title: 'iOS', value: 'ios' },\n ]);\n }\n\n logPlatformRunCommand(platform, argsWithoutPlatform);\n\n switch (platform) {\n case 'android': {\n const { expoRunAndroid } = await import('./android/index.js');\n return expoRunAndroid(argsWithoutPlatform);\n }\n\n case 'ios': {\n const { expoRunIos } = await import('./ios/index.js');\n return expoRunIos(argsWithoutPlatform);\n }\n\n default:\n throw new CommandError('UNSUPPORTED_PLATFORM', `Unsupported platform: ${platform}`);\n }\n } catch (error: any) {\n logCmdError(error);\n }\n};\n"],"names":["expoRun","argv","args","assertWithOptionsArgs","Boolean","permissive","platform","_","startsWith","argsWithoutPlatform","splice","printHelp","chalk","selectAsync","title","value","logPlatformRunCommand","expoRunAndroid","expoRunIos","CommandError","error","logCmdError"],"mappings":"AAAA;;;;;;AACkB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEa,IAAA,MAAS,WAAT,SAAS,CAAA;AAEE,IAAA,KAAe,WAAf,eAAe,CAAA;AACtB,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpD,MAAMA,OAAO,GAAY,OAAOC,IAAI,GAAK;IAC9C,MAAMC,IAAI,GAAGC,CAAAA,GAAAA,KAAqB,AAYjC,CAAA,sBAZiC,CAChC;QACE,QAAQ;QACR,QAAQ,EAAEC,OAAO;QACjB,UAAU;QACV,IAAI,EAAE,QAAQ;KACf,EACD;QACEH,IAAI;QACJ,2DAA2D;QAC3DI,UAAU,EAAE,IAAI;KACjB,CACF,AAAC;IAEF,IAAI;YACeH,EAAM;QAAvB,IAAI,CAACI,QAAQ,CAAC,GAAGJ,CAAAA,EAAM,GAANA,IAAI,CAACK,CAAC,YAANL,EAAM,GAAI,EAAE,AAAC;QAE9B,0CAA0C;QAC1C,IAAII,QAAQ,QAAY,GAApBA,KAAAA,CAAoB,GAApBA,QAAQ,CAAEE,UAAU,CAAC,GAAG,CAAC,EAAE;YAC7BF,QAAQ,GAAG,EAAE,CAAC;SACf;QAED,wDAAwD;QACxD,MAAMG,mBAAmB,GAAG,CAACH,QAAQ,GAAGL,IAAI,GAAGA,IAAI,QAAQ,GAAZA,KAAAA,CAAY,GAAZA,IAAI,CAAES,MAAM,CAAC,CAAC,CAAC,AAAC;QAE/D,oDAAoD;QACpD,IAAI,CAACJ,QAAQ,IAAIJ,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC/BS,CAAAA,GAAAA,KAAS,AAIR,CAAA,UAJQ,CACP,4BAA4B,EAC5B,CAAC,0BAA0B,CAAC,EAC5BC,MAAK,QAAA,CAAC,mEAAmE,CAAC,CAC3E,CAAC;SACH;QAED,IAAI,CAACN,QAAQ,EAAE;YACb,MAAM,EAAEO,WAAW,CAAA,EAAE,GAAG,MAAM;uDAAO,qBAAqB;cAAC,AAAC;YAC5DP,QAAQ,GAAG,MAAMO,WAAW,CAAC,4BAA4B,EAAE;gBACzD;oBAAEC,KAAK,EAAE,SAAS;oBAAEC,KAAK,EAAE,SAAS;iBAAE;gBACtC;oBAAED,KAAK,EAAE,KAAK;oBAAEC,KAAK,EAAE,KAAK;iBAAE;aAC/B,CAAC,CAAC;SACJ;QAEDC,CAAAA,GAAAA,MAAqB,AAA+B,CAAA,sBAA/B,CAACV,QAAQ,EAAEG,mBAAmB,CAAC,CAAC;QAErD,OAAQH,QAAQ;YACd,KAAK,SAAS;gBAAE;oBACd,MAAM,EAAEW,cAAc,CAAA,EAAE,GAAG,MAAM;+DAAO,oBAAoB;sBAAC,AAAC;oBAC9D,OAAOA,cAAc,CAACR,mBAAmB,CAAC,CAAC;iBAC5C;YAED,KAAK,KAAK;gBAAE;oBACV,MAAM,EAAES,UAAU,CAAA,EAAE,GAAG,MAAM;+DAAO,gBAAgB;sBAAC,AAAC;oBACtD,OAAOA,UAAU,CAACT,mBAAmB,CAAC,CAAC;iBACxC;YAED;gBACE,MAAM,IAAIU,OAAY,aAAA,CAAC,sBAAsB,EAAE,CAAC,sBAAsB,EAAEb,QAAQ,CAAC,CAAC,CAAC,CAAC;SACvF;KACF,CAAC,OAAOc,KAAK,EAAO;QACnBC,CAAAA,GAAAA,OAAW,AAAO,CAAA,YAAP,CAACD,KAAK,CAAC,CAAC;KACpB;CACF,AAAC;QA9DWpB,OAAO,GAAPA,OAAO"}
@@ -37,8 +37,8 @@ function _interopRequireWildcard(obj) {
37
37
  }
38
38
  }
39
39
  const debug = require("debug")("expo:doctor:dependencies:bundledNativeModules");
40
- async function getVersionedNativeModulesAsync(projectRoot, sdkVersion) {
41
- if (sdkVersion !== "UNVERSIONED" && !_env.env.EXPO_OFFLINE) {
40
+ async function getVersionedNativeModulesAsync(projectRoot, sdkVersion, options = {}) {
41
+ if (sdkVersion !== "UNVERSIONED" && !_env.env.EXPO_OFFLINE && !options.skipRemoteVersions) {
42
42
  try {
43
43
  debug("Fetching bundled native modules from the server...");
44
44
  return await (0, _getNativeModuleVersions).getNativeModuleVersionsAsync(sdkVersion);
@@ -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 * as Log from '../../../log';\nimport { env } from '../../../utils/env';\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' && !env.EXPO_OFFLINE) {\n try {\n debug('Fetching bundled native modules from the server...');\n return await getNativeModuleVersionsAsync(sdkVersion);\n } catch (error: any) {\n if (error instanceof CommandError && (error.code === 'OFFLINE' || error.code === 'API')) {\n Log.warn(\n chalk`Unable to reach well-known versions endpoint. Using local dependency map {bold expo/bundledNativeModules.json} for version validation`\n );\n } else {\n throw error;\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","env","EXPO_OFFLINE","getNativeModuleVersionsAsync","error","CommandError","code","warn","chalk","getBundledNativeModulesAsync","bundledNativeModulesPath","resolveFrom","silent","log","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;AACvEC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACK,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACX,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,IAAG,IAAA,CAACC,YAAY,EAAE;QACrD,IAAI;YACFL,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC5D,OAAO,MAAMM,CAAAA,GAAAA,wBAA4B,AAAY,CAAA,6BAAZ,CAACH,UAAU,CAAC,CAAC;SACvD,CAAC,OAAOI,KAAK,EAAO;YACnB,IAAIA,KAAK,YAAYC,OAAY,aAAA,IAAI,CAACD,KAAK,CAACE,IAAI,KAAK,SAAS,IAAIF,KAAK,CAACE,IAAI,KAAK,KAAK,CAAC,EAAE;gBACvFV,GAAG,CAACW,IAAI,CACNC,MAAK,QAAA,CAAC,qIAAqI,CAAC,CAC7I,CAAC;aACH,MAAM;gBACL,MAAMJ,KAAK,CAAC;aACb;SACF;KACF;IAEDP,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACrE,OAAO,MAAMY,4BAA4B,CAACV,WAAW,CAAC,CAAC;CACxD;AAED;;;GAGG,CACH,eAAeU,4BAA4B,CAACV,WAAmB,EAAiC;IAC9F,6DAA6D;IAC7D,MAAMW,wBAAwB,GAAGC,YAAW,QAAA,CAACC,MAAM,CACjDb,WAAW,EACX,gCAAgC,CACjC,AAAC;IACF,IAAI,CAACW,wBAAwB,EAAE;QAC7Bd,GAAG,CAACiB,GAAG,EAAE,CAAC;QACV,MAAM,IAAIR,OAAY,aAAA,CACpBG,MAAK,QAAA,CAAC,qJAAqJ,CAAC,CAC7J,CAAC;KACH;IACD,OAAO,MAAMM,SAAQ,QAAA,CAACC,SAAS,CAAuBL,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 * as Log from '../../../log';\nimport { env } from '../../../utils/env';\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 options: {\n skipRemoteVersions?: boolean;\n } = {}\n): Promise<BundledNativeModules> {\n if (sdkVersion !== 'UNVERSIONED' && !env.EXPO_OFFLINE && !options.skipRemoteVersions) {\n try {\n debug('Fetching bundled native modules from the server...');\n return await getNativeModuleVersionsAsync(sdkVersion);\n } catch (error: any) {\n if (error instanceof CommandError && (error.code === 'OFFLINE' || error.code === 'API')) {\n Log.warn(\n chalk`Unable to reach well-known versions endpoint. Using local dependency map {bold expo/bundledNativeModules.json} for version validation`\n );\n } else {\n throw error;\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","options","env","EXPO_OFFLINE","skipRemoteVersions","getNativeModuleVersionsAsync","error","CommandError","code","warn","chalk","getBundledNativeModulesAsync","bundledNativeModulesPath","resolveFrom","silent","log","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;AACvEC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACK,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACX,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,EAClBC,OAEC,GAAG,EAAE,EACyB;IAC/B,IAAID,UAAU,KAAK,aAAa,IAAI,CAACE,IAAG,IAAA,CAACC,YAAY,IAAI,CAACF,OAAO,CAACG,kBAAkB,EAAE;QACpF,IAAI;YACFP,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC5D,OAAO,MAAMQ,CAAAA,GAAAA,wBAA4B,AAAY,CAAA,6BAAZ,CAACL,UAAU,CAAC,CAAC;SACvD,CAAC,OAAOM,KAAK,EAAO;YACnB,IAAIA,KAAK,YAAYC,OAAY,aAAA,IAAI,CAACD,KAAK,CAACE,IAAI,KAAK,SAAS,IAAIF,KAAK,CAACE,IAAI,KAAK,KAAK,CAAC,EAAE;gBACvFZ,GAAG,CAACa,IAAI,CACNC,MAAK,QAAA,CAAC,qIAAqI,CAAC,CAC7I,CAAC;aACH,MAAM;gBACL,MAAMJ,KAAK,CAAC;aACb;SACF;KACF;IAEDT,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACrE,OAAO,MAAMc,4BAA4B,CAACZ,WAAW,CAAC,CAAC;CACxD;AAED;;;GAGG,CACH,eAAeY,4BAA4B,CAACZ,WAAmB,EAAiC;IAC9F,6DAA6D;IAC7D,MAAMa,wBAAwB,GAAGC,YAAW,QAAA,CAACC,MAAM,CACjDf,WAAW,EACX,gCAAgC,CACjC,AAAC;IACF,IAAI,CAACa,wBAAwB,EAAE;QAC7BhB,GAAG,CAACmB,GAAG,EAAE,CAAC;QACV,MAAM,IAAIR,OAAY,aAAA,CACpBG,MAAK,QAAA,CAAC,qJAAqJ,CAAC,CAC7J,CAAC;KACH;IACD,OAAO,MAAMM,SAAQ,QAAA,CAACC,SAAS,CAAuBL,wBAAwB,CAAC,CAAC;CACjF"}
@@ -8,6 +8,7 @@ exports.getVersionedPackagesAsync = getVersionedPackagesAsync;
8
8
  exports.getOperationLog = getOperationLog;
9
9
  var _npmPackageArg = _interopRequireDefault(require("npm-package-arg"));
10
10
  var _bundledNativeModules = require("./bundledNativeModules");
11
+ var _resolvePackages = require("./resolvePackages");
11
12
  var _getVersions = require("../../../api/getVersions");
12
13
  var _log = require("../../../log");
13
14
  var _env = require("../../../utils/env");
@@ -22,23 +23,33 @@ const debug = require("debug")("expo:doctor:dependencies:getVersionedPackages");
22
23
  if (!version) {
23
24
  return {};
24
25
  }
25
- const { relatedPackages , facebookReactVersion , facebookReactNativeVersion } = version;
26
+ const { relatedPackages , facebookReactVersion , facebookReactNativeVersion , expoVersion } = version;
26
27
  const reactVersion = facebookReactVersion ? {
27
28
  react: facebookReactVersion,
28
29
  "react-dom": facebookReactVersion
29
30
  } : undefined;
31
+ const expoVersionIfAvailable = expoVersion ? {
32
+ expo: expoVersion
33
+ } : undefined;
30
34
  return {
31
35
  ...relatedPackages,
32
36
  ...reactVersion,
37
+ ...expoVersionIfAvailable,
33
38
  "react-native": facebookReactNativeVersion
34
39
  };
35
40
  }
36
41
  async function getCombinedKnownVersionsAsync({ projectRoot , sdkVersion , skipCache }) {
37
- const bundledNativeModules = sdkVersion ? await (0, _bundledNativeModules).getVersionedNativeModulesAsync(projectRoot, sdkVersion) : {};
38
- const versionsForSdk = await getRemoteVersionsForSdkAsync({
42
+ const skipRemoteVersions = await (0, _resolvePackages).hasExpoCanaryAsync(projectRoot);
43
+ if (skipRemoteVersions) {
44
+ _log.Log.warn("Dependency validation might be unreliable when using canary SDK versions");
45
+ }
46
+ const bundledNativeModules = sdkVersion ? await (0, _bundledNativeModules).getVersionedNativeModulesAsync(projectRoot, sdkVersion, {
47
+ skipRemoteVersions
48
+ }) : {};
49
+ const versionsForSdk = !skipRemoteVersions ? await getRemoteVersionsForSdkAsync({
39
50
  sdkVersion,
40
51
  skipCache
41
- });
52
+ }) : {};
42
53
  return {
43
54
  ...bundledNativeModules,
44
55
  // Prefer the remote versions over the bundled versions, this enables us to push
@@ -82,7 +93,7 @@ async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion ,
82
93
  let othersCount = 0;
83
94
  const excludedNativeModules = [];
84
95
  const versionedPackages = packages.map((arg)=>{
85
- const { name , type , raw } = (0, _npmPackageArg).default(arg);
96
+ const { name , type , raw , rawSpec } = (0, _npmPackageArg).default(arg);
86
97
  if ([
87
98
  "tag",
88
99
  "version",
@@ -91,11 +102,15 @@ async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion ,
91
102
  var ref, ref1, ref2;
92
103
  // Unimodule packages from npm registry are modified to use the bundled version.
93
104
  // Some packages have the recommended version listed in https://exp.host/--/api/v2/versions.
94
- if (pkg == null ? void 0 : (ref = pkg.expo) == null ? void 0 : (ref1 = ref.install) == null ? void 0 : (ref2 = ref1.exclude) == null ? void 0 : ref2.includes(name)) {
105
+ const isExcludedFromValidation = pkg == null ? void 0 : (ref = pkg.expo) == null ? void 0 : (ref1 = ref.install) == null ? void 0 : (ref2 = ref1.exclude) == null ? void 0 : ref2.includes(name);
106
+ const hasSpecifiedExactVersion = rawSpec !== "";
107
+ if (isExcludedFromValidation || hasSpecifiedExactVersion) {
95
108
  othersCount++;
96
109
  excludedNativeModules.push({
97
110
  name,
98
- bundledNativeVersion: versionsForSdk[name]
111
+ bundledNativeVersion: versionsForSdk[name],
112
+ isExcludedFromValidation,
113
+ specifiedVersion: rawSpec
99
114
  });
100
115
  return raw;
101
116
  }