@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/export/embed/xcodeCompilerLogger.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport path from 'path';\n\nimport { Log } from '../../log';\n\nexport function isPossiblyUnableToResolveError(\n error: any\n): error is { message: string; originModulePath: string; targetModuleName: string } {\n return (\n 'message' in error &&\n typeof error.message === 'string' &&\n 'originModulePath' in error &&\n typeof error.originModulePath === 'string' &&\n 'targetModuleName' in error &&\n typeof error.targetModuleName === 'string'\n );\n}\nfunction isPossiblyTransformError(\n error: any\n): error is { message: string; filename: string; lineNumber: number; column?: number } {\n return (\n 'message' in error &&\n typeof error.message === 'string' &&\n 'filename' in error &&\n typeof error.filename === 'string' &&\n 'lineNumber' in error &&\n typeof error.lineNumber === 'number'\n );\n}\n\nexport function getXcodeCompilerErrorMessage(\n projectRoot: string,\n error: Error | any\n): string | null {\n const makeFilepathAbsolute = (filepath: string) =>\n filepath.startsWith('/') ? filepath : path.join(projectRoot, filepath);\n\n if (typeof error === 'string') {\n return makeXcodeCompilerLog('error', error);\n } else if ('message' in error) {\n // Metro's `UnableToResolveError`\n if (isPossiblyUnableToResolveError(error)) {\n const loc = getLineNumberForStringInFile(error.originModulePath, error.targetModuleName);\n return makeXcodeCompilerLog('error', error.message, {\n fileName: error.originModulePath,\n lineNumber: loc?.lineNumber,\n column: loc?.column,\n });\n } else if (isPossiblyTransformError(error)) {\n return makeXcodeCompilerLog('error', error.message, {\n // Metro generally returns the filename as relative from the project root.\n fileName: makeFilepathAbsolute(error.filename),\n lineNumber: error.lineNumber,\n column: error.column,\n });\n // TODO: ResourceNotFoundError, GraphNotFoundError, RevisionNotFoundError, AmbiguousModuleResolutionError\n } else {\n // Unknown error\n return makeXcodeCompilerLog('error', error.message);\n }\n }\n\n return null;\n}\n\n/** Log an error that can be parsed by Xcode and related build tools https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Log-errors-and-warnings-from-your-script */\nexport function logMetroErrorInXcode(projectRoot: string, error: Error | string) {\n const message = getXcodeCompilerErrorMessage(projectRoot, error);\n if (message != null) {\n console.error(message);\n }\n}\n\nexport function logInXcode(message: string) {\n Log.log(makeXcodeCompilerLog('note', message));\n}\n\nexport function warnInXcode(message: string) {\n Log.warn(makeXcodeCompilerLog('warning', message));\n}\n\n// Detect running in xcode build script. This means the logs need to be formatted in a way that Xcode can parse them, it also means that the shell is not reliable or interactive.\n// https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Access-script-related-files-from-environment-variables\nexport function isExecutingFromXcodebuild() {\n return !!process.env.BUILT_PRODUCTS_DIR;\n}\n\nfunction makeXcodeCompilerLog(\n type: 'error' | 'fatal error' | 'warning' | 'note',\n message: string,\n {\n fileName,\n lineNumber,\n column,\n }: {\n /** Absolute file path to link to in Xcode. */\n fileName?: string;\n lineNumber?: number;\n column?: number;\n } = {}\n) {\n if (!isExecutingFromXcodebuild()) {\n return message;\n }\n // TODO: Figure out how to support multi-line logs.\n const firstLine = message.split('\\n')[0];\n if (fileName && !fileName?.includes(':')) {\n return `${fileName}:${lineNumber || 0}:${\n column != null ? column + ':' : ''\n } ${type}: ${firstLine}`;\n }\n return `${type}: ${firstLine}`;\n}\n\n// TODO: Metro doesn't expose this info even though it knows it.\nfunction getLineNumberForStringInFile(originModulePath: string, targetModuleName: string) {\n let file;\n try {\n file = fs.readFileSync(originModulePath, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT' || error.code === 'EISDIR') {\n // We're probably dealing with a virtualised file system where\n // `this.originModulePath` doesn't actually exist on disk.\n // We can't show a code frame, but there's no need to let this I/O\n // error shadow the original module resolution error.\n return null;\n }\n throw error;\n }\n const lines = file.split('\\n');\n let lineNumber = 0;\n let column = -1;\n for (let line = 0; line < lines.length; line++) {\n const columnLocation = lines[line].lastIndexOf(targetModuleName);\n if (columnLocation >= 0) {\n lineNumber = line;\n column = columnLocation;\n break;\n }\n }\n return { lineNumber, column };\n}\n"],"names":["getXcodeCompilerErrorMessage","isExecutingFromXcodebuild","isPossiblyUnableToResolveError","logInXcode","logMetroErrorInXcode","warnInXcode","error","message","originModulePath","targetModuleName","isPossiblyTransformError","filename","lineNumber","projectRoot","makeFilepathAbsolute","filepath","startsWith","path","join","makeXcodeCompilerLog","loc","getLineNumberForStringInFile","fileName","column","console","Log","log","warn","process","env","BUILT_PRODUCTS_DIR","type","firstLine","split","includes","file","fs","readFileSync","code","lines","line","length","columnLocation","lastIndexOf"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/export/embed/xcodeCompilerLogger.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport path from 'path';\n\nimport { Log } from '../../log';\n\nexport function isPossiblyUnableToResolveError(\n error: any\n): error is { message: string; originModulePath: string; targetModuleName: string } {\n return (\n 'message' in error &&\n typeof error.message === 'string' &&\n 'originModulePath' in error &&\n typeof error.originModulePath === 'string' &&\n 'targetModuleName' in error &&\n typeof error.targetModuleName === 'string'\n );\n}\nfunction isPossiblyTransformError(\n error: any\n): error is { message: string; filename: string; lineNumber: number; column?: number } {\n return (\n 'message' in error &&\n typeof error.message === 'string' &&\n 'filename' in error &&\n typeof error.filename === 'string' &&\n 'lineNumber' in error &&\n typeof error.lineNumber === 'number'\n );\n}\n\nexport function getXcodeCompilerErrorMessage(\n projectRoot: string,\n error: Error | any\n): string | null {\n const makeFilepathAbsolute = (filepath: string) =>\n filepath.startsWith('/') ? filepath : path.join(projectRoot, filepath);\n\n if (typeof error === 'string') {\n return makeXcodeCompilerLog('error', error);\n } else if ('message' in error) {\n // Metro's `UnableToResolveError`\n if (isPossiblyUnableToResolveError(error)) {\n const loc = getLineNumberForStringInFile(error.originModulePath, error.targetModuleName);\n return makeXcodeCompilerLog('error', error.message, {\n fileName: error.originModulePath,\n lineNumber: loc?.lineNumber,\n column: loc?.column,\n });\n } else if (isPossiblyTransformError(error)) {\n return makeXcodeCompilerLog('error', error.message, {\n // Metro generally returns the filename as relative from the project root.\n fileName: makeFilepathAbsolute(error.filename),\n lineNumber: error.lineNumber,\n column: error.column,\n });\n // TODO: ResourceNotFoundError, GraphNotFoundError, RevisionNotFoundError, AmbiguousModuleResolutionError\n } else {\n // Unknown error\n return makeXcodeCompilerLog('error', error.message);\n }\n }\n\n return null;\n}\n\n/** Log an error that can be parsed by Xcode and related build tools https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Log-errors-and-warnings-from-your-script */\nexport function logMetroErrorInXcode(projectRoot: string, error: Error | string) {\n const message = getXcodeCompilerErrorMessage(projectRoot, error);\n if (message != null) {\n console.error(message);\n }\n}\n\nexport function logInXcode(message: string) {\n Log.log(makeXcodeCompilerLog('note', message));\n}\n\nexport function warnInXcode(message: string) {\n Log.warn(makeXcodeCompilerLog('warning', message));\n}\n\n// Detect running in xcode build script. This means the logs need to be formatted in a way that Xcode can parse them, it also means that the shell is not reliable or interactive.\n// https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Access-script-related-files-from-environment-variables\nexport function isExecutingFromXcodebuild() {\n return !!process.env.BUILT_PRODUCTS_DIR;\n}\n\nfunction makeXcodeCompilerLog(\n type: 'error' | 'fatal error' | 'warning' | 'note',\n message: string,\n {\n fileName,\n lineNumber,\n column,\n }: {\n /** Absolute file path to link to in Xcode. */\n fileName?: string;\n lineNumber?: number;\n column?: number;\n } = {}\n) {\n if (!isExecutingFromXcodebuild()) {\n return message;\n }\n // TODO: Figure out how to support multi-line logs.\n const firstLine = message.split('\\n')[0];\n if (fileName && !fileName?.includes(':')) {\n return `${fileName}:${lineNumber || 0}:${\n column != null ? column + ':' : ''\n } ${type}: ${firstLine}`;\n }\n return `${type}: ${firstLine}`;\n}\n\n// TODO: Metro doesn't expose this info even though it knows it.\nfunction getLineNumberForStringInFile(originModulePath: string, targetModuleName: string) {\n let file;\n try {\n file = fs.readFileSync(originModulePath, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT' || error.code === 'EISDIR') {\n // We're probably dealing with a virtualised file system where\n // `this.originModulePath` doesn't actually exist on disk.\n // We can't show a code frame, but there's no need to let this I/O\n // error shadow the original module resolution error.\n return null;\n }\n throw error;\n }\n const lines = file.split('\\n');\n let lineNumber = 0;\n let column = -1;\n for (let line = 0; line < lines.length; line++) {\n const columnLocation = lines[line]!.lastIndexOf(targetModuleName);\n if (columnLocation >= 0) {\n lineNumber = line;\n column = columnLocation;\n break;\n }\n }\n return { lineNumber, column };\n}\n"],"names":["getXcodeCompilerErrorMessage","isExecutingFromXcodebuild","isPossiblyUnableToResolveError","logInXcode","logMetroErrorInXcode","warnInXcode","error","message","originModulePath","targetModuleName","isPossiblyTransformError","filename","lineNumber","projectRoot","makeFilepathAbsolute","filepath","startsWith","path","join","makeXcodeCompilerLog","loc","getLineNumberForStringInFile","fileName","column","console","Log","log","warn","process","env","BUILT_PRODUCTS_DIR","type","firstLine","split","includes","file","fs","readFileSync","code","lines","line","length","columnLocation","lastIndexOf"],"mappings":"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"}
@@ -22,9 +22,9 @@ function _paths() {
22
22
  };
23
23
  return data;
24
24
  }
25
- function _assert() {
26
- const data = /*#__PURE__*/ _interop_require_default(require("assert"));
27
- _assert = function() {
25
+ function _html() {
26
+ const data = require("@expo/router-server/build/utils/html");
27
+ _html = function() {
28
28
  return data;
29
29
  };
30
30
  return data;
@@ -36,16 +36,23 @@ function _chalk() {
36
36
  };
37
37
  return data;
38
38
  }
39
- function _fs() {
40
- const data = /*#__PURE__*/ _interop_require_default(require("fs"));
41
- _fs = function() {
39
+ function _nodeassert() {
40
+ const data = /*#__PURE__*/ _interop_require_default(require("node:assert"));
41
+ _nodeassert = function() {
42
42
  return data;
43
43
  };
44
44
  return data;
45
45
  }
46
- function _path() {
47
- const data = /*#__PURE__*/ _interop_require_default(require("path"));
48
- _path = function() {
46
+ function _nodefs() {
47
+ const data = /*#__PURE__*/ _interop_require_default(require("node:fs"));
48
+ _nodefs = function() {
49
+ return data;
50
+ };
51
+ return data;
52
+ }
53
+ function _nodepath() {
54
+ const data = /*#__PURE__*/ _interop_require_default(require("node:path"));
55
+ _nodepath = function() {
49
56
  return data;
50
57
  };
51
58
  return data;
@@ -140,7 +147,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
140
147
  throw new _errors.CommandError('--no-ssg can only be used with `web.output: server`');
141
148
  }
142
149
  const baseUrl = (0, _metroOptions.getBaseUrlFromExpoConfig)(exp);
143
- if (!bytecode && (platforms.includes('ios') || platforms.includes('android'))) {
150
+ if (!bytecode && platforms.some((platform)=>platform !== 'web')) {
144
151
  _log.warn(`Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`);
145
152
  }
146
153
  // Print out logs
@@ -153,8 +160,8 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
153
160
  }
154
161
  }
155
162
  const mode = dev ? 'development' : 'production';
156
- const publicPath = _path().default.resolve(projectRoot, _env.env.EXPO_PUBLIC_FOLDER);
157
- const outputPath = _path().default.resolve(projectRoot, outputDir);
163
+ const publicPath = (0, _publicFolder.getPublicFolderPath)(projectRoot);
164
+ const outputPath = _nodepath().default.resolve(projectRoot, outputDir);
158
165
  // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).
159
166
  const files = new Map();
160
167
  const devServerManager = await _DevServerManager.DevServerManager.startMetroAsync(projectRoot, {
@@ -167,7 +174,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
167
174
  maxWorkers
168
175
  });
169
176
  const devServer = devServerManager.getDefaultDevServer();
170
- (0, _assert().default)(devServer instanceof _MetroBundlerDevServer.MetroBundlerDevServer);
177
+ (0, _nodeassert().default)(devServer instanceof _MetroBundlerDevServer.MetroBundlerDevServer);
171
178
  const bundles = {};
172
179
  const domComponentAssetsMetadata = {};
173
180
  const spaPlatforms = // TODO: Support server and static rendering for server component exports.
@@ -177,7 +184,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
177
184
  // In RSC mode, we only need these to be in the client dir.
178
185
  // TODO: Merge back with other copy after we add SSR.
179
186
  try {
180
- await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _path().default.join(outputPath, 'client'));
187
+ await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _nodepath().default.join(outputPath, 'client'));
181
188
  } catch (error) {
182
189
  _log.error('Failed to copy public directory to dist directory');
183
190
  throw error;
@@ -267,28 +274,25 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
267
274
  ];
268
275
  }));
269
276
  if (platform === 'web') {
277
+ const faviconAsset = await (0, _favicon.generateFaviconAssetAsync)(projectRoot, {
278
+ outputDir,
279
+ baseUrl,
280
+ files,
281
+ exp: projectConfig.exp
282
+ });
270
283
  // TODO: Unify with exportStaticAsync
271
284
  // TODO: Maybe move to the serializer.
272
- let html = await (0, _serializeHtml.serializeHtmlWithAssets)({
285
+ const html = (0, _serializeHtml.serializeHtmlWithAssets)({
273
286
  isExporting: true,
274
287
  resources: bundle.artifacts,
275
288
  template: await (0, _webTemplate.createTemplateHtmlFromExpoConfigAsync)(projectRoot, {
276
289
  scripts: [],
277
290
  cssLinks: [],
291
+ extraHead: faviconAsset ? (0, _html().createFaviconAsString)(faviconAsset.href) : undefined,
278
292
  exp: projectConfig.exp
279
293
  }),
280
294
  baseUrl
281
295
  });
282
- // Add the favicon assets to the HTML.
283
- const modifyHtml = await (0, _favicon.getVirtualFaviconAssetsAsync)(projectRoot, {
284
- outputDir,
285
- baseUrl,
286
- files,
287
- exp: projectConfig.exp
288
- });
289
- if (modifyHtml) {
290
- html = modifyHtml(html);
291
- }
292
296
  // HACK: This is used for adding SSR shims in React Server Components.
293
297
  templateHtml = html;
294
298
  // Generate SPA-styled HTML file.
@@ -347,7 +351,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
347
351
  const exportServer = ((_exp_web2 = exp.web) == null ? void 0 : _exp_web2.output) === 'server';
348
352
  if (exportServer) {
349
353
  // TODO: Remove when this is abstracted into the files map
350
- await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _path().default.resolve(outputPath, 'client'));
354
+ await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _nodepath().default.resolve(outputPath, 'client'));
351
355
  }
352
356
  if (skipSSG) {
353
357
  _log.log('Skipping static site generation');
@@ -358,8 +362,8 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
358
362
  });
359
363
  // Output a placeholder index.html if one doesn't exist in the public directory.
360
364
  // This ensures native + API routes have some content at the root URL.
361
- const placeholderIndex = _path().default.resolve(outputPath, 'client/index.html');
362
- if (!_fs().default.existsSync(placeholderIndex)) {
365
+ const placeholderIndex = _nodepath().default.resolve(outputPath, 'client/index.html');
366
+ if (!_nodefs().default.existsSync(placeholderIndex)) {
363
367
  files.set('index.html', {
364
368
  contents: `<html><body></body></html>`,
365
369
  targetDomain: 'client'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/exportApp.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport type { Platform } from '@expo/config';\nimport { resolveRelativeEntryPoint } from '@expo/config/paths';\nimport { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { type PlatformMetadata, createMetadataJson } from './createMetadataJson';\nimport { exportAssetsAsync } from './exportAssets';\nimport {\n addDomBundleToMetadataAsync,\n exportDomComponentAsync,\n transformNativeBundleForMd5Filename,\n transformDomEntryForMd5Filename,\n} from './exportDomComponents';\nimport { assertEngineMismatchAsync, isEnableHermesManaged } from './exportHermes';\nimport { exportApiRoutesStandaloneAsync, exportFromServerAsync } from './exportStaticAsync';\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { getPublicExpoManifestAsync } from './getPublicExpoManifest';\nimport { copyPublicFolderAsync } from './publicFolder';\nimport { Options } from './resolveOptions';\nimport {\n ExportAssetMap,\n BundleOutput,\n getFilesFromSerialAssets,\n persistMetroFilesAsync,\n BundleAssetWithFileHashes,\n} from './saveAssets';\nimport { createAssetMap } from './writeContents';\nimport * as Log from '../log';\nimport { WebSupportProjectPrerequisite } from '../start/doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { getRouterDirectoryModuleIdWithManifest } from '../start/server/metro/router';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { getBaseUrlFromExpoConfig } from '../start/server/middleware/metroOptions';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../start/server/webTemplate';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv, loadEnvFiles } from '../utils/nodeEnv';\n\nexport async function exportAppAsync(\n projectRoot: string,\n {\n platforms,\n outputDir,\n clear,\n dev,\n dumpAssetmap,\n sourceMaps,\n inlineSourceMaps,\n minify,\n bytecode,\n maxWorkers,\n skipSSG,\n hostedNative,\n }: Pick<\n Options,\n | 'dumpAssetmap'\n | 'sourceMaps'\n | 'inlineSourceMaps'\n | 'dev'\n | 'clear'\n | 'outputDir'\n | 'platforms'\n | 'minify'\n | 'bytecode'\n | 'maxWorkers'\n | 'skipSSG'\n | 'hostedNative'\n >\n): Promise<void> {\n // Force the environment during export and do not allow overriding it.\n const environment = dev ? 'development' : 'production';\n process.env.NODE_ENV = environment;\n setNodeEnv(environment);\n loadEnvFiles(projectRoot);\n\n const projectConfig = getConfig(projectRoot);\n const exp = await getPublicExpoManifestAsync(projectRoot, {\n // Web doesn't require validation.\n skipValidation: platforms.length === 1 && platforms[0] === 'web',\n });\n\n if (platforms.includes('web')) {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n const useServerRendering = ['static', 'server'].includes(exp.web?.output ?? '');\n\n if (skipSSG && exp.web?.output !== 'server') {\n throw new CommandError('--no-ssg can only be used with `web.output: server`');\n }\n\n const baseUrl = getBaseUrlFromExpoConfig(exp);\n\n if (!bytecode && (platforms.includes('ios') || platforms.includes('android'))) {\n Log.warn(\n `Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`\n );\n }\n\n // Print out logs\n if (baseUrl) {\n Log.log();\n Log.log(chalk.gray`Using (experimental) base path: ${baseUrl}`);\n // Warn if not using an absolute path.\n if (!baseUrl.startsWith('/')) {\n Log.log(\n chalk.yellow` Base path does not start with a slash. Requests will not be absolute.`\n );\n }\n }\n\n const mode = dev ? 'development' : 'production';\n const publicPath = path.resolve(projectRoot, env.EXPO_PUBLIC_FOLDER);\n const outputPath = path.resolve(projectRoot, outputDir);\n\n // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).\n\n const files: ExportAssetMap = new Map();\n\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify,\n mode,\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: clear,\n maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const bundles: Partial<Record<Platform, BundleOutput>> = {};\n const domComponentAssetsMetadata: Partial<Record<Platform, PlatformMetadata['assets']>> = {};\n\n const spaPlatforms =\n // TODO: Support server and static rendering for server component exports.\n useServerRendering && !devServer.isReactServerComponentsEnabled\n ? platforms.filter((platform) => platform !== 'web')\n : platforms;\n\n try {\n if (devServer.isReactServerComponentsEnabled) {\n // In RSC mode, we only need these to be in the client dir.\n // TODO: Merge back with other copy after we add SSR.\n try {\n await copyPublicFolderAsync(publicPath, path.join(outputPath, 'client'));\n } catch (error) {\n Log.error('Failed to copy public directory to dist directory');\n throw error;\n }\n } else {\n // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain\n // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web`\n await copyPublicFolderAsync(publicPath, outputPath);\n }\n\n let templateHtml: string | undefined;\n // Can be empty during web-only SSG.\n if (spaPlatforms.length) {\n await Promise.all(\n spaPlatforms.map(async (platform) => {\n // Assert early so the user doesn't have to wait until bundling is complete to find out that\n // Hermes won't be available.\n const isHermes = isEnableHermesManaged(exp, platform);\n if (isHermes) {\n await assertEngineMismatchAsync(projectRoot, exp, platform);\n }\n\n let bundle: {\n artifacts: SerialAsset[];\n assets: readonly BundleAssetWithFileHashes[];\n files?: ExportAssetMap;\n };\n\n try {\n // Run metro bundler and create the JS bundles/source maps.\n bundle = await devServer.nativeExportBundleAsync(\n exp,\n {\n platform,\n splitChunks:\n !env.EXPO_NO_BUNDLE_SPLITTING &&\n ((devServer.isReactServerComponentsEnabled && !bytecode) || platform === 'web'),\n mainModuleName: resolveRelativeEntryPoint(projectRoot, {\n platform,\n pkg: projectConfig.pkg,\n }),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: sourceMaps || inlineSourceMaps,\n inlineSourceMap: inlineSourceMaps,\n bytecode: bytecode && isHermes,\n reactCompiler: !!exp.experiments?.reactCompiler,\n hosted: hostedNative,\n },\n files\n );\n } catch (error) {\n Log.log('');\n if (error instanceof Error) {\n Log.exception(error);\n } else {\n Log.error('Failed to bundle the app');\n Log.log(error as any);\n }\n process.exit(1);\n }\n\n bundles[platform] = bundle;\n\n getFilesFromSerialAssets(bundle.artifacts, {\n includeSourceMaps: sourceMaps,\n files,\n isServerHosted: devServer.isReactServerComponentsEnabled || hostedNative,\n });\n\n const expoDomComponentReferences = [\n ...new Set(\n bundle.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat()\n ),\n ];\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle: platformDomComponentsBundle, htmlOutputName } =\n await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps: sourceMaps,\n exp,\n files,\n useMd5Filename: true,\n });\n\n // Merge the assets from the DOM component into the output assets, deduplicating by hash.\n const existingHashes = new Set(bundle.assets.map((a) => a.hash));\n (bundle.assets as (typeof bundle.assets)[0][]).push(\n ...platformDomComponentsBundle.assets.filter((a) => !existingHashes.has(a.hash))\n );\n\n transformNativeBundleForMd5Filename({\n domComponentReference: filePath,\n nativeBundle: bundle,\n files,\n htmlOutputName,\n });\n domComponentAssetsMetadata[platform] = [\n ...(domComponentAssetsMetadata[platform] || []),\n ...(await addDomBundleToMetadataAsync(platformDomComponentsBundle)),\n ...transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n }),\n ];\n })\n );\n\n if (platform === 'web') {\n // TODO: Unify with exportStaticAsync\n // TODO: Maybe move to the serializer.\n let html = await serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: await createTemplateHtmlFromExpoConfigAsync(projectRoot, {\n scripts: [],\n cssLinks: [],\n exp: projectConfig.exp,\n }),\n baseUrl,\n });\n\n // Add the favicon assets to the HTML.\n const modifyHtml = await getVirtualFaviconAssetsAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp: projectConfig.exp,\n });\n if (modifyHtml) {\n html = modifyHtml(html);\n }\n\n // HACK: This is used for adding SSR shims in React Server Components.\n templateHtml = html;\n\n // Generate SPA-styled HTML file.\n // If web exists, then write the template HTML file.\n files.set('index.html', {\n contents: html,\n targetDomain: devServer.isReactServerComponentsEnabled ? 'server' : 'client',\n });\n }\n })\n );\n\n if (devServer.isReactServerComponentsEnabled) {\n const isWeb = platforms.includes('web');\n\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: !isWeb,\n templateHtml,\n });\n }\n\n // TODO: Use same asset system across platforms again.\n const { assets, embeddedHashSet } = await exportAssetsAsync(projectRoot, {\n files,\n exp,\n outputDir: outputPath,\n bundles,\n baseUrl,\n hostedNative,\n });\n\n if (dumpAssetmap) {\n Log.log('Creating asset map');\n files.set('assetmap.json', { contents: JSON.stringify(createAssetMap({ assets })) });\n }\n\n const targetDomain = devServer.isReactServerComponentsEnabled ? 'client/' : '';\n const fileNames = Object.fromEntries(\n Object.entries(bundles).map(([platform, bundle]) => [\n platform,\n bundle.artifacts\n .filter((asset) => asset.type === 'js')\n .map((asset) => targetDomain + asset.filename),\n ])\n );\n\n // Generate a `metadata.json` for EAS Update.\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n domComponentAssetsMetadata,\n });\n files.set('metadata.json', { contents: JSON.stringify(contents) });\n }\n\n // Additional web-only steps...\n\n if (platforms.includes('web') && useServerRendering) {\n const exportServer = exp.web?.output === 'server';\n\n if (exportServer) {\n // TODO: Remove when this is abstracted into the files map\n await copyPublicFolderAsync(publicPath, path.resolve(outputPath, 'client'));\n }\n\n if (skipSSG) {\n Log.log('Skipping static site generation');\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: true,\n });\n\n // Output a placeholder index.html if one doesn't exist in the public directory.\n // This ensures native + API routes have some content at the root URL.\n const placeholderIndex = path.resolve(outputPath, 'client/index.html');\n if (!fs.existsSync(placeholderIndex)) {\n files.set('index.html', {\n contents: `<html><body></body></html>`,\n targetDomain: 'client',\n });\n }\n } else if (\n // TODO: Support static export with RSC.\n !devServer.isReactServerComponentsEnabled\n ) {\n await exportFromServerAsync(projectRoot, devServer, {\n mode,\n files,\n clear: !!clear,\n outputDir: outputPath,\n minify,\n baseUrl,\n includeSourceMaps: sourceMaps,\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n reactCompiler: !!exp.experiments?.reactCompiler,\n exportServer,\n maxWorkers,\n isExporting: true,\n exp: projectConfig.exp,\n });\n }\n }\n } finally {\n await devServerManager.stopAsync();\n }\n\n // Write all files at the end for unified logging.\n await persistMetroFilesAsync(files, outputPath);\n}\n"],"names":["exportAppAsync","projectRoot","platforms","outputDir","clear","dev","dumpAssetmap","sourceMaps","inlineSourceMaps","minify","bytecode","maxWorkers","skipSSG","hostedNative","exp","environment","process","env","NODE_ENV","setNodeEnv","loadEnvFiles","projectConfig","getConfig","getPublicExpoManifestAsync","skipValidation","length","includes","WebSupportProjectPrerequisite","assertAsync","useServerRendering","web","output","CommandError","baseUrl","getBaseUrlFromExpoConfig","Log","warn","log","chalk","gray","startsWith","yellow","mode","publicPath","path","resolve","EXPO_PUBLIC_FOLDER","outputPath","files","Map","devServerManager","DevServerManager","startMetroAsync","port","isExporting","location","resetDevServer","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","bundles","domComponentAssetsMetadata","spaPlatforms","isReactServerComponentsEnabled","filter","platform","copyPublicFolderAsync","join","error","templateHtml","Promise","all","map","isHermes","isEnableHermesManaged","assertEngineMismatchAsync","bundle","nativeExportBundleAsync","splitChunks","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","resolveRelativeEntryPoint","pkg","engine","undefined","serializerIncludeMaps","inlineSourceMap","reactCompiler","experiments","hosted","Error","exception","exit","getFilesFromSerialAssets","artifacts","includeSourceMaps","isServerHosted","expoDomComponentReferences","Set","artifact","Array","isArray","metadata","flat","filePath","platformDomComponentsBundle","htmlOutputName","exportDomComponentAsync","useMd5Filename","existingHashes","assets","a","hash","push","has","transformNativeBundleForMd5Filename","domComponentReference","nativeBundle","addDomBundleToMetadataAsync","transformDomEntryForMd5Filename","html","serializeHtmlWithAssets","resources","template","createTemplateHtmlFromExpoConfigAsync","scripts","cssLinks","modifyHtml","getVirtualFaviconAssetsAsync","set","contents","targetDomain","isWeb","exportApiRoutesStandaloneAsync","apiRoutesOnly","embeddedHashSet","exportAssetsAsync","JSON","stringify","createAssetMap","fileNames","Object","fromEntries","entries","asset","type","filename","createMetadataJson","exportServer","placeholderIndex","fs","existsSync","exportFromServerAsync","routerRoot","getRouterDirectoryModuleIdWithManifest","stopAsync","persistMetroFilesAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/export/exportApp.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport type { Platform } from '@expo/config';\nimport { resolveRelativeEntryPoint } from '@expo/config/paths';\nimport type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport { createFaviconAsString } from '@expo/router-server/build/utils/html';\nimport chalk from 'chalk';\nimport assert from 'node:assert';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { type PlatformMetadata, createMetadataJson } from './createMetadataJson';\nimport { exportAssetsAsync } from './exportAssets';\nimport {\n addDomBundleToMetadataAsync,\n exportDomComponentAsync,\n transformNativeBundleForMd5Filename,\n transformDomEntryForMd5Filename,\n} from './exportDomComponents';\nimport { assertEngineMismatchAsync, isEnableHermesManaged } from './exportHermes';\nimport { exportApiRoutesStandaloneAsync, exportFromServerAsync } from './exportStaticAsync';\nimport { generateFaviconAssetAsync } from './favicon';\nimport { getPublicExpoManifestAsync } from './getPublicExpoManifest';\nimport { copyPublicFolderAsync, getPublicFolderPath } from './publicFolder';\nimport type { Options } from './resolveOptions';\nimport type { ExportAssetMap, BundleOutput, BundleAssetWithFileHashes } from './saveAssets';\nimport { getFilesFromSerialAssets, persistMetroFilesAsync } from './saveAssets';\nimport { createAssetMap } from './writeContents';\nimport * as Log from '../log';\nimport { WebSupportProjectPrerequisite } from '../start/doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { getRouterDirectoryModuleIdWithManifest } from '../start/server/metro/router';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { getBaseUrlFromExpoConfig } from '../start/server/middleware/metroOptions';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../start/server/webTemplate';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv, loadEnvFiles } from '../utils/nodeEnv';\n\nexport async function exportAppAsync(\n projectRoot: string,\n {\n platforms,\n outputDir,\n clear,\n dev,\n dumpAssetmap,\n sourceMaps,\n inlineSourceMaps,\n minify,\n bytecode,\n maxWorkers,\n skipSSG,\n hostedNative,\n }: Pick<\n Options,\n | 'dumpAssetmap'\n | 'sourceMaps'\n | 'inlineSourceMaps'\n | 'dev'\n | 'clear'\n | 'outputDir'\n | 'platforms'\n | 'minify'\n | 'bytecode'\n | 'maxWorkers'\n | 'skipSSG'\n | 'hostedNative'\n >\n): Promise<void> {\n // Force the environment during export and do not allow overriding it.\n const environment = dev ? 'development' : 'production';\n process.env.NODE_ENV = environment;\n setNodeEnv(environment);\n loadEnvFiles(projectRoot);\n\n const projectConfig = getConfig(projectRoot);\n const exp = await getPublicExpoManifestAsync(projectRoot, {\n // Web doesn't require validation.\n skipValidation: platforms.length === 1 && platforms[0] === 'web',\n });\n\n if (platforms.includes('web')) {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n const useServerRendering = ['static', 'server'].includes(exp.web?.output ?? '');\n\n if (skipSSG && exp.web?.output !== 'server') {\n throw new CommandError('--no-ssg can only be used with `web.output: server`');\n }\n\n const baseUrl = getBaseUrlFromExpoConfig(exp);\n\n if (!bytecode && platforms.some((platform) => platform !== 'web')) {\n Log.warn(\n `Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`\n );\n }\n\n // Print out logs\n if (baseUrl) {\n Log.log();\n Log.log(chalk.gray`Using (experimental) base path: ${baseUrl}`);\n // Warn if not using an absolute path.\n if (!baseUrl.startsWith('/')) {\n Log.log(\n chalk.yellow` Base path does not start with a slash. Requests will not be absolute.`\n );\n }\n }\n\n const mode = dev ? 'development' : 'production';\n const publicPath = getPublicFolderPath(projectRoot);\n const outputPath = path.resolve(projectRoot, outputDir);\n\n // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).\n\n const files: ExportAssetMap = new Map();\n\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify,\n mode,\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: clear,\n maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const bundles: Partial<Record<Platform, BundleOutput>> = {};\n const domComponentAssetsMetadata: Partial<Record<Platform, PlatformMetadata['assets']>> = {};\n\n const spaPlatforms =\n // TODO: Support server and static rendering for server component exports.\n useServerRendering && !devServer.isReactServerComponentsEnabled\n ? platforms.filter((platform) => platform !== 'web')\n : platforms;\n\n try {\n if (devServer.isReactServerComponentsEnabled) {\n // In RSC mode, we only need these to be in the client dir.\n // TODO: Merge back with other copy after we add SSR.\n try {\n await copyPublicFolderAsync(publicPath, path.join(outputPath, 'client'));\n } catch (error) {\n Log.error('Failed to copy public directory to dist directory');\n throw error;\n }\n } else {\n // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain\n // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web`\n await copyPublicFolderAsync(publicPath, outputPath);\n }\n\n let templateHtml: string | undefined;\n // Can be empty during web-only SSG.\n if (spaPlatforms.length) {\n await Promise.all(\n spaPlatforms.map(async (platform) => {\n // Assert early so the user doesn't have to wait until bundling is complete to find out that\n // Hermes won't be available.\n const isHermes = isEnableHermesManaged(exp, platform);\n if (isHermes) {\n await assertEngineMismatchAsync(projectRoot, exp, platform);\n }\n\n let bundle: {\n artifacts: SerialAsset[];\n assets: readonly BundleAssetWithFileHashes[];\n files?: ExportAssetMap;\n };\n\n try {\n // Run metro bundler and create the JS bundles/source maps.\n bundle = await devServer.nativeExportBundleAsync(\n exp,\n {\n platform,\n splitChunks:\n !env.EXPO_NO_BUNDLE_SPLITTING &&\n ((devServer.isReactServerComponentsEnabled && !bytecode) || platform === 'web'),\n mainModuleName: resolveRelativeEntryPoint(projectRoot, {\n platform,\n pkg: projectConfig.pkg,\n }),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: sourceMaps || inlineSourceMaps,\n inlineSourceMap: inlineSourceMaps,\n bytecode: bytecode && isHermes,\n reactCompiler: !!exp.experiments?.reactCompiler,\n hosted: hostedNative,\n },\n files\n );\n } catch (error) {\n Log.log('');\n if (error instanceof Error) {\n Log.exception(error);\n } else {\n Log.error('Failed to bundle the app');\n Log.log(error as any);\n }\n process.exit(1);\n }\n\n bundles[platform] = bundle;\n\n getFilesFromSerialAssets(bundle.artifacts, {\n includeSourceMaps: sourceMaps,\n files,\n isServerHosted: devServer.isReactServerComponentsEnabled || hostedNative,\n });\n\n const expoDomComponentReferences = [\n ...new Set(\n bundle.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat()\n ),\n ];\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle: platformDomComponentsBundle, htmlOutputName } =\n await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps: sourceMaps,\n exp,\n files,\n useMd5Filename: true,\n });\n\n // Merge the assets from the DOM component into the output assets, deduplicating by hash.\n const existingHashes = new Set(bundle.assets.map((a) => a.hash));\n (bundle.assets as (typeof bundle.assets)[0][]).push(\n ...platformDomComponentsBundle.assets.filter((a) => !existingHashes.has(a.hash))\n );\n\n transformNativeBundleForMd5Filename({\n domComponentReference: filePath,\n nativeBundle: bundle,\n files,\n htmlOutputName,\n });\n domComponentAssetsMetadata[platform] = [\n ...(domComponentAssetsMetadata[platform] || []),\n ...(await addDomBundleToMetadataAsync(platformDomComponentsBundle)),\n ...transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n }),\n ];\n })\n );\n\n if (platform === 'web') {\n const faviconAsset = await generateFaviconAssetAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp: projectConfig.exp,\n });\n\n // TODO: Unify with exportStaticAsync\n // TODO: Maybe move to the serializer.\n const html = serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: await createTemplateHtmlFromExpoConfigAsync(projectRoot, {\n scripts: [],\n cssLinks: [],\n extraHead: faviconAsset ? createFaviconAsString(faviconAsset.href) : undefined,\n exp: projectConfig.exp,\n }),\n baseUrl,\n });\n\n // HACK: This is used for adding SSR shims in React Server Components.\n templateHtml = html;\n\n // Generate SPA-styled HTML file.\n // If web exists, then write the template HTML file.\n files.set('index.html', {\n contents: html,\n targetDomain: devServer.isReactServerComponentsEnabled ? 'server' : 'client',\n });\n }\n })\n );\n\n if (devServer.isReactServerComponentsEnabled) {\n const isWeb = platforms.includes('web');\n\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: !isWeb,\n templateHtml,\n });\n }\n\n // TODO: Use same asset system across platforms again.\n const { assets, embeddedHashSet } = await exportAssetsAsync(projectRoot, {\n files,\n exp,\n outputDir: outputPath,\n bundles,\n baseUrl,\n hostedNative,\n });\n\n if (dumpAssetmap) {\n Log.log('Creating asset map');\n files.set('assetmap.json', { contents: JSON.stringify(createAssetMap({ assets })) });\n }\n\n const targetDomain = devServer.isReactServerComponentsEnabled ? 'client/' : '';\n const fileNames = Object.fromEntries(\n Object.entries(bundles).map(([platform, bundle]) => [\n platform,\n bundle.artifacts\n .filter((asset) => asset.type === 'js')\n .map((asset) => targetDomain + asset.filename),\n ])\n );\n\n // Generate a `metadata.json` for EAS Update.\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n domComponentAssetsMetadata,\n });\n files.set('metadata.json', { contents: JSON.stringify(contents) });\n }\n\n // Additional web-only steps...\n\n if (platforms.includes('web') && useServerRendering) {\n const exportServer = exp.web?.output === 'server';\n\n if (exportServer) {\n // TODO: Remove when this is abstracted into the files map\n await copyPublicFolderAsync(publicPath, path.resolve(outputPath, 'client'));\n }\n\n if (skipSSG) {\n Log.log('Skipping static site generation');\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: true,\n });\n\n // Output a placeholder index.html if one doesn't exist in the public directory.\n // This ensures native + API routes have some content at the root URL.\n const placeholderIndex = path.resolve(outputPath, 'client/index.html');\n if (!fs.existsSync(placeholderIndex)) {\n files.set('index.html', {\n contents: `<html><body></body></html>`,\n targetDomain: 'client',\n });\n }\n } else if (\n // TODO: Support static export with RSC.\n !devServer.isReactServerComponentsEnabled\n ) {\n await exportFromServerAsync(projectRoot, devServer, {\n mode,\n files,\n clear: !!clear,\n outputDir: outputPath,\n minify,\n baseUrl,\n includeSourceMaps: sourceMaps,\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n reactCompiler: !!exp.experiments?.reactCompiler,\n exportServer,\n maxWorkers,\n isExporting: true,\n exp: projectConfig.exp,\n });\n }\n }\n } finally {\n await devServerManager.stopAsync();\n }\n\n // Write all files at the end for unified logging.\n await persistMetroFilesAsync(files, outputPath);\n}\n"],"names":["exportAppAsync","projectRoot","platforms","outputDir","clear","dev","dumpAssetmap","sourceMaps","inlineSourceMaps","minify","bytecode","maxWorkers","skipSSG","hostedNative","exp","environment","process","env","NODE_ENV","setNodeEnv","loadEnvFiles","projectConfig","getConfig","getPublicExpoManifestAsync","skipValidation","length","includes","WebSupportProjectPrerequisite","assertAsync","useServerRendering","web","output","CommandError","baseUrl","getBaseUrlFromExpoConfig","some","platform","Log","warn","log","chalk","gray","startsWith","yellow","mode","publicPath","getPublicFolderPath","outputPath","path","resolve","files","Map","devServerManager","DevServerManager","startMetroAsync","port","isExporting","location","resetDevServer","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","bundles","domComponentAssetsMetadata","spaPlatforms","isReactServerComponentsEnabled","filter","copyPublicFolderAsync","join","error","templateHtml","Promise","all","map","isHermes","isEnableHermesManaged","assertEngineMismatchAsync","bundle","nativeExportBundleAsync","splitChunks","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","resolveRelativeEntryPoint","pkg","engine","undefined","serializerIncludeMaps","inlineSourceMap","reactCompiler","experiments","hosted","Error","exception","exit","getFilesFromSerialAssets","artifacts","includeSourceMaps","isServerHosted","expoDomComponentReferences","Set","artifact","Array","isArray","metadata","flat","filePath","platformDomComponentsBundle","htmlOutputName","exportDomComponentAsync","useMd5Filename","existingHashes","assets","a","hash","push","has","transformNativeBundleForMd5Filename","domComponentReference","nativeBundle","addDomBundleToMetadataAsync","transformDomEntryForMd5Filename","faviconAsset","generateFaviconAssetAsync","html","serializeHtmlWithAssets","resources","template","createTemplateHtmlFromExpoConfigAsync","scripts","cssLinks","extraHead","createFaviconAsString","href","set","contents","targetDomain","isWeb","exportApiRoutesStandaloneAsync","apiRoutesOnly","embeddedHashSet","exportAssetsAsync","JSON","stringify","createAssetMap","fileNames","Object","fromEntries","entries","asset","type","filename","createMetadataJson","exportServer","placeholderIndex","fs","existsSync","exportFromServerAsync","routerRoot","getRouterDirectoryModuleIdWithManifest","stopAsync","persistMetroFilesAsync"],"mappings":"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"}
@@ -5,17 +5,17 @@ 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
- assetPatternsToBeBundled: function() {
12
+ get assetPatternsToBeBundled () {
13
13
  return assetPatternsToBeBundled;
14
14
  },
15
- exportAssetsAsync: function() {
15
+ get exportAssetsAsync () {
16
16
  return exportAssetsAsync;
17
17
  },
18
- resolveAssetPatternsToBeBundled: function() {
18
+ get resolveAssetPatternsToBeBundled () {
19
19
  return resolveAssetPatternsToBeBundled;
20
20
  }
21
21
  });
@@ -222,7 +222,7 @@ async function exportAssetsAsync(projectRoot, { exp, outputDir, bundles: { web,
222
222
  const assetId = (0, _persistMetroAssets.getAssetIdForLogGrouping)(projectRoot, asset);
223
223
  asset.files.forEach((fp, index)=>{
224
224
  const hash = asset.fileHashes[index];
225
- if (hashes.has(hash)) return;
225
+ if (!hash || hashes.has(hash)) return;
226
226
  hashes.add(hash);
227
227
  files.set(_path().default.join('assets', hash), {
228
228
  originFilename: _path().default.relative(projectRoot, fp),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/exportAssets.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport fs from 'fs';\nimport path from 'path';\nimport picomatch from 'picomatch';\n\nimport { getAssetIdForLogGrouping, persistMetroAssetsAsync } from './persistMetroAssets';\nimport type { Asset, BundleAssetWithFileHashes, BundleOutput, ExportAssetMap } from './saveAssets';\nimport * as Log from '../log';\nimport { resolveGoogleServicesFile } from '../start/server/middleware/resolveAssets';\nimport { uniqBy } from '../utils/array';\n\nconst debug = require('debug')('expo:export:exportAssets') as typeof console.log;\n\nfunction mapAssetHashToAssetString(asset: Asset, hash: string) {\n return 'asset_' + hash + ('type' in asset && asset.type ? '.' + asset.type : '');\n}\n\nexport function assetPatternsToBeBundled(\n exp: ExpoConfig & { extra?: { updates?: { assetPatternsToBeBundled?: string[] } } }\n): string[] | undefined {\n // new location for this key\n if (exp.updates?.assetPatternsToBeBundled?.length) {\n return exp.updates.assetPatternsToBeBundled;\n }\n\n // old, untyped location for this key. we may want to change this to throw in a few SDK versions (deprecated as of SDK 52).\n if (exp.extra?.updates?.assetPatternsToBeBundled?.length) {\n return exp.extra.updates.assetPatternsToBeBundled;\n }\n\n return undefined;\n}\n\n/**\n * Given an asset and a set of strings representing the assets to be bundled, returns true if\n * the asset is part of the set to be bundled.\n * @param asset Asset object\n * @param bundledAssetsSet Set of strings\n * @returns true if the asset should be bundled\n */\nfunction assetShouldBeIncludedInExport(asset: Asset, bundledAssetsSet: Set<string> | undefined) {\n if (!bundledAssetsSet) {\n return true;\n }\n return (\n asset.fileHashes.filter((hash) => bundledAssetsSet.has(mapAssetHashToAssetString(asset, hash)))\n .length > 0\n );\n}\n\n/**\n * Computes a set of strings representing the assets to be bundled with an export, given an array of assets,\n * and a set of patterns to match\n * @param assets The asset array\n * @param assetPatternsToBeBundled An array of strings with glob patterns to match\n * @param projectRoot The project root\n * @returns A set of asset strings\n */\nfunction setOfAssetsToBeBundled(\n assets: Asset[],\n assetPatternsToBeBundled: string[],\n projectRoot: string\n): Set<string> | undefined {\n // Convert asset patterns to a list of asset strings that match them.\n // Assets strings are formatted as `asset_<hash>.<type>` and represent\n // the name that the file will have in the app bundle. The `asset_` prefix is\n // needed because android doesn't support assets that start with numbers.\n\n const fullPatterns: string[] = assetPatternsToBeBundled.map((p: string) =>\n path.join(projectRoot, p)\n );\n\n logPatterns(fullPatterns);\n const matches = picomatch(fullPatterns);\n const allBundledAssets = assets\n .map((asset) => {\n const shouldBundle = shouldBundleAsset(asset, matches);\n if (shouldBundle) {\n debug(`${shouldBundle ? 'Include' : 'Exclude'} asset ${asset.files?.[0]}`);\n return asset.fileHashes.map((hash) => mapAssetHashToAssetString(asset, hash));\n }\n return [];\n })\n .flat();\n\n // The assets returned by the RN packager has duplicates so make sure we\n // only bundle each once.\n return new Set(allBundledAssets);\n}\n\n/**\n * Resolves the assetBundlePatterns from the manifest and returns the set of assets to bundle.\n *\n * @modifies {exp}\n */\nexport function resolveAssetPatternsToBeBundled<T extends ExpoConfig>(\n projectRoot: string,\n exp: T,\n assets: Asset[]\n): Set<string> | undefined {\n const assetPatternsToBeBundledForConfig = assetPatternsToBeBundled(exp);\n if (!assetPatternsToBeBundledForConfig) {\n return undefined;\n }\n const bundledAssets = setOfAssetsToBeBundled(\n assets,\n assetPatternsToBeBundledForConfig,\n projectRoot\n );\n return bundledAssets;\n}\n\nfunction logPatterns(patterns: string[]) {\n // Only log the patterns in debug mode, if they aren't already defined in the app.json, then all files will be targeted.\n Log.log('\\nProcessing asset bundle patterns:');\n patterns.forEach((p) => Log.log('- ' + p));\n}\n\nfunction shouldBundleAsset(asset: Asset, matcher: picomatch.Matcher) {\n const file = asset.files?.[0];\n return !!('__packager_asset' in asset && asset.__packager_asset && file && matcher(file));\n}\n\nexport async function exportAssetsAsync(\n projectRoot: string,\n {\n exp,\n outputDir,\n bundles: { web, ...bundles },\n baseUrl,\n files = new Map(),\n hostedNative,\n }: {\n exp: ExpoConfig;\n bundles: Partial<Record<string, BundleOutput>>;\n outputDir: string;\n baseUrl: string;\n files?: ExportAssetMap;\n hostedNative?: boolean;\n }\n): Promise<{\n exp: ExpoConfig;\n assets: BundleAssetWithFileHashes[];\n embeddedHashSet: Set<string>;\n files: ExportAssetMap;\n}> {\n const hostedAssets: BundleAssetWithFileHashes[] = web ? [...web.assets] : [];\n\n // If the native assets should be hosted like web, then we can add them to the hosted assets to export.\n if (hostedNative) {\n hostedAssets.push(...Object.values(bundles).flatMap((bundle) => bundle!.assets ?? []));\n }\n\n if (hostedAssets.length) {\n // Save assets like a typical bundler, preserving the file paths on web.\n // TODO: Update React Native Web to support loading files from asset hashes.\n await persistMetroAssetsAsync(projectRoot, hostedAssets, {\n files,\n platform: 'web',\n outputDirectory: outputDir,\n baseUrl,\n });\n }\n\n if (hostedNative) {\n // Add google services file if it exists\n await resolveGoogleServicesFile(projectRoot, exp);\n return { exp, assets: [], embeddedHashSet: new Set(), files };\n }\n\n const assets: BundleAssetWithFileHashes[] = uniqBy(\n Object.values(bundles).flatMap((bundle) => bundle!.assets),\n (asset) => asset.hash\n );\n\n let bundledAssetsSet: Set<string> | undefined = undefined;\n let filteredAssets = assets;\n const embeddedHashSet: Set<string> = new Set();\n\n if (assets[0]?.fileHashes) {\n debug(`Assets = ${JSON.stringify(assets, null, 2)}`);\n // Updates the manifest to reflect additional asset bundling + configs\n // Get only asset strings for assets we will save\n bundledAssetsSet = resolveAssetPatternsToBeBundled(projectRoot, exp, assets);\n if (bundledAssetsSet) {\n debug(`Bundled assets = ${JSON.stringify([...bundledAssetsSet], null, 2)}`);\n // Filter asset objects to only ones that include assetPatternsToBeBundled matches\n filteredAssets = assets.filter((asset) => {\n const shouldInclude = assetShouldBeIncludedInExport(asset, bundledAssetsSet);\n if (!shouldInclude) {\n embeddedHashSet.add(asset.hash);\n }\n return shouldInclude;\n });\n debug(`Filtered assets count = ${filteredAssets.length}`);\n }\n\n const hashes = new Set<string>();\n\n // Add assets to copy.\n filteredAssets.forEach((asset) => {\n const assetId = getAssetIdForLogGrouping(projectRoot, asset);\n\n asset.files.forEach((fp: string, index: number) => {\n const hash = asset.fileHashes[index];\n if (hashes.has(hash)) return;\n hashes.add(hash);\n files.set(path.join('assets', hash), {\n originFilename: path.relative(projectRoot, fp),\n contents: fs.readFileSync(fp),\n assetId,\n });\n });\n });\n }\n\n // Add google services file if it exists\n await resolveGoogleServicesFile(projectRoot, exp);\n\n return { exp, assets, embeddedHashSet, files };\n}\n"],"names":["assetPatternsToBeBundled","exportAssetsAsync","resolveAssetPatternsToBeBundled","debug","require","mapAssetHashToAssetString","asset","hash","type","exp","updates","length","extra","undefined","assetShouldBeIncludedInExport","bundledAssetsSet","fileHashes","filter","has","setOfAssetsToBeBundled","assets","projectRoot","fullPatterns","map","p","path","join","logPatterns","matches","picomatch","allBundledAssets","shouldBundle","shouldBundleAsset","files","flat","Set","assetPatternsToBeBundledForConfig","bundledAssets","patterns","Log","log","forEach","matcher","file","__packager_asset","outputDir","bundles","web","baseUrl","Map","hostedNative","hostedAssets","push","Object","values","flatMap","bundle","persistMetroAssetsAsync","platform","outputDirectory","resolveGoogleServicesFile","embeddedHashSet","uniqBy","filteredAssets","JSON","stringify","shouldInclude","add","hashes","assetId","getAssetIdForLogGrouping","fp","index","set","originFilename","relative","contents","fs","readFileSync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/export/exportAssets.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config';\nimport fs from 'fs';\nimport path from 'path';\nimport picomatch from 'picomatch';\n\nimport { getAssetIdForLogGrouping, persistMetroAssetsAsync } from './persistMetroAssets';\nimport type { Asset, BundleAssetWithFileHashes, BundleOutput, ExportAssetMap } from './saveAssets';\nimport * as Log from '../log';\nimport { resolveGoogleServicesFile } from '../start/server/middleware/resolveAssets';\nimport { uniqBy } from '../utils/array';\n\nconst debug = require('debug')('expo:export:exportAssets') as typeof console.log;\n\nfunction mapAssetHashToAssetString(asset: Asset, hash: string) {\n return 'asset_' + hash + ('type' in asset && asset.type ? '.' + asset.type : '');\n}\n\nexport function assetPatternsToBeBundled(\n exp: ExpoConfig & { extra?: { updates?: { assetPatternsToBeBundled?: string[] } } }\n): string[] | undefined {\n // new location for this key\n if (exp.updates?.assetPatternsToBeBundled?.length) {\n return exp.updates.assetPatternsToBeBundled;\n }\n\n // old, untyped location for this key. we may want to change this to throw in a few SDK versions (deprecated as of SDK 52).\n if (exp.extra?.updates?.assetPatternsToBeBundled?.length) {\n return exp.extra.updates.assetPatternsToBeBundled;\n }\n\n return undefined;\n}\n\n/**\n * Given an asset and a set of strings representing the assets to be bundled, returns true if\n * the asset is part of the set to be bundled.\n * @param asset Asset object\n * @param bundledAssetsSet Set of strings\n * @returns true if the asset should be bundled\n */\nfunction assetShouldBeIncludedInExport(asset: Asset, bundledAssetsSet: Set<string> | undefined) {\n if (!bundledAssetsSet) {\n return true;\n }\n return (\n asset.fileHashes.filter((hash) => bundledAssetsSet.has(mapAssetHashToAssetString(asset, hash)))\n .length > 0\n );\n}\n\n/**\n * Computes a set of strings representing the assets to be bundled with an export, given an array of assets,\n * and a set of patterns to match\n * @param assets The asset array\n * @param assetPatternsToBeBundled An array of strings with glob patterns to match\n * @param projectRoot The project root\n * @returns A set of asset strings\n */\nfunction setOfAssetsToBeBundled(\n assets: Asset[],\n assetPatternsToBeBundled: string[],\n projectRoot: string\n): Set<string> | undefined {\n // Convert asset patterns to a list of asset strings that match them.\n // Assets strings are formatted as `asset_<hash>.<type>` and represent\n // the name that the file will have in the app bundle. The `asset_` prefix is\n // needed because android doesn't support assets that start with numbers.\n\n const fullPatterns: string[] = assetPatternsToBeBundled.map((p: string) =>\n path.join(projectRoot, p)\n );\n\n logPatterns(fullPatterns);\n const matches = picomatch(fullPatterns);\n const allBundledAssets = assets\n .map((asset) => {\n const shouldBundle = shouldBundleAsset(asset, matches);\n if (shouldBundle) {\n debug(`${shouldBundle ? 'Include' : 'Exclude'} asset ${asset.files?.[0]}`);\n return asset.fileHashes.map((hash) => mapAssetHashToAssetString(asset, hash));\n }\n return [];\n })\n .flat();\n\n // The assets returned by the RN packager has duplicates so make sure we\n // only bundle each once.\n return new Set(allBundledAssets);\n}\n\n/**\n * Resolves the assetBundlePatterns from the manifest and returns the set of assets to bundle.\n *\n * @modifies {exp}\n */\nexport function resolveAssetPatternsToBeBundled<T extends ExpoConfig>(\n projectRoot: string,\n exp: T,\n assets: Asset[]\n): Set<string> | undefined {\n const assetPatternsToBeBundledForConfig = assetPatternsToBeBundled(exp);\n if (!assetPatternsToBeBundledForConfig) {\n return undefined;\n }\n const bundledAssets = setOfAssetsToBeBundled(\n assets,\n assetPatternsToBeBundledForConfig,\n projectRoot\n );\n return bundledAssets;\n}\n\nfunction logPatterns(patterns: string[]) {\n // Only log the patterns in debug mode, if they aren't already defined in the app.json, then all files will be targeted.\n Log.log('\\nProcessing asset bundle patterns:');\n patterns.forEach((p) => Log.log('- ' + p));\n}\n\nfunction shouldBundleAsset(asset: Asset, matcher: picomatch.Matcher) {\n const file = asset.files?.[0];\n return !!('__packager_asset' in asset && asset.__packager_asset && file && matcher(file));\n}\n\nexport async function exportAssetsAsync(\n projectRoot: string,\n {\n exp,\n outputDir,\n bundles: { web, ...bundles },\n baseUrl,\n files = new Map(),\n hostedNative,\n }: {\n exp: ExpoConfig;\n bundles: Partial<Record<string, BundleOutput>>;\n outputDir: string;\n baseUrl: string;\n files?: ExportAssetMap;\n hostedNative?: boolean;\n }\n): Promise<{\n exp: ExpoConfig;\n assets: BundleAssetWithFileHashes[];\n embeddedHashSet: Set<string>;\n files: ExportAssetMap;\n}> {\n const hostedAssets: BundleAssetWithFileHashes[] = web ? [...web.assets] : [];\n\n // If the native assets should be hosted like web, then we can add them to the hosted assets to export.\n if (hostedNative) {\n hostedAssets.push(...Object.values(bundles).flatMap((bundle) => bundle!.assets ?? []));\n }\n\n if (hostedAssets.length) {\n // Save assets like a typical bundler, preserving the file paths on web.\n // TODO: Update React Native Web to support loading files from asset hashes.\n await persistMetroAssetsAsync(projectRoot, hostedAssets, {\n files,\n platform: 'web',\n outputDirectory: outputDir,\n baseUrl,\n });\n }\n\n if (hostedNative) {\n // Add google services file if it exists\n await resolveGoogleServicesFile(projectRoot, exp);\n return { exp, assets: [], embeddedHashSet: new Set(), files };\n }\n\n const assets: BundleAssetWithFileHashes[] = uniqBy(\n Object.values(bundles).flatMap((bundle) => bundle!.assets),\n (asset) => asset.hash\n );\n\n let bundledAssetsSet: Set<string> | undefined = undefined;\n let filteredAssets = assets;\n const embeddedHashSet: Set<string> = new Set();\n\n if (assets[0]?.fileHashes) {\n debug(`Assets = ${JSON.stringify(assets, null, 2)}`);\n // Updates the manifest to reflect additional asset bundling + configs\n // Get only asset strings for assets we will save\n bundledAssetsSet = resolveAssetPatternsToBeBundled(projectRoot, exp, assets);\n if (bundledAssetsSet) {\n debug(`Bundled assets = ${JSON.stringify([...bundledAssetsSet], null, 2)}`);\n // Filter asset objects to only ones that include assetPatternsToBeBundled matches\n filteredAssets = assets.filter((asset) => {\n const shouldInclude = assetShouldBeIncludedInExport(asset, bundledAssetsSet);\n if (!shouldInclude) {\n embeddedHashSet.add(asset.hash);\n }\n return shouldInclude;\n });\n debug(`Filtered assets count = ${filteredAssets.length}`);\n }\n\n const hashes = new Set<string>();\n\n // Add assets to copy.\n filteredAssets.forEach((asset) => {\n const assetId = getAssetIdForLogGrouping(projectRoot, asset);\n\n asset.files.forEach((fp: string, index: number) => {\n const hash = asset.fileHashes[index];\n if (!hash || hashes.has(hash)) return;\n hashes.add(hash);\n files.set(path.join('assets', hash), {\n originFilename: path.relative(projectRoot, fp),\n contents: fs.readFileSync(fp),\n assetId,\n });\n });\n });\n }\n\n // Add google services file if it exists\n await resolveGoogleServicesFile(projectRoot, exp);\n\n return { exp, assets, embeddedHashSet, files };\n}\n"],"names":["assetPatternsToBeBundled","exportAssetsAsync","resolveAssetPatternsToBeBundled","debug","require","mapAssetHashToAssetString","asset","hash","type","exp","updates","length","extra","undefined","assetShouldBeIncludedInExport","bundledAssetsSet","fileHashes","filter","has","setOfAssetsToBeBundled","assets","projectRoot","fullPatterns","map","p","path","join","logPatterns","matches","picomatch","allBundledAssets","shouldBundle","shouldBundleAsset","files","flat","Set","assetPatternsToBeBundledForConfig","bundledAssets","patterns","Log","log","forEach","matcher","file","__packager_asset","outputDir","bundles","web","baseUrl","Map","hostedNative","hostedAssets","push","Object","values","flatMap","bundle","persistMetroAssetsAsync","platform","outputDirectory","resolveGoogleServicesFile","embeddedHashSet","uniqBy","filteredAssets","JSON","stringify","shouldInclude","add","hashes","assetId","getAssetIdForLogGrouping","fp","index","set","originFilename","relative","contents","fs","readFileSync"],"mappings":";;;;;;;;;;;QAiBgBA;eAAAA;;QA0GMC;eAAAA;;QA5BNC;eAAAA;;;;gEA9FD;;;;;;;gEACE;;;;;;;gEACK;;;;;;oCAE4C;6DAE7C;+BACqB;uBACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEvB,MAAMC,QAAQC,QAAQ,SAAS;AAE/B,SAASC,0BAA0BC,KAAY,EAAEC,IAAY;IAC3D,OAAO,WAAWA,OAAQ,CAAA,UAAUD,SAASA,MAAME,IAAI,GAAG,MAAMF,MAAME,IAAI,GAAG,EAAC;AAChF;AAEO,SAASR,yBACdS,GAAmF;QAG/EA,uCAAAA,cAKAA,6CAAAA,oBAAAA;IANJ,4BAA4B;IAC5B,KAAIA,eAAAA,IAAIC,OAAO,sBAAXD,wCAAAA,aAAaT,wBAAwB,qBAArCS,sCAAuCE,MAAM,EAAE;QACjD,OAAOF,IAAIC,OAAO,CAACV,wBAAwB;IAC7C;IAEA,2HAA2H;IAC3H,KAAIS,aAAAA,IAAIG,KAAK,sBAATH,qBAAAA,WAAWC,OAAO,sBAAlBD,8CAAAA,mBAAoBT,wBAAwB,qBAA5CS,4CAA8CE,MAAM,EAAE;QACxD,OAAOF,IAAIG,KAAK,CAACF,OAAO,CAACV,wBAAwB;IACnD;IAEA,OAAOa;AACT;AAEA;;;;;;CAMC,GACD,SAASC,8BAA8BR,KAAY,EAAES,gBAAyC;IAC5F,IAAI,CAACA,kBAAkB;QACrB,OAAO;IACT;IACA,OACET,MAAMU,UAAU,CAACC,MAAM,CAAC,CAACV,OAASQ,iBAAiBG,GAAG,CAACb,0BAA0BC,OAAOC,QACrFI,MAAM,GAAG;AAEhB;AAEA;;;;;;;CAOC,GACD,SAASQ,uBACPC,MAAe,EACfpB,wBAAkC,EAClCqB,WAAmB;IAEnB,qEAAqE;IACrE,sEAAsE;IACtE,6EAA6E;IAC7E,yEAAyE;IAEzE,MAAMC,eAAyBtB,yBAAyBuB,GAAG,CAAC,CAACC,IAC3DC,eAAI,CAACC,IAAI,CAACL,aAAaG;IAGzBG,YAAYL;IACZ,MAAMM,UAAUC,IAAAA,oBAAS,EAACP;IAC1B,MAAMQ,mBAAmBV,OACtBG,GAAG,CAAC,CAACjB;QACJ,MAAMyB,eAAeC,kBAAkB1B,OAAOsB;QAC9C,IAAIG,cAAc;gBACuCzB;YAAvDH,MAAM,GAAG4B,eAAe,YAAY,UAAU,OAAO,GAAEzB,eAAAA,MAAM2B,KAAK,qBAAX3B,YAAa,CAAC,EAAE,EAAE;YACzE,OAAOA,MAAMU,UAAU,CAACO,GAAG,CAAC,CAAChB,OAASF,0BAA0BC,OAAOC;QACzE;QACA,OAAO,EAAE;IACX,GACC2B,IAAI;IAEP,wEAAwE;IACxE,yBAAyB;IACzB,OAAO,IAAIC,IAAIL;AACjB;AAOO,SAAS5B,gCACdmB,WAAmB,EACnBZ,GAAM,EACNW,MAAe;IAEf,MAAMgB,oCAAoCpC,yBAAyBS;IACnE,IAAI,CAAC2B,mCAAmC;QACtC,OAAOvB;IACT;IACA,MAAMwB,gBAAgBlB,uBACpBC,QACAgB,mCACAf;IAEF,OAAOgB;AACT;AAEA,SAASV,YAAYW,QAAkB;IACrC,wHAAwH;IACxHC,KAAIC,GAAG,CAAC;IACRF,SAASG,OAAO,CAAC,CAACjB,IAAMe,KAAIC,GAAG,CAAC,OAAOhB;AACzC;AAEA,SAASQ,kBAAkB1B,KAAY,EAAEoC,OAA0B;QACpDpC;IAAb,MAAMqC,QAAOrC,eAAAA,MAAM2B,KAAK,qBAAX3B,YAAa,CAAC,EAAE;IAC7B,OAAO,CAAC,CAAE,CAAA,sBAAsBA,SAASA,MAAMsC,gBAAgB,IAAID,QAAQD,QAAQC,KAAI;AACzF;AAEO,eAAe1C,kBACpBoB,WAAmB,EACnB,EACEZ,GAAG,EACHoC,SAAS,EACTC,SAAS,EAAEC,GAAG,EAAE,GAAGD,SAAS,EAC5BE,OAAO,EACPf,QAAQ,IAAIgB,KAAK,EACjBC,YAAY,EAQb;QAwCG9B;IAjCJ,MAAM+B,eAA4CJ,MAAM;WAAIA,IAAI3B,MAAM;KAAC,GAAG,EAAE;IAE5E,uGAAuG;IACvG,IAAI8B,cAAc;QAChBC,aAAaC,IAAI,IAAIC,OAAOC,MAAM,CAACR,SAASS,OAAO,CAAC,CAACC,SAAWA,OAAQpC,MAAM,IAAI,EAAE;IACtF;IAEA,IAAI+B,aAAaxC,MAAM,EAAE;QACvB,wEAAwE;QACxE,4EAA4E;QAC5E,MAAM8C,IAAAA,2CAAuB,EAACpC,aAAa8B,cAAc;YACvDlB;YACAyB,UAAU;YACVC,iBAAiBd;YACjBG;QACF;IACF;IAEA,IAAIE,cAAc;QAChB,wCAAwC;QACxC,MAAMU,IAAAA,wCAAyB,EAACvC,aAAaZ;QAC7C,OAAO;YAAEA;YAAKW,QAAQ,EAAE;YAAEyC,iBAAiB,IAAI1B;YAAOF;QAAM;IAC9D;IAEA,MAAMb,SAAsC0C,IAAAA,aAAM,EAChDT,OAAOC,MAAM,CAACR,SAASS,OAAO,CAAC,CAACC,SAAWA,OAAQpC,MAAM,GACzD,CAACd,QAAUA,MAAMC,IAAI;IAGvB,IAAIQ,mBAA4CF;IAChD,IAAIkD,iBAAiB3C;IACrB,MAAMyC,kBAA+B,IAAI1B;IAEzC,KAAIf,WAAAA,MAAM,CAAC,EAAE,qBAATA,SAAWJ,UAAU,EAAE;QACzBb,MAAM,CAAC,SAAS,EAAE6D,KAAKC,SAAS,CAAC7C,QAAQ,MAAM,IAAI;QACnD,sEAAsE;QACtE,iDAAiD;QACjDL,mBAAmBb,gCAAgCmB,aAAaZ,KAAKW;QACrE,IAAIL,kBAAkB;YACpBZ,MAAM,CAAC,iBAAiB,EAAE6D,KAAKC,SAAS,CAAC;mBAAIlD;aAAiB,EAAE,MAAM,IAAI;YAC1E,kFAAkF;YAClFgD,iBAAiB3C,OAAOH,MAAM,CAAC,CAACX;gBAC9B,MAAM4D,gBAAgBpD,8BAA8BR,OAAOS;gBAC3D,IAAI,CAACmD,eAAe;oBAClBL,gBAAgBM,GAAG,CAAC7D,MAAMC,IAAI;gBAChC;gBACA,OAAO2D;YACT;YACA/D,MAAM,CAAC,wBAAwB,EAAE4D,eAAepD,MAAM,EAAE;QAC1D;QAEA,MAAMyD,SAAS,IAAIjC;QAEnB,sBAAsB;QACtB4B,eAAetB,OAAO,CAAC,CAACnC;YACtB,MAAM+D,UAAUC,IAAAA,4CAAwB,EAACjD,aAAaf;YAEtDA,MAAM2B,KAAK,CAACQ,OAAO,CAAC,CAAC8B,IAAYC;gBAC/B,MAAMjE,OAAOD,MAAMU,UAAU,CAACwD,MAAM;gBACpC,IAAI,CAACjE,QAAQ6D,OAAOlD,GAAG,CAACX,OAAO;gBAC/B6D,OAAOD,GAAG,CAAC5D;gBACX0B,MAAMwC,GAAG,CAAChD,eAAI,CAACC,IAAI,CAAC,UAAUnB,OAAO;oBACnCmE,gBAAgBjD,eAAI,CAACkD,QAAQ,CAACtD,aAAakD;oBAC3CK,UAAUC,aAAE,CAACC,YAAY,CAACP;oBAC1BF;gBACF;YACF;QACF;IACF;IAEA,wCAAwC;IACxC,MAAMT,IAAAA,wCAAyB,EAACvC,aAAaZ;IAE7C,OAAO;QAAEA;QAAKW;QAAQyC;QAAiB5B;IAAM;AAC/C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/exportAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport path from 'path';\n\nimport { exportAppAsync } from './exportApp';\nimport { Options } from './resolveOptions';\nimport * as Log from '../log';\nimport { waitUntilAtlasExportIsReadyAsync } from '../start/server/metro/debugging/attachAtlas';\nimport { FileNotifier } from '../utils/FileNotifier';\nimport { ensureDirectoryAsync, removeAsync } from '../utils/dir';\nimport { CommandError } from '../utils/errors';\nimport { ensureProcessExitsAfterDelay } from '../utils/exit';\n\nexport async function exportAsync(projectRoot: string, options: Options) {\n // Ensure the output directory is created\n const outputPath = path.resolve(projectRoot, options.outputDir);\n\n if (outputPath === projectRoot) {\n throw new CommandError('--output-dir cannot be the same as the project directory.');\n } else if (projectRoot.startsWith(outputPath)) {\n throw new CommandError(`--output-dir cannot be a parent directory of the project directory.`);\n }\n // Delete the output directory if it exists\n await removeAsync(outputPath);\n // Create the output directory\n await ensureDirectoryAsync(outputPath);\n\n // Export the app\n await exportAppAsync(projectRoot, options);\n\n // Stop any file watchers to prevent the CLI from hanging.\n FileNotifier.stopAll();\n // Wait until Atlas is ready, when enabled\n // NOTE(cedric): this is a workaround, remove when `process.exit` is removed\n await waitUntilAtlasExportIsReadyAsync(projectRoot);\n\n // Final notes\n Log.log(chalk.greenBright`Exported: ${options.outputDir}`);\n\n // Exit the process to stop any hanging processes from reading the app.config.js or server rendering.\n ensureProcessExitsAfterDelay();\n}\n"],"names":["exportAsync","projectRoot","options","outputPath","path","resolve","outputDir","CommandError","startsWith","removeAsync","ensureDirectoryAsync","exportAppAsync","FileNotifier","stopAll","waitUntilAtlasExportIsReadyAsync","Log","log","chalk","greenBright","ensureProcessExitsAfterDelay"],"mappings":";;;;+BAYsBA;;;eAAAA;;;;gEAZJ;;;;;;;gEACD;;;;;;2BAEc;6DAEV;6BAC4B;8BACpB;qBACqB;wBACrB;sBACgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtC,eAAeA,YAAYC,WAAmB,EAAEC,OAAgB;IACrE,yCAAyC;IACzC,MAAMC,aAAaC,eAAI,CAACC,OAAO,CAACJ,aAAaC,QAAQI,SAAS;IAE9D,IAAIH,eAAeF,aAAa;QAC9B,MAAM,IAAIM,oBAAY,CAAC;IACzB,OAAO,IAAIN,YAAYO,UAAU,CAACL,aAAa;QAC7C,MAAM,IAAII,oBAAY,CAAC,CAAC,mEAAmE,CAAC;IAC9F;IACA,2CAA2C;IAC3C,MAAME,IAAAA,gBAAW,EAACN;IAClB,8BAA8B;IAC9B,MAAMO,IAAAA,yBAAoB,EAACP;IAE3B,iBAAiB;IACjB,MAAMQ,IAAAA,yBAAc,EAACV,aAAaC;IAElC,0DAA0D;IAC1DU,0BAAY,CAACC,OAAO;IACpB,0CAA0C;IAC1C,4EAA4E;IAC5E,MAAMC,IAAAA,6CAAgC,EAACb;IAEvC,cAAc;IACdc,KAAIC,GAAG,CAACC,gBAAK,CAACC,WAAW,CAAC,UAAU,EAAEhB,QAAQI,SAAS,CAAC,CAAC;IAEzD,qGAAqG;IACrGa,IAAAA,kCAA4B;AAC9B"}
1
+ {"version":3,"sources":["../../../src/export/exportAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport path from 'path';\n\nimport { exportAppAsync } from './exportApp';\nimport type { Options } from './resolveOptions';\nimport * as Log from '../log';\nimport { waitUntilAtlasExportIsReadyAsync } from '../start/server/metro/debugging/attachAtlas';\nimport { FileNotifier } from '../utils/FileNotifier';\nimport { ensureDirectoryAsync, removeAsync } from '../utils/dir';\nimport { CommandError } from '../utils/errors';\nimport { ensureProcessExitsAfterDelay } from '../utils/exit';\n\nexport async function exportAsync(projectRoot: string, options: Options) {\n // Ensure the output directory is created\n const outputPath = path.resolve(projectRoot, options.outputDir);\n\n if (outputPath === projectRoot) {\n throw new CommandError('--output-dir cannot be the same as the project directory.');\n } else if (projectRoot.startsWith(outputPath)) {\n throw new CommandError(`--output-dir cannot be a parent directory of the project directory.`);\n }\n // Delete the output directory if it exists\n await removeAsync(outputPath);\n // Create the output directory\n await ensureDirectoryAsync(outputPath);\n\n // Export the app\n await exportAppAsync(projectRoot, options);\n\n // Stop any file watchers to prevent the CLI from hanging.\n FileNotifier.stopAll();\n // Wait until Atlas is ready, when enabled\n // NOTE(cedric): this is a workaround, remove when `process.exit` is removed\n await waitUntilAtlasExportIsReadyAsync(projectRoot);\n\n // Final notes\n Log.log(chalk.greenBright`Exported: ${options.outputDir}`);\n\n // Exit the process to stop any hanging processes from reading the app.config.js or server rendering.\n ensureProcessExitsAfterDelay();\n}\n"],"names":["exportAsync","projectRoot","options","outputPath","path","resolve","outputDir","CommandError","startsWith","removeAsync","ensureDirectoryAsync","exportAppAsync","FileNotifier","stopAll","waitUntilAtlasExportIsReadyAsync","Log","log","chalk","greenBright","ensureProcessExitsAfterDelay"],"mappings":";;;;+BAYsBA;;;eAAAA;;;;gEAZJ;;;;;;;gEACD;;;;;;2BAEc;6DAEV;6BAC4B;8BACpB;qBACqB;wBACrB;sBACgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtC,eAAeA,YAAYC,WAAmB,EAAEC,OAAgB;IACrE,yCAAyC;IACzC,MAAMC,aAAaC,eAAI,CAACC,OAAO,CAACJ,aAAaC,QAAQI,SAAS;IAE9D,IAAIH,eAAeF,aAAa;QAC9B,MAAM,IAAIM,oBAAY,CAAC;IACzB,OAAO,IAAIN,YAAYO,UAAU,CAACL,aAAa;QAC7C,MAAM,IAAII,oBAAY,CAAC,CAAC,mEAAmE,CAAC;IAC9F;IACA,2CAA2C;IAC3C,MAAME,IAAAA,gBAAW,EAACN;IAClB,8BAA8B;IAC9B,MAAMO,IAAAA,yBAAoB,EAACP;IAE3B,iBAAiB;IACjB,MAAMQ,IAAAA,yBAAc,EAACV,aAAaC;IAElC,0DAA0D;IAC1DU,0BAAY,CAACC,OAAO;IACpB,0CAA0C;IAC1C,4EAA4E;IAC5E,MAAMC,IAAAA,6CAAgC,EAACb;IAEvC,cAAc;IACdc,KAAIC,GAAG,CAACC,gBAAK,CAACC,WAAW,CAAC,UAAU,EAAEhB,QAAQI,SAAS,CAAC,CAAC;IAEzD,qGAAqG;IACrGa,IAAAA,kCAA4B;AAC9B"}
@@ -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
- addDomBundleToMetadataAsync: function() {
12
+ get addDomBundleToMetadataAsync () {
13
13
  return addDomBundleToMetadataAsync;
14
14
  },
15
- exportDomComponentAsync: function() {
15
+ get exportDomComponentAsync () {
16
16
  return exportDomComponentAsync;
17
17
  },
18
- transformDomEntryForMd5Filename: function() {
18
+ get transformDomEntryForMd5Filename () {
19
19
  return transformDomEntryForMd5Filename;
20
20
  },
21
- transformNativeBundleForMd5Filename: function() {
21
+ get transformNativeBundleForMd5Filename () {
22
22
  return transformNativeBundleForMd5Filename;
23
23
  }
24
24
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/exportDomComponents.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config';\nimport { convertEntryPointToRelative } from '@expo/config/paths';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport url from 'url';\n\nimport { type PlatformMetadata } from './createMetadataJson';\nimport { type BundleOutput, type ExportAssetMap, getFilesFromSerialAssets } from './saveAssets';\nimport { type MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport {\n getDomComponentHtml,\n DOM_COMPONENTS_BUNDLE_DIR,\n} from '../start/server/middleware/DomComponentsMiddleware';\nimport { env } from '../utils/env';\nimport { toPosixPath } from '../utils/filePath';\n\nconst debug = require('debug')('expo:export:exportDomComponents') as typeof console.log;\n\n// TODO(EvanBacon): determine how to support DOM Components with hosting.\nexport async function exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps,\n exp,\n files,\n useMd5Filename = false,\n}: {\n filePath: string;\n projectRoot: string;\n dev: boolean;\n devServer: MetroBundlerDevServer;\n isHermes: boolean;\n includeSourceMaps: boolean;\n exp: ExpoConfig;\n files: ExportAssetMap;\n useMd5Filename?: boolean;\n}): Promise<{\n bundle: BundleOutput;\n htmlOutputName: string;\n}> {\n const virtualEntry = resolveFrom(projectRoot, 'expo/dom/entry.js');\n debug('Bundle DOM Component:', filePath);\n // MUST MATCH THE BABEL PLUGIN!\n const hash = crypto.createHash('md5').update(filePath).digest('hex');\n const outputName = `${DOM_COMPONENTS_BUNDLE_DIR}/${hash}.html`;\n const generatedEntryPath = path.resolve(\n filePath.startsWith('file://') ? url.fileURLToPath(filePath) : filePath\n );\n const baseUrl = `/${DOM_COMPONENTS_BUNDLE_DIR}`;\n // The relative import path will be used like URI so it must be POSIX.\n const relativeImport =\n './' + toPosixPath(path.relative(path.dirname(virtualEntry), generatedEntryPath));\n // Run metro bundler and create the JS bundles/source maps.\n const bundle = await devServer.legacySinglePageExportBundleAsync({\n platform: 'web',\n domRoot: encodeURI(relativeImport),\n splitChunks: !env.EXPO_NO_BUNDLE_SPLITTING,\n mainModuleName: convertEntryPointToRelative(projectRoot, virtualEntry),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: includeSourceMaps,\n bytecode: false,\n reactCompiler: !!exp.experiments?.reactCompiler,\n baseUrl: './',\n useMd5Filename,\n // Minify may be false because it's skipped on native when Hermes is enabled, default to true.\n minify: true,\n });\n\n if (useMd5Filename) {\n for (const artifact of bundle.artifacts) {\n const md5 = crypto.createHash('md5').update(artifact.source).digest('hex');\n artifact.filename = `${md5}.${artifact.type}`;\n }\n }\n\n const html = await serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: getDomComponentHtml(),\n baseUrl: './',\n });\n\n const serialAssets = bundle.artifacts.map((a) => {\n return {\n ...a,\n filename: path.join(baseUrl, a.filename),\n };\n });\n\n getFilesFromSerialAssets(serialAssets, {\n includeSourceMaps,\n files,\n platform: 'web',\n });\n\n files.set(outputName, {\n contents: html,\n });\n\n return {\n bundle,\n htmlOutputName: outputName,\n };\n}\n\n//#region `npx export` for updates\n\n/**\n * Add the DOM component bundle to the metadata for updates.\n */\nexport function addDomBundleToMetadataAsync(bundle: BundleOutput): PlatformMetadata['assets'] {\n const assetsMetadata: PlatformMetadata['assets'] = [];\n for (const artifact of bundle.artifacts) {\n if (artifact.type === 'map') {\n continue;\n }\n assetsMetadata.push({\n path: `${DOM_COMPONENTS_BUNDLE_DIR}/${artifact.filename}`,\n ext: artifact.type,\n });\n }\n return assetsMetadata;\n}\n\n/**\n * Transform the DOM component entry (*.html) to use MD5 filename by its content.\n */\nexport function transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n}: {\n files: ExportAssetMap;\n htmlOutputName: string;\n}): PlatformMetadata['assets'] {\n const htmlContent = files.get(htmlOutputName);\n assert(htmlContent);\n const htmlMd5 = crypto.createHash('md5').update(htmlContent.contents.toString()).digest('hex');\n const htmlMd5Filename = `${DOM_COMPONENTS_BUNDLE_DIR}/${htmlMd5}.html`;\n files.set(htmlMd5Filename, htmlContent);\n files.delete(htmlOutputName);\n return [\n {\n path: htmlMd5Filename,\n ext: 'html',\n },\n ];\n}\n\n/**\n * Post-transform the native bundle to use MD5 filename based on DOM component entry content.\n */\nexport function transformNativeBundleForMd5Filename({\n domComponentReference,\n nativeBundle,\n files,\n htmlOutputName,\n}: {\n domComponentReference: string;\n nativeBundle: BundleOutput;\n files: ExportAssetMap;\n htmlOutputName: string;\n}) {\n const htmlContent = files.get(htmlOutputName);\n assert(htmlContent);\n const htmlMd5 = crypto.createHash('md5').update(htmlContent.contents.toString()).digest('hex');\n const hash = crypto.createHash('md5').update(domComponentReference).digest('hex');\n for (const artifact of nativeBundle.artifacts) {\n if (artifact.type !== 'js') {\n continue;\n }\n const assetEntity = files.get(artifact.filename);\n assert(assetEntity);\n if (Buffer.isBuffer(assetEntity.contents)) {\n const searchBuffer = Buffer.from(`${hash}.html`, 'utf8');\n const replaceBuffer = Buffer.from(`${htmlMd5}.html`, 'utf8');\n assert(searchBuffer.length === replaceBuffer.length);\n let index = assetEntity.contents.indexOf(searchBuffer, 0);\n while (index !== -1) {\n replaceBuffer.copy(assetEntity.contents, index);\n index = assetEntity.contents.indexOf(searchBuffer, index + searchBuffer.length);\n }\n } else {\n const search = `${hash}.html`;\n const replace = `${htmlMd5}.html`;\n assert(search.length === replace.length);\n assetEntity.contents = assetEntity.contents.toString().replaceAll(search, replace);\n }\n }\n}\n\n//#endregion `npx export` for updates\n"],"names":["addDomBundleToMetadataAsync","exportDomComponentAsync","transformDomEntryForMd5Filename","transformNativeBundleForMd5Filename","debug","require","filePath","projectRoot","dev","devServer","isHermes","includeSourceMaps","exp","files","useMd5Filename","virtualEntry","resolveFrom","hash","crypto","createHash","update","digest","outputName","DOM_COMPONENTS_BUNDLE_DIR","generatedEntryPath","path","resolve","startsWith","url","fileURLToPath","baseUrl","relativeImport","toPosixPath","relative","dirname","bundle","legacySinglePageExportBundleAsync","platform","domRoot","encodeURI","splitChunks","env","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","convertEntryPointToRelative","mode","engine","undefined","serializerIncludeMaps","bytecode","reactCompiler","experiments","minify","artifact","artifacts","md5","source","filename","type","html","serializeHtmlWithAssets","isExporting","resources","template","getDomComponentHtml","serialAssets","map","a","join","getFilesFromSerialAssets","set","contents","htmlOutputName","assetsMetadata","push","ext","htmlContent","get","assert","htmlMd5","toString","htmlMd5Filename","delete","domComponentReference","nativeBundle","assetEntity","Buffer","isBuffer","searchBuffer","from","replaceBuffer","length","index","indexOf","copy","search","replace","replaceAll"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/export/exportDomComponents.ts"],"sourcesContent":["import type { ExpoConfig } from '@expo/config';\nimport { convertEntryPointToRelative } from '@expo/config/paths';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport url from 'url';\n\nimport type { PlatformMetadata } from './createMetadataJson';\nimport { type BundleOutput, type ExportAssetMap, getFilesFromSerialAssets } from './saveAssets';\nimport type { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport {\n getDomComponentHtml,\n DOM_COMPONENTS_BUNDLE_DIR,\n} from '../start/server/middleware/DomComponentsMiddleware';\nimport { env } from '../utils/env';\nimport { toPosixPath } from '../utils/filePath';\n\nconst debug = require('debug')('expo:export:exportDomComponents') as typeof console.log;\n\n// TODO(EvanBacon): determine how to support DOM Components with hosting.\nexport async function exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps,\n exp,\n files,\n useMd5Filename = false,\n}: {\n filePath: string;\n projectRoot: string;\n dev: boolean;\n devServer: MetroBundlerDevServer;\n isHermes: boolean;\n includeSourceMaps: boolean;\n exp: ExpoConfig;\n files: ExportAssetMap;\n useMd5Filename?: boolean;\n}): Promise<{\n bundle: BundleOutput;\n htmlOutputName: string;\n}> {\n const virtualEntry = resolveFrom(projectRoot, 'expo/dom/entry.js');\n debug('Bundle DOM Component:', filePath);\n // MUST MATCH THE BABEL PLUGIN!\n const hash = crypto.createHash('md5').update(filePath).digest('hex');\n const outputName = `${DOM_COMPONENTS_BUNDLE_DIR}/${hash}.html`;\n const generatedEntryPath = path.resolve(\n filePath.startsWith('file://') ? url.fileURLToPath(filePath) : filePath\n );\n const baseUrl = `/${DOM_COMPONENTS_BUNDLE_DIR}`;\n // The relative import path will be used like URI so it must be POSIX.\n const relativeImport =\n './' + toPosixPath(path.relative(path.dirname(virtualEntry), generatedEntryPath));\n // Run metro bundler and create the JS bundles/source maps.\n const bundle = await devServer.legacySinglePageExportBundleAsync({\n platform: 'web',\n domRoot: encodeURI(relativeImport),\n splitChunks: !env.EXPO_NO_BUNDLE_SPLITTING,\n mainModuleName: convertEntryPointToRelative(projectRoot, virtualEntry),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: includeSourceMaps,\n bytecode: false,\n reactCompiler: !!exp.experiments?.reactCompiler,\n baseUrl: './',\n useMd5Filename,\n // Minify may be false because it's skipped on native when Hermes is enabled, default to true.\n minify: true,\n });\n\n if (useMd5Filename) {\n for (const artifact of bundle.artifacts) {\n const md5 = crypto.createHash('md5').update(artifact.source).digest('hex');\n artifact.filename = `${md5}.${artifact.type}`;\n }\n }\n\n const html = await serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: getDomComponentHtml(),\n baseUrl: './',\n });\n\n const serialAssets = bundle.artifacts.map((a) => {\n return {\n ...a,\n filename: path.join(baseUrl, a.filename),\n };\n });\n\n getFilesFromSerialAssets(serialAssets, {\n includeSourceMaps,\n files,\n platform: 'web',\n });\n\n files.set(outputName, {\n contents: html,\n });\n\n return {\n bundle,\n htmlOutputName: outputName,\n };\n}\n\n//#region `npx export` for updates\n\n/**\n * Add the DOM component bundle to the metadata for updates.\n */\nexport function addDomBundleToMetadataAsync(bundle: BundleOutput): PlatformMetadata['assets'] {\n const assetsMetadata: PlatformMetadata['assets'] = [];\n for (const artifact of bundle.artifacts) {\n if (artifact.type === 'map') {\n continue;\n }\n assetsMetadata.push({\n path: `${DOM_COMPONENTS_BUNDLE_DIR}/${artifact.filename}`,\n ext: artifact.type,\n });\n }\n return assetsMetadata;\n}\n\n/**\n * Transform the DOM component entry (*.html) to use MD5 filename by its content.\n */\nexport function transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n}: {\n files: ExportAssetMap;\n htmlOutputName: string;\n}): PlatformMetadata['assets'] {\n const htmlContent = files.get(htmlOutputName);\n assert(htmlContent);\n const htmlMd5 = crypto.createHash('md5').update(htmlContent.contents.toString()).digest('hex');\n const htmlMd5Filename = `${DOM_COMPONENTS_BUNDLE_DIR}/${htmlMd5}.html`;\n files.set(htmlMd5Filename, htmlContent);\n files.delete(htmlOutputName);\n return [\n {\n path: htmlMd5Filename,\n ext: 'html',\n },\n ];\n}\n\n/**\n * Post-transform the native bundle to use MD5 filename based on DOM component entry content.\n */\nexport function transformNativeBundleForMd5Filename({\n domComponentReference,\n nativeBundle,\n files,\n htmlOutputName,\n}: {\n domComponentReference: string;\n nativeBundle: BundleOutput;\n files: ExportAssetMap;\n htmlOutputName: string;\n}) {\n const htmlContent = files.get(htmlOutputName);\n assert(htmlContent);\n const htmlMd5 = crypto.createHash('md5').update(htmlContent.contents.toString()).digest('hex');\n const hash = crypto.createHash('md5').update(domComponentReference).digest('hex');\n for (const artifact of nativeBundle.artifacts) {\n if (artifact.type !== 'js') {\n continue;\n }\n const assetEntity = files.get(artifact.filename);\n assert(assetEntity);\n if (Buffer.isBuffer(assetEntity.contents)) {\n const searchBuffer = Buffer.from(`${hash}.html`, 'utf8');\n const replaceBuffer = Buffer.from(`${htmlMd5}.html`, 'utf8');\n assert(searchBuffer.length === replaceBuffer.length);\n let index = assetEntity.contents.indexOf(searchBuffer, 0);\n while (index !== -1) {\n replaceBuffer.copy(assetEntity.contents, index);\n index = assetEntity.contents.indexOf(searchBuffer, index + searchBuffer.length);\n }\n } else {\n const search = `${hash}.html`;\n const replace = `${htmlMd5}.html`;\n assert(search.length === replace.length);\n assetEntity.contents = assetEntity.contents.toString().replaceAll(search, replace);\n }\n }\n}\n\n//#endregion `npx export` for updates\n"],"names":["addDomBundleToMetadataAsync","exportDomComponentAsync","transformDomEntryForMd5Filename","transformNativeBundleForMd5Filename","debug","require","filePath","projectRoot","dev","devServer","isHermes","includeSourceMaps","exp","files","useMd5Filename","virtualEntry","resolveFrom","hash","crypto","createHash","update","digest","outputName","DOM_COMPONENTS_BUNDLE_DIR","generatedEntryPath","path","resolve","startsWith","url","fileURLToPath","baseUrl","relativeImport","toPosixPath","relative","dirname","bundle","legacySinglePageExportBundleAsync","platform","domRoot","encodeURI","splitChunks","env","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","convertEntryPointToRelative","mode","engine","undefined","serializerIncludeMaps","bytecode","reactCompiler","experiments","minify","artifact","artifacts","md5","source","filename","type","html","serializeHtmlWithAssets","isExporting","resources","template","getDomComponentHtml","serialAssets","map","a","join","getFilesFromSerialAssets","set","contents","htmlOutputName","assetsMetadata","push","ext","htmlContent","get","assert","htmlMd5","toString","htmlMd5Filename","delete","domComponentReference","nativeBundle","assetEntity","Buffer","isBuffer","searchBuffer","from","replaceBuffer","length","index","indexOf","copy","search","replace","replaceAll"],"mappings":"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"}
@@ -5,41 +5,41 @@ 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
- assertEngineMismatchAsync: function() {
12
+ get assertEngineMismatchAsync () {
13
13
  return assertEngineMismatchAsync;
14
14
  },
15
- getHermesBytecodeBundleVersionAsync: function() {
15
+ get getHermesBytecodeBundleVersionAsync () {
16
16
  return getHermesBytecodeBundleVersionAsync;
17
17
  },
18
- isAndroidUsingHermes: function() {
18
+ get isAndroidUsingHermes () {
19
19
  return isAndroidUsingHermes;
20
20
  },
21
- isEnableHermesManaged: function() {
21
+ get isEnableHermesManaged () {
22
22
  return isEnableHermesManaged;
23
23
  },
24
- isHermesBytecodeBundleAsync: function() {
24
+ get isHermesBytecodeBundleAsync () {
25
25
  return isHermesBytecodeBundleAsync;
26
26
  },
27
- isHermesPossiblyEnabled: function() {
27
+ get isHermesPossiblyEnabled () {
28
28
  return isHermesPossiblyEnabled;
29
29
  },
30
- isIosUsingHermes: function() {
30
+ get isIosUsingHermes () {
31
31
  return isIosUsingHermes;
32
32
  },
33
- maybeInconsistentEngineAndroidAsync: function() {
33
+ get maybeInconsistentEngineAndroidAsync () {
34
34
  return maybeInconsistentEngineAndroidAsync;
35
35
  },
36
- maybeInconsistentEngineIosAsync: function() {
36
+ get maybeInconsistentEngineIosAsync () {
37
37
  return maybeInconsistentEngineIosAsync;
38
38
  },
39
- maybeThrowFromInconsistentEngineAsync: function() {
39
+ get maybeThrowFromInconsistentEngineAsync () {
40
40
  return maybeThrowFromInconsistentEngineAsync;
41
41
  },
42
- parseGradleProperties: function() {
42
+ get parseGradleProperties () {
43
43
  return parseGradleProperties;
44
44
  }
45
45
  });
@@ -104,11 +104,15 @@ function isEnableHermesManaged(expoConfig, platform) {
104
104
  case 'android':
105
105
  {
106
106
  var _expoConfig_android;
107
+ // NOTE(@kitten): `jsEngine` was deprecated, but we're preserving the check
107
108
  return (((_expoConfig_android = expoConfig.android) == null ? void 0 : _expoConfig_android.jsEngine) ?? expoConfig.jsEngine) !== 'jsc';
108
109
  }
109
110
  case 'ios':
111
+ case 'tvos':
112
+ case 'macos':
110
113
  {
111
114
  var _expoConfig_ios;
115
+ // NOTE(@kitten): `jsEngine` was deprecated, but we're preserving the check
112
116
  return (((_expoConfig_ios = expoConfig.ios) == null ? void 0 : _expoConfig_ios.jsEngine) ?? expoConfig.jsEngine) !== 'jsc';
113
117
  }
114
118
  default:
@@ -134,7 +138,9 @@ async function maybeThrowFromInconsistentEngineAsync(projectRoot, configFilePath
134
138
  if (platform === 'android' && await maybeInconsistentEngineAndroidAsync(projectRoot, isHermesManaged)) {
135
139
  throw new Error(`JavaScript engine configuration is inconsistent between ${configFileName} and Android native project.\n` + `In ${configFileName}: Hermes is ${isHermesManaged ? 'enabled' : 'not enabled'}\n` + `In Android native project: Hermes is ${isHermesManaged ? 'not enabled' : 'enabled'}\n` + `Check the following files for inconsistencies:\n` + ` - ${configFilePath}\n` + ` - ${_path().default.join(projectRoot, 'android', 'gradle.properties')}\n` + ` - ${_path().default.join(projectRoot, 'android', 'app', 'build.gradle')}\n` + 'Learn more: https://expo.fyi/hermes-android-config');
136
140
  }
137
- if (platform === 'ios' && await maybeInconsistentEngineIosAsync(projectRoot, isHermesManaged)) {
141
+ // TODO(@kitten): Since Hermes is now assumed, we loosen the relevant check for tvos and macos and just
142
+ // assume we should look at the ios folder, and can otherwise assume Hermes
143
+ if ((platform === 'ios' || platform === 'tvos' || platform === 'macos') && await maybeInconsistentEngineIosAsync(projectRoot, isHermesManaged)) {
138
144
  throw new Error(`JavaScript engine configuration is inconsistent between ${configFileName} and iOS native project.\n` + `In ${configFileName}: Hermes is ${isHermesManaged ? 'enabled' : 'not enabled'}\n` + `In iOS native project: Hermes is ${isHermesManaged ? 'not enabled' : 'enabled'}\n` + `Check the following files for inconsistencies:\n` + ` - ${configFilePath}\n` + ` - ${_path().default.join(projectRoot, 'ios', 'Podfile')}\n` + ` - ${_path().default.join(projectRoot, 'ios', 'Podfile.properties.json')}\n` + 'Learn more: https://expo.fyi/hermes-ios-config');
139
145
  }
140
146
  }
@@ -244,6 +250,10 @@ function isAndroidUsingHermes(projectRoot) {
244
250
  return true;
245
251
  }
246
252
  function isIosUsingHermes(projectRoot) {
253
+ // Assume Hermes and/or just check iOS
254
+ if (!_fs().default.existsSync(_path().default.join(projectRoot, 'ios'))) {
255
+ return true;
256
+ }
247
257
  // If nullish, then assume Hermes is used.
248
258
  return isHermesPossiblyEnabled(projectRoot) !== false;
249
259
  }