@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/start/doctor/dependencies/getVersionedPackages.ts"],"sourcesContent":["import { PackageJSONConfig } from '@expo/config';\nimport npmPackageArg from 'npm-package-arg';\n\nimport { getVersionedNativeModulesAsync } from './bundledNativeModules';\nimport { getVersionsAsync, SDKVersion } from '../../../api/getVersions';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')(\n 'expo:doctor:dependencies:getVersionedPackages'\n) as typeof console.log;\n\nexport type DependencyList = Record<string, string>;\n\n/** Adds `react-dom`, `react`, and `react-native` to the list of known package versions (`relatedPackages`) */\nfunction normalizeSdkVersionObject(version?: SDKVersion): Record<string, string> {\n if (!version) {\n return {};\n }\n const { relatedPackages, facebookReactVersion, facebookReactNativeVersion } = version;\n\n const reactVersion = facebookReactVersion\n ? {\n react: facebookReactVersion,\n 'react-dom': facebookReactVersion,\n }\n : undefined;\n\n return {\n ...relatedPackages,\n ...reactVersion,\n 'react-native': facebookReactNativeVersion,\n };\n}\n\n/** Get the known versions for a given SDK, combines all sources. */\nexport async function getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache,\n}: {\n projectRoot: string;\n sdkVersion?: string;\n skipCache?: boolean;\n}) {\n const bundledNativeModules = sdkVersion\n ? await getVersionedNativeModulesAsync(projectRoot, sdkVersion)\n : {};\n const versionsForSdk = await getRemoteVersionsForSdkAsync({ sdkVersion, skipCache });\n return {\n ...bundledNativeModules,\n // Prefer the remote versions over the bundled versions, this enables us to push\n // emergency fixes that users can access without having to update the `expo` package.\n ...versionsForSdk,\n };\n}\n\n/** @returns a key/value list of known dependencies and their version (including range). */\nexport async function getRemoteVersionsForSdkAsync({\n sdkVersion,\n skipCache,\n}: { sdkVersion?: string; skipCache?: boolean } = {}): Promise<DependencyList> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Dependency validation is unreliable in offline-mode');\n return {};\n }\n\n try {\n const { sdkVersions } = await getVersionsAsync({ skipCache });\n\n // We only want versioned dependencies so skip if they cannot be found.\n if (!sdkVersion || !(sdkVersion in sdkVersions)) {\n debug(\n `Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(\n sdkVersions\n ).join(', ')})`\n );\n return {};\n }\n\n const version = sdkVersions[sdkVersion as keyof typeof sdkVersions] as unknown as SDKVersion;\n\n return normalizeSdkVersionObject(version);\n } catch (error: any) {\n if (error instanceof CommandError && error.code === 'OFFLINE') {\n return getRemoteVersionsForSdkAsync({ sdkVersion, skipCache });\n }\n throw error;\n }\n}\n\n/**\n * Versions a list of `packages` against a given `sdkVersion` based on local and remote versioning resources.\n *\n * @param projectRoot\n * @param param1\n * @returns\n */\nexport async function getVersionedPackagesAsync(\n projectRoot: string,\n {\n packages,\n sdkVersion,\n pkg,\n }: {\n /** List of npm packages to process. */\n packages: string[];\n /** Target SDK Version number to version the `packages` for. */\n sdkVersion: string;\n pkg: PackageJSONConfig;\n }\n): Promise<{\n packages: string[];\n messages: string[];\n excludedNativeModules: { name: string; bundledNativeVersion: string }[];\n}> {\n const versionsForSdk = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache: true,\n });\n\n let nativeModulesCount = 0;\n let othersCount = 0;\n const excludedNativeModules: { name: string; bundledNativeVersion: string }[] = [];\n\n const versionedPackages = packages.map((arg) => {\n const { name, type, raw } = npmPackageArg(arg);\n\n if (['tag', 'version', 'range'].includes(type) && name && versionsForSdk[name]) {\n // Unimodule packages from npm registry are modified to use the bundled version.\n // Some packages have the recommended version listed in https://exp.host/--/api/v2/versions.\n if (pkg?.expo?.install?.exclude?.includes(name)) {\n othersCount++;\n excludedNativeModules.push({ name, bundledNativeVersion: versionsForSdk[name] });\n return raw;\n }\n nativeModulesCount++;\n return `${name}@${versionsForSdk[name]}`;\n } else {\n // Other packages are passed through unmodified.\n othersCount++;\n return raw;\n }\n });\n\n const messages = getOperationLog({\n othersCount,\n nativeModulesCount,\n sdkVersion,\n });\n\n return {\n packages: versionedPackages,\n messages,\n excludedNativeModules,\n };\n}\n\n/** Craft a set of messages regarding the install operations. */\nexport function getOperationLog({\n nativeModulesCount,\n sdkVersion,\n othersCount,\n}: {\n nativeModulesCount: number;\n othersCount: number;\n sdkVersion: string;\n}): string[] {\n return [\n nativeModulesCount > 0 &&\n `${nativeModulesCount} SDK ${sdkVersion} compatible native ${\n nativeModulesCount === 1 ? 'module' : 'modules'\n }`,\n othersCount > 0 && `${othersCount} other ${othersCount === 1 ? 'package' : 'packages'}`,\n ].filter(Boolean) as string[];\n}\n"],"names":["getCombinedKnownVersionsAsync","getRemoteVersionsForSdkAsync","getVersionedPackagesAsync","getOperationLog","debug","require","normalizeSdkVersionObject","version","relatedPackages","facebookReactVersion","facebookReactNativeVersion","reactVersion","react","undefined","projectRoot","sdkVersion","skipCache","bundledNativeModules","getVersionedNativeModulesAsync","versionsForSdk","env","EXPO_OFFLINE","Log","warn","sdkVersions","getVersionsAsync","Object","keys","join","error","CommandError","code","packages","pkg","nativeModulesCount","othersCount","excludedNativeModules","versionedPackages","map","arg","name","type","raw","npmPackageArg","includes","expo","install","exclude","push","bundledNativeVersion","messages","filter","Boolean"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/getVersionedPackages.ts"],"sourcesContent":["import { PackageJSONConfig } from '@expo/config';\nimport npmPackageArg from 'npm-package-arg';\n\nimport { getVersionedNativeModulesAsync } from './bundledNativeModules';\nimport { hasExpoCanaryAsync } from './resolvePackages';\nimport { getVersionsAsync, SDKVersion } from '../../../api/getVersions';\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')(\n 'expo:doctor:dependencies:getVersionedPackages'\n) as typeof console.log;\n\nexport type DependencyList = Record<string, string>;\n\n/** Adds `react-dom`, `react`, and `react-native` to the list of known package versions (`relatedPackages`) */\nfunction normalizeSdkVersionObject(version?: SDKVersion): Record<string, string> {\n if (!version) {\n return {};\n }\n const { relatedPackages, facebookReactVersion, facebookReactNativeVersion, expoVersion } =\n version;\n\n const reactVersion = facebookReactVersion\n ? {\n react: facebookReactVersion,\n 'react-dom': facebookReactVersion,\n }\n : undefined;\n\n const expoVersionIfAvailable = expoVersion ? { expo: expoVersion } : undefined;\n\n return {\n ...relatedPackages,\n ...reactVersion,\n ...expoVersionIfAvailable,\n 'react-native': facebookReactNativeVersion,\n };\n}\n\n/** Get the known versions for a given SDK, combines all sources. */\nexport async function getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache,\n}: {\n projectRoot: string;\n sdkVersion?: string;\n skipCache?: boolean;\n}) {\n const skipRemoteVersions = await hasExpoCanaryAsync(projectRoot);\n if (skipRemoteVersions) {\n Log.warn('Dependency validation might be unreliable when using canary SDK versions');\n }\n\n const bundledNativeModules = sdkVersion\n ? await getVersionedNativeModulesAsync(projectRoot, sdkVersion, { skipRemoteVersions })\n : {};\n const versionsForSdk = !skipRemoteVersions\n ? await getRemoteVersionsForSdkAsync({ sdkVersion, skipCache })\n : {};\n return {\n ...bundledNativeModules,\n // Prefer the remote versions over the bundled versions, this enables us to push\n // emergency fixes that users can access without having to update the `expo` package.\n ...versionsForSdk,\n };\n}\n\n/** @returns a key/value list of known dependencies and their version (including range). */\nexport async function getRemoteVersionsForSdkAsync({\n sdkVersion,\n skipCache,\n}: { sdkVersion?: string; skipCache?: boolean } = {}): Promise<DependencyList> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Dependency validation is unreliable in offline-mode');\n return {};\n }\n\n try {\n const { sdkVersions } = await getVersionsAsync({ skipCache });\n\n // We only want versioned dependencies so skip if they cannot be found.\n if (!sdkVersion || !(sdkVersion in sdkVersions)) {\n debug(\n `Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(\n sdkVersions\n ).join(', ')})`\n );\n return {};\n }\n\n const version = sdkVersions[sdkVersion as keyof typeof sdkVersions] as unknown as SDKVersion;\n\n return normalizeSdkVersionObject(version);\n } catch (error: any) {\n if (error instanceof CommandError && error.code === 'OFFLINE') {\n return getRemoteVersionsForSdkAsync({ sdkVersion, skipCache });\n }\n throw error;\n }\n}\n\ntype ExcludedNativeModules = {\n name: string;\n bundledNativeVersion: string;\n isExcludedFromValidation: boolean;\n specifiedVersion?: string; // e.g. 1.2.3, latest\n};\n\n/**\n * Versions a list of `packages` against a given `sdkVersion` based on local and remote versioning resources.\n *\n * @param projectRoot\n * @param param1\n * @returns\n */\nexport async function getVersionedPackagesAsync(\n projectRoot: string,\n {\n packages,\n sdkVersion,\n pkg,\n }: {\n /** List of npm packages to process. */\n packages: string[];\n /** Target SDK Version number to version the `packages` for. */\n sdkVersion: string;\n pkg: PackageJSONConfig;\n }\n): Promise<{\n packages: string[];\n messages: string[];\n excludedNativeModules: ExcludedNativeModules[];\n}> {\n const versionsForSdk = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache: true,\n });\n\n let nativeModulesCount = 0;\n let othersCount = 0;\n const excludedNativeModules: ExcludedNativeModules[] = [];\n\n const versionedPackages = packages.map((arg) => {\n const { name, type, raw, rawSpec } = npmPackageArg(arg);\n\n if (['tag', 'version', 'range'].includes(type) && name && versionsForSdk[name]) {\n // Unimodule packages from npm registry are modified to use the bundled version.\n // Some packages have the recommended version listed in https://exp.host/--/api/v2/versions.\n const isExcludedFromValidation = pkg?.expo?.install?.exclude?.includes(name);\n const hasSpecifiedExactVersion = rawSpec !== '';\n if (isExcludedFromValidation || hasSpecifiedExactVersion) {\n othersCount++;\n excludedNativeModules.push({\n name,\n bundledNativeVersion: versionsForSdk[name],\n isExcludedFromValidation,\n specifiedVersion: rawSpec,\n });\n return raw;\n }\n nativeModulesCount++;\n return `${name}@${versionsForSdk[name]}`;\n } else {\n // Other packages are passed through unmodified.\n othersCount++;\n return raw;\n }\n });\n\n const messages = getOperationLog({\n othersCount,\n nativeModulesCount,\n sdkVersion,\n });\n\n return {\n packages: versionedPackages,\n messages,\n excludedNativeModules,\n };\n}\n\n/** Craft a set of messages regarding the install operations. */\nexport function getOperationLog({\n nativeModulesCount,\n sdkVersion,\n othersCount,\n}: {\n nativeModulesCount: number;\n othersCount: number;\n sdkVersion: string;\n}): string[] {\n return [\n nativeModulesCount > 0 &&\n `${nativeModulesCount} SDK ${sdkVersion} compatible native ${\n nativeModulesCount === 1 ? 'module' : 'modules'\n }`,\n othersCount > 0 && `${othersCount} other ${othersCount === 1 ? 'package' : 'packages'}`,\n ].filter(Boolean) as string[];\n}\n"],"names":["getCombinedKnownVersionsAsync","getRemoteVersionsForSdkAsync","getVersionedPackagesAsync","getOperationLog","debug","require","normalizeSdkVersionObject","version","relatedPackages","facebookReactVersion","facebookReactNativeVersion","expoVersion","reactVersion","react","undefined","expoVersionIfAvailable","expo","projectRoot","sdkVersion","skipCache","skipRemoteVersions","hasExpoCanaryAsync","Log","warn","bundledNativeModules","getVersionedNativeModulesAsync","versionsForSdk","env","EXPO_OFFLINE","sdkVersions","getVersionsAsync","Object","keys","join","error","CommandError","code","packages","pkg","nativeModulesCount","othersCount","excludedNativeModules","versionedPackages","map","arg","name","type","raw","rawSpec","npmPackageArg","includes","isExcludedFromValidation","install","exclude","hasSpecifiedExactVersion","push","bundledNativeVersion","specifiedVersion","messages","filter","Boolean"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.resolvePackageVersionAsync = resolvePackageVersionAsync;
6
+ exports.resolveAllPackageVersionsAsync = resolveAllPackageVersionsAsync;
7
+ exports.hasExpoCanaryAsync = hasExpoCanaryAsync;
8
+ var _jsonFile = _interopRequireDefault(require("@expo/json-file"));
9
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
10
+ var _semver = _interopRequireDefault(require("semver"));
11
+ var _errors = require("../../../utils/errors");
12
+ function _interopRequireDefault(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
17
+ async function resolvePackageVersionAsync(projectRoot, packageName) {
18
+ let packageJsonPath;
19
+ try {
20
+ packageJsonPath = (0, _resolveFrom).default(projectRoot, `${packageName}/package.json`);
21
+ } catch (error) {
22
+ // This is a workaround for packages using `exports`. If this doesn't
23
+ // include `package.json`, we have to use the error message to get the location.
24
+ if (error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED") {
25
+ var ref;
26
+ packageJsonPath = (ref = error.message.match(/("exports"|defined) in (.*)$/i)) == null ? void 0 : ref[2];
27
+ }
28
+ }
29
+ if (!packageJsonPath) {
30
+ throw new _errors.CommandError("PACKAGE_NOT_FOUND", `"${packageName}" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run "yarn" or "npm install" to fix this issue.`);
31
+ }
32
+ const packageJson = await _jsonFile.default.readAsync(packageJsonPath);
33
+ return packageJson.version;
34
+ }
35
+ async function resolveAllPackageVersionsAsync(projectRoot, packages) {
36
+ const resolvedPackages = await Promise.all(packages.map(async (packageName)=>[
37
+ packageName,
38
+ await resolvePackageVersionAsync(projectRoot, packageName),
39
+ ]
40
+ ));
41
+ return Object.fromEntries(resolvedPackages);
42
+ }
43
+ async function hasExpoCanaryAsync(projectRoot) {
44
+ let expoVersion = "";
45
+ try {
46
+ // Resolve installed `expo` version first
47
+ expoVersion = await resolvePackageVersionAsync(projectRoot, "expo");
48
+ } catch (error) {
49
+ var ref;
50
+ if (error.code !== "PACKAGE_NOT_FOUND") {
51
+ throw error;
52
+ }
53
+ // Resolve through project `package.json`
54
+ const packageJson = await _jsonFile.default.readAsync((0, _resolveFrom).default(projectRoot, "./package.json"));
55
+ var ref1;
56
+ expoVersion = (ref1 = (ref = packageJson.dependencies) == null ? void 0 : ref.expo) != null ? ref1 : "";
57
+ }
58
+ if (expoVersion === "canary") {
59
+ return true;
60
+ }
61
+ const prerelease = _semver.default.prerelease(expoVersion) || [];
62
+ return !!prerelease.some((segment)=>typeof segment === "string" && segment.includes("canary")
63
+ );
64
+ }
65
+
66
+ //# sourceMappingURL=resolvePackages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/resolvePackages.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { CommandError } from '../../../utils/errors';\n\nexport async function resolvePackageVersionAsync(\n projectRoot: string,\n packageName: string\n): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n 'PACKAGE_NOT_FOUND',\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<{ version: string }>(packageJsonPath);\n return packageJson.version;\n}\n\nexport async function resolveAllPackageVersionsAsync(projectRoot: string, packages: string[]) {\n const resolvedPackages = await Promise.all(\n packages.map(async (packageName) => [\n packageName,\n await resolvePackageVersionAsync(projectRoot, packageName),\n ])\n );\n\n return Object.fromEntries(resolvedPackages);\n}\n\n/**\n * Determine if the project has a `expo@canary` version installed.\n * This means that an unsable version is used, without the API knowing the exact packages.\n * Since this may be called during, or before, packages are installed, we also need to test on `package.json`.\n * Note, this returns `false` for beta releases.\n */\nexport async function hasExpoCanaryAsync(projectRoot: string) {\n let expoVersion = '';\n\n try {\n // Resolve installed `expo` version first\n expoVersion = await resolvePackageVersionAsync(projectRoot, 'expo');\n } catch (error: any) {\n if (error.code !== 'PACKAGE_NOT_FOUND') {\n throw error;\n }\n\n // Resolve through project `package.json`\n const packageJson = await JsonFile.readAsync<{ dependencies?: Record<string, string> }>(\n resolveFrom(projectRoot, './package.json')\n );\n expoVersion = packageJson.dependencies?.expo ?? '';\n }\n\n if (expoVersion === 'canary') {\n return true;\n }\n\n const prerelease = semver.prerelease(expoVersion) || [];\n return !!prerelease.some((segment) => typeof segment === 'string' && segment.includes('canary'));\n}\n"],"names":["resolvePackageVersionAsync","resolveAllPackageVersionsAsync","hasExpoCanaryAsync","projectRoot","packageName","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","packages","resolvedPackages","Promise","all","map","Object","fromEntries","expoVersion","dependencies","expo","prerelease","semver","some","segment","includes"],"mappings":"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"}
@@ -5,15 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  exports.validateDependenciesVersionsAsync = validateDependenciesVersionsAsync;
6
6
  exports.logIncorrectDependencies = logIncorrectDependencies;
7
7
  exports.getVersionedDependenciesAsync = getVersionedDependenciesAsync;
8
- var _jsonFile = _interopRequireDefault(require("@expo/json-file"));
9
8
  var _assert = _interopRequireDefault(require("assert"));
10
9
  var _chalk = _interopRequireDefault(require("chalk"));
11
- var _resolveFrom = _interopRequireDefault(require("resolve-from"));
12
10
  var _semver = _interopRequireDefault(require("semver"));
13
11
  var _getVersionedPackages = require("./getVersionedPackages");
12
+ var _resolvePackages = require("./resolvePackages");
14
13
  var Log = _interopRequireWildcard(require("../../../log"));
15
14
  var _env = require("../../../utils/env");
16
- var _errors = require("../../../utils/errors");
17
15
  function _interopRequireDefault(obj) {
18
16
  return obj && obj.__esModule ? obj : {
19
17
  default: obj
@@ -57,10 +55,10 @@ function logIncorrectDependencies(incorrectDeps) {
57
55
  if (!incorrectDeps.length) {
58
56
  return true;
59
57
  }
60
- Log.warn(_chalk.default`Some dependencies are incompatible with the installed {bold expo} version:`);
58
+ Log.warn(_chalk.default`The following packages should be updated for best compatibility with the installed {bold expo} version:`);
61
59
  incorrectDeps.forEach((dep)=>logInvalidDependency(dep)
62
60
  );
63
- Log.warn("Your project may not work correctly until you install the correct versions of the packages.\n" + _chalk.default`Fix with: {bold npx expo install --fix}`);
61
+ Log.warn("Your project may not work correctly until you install the correct versions of the packages.");
64
62
  return false;
65
63
  }
66
64
  async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck) {
@@ -87,7 +85,7 @@ async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCh
87
85
  debug(`Comparing known versions: %O`, resolvedPackagesToCheck);
88
86
  debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);
89
87
  // read package versions from the file system (node_modules)
90
- const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);
88
+ const packageVersions = await (0, _resolvePackages).resolveAllPackageVersionsAsync(projectRoot, resolvedPackagesToCheck);
91
89
  debug(`Package versions: %O`, packageVersions);
92
90
  // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges
93
91
  let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);
@@ -125,39 +123,13 @@ function getPackagesToCheck(dependencies, bundledNativeModules) {
125
123
  unknown
126
124
  };
127
125
  }
