@depup/expo__cli 55.0.23-depup.0 → 57.0.9-depup.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 (594) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -15
  3. package/build/bin/cli +4 -4
  4. package/build/bin/cli.map +1 -1
  5. package/build/src/api/endpoint.js +4 -4
  6. package/build/src/api/endpoint.js.map +1 -1
  7. package/build/src/api/getExpoSchema.js +3 -3
  8. package/build/src/api/getExpoSchema.js.map +1 -1
  9. package/build/src/api/graphql/client.js +26 -14
  10. package/build/src/api/graphql/client.js.map +1 -1
  11. package/build/src/api/graphql/mutations/TunnelMutation.js +31 -0
  12. package/build/src/api/graphql/mutations/TunnelMutation.js.map +1 -0
  13. package/build/src/api/rest/cache/FileSystemResponseCache.js.map +1 -1
  14. package/build/src/api/rest/cache/ResponseCache.js +5 -5
  15. package/build/src/api/rest/cache/ResponseCache.js.map +1 -1
  16. package/build/src/api/rest/client.js +35 -20
  17. package/build/src/api/rest/client.js.map +1 -1
  18. package/build/src/api/rest/wrapFetchWithBaseUrl.js.map +1 -1
  19. package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
  20. package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
  21. package/build/src/api/rest/wrapFetchWithUserAgent.js.map +1 -1
  22. package/build/src/api/updateDevelopmentSession.js +6 -5
  23. package/build/src/api/updateDevelopmentSession.js.map +1 -1
  24. package/build/src/api/user/UserSettings.js +28 -15
  25. package/build/src/api/user/UserSettings.js.map +1 -1
  26. package/build/src/api/user/actions.js +10 -3
  27. package/build/src/api/user/actions.js.map +1 -1
  28. package/build/src/api/user/expoSsoLauncher.js +76 -24
  29. package/build/src/api/user/expoSsoLauncher.js.map +1 -1
  30. package/build/src/api/user/otp.js +4 -4
  31. package/build/src/api/user/otp.js.map +1 -1
  32. package/build/src/api/user/user.js +19 -7
  33. package/build/src/api/user/user.js.map +1 -1
  34. package/build/src/config/configAsync.js +3 -3
  35. package/build/src/config/configAsync.js.map +1 -1
  36. package/build/src/config/index.js.map +1 -1
  37. package/build/src/customize/customizeAsync.js.map +1 -1
  38. package/build/src/customize/generate.js +7 -4
  39. package/build/src/customize/generate.js.map +1 -1
  40. package/build/src/customize/index.js.map +1 -1
  41. package/build/src/customize/templates.js +4 -6
  42. package/build/src/customize/templates.js.map +1 -1
  43. package/build/src/customize/typescript.js.map +1 -1
  44. package/build/src/events/index.js +19 -15
  45. package/build/src/events/index.js.map +1 -1
  46. package/build/src/events/stream.js +94 -24
  47. package/build/src/events/stream.js.map +1 -1
  48. package/build/src/expoUpdatesExports.js +4 -4
  49. package/build/src/expoUpdatesExports.js.map +1 -1
  50. package/build/src/export/createMetadataJson.js +2 -1
  51. package/build/src/export/createMetadataJson.js.map +1 -1
  52. package/build/src/export/embed/exportEmbedAsync.js +45 -20
  53. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  54. package/build/src/export/embed/exportServer.js +1 -1
  55. package/build/src/export/embed/exportServer.js.map +1 -1
  56. package/build/src/export/embed/index.js.map +1 -1
  57. package/build/src/export/embed/resolveOptions.js +7 -6
  58. package/build/src/export/embed/resolveOptions.js.map +1 -1
  59. package/build/src/export/embed/xcodeCompilerLogger.js +7 -7
  60. package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -1
  61. package/build/src/export/exportApp.js +32 -28
  62. package/build/src/export/exportApp.js.map +1 -1
  63. package/build/src/export/exportAssets.js +5 -5
  64. package/build/src/export/exportAssets.js.map +1 -1
  65. package/build/src/export/exportAsync.js.map +1 -1
  66. package/build/src/export/exportDomComponents.js +5 -5
  67. package/build/src/export/exportDomComponents.js.map +1 -1
  68. package/build/src/export/exportHermes.js +23 -13
  69. package/build/src/export/exportHermes.js.map +1 -1
  70. package/build/src/export/exportStaticAsync.js +30 -21
  71. package/build/src/export/exportStaticAsync.js.map +1 -1
  72. package/build/src/export/favicon.js +26 -34
  73. package/build/src/export/favicon.js.map +1 -1
  74. package/build/src/export/getPublicExpoManifest.js.map +1 -1
  75. package/build/src/export/getResolvedLocales.js.map +1 -1
  76. package/build/src/export/html.js +3 -3
  77. package/build/src/export/html.js.map +1 -1
  78. package/build/src/export/index.js +2 -0
  79. package/build/src/export/index.js.map +1 -1
  80. package/build/src/export/metroAssetLocalPath.js +4 -4
  81. package/build/src/export/metroAssetLocalPath.js.map +1 -1
  82. package/build/src/export/persistMetroAssets.js +6 -6
  83. package/build/src/export/persistMetroAssets.js.map +1 -1
  84. package/build/src/export/publicFolder.js +16 -4
  85. package/build/src/export/publicFolder.js.map +1 -1
  86. package/build/src/export/resolveOptions.js +12 -13
  87. package/build/src/export/resolveOptions.js.map +1 -1
  88. package/build/src/export/saveAssets.js +3 -3
  89. package/build/src/export/saveAssets.js.map +1 -1
  90. package/build/src/export/static.js +6 -0
  91. package/build/src/export/static.js.map +1 -0
  92. package/build/src/export/web/exportWebAsync.js.map +1 -1
  93. package/build/src/export/web/index.js.map +1 -1
  94. package/build/src/export/writeContents.js.map +1 -1
  95. package/build/src/install/checkPackages.js +1 -28
  96. package/build/src/install/checkPackages.js.map +1 -1
  97. package/build/src/install/fixPackages.js.map +1 -1
  98. package/build/src/install/index.js.map +1 -1
  99. package/build/src/install/installAsync.js +3 -3
  100. package/build/src/install/installAsync.js.map +1 -1
  101. package/build/src/install/installExpoPackage.js.map +1 -1
  102. package/build/src/install/resolveOptions.js.map +1 -1
  103. package/build/src/install/utils/autoAddConfigPlugins.js +3 -3
  104. package/build/src/install/utils/autoAddConfigPlugins.js.map +1 -1
  105. package/build/src/install/utils/checkPackagesCompatibility.js +32 -16
  106. package/build/src/install/utils/checkPackagesCompatibility.js.map +1 -1
  107. package/build/src/lint/ESlintPrerequisite.js.map +1 -1
  108. package/build/src/log.js +32 -14
  109. package/build/src/log.js.map +1 -1
  110. package/build/src/login/index.js +25 -5
  111. package/build/src/login/index.js.map +1 -1
  112. package/build/src/logout/index.js.map +1 -1
  113. package/build/src/prebuild/clearNativeFolder.js +49 -14
  114. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  115. package/build/src/prebuild/configureProjectAsync.js.map +1 -1
  116. package/build/src/prebuild/copyTemplateFiles.js +3 -3
  117. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  118. package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
  119. package/build/src/prebuild/index.js +3 -2
  120. package/build/src/prebuild/index.js.map +1 -1
  121. package/build/src/prebuild/prebuildAsync.js +31 -6
  122. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  123. package/build/src/prebuild/renameTemplateAppName.js +8 -5
  124. package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
  125. package/build/src/prebuild/resolveOptions.js +7 -7
  126. package/build/src/prebuild/resolveOptions.js.map +1 -1
  127. package/build/src/prebuild/resolveTemplate.js +10 -5
  128. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  129. package/build/src/prebuild/updateFromTemplate.js +3 -3
  130. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  131. package/build/src/prebuild/updatePackageJson.js +7 -7
  132. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  133. package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -1
  134. package/build/src/register/index.js.map +1 -1
  135. package/build/src/run/android/index.js.map +1 -1
  136. package/build/src/run/android/resolveGradlePropsAsync.js +3 -4
  137. package/build/src/run/android/resolveGradlePropsAsync.js.map +1 -1
  138. package/build/src/run/android/resolveInstallApkName.js +48 -1
  139. package/build/src/run/android/resolveInstallApkName.js.map +1 -1
  140. package/build/src/run/android/resolveLaunchProps.js +4 -1
  141. package/build/src/run/android/resolveLaunchProps.js.map +1 -1
  142. package/build/src/run/android/resolveOptions.js.map +1 -1
  143. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  144. package/build/src/run/ensureNativeProject.js.map +1 -1
  145. package/build/src/run/hints.js +4 -4
  146. package/build/src/run/hints.js.map +1 -1
  147. package/build/src/run/index.js.map +1 -1
  148. package/build/src/run/ios/XcodeBuild.js +163 -23
  149. package/build/src/run/ios/XcodeBuild.js.map +1 -1
  150. package/build/src/run/ios/appleDevice/AppleDevice.js +6 -5
  151. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
  152. package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -1
  153. package/build/src/run/ios/appleDevice/client/AFCClient.js +10 -16
  154. package/build/src/run/ios/appleDevice/client/AFCClient.js.map +1 -1
  155. package/build/src/run/ios/appleDevice/client/DebugserverClient.js +1 -1
  156. package/build/src/run/ios/appleDevice/client/DebugserverClient.js.map +1 -1
  157. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js +2 -1
  158. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
  159. package/build/src/run/ios/appleDevice/client/LockdowndClient.js +1 -1
  160. package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
  161. package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js.map +1 -1
  162. package/build/src/run/ios/appleDevice/client/ServiceClient.js +3 -3
  163. package/build/src/run/ios/appleDevice/client/ServiceClient.js.map +1 -1
  164. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js.map +1 -1
  165. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +3 -3
  166. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -1
  167. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js +16 -13
  168. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js.map +1 -1
  169. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js +6 -6
  170. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -1
  171. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js +5 -5
  172. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js.map +1 -1
  173. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js +7 -7
  174. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js.map +1 -1
  175. package/build/src/run/ios/appleDevice/protocol/UsbmuxProtocol.js +5 -5
  176. package/build/src/run/ios/appleDevice/protocol/UsbmuxProtocol.js.map +1 -1
  177. package/build/src/run/ios/codeSigning/Security.js +8 -8
  178. package/build/src/run/ios/codeSigning/Security.js.map +1 -1
  179. package/build/src/run/ios/codeSigning/configureCodeSigning.js +5 -3
  180. package/build/src/run/ios/codeSigning/configureCodeSigning.js.map +1 -1
  181. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js +7 -5
  182. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js.map +1 -1
  183. package/build/src/run/ios/codeSigning/settings.js +3 -3
  184. package/build/src/run/ios/codeSigning/settings.js.map +1 -1
  185. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js +4 -4
  186. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js.map +1 -1
  187. package/build/src/run/ios/index.js +8 -1
  188. package/build/src/run/ios/index.js.map +1 -1
  189. package/build/src/run/ios/launchApp.js +3 -3
  190. package/build/src/run/ios/launchApp.js.map +1 -1
  191. package/build/src/run/ios/options/appleDestinations.js.map +1 -1
  192. package/build/src/run/ios/options/promptDevice.js +3 -3
  193. package/build/src/run/ios/options/promptDevice.js.map +1 -1
  194. package/build/src/run/ios/options/resolveDevice.js +8 -3
  195. package/build/src/run/ios/options/resolveDevice.js.map +1 -1
  196. package/build/src/run/ios/options/resolveNativeScheme.js +4 -4
  197. package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -1
  198. package/build/src/run/ios/options/resolveOptions.js +9 -4
  199. package/build/src/run/ios/options/resolveOptions.js.map +1 -1
  200. package/build/src/run/ios/options/resolveXcodeProject.js.map +1 -1
  201. package/build/src/run/ios/runIosAsync.js +39 -0
  202. package/build/src/run/ios/runIosAsync.js.map +1 -1
  203. package/build/src/run/ios/validateExternalBinary.js.map +1 -1
  204. package/build/src/run/startBundler.js +4 -0
  205. package/build/src/run/startBundler.js.map +1 -1
  206. package/build/src/serve/index.js +4 -1
  207. package/build/src/serve/index.js.map +1 -1
  208. package/build/src/serve/serveAsync.js +23 -11
  209. package/build/src/serve/serveAsync.js.map +1 -1
  210. package/build/src/serve/static.js +69 -0
  211. package/build/src/serve/static.js.map +1 -0
  212. package/build/src/start/checkDependenciesOnStart.js +131 -0
  213. package/build/src/start/checkDependenciesOnStart.js.map +1 -0
  214. package/build/src/start/detectDevClient.js +3 -3
  215. package/build/src/start/detectDevClient.js.map +1 -1
  216. package/build/src/start/doctor/Prerequisite.js +4 -4
  217. package/build/src/start/doctor/Prerequisite.js.map +1 -1
  218. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js +53 -91
  219. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -1
  220. package/build/src/start/doctor/apple/XcodePrerequisite.js +3 -3
  221. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  222. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +3 -3
  223. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  224. package/build/src/start/doctor/dependencies/getMissingPackages.js +5 -5
  225. package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -1
  226. package/build/src/start/doctor/dependencies/getVersionedPackages.js +5 -5
  227. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  228. package/build/src/start/doctor/dependencies/reactNativeTv.js +149 -0
  229. package/build/src/start/doctor/dependencies/reactNativeTv.js.map +1 -0
  230. package/build/src/start/doctor/dependencies/resolvePackages.js +4 -4
  231. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -1
  232. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +33 -8
  233. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  234. package/build/src/start/doctor/ngrok/ExternalModule.js +3 -3
  235. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  236. package/build/src/start/doctor/ngrok/NgrokResolver.js +3 -3
  237. package/build/src/start/doctor/ngrok/NgrokResolver.js.map +1 -1
  238. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  239. package/build/src/start/doctor/typescript/updateTSConfig.js +3 -3
  240. package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
  241. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +5 -12
  242. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  243. package/build/src/start/index.js +2 -0
  244. package/build/src/start/index.js.map +1 -1
  245. package/build/src/start/interface/KeyPressHandler.js.map +1 -1
  246. package/build/src/start/interface/cliExtensionMenuItemHandler.js.map +1 -1
  247. package/build/src/start/interface/commandsTable.js +6 -6
  248. package/build/src/start/interface/commandsTable.js.map +1 -1
  249. package/build/src/start/interface/createDevToolsMenuItems.js.map +1 -1
  250. package/build/src/start/interface/interactiveActions.js +49 -6
  251. package/build/src/start/interface/interactiveActions.js.map +1 -1
  252. package/build/src/start/interface/startInterface.js +13 -4
  253. package/build/src/start/interface/startInterface.js.map +1 -1
  254. package/build/src/start/platforms/AppIdResolver.js +4 -0
  255. package/build/src/start/platforms/AppIdResolver.js.map +1 -1
  256. package/build/src/start/platforms/DeviceManager.js.map +1 -1
  257. package/build/src/start/platforms/ExpoGoInstaller.js +13 -4
  258. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  259. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  260. package/build/src/start/platforms/android/AndroidAppIdResolver.js.map +1 -1
  261. package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -1
  262. package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -1
  263. package/build/src/start/platforms/android/activateWindow.js.map +1 -1
  264. package/build/src/start/platforms/android/adb.js +36 -34
  265. package/build/src/start/platforms/android/adb.js.map +1 -1
  266. package/build/src/start/platforms/android/adbReverse.js +4 -4
  267. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  268. package/build/src/start/platforms/android/emulator.js +5 -5
  269. package/build/src/start/platforms/android/emulator.js.map +1 -1
  270. package/build/src/start/platforms/android/getDevices.js.map +1 -1
  271. package/build/src/start/platforms/android/gradle.js +5 -5
  272. package/build/src/start/platforms/android/gradle.js.map +1 -1
  273. package/build/src/start/platforms/android/promptAndroidDevice.js +3 -3
  274. package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -1
  275. package/build/src/start/platforms/ios/AppleAppIdResolver.js.map +1 -1
  276. package/build/src/start/platforms/ios/AppleDeviceManager.js +20 -6
  277. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  278. package/build/src/start/platforms/ios/ApplePlatformManager.js +11 -0
  279. package/build/src/start/platforms/ios/ApplePlatformManager.js.map +1 -1
  280. package/build/src/start/platforms/ios/devicectl.js +7 -7
  281. package/build/src/start/platforms/ios/devicectl.js.map +1 -1
  282. package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js +26 -11
  283. package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js.map +1 -1
  284. package/build/src/start/platforms/ios/getBestSimulator.js +5 -5
  285. package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
  286. package/build/src/start/platforms/ios/promptAppleDevice.js +5 -4
  287. package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -1
  288. package/build/src/start/platforms/ios/simctl.js +25 -19
  289. package/build/src/start/platforms/ios/simctl.js.map +1 -1
  290. package/build/src/start/platforms/ios/simctlLogging.js +3 -3
  291. package/build/src/start/platforms/ios/simctlLogging.js.map +1 -1
  292. package/build/src/start/platforms/ios/xcrun.js +3 -3
  293. package/build/src/start/platforms/ios/xcrun.js.map +1 -1
  294. package/build/src/start/project/devices.js +6 -6
  295. package/build/src/start/project/devices.js.map +1 -1
  296. package/build/src/start/project/dotExpo.js +4 -3
  297. package/build/src/start/project/dotExpo.js.map +1 -1
  298. package/build/src/start/resolveOptions.js +7 -7
  299. package/build/src/start/resolveOptions.js.map +1 -1
  300. package/build/src/start/server/AsyncNgrok.js +1 -1
  301. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  302. package/build/src/start/server/AsyncWsTunnel.js +120 -35
  303. package/build/src/start/server/AsyncWsTunnel.js.map +1 -1
  304. package/build/src/start/server/Bonjour.js +8 -3
  305. package/build/src/start/server/Bonjour.js.map +1 -1
  306. package/build/src/start/server/BundlerDevServer.js +23 -9
  307. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  308. package/build/src/start/server/DevServerManager.js.map +1 -1
  309. package/build/src/start/server/DevToolsPlugin.js +63 -3
  310. package/build/src/start/server/DevToolsPlugin.js.map +1 -1
  311. package/build/src/start/server/DevToolsPlugin.schema.js +8 -3
  312. package/build/src/start/server/DevToolsPlugin.schema.js.map +1 -1
  313. package/build/src/start/server/DevToolsPluginCliExtensionExecutor.js +58 -23
  314. package/build/src/start/server/DevToolsPluginCliExtensionExecutor.js.map +1 -1
  315. package/build/src/start/server/DevToolsPluginCliExtensionResults.js +29 -0
  316. package/build/src/start/server/DevToolsPluginCliExtensionResults.js.map +1 -1
  317. package/build/src/start/server/DevToolsPluginManager.js +20 -6
  318. package/build/src/start/server/DevToolsPluginManager.js.map +1 -1
  319. package/build/src/start/server/DevToolsPluginServerHelpers.js +83 -0
  320. package/build/src/start/server/DevToolsPluginServerHelpers.js.map +1 -0
  321. package/build/src/start/server/DevelopmentSession.js +41 -24
  322. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  323. package/build/src/start/server/MCP.js +10 -3
  324. package/build/src/start/server/MCP.js.map +1 -1
  325. package/build/src/start/server/MCPDevToolsPluginCLIExtensions.js +15 -5
  326. package/build/src/start/server/MCPDevToolsPluginCLIExtensions.js.map +1 -1
  327. package/build/src/start/server/UrlCreator.js +14 -1
  328. package/build/src/start/server/UrlCreator.js.map +1 -1
  329. package/build/src/start/server/createMCPDevToolsExtensionSchema.js +18 -4
  330. package/build/src/start/server/createMCPDevToolsExtensionSchema.js.map +1 -1
  331. package/build/src/start/server/getStaticRenderFunctions.js +13 -24
  332. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  333. package/build/src/start/server/metro/MetroBundlerDevServer.js +239 -108
  334. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  335. package/build/src/start/server/metro/MetroTerminalReporter.js +67 -16
  336. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  337. package/build/src/start/server/metro/TerminalReporter.js +22 -4
  338. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  339. package/build/src/start/server/metro/createExpoAutolinkingResolver.js +25 -12
  340. package/build/src/start/server/metro/createExpoAutolinkingResolver.js.map +1 -1
  341. package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
  342. package/build/src/start/server/metro/createFileMap-fork.js +196 -0
  343. package/build/src/start/server/metro/createFileMap-fork.js.map +1 -0
  344. package/build/src/start/server/metro/createServerComponentsMiddleware.js +22 -22
  345. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  346. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  347. package/build/src/start/server/metro/createTypescriptResolver.js +410 -0
  348. package/build/src/start/server/metro/createTypescriptResolver.js.map +1 -0
  349. package/build/src/start/server/metro/debugging/MessageHandler.js.map +1 -1
  350. package/build/src/start/server/metro/debugging/attachAtlas.js +3 -3
  351. package/build/src/start/server/metro/debugging/attachAtlas.js.map +1 -1
  352. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +6 -5
  353. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -1
  354. package/build/src/start/server/metro/debugging/createHandlersFactory.js.map +1 -1
  355. package/build/src/start/server/metro/debugging/messageHandlers/NetworkResponse.js +20 -4
  356. package/build/src/start/server/metro/debugging/messageHandlers/NetworkResponse.js.map +1 -1
  357. package/build/src/start/server/metro/debugging/pageIsSupported.js.map +1 -1
  358. package/build/src/start/server/metro/dev-server/compression.js.map +1 -1
  359. package/build/src/start/server/metro/dev-server/createMessageSocket.js +13 -2
  360. package/build/src/start/server/metro/dev-server/createMessageSocket.js.map +1 -1
  361. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +9 -2
  362. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
  363. package/build/src/start/server/metro/dev-server/utils/socketMessages.js +3 -3
  364. package/build/src/start/server/metro/dev-server/utils/socketMessages.js.map +1 -1
  365. package/build/src/start/server/metro/errors/FailedToResolveNativeOnlyModuleError.js.map +1 -1
  366. package/build/src/start/server/metro/externals.js +4 -4
  367. package/build/src/start/server/metro/externals.js.map +1 -1
  368. package/build/src/start/server/metro/fetchRouterManifest.js +3 -3
  369. package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
  370. package/build/src/start/server/metro/getCssModulesFromBundler.js +3 -3
  371. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  372. package/build/src/start/server/metro/instantiateMetro.js +141 -57
  373. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  374. package/build/src/start/server/metro/log-box/LogBoxLog.js.map +1 -1
  375. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js +4 -4
  376. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js.map +1 -1
  377. package/build/src/start/server/metro/log-box/formatProjectFilePath.js +3 -3
  378. package/build/src/start/server/metro/log-box/formatProjectFilePath.js.map +1 -1
  379. package/build/src/start/server/metro/metroErrorInterface.js +16 -13
  380. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  381. package/build/src/start/server/metro/metroErrors.js +3 -3
  382. package/build/src/start/server/metro/metroErrors.js.map +1 -1
  383. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js +48 -16
  384. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -1
  385. package/build/src/start/server/metro/resolveLoader.js +3 -3
  386. package/build/src/start/server/metro/resolveLoader.js.map +1 -1
  387. package/build/src/start/server/metro/router.js +23 -14
  388. package/build/src/start/server/metro/router.js.map +1 -1
  389. package/build/src/start/server/metro/runServer-fork.js +13 -10
  390. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  391. package/build/src/start/server/metro/serializeHtml.js +29 -13
  392. package/build/src/start/server/metro/serializeHtml.js.map +1 -1
  393. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +36 -34
  394. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
  395. package/build/src/start/server/metro/withMetroErrorReportingResolver.js +53 -30
  396. package/build/src/start/server/metro/withMetroErrorReportingResolver.js.map +1 -1
  397. package/build/src/start/server/metro/withMetroMultiPlatform.js +187 -126
  398. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  399. package/build/src/start/server/metro/withMetroResolvers.js +4 -4
  400. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
  401. package/build/src/start/server/middleware/ContextModuleSourceMapsMiddleware.js.map +1 -1
  402. package/build/src/start/server/middleware/CorsMiddleware.js +3 -3
  403. package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -1
  404. package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
  405. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js +60 -9
  406. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js.map +1 -1
  407. package/build/src/start/server/middleware/DomComponentsMiddleware.js +16 -12
  408. package/build/src/start/server/middleware/DomComponentsMiddleware.js.map +1 -1
  409. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +6 -4
  410. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  411. package/build/src/start/server/middleware/ExpoMiddleware.js +3 -3
  412. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  413. package/build/src/start/server/middleware/FaviconMiddleware.js.map +1 -1
  414. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -1
  415. package/build/src/start/server/middleware/InterstitialPageMiddleware.js +13 -8
  416. package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
  417. package/build/src/start/server/middleware/ManifestMiddleware.js +15 -6
  418. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  419. package/build/src/start/server/middleware/OpenMiddleware.js +150 -0
  420. package/build/src/start/server/middleware/OpenMiddleware.js.map +1 -0
  421. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +13 -4
  422. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  423. package/build/src/start/server/middleware/ServeStaticMiddleware.js +2 -9
  424. package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -1
  425. package/build/src/start/server/middleware/domPolyfills.js +60 -0
  426. package/build/src/start/server/middleware/domPolyfills.js.map +1 -0
  427. package/build/src/start/server/middleware/inspector/JsInspector.js +6 -31
  428. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  429. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +14 -24
  430. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -1
  431. package/build/src/start/server/middleware/inspector/middlwareMutations.js +3 -3
  432. package/build/src/start/server/middleware/inspector/middlwareMutations.js.map +1 -1
  433. package/build/src/start/server/middleware/metroOptions.js +15 -14
  434. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  435. package/build/src/start/server/middleware/mutations.js +3 -3
  436. package/build/src/start/server/middleware/mutations.js.map +1 -1
  437. package/build/src/start/server/middleware/openHandlers.js +157 -0
  438. package/build/src/start/server/middleware/openHandlers.js.map +1 -0
  439. package/build/src/start/server/middleware/resolveAssets.js +4 -4
  440. package/build/src/start/server/middleware/resolveAssets.js.map +1 -1
  441. package/build/src/start/server/middleware/resolvePlatform.js +9 -7
  442. package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
  443. package/build/src/start/server/middleware/resolveRuntimeVersionWithExpoUpdatesAsync.js.map +1 -1
  444. package/build/src/start/server/openPlatforms.js.map +1 -1
  445. package/build/src/start/server/platformBundlers.js +3 -1
  446. package/build/src/start/server/platformBundlers.js.map +1 -1
  447. package/build/src/start/server/serverLogLikeMetro.js +13 -36
  448. package/build/src/start/server/serverLogLikeMetro.js.map +1 -1
  449. package/build/src/start/server/type-generation/expo-env.js +3 -3
  450. package/build/src/start/server/type-generation/expo-env.js.map +1 -1
  451. package/build/src/start/server/type-generation/routes.js +14 -55
  452. package/build/src/start/server/type-generation/routes.js.map +1 -1
  453. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  454. package/build/src/start/server/type-generation/tsconfig.js +5 -5
  455. package/build/src/start/server/type-generation/tsconfig.js.map +1 -1
  456. package/build/src/start/server/webTemplate.js +12 -10
  457. package/build/src/start/server/webTemplate.js.map +1 -1
  458. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +3 -3
  459. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  460. package/build/src/start/server/webpack/formatWebpackMessages.js.map +1 -1
  461. package/build/src/start/server/webpack/resolveFromProject.js +4 -4
  462. package/build/src/start/server/webpack/resolveFromProject.js.map +1 -1
  463. package/build/src/start/server/webpack/tls.js +3 -3
  464. package/build/src/start/server/webpack/tls.js.map +1 -1
  465. package/build/src/start/startAsync.js +21 -11
  466. package/build/src/start/startAsync.js.map +1 -1
  467. package/build/src/types.d.ts +2 -0
  468. package/build/src/utils/FileNotifier.js +1 -1
  469. package/build/src/utils/FileNotifier.js.map +1 -1
  470. package/build/src/utils/args.js +5 -5
  471. package/build/src/utils/args.js.map +1 -1
  472. package/build/src/utils/array.js +8 -8
  473. package/build/src/utils/array.js.map +1 -1
  474. package/build/src/utils/build-cache-providers/helpers.js +4 -4
  475. package/build/src/utils/build-cache-providers/helpers.js.map +1 -1
  476. package/build/src/utils/build-cache-providers/index.js +5 -5
  477. package/build/src/utils/build-cache-providers/index.js.map +1 -1
  478. package/build/src/utils/cocoapods.js +5 -5
  479. package/build/src/utils/cocoapods.js.map +1 -1
  480. package/build/src/utils/codesigning.js +12 -6
  481. package/build/src/utils/codesigning.js.map +1 -1
  482. package/build/src/utils/composeMetroIgnorePatterns.js +69 -0
  483. package/build/src/utils/composeMetroIgnorePatterns.js.map +1 -0
  484. package/build/src/utils/createTempPath.js +3 -3
  485. package/build/src/utils/createTempPath.js.map +1 -1
  486. package/build/src/utils/delay.js +4 -4
  487. package/build/src/utils/delay.js.map +1 -1
  488. package/build/src/utils/dir.js +21 -11
  489. package/build/src/utils/dir.js.map +1 -1
  490. package/build/src/utils/downloadAppAsync.js.map +1 -1
  491. package/build/src/utils/downloadExpoGoAsync.js +4 -4
  492. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  493. package/build/src/utils/editor.js +4 -4
  494. package/build/src/utils/editor.js.map +1 -1
  495. package/build/src/utils/env.js +39 -13
  496. package/build/src/utils/env.js.map +1 -1
  497. package/build/src/utils/errors.js +6 -6
  498. package/build/src/utils/errors.js.map +1 -1
  499. package/build/src/utils/exit.js +15 -19
  500. package/build/src/utils/exit.js.map +1 -1
  501. package/build/src/utils/expoUpdatesCli.js +5 -5
  502. package/build/src/utils/expoUpdatesCli.js.map +1 -1
  503. package/build/src/utils/fetch.js +4 -4
  504. package/build/src/utils/fetch.js.map +1 -1
  505. package/build/src/utils/findUp.js +3 -3
  506. package/build/src/utils/findUp.js.map +1 -1
  507. package/build/src/utils/fn.js +3 -3
  508. package/build/src/utils/fn.js.map +1 -1
  509. package/build/src/utils/freeport.js +3 -3
  510. package/build/src/utils/freeport.js.map +1 -1
  511. package/build/src/utils/getOrPromptApplicationId.js +3 -5
  512. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  513. package/build/src/utils/getRunningProcess.js +5 -5
  514. package/build/src/utils/getRunningProcess.js.map +1 -1
  515. package/build/src/utils/git.js +3 -3
  516. package/build/src/utils/git.js.map +1 -1
  517. package/build/src/utils/glob.js +3 -3
  518. package/build/src/utils/glob.js.map +1 -1
  519. package/build/src/utils/ip.js +4 -4
  520. package/build/src/utils/ip.js.map +1 -1
  521. package/build/src/utils/link.js +3 -3
  522. package/build/src/utils/link.js.map +1 -1
  523. package/build/src/utils/mergeGitIgnorePaths.js +10 -10
  524. package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
  525. package/build/src/utils/modifyConfigAsync.js +3 -3
  526. package/build/src/utils/modifyConfigAsync.js.map +1 -1
  527. package/build/src/utils/net.js +23 -4
  528. package/build/src/utils/net.js.map +1 -1
  529. package/build/src/utils/nodeEnv.js +6 -6
  530. package/build/src/utils/nodeEnv.js.map +1 -1
  531. package/build/src/utils/npm.js +10 -9
  532. package/build/src/utils/npm.js.map +1 -1
  533. package/build/src/utils/obj.js +4 -4
  534. package/build/src/utils/obj.js.map +1 -1
  535. package/build/src/utils/open.js +240 -11
  536. package/build/src/utils/open.js.map +1 -1
  537. package/build/src/utils/ora.js +4 -4
  538. package/build/src/utils/ora.js.map +1 -1
  539. package/build/src/utils/plist.js +5 -4
  540. package/build/src/utils/plist.js.map +1 -1
  541. package/build/src/utils/port.js +12 -5
  542. package/build/src/utils/port.js.map +1 -1
  543. package/build/src/utils/progress.js +4 -4
  544. package/build/src/utils/progress.js.map +1 -1
  545. package/build/src/utils/prompts.js +11 -11
  546. package/build/src/utils/prompts.js.map +1 -1
  547. package/build/src/utils/qr.js +5 -4
  548. package/build/src/utils/qr.js.map +1 -1
  549. package/build/src/utils/resolveArgs.js +10 -9
  550. package/build/src/utils/resolveArgs.js.map +1 -1
  551. package/build/src/utils/scheme.js +4 -4
  552. package/build/src/utils/scheme.js.map +1 -1
  553. package/build/src/utils/strings.js.map +1 -1
  554. package/build/src/utils/tar.js +8 -7
  555. package/build/src/utils/tar.js.map +1 -1
  556. package/build/src/utils/telemetry/Telemetry.js +5 -0
  557. package/build/src/utils/telemetry/Telemetry.js.map +1 -1
  558. package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
  559. package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
  560. package/build/src/utils/telemetry/clients/flushFetchDetached.js +5 -1
  561. package/build/src/utils/telemetry/clients/flushFetchDetached.js.map +1 -1
  562. package/build/src/utils/telemetry/index.js +4 -4
  563. package/build/src/utils/telemetry/index.js.map +1 -1
  564. package/build/src/utils/telemetry/utils/agent.js +42 -0
  565. package/build/src/utils/telemetry/utils/agent.js.map +1 -0
  566. package/build/src/utils/telemetry/utils/constants.js +3 -3
  567. package/build/src/utils/telemetry/utils/constants.js.map +1 -1
  568. package/build/src/utils/telemetry/utils/context.js +3 -2
  569. package/build/src/utils/telemetry/utils/context.js.map +1 -1
  570. package/build/src/utils/url.js +5 -17
  571. package/build/src/utils/url.js.map +1 -1
  572. package/build/src/utils/validateApplicationId.js +12 -12
  573. package/build/src/utils/validateApplicationId.js.map +1 -1
  574. package/build/src/utils/variadic.js +4 -4
  575. package/build/src/utils/variadic.js.map +1 -1
  576. package/build/src/whoami/index.js.map +1 -1
  577. package/changes.json +18 -26
  578. package/main.js +3 -0
  579. package/package.json +88 -80
  580. package/static/loading-page/index.html +45 -3
  581. package/static/template/+html.tsx +14 -5
  582. package/add-module.js +0 -8
  583. package/build/src/start/server/middleware/inspector/CdpClient.js +0 -81
  584. package/build/src/start/server/middleware/inspector/CdpClient.js.map +0 -1
  585. package/build/src/utils/resolveWatchFolders.js +0 -67
  586. package/build/src/utils/resolveWatchFolders.js.map +0 -1
  587. package/build/src/utils/tsconfig/evaluateTsConfig.js +0 -87
  588. package/build/src/utils/tsconfig/evaluateTsConfig.js.map +0 -1
  589. package/build/src/utils/tsconfig/loadTsConfigPaths.js +0 -84
  590. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +0 -1
  591. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js +0 -94
  592. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js.map +0 -1
  593. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +0 -62
  594. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import {\n ExpoConfig,\n ExpoGoConfig,\n getConfig,\n PackageJSONConfig,\n ProjectConfig,\n} from '@expo/config';\nimport { resolveRelativeEntryPoint } from '@expo/config/paths';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { resolve } from 'url';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport {\n createBundleUrlPath,\n getBaseUrlFromExpoConfig,\n getAsyncRoutesFromExpoConfig,\n createBundleUrlPathFromExpoConfig,\n} from './metroOptions';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport { isEnableHermesManaged } from '../../../export/exportHermes';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\nimport { getPlatformBundlers, PlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n /** The protocol used to request the manifest */\n protocol?: 'http' | 'https';\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo,\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n private platformBundlers: PlatformBundlers;\n\n constructor(\n protected projectRoot: string,\n protected options: ManifestMiddlewareOptions\n ) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n this.platformBundlers = getPlatformBundlers(projectRoot, this.initialProjectConfig.exp);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n protocol,\n }: Pick<\n TManifestRequestInfo,\n 'hostname' | 'platform' | 'protocol'\n >): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName({\n pkg: projectConfig.pkg,\n platform,\n });\n\n const isHermesEnabled = isEnableHermesManaged(projectConfig.exp, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n engine: isHermesEnabled ? 'hermes' : undefined,\n baseUrl: getBaseUrlFromExpoConfig(projectConfig.exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(\n projectConfig.exp,\n this.options.mode ?? 'development',\n platform\n ),\n routerRoot: getRouterDirectoryModuleIdWithManifest(this.projectRoot, projectConfig.exp),\n protocol,\n reactCompiler: !!projectConfig.exp.experiments?.reactCompiler,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(props: { pkg: PackageJSONConfig; platform: string }): string {\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n return 'index';\n }\n\n const entry = resolveRelativeEntryPoint(this.projectRoot, props);\n debug(`Resolved entry point: ${entry} (project root: ${this.projectRoot})`);\n return entry;\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n engine,\n baseUrl,\n isExporting,\n asyncRoutes,\n routerRoot,\n protocol,\n reactCompiler,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n engine?: 'hermes';\n baseUrl?: string;\n asyncRoutes: boolean;\n isExporting?: boolean;\n routerRoot: string;\n protocol?: 'http' | 'https';\n reactCompiler: boolean;\n }): string {\n const path = createBundleUrlPath({\n mode: this.options.mode ?? 'development',\n minify: this.options.minify,\n platform,\n mainModuleName,\n lazy: !env.EXPO_NO_METRO_LAZY,\n engine,\n bytecode: engine === 'hermes',\n baseUrl,\n isExporting: !!isExporting,\n asyncRoutes,\n routerRoot,\n reactCompiler,\n });\n\n return (\n this.options.constructUrl({\n scheme: protocol ?? 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<Response>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:8081\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n public getWebBundleUrl() {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName({\n pkg: this.initialProjectConfig.pkg,\n platform,\n });\n\n return createBundleUrlPathFromExpoConfig(this.projectRoot, this.initialProjectConfig.exp, {\n platform,\n mainModuleName,\n minify: this.options.minify,\n lazy: !env.EXPO_NO_METRO_LAZY,\n mode: this.options.mode ?? 'development',\n // Hermes doesn't support more modern JS features than most, if not all, modern browser.\n engine: 'hermes',\n isExporting: false,\n bytecode: false,\n });\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n res.setHeader('Content-Type', 'text/html');\n\n res.end(await this.getSingleHtmlTemplateAsync());\n }\n\n getSingleHtmlTemplateAsync() {\n // Read from headers\n const bundleUrl = this.getWebBundleUrl();\n\n return createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n });\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse, next: ServerNext) {\n if (\n this.platformBundlers.web === 'metro' &&\n this.initialProjectConfig.exp.platforms?.includes('web')\n ) {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n if (['static', 'server'].includes(this.initialProjectConfig.exp.web?.output ?? '')) {\n // Skip the spa-styled index.html when static generation is enabled.\n next();\n return true;\n } else {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res, next)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n\n const response = await this._getManifestResponseAsync(options);\n // Convert `Response` to node:http response\n if (typeof res.setHeaders === 'function') {\n res.setHeaders(response.headers);\n } else {\n for (const [key, value] of response.headers.entries()) {\n res.appendHeader(key, value);\n }\n }\n if (response.body) {\n await pipeline(Readable.fromWeb(response.body as any), res);\n } else {\n res.end();\n }\n }\n}\n"],"names":["DEVELOPER_TOOL","ManifestMiddleware","debug","require","ExpoMiddleware","constructor","projectRoot","options","initialProjectConfig","getConfig","platformBundlers","getPlatformBundlers","exp","_resolveProjectSettingsAsync","platform","hostname","protocol","projectConfig","mainModuleName","resolveMainModuleName","pkg","isHermesEnabled","isEnableHermesManaged","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","engine","undefined","baseUrl","getBaseUrlFromExpoConfig","asyncRoutes","getAsyncRoutesFromExpoConfig","mode","routerRoot","getRouterDirectoryModuleIdWithManifest","reactCompiler","experiments","mutateManifestWithAssetsAsync","props","isNativeWebpack","entry","resolveRelativeEntryPoint","saveDevicesAsync","req","deviceIds","headers","ProjectDevices","catch","e","Log","exception","isExporting","path","createBundleUrlPath","minify","lazy","env","EXPO_NO_METRO_LAZY","bytecode","debuggerHost","developer","tool","packagerOpts","dev","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","createBundleUrlPathFromExpoConfig","handleWebRequestAsync","res","setHeader","end","getSingleHtmlTemplateAsync","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","next","web","platforms","includes","parsePlatformHeader","output","handleRequestAsync","getParsedHeaders","response","_getManifestResponseAsync","setHeaders","key","value","entries","appendHeader","body","pipeline","Readable","fromWeb"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import type { ExpoConfig, ExpoGoConfig, PackageJSONConfig, ProjectConfig } from '@expo/config';\nimport { getConfig } from '@expo/config';\nimport { resolveRelativeEntryPoint } from '@expo/config/paths';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { resolve } from 'url';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport {\n createBundleUrlPath,\n getBaseUrlFromExpoConfig,\n getAsyncRoutesFromExpoConfig,\n createBundleUrlPathFromExpoConfig,\n} from './metroOptions';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport type { RuntimePlatform } from './resolvePlatform';\nimport { parsePlatformHeader } from './resolvePlatform';\nimport type { ServerNext, ServerRequest, ServerResponse } from './server.types';\nimport { getActorDisplayName, getUserAsync } from '../../../api/user/user';\nimport { isEnableHermesManaged } from '../../../export/exportHermes';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport * as ProjectDevices from '../../project/devices';\nimport type { UrlCreator } from '../UrlCreator';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\nimport type { PlatformBundlers } from '../platformBundlers';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n /** The protocol used to request the manifest */\n protocol?: 'http' | 'https';\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo,\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n private platformBundlers: PlatformBundlers;\n\n constructor(\n protected projectRoot: string,\n protected options: ManifestMiddlewareOptions\n ) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n this.platformBundlers = getPlatformBundlers(projectRoot, this.initialProjectConfig.exp);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n protocol,\n }: Pick<\n TManifestRequestInfo,\n 'hostname' | 'platform' | 'protocol'\n >): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName({\n pkg: projectConfig.pkg,\n platform,\n });\n\n const isHermesEnabled = isEnableHermesManaged(projectConfig.exp, platform);\n\n // Resolve the signed-in CLI user to pass through the manifest\n const user = await getUserAsync();\n const username = getActorDisplayName(user);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n username: username !== 'anonymous' ? username : undefined,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n engine: isHermesEnabled ? 'hermes' : undefined,\n baseUrl: getBaseUrlFromExpoConfig(projectConfig.exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(\n projectConfig.exp,\n this.options.mode ?? 'development',\n platform\n ),\n routerRoot: getRouterDirectoryModuleIdWithManifest(this.projectRoot, projectConfig.exp),\n protocol,\n reactCompiler: !!projectConfig.exp.experiments?.reactCompiler,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(props: { pkg: PackageJSONConfig; platform: string }): string {\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n return 'index';\n }\n\n const entry = resolveRelativeEntryPoint(this.projectRoot, props);\n debug(`Resolved entry point: ${entry} (project root: ${this.projectRoot})`);\n return entry;\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n engine,\n baseUrl,\n isExporting,\n asyncRoutes,\n routerRoot,\n protocol,\n reactCompiler,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n engine?: 'hermes';\n baseUrl?: string;\n asyncRoutes: boolean;\n isExporting?: boolean;\n routerRoot: string;\n protocol?: 'http' | 'https';\n reactCompiler: boolean;\n }): string {\n const path = createBundleUrlPath({\n mode: this.options.mode ?? 'development',\n minify: this.options.minify,\n platform,\n mainModuleName,\n lazy: !env.EXPO_NO_METRO_LAZY,\n engine,\n bytecode: engine === 'hermes',\n baseUrl,\n isExporting: !!isExporting,\n asyncRoutes,\n routerRoot,\n reactCompiler,\n });\n\n return (\n this.options.constructUrl({\n scheme: protocol ?? 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<Response>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n username,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n username?: string;\n }): ExpoGoConfig {\n return {\n // localhost:8081\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // The signed-in CLI username, used by Expo Go to verify account match.\n ...(username ? { username } : undefined),\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n public getWebBundleUrl() {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName({\n pkg: this.initialProjectConfig.pkg,\n platform,\n });\n\n return createBundleUrlPathFromExpoConfig(this.projectRoot, this.initialProjectConfig.exp, {\n platform,\n mainModuleName,\n minify: this.options.minify,\n lazy: !env.EXPO_NO_METRO_LAZY,\n mode: this.options.mode ?? 'development',\n // Hermes doesn't support more modern JS features than most, if not all, modern browser.\n engine: 'hermes',\n isExporting: false,\n bytecode: false,\n });\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n res.setHeader('Content-Type', 'text/html');\n\n res.end(await this.getSingleHtmlTemplateAsync());\n }\n\n getSingleHtmlTemplateAsync() {\n // Read from headers\n const bundleUrl = this.getWebBundleUrl();\n\n return createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n });\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse, next: ServerNext) {\n if (\n this.platformBundlers.web === 'metro' &&\n this.initialProjectConfig.exp.platforms?.includes('web')\n ) {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n if (['static', 'server'].includes(this.initialProjectConfig.exp.web?.output ?? '')) {\n // Skip the spa-styled index.html when static generation is enabled.\n next();\n return true;\n } else {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res, next)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n\n const response = await this._getManifestResponseAsync(options);\n // Convert `Response` to node:http response\n if (typeof res.setHeaders === 'function') {\n res.setHeaders(response.headers);\n } else {\n for (const [key, value] of response.headers.entries()) {\n res.appendHeader(key, value);\n }\n }\n if (response.body) {\n await pipeline(Readable.fromWeb(response.body as any), res);\n } else {\n res.end();\n }\n }\n}\n"],"names":["DEVELOPER_TOOL","ManifestMiddleware","debug","require","ExpoMiddleware","projectRoot","options","initialProjectConfig","getConfig","platformBundlers","getPlatformBundlers","exp","_resolveProjectSettingsAsync","platform","hostname","protocol","projectConfig","mainModuleName","resolveMainModuleName","pkg","isHermesEnabled","isEnableHermesManaged","user","getUserAsync","username","getActorDisplayName","expoGoConfig","getExpoGoConfig","undefined","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","engine","baseUrl","getBaseUrlFromExpoConfig","asyncRoutes","getAsyncRoutesFromExpoConfig","mode","routerRoot","getRouterDirectoryModuleIdWithManifest","reactCompiler","experiments","mutateManifestWithAssetsAsync","props","isNativeWebpack","entry","resolveRelativeEntryPoint","saveDevicesAsync","req","deviceIds","headers","ProjectDevices","catch","e","Log","exception","isExporting","path","createBundleUrlPath","minify","lazy","env","EXPO_NO_METRO_LAZY","bytecode","debuggerHost","developer","tool","packagerOpts","dev","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","getWebBundleUrl","createBundleUrlPathFromExpoConfig","handleWebRequestAsync","res","setHeader","end","getSingleHtmlTemplateAsync","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","next","web","platforms","includes","parsePlatformHeader","output","handleRequestAsync","getParsedHeaders","response","_getManifestResponseAsync","setHeaders","key","value","entries","appendHeader","body","pipeline","Readable","fromWeb"],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get OpenEndpoint () {
13
+ return OpenEndpoint;
14
+ },
15
+ get OpenMiddleware () {
16
+ return OpenMiddleware;
17
+ }
18
+ });
19
+ const _ExpoMiddleware = require("./ExpoMiddleware");
20
+ const _resolvePlatform = require("./resolvePlatform");
21
+ const _net = require("../../../utils/net");
22
+ const OpenEndpoint = '/_expo/open';
23
+ class OpenMiddleware extends _ExpoMiddleware.ExpoMiddleware {
24
+ constructor(projectRoot, options){
25
+ super(projectRoot, [
26
+ OpenEndpoint
27
+ ]), this.options = options;
28
+ }
29
+ async handleRequestAsync(req, res) {
30
+ (0, _ExpoMiddleware.disableResponseCache)(res);
31
+ res.setHeader('Content-Type', 'application/json');
32
+ const method = (req.method ?? 'GET').toUpperCase();
33
+ const searchParams = new URL(req.url ?? '', 'http://localhost').searchParams;
34
+ const platformParam = (0, _resolvePlatform.parsePlatformHeader)(req);
35
+ const platform = normalizePlatform(platformParam);
36
+ const runtimeParam = searchParams.get('runtime') ?? undefined;
37
+ const normalizedRuntime = runtimeParam ? normalizeRequestedRuntime(runtimeParam) : 'default';
38
+ if (platformParam && !platform) {
39
+ sendError(res, 400, {
40
+ code: 'INVALID_PLATFORM',
41
+ error: `Unsupported "platform" value "${platformParam}". Must be "ios", "android", or "web".`
42
+ });
43
+ return;
44
+ }
45
+ if (runtimeParam && !normalizedRuntime) {
46
+ sendError(res, 400, {
47
+ code: 'INVALID_RUNTIME',
48
+ error: `Unsupported "runtime" value "${runtimeParam}". Must be "default", "expo", "custom", or "unknown".`
49
+ });
50
+ return;
51
+ }
52
+ const runtime = normalizedRuntime ?? 'default';
53
+ if (method === 'POST') {
54
+ const sameDeviceError = assertSameDevice(req);
55
+ if (sameDeviceError) {
56
+ sendError(res, 403, sameDeviceError);
57
+ return;
58
+ }
59
+ const sameOriginError = assertSameOrigin(req, this.options.serverBaseUrl);
60
+ if (sameOriginError) {
61
+ sendError(res, 403, sameOriginError);
62
+ return;
63
+ }
64
+ if (!platform) {
65
+ sendError(res, 400, {
66
+ code: 'MISSING_PLATFORM',
67
+ error: `POST /_expo/open requires a platform. Pass it as the "platform" query param or "expo-platform" header. Must be "ios", "android", or "web".`
68
+ });
69
+ return;
70
+ }
71
+ const support = this.options.getHostSupport(platform);
72
+ if (!support.canOpen) {
73
+ sendError(res, 501, {
74
+ code: 'HOST_CANNOT_OPEN_PLATFORM',
75
+ platform,
76
+ error: `Cannot open the project on ${platform} from this dev server host.`,
77
+ details: (support.reason ? support.reason + ' ' : '') + `Use GET /_expo/open?platform=${platform} to retrieve the deep link, then launch it from a host that supports ${platform} or hand it to a remote preview service.`
78
+ });
79
+ return;
80
+ }
81
+ try {
82
+ const result = await this.options.open({
83
+ platform
84
+ });
85
+ res.statusCode = 200;
86
+ res.end(JSON.stringify(result));
87
+ } catch (error) {
88
+ sendError(res, 500, {
89
+ code: typeof (error == null ? void 0 : error.code) === 'string' ? error.code : 'OPEN_FAILED',
90
+ platform,
91
+ error: `Failed to open the project on ${platform}.`,
92
+ details: (typeof (error == null ? void 0 : error.message) === 'string' ? error.message : String(error)) + ` Check the dev server logs for more detail, or use GET /_expo/open?platform=${platform} to launch the deep link from another environment.`
93
+ });
94
+ }
95
+ return;
96
+ }
97
+ if (method !== 'GET' && method !== 'HEAD') {
98
+ res.setHeader('Allow', 'GET, HEAD, POST');
99
+ sendError(res, 405, {
100
+ code: 'METHOD_NOT_ALLOWED',
101
+ error: `Method "${method}" not allowed. Use GET to inspect, POST to open.`
102
+ });
103
+ return;
104
+ }
105
+ const info = await this.options.getInfo({
106
+ platform,
107
+ runtime
108
+ });
109
+ res.statusCode = 200;
110
+ res.end(JSON.stringify(info));
111
+ }
112
+ }
113
+ function normalizePlatform(p) {
114
+ return p === 'ios' || p === 'android' || p === 'web' ? p : null;
115
+ }
116
+ function normalizeRequestedRuntime(r) {
117
+ return r === 'default' || r === 'expo' || r === 'custom' || r === 'unknown' ? r : null;
118
+ }
119
+ function sendError(res, statusCode, body) {
120
+ res.statusCode = statusCode;
121
+ res.end(JSON.stringify(body));
122
+ }
123
+ function assertSameDevice(req) {
124
+ if ((0, _net.isLocalSocket)(req.socket)) {
125
+ return null;
126
+ }
127
+ return {
128
+ code: 'REMOTE_DEVICE_FORBIDDEN',
129
+ error: 'POST /_expo/open is restricted to same-device requests.',
130
+ details: `The dev server only opens the project for clients connected over the loopback interface ` + `so a device on the LAN (or a tunnel client) can't launch the app on the developer's machine. ` + `Issue the POST from the dev server's host, or use GET /_expo/open to retrieve the deep link and open it from the remote device.`
131
+ };
132
+ }
133
+ function assertSameOrigin(req, serverBaseUrl) {
134
+ var _req_headers;
135
+ if ((0, _net.isMatchingOrigin)(req, serverBaseUrl)) {
136
+ return null;
137
+ }
138
+ const origin = firstHeader((_req_headers = req.headers) == null ? void 0 : _req_headers.origin) ?? 'unknown';
139
+ return {
140
+ code: 'CROSS_ORIGIN_FORBIDDEN',
141
+ error: 'POST /_expo/open is restricted to same-origin requests.',
142
+ details: `Request origin "${origin}" does not match the dev server "${serverBaseUrl}". This protects the dev server from cross-origin scripts that might try to launch the app without the developer's consent. Issue POST requests from the dev server's origin (or from a non-browser client), or use GET /_expo/open to retrieve the deep link and open it yourself.`
143
+ };
144
+ }
145
+ function firstHeader(value) {
146
+ if (Array.isArray(value)) return value[0];
147
+ return value ?? undefined;
148
+ }
149
+
150
+ //# sourceMappingURL=OpenMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/OpenMiddleware.ts"],"sourcesContent":["import { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport { parsePlatformHeader } from './resolvePlatform';\nimport type { ServerRequest, ServerResponse } from './server.types';\nimport { isLocalSocket, isMatchingOrigin } from '../../../utils/net';\n\nexport const OpenEndpoint = '/_expo/open';\n\n/**\n * Resolved runtime returned by the server. Omitted when the URL is a disambiguation page (the\n * actual runtime — Expo Go vs. dev build — isn't decided until the device picks). Matches what\n * the CLI does for `i`/`a` when the project supports both Expo Go and a development build.\n */\nexport type OpenRuntime = 'expo' | 'custom' | 'web';\n\n/**\n * Runtime that a caller can request.\n * - `default` mirrors the CLI's `i`/`a` resolution.\n * - `expo` / `custom` force a direct deep link, bypassing disambiguation.\n * - `unknown` forces the disambiguation/interstitial page even when the CLI would resolve\n * directly. Useful when the caller wants the device (rather than the dev server) to decide.\n */\nexport type OpenRequestedRuntime = 'expo' | 'custom' | 'unknown' | 'default';\n\n/** Subset of {@link OpenRuntime} that represents native deep-link choices (not how to deliver them). */\nexport type OpenNativeRuntime = 'expo' | 'custom';\n\n/** Platform supported by the open endpoint. */\nexport type OpenPlatform = 'ios' | 'android' | 'web';\n\n/** Whether the dev server's host machine can launch the project on a given platform. */\nexport interface OpenHostSupportEntry {\n /** `true` when the host machine is expected to be able to open the platform locally. */\n canOpen: boolean;\n /** Human-readable explanation when `canOpen` is `false`. */\n reason?: string;\n}\n\n/** Per-platform open info — present whether the caller asked for one platform or for discovery. */\nexport interface OpenPlatformInfo {\n /**\n * Concrete runtime that the URL targets. `undefined` when the URL is a disambiguation page —\n * the device decides between Expo Go and the dev build after the user picks.\n */\n runtime?: OpenRuntime;\n /** Deep link (native), disambiguation HTML page (when `runtime` is omitted), or dev server URL (web). `null` when no URL scheme is configured for `runtime: 'custom'`. */\n url: string | null;\n /**\n * Native application identifier (iOS bundle identifier / Android package name) used to detect\n * whether the project is already installed on a target device. `null` when the platform has no\n * concept of an app ID (web), when the project's config is missing the identifier, or when\n * resolution failed. Useful for distributed preview systems that need to confirm a build is\n * present before opening a deep link.\n */\n appId: string | null;\n}\n\n/** Project-level metadata returned on every GET. */\ninterface OpenProjectMeta {\n /** URL scheme used for development build deep links (e.g. `myapp`). `null` when none is configured. */\n scheme: string | null;\n /**\n * Native runtimes the project can target. `['expo']` for Expo Go only, `['custom']` for a dev\n * client only, `['expo', 'custom']` when both are configured — in that case the caller should\n * either pick one explicitly or rely on `runtime: 'default'` (which mirrors the CLI's\n * disambiguation behavior).\n */\n availableRuntimes: OpenNativeRuntime[];\n}\n\n/** GET `/_expo/open?platform=…` — focused per-platform response. */\nexport interface OpenSinglePlatformResult extends OpenProjectMeta, OpenPlatformInfo {}\n\n/** GET `/_expo/open` — discovery response with all platforms. */\nexport interface OpenDiscoveryResult extends OpenProjectMeta {\n platforms: Record<OpenPlatform, OpenPlatformInfo>;\n}\n\nexport type OpenInfoResult = OpenSinglePlatformResult | OpenDiscoveryResult;\n\n/** Result of a POST to `/_expo/open`. */\nexport interface OpenActionResult {\n platform: OpenPlatform;\n runtime: OpenRuntime;\n /** Deep link that was opened on the local device. */\n url: string;\n}\n\nexport interface OpenMiddlewareOptions {\n /**\n * Dev server base URL (e.g. `http://localhost:8081`). Used for the POST same-origin CSRF\n * check — requests whose `Origin` header doesn't match this URL's host are rejected.\n */\n serverBaseUrl: string;\n /** Compute the dry-run information for the requested platform + runtime. */\n getInfo: (props: {\n platform: OpenPlatform | null;\n runtime: OpenRequestedRuntime;\n }) => Promise<OpenInfoResult>;\n /** Open the project locally on the requested platform — equivalent to pressing `i` / `a` in the terminal UI. */\n open: (props: { platform: OpenPlatform }) => Promise<OpenActionResult>;\n /** Whether the host can launch a given platform. */\n getHostSupport: (platform: OpenPlatform) => OpenHostSupportEntry;\n}\n\nexport class OpenMiddleware extends ExpoMiddleware {\n constructor(\n projectRoot: string,\n protected options: OpenMiddlewareOptions\n ) {\n super(projectRoot, [OpenEndpoint]);\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n disableResponseCache(res);\n res.setHeader('Content-Type', 'application/json');\n\n const method = (req.method ?? 'GET').toUpperCase();\n const searchParams = new URL(req.url ?? '', 'http://localhost').searchParams;\n const platformParam = parsePlatformHeader(req);\n const platform = normalizePlatform(platformParam);\n const runtimeParam = searchParams.get('runtime') ?? undefined;\n const normalizedRuntime = runtimeParam ? normalizeRequestedRuntime(runtimeParam) : 'default';\n\n if (platformParam && !platform) {\n sendError(res, 400, {\n code: 'INVALID_PLATFORM',\n error: `Unsupported \"platform\" value \"${platformParam}\". Must be \"ios\", \"android\", or \"web\".`,\n });\n return;\n }\n\n if (runtimeParam && !normalizedRuntime) {\n sendError(res, 400, {\n code: 'INVALID_RUNTIME',\n error: `Unsupported \"runtime\" value \"${runtimeParam}\". Must be \"default\", \"expo\", \"custom\", or \"unknown\".`,\n });\n return;\n }\n const runtime: OpenRequestedRuntime = normalizedRuntime ?? 'default';\n\n if (method === 'POST') {\n const sameDeviceError = assertSameDevice(req);\n if (sameDeviceError) {\n sendError(res, 403, sameDeviceError);\n return;\n }\n\n const sameOriginError = assertSameOrigin(req, this.options.serverBaseUrl);\n if (sameOriginError) {\n sendError(res, 403, sameOriginError);\n return;\n }\n\n if (!platform) {\n sendError(res, 400, {\n code: 'MISSING_PLATFORM',\n error: `POST /_expo/open requires a platform. Pass it as the \"platform\" query param or \"expo-platform\" header. Must be \"ios\", \"android\", or \"web\".`,\n });\n return;\n }\n\n const support = this.options.getHostSupport(platform);\n if (!support.canOpen) {\n sendError(res, 501, {\n code: 'HOST_CANNOT_OPEN_PLATFORM',\n platform,\n error: `Cannot open the project on ${platform} from this dev server host.`,\n details:\n (support.reason ? support.reason + ' ' : '') +\n `Use GET /_expo/open?platform=${platform} to retrieve the deep link, then launch it from a host that supports ${platform} or hand it to a remote preview service.`,\n });\n return;\n }\n\n try {\n const result = await this.options.open({ platform });\n res.statusCode = 200;\n res.end(JSON.stringify(result));\n } catch (error: any) {\n sendError(res, 500, {\n code: typeof error?.code === 'string' ? error.code : 'OPEN_FAILED',\n platform,\n error: `Failed to open the project on ${platform}.`,\n details:\n (typeof error?.message === 'string' ? error.message : String(error)) +\n ` Check the dev server logs for more detail, or use GET /_expo/open?platform=${platform} to launch the deep link from another environment.`,\n });\n }\n return;\n }\n\n if (method !== 'GET' && method !== 'HEAD') {\n res.setHeader('Allow', 'GET, HEAD, POST');\n sendError(res, 405, {\n code: 'METHOD_NOT_ALLOWED',\n error: `Method \"${method}\" not allowed. Use GET to inspect, POST to open.`,\n });\n return;\n }\n\n const info = await this.options.getInfo({ platform, runtime });\n res.statusCode = 200;\n res.end(JSON.stringify(info));\n }\n}\n\nfunction normalizePlatform(p: string | null): OpenPlatform | null {\n return p === 'ios' || p === 'android' || p === 'web' ? p : null;\n}\n\nfunction normalizeRequestedRuntime(r: string | undefined): OpenRequestedRuntime | null {\n return r === 'default' || r === 'expo' || r === 'custom' || r === 'unknown' ? r : null;\n}\n\ninterface ErrorBody {\n code: string;\n error: string;\n platform?: OpenPlatform;\n details?: string;\n}\n\nfunction sendError(res: ServerResponse, statusCode: number, body: ErrorBody) {\n res.statusCode = statusCode;\n res.end(JSON.stringify(body));\n}\n\nfunction assertSameDevice(req: ServerRequest): ErrorBody | null {\n if (isLocalSocket(req.socket)) {\n return null;\n }\n return {\n code: 'REMOTE_DEVICE_FORBIDDEN',\n error: 'POST /_expo/open is restricted to same-device requests.',\n details:\n `The dev server only opens the project for clients connected over the loopback interface ` +\n `so a device on the LAN (or a tunnel client) can't launch the app on the developer's machine. ` +\n `Issue the POST from the dev server's host, or use GET /_expo/open to retrieve the deep link and open it from the remote device.`,\n };\n}\n\nfunction assertSameOrigin(req: ServerRequest, serverBaseUrl: string): ErrorBody | null {\n if (isMatchingOrigin(req, serverBaseUrl)) {\n return null;\n }\n const origin = firstHeader(req.headers?.origin) ?? 'unknown';\n return {\n code: 'CROSS_ORIGIN_FORBIDDEN',\n error: 'POST /_expo/open is restricted to same-origin requests.',\n details: `Request origin \"${origin}\" does not match the dev server \"${serverBaseUrl}\". This protects the dev server from cross-origin scripts that might try to launch the app without the developer's consent. Issue POST requests from the dev server's origin (or from a non-browser client), or use GET /_expo/open to retrieve the deep link and open it yourself.`,\n };\n}\n\nfunction firstHeader(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value ?? undefined;\n}\n"],"names":["OpenEndpoint","OpenMiddleware","ExpoMiddleware","projectRoot","options","handleRequestAsync","req","res","disableResponseCache","setHeader","method","toUpperCase","searchParams","URL","url","platformParam","parsePlatformHeader","platform","normalizePlatform","runtimeParam","get","undefined","normalizedRuntime","normalizeRequestedRuntime","sendError","code","error","runtime","sameDeviceError","assertSameDevice","sameOriginError","assertSameOrigin","serverBaseUrl","support","getHostSupport","canOpen","details","reason","result","open","statusCode","end","JSON","stringify","message","String","info","getInfo","p","r","body","isLocalSocket","socket","isMatchingOrigin","origin","firstHeader","headers","value","Array","isArray"],"mappings":"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"}
@@ -2,9 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "RuntimeRedirectMiddleware", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get LinkEndpoint () {
13
+ return LinkEndpoint;
14
+ },
15
+ get RuntimeRedirectMiddleware () {
8
16
  return RuntimeRedirectMiddleware;
9
17
  }
10
18
  });
@@ -60,10 +68,11 @@ function _interop_require_wildcard(obj, nodeInterop) {
60
68
  return newObj;
61
69
  }
62
70
  const debug = require('debug')('expo:start:server:middleware:runtimeRedirect');
71
+ const LinkEndpoint = '/_expo/link';
63
72
  class RuntimeRedirectMiddleware extends _ExpoMiddleware.ExpoMiddleware {
64
73
  constructor(projectRoot, options){
65
74
  super(projectRoot, [
66
- '/_expo/link'
75
+ LinkEndpoint
67
76
  ]), this.projectRoot = projectRoot, this.options = options;
68
77
  }
69
78
  async handleRequestAsync(req, res) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/RuntimeRedirectMiddleware.ts"],"sourcesContent":["import { parse } from 'url';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n RuntimePlatform,\n} from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\nimport * as Log from '../../../log';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:runtimeRedirect'\n) as typeof console.log;\n\n/** Runtime to target: expo = Expo Go, custom = Dev Client. */\ntype RuntimeTarget = 'expo' | 'custom';\n\nexport type DeepLinkHandler = (props: {\n runtime: RuntimeTarget;\n platform: RuntimePlatform;\n}) => void | Promise<void>;\n\nexport class RuntimeRedirectMiddleware extends ExpoMiddleware {\n constructor(\n protected projectRoot: string,\n protected options: {\n onDeepLink?: DeepLinkHandler;\n getLocation: (props: { runtime: RuntimeTarget }) => string | null | undefined;\n }\n ) {\n super(projectRoot, ['/_expo/link']);\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n const { query } = parse(req.url!, true);\n const isDevClient = query['choice'] === 'expo-dev-client';\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n const runtime = isDevClient ? 'custom' : 'expo';\n\n debug(`props:`, { platform, runtime });\n\n this.options.onDeepLink?.({ runtime, platform });\n\n const redirect = this.options.getLocation({ runtime });\n if (!redirect) {\n Log.warn(\n `[redirect middleware]: Unable to determine redirect location for runtime '${runtime}' and platform '${platform}'`\n );\n res.statusCode = 404;\n res.end();\n return;\n }\n debug('Redirect ->', redirect);\n res.setHeader('Location', redirect);\n\n // Disable caching\n disableResponseCache(res);\n\n // 'Temporary Redirect'\n res.statusCode = 307;\n res.end();\n }\n}\n"],"names":["RuntimeRedirectMiddleware","debug","require","ExpoMiddleware","constructor","projectRoot","options","handleRequestAsync","req","res","query","parse","url","isDevClient","platform","parsePlatformHeader","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","assertRuntimePlatform","runtime","onDeepLink","redirect","getLocation","Log","warn","statusCode","end","setHeader","disableResponseCache"],"mappings":";;;;+BAyBaA;;;eAAAA;;;;yBAzBS;;;;;;gCAE+B;iCAO9C;6DAEc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAErB,MAAMC,QAAQC,QAAQ,SACpB;AAWK,MAAMF,kCAAkCG,8BAAc;IAC3DC,YACE,AAAUC,WAAmB,EAC7B,AAAUC,OAGT,CACD;QACA,KAAK,CAACD,aAAa;YAAC;SAAc,QANxBA,cAAAA,kBACAC,UAAAA;IAMZ;IAEA,MAAMC,mBAAmBC,GAAkB,EAAEC,GAAmB,EAAiB;QAC/E,MAAM,EAAEC,KAAK,EAAE,GAAGC,IAAAA,YAAK,EAACH,IAAII,GAAG,EAAG;QAClC,MAAMC,cAAcH,KAAK,CAAC,SAAS,KAAK;QACxC,MAAMI,WAAWC,IAAAA,oCAAmB,EAACP,QAAQQ,IAAAA,mDAAkC,EAACR;QAChFS,IAAAA,6CAA4B,EAACH;QAC7BI,IAAAA,sCAAqB,EAACJ;QACtB,MAAMK,UAAUN,cAAc,WAAW;QAEzCZ,MAAM,CAAC,MAAM,CAAC,EAAE;YAAEa;YAAUK;QAAQ;QAEpC,IAAI,CAACb,OAAO,CAACc,UAAU,oBAAvB,IAAI,CAACd,OAAO,CAACc,UAAU,MAAvB,IAAI,CAACd,OAAO,EAAc;YAAEa;YAASL;QAAS;QAE9C,MAAMO,WAAW,IAAI,CAACf,OAAO,CAACgB,WAAW,CAAC;YAAEH;QAAQ;QACpD,IAAI,CAACE,UAAU;YACbE,KAAIC,IAAI,CACN,CAAC,0EAA0E,EAAEL,QAAQ,gBAAgB,EAAEL,SAAS,CAAC,CAAC;YAEpHL,IAAIgB,UAAU,GAAG;YACjBhB,IAAIiB,GAAG;YACP;QACF;QACAzB,MAAM,eAAeoB;QACrBZ,IAAIkB,SAAS,CAAC,YAAYN;QAE1B,kBAAkB;QAClBO,IAAAA,oCAAoB,EAACnB;QAErB,uBAAuB;QACvBA,IAAIgB,UAAU,GAAG;QACjBhB,IAAIiB,GAAG;IACT;AACF"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/RuntimeRedirectMiddleware.ts"],"sourcesContent":["import { parse } from 'url';\n\nimport { disableResponseCache, ExpoMiddleware } from './ExpoMiddleware';\nimport type { RuntimePlatform } from './resolvePlatform';\nimport {\n assertMissingRuntimePlatform,\n assertRuntimePlatform,\n parsePlatformHeader,\n resolvePlatformFromUserAgentHeader,\n} from './resolvePlatform';\nimport type { ServerRequest, ServerResponse } from './server.types';\nimport * as Log from '../../../log';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:runtimeRedirect'\n) as typeof console.log;\n\nexport const LinkEndpoint = '/_expo/link';\n\n/** Runtime to target: expo = Expo Go, custom = Dev Client. */\ntype RuntimeTarget = 'expo' | 'custom';\n\nexport type DeepLinkHandler = (props: {\n runtime: RuntimeTarget;\n platform: RuntimePlatform;\n}) => void | Promise<void>;\n\nexport class RuntimeRedirectMiddleware extends ExpoMiddleware {\n constructor(\n protected projectRoot: string,\n protected options: {\n onDeepLink?: DeepLinkHandler;\n getLocation: (props: { runtime: RuntimeTarget }) => string | null | undefined;\n }\n ) {\n super(projectRoot, [LinkEndpoint]);\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n const { query } = parse(req.url!, true);\n const isDevClient = query['choice'] === 'expo-dev-client';\n const platform = parsePlatformHeader(req) ?? resolvePlatformFromUserAgentHeader(req);\n assertMissingRuntimePlatform(platform);\n assertRuntimePlatform(platform);\n const runtime = isDevClient ? 'custom' : 'expo';\n\n debug(`props:`, { platform, runtime });\n\n this.options.onDeepLink?.({ runtime, platform });\n\n const redirect = this.options.getLocation({ runtime });\n if (!redirect) {\n Log.warn(\n `[redirect middleware]: Unable to determine redirect location for runtime '${runtime}' and platform '${platform}'`\n );\n res.statusCode = 404;\n res.end();\n return;\n }\n debug('Redirect ->', redirect);\n res.setHeader('Location', redirect);\n\n // Disable caching\n disableResponseCache(res);\n\n // 'Temporary Redirect'\n res.statusCode = 307;\n res.end();\n }\n}\n"],"names":["LinkEndpoint","RuntimeRedirectMiddleware","debug","require","ExpoMiddleware","projectRoot","options","handleRequestAsync","req","res","query","parse","url","isDevClient","platform","parsePlatformHeader","resolvePlatformFromUserAgentHeader","assertMissingRuntimePlatform","assertRuntimePlatform","runtime","onDeepLink","redirect","getLocation","Log","warn","statusCode","end","setHeader","disableResponseCache"],"mappings":";;;;;;;;;;;QAiBaA;eAAAA;;QAUAC;eAAAA;;;;yBA3BS;;;;;;gCAE+B;iCAO9C;6DAEc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAErB,MAAMC,QAAQC,QAAQ,SACpB;AAGK,MAAMH,eAAe;AAUrB,MAAMC,kCAAkCG,8BAAc;IAC3D,YACE,AAAUC,WAAmB,EAC7B,AAAUC,OAGT,CACD;QACA,KAAK,CAACD,aAAa;YAACL;SAAa,QANvBK,cAAAA,kBACAC,UAAAA;IAMZ;IAEA,MAAMC,mBAAmBC,GAAkB,EAAEC,GAAmB,EAAiB;QAC/E,MAAM,EAAEC,KAAK,EAAE,GAAGC,IAAAA,YAAK,EAACH,IAAII,GAAG,EAAG;QAClC,MAAMC,cAAcH,KAAK,CAAC,SAAS,KAAK;QACxC,MAAMI,WAAWC,IAAAA,oCAAmB,EAACP,QAAQQ,IAAAA,mDAAkC,EAACR;QAChFS,IAAAA,6CAA4B,EAACH;QAC7BI,IAAAA,sCAAqB,EAACJ;QACtB,MAAMK,UAAUN,cAAc,WAAW;QAEzCX,MAAM,CAAC,MAAM,CAAC,EAAE;YAAEY;YAAUK;QAAQ;QAEpC,IAAI,CAACb,OAAO,CAACc,UAAU,oBAAvB,IAAI,CAACd,OAAO,CAACc,UAAU,MAAvB,IAAI,CAACd,OAAO,EAAc;YAAEa;YAASL;QAAS;QAE9C,MAAMO,WAAW,IAAI,CAACf,OAAO,CAACgB,WAAW,CAAC;YAAEH;QAAQ;QACpD,IAAI,CAACE,UAAU;YACbE,KAAIC,IAAI,CACN,CAAC,0EAA0E,EAAEL,QAAQ,gBAAgB,EAAEL,SAAS,CAAC,CAAC;YAEpHL,IAAIgB,UAAU,GAAG;YACjBhB,IAAIiB,GAAG;YACP;QACF;QACAxB,MAAM,eAAemB;QACrBZ,IAAIkB,SAAS,CAAC,YAAYN;QAE1B,kBAAkB;QAClBO,IAAAA,oCAAoB,EAACnB;QAErB,uBAAuB;QACvBA,IAAIgB,UAAU,GAAG;QACjBhB,IAAIiB,GAAG;IACT;AACF"}
@@ -8,13 +8,6 @@ Object.defineProperty(exports, "ServeStaticMiddleware", {
8
8
  return ServeStaticMiddleware;
9
9
  }
10
10
  });
11
- function _path() {
12
- const data = /*#__PURE__*/ _interop_require_default(require("path"));
13
- _path = function() {
14
- return data;
15
- };
16
- return data;
17
- }
18
11
  function _send() {
19
12
  const data = /*#__PURE__*/ _interop_require_default(require("send"));
20
13
  _send = function() {
@@ -30,7 +23,7 @@ function _url() {
30
23
  return data;
31
24
  }
32
25
  const _resolvePlatform = require("./resolvePlatform");
33
- const _env = require("../../../utils/env");
26
+ const _publicFolder = require("../../../export/publicFolder");
34
27
  function _interop_require_default(obj) {
35
28
  return obj && obj.__esModule ? obj : {
36
29
  default: obj
@@ -42,7 +35,7 @@ class ServeStaticMiddleware {
42
35
  this.projectRoot = projectRoot;
43
36
  }
44
37
  getHandler() {
45
- const publicPath = _path().default.join(this.projectRoot, _env.env.EXPO_PUBLIC_FOLDER);
38
+ const publicPath = (0, _publicFolder.getPublicFolderPath)(this.projectRoot);
46
39
  debug(`Serving static files from:`, publicPath);
47
40
  const opts = {
48
41
  root: publicPath
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ServeStaticMiddleware.ts"],"sourcesContent":["import path from 'path';\nimport send from 'send';\nimport { parse } from 'url';\n\nimport { parsePlatformHeader } from './resolvePlatform';\nimport { ServerRequest, ServerResponse } from './server.types';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:start:server:middleware:serveStatic') as typeof console.log;\n\n/**\n * Adds support for serving the files in the static `public/` folder to web apps.\n */\nexport class ServeStaticMiddleware {\n constructor(private projectRoot: string) {}\n getHandler() {\n const publicPath = path.join(this.projectRoot, env.EXPO_PUBLIC_FOLDER);\n\n debug(`Serving static files from:`, publicPath);\n const opts = {\n root: publicPath,\n };\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n if (!req?.url || (req.method !== 'GET' && req.method !== 'HEAD')) {\n return next();\n }\n\n const platform = parsePlatformHeader(req);\n // Currently this is web-only\n if (platform && platform !== 'web') {\n return next();\n }\n\n const pathname = parse(req.url).pathname;\n if (!pathname) {\n return next();\n }\n\n debug(`Maybe serve static:`, pathname);\n const stream = send(req, pathname, opts);\n\n // add file listener for fallthrough\n let forwardError = false;\n stream.on('file', function onFile() {\n // once file is determined, always forward error\n forwardError = true;\n });\n\n // forward errors\n stream.on('error', function error(err: any) {\n if (forwardError || !(err.statusCode < 500)) {\n next(err);\n return;\n }\n\n next();\n });\n\n // pipe\n stream.pipe(res);\n };\n }\n}\n"],"names":["ServeStaticMiddleware","debug","require","constructor","projectRoot","getHandler","publicPath","path","join","env","EXPO_PUBLIC_FOLDER","opts","root","req","res","next","url","method","platform","parsePlatformHeader","pathname","parse","stream","send","forwardError","on","onFile","error","err","statusCode","pipe"],"mappings":";;;;+BAaaA;;;eAAAA;;;;gEAbI;;;;;;;gEACA;;;;;;;yBACK;;;;;;iCAEc;qBAEhB;;;;;;AAEpB,MAAMC,QAAQC,QAAQ,SAAS;AAKxB,MAAMF;IACXG,YAAY,AAAQC,WAAmB,CAAE;aAArBA,cAAAA;IAAsB;IAC1CC,aAAa;QACX,MAAMC,aAAaC,eAAI,CAACC,IAAI,CAAC,IAAI,CAACJ,WAAW,EAAEK,QAAG,CAACC,kBAAkB;QAErET,MAAM,CAAC,0BAA0B,CAAC,EAAEK;QACpC,MAAMK,OAAO;YACXC,MAAMN;QACR;QACA,OAAO,CAACO,KAAoBC,KAAqBC;YAC/C,IAAI,EAACF,uBAAAA,IAAKG,GAAG,KAAKH,IAAII,MAAM,KAAK,SAASJ,IAAII,MAAM,KAAK,QAAS;gBAChE,OAAOF;YACT;YAEA,MAAMG,WAAWC,IAAAA,oCAAmB,EAACN;YACrC,6BAA6B;YAC7B,IAAIK,YAAYA,aAAa,OAAO;gBAClC,OAAOH;YACT;YAEA,MAAMK,WAAWC,IAAAA,YAAK,EAACR,IAAIG,GAAG,EAAEI,QAAQ;YACxC,IAAI,CAACA,UAAU;gBACb,OAAOL;YACT;YAEAd,MAAM,CAAC,mBAAmB,CAAC,EAAEmB;YAC7B,MAAME,SAASC,IAAAA,eAAI,EAACV,KAAKO,UAAUT;YAEnC,oCAAoC;YACpC,IAAIa,eAAe;YACnBF,OAAOG,EAAE,CAAC,QAAQ,SAASC;gBACzB,gDAAgD;gBAChDF,eAAe;YACjB;YAEA,iBAAiB;YACjBF,OAAOG,EAAE,CAAC,SAAS,SAASE,MAAMC,GAAQ;gBACxC,IAAIJ,gBAAgB,CAAEI,CAAAA,IAAIC,UAAU,GAAG,GAAE,GAAI;oBAC3Cd,KAAKa;oBACL;gBACF;gBAEAb;YACF;YAEA,OAAO;YACPO,OAAOQ,IAAI,CAAChB;QACd;IACF;AACF"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ServeStaticMiddleware.ts"],"sourcesContent":["import send from 'send';\nimport { parse } from 'url';\n\nimport { parsePlatformHeader } from './resolvePlatform';\nimport type { ServerRequest, ServerResponse } from './server.types';\nimport { getPublicFolderPath } from '../../../export/publicFolder';\n\nconst debug = require('debug')('expo:start:server:middleware:serveStatic') as typeof console.log;\n\n/**\n * Adds support for serving the files in the static `public/` folder to web apps.\n */\nexport class ServeStaticMiddleware {\n constructor(private projectRoot: string) {}\n getHandler() {\n const publicPath = getPublicFolderPath(this.projectRoot);\n\n debug(`Serving static files from:`, publicPath);\n const opts = {\n root: publicPath,\n };\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n if (!req?.url || (req.method !== 'GET' && req.method !== 'HEAD')) {\n return next();\n }\n\n const platform = parsePlatformHeader(req);\n // Currently this is web-only\n if (platform && platform !== 'web') {\n return next();\n }\n\n const pathname = parse(req.url).pathname;\n if (!pathname) {\n return next();\n }\n\n debug(`Maybe serve static:`, pathname);\n const stream = send(req, pathname, opts);\n\n // add file listener for fallthrough\n let forwardError = false;\n stream.on('file', function onFile() {\n // once file is determined, always forward error\n forwardError = true;\n });\n\n // forward errors\n stream.on('error', function error(err: any) {\n if (forwardError || !(err.statusCode < 500)) {\n next(err);\n return;\n }\n\n next();\n });\n\n // pipe\n stream.pipe(res);\n };\n }\n}\n"],"names":["ServeStaticMiddleware","debug","require","projectRoot","getHandler","publicPath","getPublicFolderPath","opts","root","req","res","next","url","method","platform","parsePlatformHeader","pathname","parse","stream","send","forwardError","on","onFile","error","err","statusCode","pipe"],"mappings":";;;;+BAYaA;;;eAAAA;;;;gEAZI;;;;;;;yBACK;;;;;;iCAEc;8BAEA;;;;;;AAEpC,MAAMC,QAAQC,QAAQ,SAAS;AAKxB,MAAMF;IACX,YAAY,AAAQG,WAAmB,CAAE;aAArBA,cAAAA;IAAsB;IAC1CC,aAAa;QACX,MAAMC,aAAaC,IAAAA,iCAAmB,EAAC,IAAI,CAACH,WAAW;QAEvDF,MAAM,CAAC,0BAA0B,CAAC,EAAEI;QACpC,MAAME,OAAO;YACXC,MAAMH;QACR;QACA,OAAO,CAACI,KAAoBC,KAAqBC;YAC/C,IAAI,EAACF,uBAAAA,IAAKG,GAAG,KAAKH,IAAII,MAAM,KAAK,SAASJ,IAAII,MAAM,KAAK,QAAS;gBAChE,OAAOF;YACT;YAEA,MAAMG,WAAWC,IAAAA,oCAAmB,EAACN;YACrC,6BAA6B;YAC7B,IAAIK,YAAYA,aAAa,OAAO;gBAClC,OAAOH;YACT;YAEA,MAAMK,WAAWC,IAAAA,YAAK,EAACR,IAAIG,GAAG,EAAEI,QAAQ;YACxC,IAAI,CAACA,UAAU;gBACb,OAAOL;YACT;YAEAV,MAAM,CAAC,mBAAmB,CAAC,EAAEe;YAC7B,MAAME,SAASC,IAAAA,eAAI,EAACV,KAAKO,UAAUT;YAEnC,oCAAoC;YACpC,IAAIa,eAAe;YACnBF,OAAOG,EAAE,CAAC,QAAQ,SAASC;gBACzB,gDAAgD;gBAChDF,eAAe;YACjB;YAEA,iBAAiB;YACjBF,OAAOG,EAAE,CAAC,SAAS,SAASE,MAAMC,GAAQ;gBACxC,IAAIJ,gBAAgB,CAAEI,CAAAA,IAAIC,UAAU,GAAG,GAAE,GAAI;oBAC3Cd,KAAKa;oBACL;gBACF;gBAEAb;YACF;YAEA,OAAO;YACPO,OAAOQ,IAAI,CAAChB;QACd;IACF;AACF"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Inline polyfills for legacy WebViews (e.g., Android 9) used by DOM Components.
3
+ * These run before any application code to ensure baseline API availability.
4
+ *
5
+ * Array.flat callsite: https://github.com/necolas/react-native-web/blob/a9de220ba9e65bdea540fb5322ffb1da2b0bf442/packages/react-native-web/src/exports/StyleSheet/index.js#L129
6
+ * performance.measure callsite: https://github.com/facebook/react/blob/561ed529b3a6a16e5b2b76fa5ee86c09f959686c/packages/react-reconciler/src/ReactFiberPerformanceTrack.js#L118-L138
7
+ */ "use strict";
8
+ Object.defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ Object.defineProperty(exports, "DOM_POLYFILLS_SCRIPT", {
12
+ enumerable: true,
13
+ get: function() {
14
+ return DOM_POLYFILLS_SCRIPT;
15
+ }
16
+ });
17
+ const DOM_POLYFILLS_SCRIPT = `
18
+ // Polyfill globalThis
19
+ if (typeof globalThis === "undefined") {
20
+ var _g = typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : self;
21
+ _g.globalThis = _g;
22
+ }
23
+ // Polyfill Array.prototype.flat
24
+ if (!Array.prototype.flat) {
25
+ Array.prototype.flat = function flat(depth) {
26
+ depth = depth === undefined ? 1 : Math.floor(Number(depth));
27
+ if (depth < 1) return Array.prototype.slice.call(this);
28
+ return Array.prototype.reduce.call(
29
+ this,
30
+ function (acc, val) {
31
+ if (Array.isArray(val)) {
32
+ acc.push.apply(acc, flat.call(val, depth - 1));
33
+ } else {
34
+ acc.push(val);
35
+ }
36
+ return acc;
37
+ },
38
+ []
39
+ );
40
+ };
41
+ }
42
+ // Polyfill performance.measure with measureOptions.
43
+ // Legacy WebViews only support performance.measure(name, startMark, endMark) with
44
+ // string mark names. When called with a measureOptions object (e.g., { start, end }),
45
+ // we drop the options and call measure(name) to avoid throwing.
46
+ try {
47
+ performance.measure("__expo_feature_test", { start: 0 });
48
+ performance.clearMeasures("__expo_feature_test");
49
+ } catch (e) {
50
+ var _origMeasure = performance.measure.bind(performance);
51
+ performance.measure = function (name, startOrOptions, endMark) {
52
+ if (startOrOptions && typeof startOrOptions === "object") {
53
+ return _origMeasure(name);
54
+ }
55
+ return _origMeasure(name, startOrOptions, endMark);
56
+ };
57
+ }
58
+ `;
59
+
60
+ //# sourceMappingURL=domPolyfills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/domPolyfills.ts"],"sourcesContent":["/**\n * Inline polyfills for legacy WebViews (e.g., Android 9) used by DOM Components.\n * These run before any application code to ensure baseline API availability.\n *\n * Array.flat callsite: https://github.com/necolas/react-native-web/blob/a9de220ba9e65bdea540fb5322ffb1da2b0bf442/packages/react-native-web/src/exports/StyleSheet/index.js#L129\n * performance.measure callsite: https://github.com/facebook/react/blob/561ed529b3a6a16e5b2b76fa5ee86c09f959686c/packages/react-reconciler/src/ReactFiberPerformanceTrack.js#L118-L138\n */\nexport const DOM_POLYFILLS_SCRIPT = `\n// Polyfill globalThis\nif (typeof globalThis === \"undefined\") {\n var _g = typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : self;\n _g.globalThis = _g;\n}\n// Polyfill Array.prototype.flat\nif (!Array.prototype.flat) {\n Array.prototype.flat = function flat(depth) {\n depth = depth === undefined ? 1 : Math.floor(Number(depth));\n if (depth < 1) return Array.prototype.slice.call(this);\n return Array.prototype.reduce.call(\n this,\n function (acc, val) {\n if (Array.isArray(val)) {\n acc.push.apply(acc, flat.call(val, depth - 1));\n } else {\n acc.push(val);\n }\n return acc;\n },\n []\n );\n };\n}\n// Polyfill performance.measure with measureOptions.\n// Legacy WebViews only support performance.measure(name, startMark, endMark) with\n// string mark names. When called with a measureOptions object (e.g., { start, end }),\n// we drop the options and call measure(name) to avoid throwing.\ntry {\n performance.measure(\"__expo_feature_test\", { start: 0 });\n performance.clearMeasures(\"__expo_feature_test\");\n} catch (e) {\n var _origMeasure = performance.measure.bind(performance);\n performance.measure = function (name, startOrOptions, endMark) {\n if (startOrOptions && typeof startOrOptions === \"object\") {\n return _origMeasure(name);\n }\n return _origMeasure(name, startOrOptions, endMark);\n };\n}\n`;\n"],"names":["DOM_POLYFILLS_SCRIPT"],"mappings":"AAAA;;;;;;CAMC;;;;+BACYA;;;eAAAA;;;AAAN,MAAMA,uBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCrC,CAAC"}
@@ -5,20 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- openJsInspector: function() {
12
+ get openJsInspector () {
13
13
  return openJsInspector;
14
14
  },
15
- promptInspectorAppAsync: function() {
15
+ get promptInspectorAppAsync () {
16
16
  return promptInspectorAppAsync;
17
17
  },
18
- queryAllInspectorAppsAsync: function() {
18
+ get queryAllInspectorAppsAsync () {
19
19
  return queryAllInspectorAppsAsync;
20
20
  },
21
- queryInspectorAppAsync: function() {
21
+ get queryInspectorAppAsync () {
22
22
  return queryInspectorAppAsync;
23
23
  }
24
24
  });
@@ -29,7 +29,6 @@ function _chalk() {
29
29
  };
30
30
  return data;
31
31
  }
32
- const _CdpClient = require("./CdpClient");
33
32
  const _prompts = require("../../../../utils/prompts");
34
33
  const _pageIsSupported = require("../../metro/debugging/pageIsSupported");
35
34
  function _interop_require_default(obj) {
@@ -74,25 +73,7 @@ async function queryAllInspectorAppsAsync(metroServerOrigin) {
74
73
  // The newest runtime will be at the end of the list,
75
74
  // reversing the result would save time from try-error.
76
75
  const apps = (await resp.json()).reverse();
77
- const results = [];
78
- for (const app of apps){
79
- // Only use targets with better reloading support
80
- if (!(0, _pageIsSupported.pageIsSupported)(app)) {
81
- continue;
82
- }
83
- try {
84
- // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher.
85
- if (await appShouldBeIgnoredAsync(app)) {
86
- continue;
87
- }
88
- } catch (e) {
89
- // If we can't evaluate the JS, we just ignore the error and skips the target.
90
- debug(`Can't evaluate the JS on the app:`, JSON.stringify(e, null, 2));
91
- continue;
92
- }
93
- results.push(app);
94
- }
95
- return results;
76
+ return apps.filter((app)=>(0, _pageIsSupported.pageIsSupported)(app));
96
77
  }
97
78
  async function promptInspectorAppAsync(apps) {
98
79
  var _choices_find;
@@ -113,11 +94,5 @@ async function promptInspectorAppAsync(apps) {
113
94
  const value = await (0, _prompts.selectAsync)((0, _chalk().default)`Debug target {dim (Hermes only)}`, choices);
114
95
  return (_choices_find = choices.find((item)=>item.value === value)) == null ? void 0 : _choices_find.app;
115
96
  }
116
- const HIDE_FROM_INSPECTOR_ENV = 'globalThis.__expo_hide_from_inspector__';
117
- async function appShouldBeIgnoredAsync(app) {
118
- const hideFromInspector = await (0, _CdpClient.evaluateJsFromCdpAsync)(app.webSocketDebuggerUrl, HIDE_FROM_INSPECTOR_ENV);
119
- debug(`[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`);
120
- return hideFromInspector !== undefined;
121
- }
122
97
 
123
98
  //# sourceMappingURL=JsInspector.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import type { CustomMessageHandlerConnection } from '@react-native/dev-middleware';\nimport chalk from 'chalk';\n\nimport { evaluateJsFromCdpAsync } from './CdpClient';\nimport { selectAsync } from '../../../../utils/prompts';\nimport { pageIsSupported } from '../../metro/debugging/pageIsSupported';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:jsInspector'\n) as typeof console.log;\n\nexport interface MetroInspectorProxyApp {\n /** Unique device ID combined with the page ID */\n id: string;\n /** Information about the underlying CDP implementation, e.g. \"React Native Bridgeless [C++ connection]\" */\n title: string;\n /** The application ID that is currently running on the device, e.g. \"dev.expo.bareexpo\" */\n appId: string;\n /** The description of the runtime, e.g. \"React Native Bridgeless [C++ connection]\" */\n description: string;\n /** The CDP debugger type, which should always be \"node\" */\n type: 'node';\n /** The internal `devtools://..` URL for the debugger to connect to */\n devtoolsFrontendUrl: string;\n /** The websocket URL for the debugger to connect to */\n webSocketDebuggerUrl: string;\n /**\n * Human-readable device name\n * @since react-native@0.73\n */\n deviceName: string;\n /**\n * React Native specific information, like the unique device ID and native capabilities\n * @since react-native@0.74\n */\n reactNative?: {\n /** The unique device ID */\n logicalDeviceId: string;\n /** All supported native capabilities */\n capabilities: CustomMessageHandlerConnection['page']['capabilities'];\n };\n}\n\n/**\n * Launch the React Native DevTools by executing the `POST /open-debugger` request.\n * This endpoint is handled through `@react-native/dev-middleware`.\n */\nexport async function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (!app.reactNative?.logicalDeviceId) {\n debug('Failed to open React Native DevTools, target is missing device ID');\n return false;\n }\n\n const url = new URL('/open-debugger', metroBaseUrl);\n url.searchParams.set('target', app.id);\n\n // Request to open the React Native DevTools, but limit it to 1s\n // This is a workaround as this endpoint might not respond on some devices\n const response = await fetch(url, {\n method: 'POST',\n signal: AbortSignal.timeout(1000),\n }).catch((error) => {\n // Only swallow timeout errors\n if (error.name === 'TimeoutError') {\n return null;\n }\n\n throw error;\n });\n\n if (!response) {\n debug(`No response received from the React Native DevTools.`);\n } else if (response.ok === false) {\n debug('Failed to open React Native DevTools, received response:', response.status);\n }\n\n return response?.ok ?? true;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.appId === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n // The newest runtime will be at the end of the list,\n // reversing the result would save time from try-error.\n const apps: MetroInspectorProxyApp[] = (await resp.json()).reverse();\n const results: MetroInspectorProxyApp[] = [];\n for (const app of apps) {\n // Only use targets with better reloading support\n if (!pageIsSupported(app)) {\n continue;\n }\n\n try {\n // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher.\n if (await appShouldBeIgnoredAsync(app)) {\n continue;\n }\n } catch (e: unknown) {\n // If we can't evaluate the JS, we just ignore the error and skips the target.\n debug(`Can't evaluate the JS on the app:`, JSON.stringify(e, null, 2));\n continue;\n }\n\n results.push(app);\n }\n return results;\n}\n\nexport async function promptInspectorAppAsync(apps: MetroInspectorProxyApp[]) {\n if (apps.length === 1) {\n return apps[0];\n }\n\n // Check if multiple devices are connected with the same device names\n // In this case, append the actual app id (device ID + page number) to the prompt\n const hasDuplicateNames = apps.some(\n (app, index) => index !== apps.findIndex((other) => app.deviceName === other.deviceName)\n );\n\n const choices = apps.map((app) => {\n const name = app.deviceName ?? 'Unknown device';\n return {\n title: hasDuplicateNames ? chalk`${name}{dim - ${app.id}}` : name,\n value: app.id,\n app,\n };\n });\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n\n return choices.find((item) => item.value === value)?.app;\n}\n\nconst HIDE_FROM_INSPECTOR_ENV = 'globalThis.__expo_hide_from_inspector__';\n\nasync function appShouldBeIgnoredAsync(app: MetroInspectorProxyApp): Promise<boolean> {\n const hideFromInspector = await evaluateJsFromCdpAsync(\n app.webSocketDebuggerUrl,\n HIDE_FROM_INSPECTOR_ENV\n );\n debug(\n `[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`\n );\n return hideFromInspector !== undefined;\n}\n"],"names":["openJsInspector","promptInspectorAppAsync","queryAllInspectorAppsAsync","queryInspectorAppAsync","debug","require","metroBaseUrl","app","reactNative","logicalDeviceId","url","URL","searchParams","set","id","response","fetch","method","signal","AbortSignal","timeout","catch","error","name","ok","status","metroServerOrigin","appId","apps","find","resp","json","reverse","results","pageIsSupported","appShouldBeIgnoredAsync","e","JSON","stringify","push","choices","length","hasDuplicateNames","some","index","findIndex","other","deviceName","map","title","chalk","value","selectAsync","item","HIDE_FROM_INSPECTOR_ENV","hideFromInspector","evaluateJsFromCdpAsync","webSocketDebuggerUrl","undefined"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import type { CustomMessageHandlerConnection } from '@react-native/dev-middleware';\nimport chalk from 'chalk';\n\nimport { selectAsync } from '../../../../utils/prompts';\nimport { pageIsSupported } from '../../metro/debugging/pageIsSupported';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:jsInspector'\n) as typeof console.log;\n\nexport interface MetroInspectorProxyApp {\n /** Unique device ID combined with the page ID */\n id: string;\n /** Information about the underlying CDP implementation, e.g. \"React Native Bridgeless [C++ connection]\" */\n title: string;\n /** The application ID that is currently running on the device, e.g. \"dev.expo.bareexpo\" */\n appId: string;\n /** The description of the runtime, e.g. \"React Native Bridgeless [C++ connection]\" */\n description: string;\n /** The CDP debugger type, which should always be \"node\" */\n type: 'node';\n /** The internal `devtools://..` URL for the debugger to connect to */\n devtoolsFrontendUrl: string;\n /** The websocket URL for the debugger to connect to */\n webSocketDebuggerUrl: string;\n /**\n * Human-readable device name\n * @since react-native@0.73\n */\n deviceName: string;\n /**\n * React Native specific information, like the unique device ID and native capabilities\n * @since react-native@0.74\n */\n reactNative?: {\n /** The unique device ID */\n logicalDeviceId: string;\n /** All supported native capabilities */\n capabilities: CustomMessageHandlerConnection['page']['capabilities'];\n };\n}\n\n/**\n * Launch the React Native DevTools by executing the `POST /open-debugger` request.\n * This endpoint is handled through `@react-native/dev-middleware`.\n */\nexport async function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (!app.reactNative?.logicalDeviceId) {\n debug('Failed to open React Native DevTools, target is missing device ID');\n return false;\n }\n\n const url = new URL('/open-debugger', metroBaseUrl);\n url.searchParams.set('target', app.id);\n\n // Request to open the React Native DevTools, but limit it to 1s\n // This is a workaround as this endpoint might not respond on some devices\n const response = await fetch(url, {\n method: 'POST',\n signal: AbortSignal.timeout(1000),\n }).catch((error) => {\n // Only swallow timeout errors\n if (error.name === 'TimeoutError') {\n return null;\n }\n\n throw error;\n });\n\n if (!response) {\n debug(`No response received from the React Native DevTools.`);\n } else if (response.ok === false) {\n debug('Failed to open React Native DevTools, received response:', response.status);\n }\n\n return response?.ok ?? true;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.appId === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n // The newest runtime will be at the end of the list,\n // reversing the result would save time from try-error.\n const apps: MetroInspectorProxyApp[] = (await resp.json()).reverse();\n return apps.filter((app) => pageIsSupported(app));\n}\n\nexport async function promptInspectorAppAsync(apps: MetroInspectorProxyApp[]) {\n if (apps.length === 1) {\n return apps[0];\n }\n\n // Check if multiple devices are connected with the same device names\n // In this case, append the actual app id (device ID + page number) to the prompt\n const hasDuplicateNames = apps.some(\n (app, index) => index !== apps.findIndex((other) => app.deviceName === other.deviceName)\n );\n\n const choices = apps.map((app) => {\n const name = app.deviceName ?? 'Unknown device';\n return {\n title: hasDuplicateNames ? chalk`${name}{dim - ${app.id}}` : name,\n value: app.id,\n app,\n };\n });\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n\n return choices.find((item) => item.value === value)?.app;\n}\n"],"names":["openJsInspector","promptInspectorAppAsync","queryAllInspectorAppsAsync","queryInspectorAppAsync","debug","require","metroBaseUrl","app","reactNative","logicalDeviceId","url","URL","searchParams","set","id","response","fetch","method","signal","AbortSignal","timeout","catch","error","name","ok","status","metroServerOrigin","appId","apps","find","resp","json","reverse","filter","pageIsSupported","choices","length","hasDuplicateNames","some","index","findIndex","other","deviceName","map","title","chalk","value","selectAsync","item"],"mappings":";;;;;;;;;;;QA8CsBA;eAAAA;;QAkDAC;eAAAA;;QAVAC;eAAAA;;QARAC;eAAAA;;;;gEA7EJ;;;;;;yBAEU;iCACI;;;;;;AAEhC,MAAMC,QAAQC,QAAQ,SACpB;AAuCK,eAAeL,gBAAgBM,YAAoB,EAAEC,GAA2B;QAChFA;IAAL,IAAI,GAACA,mBAAAA,IAAIC,WAAW,qBAAfD,iBAAiBE,eAAe,GAAE;QACrCL,MAAM;QACN,OAAO;IACT;IAEA,MAAMM,MAAM,IAAIC,IAAI,kBAAkBL;IACtCI,IAAIE,YAAY,CAACC,GAAG,CAAC,UAAUN,IAAIO,EAAE;IAErC,gEAAgE;IAChE,0EAA0E;IAC1E,MAAMC,WAAW,MAAMC,MAAMN,KAAK;QAChCO,QAAQ;QACRC,QAAQC,YAAYC,OAAO,CAAC;IAC9B,GAAGC,KAAK,CAAC,CAACC;QACR,8BAA8B;QAC9B,IAAIA,MAAMC,IAAI,KAAK,gBAAgB;YACjC,OAAO;QACT;QAEA,MAAMD;IACR;IAEA,IAAI,CAACP,UAAU;QACbX,MAAM,CAAC,oDAAoD,CAAC;IAC9D,OAAO,IAAIW,SAASS,EAAE,KAAK,OAAO;QAChCpB,MAAM,4DAA4DW,SAASU,MAAM;IACnF;IAEA,OAAOV,CAAAA,4BAAAA,SAAUS,EAAE,KAAI;AACzB;AAEO,eAAerB,uBACpBuB,iBAAyB,EACzBC,KAAa;IAEb,MAAMC,OAAO,MAAM1B,2BAA2BwB;IAC9C,OAAOE,KAAKC,IAAI,CAAC,CAACtB,MAAQA,IAAIoB,KAAK,KAAKA,UAAU;AACpD;AAEO,eAAezB,2BACpBwB,iBAAyB;IAEzB,MAAMI,OAAO,MAAMd,MAAM,GAAGU,kBAAkB,UAAU,CAAC;IACzD,qDAAqD;IACrD,uDAAuD;IACvD,MAAME,OAAiC,AAAC,CAAA,MAAME,KAAKC,IAAI,EAAC,EAAGC,OAAO;IAClE,OAAOJ,KAAKK,MAAM,CAAC,CAAC1B,MAAQ2B,IAAAA,gCAAe,EAAC3B;AAC9C;AAEO,eAAeN,wBAAwB2B,IAA8B;QAsBnEO;IArBP,IAAIP,KAAKQ,MAAM,KAAK,GAAG;QACrB,OAAOR,IAAI,CAAC,EAAE;IAChB;IAEA,qEAAqE;IACrE,iFAAiF;IACjF,MAAMS,oBAAoBT,KAAKU,IAAI,CACjC,CAAC/B,KAAKgC,QAAUA,UAAUX,KAAKY,SAAS,CAAC,CAACC,QAAUlC,IAAImC,UAAU,KAAKD,MAAMC,UAAU;IAGzF,MAAMP,UAAUP,KAAKe,GAAG,CAAC,CAACpC;QACxB,MAAMgB,OAAOhB,IAAImC,UAAU,IAAI;QAC/B,OAAO;YACLE,OAAOP,oBAAoBQ,IAAAA,gBAAK,CAAA,CAAC,EAAEtB,KAAK,QAAQ,EAAEhB,IAAIO,EAAE,CAAC,CAAC,CAAC,GAAGS;YAC9DuB,OAAOvC,IAAIO,EAAE;YACbP;QACF;IACF;IAEA,MAAMuC,QAAQ,MAAMC,IAAAA,oBAAW,EAACF,IAAAA,gBAAK,CAAA,CAAC,gCAAgC,CAAC,EAAEV;IAEzE,QAAOA,gBAAAA,QAAQN,IAAI,CAAC,CAACmB,OAASA,KAAKF,KAAK,KAAKA,2BAAtCX,cAA8C5B,GAAG;AAC1D"}