@expo/build-tools 1.0.271 → 18.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/LICENSE +21 -100
  2. package/README.md +1 -1
  3. package/dist/android/credentials.js +2 -3
  4. package/dist/android/expoUpdates.js +5 -8
  5. package/dist/android/gradle.js +6 -8
  6. package/dist/android/gradleConfig.js +2 -3
  7. package/dist/buildErrors/buildErrorHandlers.js +4 -3
  8. package/dist/buildErrors/detectError.js +11 -11
  9. package/dist/buildErrors/errors.types.js +0 -1
  10. package/dist/buildErrors/userErrorHandlers.js +2 -3
  11. package/dist/builders/android.js +19 -24
  12. package/dist/builders/common.js +0 -1
  13. package/dist/builders/custom.js +9 -11
  14. package/dist/builders/index.js +0 -1
  15. package/dist/builders/ios.js +24 -29
  16. package/dist/common/eagerBundle.js +3 -4
  17. package/dist/common/easBuildInternal.js +5 -7
  18. package/dist/common/fastlane.js +0 -1
  19. package/dist/common/git.js +0 -1
  20. package/dist/common/installDependencies.d.ts +1 -1
  21. package/dist/common/installDependencies.js +1 -2
  22. package/dist/common/prebuild.js +3 -5
  23. package/dist/common/projectSources.js +12 -16
  24. package/dist/common/setup.js +28 -33
  25. package/dist/context.d.ts +1 -1
  26. package/dist/context.js +33 -25
  27. package/dist/customBuildContext.d.ts +1 -1
  28. package/dist/customBuildContext.js +32 -10
  29. package/dist/gcs/LoggerStream.d.ts +1 -1
  30. package/dist/gcs/LoggerStream.js +22 -14
  31. package/dist/gcs/__unit__/gcs.test.js +5 -8
  32. package/dist/gcs/client.d.ts +1 -1
  33. package/dist/gcs/client.js +28 -19
  34. package/dist/gcs/retry.js +4 -5
  35. package/dist/generic.d.ts +1 -1
  36. package/dist/generic.js +5 -7
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +19 -10
  39. package/dist/ios/configure.d.ts +1 -1
  40. package/dist/ios/configure.js +9 -11
  41. package/dist/ios/credentials/distributionCertificate.js +1 -3
  42. package/dist/ios/credentials/keychain.js +9 -8
  43. package/dist/ios/credentials/manager.d.ts +1 -1
  44. package/dist/ios/credentials/manager.js +24 -13
  45. package/dist/ios/credentials/provisioningProfile.js +12 -6
  46. package/dist/ios/expoUpdates.js +7 -11
  47. package/dist/ios/fastfile.d.ts +1 -1
  48. package/dist/ios/fastfile.js +0 -1
  49. package/dist/ios/fastlane.d.ts +1 -1
  50. package/dist/ios/fastlane.js +8 -9
  51. package/dist/ios/gymfile.d.ts +1 -1
  52. package/dist/ios/gymfile.js +1 -2
  53. package/dist/ios/pod.js +1 -2
  54. package/dist/ios/resign.js +3 -5
  55. package/dist/ios/resolve.js +1 -2
  56. package/dist/ios/tvos.js +1 -3
  57. package/dist/ios/xcodeBuildLogs.d.ts +1 -1
  58. package/dist/ios/xcodeBuildLogs.js +5 -7
  59. package/dist/ios/xcodeEnv.js +1 -2
  60. package/dist/ios/xcpretty.js +11 -7
  61. package/dist/steps/easFunctionGroups.js +0 -1
  62. package/dist/steps/easFunctions.js +26 -25
  63. package/dist/steps/functionGroups/build.d.ts +1 -1
  64. package/dist/steps/functionGroups/build.js +24 -26
  65. package/dist/steps/functionGroups/maestroTest.js +7 -9
  66. package/dist/steps/functions/calculateEASUpdateRuntimeVersion.js +6 -9
  67. package/dist/steps/functions/ccacheStats.js +4 -6
  68. package/dist/steps/functions/checkout.js +0 -1
  69. package/dist/steps/functions/configureAndroidVersion.js +3 -5
  70. package/dist/steps/functions/configureEASUpdateIfInstalled.js +4 -6
  71. package/dist/steps/functions/configureIosCredentials.js +3 -4
  72. package/dist/steps/functions/configureIosVersion.js +4 -6
  73. package/dist/steps/functions/createSubmissionEntity.js +2 -4
  74. package/dist/steps/functions/downloadArtifact.d.ts +1 -1
  75. package/dist/steps/functions/downloadArtifact.js +7 -9
  76. package/dist/steps/functions/downloadBuild.d.ts +1 -1
  77. package/dist/steps/functions/downloadBuild.js +10 -12
  78. package/dist/steps/functions/eagerBundle.js +2 -4
  79. package/dist/steps/functions/findAndUploadBuildArtifacts.js +5 -8
  80. package/dist/steps/functions/generateGymfileFromTemplate.js +6 -8
  81. package/dist/steps/functions/getCredentialsForBuildTriggeredByGitHubIntegration.js +0 -1
  82. package/dist/steps/functions/injectAndroidCredentials.js +3 -4
  83. package/dist/steps/functions/installMaestro.js +3 -4
  84. package/dist/steps/functions/installNodeModules.d.ts +1 -1
  85. package/dist/steps/functions/installNodeModules.js +12 -12
  86. package/dist/steps/functions/installPods.js +0 -1
  87. package/dist/steps/functions/internalMaestroTest.js +16 -16
  88. package/dist/steps/functions/prebuild.js +3 -5
  89. package/dist/steps/functions/repack.d.ts +1 -1
  90. package/dist/steps/functions/repack.js +25 -19
  91. package/dist/steps/functions/resolveAppleTeamIdFromCredentials.js +1 -2
  92. package/dist/steps/functions/resolveBuildConfig.js +0 -1
  93. package/dist/steps/functions/restoreBuildCache.d.ts +1 -1
  94. package/dist/steps/functions/restoreBuildCache.js +8 -10
  95. package/dist/steps/functions/restoreCache.d.ts +1 -1
  96. package/dist/steps/functions/restoreCache.js +34 -26
  97. package/dist/steps/functions/runFastlane.js +0 -1
  98. package/dist/steps/functions/runGradle.js +2 -3
  99. package/dist/steps/functions/saveBuildCache.d.ts +1 -1
  100. package/dist/steps/functions/saveBuildCache.js +6 -7
  101. package/dist/steps/functions/saveCache.d.ts +1 -1
  102. package/dist/steps/functions/saveCache.js +26 -18
  103. package/dist/steps/functions/sendSlackMessage.js +1 -3
  104. package/dist/steps/functions/startAndroidEmulator.js +5 -7
  105. package/dist/steps/functions/startCuttlefishDevice.js +72 -11
  106. package/dist/steps/functions/startIosSimulator.js +8 -11
  107. package/dist/steps/functions/uploadArtifact.js +4 -6
  108. package/dist/steps/functions/uploadToAsc.d.ts +2 -0
  109. package/dist/steps/functions/uploadToAsc.js +287 -0
  110. package/dist/steps/functions/useNpmToken.js +3 -4
  111. package/dist/steps/utils/android/expoUpdates.js +3 -5
  112. package/dist/steps/utils/android/gradle.d.ts +1 -1
  113. package/dist/steps/utils/android/gradle.js +6 -7
  114. package/dist/steps/utils/android/gradleConfig.js +4 -5
  115. package/dist/steps/utils/cache.js +0 -1
  116. package/dist/steps/utils/expoUpdates.d.ts +1 -1
  117. package/dist/steps/utils/expoUpdates.js +15 -18
  118. package/dist/steps/utils/ios/AscApiClient.d.ts +250 -0
  119. package/dist/steps/utils/ios/AscApiClient.js +299 -0
  120. package/dist/steps/utils/ios/configure.js +4 -5
  121. package/dist/steps/utils/ios/credentials/credentials.js +0 -1
  122. package/dist/steps/utils/ios/credentials/distributionCertificate.js +1 -3
  123. package/dist/steps/utils/ios/credentials/keychain.js +8 -8
  124. package/dist/steps/utils/ios/credentials/manager.js +24 -13
  125. package/dist/steps/utils/ios/credentials/provisioningProfile.js +11 -6
  126. package/dist/steps/utils/ios/expoUpdates.js +4 -7
  127. package/dist/steps/utils/ios/fastlane.d.ts +1 -1
  128. package/dist/steps/utils/ios/fastlane.js +3 -4
  129. package/dist/steps/utils/ios/resolve.js +1 -2
  130. package/dist/steps/utils/ios/tvos.js +1 -3
  131. package/dist/steps/utils/ios/xcpretty.js +11 -7
  132. package/dist/steps/utils/slackMessageDynamicFields.js +0 -1
  133. package/dist/templates/EasBuildConfigureVersionGradle.js +0 -1
  134. package/dist/templates/EasBuildGradle.js +0 -1
  135. package/dist/templates/EasBuildInjectAndroidCredentialsGradle.js +0 -1
  136. package/dist/templates/FastfileResign.js +0 -1
  137. package/dist/templates/GymfileArchive.js +0 -1
  138. package/dist/templates/GymfileSimulator.js +0 -1
  139. package/dist/templates/npmrc.js +0 -1
  140. package/dist/utils/AndroidEmulatorUtils.js +20 -22
  141. package/dist/utils/IosSimulatorUtils.js +9 -11
  142. package/dist/utils/appConfig.js +1 -2
  143. package/dist/utils/artifacts.d.ts +1 -1
  144. package/dist/utils/artifacts.js +7 -8
  145. package/dist/utils/cacheKey.js +21 -12
  146. package/dist/utils/diffFingerprintsAsync.d.ts +1 -1
  147. package/dist/utils/diffFingerprintsAsync.js +0 -1
  148. package/dist/utils/environmentSecrets.js +3 -4
  149. package/dist/utils/expoFingerprintCli.js +5 -6
  150. package/dist/utils/expoUpdates.d.ts +1 -2
  151. package/dist/utils/expoUpdates.js +19 -33
  152. package/dist/utils/expoUpdatesCli.js +20 -11
  153. package/dist/utils/files.js +23 -15
  154. package/dist/utils/findMaestroPathsFlowsToExecuteAsync.js +27 -21
  155. package/dist/utils/fingerprint.js +0 -1
  156. package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.js +0 -1
  157. package/dist/utils/hooks.js +1 -3
  158. package/dist/utils/isModernExpoUpdatesCLIWithRuntimeVersionCommandSupported.d.ts +1 -0
  159. package/dist/utils/isModernExpoUpdatesCLIWithRuntimeVersionCommandSupported.js +14 -0
  160. package/dist/utils/npmrc.js +2 -3
  161. package/dist/utils/outputs.d.ts +1 -1
  162. package/dist/utils/outputs.js +2 -5
  163. package/dist/utils/packageManager.js +22 -14
  164. package/dist/utils/prepareBuildExecutable.js +1 -2
  165. package/dist/utils/processes.js +2 -3
  166. package/dist/utils/project.js +1 -2
  167. package/dist/utils/promiseRetryWithCondition.js +0 -1
  168. package/dist/utils/resolveRuntimeVersionAsync.d.ts +1 -1
  169. package/dist/utils/resolveRuntimeVersionAsync.js +4 -6
  170. package/dist/utils/retry.js +2 -3
  171. package/dist/utils/retryOnDNSFailure.js +0 -1
  172. package/dist/utils/stepMetrics.d.ts +1 -1
  173. package/dist/utils/stepMetrics.js +0 -1
  174. package/dist/utils/strings.js +1 -3
  175. package/dist/utils/turtleFetch.d.ts +1 -1
  176. package/dist/utils/turtleFetch.js +2 -2
  177. package/package.json +25 -22
  178. package/dist/android/credentials.js.map +0 -1
  179. package/dist/android/expoUpdates.js.map +0 -1
  180. package/dist/android/gradle.js.map +0 -1
  181. package/dist/android/gradleConfig.js.map +0 -1
  182. package/dist/buildErrors/buildErrorHandlers.js.map +0 -1
  183. package/dist/buildErrors/detectError.js.map +0 -1
  184. package/dist/buildErrors/errors.types.js.map +0 -1
  185. package/dist/buildErrors/userErrorHandlers.js.map +0 -1
  186. package/dist/builders/android.js.map +0 -1
  187. package/dist/builders/common.js.map +0 -1
  188. package/dist/builders/custom.js.map +0 -1
  189. package/dist/builders/index.js.map +0 -1
  190. package/dist/builders/ios.js.map +0 -1
  191. package/dist/common/eagerBundle.js.map +0 -1
  192. package/dist/common/easBuildInternal.js.map +0 -1
  193. package/dist/common/fastlane.js.map +0 -1
  194. package/dist/common/git.js.map +0 -1
  195. package/dist/common/installDependencies.js.map +0 -1
  196. package/dist/common/prebuild.js.map +0 -1
  197. package/dist/common/projectSources.js.map +0 -1
  198. package/dist/common/setup.js.map +0 -1
  199. package/dist/context.js.map +0 -1
  200. package/dist/customBuildContext.js.map +0 -1
  201. package/dist/gcs/LoggerStream.js.map +0 -1
  202. package/dist/gcs/__unit__/gcs.test.js.map +0 -1
  203. package/dist/gcs/client.js.map +0 -1
  204. package/dist/gcs/retry.js.map +0 -1
  205. package/dist/generic.js.map +0 -1
  206. package/dist/index.js.map +0 -1
  207. package/dist/ios/configure.js.map +0 -1
  208. package/dist/ios/credentials/distributionCertificate.js.map +0 -1
  209. package/dist/ios/credentials/keychain.js.map +0 -1
  210. package/dist/ios/credentials/manager.js.map +0 -1
  211. package/dist/ios/credentials/provisioningProfile.js.map +0 -1
  212. package/dist/ios/expoUpdates.js.map +0 -1
  213. package/dist/ios/fastfile.js.map +0 -1
  214. package/dist/ios/fastlane.js.map +0 -1
  215. package/dist/ios/gymfile.js.map +0 -1
  216. package/dist/ios/pod.js.map +0 -1
  217. package/dist/ios/resign.js.map +0 -1
  218. package/dist/ios/resolve.js.map +0 -1
  219. package/dist/ios/tvos.js.map +0 -1
  220. package/dist/ios/xcodeBuildLogs.js.map +0 -1
  221. package/dist/ios/xcodeEnv.js.map +0 -1
  222. package/dist/ios/xcpretty.js.map +0 -1
  223. package/dist/steps/easFunctionGroups.js.map +0 -1
  224. package/dist/steps/easFunctions.js.map +0 -1
  225. package/dist/steps/functionGroups/build.js.map +0 -1
  226. package/dist/steps/functionGroups/maestroTest.js.map +0 -1
  227. package/dist/steps/functions/calculateEASUpdateRuntimeVersion.js.map +0 -1
  228. package/dist/steps/functions/ccacheStats.js.map +0 -1
  229. package/dist/steps/functions/checkout.js.map +0 -1
  230. package/dist/steps/functions/configureAndroidVersion.js.map +0 -1
  231. package/dist/steps/functions/configureEASUpdateIfInstalled.js.map +0 -1
  232. package/dist/steps/functions/configureIosCredentials.js.map +0 -1
  233. package/dist/steps/functions/configureIosVersion.js.map +0 -1
  234. package/dist/steps/functions/createSubmissionEntity.js.map +0 -1
  235. package/dist/steps/functions/downloadArtifact.js.map +0 -1
  236. package/dist/steps/functions/downloadBuild.js.map +0 -1
  237. package/dist/steps/functions/eagerBundle.js.map +0 -1
  238. package/dist/steps/functions/findAndUploadBuildArtifacts.js.map +0 -1
  239. package/dist/steps/functions/generateGymfileFromTemplate.js.map +0 -1
  240. package/dist/steps/functions/getCredentialsForBuildTriggeredByGitHubIntegration.js.map +0 -1
  241. package/dist/steps/functions/injectAndroidCredentials.js.map +0 -1
  242. package/dist/steps/functions/installMaestro.js.map +0 -1
  243. package/dist/steps/functions/installNodeModules.js.map +0 -1
  244. package/dist/steps/functions/installPods.js.map +0 -1
  245. package/dist/steps/functions/internalMaestroTest.js.map +0 -1
  246. package/dist/steps/functions/prebuild.js.map +0 -1
  247. package/dist/steps/functions/repack.js.map +0 -1
  248. package/dist/steps/functions/resolveAppleTeamIdFromCredentials.js.map +0 -1
  249. package/dist/steps/functions/resolveBuildConfig.js.map +0 -1
  250. package/dist/steps/functions/restoreBuildCache.js.map +0 -1
  251. package/dist/steps/functions/restoreCache.js.map +0 -1
  252. package/dist/steps/functions/runFastlane.js.map +0 -1
  253. package/dist/steps/functions/runGradle.js.map +0 -1
  254. package/dist/steps/functions/saveBuildCache.js.map +0 -1
  255. package/dist/steps/functions/saveCache.js.map +0 -1
  256. package/dist/steps/functions/sendSlackMessage.js.map +0 -1
  257. package/dist/steps/functions/startAndroidEmulator.js.map +0 -1
  258. package/dist/steps/functions/startCuttlefishDevice.js.map +0 -1
  259. package/dist/steps/functions/startIosSimulator.js.map +0 -1
  260. package/dist/steps/functions/uploadArtifact.js.map +0 -1
  261. package/dist/steps/functions/useNpmToken.js.map +0 -1
  262. package/dist/steps/utils/android/expoUpdates.js.map +0 -1
  263. package/dist/steps/utils/android/gradle.js.map +0 -1
  264. package/dist/steps/utils/android/gradleConfig.js.map +0 -1
  265. package/dist/steps/utils/cache.js.map +0 -1
  266. package/dist/steps/utils/expoUpdates.js.map +0 -1
  267. package/dist/steps/utils/ios/configure.js.map +0 -1
  268. package/dist/steps/utils/ios/credentials/credentials.js.map +0 -1
  269. package/dist/steps/utils/ios/credentials/distributionCertificate.js.map +0 -1
  270. package/dist/steps/utils/ios/credentials/keychain.js.map +0 -1
  271. package/dist/steps/utils/ios/credentials/manager.js.map +0 -1
  272. package/dist/steps/utils/ios/credentials/provisioningProfile.js.map +0 -1
  273. package/dist/steps/utils/ios/expoUpdates.js.map +0 -1
  274. package/dist/steps/utils/ios/fastlane.js.map +0 -1
  275. package/dist/steps/utils/ios/resolve.js.map +0 -1
  276. package/dist/steps/utils/ios/tvos.js.map +0 -1
  277. package/dist/steps/utils/ios/xcpretty.js.map +0 -1
  278. package/dist/steps/utils/slackMessageDynamicFields.js.map +0 -1
  279. package/dist/templates/EasBuildConfigureVersionGradle.js.map +0 -1
  280. package/dist/templates/EasBuildGradle.js.map +0 -1
  281. package/dist/templates/EasBuildInjectAndroidCredentialsGradle.js.map +0 -1
  282. package/dist/templates/FastfileResign.js.map +0 -1
  283. package/dist/templates/GymfileArchive.js.map +0 -1
  284. package/dist/templates/GymfileSimulator.js.map +0 -1
  285. package/dist/templates/npmrc.js.map +0 -1
  286. package/dist/utils/AndroidEmulatorUtils.js.map +0 -1
  287. package/dist/utils/IosSimulatorUtils.js.map +0 -1
  288. package/dist/utils/appConfig.js.map +0 -1
  289. package/dist/utils/artifacts.js.map +0 -1
  290. package/dist/utils/cacheKey.js.map +0 -1
  291. package/dist/utils/diffFingerprintsAsync.js.map +0 -1
  292. package/dist/utils/environmentSecrets.js.map +0 -1
  293. package/dist/utils/expoFingerprintCli.js.map +0 -1
  294. package/dist/utils/expoUpdates.js.map +0 -1
  295. package/dist/utils/expoUpdatesCli.js.map +0 -1
  296. package/dist/utils/files.js.map +0 -1
  297. package/dist/utils/findMaestroPathsFlowsToExecuteAsync.js.map +0 -1
  298. package/dist/utils/fingerprint.js.map +0 -1
  299. package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.js.map +0 -1
  300. package/dist/utils/hooks.js.map +0 -1
  301. package/dist/utils/npmrc.js.map +0 -1
  302. package/dist/utils/outputs.js.map +0 -1
  303. package/dist/utils/packageManager.js.map +0 -1
  304. package/dist/utils/prepareBuildExecutable.js.map +0 -1
  305. package/dist/utils/processes.js.map +0 -1
  306. package/dist/utils/project.js.map +0 -1
  307. package/dist/utils/promiseRetryWithCondition.js.map +0 -1
  308. package/dist/utils/resolveRuntimeVersionAsync.js.map +0 -1
  309. package/dist/utils/retry.js.map +0 -1
  310. package/dist/utils/retryOnDNSFailure.js.map +0 -1
  311. package/dist/utils/stepMetrics.js.map +0 -1
  312. package/dist/utils/strings.js.map +0 -1
  313. package/dist/utils/turtleFetch.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":";;;;;;AAqBA,4CAyBC;AA7CD,sEAAuC;AAIvC,qDAAkD;AAClD,uCAA4C;AAE5C,IAAY,IAWX;AAXD,WAAY,IAAI;IACd,6CAAqC,CAAA;IACrC,+CAAuC,CAAA;IACvC;;OAEG;IACH,+DAAuD,CAAA;IACvD,iDAAyC,CAAA;IACzC,6CAAqC,CAAA;IACrC,mDAA2C,CAAA;IAC3C,+CAAuC,CAAA;AACzC,CAAC,EAXW,IAAI,oBAAJ,IAAI,QAWf;AAEM,KAAK,UAAU,gBAAgB,CACpC,GAAuB,EACvB,IAAU,EACV,EAAE,SAAS,KAA6C,EAAE;;IAE1D,MAAM,UAAU,GAAG,GAAG,CAAC,8BAA8B,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,IAAA,yBAAe,EAAC,UAAU,CAAC,CAAC;IAChD,IAAI,MAAA,WAAW,CAAC,OAAO,0CAAG,IAAI,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,6CAA6C,CAAC,CAAC;QAC9E,6FAA6F;QAC7F,6BAA6B;QAC7B,2EAA2E;QAC3E,MAAM,cAAc,GAClB,GAAG,CAAC,cAAc,KAAK,+BAAc,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW;YACrE,CAAC,CAAC,+BAAc,CAAC,GAAG;YACpB,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;QACzB,MAAM,IAAA,sBAAK,EAAC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;YACzC,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE;gBACH,GAAG,GAAG,CAAC,GAAG;gBACV,GAAG,SAAS;aACb;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC","sourcesContent":["import { BuildJob } from '@expo/eas-build-job';\nimport spawn from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\n\nimport { PackageManager } from './packageManager';\nimport { readPackageJson } from './project';\n\nexport enum Hook {\n PRE_INSTALL = 'eas-build-pre-install',\n POST_INSTALL = 'eas-build-post-install',\n /**\n * @deprecated\n */\n PRE_UPLOAD_ARTIFACTS = 'eas-build-pre-upload-artifacts',\n ON_BUILD_SUCCESS = 'eas-build-on-success',\n ON_BUILD_ERROR = 'eas-build-on-error',\n ON_BUILD_COMPLETE = 'eas-build-on-complete',\n ON_BUILD_CANCEL = 'eas-build-on-cancel',\n}\n\nexport async function runHookIfPresent<TJob extends BuildJob>(\n ctx: BuildContext<TJob>,\n hook: Hook,\n { extraEnvs }: { extraEnvs?: Record<string, string> } = {}\n): Promise<void> {\n const projectDir = ctx.getReactNativeProjectDirectory();\n const packageJson = readPackageJson(projectDir);\n if (packageJson.scripts?.[hook]) {\n ctx.logger.info(`Script '${hook}' is present in package.json, running it...`);\n // both yarn v2+ and yarn v1 seem to have issues with running preinstall script in some cases\n // like doing corepack enable\n // https://exponent-internal.slack.com/archives/C9PRD479V/p1736426668589209\n const packageManager =\n ctx.packageManager === PackageManager.YARN && hook === Hook.PRE_INSTALL\n ? PackageManager.NPM\n : ctx.packageManager;\n await spawn(packageManager, ['run', hook], {\n cwd: projectDir,\n logger: ctx.logger,\n env: {\n ...ctx.env,\n ...extraEnvs,\n },\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"npmrc.js","sourceRoot":"","sources":["../../src/utils/npmrc.ts"],"names":[],"mappings":";;;;;AAWA,0CAMC;AAjBD,gDAAwB;AAIxB,wDAA0B;AAG1B,8CAAmD;AAEnD,qDAAuD;AAEhD,KAAK,UAAU,eAAe,CAAC,GAAsB,EAAE,MAAc;IAC1E,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,2BAA2B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,GAAsB,EAAE,MAAc;IAC/E,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC3E,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,qBAAa,CAAC,CAAC;QAC3B,MAAM,kBAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,qBAAa,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAsB,EAAE,MAAc;IACzE,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAChC,IAAA,oCAAmB,EAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,EACzD,QAAQ,CACT,CAAC;IACF,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,mBAAmB,cAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\nimport { NpmrcTemplate } from '../templates/npmrc';\n\nimport { findPackagerRootDir } from './packageManager';\n\nexport async function setUpNpmrcAsync(ctx: BuildContext<Job>, logger: bunyan): Promise<void> {\n if (ctx.env.NPM_TOKEN) {\n await createNpmrcIfNotExistsAsync(ctx, logger);\n } else {\n await logIfNpmrcExistsAsync(ctx, logger);\n }\n}\n\nasync function createNpmrcIfNotExistsAsync(ctx: BuildContext<Job>, logger: bunyan): Promise<void> {\n logger.info('We detected that you set the NPM_TOKEN environment variable');\n const projectNpmrcPath = path.join(ctx.buildDirectory, '.npmrc');\n if (await fs.pathExists(projectNpmrcPath)) {\n logger.info('.npmrc already exists in your project directory, skipping generation');\n } else {\n logger.info('Creating .npmrc in your project directory with the following contents:');\n logger.info(NpmrcTemplate);\n await fs.writeFile(projectNpmrcPath, NpmrcTemplate);\n }\n}\n\nasync function logIfNpmrcExistsAsync(ctx: BuildContext<Job>, logger: bunyan): Promise<void> {\n const projectNpmrcPath = path.join(\n findPackagerRootDir(ctx.getReactNativeProjectDirectory()),\n '.npmrc'\n );\n if (await fs.pathExists(projectNpmrcPath)) {\n logger.info(`.npmrc found at ${path.relative(ctx.buildDirectory, projectNpmrcPath)}`);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"outputs.js","sourceRoot":"","sources":["../../src/utils/outputs.ts"],"names":[],"mappings":";;;;;AAOA,gEAkCC;AAGD,8CAiBC;AA5DD,uCAA+D;AAE/D,4DAAoC;AAEpC,+CAA4C;AAErC,KAAK,UAAU,0BAA0B,CAC9C,GAA2B,EAC3B,EAAE,MAAM,EAAE,gBAAgB,EAAgD;;IAE1E,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAA,oBAAU,EAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,IAAA,oBAAU,EAAC,MAAA,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,0CAAE,gBAAgB,CAAC,CAAC;QAErF,MAAM,oBAAoB,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG,iBAAiB,CAAC;YAChC,oBAAoB,EAAE,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO;YACnD,oBAAoB;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEjC,MAAM,IAAA,yBAAW,EAAC,IAAI,GAAG,CAAC,aAAa,aAAa,EAAE,EAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE;YAC7F,IAAI,EAAE,EAAE,OAAO,EAAE;YACjB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,gBAAgB,EAAE;aAC5C;YACD,OAAO,EAAE,KAAK;YACd,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;QAClD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,SAAgB,iBAAiB,CAAC,EAChC,oBAAoB,EACpB,oBAAoB,GAIrB;IACC,MAAM,UAAU,GAAuC,EAAE,CAAC;IAC1D,KAAK,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjF,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;;YACtF,OAAO,GAAG,MAAA,IAAA,gBAAQ,EAAC,UAAU,EAAE,oBAAoB,CAAC,mCAAI,EAAE,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;IACtC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { JobInterpolationContext } from '@expo/eas-build-job';\nimport { BuildStepGlobalContext, jsepEval } from '@expo/steps';\nimport { bunyan } from '@expo/logger';\nimport nullthrows from 'nullthrows';\n\nimport { turtleFetch } from './turtleFetch';\n\nexport async function uploadJobOutputsToWwwAsync(\n ctx: BuildStepGlobalContext,\n { logger, expoApiV2BaseUrl }: { logger: bunyan; expoApiV2BaseUrl: string }\n): Promise<void> {\n if (!ctx.staticContext.job.outputs) {\n logger.info('Job defines no outputs, skipping upload');\n return;\n }\n\n try {\n const workflowJobId = nullthrows(ctx.env.__WORKFLOW_JOB_ID);\n const robotAccessToken = nullthrows(ctx.staticContext.job.secrets?.robotAccessToken);\n\n const interpolationContext = ctx.getInterpolationContext();\n logger.debug({ dynamicValues: interpolationContext }, 'Using dynamic values');\n\n const outputs = collectJobOutputs({\n jobOutputDefinitions: ctx.staticContext.job.outputs,\n interpolationContext,\n });\n logger.info('Uploading outputs');\n\n await turtleFetch(new URL(`workflows/${workflowJobId}`, expoApiV2BaseUrl).toString(), 'PATCH', {\n json: { outputs },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n },\n timeout: 20000,\n logger,\n });\n } catch (err) {\n logger.error({ err }, 'Failed to upload outputs');\n throw err;\n }\n}\n\n/** Function we use to get outputs of the whole job from steps. */\nexport function collectJobOutputs({\n jobOutputDefinitions,\n interpolationContext,\n}: {\n jobOutputDefinitions: Record<string, string>;\n interpolationContext: JobInterpolationContext;\n}): Record<string, string | undefined> {\n const jobOutputs: Record<string, string | undefined> = {};\n for (const [outputKey, outputDefinition] of Object.entries(jobOutputDefinitions)) {\n const outputValue = outputDefinition.replace(/\\$\\{\\{(.+?)\\}\\}/g, (_match, expression) => {\n return `${jsepEval(expression, interpolationContext) ?? ''}`;\n });\n\n jobOutputs[outputKey] = outputValue;\n }\n\n return jobOutputs;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/utils/packageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import spawnAsync from '@expo/turtle-spawn';\nimport * as PackageManagerUtils from '@expo/package-manager';\nimport semver from 'semver';\nimport { z } from 'zod';\n\nexport enum PackageManager {\n YARN = 'yarn',\n NPM = 'npm',\n PNPM = 'pnpm',\n BUN = 'bun',\n}\n\nexport function resolvePackageManager(directory: string): PackageManager {\n try {\n const manager = PackageManagerUtils.resolvePackageManager(directory);\n if (manager === 'npm') {\n return PackageManager.NPM;\n } else if (manager === 'pnpm') {\n return PackageManager.PNPM;\n } else if (manager === 'bun') {\n return PackageManager.BUN;\n } else {\n return PackageManager.YARN;\n }\n } catch {\n return PackageManager.YARN;\n }\n}\n\nexport function findPackagerRootDir(currentDir: string): string {\n return PackageManagerUtils.resolveWorkspaceRoot(currentDir) ?? currentDir;\n}\n\nexport async function isAtLeastNpm7Async(): Promise<boolean> {\n const version = (await spawnAsync('npm', ['--version'], { stdio: 'pipe' })).stdout.trim();\n return semver.gte(version, '7.0.0');\n}\n\nexport function shouldUseFrozenLockfile({\n env,\n sdkVersion,\n reactNativeVersion,\n}: {\n env: Record<string, string | undefined>;\n sdkVersion: string | undefined;\n reactNativeVersion: string | undefined;\n}): boolean {\n if (env.EAS_NO_FROZEN_LOCKFILE) {\n return false;\n }\n\n if (sdkVersion && semver.lt(sdkVersion, '53.0.0')) {\n // Before SDK 53 we could not have used frozen lockfile.\n return false;\n }\n\n if (reactNativeVersion && semver.lt(reactNativeVersion, '0.79.0')) {\n // Before react-native 0.79 we could not have used frozen lockfile.\n return false;\n }\n\n // We either don't know expo and react-native versions,\n // so we can try to use frozen lockfile, or the versions are\n // new enough that we do want to use it.\n return true;\n}\n\nconst PackageJsonZ = z.object({\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n});\n\nexport function getPackageVersionFromPackageJson({\n packageJson,\n packageName,\n}: {\n packageJson: unknown;\n packageName: string;\n}): string | undefined {\n const parsedPackageJson = PackageJsonZ.safeParse(packageJson);\n if (!parsedPackageJson.success) {\n return undefined;\n }\n\n const version =\n parsedPackageJson.data.dependencies?.[packageName] ??\n parsedPackageJson.data.devDependencies?.[packageName];\n if (!version) {\n return undefined;\n }\n\n return semver.coerce(version)?.version;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prepareBuildExecutable.js","sourceRoot":"","sources":["../../src/utils/prepareBuildExecutable.ts"],"names":[],"mappings":";;;;;AAOA,wDAKC;AAZD,gDAAwB;AAGxB,wDAA0B;AAInB,KAAK,UAAU,sBAAsB,CAAC,GAAsB;IACjE,MAAM,kBAAE,CAAC,IAAI,CACX,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EACzC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,SAAS,CAAC,CACpD,CAAC;AACJ,CAAC","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nexport async function prepareExecutableAsync(ctx: BuildContext<Job>): Promise<void> {\n await fs.copy(\n path.join(__dirname, '../../bin/set-env'),\n path.join(ctx.buildExecutablesDirectory, 'set-env')\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../src/utils/processes.ts"],"names":[],"mappings":";;;;;AAiBA,wFAcC;AA/BD,sEAAuC;AAEvC,KAAK,UAAU,oBAAoB,CAAC,UAAoB;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAK,EAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;YAChE,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM;aACjB,QAAQ,EAAE;aACV,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,sCAAsC,CAAC,IAAY;IACvE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAC5B,OAAO,gBAAgB,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QACvD,gBAAgB,GAAG,KAAK,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,gBAAgB,GAAG,IAAI,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC","sourcesContent":["import spawn from '@expo/turtle-spawn';\n\nasync function getChildrenPidsAsync(parentPids: number[]): Promise<number[]> {\n try {\n const result = await spawn('pgrep', ['-P', parentPids.join(',')], {\n stdio: 'pipe',\n });\n return result.stdout\n .toString()\n .split('\\n')\n .map((i) => Number(i.trim()))\n .filter((i) => i);\n } catch {\n return [];\n }\n}\n\nexport async function getParentAndDescendantProcessPidsAsync(ppid: number): Promise<number[]> {\n const children = new Set<number>([ppid]);\n let shouldCheckAgain = true;\n while (shouldCheckAgain) {\n const pids = await getChildrenPidsAsync([...children]);\n shouldCheckAgain = false;\n for (const pid of pids) {\n if (!children.has(pid)) {\n shouldCheckAgain = true;\n children.add(pid);\n }\n }\n }\n return [...children];\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":";;;;;AAUA,4DAIC;AAED,8CAqBC;AAED,0CAUC;AAED,kDAOC;AA1DD,gDAAwB;AAExB,sEAAoF;AACpF,wDAA0B;AAE1B,4DAA8E;AAE9E;;GAEG;AACI,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IAC/D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,oCAAmB,EAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,IAAI,EACJ,OAAO,GAKR;IACC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,IAAI,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE,CAAC;QACjD,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,UAAkB;IAChD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,kBAAE,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,kBAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,UAAkB;IACpD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,kBAAE,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,kBAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["import path from 'path';\n\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\n\nimport { findPackagerRootDir, PackageManager } from '../utils/packageManager';\n\n/**\n * check if .yarnrc.yml exists in the project dir or in the workspace root dir\n */\nexport async function isUsingModernYarnVersion(projectDir: string): Promise<boolean> {\n const yarnrcPath = path.join(projectDir, '.yarnrc.yml');\n const yarnrcRootPath = path.join(findPackagerRootDir(projectDir), '.yarnrc.yml');\n return (await fs.pathExists(yarnrcPath)) || (await fs.pathExists(yarnrcRootPath));\n}\n\nexport function runExpoCliCommand({\n packageManager,\n args,\n options,\n}: {\n packageManager: PackageManager;\n args: string[];\n options: SpawnOptions;\n}): SpawnPromise<SpawnResult> {\n const argsWithExpo = ['expo', ...args];\n if (packageManager === PackageManager.NPM) {\n return spawn('npx', argsWithExpo, options);\n } else if (packageManager === PackageManager.YARN) {\n return spawn('yarn', argsWithExpo, options);\n } else if (packageManager === PackageManager.PNPM) {\n return spawn('pnpm', argsWithExpo, options);\n } else if (packageManager === PackageManager.BUN) {\n return spawn('bun', argsWithExpo, options);\n } else {\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n}\n\nexport function readPackageJson(projectDir: string): any {\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!fs.pathExistsSync(packageJsonPath)) {\n throw new Error(`package.json does not exist in ${projectDir}`);\n }\n try {\n return fs.readJSONSync(packageJsonPath);\n } catch (err: any) {\n throw new Error(`Failed to parse or read package.json: ${err.message}`);\n }\n}\n\nexport function readEasJsonContents(projectDir: string): string {\n const easJsonPath = path.join(projectDir, 'eas.json');\n if (!fs.pathExistsSync(easJsonPath)) {\n throw new Error(`eas.json does not exist in ${projectDir}.`);\n }\n\n return fs.readFileSync(easJsonPath, 'utf8');\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"promiseRetryWithCondition.js","sourceRoot":"","sources":["../../src/utils/promiseRetryWithCondition.ts"],"names":[],"mappings":";;;;;AAGA,8DAgBC;AAnBD,kEAAyC;AAGzC,SAAgB,yBAAyB,CACvC,EAAO,EACP,gBAAyC,EACzC,UAA4B,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IAErD,OAAO,CAAC,GAAG,QAAQ,EAAE,EAAE,CACrB,IAAA,uBAAY,EAAkB,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,CAAC,CAAC,CAAC;YACX,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,EAAE,OAAO,CAAC,CAAC;AAChB,CAAC","sourcesContent":["import promiseRetry from 'promise-retry';\nimport { OperationOptions } from 'retry';\n\nexport function promiseRetryWithCondition<TFn extends (...args: any[]) => Promise<any>>(\n fn: TFn,\n retryConditionFn: (error: any) => boolean,\n options: OperationOptions = { retries: 3, factor: 2 }\n): (...funcArgs: Parameters<TFn>) => Promise<ReturnType<TFn>> {\n return (...funcArgs) =>\n promiseRetry<ReturnType<TFn>>(async (retry) => {\n try {\n return await fn(...funcArgs);\n } catch (e) {\n if (retryConditionFn(e)) {\n retry(e);\n }\n throw e;\n }\n }, options);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveRuntimeVersionAsync.js","sourceRoot":"","sources":["../../src/utils/resolveRuntimeVersionAsync.ts"],"names":[],"mappings":";;AASA,gEA6DC;AArED,yDAA+C;AAK/C,qDAA8F;AAC9F,+CAAyF;AAElF,KAAK,UAAU,0BAA0B,CAAC,EAC/C,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,MAAM,EACN,yBAAyB,EACzB,GAAG,GASJ;;IAIC,IAAI,CAAC,IAAA,sEAAwD,EAAC,yBAAyB,CAAC,EAAE,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAChF,+FAA+F;QAC/F,qEAAqE;QACrE,OAAO;YACL,cAAc,EAAE,MAAM,wBAAO,CAAC,8BAA8B,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC;YACvF,kBAAkB,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAE7F,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpD,MAAM,gCAAgC,GAAG,MAAM,IAAA,wCAAuB,EACpE,UAAU,EACV,CAAC,wBAAwB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,EACxF;YACE,GAAG;SACJ,CACF,CAAC;QACF,MAAM,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE1E,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE/C,OAAO;YACL,cAAc,EAAE,MAAA,oBAAoB,CAAC,cAAc,mCAAI,IAAI;YAC3D,kBAAkB,EAAE,MAAA,oBAAoB,CAAC,kBAAkB,mCAAI,IAAI;SACpE,CAAC;IACJ,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,uFAAuF;QACvF,IAAI,CAAC,YAAY,kDAAiC,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CACV,uFAAuF,CAAC,CAAC,OAAO,EAAE,CACnG,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC","sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport { bunyan } from '@expo/logger';\nimport { Workflow } from '@expo/eas-build-job';\nimport { BuildStepEnv } from '@expo/steps';\n\nimport { ExpoUpdatesCLIModuleNotFoundError, expoUpdatesCommandAsync } from './expoUpdatesCli';\nimport { isModernExpoUpdatesCLIWithRuntimeVersionCommandSupported } from './expoUpdates';\n\nexport async function resolveRuntimeVersionAsync({\n exp,\n platform,\n workflow,\n projectDir,\n logger,\n expoUpdatesPackageVersion,\n env,\n}: {\n exp: ExpoConfig;\n platform: 'ios' | 'android';\n workflow: Workflow;\n projectDir: string;\n logger: bunyan;\n expoUpdatesPackageVersion: string;\n env: BuildStepEnv;\n}): Promise<{\n runtimeVersion: string | null;\n fingerprintSources: object[] | null;\n} | null> {\n if (!isModernExpoUpdatesCLIWithRuntimeVersionCommandSupported(expoUpdatesPackageVersion)) {\n logger.debug('Using expo-updates config plugin for runtime version resolution');\n // fall back to the previous behavior (using the @expo/config-plugins eas-cli dependency rather\n // than the versioned @expo/config-plugins dependency in the project)\n return {\n runtimeVersion: await Updates.getRuntimeVersionNullableAsync(projectDir, exp, platform),\n fingerprintSources: null,\n };\n }\n\n try {\n logger.debug('Using expo-updates runtimeversion:resolve CLI for runtime version resolution');\n\n const extraArgs = logger.debug() ? ['--debug'] : [];\n\n const resolvedRuntimeVersionJSONResult = await expoUpdatesCommandAsync(\n projectDir,\n ['runtimeversion:resolve', '--platform', platform, '--workflow', workflow, ...extraArgs],\n {\n env,\n }\n );\n const runtimeVersionResult = JSON.parse(resolvedRuntimeVersionJSONResult);\n\n logger.debug('runtimeversion:resolve output:');\n logger.debug(resolvedRuntimeVersionJSONResult);\n\n return {\n runtimeVersion: runtimeVersionResult.runtimeVersion ?? null,\n fingerprintSources: runtimeVersionResult.fingerprintSources ?? null,\n };\n } catch (e: any) {\n // if expo-updates is not installed, there's no need for a runtime version in the build\n if (e instanceof ExpoUpdatesCLIModuleNotFoundError) {\n logger.error(\n `Error when resolving runtime version using expo-updates runtimeversion:resolve CLI: ${e.message}`\n );\n return null;\n }\n throw e;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";;AAEA,gCAEC;AAOD,gCA0BC;AAnCM,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAOM,KAAK,UAAU,UAAU,CAC9B,EAAwC,EACxC,EACE,YAAY,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAC1C,MAAM,GAIP;IAED,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,YAAY,IAAI,CAAC,CAAC;YAClB,OAAO,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CACX,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAC/C,iBAAiB,YAAY,EAAE,CAChC,CAAC;YACF,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC;YAClC,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { bunyan } from '@expo/logger';\n\nexport async function sleepAsync(ms: number): Promise<void> {\n await new Promise((res) => setTimeout(res, ms));\n}\n\nexport interface RetryOptions {\n retries: number;\n retryIntervalMs: number;\n}\n\nexport async function retryAsync<T = void>(\n fn: (attemptCount: number) => Promise<T>,\n {\n retryOptions: { retries, retryIntervalMs },\n logger,\n }: {\n retryOptions: RetryOptions;\n logger?: bunyan;\n }\n): Promise<T> {\n let attemptCount = -1;\n for (;;) {\n try {\n attemptCount += 1;\n return await fn(attemptCount);\n } catch (err: any) {\n logger?.debug(\n { err, stdout: err.stdout, stderr: err.stderr },\n `Retry attempt ${attemptCount}`\n );\n await sleepAsync(retryIntervalMs);\n if (attemptCount === retries) {\n throw err;\n }\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"retryOnDNSFailure.js","sourceRoot":"","sources":["../../src/utils/retryOnDNSFailure.ts"],"names":[],"mappings":";;AAIA,gCAEC;AAED,8CAUC;AAhBD,2EAAwE;AAExE,SAAgB,UAAU,CAAC,CAAwB;IACjD,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AAC1D,CAAC;AAED,SAAgB,iBAAiB,CAC/B,EAAO,EACP,OAA0B;IAE1B,OAAO,IAAA,qDAAyB,EAAC,EAAE,EAAE,UAAU,EAAE;QAC/C,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,GAAG;QACf,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { OperationOptions } from 'retry';\n\nimport { promiseRetryWithCondition } from './promiseRetryWithCondition';\n\nexport function isDNSError(e: Error & { code: any }): boolean {\n return e.code === 'ENOTFOUND' || e.code === 'EAI_AGAIN';\n}\n\nexport function retryOnDNSFailure<TFn extends (...args: any[]) => Promise<any>>(\n fn: TFn,\n options?: OperationOptions\n): (...funcArgs: Parameters<TFn>) => Promise<ReturnType<TFn>> {\n return promiseRetryWithCondition(fn, isDNSError, {\n retries: 3,\n factor: 2,\n minTimeout: 100,\n ...options,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stepMetrics.js","sourceRoot":"","sources":["../../src/utils/stepMetrics.ts"],"names":[],"mappings":";;AAKA,kEAmCC;AArCD,+CAA4C;AAErC,KAAK,UAAU,2BAA2B,CAAC,EAChD,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,MAAM,GAOP;IACC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAA,yBAAW,EACf,IAAI,GAAG,CAAC,aAAa,aAAa,UAAU,EAAE,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAC1E,MAAM,EACN;YACE,IAAI,EAAE,EAAE,WAAW,EAAE;YACrB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,gBAAgB,EAAE;aAC5C;YACD,OAAO,EAAE,KAAK;YACd,MAAM;SACP,CACF,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,MAAM,eAAe,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,sFAAsF;IACxF,CAAC;AACH,CAAC","sourcesContent":["import { StepMetricsCollection } from '@expo/steps';\nimport { bunyan } from '@expo/logger';\n\nimport { turtleFetch } from './turtleFetch';\n\nexport async function uploadStepMetricsToWwwAsync({\n workflowJobId,\n robotAccessToken,\n expoApiV2BaseUrl,\n stepMetrics,\n logger,\n}: {\n workflowJobId: string;\n robotAccessToken: string;\n expoApiV2BaseUrl: string;\n stepMetrics: StepMetricsCollection;\n logger: bunyan;\n}): Promise<void> {\n if (stepMetrics.length === 0) {\n logger.debug('No step metrics to upload');\n return;\n }\n\n try {\n await turtleFetch(\n new URL(`workflows/${workflowJobId}/metrics`, expoApiV2BaseUrl).toString(),\n 'POST',\n {\n json: { stepMetrics },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n },\n timeout: 20000,\n logger,\n }\n );\n logger.info(`Uploaded ${stepMetrics.length} step metrics`);\n } catch {\n // Don't display unactionable error to the user, let's send it to Sentry in the future\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/utils/strings.ts"],"names":[],"mappings":";;;AAAA,uDAA+C;AAE/C,MAAM,YAAY,GAA2B;IAC3C,KAAK,EAAE,SAAS;CACjB,CAAC;AAEK,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE;;IAC/D,MAAM,mBAAmB,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAA,YAAY,CAAC,IAAI,CAAC,mCAAI,GAAG,IAAI,GAAG,CAAC;IAEpD,OAAO,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC,CAAC;AALW,QAAA,SAAS,aAKpB;AAEW,QAAA,uBAAuB,GAA6B;IAC/D,CAAC,wBAAQ,CAAC,OAAO,CAAC,EAAE,SAAS;IAC7B,CAAC,wBAAQ,CAAC,GAAG,CAAC,EAAE,KAAK;CACtB,CAAC","sourcesContent":["import { Platform } from '@expo/eas-build-job';\n\nconst PLURAL_WORDS: Record<string, string> = {\n entry: 'entries',\n};\n\nexport const pluralize = (count: number, word: string): string => {\n const shouldUsePluralWord = count > 1 || count === 0;\n const pluralWord = PLURAL_WORDS[word] ?? `${word}s`;\n\n return shouldUsePluralWord ? pluralWord : word;\n};\n\nexport const PlatformToProperNounMap: Record<Platform, string> = {\n [Platform.ANDROID]: 'Android',\n [Platform.IOS]: 'iOS',\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"turtleFetch.js","sourceRoot":"","sources":["../../src/utils/turtleFetch.ts"],"names":[],"mappings":";;;;;;AA8BA,kCA2CC;AAzED,4DAAsE;AAGtE,mCAAqC;AAIrC,MAAa,gBAAiB,SAAQ,KAAK;IAEzC,YAAY,OAAe,EAAE,QAAkB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAND,4CAMC;AAED;;;;;;;;;;;;;;GAcG;AACI,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,MAAyB,EACzB,OAOC;IAED,MAAM,EACJ,IAAI,EACJ,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,UAAU,EACnB,MAAM,EACN,eAAe,GAAG,IAAI,EACtB,kBAAkB,GAAG,IAAI,EACzB,GAAG,YAAY,EAChB,GAAG,OAAO,CAAC;IAEZ,MAAM,OAAO,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAE1F,OAAO,MAAM,IAAA,kBAAU,EACrB,KAAK,EAAE,YAAY,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE;YAChC,MAAM;YACN,IAAI;YACJ,OAAO;YACP,GAAG,YAAY;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,kBAAkB,IAAI,YAAY,GAAG,OAAO,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,gBAAgB,CAAC,8BAA8B,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,CACvD,CAAC;AACJ,CAAC","sourcesContent":["import fetch, { Response, RequestInit, HeaderInit } from 'node-fetch';\nimport { bunyan } from '@expo/logger';\n\nimport { retryAsync } from './retry';\n\ntype TurtleFetchMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'PATCH';\n\nexport class TurtleFetchError extends Error {\n readonly response: Response;\n constructor(message: string, response: Response) {\n super(message);\n this.response = response;\n }\n}\n\n/**\n * Wrapper around node-fetch adding some useful features:\n * - retries\n * - json body - if you specify json in options, it will be stringified and content-type will be set to application/json\n * - automatic error throwing - if response is not ok, it will throw an error\n *\n * @param url URL to fetch\n * @param method HTTP method\n * @param options.retries number of retries\n * @param options.json json body\n * @param options.headers headers\n * @param options.shouldThrowOnNotOk if false, it will not throw an error if response is not ok (default: true)\n * @param options other options passed to node-fetch\n * @returns {Promise<Response>}\n */\nexport async function turtleFetch(\n url: string,\n method: TurtleFetchMethod,\n options: Omit<RequestInit, 'body' | 'method'> & {\n retries?: number;\n json?: Record<string, any>;\n headers?: Exclude<HeaderInit, string[][]>;\n shouldThrowOnNotOk?: boolean;\n retryIntervalMs?: number;\n logger?: bunyan;\n }\n): Promise<Response> {\n const {\n json,\n headers: rawHeaders,\n retries: rawRetries,\n logger,\n retryIntervalMs = 1000,\n shouldThrowOnNotOk = true,\n ...otherOptions\n } = options;\n\n const retries = rawRetries ?? (method === 'POST' ? 0 : 2);\n\n const body = JSON.stringify(json);\n const headers = json ? { ...rawHeaders, 'Content-Type': 'application/json' } : rawHeaders;\n\n return await retryAsync(\n async (attemptCount) => {\n const response = await fetch(url, {\n method,\n body,\n headers,\n ...otherOptions,\n });\n const shouldThrow = shouldThrowOnNotOk || attemptCount < retries;\n if (!response.ok && shouldThrow) {\n throw new TurtleFetchError(`Request failed with status ${response.status}`, response);\n }\n return response;\n },\n { retryOptions: { retries, retryIntervalMs }, logger }\n );\n}\n"]}