128
- async function resolvePackageVersionsAsync(projectRoot, packages) {
129
- const packageVersionsFromPackageJSON = await Promise.all(packages.map((packageName)=>getPackageVersionAsync(projectRoot, packageName)
130
- ));
131
- return packages.reduce((acc, packageName, idx)=>{
132
- acc[packageName] = packageVersionsFromPackageJSON[idx];
133
- return acc;
134
- }, {});
135
- }
136
- async function getPackageVersionAsync(projectRoot, packageName) {
137
- let packageJsonPath;
138
- try {
139
- packageJsonPath = (0, _resolveFrom).default(projectRoot, `${packageName}/package.json`);
140
- } catch (error) {
141
- // This is a workaround for packages using `exports`. If this doesn't
142
- // include `package.json`, we have to use the error message to get the location.
143
- if (error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED") {
144
- var ref;
145
- packageJsonPath = (ref = error.message.match(/("exports"|defined) in (.*)$/i)) == null ? void 0 : ref[2];
146
- }
147
- }
148
- if (!packageJsonPath) {
149
- throw new _errors.CommandError(`"${packageName}" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run "yarn" or "npm install" to fix this issue.`);
150
- }
151
- const packageJson = await _jsonFile.default.readAsync(packageJsonPath);
152
- return packageJson.version;
153
- }
154
126
  function findIncorrectDependencies(pkg, packageVersions, bundledNativeModules) {
155
127
  const packages = Object.keys(packageVersions);
156
128
  const incorrectDeps = [];
157
129
  for (const packageName of packages){
158
130
  const expectedVersionOrRange = bundledNativeModules[packageName];
159
131
  const actualVersion = packageVersions[packageName];
160
- if (typeof expectedVersionOrRange === "string" && !_semver.default.intersects(expectedVersionOrRange, actualVersion)) {
132
+ if (isDependencyVersionIncorrect(packageName, expectedVersionOrRange, actualVersion)) {
161
133
  incorrectDeps.push({
162
134
  packageName,
163
135
  packageType: findDependencyType(pkg, packageName),
@@ -168,6 +140,23 @@ function findIncorrectDependencies(pkg, packageVersions, bundledNativeModules) {
168
140
  }
169
141
  return incorrectDeps;
170
142
  }
143
+ function isDependencyVersionIncorrect(packageName, expectedVersionOrRange, actualVersion) {
144
+ if (typeof expectedVersionOrRange !== "string") {
145
+ return false;
146
+ }
147
+ // we never want to go backwards with the expo patch version
148
+ if (packageName === "expo") {
149
+ if (_semver.default.ltr(actualVersion, expectedVersionOrRange)) {
150
+ return true;
151
+ }
152
+ return false;
153
+ }
154
+ // all other packages: version range is based on Expo SDK version, so we always want to match range
155
+ if (!_semver.default.intersects(expectedVersionOrRange, actualVersion)) {
156
+ return true;
157
+ }
158
+ return false;
159
+ }
171
160
  function findDependencyType(pkg, packageName) {
172
161
  if (pkg.devDependencies && packageName in pkg.devDependencies) {
173
162
  return "devDependencies";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Fix with: {bold npx expo install --fix}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n if (pkg?.expo?.install?.exclude) {\n const packagesToExclude = pkg.expo.install.exclude;\n const incorrectAndExcludedDeps = incorrectDeps.filter((dep) =>\n packagesToExclude.includes(dep.packageName)\n );\n debug(\n `Incorrect dependency warnings filtered out by expo.install.exclude: %O`,\n incorrectAndExcludedDeps.map((dep) => dep.packageName)\n );\n incorrectDeps = incorrectDeps.filter((dep) => !packagesToExclude.includes(dep.packageName));\n }\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce(\n (acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n },\n {} as Record<string, string>\n );\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","env","EXPO_OFFLINE","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","expo","install","exclude","packagesToExclude","incorrectAndExcludedDeps","filter","includes","map","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects","packageType","findDependencyType"],"mappings":"AAAA;;;;QAgCsBA,iCAAiC,GAAjCA,iCAAiC;QA0BvCC,wBAAwB,GAAxBA,wBAAwB;QAwBlBC,6BAA6B,GAA7BA,6BAA6B;AAjF9B,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACnB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACT,IAAA,MAAO,kCAAP,OAAO,EAAA;AACD,IAAA,YAAc,kCAAd,cAAc,EAAA;AACnB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AAGmB,IAAA,qBAAwB,WAAxB,wBAAwB,CAAA;AAC1DC,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,CAAC,mCAAmC,CAAC,AAAsB,AAAC;AAmBnF,eAAeL,iCAAiC,CACrDM,WAAmB,EACnBC,GAAmC,EACnCC,GAAsB,EACtBC,eAA0B,EACD;IACzB,IAAIC,IAAG,IAAA,CAACC,YAAY,EAAE;QACpBR,GAAG,CAACS,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;KACb;IAED,MAAMC,aAAa,GAAG,MAAMX,6BAA6B,CAACI,WAAW,EAAEC,GAAG,EAAEC,GAAG,EAAEC,eAAe,CAAC,AAAC;IAClG,OAAOR,wBAAwB,CAACY,aAAa,CAAC,CAAC;CAChD;AAED,SAASC,oBAAoB,CAAC,EAC5BC,WAAW,CAAA,EACXC,sBAAsB,CAAA,EACtBC,aAAa,CAAA,EACO,EAAE;IACtBd,GAAG,CAACS,IAAI,CACN,0JAA0J;IAC1JM,MAAK,QAAA,CAAC,QAAQ,EAAEH,WAAW,CAAC,cAAc,EAAEE,aAAa,CAAC,6BAA6B,EAAED,sBAAsB,CAAC,CAAC,CAAC,CACnH,CAAC;CACH;AAEM,SAASf,wBAAwB,CAACY,aAAoC,EAAE;IAC7E,IAAI,CAACA,aAAa,CAACM,MAAM,EAAE;QACzB,OAAO,IAAI,CAAC;KACb;IAEDhB,GAAG,CAACS,IAAI,CAACM,MAAK,QAAA,CAAC,0EAA0E,CAAC,CAAC,CAAC;IAC5FL,aAAa,CAACO,OAAO,CAAC,CAACC,GAAG,GAAKP,oBAAoB,CAACO,GAAG,CAAC;IAAA,CAAC,CAAC;IAE1DlB,GAAG,CAACS,IAAI,CACN,+FAA+F,GAC7FM,MAAK,QAAA,CAAC,uCAAuC,CAAC,CACjD,CAAC;IACF,OAAO,KAAK,CAAC;CACd;AAWM,eAAehB,6BAA6B,CACjDI,WAAmB,EACnBC,GAAmC,EACnCC,GAAsB,EACtBC,eAA0B,EACM;QAiC5BD,GAAS;IAhCb,4DAA4D;IAC5D,8CAA8C;IAC9Cc,CAAAA,GAAAA,OAAM,AAA0C,CAAA,QAA1C,CAACf,GAAG,CAACgB,UAAU,EAAE,wBAAwB,CAAC,CAAC;IAEjD,kEAAkE;IAClE,MAAMC,qBAAqB,GAAG,MAAMC,CAAAA,GAAAA,qBAA6B,AAG/D,CAAA,8BAH+D,CAAC;QAChEnB,WAAW;QACXiB,UAAU,EAAEhB,GAAG,CAACgB,UAAU;KAC3B,CAAC,AAAC;IACH,0DAA0D;IAE1D,MAAMG,oBAAoB,GAAGjB,CAAAA,eAAe,QAAQ,GAAvBA,KAAAA,CAAuB,GAAvBA,eAAe,CAAEU,MAAM,CAAA,GAEhDQ,iBAAiB,CAAClB,eAAe,EAAE;QAAE,GAAGD,GAAG,CAACoB,YAAY;QAAE,GAAGpB,GAAG,CAACqB,eAAe;KAAE,CAAC,GAEnF;QAAE,GAAGrB,GAAG,CAACoB,YAAY;QAAE,GAAGpB,GAAG,CAACqB,eAAe;KAAE,AAAC;IACpDzB,KAAK,CAAC,CAAC,0BAA0B,EAAEG,GAAG,CAACgB,UAAU,CAAC,IAAI,CAAC,EAAEG,oBAAoB,CAAC,CAAC;IAE/E,wEAAwE;IACxE,MAAM,EAAEI,KAAK,EAAEC,uBAAuB,CAAA,EAAEC,OAAO,CAAA,EAAE,GAAGC,kBAAkB,CACpEP,oBAAoB,EACpBF,qBAAqB,CACtB,AAAC;IACFpB,KAAK,CAAC,CAAC,4BAA4B,CAAC,EAAE2B,uBAAuB,CAAC,CAAC;IAC/D3B,KAAK,CAAC,CAAC,4DAA4D,CAAC,EAAE4B,OAAO,CAAC,CAAC;IAC/E,4DAA4D;IAC5D,MAAME,eAAe,GAAG,MAAMC,2BAA2B,CAAC7B,WAAW,EAAEyB,uBAAuB,CAAC,AAAC;IAChG3B,KAAK,CAAC,CAAC,oBAAoB,CAAC,EAAE8B,eAAe,CAAC,CAAC;IAC/C,qHAAqH;IACrH,IAAIrB,aAAa,GAAGuB,yBAAyB,CAAC5B,GAAG,EAAE0B,eAAe,EAAEV,qBAAqB,CAAC,AAAC;IAC3FpB,KAAK,CAAC,CAAC,0BAA0B,CAAC,EAAES,aAAa,CAAC,CAAC;IAEnD,IAAIL,GAAG,QAAM,GAATA,KAAAA,CAAS,GAATA,CAAAA,GAAS,GAATA,GAAG,CAAE6B,IAAI,SAAA,GAAT7B,KAAAA,CAAS,GAATA,QAAAA,GAAS,CAAE8B,OAAO,SAAT,GAAT9B,KAAAA,CAAS,QAAW+B,OAAO,AAAlB,EAAoB;QAC/B,MAAMC,iBAAiB,GAAGhC,GAAG,CAAC6B,IAAI,CAACC,OAAO,CAACC,OAAO,AAAC;QACnD,MAAME,wBAAwB,GAAG5B,aAAa,CAAC6B,MAAM,CAAC,CAACrB,GAAG,GACxDmB,iBAAiB,CAACG,QAAQ,CAACtB,GAAG,CAACN,WAAW,CAAC;QAAA,CAC5C,AAAC;QACFX,KAAK,CACH,CAAC,sEAAsE,CAAC,EACxEqC,wBAAwB,CAACG,GAAG,CAAC,CAACvB,GAAG,GAAKA,GAAG,CAACN,WAAW;QAAA,CAAC,CACvD,CAAC;QACFF,aAAa,GAAGA,aAAa,CAAC6B,MAAM,CAAC,CAACrB,GAAG,GAAK,CAACmB,iBAAiB,CAACG,QAAQ,CAACtB,GAAG,CAACN,WAAW,CAAC;QAAA,CAAC,CAAC;KAC7F;IAED,OAAOF,aAAa,CAAC;CACtB;AAED,SAASc,iBAAiB,CAACkB,IAAc,EAAEC,MAA8B,EAAE;IACzE,OAAOD,IAAI,CAACE,MAAM,CAAyB,CAACC,GAAG,EAAEC,GAAG,GAAK;QACvDD,GAAG,CAACC,GAAG,CAAC,GAAGH,MAAM,CAACG,GAAG,CAAC,CAAC;QACvB,OAAOD,GAAG,CAAC;KACZ,EAAE,EAAE,CAAC,CAAC;CACR;AAED,SAASf,kBAAkB,CACzBL,YAAuD,EACvDsB,oBAA0C,EACF;IACxC,MAAMC,eAAe,GAAGC,MAAM,CAACP,IAAI,CAACjB,YAAY,WAAZA,YAAY,GAAI,EAAE,CAAC,AAAC;IACxD,MAAME,KAAK,GAAa,EAAE,AAAC;IAC3B,MAAME,OAAO,GAAa,EAAE,AAAC;IAC7B,KAAK,MAAMqB,cAAc,IAAIF,eAAe,CAAE;QAC5C,IAAIE,cAAc,IAAIH,oBAAoB,EAAE;YAC1CpB,KAAK,CAACwB,IAAI,CAACD,cAAc,CAAC,CAAC;SAC5B,MAAM;YACLrB,OAAO,CAACsB,IAAI,CAACD,cAAc,CAAC,CAAC;SAC9B;KACF;IACD,OAAO;QAAEvB,KAAK;QAAEE,OAAO;KAAE,CAAC;CAC3B;AAED,eAAeG,2BAA2B,CACxC7B,WAAmB,EACnBiD,QAAkB,EACe;IACjC,MAAMC,8BAA8B,GAAG,MAAMC,OAAO,CAACC,GAAG,CACtDH,QAAQ,CAACX,GAAG,CAAC,CAAC7B,WAAW,GAAK4C,sBAAsB,CAACrD,WAAW,EAAES,WAAW,CAAC;IAAA,CAAC,CAChF,AAAC;IACF,OAAOwC,QAAQ,CAACR,MAAM,CACpB,CAACC,GAAG,EAAEjC,WAAW,EAAE6C,GAAG,GAAK;QACzBZ,GAAG,CAACjC,WAAW,CAAC,GAAGyC,8BAA8B,CAACI,GAAG,CAAC,CAAC;QACvD,OAAOZ,GAAG,CAAC;KACZ,EACD,EAAE,CACH,CAAC;CACH;AAED,eAAeW,sBAAsB,CAACrD,WAAmB,EAAES,WAAmB,EAAmB;IAC/F,IAAI8C,eAAe,AAAoB,AAAC;IACxC,IAAI;QACFA,eAAe,GAAGC,CAAAA,GAAAA,YAAW,AAA4C,CAAA,QAA5C,CAACxD,WAAW,EAAE,CAAC,EAAES,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;KAC3E,CAAC,OAAOgD,KAAK,EAAO;QACnB,qEAAqE;QACrE,gFAAgF;QAChF,IAAIA,KAAK,CAACC,IAAI,KAAK,+BAA+B,EAAE;gBAChCD,GAAoD;YAAtEF,eAAe,GAAGE,CAAAA,GAAoD,GAApDA,KAAK,CAACE,OAAO,CAACC,KAAK,iCAAiC,SAAK,GAAzDH,KAAAA,CAAyD,GAAzDA,GAAoD,AAAE,CAAC,CAAC,CAAC,CAAC;SAC7E;KACF;IACD,IAAI,CAACF,eAAe,EAAE;QACpB,MAAM,IAAIM,OAAY,aAAA,CACpB,CAAC,CAAC,EAAEpD,WAAW,CAAC,oJAAoJ,CAAC,CACtK,CAAC;KACH;IACD,MAAMqD,WAAW,GAAG,MAAMC,SAAQ,QAAA,CAACC,SAAS,CAAuBT,eAAe,CAAC,AAAC;IACpF,OAAOO,WAAW,CAACG,OAAO,CAAC;CAC5B;AAED,SAASnC,yBAAyB,CAChC5B,GAAsB,EACtB0B,eAAuC,EACvCgB,oBAA0C,EACnB;IACvB,MAAMK,QAAQ,GAAGH,MAAM,CAACP,IAAI,CAACX,eAAe,CAAC,AAAC;IAC9C,MAAMrB,aAAa,GAA0B,EAAE,AAAC;IAChD,KAAK,MAAME,WAAW,IAAIwC,QAAQ,CAAE;QAClC,MAAMvC,sBAAsB,GAAGkC,oBAAoB,CAACnC,WAAW,CAAC,AAAC;QACjE,MAAME,aAAa,GAAGiB,eAAe,CAACnB,WAAW,CAAC,AAAC;QACnD,IACE,OAAOC,sBAAsB,KAAK,QAAQ,IAC1C,CAACwD,OAAM,QAAA,CAACC,UAAU,CAACzD,sBAAsB,EAAEC,aAAa,CAAC,EACzD;YACAJ,aAAa,CAACyC,IAAI,CAAC;gBACjBvC,WAAW;gBACX2D,WAAW,EAAEC,kBAAkB,CAACnE,GAAG,EAAEO,WAAW,CAAC;gBACjDC,sBAAsB;gBACtBC,aAAa;aACd,CAAC,CAAC;SACJ;KACF;IACD,OAAOJ,aAAa,CAAC;CACtB;AAED,SAAS8D,kBAAkB,CACzBnE,GAAsB,EACtBO,WAAmB,EACiB;IACpC,IAAIP,GAAG,CAACqB,eAAe,IAAId,WAAW,IAAIP,GAAG,CAACqB,eAAe,EAAE;QAC7D,OAAO,iBAAiB,CAAC;KAC1B;IAED,OAAO,cAAc,CAAC;CACvB"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport semver from 'semver';\n\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\nimport { resolveAllPackageVersionsAsync } from './resolvePackages';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(\n chalk`The following packages should be updated for best compatibility with the installed {bold expo} version:`\n );\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.'\n );\n\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolveAllPackageVersionsAsync(\n projectRoot,\n resolvedPackagesToCheck\n );\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n if (pkg?.expo?.install?.exclude) {\n const packagesToExclude = pkg.expo.install.exclude;\n const incorrectAndExcludedDeps = incorrectDeps.filter((dep) =>\n packagesToExclude.includes(dep.packageName)\n );\n debug(\n `Incorrect dependency warnings filtered out by expo.install.exclude: %O`,\n incorrectAndExcludedDeps.map((dep) => dep.packageName)\n );\n incorrectDeps = incorrectDeps.filter((dep) => !packagesToExclude.includes(dep.packageName));\n }\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (isDependencyVersionIncorrect(packageName, expectedVersionOrRange, actualVersion)) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction isDependencyVersionIncorrect(\n packageName: string,\n expectedVersionOrRange: string | undefined,\n actualVersion: string\n) {\n if (typeof expectedVersionOrRange !== 'string') {\n return false;\n }\n\n // we never want to go backwards with the expo patch version\n if (packageName === 'expo') {\n if (semver.ltr(actualVersion, expectedVersionOrRange)) {\n return true;\n }\n return false;\n }\n\n // all other packages: version range is based on Expo SDK version, so we always want to match range\n if (!semver.intersects(expectedVersionOrRange, actualVersion)) {\n return true;\n }\n\n return false;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","env","EXPO_OFFLINE","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolveAllPackageVersionsAsync","findIncorrectDependencies","expo","install","exclude","packagesToExclude","incorrectAndExcludedDeps","filter","includes","map","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","isDependencyVersionIncorrect","packageType","findDependencyType","semver","ltr","intersects"],"mappings":"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"}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- var _assert = _interopRequireDefault(require("assert"));
6
5
  var _chalk = _interopRequireDefault(require("chalk"));
7
6
  var _commandsTable = require("./commandsTable");
8
7
  var Log = _interopRequireWildcard(require("../../log"));
@@ -88,18 +87,35 @@ class DevServerManagerActions {
88
87
  Log.log();
89
88
  }
90
89
  async openJsInspectorAsync() {
91
- Log.log("Opening JavaScript inspector in the browser...");
92
90
  const metroServerOrigin = this.devServerManager.getDefaultDevServer().getJsInspectorBaseUrl();
93
- (0, _assert).default(metroServerOrigin, "Metro dev server is not running");
94
91
  const apps = await (0, _jsInspector).queryAllInspectorAppsAsync(metroServerOrigin);
92
+ let app1 = null;
95
93
  if (!apps.length) {
96
- Log.warn(`No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${(0, _link).learnMore("https://docs.expo.dev/guides/using-hermes/")}`);
97
- return;
94
+ return Log.warn(_chalk.default`{bold Debug:} No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${(0, _link).learnMore("https://docs.expo.dev/guides/using-hermes/")}`);
98
95
  }
99
- try {
100
- for (const app of apps){
101
- await (0, _jsInspector).openJsInspector(app);
96
+ if (apps.length === 1) {
97
+ app1 = apps[0];
98
+ } else {
99
+ var _deviceName;
100
+ const choices = apps.map((app)=>({
101
+ title: app.title,
102
+ value: (_deviceName = app.deviceName) != null ? _deviceName : "Unknown device",
103
+ app
104
+ })
105
+ );
106
+ const value = await (0, _prompts).selectAsync(_chalk.default`Debug target {dim (Hermes only)}`, choices);
107
+ const menuItem = choices.find((item)=>item.value === value
108
+ );
109
+ if (!menuItem) {
110
+ return Log.error(_chalk.default`{bold Debug:} No device available for "${value}"`);
102
111
  }
112
+ app1 = menuItem.app;
113
+ }
114
+ if (!app1) {
115
+ return Log.error(_chalk.default`{bold Debug:} No device selected`);
116
+ }
117
+ try {
118
+ await (0, _jsInspector).openJsInspector(metroServerOrigin, app1);
103
119
  } catch (error) {
104
120
  Log.error("Failed to open JavaScript inspector. This is often an issue with Google Chrome.");
105
121
  Log.exception(error);
@@ -111,9 +127,9 @@ class DevServerManagerActions {
111
127
  this.devServerManager.broadcastMessage("reload");
112
128
  }
113
129
  async openMoreToolsAsync() {
130
+ // Options match: Chrome > View > Developer
114
131
  try {
115
- // Options match: Chrome > View > Developer
116
- const value = await (0, _prompts).selectAsync(_chalk.default`Dev tools {dim (native only)}`, [
132
+ const defaultMenuItems = [
117
133
  {
118
134
  title: "Inspect elements",
119
135
  value: "toggleElementInspector"
@@ -131,15 +147,34 @@ class DevServerManagerActions {
131
147
  value: "reload"
132
148
  },
133
149
  {
134
- title: "Start React devtools",
135
- value: "startReactDevTools"
136
- },
137
- ]);
138
- if (value === "startReactDevTools") {
139
- this.startReactDevToolsAsync();
140
- } else {
150
+ title: "Open React devtools",
151
+ value: "openReactDevTools",
152
+ action: this.openReactDevToolsAsync
153
+ }
154
+ ];
155
+ const pluginMenuItems = (await this.devServerManager.devtoolsPluginManager.queryPluginsAsync()).map((plugin)=>({
156
+ title: _chalk.default`Open devtools plugin - {bold ${plugin.packageName}}`,
157
+ value: `devtoolsPlugin:${plugin.packageName}`,
158
+ action: async ()=>{
159
+ const url = new URL(plugin.webpageEndpoint, this.devServerManager.getDefaultDevServer().getUrlCreator().constructUrl({
160
+ scheme: "http"
161
+ }));
162
+ await (0, _open).openBrowserAsync(url.toString());
163
+ }
164
+ })
165
+ );
166
+ const menuItems = [
167
+ ...defaultMenuItems,
168
+ ...pluginMenuItems
169
+ ];
170
+ const value = await (0, _prompts).selectAsync(_chalk.default`Dev tools {dim (native only)}`, menuItems);
171
+ const menuItem = menuItems.find((item)=>item.value === value
172
+ );
173
+ if (menuItem == null ? void 0 : menuItem.action) {
174
+ menuItem.action();
175
+ } else if (menuItem == null ? void 0 : menuItem.value) {
141
176
  this.devServerManager.broadcastMessage("sendDevCommand", {
142
- name: value
177
+ name: menuItem.value
143
178
  });
144
179
  }
145
180
  } catch (error) {
@@ -149,7 +184,7 @@ class DevServerManagerActions {
149
184
  (0, _commandsTable).printHelp();
150
185
  }
151
186
  }
152
- async startReactDevToolsAsync() {
187
+ async openReactDevToolsAsync() {
153
188
  await (0, _reactDevToolsProxy).startReactDevToolsProxyAsync();
154
189
  const url = this.devServerManager.getDefaultDevServer().getReactDevToolsUrl();
155
190
  await (0, _open).openBrowserAsync(url);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/interface/interactiveActions.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport { BLT, printHelp, printItem, printQRCode, printUsage, StartOptions } from './commandsTable';\nimport * as Log from '../../log';\nimport { delayAsync } from '../../utils/delay';\nimport { learnMore } from '../../utils/link';\nimport { openBrowserAsync } from '../../utils/open';\nimport { selectAsync } from '../../utils/prompts';\nimport { DevServerManager } from '../server/DevServerManager';\nimport {\n addReactDevToolsReloadListener,\n startReactDevToolsProxyAsync,\n} from '../server/ReactDevToolsProxy';\nimport {\n openJsInspector,\n queryAllInspectorAppsAsync,\n} from '../server/middleware/inspector/JsInspector';\n\nconst debug = require('debug')('expo:start:interface:interactiveActions') as typeof console.log;\n\n/** Wraps the DevServerManager and adds an interface for user actions. */\nexport class DevServerManagerActions {\n constructor(private devServerManager: DevServerManager) {}\n\n printDevServerInfo(\n options: Pick<StartOptions, 'devClient' | 'isWebSocketsEnabled' | 'platforms'>\n ) {\n // If native dev server is running, print its URL.\n if (this.devServerManager.getNativeDevServerPort()) {\n const devServer = this.devServerManager.getDefaultDevServer();\n try {\n const nativeRuntimeUrl = devServer.getNativeRuntimeUrl()!;\n const interstitialPageUrl = devServer.getRedirectUrl();\n\n printQRCode(interstitialPageUrl ?? nativeRuntimeUrl);\n\n if (interstitialPageUrl) {\n Log.log(\n printItem(\n chalk`Choose an app to open your project at {underline ${interstitialPageUrl}}`\n )\n );\n }\n Log.log(printItem(chalk`Metro waiting on {underline ${nativeRuntimeUrl}}`));\n if (options.devClient === false) {\n // TODO: if development build, change this message!\n Log.log(\n printItem('Scan the QR code above with Expo Go (Android) or the Camera app (iOS)')\n );\n } else {\n Log.log(\n printItem(\n 'Scan the QR code above to open the project in a development build. ' +\n learnMore('https://expo.fyi/start')\n )\n );\n }\n } catch (error) {\n console.log('err', error);\n // @ts-ignore: If there is no development build scheme, then skip the QR code.\n if (error.code !== 'NO_DEV_CLIENT_SCHEME') {\n throw error;\n } else {\n const serverUrl = devServer.getDevServerUrl();\n Log.log(printItem(chalk`Metro waiting on {underline ${serverUrl}}`));\n Log.log(printItem(`Linking is disabled because the client scheme cannot be resolved.`));\n }\n }\n }\n\n const webDevServer = this.devServerManager.getWebDevServer();\n const webUrl = webDevServer?.getDevServerUrl({ hostType: 'localhost' });\n if (webUrl) {\n Log.log();\n Log.log(printItem(chalk`Web is waiting on {underline ${webUrl}}`));\n }\n\n printUsage(options, { verbose: false });\n printHelp();\n Log.log();\n }\n\n async openJsInspectorAsync() {\n Log.log('Opening JavaScript inspector in the browser...');\n const metroServerOrigin = this.devServerManager.getDefaultDevServer().getJsInspectorBaseUrl();\n assert(metroServerOrigin, 'Metro dev server is not running');\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n if (!apps.length) {\n Log.warn(\n `No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${learnMore(\n 'https://docs.expo.dev/guides/using-hermes/'\n )}`\n );\n return;\n }\n try {\n for (const app of apps) {\n await openJsInspector(app);\n }\n } catch (error: any) {\n Log.error('Failed to open JavaScript inspector. This is often an issue with Google Chrome.');\n Log.exception(error);\n }\n }\n\n reloadApp() {\n Log.log(`${BLT} Reloading apps`);\n // Send reload requests over the dev servers\n this.devServerManager.broadcastMessage('reload');\n }\n\n async openMoreToolsAsync() {\n try {\n // Options match: Chrome > View > Developer\n const value = await selectAsync(chalk`Dev tools {dim (native only)}`, [\n { title: 'Inspect elements', value: 'toggleElementInspector' },\n { title: 'Toggle performance monitor', value: 'togglePerformanceMonitor' },\n { title: 'Toggle developer menu', value: 'toggleDevMenu' },\n { title: 'Reload app', value: 'reload' },\n { title: 'Start React devtools', value: 'startReactDevTools' },\n // TODO: Maybe a \"View Source\" option to open code.\n // Toggling Remote JS Debugging is pretty rough, so leaving it disabled.\n // { title: 'Toggle Remote Debugging', value: 'toggleRemoteDebugging' },\n ]);\n if (value === 'startReactDevTools') {\n this.startReactDevToolsAsync();\n } else {\n this.devServerManager.broadcastMessage('sendDevCommand', { name: value });\n }\n } catch (error: any) {\n debug(error);\n // do nothing\n } finally {\n printHelp();\n }\n }\n\n async startReactDevToolsAsync() {\n await startReactDevToolsProxyAsync();\n const url = this.devServerManager.getDefaultDevServer().getReactDevToolsUrl();\n await openBrowserAsync(url);\n addReactDevToolsReloadListener(() => {\n this.reconnectReactDevTools();\n });\n this.reconnectReactDevTools();\n }\n\n async reconnectReactDevTools() {\n // Wait a little time for react-devtools to be initialized in browser\n await delayAsync(3000);\n this.devServerManager.broadcastMessage('sendDevCommand', { name: 'reconnectReactDevTools' });\n }\n\n toggleDevMenu() {\n Log.log(`${BLT} Toggling dev menu`);\n this.devServerManager.broadcastMessage('devMenu');\n }\n}\n"],"names":["Log","debug","require","DevServerManagerActions","constructor","devServerManager","printDevServerInfo","options","getNativeDevServerPort","devServer","getDefaultDevServer","nativeRuntimeUrl","getNativeRuntimeUrl","interstitialPageUrl","getRedirectUrl","printQRCode","log","printItem","chalk","devClient","learnMore","error","console","code","serverUrl","getDevServerUrl","webDevServer","getWebDevServer","webUrl","hostType","printUsage","verbose","printHelp","openJsInspectorAsync","metroServerOrigin","getJsInspectorBaseUrl","assert","apps","queryAllInspectorAppsAsync","length","warn","app","openJsInspector","exception","reloadApp","BLT","broadcastMessage","openMoreToolsAsync","value","selectAsync","title","startReactDevToolsAsync","name","startReactDevToolsProxyAsync","url","getReactDevToolsUrl","openBrowserAsync","addReactDevToolsReloadListener","reconnectReactDevTools","delayAsync","toggleDevMenu"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/interface/interactiveActions.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { BLT, printHelp, printItem, printQRCode, printUsage, StartOptions } from './commandsTable';\nimport * as Log from '../../log';\nimport { delayAsync } from '../../utils/delay';\nimport { learnMore } from '../../utils/link';\nimport { openBrowserAsync } from '../../utils/open';\nimport { ExpoChoice, selectAsync } from '../../utils/prompts';\nimport { DevServerManager } from '../server/DevServerManager';\nimport {\n addReactDevToolsReloadListener,\n startReactDevToolsProxyAsync,\n} from '../server/ReactDevToolsProxy';\nimport {\n MetroInspectorProxyApp,\n openJsInspector,\n queryAllInspectorAppsAsync,\n} from '../server/middleware/inspector/JsInspector';\n\nconst debug = require('debug')('expo:start:interface:interactiveActions') as typeof console.log;\n\ninterface MoreToolMenuItem extends ExpoChoice<string> {\n action?: () => unknown;\n}\n\n/** Wraps the DevServerManager and adds an interface for user actions. */\nexport class DevServerManagerActions {\n constructor(private devServerManager: DevServerManager) {}\n\n printDevServerInfo(\n options: Pick<StartOptions, 'devClient' | 'isWebSocketsEnabled' | 'platforms'>\n ) {\n // If native dev server is running, print its URL.\n if (this.devServerManager.getNativeDevServerPort()) {\n const devServer = this.devServerManager.getDefaultDevServer();\n try {\n const nativeRuntimeUrl = devServer.getNativeRuntimeUrl()!;\n const interstitialPageUrl = devServer.getRedirectUrl();\n\n printQRCode(interstitialPageUrl ?? nativeRuntimeUrl);\n\n if (interstitialPageUrl) {\n Log.log(\n printItem(\n chalk`Choose an app to open your project at {underline ${interstitialPageUrl}}`\n )\n );\n }\n Log.log(printItem(chalk`Metro waiting on {underline ${nativeRuntimeUrl}}`));\n if (options.devClient === false) {\n // TODO: if development build, change this message!\n Log.log(\n printItem('Scan the QR code above with Expo Go (Android) or the Camera app (iOS)')\n );\n } else {\n Log.log(\n printItem(\n 'Scan the QR code above to open the project in a development build. ' +\n learnMore('https://expo.fyi/start')\n )\n );\n }\n } catch (error) {\n console.log('err', error);\n // @ts-ignore: If there is no development build scheme, then skip the QR code.\n if (error.code !== 'NO_DEV_CLIENT_SCHEME') {\n throw error;\n } else {\n const serverUrl = devServer.getDevServerUrl();\n Log.log(printItem(chalk`Metro waiting on {underline ${serverUrl}}`));\n Log.log(printItem(`Linking is disabled because the client scheme cannot be resolved.`));\n }\n }\n }\n\n const webDevServer = this.devServerManager.getWebDevServer();\n const webUrl = webDevServer?.getDevServerUrl({ hostType: 'localhost' });\n if (webUrl) {\n Log.log();\n Log.log(printItem(chalk`Web is waiting on {underline ${webUrl}}`));\n }\n\n printUsage(options, { verbose: false });\n printHelp();\n Log.log();\n }\n\n async openJsInspectorAsync() {\n const metroServerOrigin = this.devServerManager.getDefaultDevServer().getJsInspectorBaseUrl();\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n let app: MetroInspectorProxyApp | null = null;\n\n if (!apps.length) {\n return Log.warn(\n chalk`{bold Debug:} No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${learnMore(\n 'https://docs.expo.dev/guides/using-hermes/'\n )}`\n );\n }\n\n if (apps.length === 1) {\n app = apps[0];\n } else {\n const choices = apps.map((app) => ({\n title: app.title,\n value: app.deviceName ?? 'Unknown device',\n app,\n }));\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n const menuItem = choices.find((item) => item.value === value);\n if (!menuItem) {\n return Log.error(chalk`{bold Debug:} No device available for \"${value}\"`);\n }\n\n app = menuItem.app;\n }\n\n if (!app) {\n return Log.error(chalk`{bold Debug:} No device selected`);\n }\n\n try {\n await openJsInspector(metroServerOrigin, app);\n } catch (error: any) {\n Log.error('Failed to open JavaScript inspector. This is often an issue with Google Chrome.');\n Log.exception(error);\n }\n }\n\n reloadApp() {\n Log.log(`${BLT} Reloading apps`);\n // Send reload requests over the dev servers\n this.devServerManager.broadcastMessage('reload');\n }\n\n async openMoreToolsAsync() {\n // Options match: Chrome > View > Developer\n try {\n const defaultMenuItems: MoreToolMenuItem[] = [\n { title: 'Inspect elements', value: 'toggleElementInspector' },\n { title: 'Toggle performance monitor', value: 'togglePerformanceMonitor' },\n { title: 'Toggle developer menu', value: 'toggleDevMenu' },\n { title: 'Reload app', value: 'reload' },\n {\n title: 'Open React devtools',\n value: 'openReactDevTools',\n action: this.openReactDevToolsAsync,\n },\n // TODO: Maybe a \"View Source\" option to open code.\n ];\n const pluginMenuItems = (\n await this.devServerManager.devtoolsPluginManager.queryPluginsAsync()\n ).map((plugin) => ({\n title: chalk`Open devtools plugin - {bold ${plugin.packageName}}`,\n value: `devtoolsPlugin:${plugin.packageName}`,\n action: async () => {\n const url = new URL(\n plugin.webpageEndpoint,\n this.devServerManager\n .getDefaultDevServer()\n .getUrlCreator()\n .constructUrl({ scheme: 'http' })\n );\n await openBrowserAsync(url.toString());\n },\n }));\n const menuItems = [...defaultMenuItems, ...pluginMenuItems];\n const value = await selectAsync(chalk`Dev tools {dim (native only)}`, menuItems);\n const menuItem = menuItems.find((item) => item.value === value);\n if (menuItem?.action) {\n menuItem.action();\n } else if (menuItem?.value) {\n this.devServerManager.broadcastMessage('sendDevCommand', { name: menuItem.value });\n }\n } catch (error: any) {\n debug(error);\n // do nothing\n } finally {\n printHelp();\n }\n }\n\n async openReactDevToolsAsync() {\n await startReactDevToolsProxyAsync();\n const url = this.devServerManager.getDefaultDevServer().getReactDevToolsUrl();\n await openBrowserAsync(url);\n addReactDevToolsReloadListener(() => {\n this.reconnectReactDevTools();\n });\n this.reconnectReactDevTools();\n }\n\n async reconnectReactDevTools() {\n // Wait a little time for react-devtools to be initialized in browser\n await delayAsync(3000);\n this.devServerManager.broadcastMessage('sendDevCommand', { name: 'reconnectReactDevTools' });\n }\n\n toggleDevMenu() {\n Log.log(`${BLT} Toggling dev menu`);\n this.devServerManager.broadcastMessage('devMenu');\n }\n}\n"],"names":["Log","debug","require","DevServerManagerActions","constructor","devServerManager","printDevServerInfo","options","getNativeDevServerPort","devServer","getDefaultDevServer","nativeRuntimeUrl","getNativeRuntimeUrl","interstitialPageUrl","getRedirectUrl","printQRCode","log","printItem","chalk","devClient","learnMore","error","console","code","serverUrl","getDevServerUrl","webDevServer","getWebDevServer","webUrl","hostType","printUsage","verbose","printHelp","openJsInspectorAsync","metroServerOrigin","getJsInspectorBaseUrl","apps","queryAllInspectorAppsAsync","app","length","warn","choices","map","title","value","deviceName","selectAsync","menuItem","find","item","openJsInspector","exception","reloadApp","BLT","broadcastMessage","openMoreToolsAsync","defaultMenuItems","action","openReactDevToolsAsync","pluginMenuItems","devtoolsPluginManager","queryPluginsAsync","plugin","packageName","url","URL","webpageEndpoint","getUrlCreator","constructUrl","scheme","openBrowserAsync","toString","menuItems","name","startReactDevToolsProxyAsync","getReactDevToolsUrl","addReactDevToolsReloadListener","reconnectReactDevTools","delayAsync","toggleDevMenu"],"mappings":"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"}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  var _assert = _interopRequireDefault(require("assert"));
6
6
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
7
7
  var _asyncNgrok = require("./AsyncNgrok");
8
+ var _devToolsPluginManager = _interopRequireDefault(require("./DevToolsPluginManager"));
8
9
  var _developmentSession = require("./DevelopmentSession");
9
10
  var _urlCreator = require("./UrlCreator");
10
11
  var Log = _interopRequireWildcard(require("../../log"));
@@ -46,16 +47,19 @@ const PLATFORM_MANAGERS = {
46
47
  emulator: ()=>require("../platforms/android/AndroidPlatformManager").AndroidPlatformManager
47
48
  };
48
49
  class BundlerDevServer {
49
- constructor(projectRoot, platformBundlers, isDevClient){
50
+ constructor(projectRoot, platformBundlers, /** Advanced options */ options){
50
51
  this.projectRoot = projectRoot;
51
52
  this.platformBundlers = platformBundlers;
52
- this.isDevClient = isDevClient;
53
53
  this.ngrok = null;
54
54
  this.devSession = null;
55
55
  this.instance = null;
56
56
  this.platformManagers = {};
57
57
  this.urlCreator = null;
58
58
  this.notifier = null;
59
+ var ref;
60
+ this.devToolsPluginManager = (ref = options == null ? void 0 : options.devToolsPluginManager) != null ? ref : new _devToolsPluginManager.default(projectRoot);
61
+ var ref1;
62
+ this.isDevClient = (ref1 = options == null ? void 0 : options.isDevClient) != null ? ref1 : false;
59
63
  }
60
64
  setInstance(instance) {
61
65
  this.instance = instance;
@@ -150,8 +154,8 @@ class BundlerDevServer {
150
154
  async startDevSessionAsync() {
151
155
  var // This is used to make Expo Go open the project in either Expo Go, or the web browser.
152
156
  // Must come after ngrok (`startTunnelAsync`) setup.
153
- ref1;
154
- (ref1 = this.devSession) == null ? void 0 : ref1.stopNotifying == null ? void 0 : ref1.stopNotifying();
157
+ ref2;
158
+ (ref2 = this.devSession) == null ? void 0 : ref2.stopNotifying == null ? void 0 : ref2.stopNotifying();
155
159
  this.devSession = new _developmentSession.DevelopmentSession(this.projectRoot, // This URL will be used on external devices so the computer IP won't be relevant.
156
160
  this.isTargetingNative() ? this.getNativeRuntimeUrl() : this.getDevServerUrl({
157
161
  hostType: "localhost"
@@ -195,12 +199,12 @@ class BundlerDevServer {
195
199
  }
196
200
  /** Stop the running dev server instance. */ async stopAsync() {
197
201
  var // Stop file watching.
198
- ref4, ref2, ref3;
199
- (ref4 = this.notifier) == null ? void 0 : ref4.stopObserving();
202
+ ref5, ref3, ref4;
203
+ (ref5 = this.notifier) == null ? void 0 : ref5.stopObserving();
200
204
  // Stop the dev session timer and tell Expo API to remove dev session.
201
- await ((ref2 = this.devSession) == null ? void 0 : ref2.closeAsync());
205
+ await ((ref3 = this.devSession) == null ? void 0 : ref3.closeAsync());
202
206
  // Stop ngrok if running.
203
- await ((ref3 = this.ngrok) == null ? void 0 : ref3.stopAsync().catch((e)=>{
207
+ await ((ref4 = this.ngrok) == null ? void 0 : ref4.stopAsync().catch((e)=>{
204
208
  Log.error(`Error stopping ngrok:`);
205
209
  Log.exception(e);
206
210
  }));
@@ -270,8 +274,8 @@ class BundlerDevServer {
270
274
  }
271
275
  /** Get the tunnel URL from ngrok. */ getTunnelUrl() {
272
276
  var ref;
273
- var ref5;
274
- return (ref5 = (ref = this.ngrok) == null ? void 0 : ref.getActiveUrl()) != null ? ref5 : null;
277
+ var ref6;
278
+ return (ref6 = (ref = this.ngrok) == null ? void 0 : ref.getActiveUrl()) != null ? ref6 : null;
275
279
  }
276
280
  /** Open the dev server in a runtime. */ async openPlatformAsync(launchTarget, resolver = {}) {
277
281
  if (launchTarget === "desktop") {