@expo/build-tools 1.0.272 → 18.0.2

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 (315) 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 +13 -10
  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 +28 -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/readIpaInfo.d.ts +8 -0
  90. package/dist/steps/functions/readIpaInfo.js +111 -0
  91. package/dist/steps/functions/repack.d.ts +1 -1
  92. package/dist/steps/functions/repack.js +25 -19
  93. package/dist/steps/functions/resolveAppleTeamIdFromCredentials.js +1 -2
  94. package/dist/steps/functions/resolveBuildConfig.js +0 -1
  95. package/dist/steps/functions/restoreBuildCache.d.ts +1 -1
  96. package/dist/steps/functions/restoreBuildCache.js +8 -10
  97. package/dist/steps/functions/restoreCache.d.ts +1 -1
  98. package/dist/steps/functions/restoreCache.js +34 -26
  99. package/dist/steps/functions/runFastlane.js +0 -1
  100. package/dist/steps/functions/runGradle.js +2 -3
  101. package/dist/steps/functions/saveBuildCache.d.ts +1 -1
  102. package/dist/steps/functions/saveBuildCache.js +6 -7
  103. package/dist/steps/functions/saveCache.d.ts +1 -1
  104. package/dist/steps/functions/saveCache.js +26 -18
  105. package/dist/steps/functions/sendSlackMessage.js +1 -3
  106. package/dist/steps/functions/startAndroidEmulator.js +5 -7
  107. package/dist/steps/functions/startCuttlefishDevice.js +32 -10
  108. package/dist/steps/functions/startIosSimulator.js +8 -11
  109. package/dist/steps/functions/uploadArtifact.js +4 -6
  110. package/dist/steps/functions/uploadToAsc.d.ts +2 -0
  111. package/dist/steps/functions/uploadToAsc.js +287 -0
  112. package/dist/steps/functions/useNpmToken.js +3 -4
  113. package/dist/steps/utils/android/expoUpdates.js +3 -5
  114. package/dist/steps/utils/android/gradle.d.ts +1 -1
  115. package/dist/steps/utils/android/gradle.js +6 -7
  116. package/dist/steps/utils/android/gradleConfig.js +4 -5
  117. package/dist/steps/utils/cache.js +0 -1
  118. package/dist/steps/utils/expoUpdates.d.ts +1 -1
  119. package/dist/steps/utils/expoUpdates.js +15 -18
  120. package/dist/steps/utils/ios/AscApiClient.d.ts +250 -0
  121. package/dist/steps/utils/ios/AscApiClient.js +299 -0
  122. package/dist/steps/utils/ios/configure.js +4 -5
  123. package/dist/steps/utils/ios/credentials/credentials.js +0 -1
  124. package/dist/steps/utils/ios/credentials/distributionCertificate.js +1 -3
  125. package/dist/steps/utils/ios/credentials/keychain.js +8 -8
  126. package/dist/steps/utils/ios/credentials/manager.js +24 -13
  127. package/dist/steps/utils/ios/credentials/provisioningProfile.js +11 -6
  128. package/dist/steps/utils/ios/expoUpdates.js +4 -7
  129. package/dist/steps/utils/ios/fastlane.d.ts +1 -1
  130. package/dist/steps/utils/ios/fastlane.js +3 -4
  131. package/dist/steps/utils/ios/resolve.js +1 -2
  132. package/dist/steps/utils/ios/tvos.js +1 -3
  133. package/dist/steps/utils/ios/xcpretty.js +11 -7
  134. package/dist/steps/utils/slackMessageDynamicFields.js +0 -1
  135. package/dist/templates/EasBuildConfigureVersionGradle.js +0 -1
  136. package/dist/templates/EasBuildGradle.js +0 -1
  137. package/dist/templates/EasBuildInjectAndroidCredentialsGradle.js +0 -1
  138. package/dist/templates/FastfileResign.js +0 -1
  139. package/dist/templates/GymfileArchive.js +0 -1
  140. package/dist/templates/GymfileSimulator.js +0 -1
  141. package/dist/templates/npmrc.js +0 -1
  142. package/dist/utils/AndroidEmulatorUtils.js +20 -22
  143. package/dist/utils/IosSimulatorUtils.js +9 -11
  144. package/dist/utils/appConfig.js +1 -2
  145. package/dist/utils/artifacts.d.ts +1 -1
  146. package/dist/utils/artifacts.js +7 -8
  147. package/dist/utils/cacheKey.js +21 -12
  148. package/dist/utils/diffFingerprintsAsync.d.ts +1 -1
  149. package/dist/utils/diffFingerprintsAsync.js +0 -1
  150. package/dist/utils/environmentSecrets.js +3 -4
  151. package/dist/utils/expoFingerprintCli.js +5 -6
  152. package/dist/utils/expoUpdates.d.ts +1 -2
  153. package/dist/utils/expoUpdates.js +19 -33
  154. package/dist/utils/expoUpdatesCli.js +20 -11
  155. package/dist/utils/files.js +23 -15
  156. package/dist/utils/findMaestroPathsFlowsToExecuteAsync.js +27 -21
  157. package/dist/utils/fingerprint.js +0 -1
  158. package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.js +0 -1
  159. package/dist/utils/hooks.js +1 -3
  160. package/dist/utils/isModernExpoUpdatesCLIWithRuntimeVersionCommandSupported.d.ts +1 -0
  161. package/dist/utils/isModernExpoUpdatesCLIWithRuntimeVersionCommandSupported.js +14 -0
  162. package/dist/utils/npmrc.js +2 -3
  163. package/dist/utils/outputs.d.ts +1 -1
  164. package/dist/utils/outputs.js +2 -5
  165. package/dist/utils/packageManager.js +22 -14
  166. package/dist/utils/prepareBuildExecutable.js +1 -2
  167. package/dist/utils/processes.js +2 -3
  168. package/dist/utils/project.js +1 -2
  169. package/dist/utils/promiseRetryWithCondition.js +0 -1
  170. package/dist/utils/resolveRuntimeVersionAsync.d.ts +1 -1
  171. package/dist/utils/resolveRuntimeVersionAsync.js +4 -6
  172. package/dist/utils/retry.js +2 -3
  173. package/dist/utils/retryOnDNSFailure.js +0 -1
  174. package/dist/utils/stepMetrics.d.ts +1 -1
  175. package/dist/utils/stepMetrics.js +0 -1
  176. package/dist/utils/strings.js +1 -3
  177. package/dist/utils/turtleFetch.d.ts +1 -1
  178. package/dist/utils/turtleFetch.js +2 -2
  179. package/package.json +27 -22
  180. package/dist/android/credentials.js.map +0 -1
  181. package/dist/android/expoUpdates.js.map +0 -1
  182. package/dist/android/gradle.js.map +0 -1
  183. package/dist/android/gradleConfig.js.map +0 -1
  184. package/dist/buildErrors/buildErrorHandlers.js.map +0 -1
  185. package/dist/buildErrors/detectError.js.map +0 -1
  186. package/dist/buildErrors/errors.types.js.map +0 -1
  187. package/dist/buildErrors/userErrorHandlers.js.map +0 -1
  188. package/dist/builders/android.js.map +0 -1
  189. package/dist/builders/common.js.map +0 -1
  190. package/dist/builders/custom.js.map +0 -1
  191. package/dist/builders/index.js.map +0 -1
  192. package/dist/builders/ios.js.map +0 -1
  193. package/dist/common/eagerBundle.js.map +0 -1
  194. package/dist/common/easBuildInternal.js.map +0 -1
  195. package/dist/common/fastlane.js.map +0 -1
  196. package/dist/common/git.js.map +0 -1
  197. package/dist/common/installDependencies.js.map +0 -1
  198. package/dist/common/prebuild.js.map +0 -1
  199. package/dist/common/projectSources.js.map +0 -1
  200. package/dist/common/setup.js.map +0 -1
  201. package/dist/context.js.map +0 -1
  202. package/dist/customBuildContext.js.map +0 -1
  203. package/dist/gcs/LoggerStream.js.map +0 -1
  204. package/dist/gcs/__unit__/gcs.test.js.map +0 -1
  205. package/dist/gcs/client.js.map +0 -1
  206. package/dist/gcs/retry.js.map +0 -1
  207. package/dist/generic.js.map +0 -1
  208. package/dist/index.js.map +0 -1
  209. package/dist/ios/configure.js.map +0 -1
  210. package/dist/ios/credentials/distributionCertificate.js.map +0 -1
  211. package/dist/ios/credentials/keychain.js.map +0 -1
  212. package/dist/ios/credentials/manager.js.map +0 -1
  213. package/dist/ios/credentials/provisioningProfile.js.map +0 -1
  214. package/dist/ios/expoUpdates.js.map +0 -1
  215. package/dist/ios/fastfile.js.map +0 -1
  216. package/dist/ios/fastlane.js.map +0 -1
  217. package/dist/ios/gymfile.js.map +0 -1
  218. package/dist/ios/pod.js.map +0 -1
  219. package/dist/ios/resign.js.map +0 -1
  220. package/dist/ios/resolve.js.map +0 -1
  221. package/dist/ios/tvos.js.map +0 -1
  222. package/dist/ios/xcodeBuildLogs.js.map +0 -1
  223. package/dist/ios/xcodeEnv.js.map +0 -1
  224. package/dist/ios/xcpretty.js.map +0 -1
  225. package/dist/steps/easFunctionGroups.js.map +0 -1
  226. package/dist/steps/easFunctions.js.map +0 -1
  227. package/dist/steps/functionGroups/build.js.map +0 -1
  228. package/dist/steps/functionGroups/maestroTest.js.map +0 -1
  229. package/dist/steps/functions/calculateEASUpdateRuntimeVersion.js.map +0 -1
  230. package/dist/steps/functions/ccacheStats.js.map +0 -1
  231. package/dist/steps/functions/checkout.js.map +0 -1
  232. package/dist/steps/functions/configureAndroidVersion.js.map +0 -1
  233. package/dist/steps/functions/configureEASUpdateIfInstalled.js.map +0 -1
  234. package/dist/steps/functions/configureIosCredentials.js.map +0 -1
  235. package/dist/steps/functions/configureIosVersion.js.map +0 -1
  236. package/dist/steps/functions/createSubmissionEntity.js.map +0 -1
  237. package/dist/steps/functions/downloadArtifact.js.map +0 -1
  238. package/dist/steps/functions/downloadBuild.js.map +0 -1
  239. package/dist/steps/functions/eagerBundle.js.map +0 -1
  240. package/dist/steps/functions/findAndUploadBuildArtifacts.js.map +0 -1
  241. package/dist/steps/functions/generateGymfileFromTemplate.js.map +0 -1
  242. package/dist/steps/functions/getCredentialsForBuildTriggeredByGitHubIntegration.js.map +0 -1
  243. package/dist/steps/functions/injectAndroidCredentials.js.map +0 -1
  244. package/dist/steps/functions/installMaestro.js.map +0 -1
  245. package/dist/steps/functions/installNodeModules.js.map +0 -1
  246. package/dist/steps/functions/installPods.js.map +0 -1
  247. package/dist/steps/functions/internalMaestroTest.js.map +0 -1
  248. package/dist/steps/functions/prebuild.js.map +0 -1
  249. package/dist/steps/functions/repack.js.map +0 -1
  250. package/dist/steps/functions/resolveAppleTeamIdFromCredentials.js.map +0 -1
  251. package/dist/steps/functions/resolveBuildConfig.js.map +0 -1
  252. package/dist/steps/functions/restoreBuildCache.js.map +0 -1
  253. package/dist/steps/functions/restoreCache.js.map +0 -1
  254. package/dist/steps/functions/runFastlane.js.map +0 -1
  255. package/dist/steps/functions/runGradle.js.map +0 -1
  256. package/dist/steps/functions/saveBuildCache.js.map +0 -1
  257. package/dist/steps/functions/saveCache.js.map +0 -1
  258. package/dist/steps/functions/sendSlackMessage.js.map +0 -1
  259. package/dist/steps/functions/startAndroidEmulator.js.map +0 -1
  260. package/dist/steps/functions/startCuttlefishDevice.js.map +0 -1
  261. package/dist/steps/functions/startIosSimulator.js.map +0 -1
  262. package/dist/steps/functions/uploadArtifact.js.map +0 -1
  263. package/dist/steps/functions/useNpmToken.js.map +0 -1
  264. package/dist/steps/utils/android/expoUpdates.js.map +0 -1
  265. package/dist/steps/utils/android/gradle.js.map +0 -1
  266. package/dist/steps/utils/android/gradleConfig.js.map +0 -1
  267. package/dist/steps/utils/cache.js.map +0 -1
  268. package/dist/steps/utils/expoUpdates.js.map +0 -1
  269. package/dist/steps/utils/ios/configure.js.map +0 -1
  270. package/dist/steps/utils/ios/credentials/credentials.js.map +0 -1
  271. package/dist/steps/utils/ios/credentials/distributionCertificate.js.map +0 -1
  272. package/dist/steps/utils/ios/credentials/keychain.js.map +0 -1
  273. package/dist/steps/utils/ios/credentials/manager.js.map +0 -1
  274. package/dist/steps/utils/ios/credentials/provisioningProfile.js.map +0 -1
  275. package/dist/steps/utils/ios/expoUpdates.js.map +0 -1
  276. package/dist/steps/utils/ios/fastlane.js.map +0 -1
  277. package/dist/steps/utils/ios/resolve.js.map +0 -1
  278. package/dist/steps/utils/ios/tvos.js.map +0 -1
  279. package/dist/steps/utils/ios/xcpretty.js.map +0 -1
  280. package/dist/steps/utils/slackMessageDynamicFields.js.map +0 -1
  281. package/dist/templates/EasBuildConfigureVersionGradle.js.map +0 -1
  282. package/dist/templates/EasBuildGradle.js.map +0 -1
  283. package/dist/templates/EasBuildInjectAndroidCredentialsGradle.js.map +0 -1
  284. package/dist/templates/FastfileResign.js.map +0 -1
  285. package/dist/templates/GymfileArchive.js.map +0 -1
  286. package/dist/templates/GymfileSimulator.js.map +0 -1
  287. package/dist/templates/npmrc.js.map +0 -1
  288. package/dist/utils/AndroidEmulatorUtils.js.map +0 -1
  289. package/dist/utils/IosSimulatorUtils.js.map +0 -1
  290. package/dist/utils/appConfig.js.map +0 -1
  291. package/dist/utils/artifacts.js.map +0 -1
  292. package/dist/utils/cacheKey.js.map +0 -1
  293. package/dist/utils/diffFingerprintsAsync.js.map +0 -1
  294. package/dist/utils/environmentSecrets.js.map +0 -1
  295. package/dist/utils/expoFingerprintCli.js.map +0 -1
  296. package/dist/utils/expoUpdates.js.map +0 -1
  297. package/dist/utils/expoUpdatesCli.js.map +0 -1
  298. package/dist/utils/files.js.map +0 -1
  299. package/dist/utils/findMaestroPathsFlowsToExecuteAsync.js.map +0 -1
  300. package/dist/utils/fingerprint.js.map +0 -1
  301. package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.js.map +0 -1
  302. package/dist/utils/hooks.js.map +0 -1
  303. package/dist/utils/npmrc.js.map +0 -1
  304. package/dist/utils/outputs.js.map +0 -1
  305. package/dist/utils/packageManager.js.map +0 -1
  306. package/dist/utils/prepareBuildExecutable.js.map +0 -1
  307. package/dist/utils/processes.js.map +0 -1
  308. package/dist/utils/project.js.map +0 -1
  309. package/dist/utils/promiseRetryWithCondition.js.map +0 -1
  310. package/dist/utils/resolveRuntimeVersionAsync.js.map +0 -1
  311. package/dist/utils/retry.js.map +0 -1
  312. package/dist/utils/retryOnDNSFailure.js.map +0 -1
  313. package/dist/utils/stepMetrics.js.map +0 -1
  314. package/dist/utils/strings.js.map +0 -1
  315. package/dist/utils/turtleFetch.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"installMaestro.js","sourceRoot":"","sources":["../../../src/steps/functions/installMaestro.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport {\n BuildFunction,\n BuildRuntimePlatform,\n BuildStepEnv,\n BuildStepGlobalContext,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { bunyan } from '@expo/logger';\nimport { asyncResult } from '@expo/results';\n\nexport function createInstallMaestroBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_maestro',\n name: 'Install Maestro',\n __metricsId: 'eas/install_maestro',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'maestro_version',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'maestro_version',\n required: false,\n }),\n ],\n fn: async ({ logger, global }, { inputs, env, outputs }) => {\n const requestedMaestroVersion = inputs.maestro_version.value as string | undefined;\n const { value: currentMaestroVersion } = await asyncResult(getMaestroVersion({ env }));\n\n // When not running in EAS Build VM, do not modify local environment.\n if (env.EAS_BUILD_RUNNER !== 'eas-build') {\n const currentIsJavaInstalled = await isJavaInstalled({ env });\n const currentIsIdbInstalled = await isIdbInstalled({ env });\n\n if (!currentIsJavaInstalled) {\n logger.warn(\n 'It seems Java is not installed. It is required to run Maestro. If the job fails, this may be the reason.'\n );\n logger.info('');\n }\n\n if (!currentIsIdbInstalled) {\n logger.warn(\n 'It seems IDB is not installed. Maestro requires it to run flows on iOS Simulator. If the job fails, this may be the reason.'\n );\n logger.info('');\n }\n\n if (!currentMaestroVersion) {\n logger.warn(\n 'It seems Maestro is not installed. Please install Maestro manually and rerun the job.'\n );\n logger.info('');\n }\n\n // Guide is helpful in these two cases, it doesn't mention Java.\n if (!currentIsIdbInstalled || !currentMaestroVersion) {\n logger.warn(\n 'For more info, check out Maestro installation guide: https://maestro.mobile.dev/getting-started/installing-maestro'\n );\n }\n\n if (currentMaestroVersion) {\n outputs.maestro_version.set(currentMaestroVersion);\n logger.info(`Maestro ${currentMaestroVersion} is ready.`);\n }\n\n return;\n }\n\n if (!(await isJavaInstalled({ env }))) {\n if (global.runtimePlatform === BuildRuntimePlatform.DARWIN) {\n logger.info('Installing Java');\n await installJavaFromGcs({ logger, env });\n } else {\n // We expect Java to be pre-installed on Linux images,\n // so this should only happen when running this step locally.\n // We don't need to support installing Java on local computers.\n throw new Error('Please install Java manually and rerun the job.');\n }\n }\n\n // IDB is only a requirement on macOS.\n if (\n global.runtimePlatform === BuildRuntimePlatform.DARWIN &&\n !(await isIdbInstalled({ env }))\n ) {\n logger.info('Installing IDB');\n await installIdbFromBrew({ logger, env });\n }\n\n // Skip installing if the input sets a specific Maestro version to install\n // and it is already installed which happens when developing on a local computer.\n if (\n !currentMaestroVersion ||\n (requestedMaestroVersion && requestedMaestroVersion !== currentMaestroVersion)\n ) {\n await installMaestro({\n version: requestedMaestroVersion,\n global,\n logger,\n env,\n });\n }\n\n const maestroVersionResult = await asyncResult(getMaestroVersion({ env }));\n if (!maestroVersionResult.ok) {\n logger.error(maestroVersionResult.reason, 'Failed to get Maestro version.');\n\n throw new Error('Failed to ensure Maestro is installed.');\n }\n\n logger.info(`Maestro ${maestroVersionResult.value} is ready.`);\n outputs.maestro_version.set(maestroVersionResult.value);\n },\n });\n}\n\nasync function getMaestroVersion({ env }: { env: BuildStepEnv }): Promise<string> {\n const maestroVersion = await spawn('maestro', ['--version'], { stdio: 'pipe', env });\n return maestroVersion.stdout.trim();\n}\n\nasync function installMaestro({\n global,\n version,\n logger,\n env,\n}: {\n version?: string;\n logger: bunyan;\n global: BuildStepGlobalContext;\n env: BuildStepEnv;\n}): Promise<void> {\n logger.info('Fetching install script');\n const tempDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'install_maestro'));\n try {\n const installMaestroScriptResponse = await fetch('https://get.maestro.mobile.dev');\n const installMaestroScript = await installMaestroScriptResponse.text();\n const installMaestroScriptFilePath = path.join(tempDirectory, 'install_maestro.sh');\n await fs.promises.writeFile(installMaestroScriptFilePath, installMaestroScript, {\n mode: 0o777,\n });\n logger.info('Installing Maestro');\n assert(\n env.HOME,\n 'Failed to infer directory to install Maestro in: $HOME environment variable is empty.'\n );\n const maestroDir = path.join(env.HOME, '.maestro');\n await spawn(installMaestroScriptFilePath, [], {\n logger,\n env: {\n ...env,\n MAESTRO_DIR: maestroDir,\n // _Not_ providing MAESTRO_VERSION installs latest.\n // MAESTRO_VERSION is used to interpolate the download URL like github.com/releases/cli-$MAESTRO_VERSION...\n MAESTRO_VERSION: version === 'latest' ? undefined : version,\n },\n });\n // That's where Maestro installs binary as of February 2024\n // I suspect/hope they don't change the location.\n const maestroBinDir = path.join(maestroDir, 'bin');\n global.updateEnv({\n ...global.env,\n PATH: `${global.env.PATH}:${maestroBinDir}`,\n });\n env.PATH = `${env.PATH}:${maestroBinDir}`;\n process.env.PATH = `${process.env.PATH}:${maestroBinDir}`;\n } finally {\n await fs.promises.rm(tempDirectory, { force: true, recursive: true });\n }\n}\n\nasync function isIdbInstalled({ env }: { env: BuildStepEnv }): Promise<boolean> {\n try {\n await spawn('idb', ['-h'], { ignoreStdio: true, env });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function installIdbFromBrew({\n logger,\n env,\n}: {\n logger: bunyan;\n env: BuildStepEnv;\n}): Promise<void> {\n // Unfortunately our Mac images sometimes have two Homebrew\n // installations. We should use the ARM64 one, located in /opt/homebrew.\n const brewPath = '/opt/homebrew/bin/brew';\n const localEnv = {\n ...env,\n HOMEBREW_NO_AUTO_UPDATE: '1',\n HOMEBREW_NO_INSTALL_CLEANUP: '1',\n };\n\n await spawn(brewPath, ['tap', 'facebook/fb'], {\n env: localEnv,\n logger,\n });\n await spawn(brewPath, ['install', 'idb-companion'], {\n env: localEnv,\n logger,\n });\n}\n\nasync function isJavaInstalled({ env }: { env: BuildStepEnv }): Promise<boolean> {\n try {\n await spawn('java', ['-version'], { ignoreStdio: true, env });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Installs Java 17 from a file uploaded manually to GCS as cache.\n * Should not be run outside of EAS Build VMs not to break users' environments.\n */\nasync function installJavaFromGcs({\n logger,\n env,\n}: {\n logger: bunyan;\n env: BuildStepEnv;\n}): Promise<void> {\n const downloadUrl =\n 'https://storage.googleapis.com/turtle-v2/zulu17.60.17-ca-jdk17.0.16-macosx_aarch64.dmg';\n const filename = path.basename(downloadUrl);\n const tempDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'install_java'));\n const installerPath = path.join(tempDirectory, filename);\n const installerMountDirectory = path.join(tempDirectory, 'mountpoint');\n try {\n logger.info('Downloading Java installer');\n // This is simpler than piping body into a write stream with node-fetch.\n await spawn('curl', ['--output', installerPath, downloadUrl], { env });\n\n await fs.promises.mkdir(installerMountDirectory);\n logger.info('Mounting Java installer');\n await spawn(\n 'hdiutil',\n ['attach', installerPath, '-noverify', '-mountpoint', installerMountDirectory],\n { env }\n );\n\n logger.info('Installing Java');\n await spawn(\n 'sudo',\n [\n 'installer',\n '-pkg',\n path.join(installerMountDirectory, 'Double-Click to Install Azul Zulu JDK 17.pkg'),\n '-target',\n '/',\n ],\n { env }\n );\n } finally {\n try {\n // We need to unmount to remove, otherwise we get \"resource busy\"\n await spawn('hdiutil', ['detach', installerMountDirectory], { env });\n } catch {}\n\n await fs.promises.rm(tempDirectory, { force: true, recursive: true });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"installNodeModules.js","sourceRoot":"","sources":["../../../src/steps/functions/installNodeModules.ts"],"names":[],"mappings":";;;;;AAaA,sFAUC;AAED,gDAqDC;AA9ED,gDAAwB;AAExB,uCAA4E;AAE5E,+DAKoC;AACpC,0EAA4E;AAC5E,iDAAsD;AAEtD,SAAgB,qCAAqC;IACnD,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,0BAA0B;QACvC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7B,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,OAAyB,EACzB,GAAiB;;IAEjB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAA,sCAAqB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAErE,IAAI,cAAc,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,mCAAmC,GAAG,cAAI,CAAC,QAAQ,CACvD,OAAO,CAAC,MAAM,CAAC,sBAAsB,EACrC,OAAO,CAAC,gBAAgB,CACzB,CAAC;QACF,MAAM,CAAC,IAAI,CACT,qBAAqB,mCAAmC,UAAU,cAAc,YAAY,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,WAAW,GAAG,IAAA,yBAAe,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACT,gJAAgJ,CACjJ,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GACf,MAAA,MAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,0CAAE,UAAU,mCACjD,IAAA,iDAAgC,EAAC;QAC/B,WAAW;QACX,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IAEL,MAAM,kBAAkB,GACtB,MAAA,MAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,0CAAE,kBAAkB,mCACzD,IAAA,iDAAgC,EAAC;QAC/B,WAAW;QACX,WAAW,EAAE,cAAc;KAC5B,CAAC,CAAC;IAEL,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,8CAAwB,EAAC;QACtD,cAAc;QACd,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,cAAc;QACnB,iBAAiB,EAAE,IAAA,wCAAuB,EAAC;YACzC,GAAG;YACH,UAAU,EAAE,WAAW;YACvB,kBAAkB;SACnB,CAAC;KACH,CAAC,CAAC;IACH,MAAM,YAAY,CAAC;AACrB,CAAC","sourcesContent":["import path from 'path';\n\nimport { BuildFunction, BuildStepEnv, BuildStepContext } from '@expo/steps';\n\nimport {\n findPackagerRootDir,\n getPackageVersionFromPackageJson,\n resolvePackageManager,\n shouldUseFrozenLockfile,\n} from '../../utils/packageManager';\nimport { installDependenciesAsync } from '../../common/installDependencies';\nimport { readPackageJson } from '../../utils/project';\n\nexport function createInstallNodeModulesBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_node_modules',\n name: 'Install node modules',\n __metricsId: 'eas/install_node_modules',\n fn: async (stepCtx, { env }) => {\n await installNodeModules(stepCtx, env);\n },\n });\n}\n\nexport async function installNodeModules(\n stepCtx: BuildStepContext,\n env: BuildStepEnv\n): Promise<void> {\n const { logger } = stepCtx;\n const packageManager = resolvePackageManager(stepCtx.workingDirectory);\n const packagerRunDir = findPackagerRootDir(stepCtx.workingDirectory);\n\n if (packagerRunDir !== stepCtx.workingDirectory) {\n const relativeReactNativeProjectDirectory = path.relative(\n stepCtx.global.projectTargetDirectory,\n stepCtx.workingDirectory\n );\n logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${packageManager} workspace`\n );\n }\n\n let packageJson = {};\n try {\n packageJson = readPackageJson(stepCtx.workingDirectory);\n } catch {\n logger.info(\n `Failed to read package.json, defaulting to installing dependencies with a frozen lockfile. You can use EAS_NO_FROZEN_LOCKFILE=1 to disable it.`\n );\n }\n\n const expoVersion =\n stepCtx.global.staticContext.metadata?.sdkVersion ??\n getPackageVersionFromPackageJson({\n packageJson,\n packageName: 'expo',\n });\n\n const reactNativeVersion =\n stepCtx.global.staticContext.metadata?.reactNativeVersion ??\n getPackageVersionFromPackageJson({\n packageJson,\n packageName: 'react-native',\n });\n\n const { spawnPromise } = await installDependenciesAsync({\n packageManager,\n env,\n logger: stepCtx.logger,\n cwd: packagerRunDir,\n useFrozenLockfile: shouldUseFrozenLockfile({\n env,\n sdkVersion: expoVersion,\n reactNativeVersion,\n }),\n });\n await spawnPromise;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"installPods.js","sourceRoot":"","sources":["../../../src/steps/functions/installPods.ts"],"names":[],"mappings":";;;;;AAGA,wEAgCC;AAnCD,uCAA4C;AAC5C,sEAAuC;AAEvC,SAAgB,8BAA8B;IAC5C,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,kBAAkB;QAC/B,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC9B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,uBAAuB,GAC3B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEhF,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,WAAW,EAAE,GAAG,uBAAuB,CAAC,EAAE;gBAC1E,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG,EAAE;oBACH,GAAG,GAAG;oBACN,IAAI,EAAE,aAAa;iBACpB;gBACD,GAAG,EAAE,QAAQ,CAAC,gBAAgB;gBAC9B,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;oBACjC,IACE,CAAC,IAAI;wBACL,2EAA2E,CAAC,IAAI,CAAC,IAAI,CAAC,EACtF,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { BuildFunction } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\n\nexport function createInstallPodsBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_pods',\n name: 'Install Pods',\n __metricsId: 'eas/install_pods',\n fn: async (stepsCtx, { env }) => {\n stepsCtx.logger.info('Installing pods');\n const verboseFlag = stepsCtx.global.env['EAS_VERBOSE'] === '1' ? ['--verbose'] : [];\n const cocoapodsDeploymentFlag =\n stepsCtx.global.env['POD_INSTALL_DEPLOYMENT'] === '1' ? ['--deployment'] : [];\n\n await spawn('pod', ['install', ...verboseFlag, ...cocoapodsDeploymentFlag], {\n logger: stepsCtx.logger,\n env: {\n ...env,\n LANG: 'en_US.UTF-8',\n },\n cwd: stepsCtx.workingDirectory,\n lineTransformer: (line?: string) => {\n if (\n !line ||\n /\\[!\\] '[\\w-]+' uses the unencrypted 'http' protocol to transfer the Pod\\./.exec(line)\n ) {\n return null;\n } else {\n return line;\n }\n },\n });\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"internalMaestroTest.js","sourceRoot":"","sources":["../../../src/steps/functions/internalMaestroTest.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { setTimeout } from 'node:timers/promises';\n\nimport {\n BuildFunction,\n BuildStepEnv,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n spawnAsync,\n} from '@expo/steps';\nimport { z } from 'zod';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { PipeMode, bunyan } from '@expo/logger';\nimport { Result, asyncResult, result } from '@expo/results';\nimport { GenericArtifactType } from '@expo/eas-build-job';\n\nimport { CustomBuildContext } from '../../customBuildContext';\nimport { IosSimulatorName, IosSimulatorUtils } from '../../utils/IosSimulatorUtils';\nimport {\n AndroidDeviceSerialId,\n AndroidEmulatorUtils,\n AndroidVirtualDeviceName,\n} from '../../utils/AndroidEmulatorUtils';\nimport { PlatformToProperNounMap } from '../../utils/strings';\nimport { findMaestroPathsFlowsToExecuteAsync } from '../../utils/findMaestroPathsFlowsToExecuteAsync';\n\nexport function createInternalEasMaestroTestFunction(ctx: CustomBuildContext): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: '__maestro_test',\n __metricsId: 'eas/__maestro_test',\n inputProviders: [\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n id: 'platform',\n required: true,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.JSON,\n id: 'flow_paths',\n required: true,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n id: 'retries',\n defaultValue: 1,\n required: false,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n id: 'include_tags',\n required: false,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n id: 'exclude_tags',\n required: false,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n id: 'shards',\n defaultValue: 1,\n required: false,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n id: 'output_format',\n required: false,\n }),\n BuildStepInput.createProvider({\n allowedValueTypeName: BuildStepInputValueTypeName.BOOLEAN,\n id: 'record_screen',\n defaultValue: false,\n required: false,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'test_reports_artifact_id',\n required: false,\n }),\n ],\n fn: async (stepCtx, { inputs: _inputs, env, outputs }) => {\n // inputs come in form of { value: unknown }. Here we parse them into a typed and validated object.\n const {\n platform,\n flow_paths,\n retries,\n include_tags,\n exclude_tags,\n shards,\n output_format,\n record_screen,\n } = z\n .object({\n platform: z.enum(['ios', 'android']),\n flow_paths: z.array(z.string()),\n retries: z.number().default(1),\n include_tags: z.string().optional(),\n exclude_tags: z.string().optional(),\n shards: z.number().default(1),\n output_format: z.string().optional(),\n record_screen: z.boolean().default(false),\n })\n .parse(\n Object.fromEntries(Object.entries(_inputs).map(([key, value]) => [key, value.value]))\n );\n\n const flowPathsToExecute: string[] = [];\n for (const flowPath of flow_paths) {\n const flowPaths = await findMaestroPathsFlowsToExecuteAsync({\n workingDirectory: stepCtx.workingDirectory,\n flowPath,\n logger: stepCtx.logger,\n includeTags: include_tags ? include_tags.split(',') : undefined,\n excludeTags: exclude_tags ? exclude_tags.split(',') : undefined,\n });\n if (flowPaths.length === 0) {\n stepCtx.logger.warn(`No flows to execute found in \"${flowPath}\".`);\n continue;\n }\n stepCtx.logger.info(\n `Marking for execution:\\n- ${flowPaths.map((flowPath) => path.relative(stepCtx.workingDirectory, flowPath)).join('\\n- ')}`\n );\n stepCtx.logger.info('');\n flowPathsToExecute.push(...flowPaths);\n }\n\n // TODO: Add support for shards. (Shouldn't be too difficult.)\n if (shards > 1) {\n stepCtx.logger.warn(\n 'Sharding support has been temporarily disabled. Running tests on a single shard.'\n );\n }\n\n // eas/__maestro_test does not start devices, it expects a single device to be already running\n // and configured with the app. Here we find the booted device and stop it.\n\n let sourceDeviceIdentifier: IosSimulatorName | AndroidVirtualDeviceName;\n\n switch (platform) {\n case 'ios': {\n const bootedDevices = await IosSimulatorUtils.getAvailableDevicesAsync({\n env,\n filter: 'booted',\n });\n if (bootedDevices.length === 0) {\n throw new Error('No booted iOS Simulator found.');\n } else if (bootedDevices.length > 1) {\n throw new Error('Multiple booted iOS Simulators found.');\n }\n\n const device = bootedDevices[0];\n stepCtx.logger.info(`Running tests on iOS Simulator: ${device.name}.`);\n\n stepCtx.logger.info(`Preparing Simulator for tests...`);\n await spawnAsync('xcrun', ['simctl', 'shutdown', device.udid], {\n logger: stepCtx.logger,\n stdio: 'pipe',\n });\n\n sourceDeviceIdentifier = device.name;\n break;\n }\n case 'android': {\n const connectedDevices = await AndroidEmulatorUtils.getAttachedDevicesAsync({ env });\n if (connectedDevices.length === 0) {\n throw new Error('No booted Android Emulator found.');\n } else if (connectedDevices.length > 1) {\n throw new Error('Multiple booted Android Emulators found.');\n }\n\n const { serialId } = connectedDevices[0];\n const adbEmuAvdNameResult = await spawn('adb', ['-s', serialId, 'emu', 'avd', 'name'], {\n mode: PipeMode.COMBINED,\n env,\n });\n const avdName = adbEmuAvdNameResult.stdout\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')[0] as AndroidVirtualDeviceName;\n stepCtx.logger.info(`Running tests on Android Emulator: ${avdName}.`);\n\n stepCtx.logger.info(`Preparing Emulator for tests...`);\n await spawnAsync('adb', ['-s', serialId, 'emu', 'kill'], {\n stdio: 'pipe',\n });\n // Waiting for emulator to get killed, see ANDROID_EMULATOR_WAIT_TIME_BEFORE_KILL.\n await setTimeout(1000);\n\n sourceDeviceIdentifier = avdName;\n break;\n }\n }\n\n // During tests we generate reports and device logs. We store them in temporary directories\n // and upload them once all tests are done. When a test is retried, new reports overwrite\n // the old ones. The files are named \"flow-${index}\" for easier identification.\n const maestroReportsDir = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'maestro-reports-')\n );\n const deviceLogsDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'device-logs-'));\n\n const failedFlows: string[] = [];\n\n for (const [flowIndex, flowPath] of flowPathsToExecute.entries()) {\n stepCtx.logger.info('');\n\n // If output_format is empty or noop, we won't use this.\n const outputPath = path.join(\n maestroReportsDir,\n [\n `${output_format + '-' ?? ''}report-flow-${flowIndex + 1}`,\n MaestroOutputFormatToExtensionMap[output_format ?? 'noop'],\n ]\n .filter(Boolean)\n .join('.')\n );\n\n for (let attemptCount = 0; attemptCount < retries; attemptCount++) {\n const localDeviceName = `eas-simulator-${flowIndex}-${attemptCount}` as\n | IosSimulatorName\n | AndroidVirtualDeviceName;\n\n // If the test passes, but the recording fails, we don't want to make the test fail,\n // so we return two separate results.\n const {\n fnResult: { fnResult, recordingResult },\n logsResult,\n } = await withCleanDeviceAsync({\n platform,\n sourceDeviceIdentifier,\n localDeviceName,\n env,\n logger: stepCtx.logger,\n fn: async ({ deviceIdentifier }) => {\n return await maybeWithScreenRecordingAsync({\n shouldRecord: record_screen,\n platform,\n deviceIdentifier,\n env,\n logger: stepCtx.logger,\n fn: async () => {\n stepCtx.logger.info('');\n\n const [command, ...args] = getMaestroTestCommand({\n flow_path: flowPath,\n output_format,\n output_path: outputPath,\n });\n\n try {\n await spawnAsync(command, args, {\n logger: stepCtx.logger,\n cwd: stepCtx.workingDirectory,\n env,\n stdio: 'pipe',\n });\n } finally {\n stepCtx.logger.info('');\n }\n },\n });\n },\n });\n\n // Move device logs to the device logs directory.\n if (logsResult?.ok) {\n try {\n const extension = path.extname(logsResult.value.outputPath);\n const destinationPath = path.join(deviceLogsDir, `flow-${flowIndex}${extension}`);\n\n await fs.promises.rm(destinationPath, {\n force: true,\n recursive: true,\n });\n await fs.promises.rename(logsResult.value.outputPath, destinationPath);\n } catch (err) {\n stepCtx.logger.warn({ err }, 'Failed to prepare device logs for upload.');\n }\n } else if (logsResult?.reason) {\n stepCtx.logger.error({ err: logsResult.reason }, 'Failed to collect device logs.');\n }\n\n const isLastAttempt = fnResult.ok || attemptCount === retries - 1;\n if (isLastAttempt && recordingResult.value) {\n try {\n await ctx.runtimeApi.uploadArtifact({\n logger: stepCtx.logger,\n artifact: {\n // TODO(sjchmiela): Add metadata to artifacts so we don't need to encode flow path and attempt in the name.\n name: `Screen Recording (${flowIndex}-${path.basename(flowPath, path.extname(flowPath))})`,\n paths: [recordingResult.value],\n type: GenericArtifactType.OTHER,\n },\n });\n } catch (err) {\n stepCtx.logger.warn({ err }, 'Failed to upload screen recording.');\n }\n }\n\n if (fnResult.ok) {\n stepCtx.logger.info(`Test passed.`);\n // Break out of the retry loop.\n break;\n }\n\n if (attemptCount < retries - 1) {\n stepCtx.logger.info(`Retrying test...`);\n stepCtx.logger.info('');\n continue;\n }\n\n // fnResult.reason is not super interesting, but it does print out the full command so we can keep it for debugging purposes.\n stepCtx.logger.error({ err: fnResult.reason }, 'Test errored.');\n failedFlows.push(flowPath);\n }\n }\n\n stepCtx.logger.info('');\n\n // When all tests are done, we upload the reports and device logs.\n const generatedMaestroReports = await fs.promises.readdir(maestroReportsDir);\n if (generatedMaestroReports.length === 0) {\n stepCtx.logger.warn('No reports were generated.');\n } else {\n stepCtx.logger.info(`Uploading reports...`);\n try {\n const { artifactId } = await ctx.runtimeApi.uploadArtifact({\n logger: stepCtx.logger,\n artifact: {\n name: `${PlatformToProperNounMap[platform]} Maestro Test Reports (${output_format})`,\n paths: [maestroReportsDir],\n type: GenericArtifactType.OTHER,\n },\n });\n if (artifactId) {\n outputs.test_reports_artifact_id.set(artifactId);\n }\n } catch (err) {\n stepCtx.logger.error({ err }, 'Failed to upload reports.');\n }\n }\n\n const generatedDeviceLogs = await fs.promises.readdir(deviceLogsDir);\n if (generatedDeviceLogs.length === 0) {\n stepCtx.logger.warn('No device logs were successfully collected.');\n } else {\n stepCtx.logger.info(`Uploading device logs...`);\n try {\n await ctx.runtimeApi.uploadArtifact({\n logger: stepCtx.logger,\n artifact: {\n name: `Maestro Test Device Logs`,\n paths: [deviceLogsDir],\n type: GenericArtifactType.OTHER,\n },\n });\n } catch (err) {\n stepCtx.logger.error({ err }, 'Failed to upload device logs.');\n }\n }\n\n stepCtx.logger.info('');\n\n // If any tests failed, we throw an error to mark the step as failed.\n if (failedFlows.length > 0) {\n throw new Error(\n `Some Maestro tests failed:\\n- ${failedFlows\n .map((flowPath) => path.relative(stepCtx.workingDirectory, flowPath))\n .join('\\n- ')}`\n );\n } else {\n stepCtx.logger.info('All Maestro tests passed.');\n }\n },\n });\n}\n\nexport function getMaestroTestCommand(params: {\n flow_path: string;\n output_format: string | undefined;\n /** Unused if `output_format` is undefined */\n output_path: string;\n}): [command: string, ...args: string[]] {\n let outputFormatFlags: string[] = [];\n if (params.output_format) {\n outputFormatFlags = [`--format`, params.output_format, `--output`, params.output_path];\n }\n\n return ['maestro', 'test', ...outputFormatFlags, params.flow_path] as [\n command: string,\n ...args: string[],\n ];\n}\n\nconst MaestroOutputFormatToExtensionMap: Record<string, string | undefined> = {\n junit: 'xml',\n html: 'html',\n};\n\nasync function withCleanDeviceAsync<TResult>({\n platform,\n sourceDeviceIdentifier,\n localDeviceName,\n env,\n logger,\n fn,\n}: {\n env: BuildStepEnv;\n logger: bunyan;\n platform: 'ios' | 'android';\n sourceDeviceIdentifier: IosSimulatorName | AndroidVirtualDeviceName;\n localDeviceName: IosSimulatorName | AndroidVirtualDeviceName;\n fn: ({\n deviceIdentifier,\n }: {\n deviceIdentifier: IosSimulatorName | AndroidDeviceSerialId;\n }) => Promise<TResult>;\n}): Promise<{ fnResult: TResult; logsResult: Result<{ outputPath: string }> | null }> {\n // Clone and start the device\n\n let localDeviceIdentifier: IosSimulatorName | AndroidDeviceSerialId;\n\n switch (platform) {\n case 'ios': {\n logger.info(`Cloning iOS Simulator ${sourceDeviceIdentifier} to ${localDeviceName}...`);\n await IosSimulatorUtils.cloneAsync({\n sourceDeviceIdentifier: sourceDeviceIdentifier as IosSimulatorName,\n destinationDeviceName: localDeviceName as IosSimulatorName,\n env,\n });\n logger.info(`Starting iOS Simulator ${localDeviceName}...`);\n const { udid } = await IosSimulatorUtils.startAsync({\n deviceIdentifier: localDeviceName as IosSimulatorName,\n env,\n });\n logger.info(`Waiting for iOS Simulator ${localDeviceName} to be ready...`);\n await IosSimulatorUtils.waitForReadyAsync({\n udid,\n env,\n });\n localDeviceIdentifier = localDeviceName as IosSimulatorName;\n break;\n }\n case 'android': {\n logger.info(`Cloning Android Emulator ${sourceDeviceIdentifier} to ${localDeviceName}...`);\n await AndroidEmulatorUtils.cloneAsync({\n sourceDeviceName: sourceDeviceIdentifier as AndroidVirtualDeviceName,\n destinationDeviceName: localDeviceName as AndroidVirtualDeviceName,\n env,\n logger,\n });\n logger.info(`Starting Android Emulator ${localDeviceName}...`);\n const { serialId } = await AndroidEmulatorUtils.startAsync({\n deviceName: localDeviceName as AndroidVirtualDeviceName,\n env,\n });\n logger.info(`Waiting for Android Emulator ${localDeviceName} to be ready...`);\n await AndroidEmulatorUtils.waitForReadyAsync({\n serialId,\n env,\n });\n localDeviceIdentifier = serialId;\n break;\n }\n }\n\n // Run the function\n\n const fnResult = await asyncResult(fn({ deviceIdentifier: localDeviceIdentifier }));\n\n // Stop the device\n\n let logsResult: Result<{ outputPath: string }> | null = null;\n\n try {\n switch (platform) {\n case 'ios': {\n logger.info(`Collecting logs from ${localDeviceName}...`);\n logsResult = await asyncResult(\n IosSimulatorUtils.collectLogsAsync({\n deviceIdentifier: localDeviceIdentifier as IosSimulatorName,\n env,\n })\n );\n\n logger.info(`Cleaning up ${localDeviceName}...`);\n await IosSimulatorUtils.deleteAsync({\n deviceIdentifier: localDeviceIdentifier as IosSimulatorName,\n env,\n });\n break;\n }\n case 'android': {\n logger.info(`Collecting logs from ${localDeviceName}...`);\n logsResult = await asyncResult(\n AndroidEmulatorUtils.collectLogsAsync({\n serialId: localDeviceIdentifier as AndroidDeviceSerialId,\n env,\n })\n );\n\n logger.info(`Cleaning up ${localDeviceName}...`);\n await AndroidEmulatorUtils.deleteAsync({\n serialId: localDeviceIdentifier as AndroidDeviceSerialId,\n env,\n });\n break;\n }\n }\n } catch (err) {\n logger.error(`Error cleaning up device: ${err}`);\n }\n\n return { fnResult: fnResult.enforceValue(), logsResult };\n}\n\n/** Runs provided `fn` function, optionally wrapping it with starting and stopping screen recording. */\nasync function maybeWithScreenRecordingAsync<TResult>({\n shouldRecord,\n platform,\n deviceIdentifier,\n env,\n logger,\n fn,\n}: {\n // As weird as it is, it's more convenient to have this function like `maybeWith...`\n // than \"withScreenRecordingAsync\" and `withScreenRecordingAsync(fn)` vs `fn` in the caller.\n shouldRecord: boolean;\n platform: 'ios' | 'android';\n deviceIdentifier: IosSimulatorName | AndroidDeviceSerialId;\n env: BuildStepEnv;\n logger: bunyan;\n fn: () => Promise<TResult>;\n}): Promise<{ fnResult: Result<TResult>; recordingResult: Result<string | null> }> {\n if (!shouldRecord) {\n return { fnResult: await asyncResult(fn()), recordingResult: result(null) };\n }\n\n let recordingResult: Result<{\n recordingSpawn: SpawnPromise<SpawnResult>;\n outputPath?: string;\n }>;\n\n // Start screen recording\n\n logger.info(`Starting screen recording on ${deviceIdentifier}...`);\n\n switch (platform) {\n case 'ios': {\n recordingResult = await asyncResult(\n IosSimulatorUtils.startScreenRecordingAsync({\n deviceIdentifier: deviceIdentifier as IosSimulatorName,\n env,\n })\n );\n break;\n }\n case 'android': {\n recordingResult = await asyncResult(\n AndroidEmulatorUtils.startScreenRecordingAsync({\n serialId: deviceIdentifier as AndroidDeviceSerialId,\n env,\n })\n );\n break;\n }\n }\n\n if (!recordingResult.ok) {\n logger.warn('Failed to start screen recording.', recordingResult.reason);\n }\n\n // Run the function\n\n const fnResult = await asyncResult(fn());\n\n // If recording failed there's nothing to stop, so we return the results\n\n if (!recordingResult.ok) {\n return { fnResult, recordingResult: result(recordingResult.reason) };\n }\n\n // If recording started, finish it\n\n try {\n logger.info(`Stopping screen recording on ${deviceIdentifier}...`);\n\n switch (platform) {\n case 'ios': {\n await IosSimulatorUtils.stopScreenRecordingAsync({\n recordingSpawn: recordingResult.value.recordingSpawn,\n });\n return {\n fnResult,\n // We know outputPath is defined, because startIosScreenRecording() should have filled it.\n recordingResult: result(recordingResult.value.outputPath!),\n };\n }\n case 'android': {\n const { outputPath } = await AndroidEmulatorUtils.stopScreenRecordingAsync({\n serialId: deviceIdentifier as AndroidDeviceSerialId,\n recordingSpawn: recordingResult.value.recordingSpawn,\n env,\n });\n return { fnResult, recordingResult: result(outputPath) };\n }\n }\n } catch (err) {\n logger.warn('Failed to stop screen recording.', err);\n\n return { fnResult, recordingResult: result(err as Error) };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../../src/steps/functions/prebuild.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from '@expo/config';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\n\nimport { PackageManager, resolvePackageManager } from '../../utils/packageManager';\n\nimport { installNodeModules } from './installNodeModules';\n\nexport function createPrebuildBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'prebuild',\n name: 'Prebuild',\n __metricsId: 'eas/prebuild',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'clean',\n defaultValue: false,\n allowedValueTypeName: BuildStepInputValueTypeName.BOOLEAN,\n required: true,\n }),\n BuildStepInput.createProvider({\n id: 'apple_team_id',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: false,\n }),\n BuildStepInput.createProvider({\n id: 'platform',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: false,\n }),\n ],\n fn: async (stepCtx, { inputs, env }) => {\n const { logger } = stepCtx;\n const appleTeamId = inputs.apple_team_id.value as string | undefined;\n const packageManager = resolvePackageManager(stepCtx.workingDirectory);\n const defaultPlatform = process.platform === 'darwin' ? 'ios' : 'android';\n\n const job = stepCtx.global.staticContext.job;\n const prebuildCommandArgs = getPrebuildCommandArgs({\n platform: job.platform ?? defaultPlatform,\n customPrebuildCommand: job.platform ? job.experimental?.prebuildCommand : undefined,\n clean: inputs.clean.value as boolean,\n });\n const argsWithExpo = ['expo', ...prebuildCommandArgs];\n const options = {\n cwd: stepCtx.workingDirectory,\n logger,\n env: {\n EXPO_IMAGE_UTILS_NO_SHARP: '1',\n ...env,\n ...(appleTeamId ? { APPLE_TEAM_ID: appleTeamId } : {}),\n },\n };\n if (packageManager === PackageManager.NPM) {\n await spawn('npx', argsWithExpo, options);\n } else if (packageManager === PackageManager.YARN) {\n await spawn('yarn', argsWithExpo, options);\n } else if (packageManager === PackageManager.PNPM) {\n await spawn('pnpm', argsWithExpo, options);\n } else if (packageManager === PackageManager.BUN) {\n await spawn('bun', argsWithExpo, options);\n } else {\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n await installNodeModules(stepCtx, env);\n },\n });\n}\n\nfunction getPrebuildCommandArgs({\n platform,\n customPrebuildCommand,\n clean,\n}: {\n platform: Platform;\n customPrebuildCommand?: string;\n clean: boolean;\n}): string[] {\n if (customPrebuildCommand) {\n return sanitizeUserDefinedPrebuildCommand({\n customPrebuildCommand,\n platform,\n clean,\n });\n }\n return ['prebuild', '--no-install', '--platform', platform, ...(clean ? ['--clean'] : [])];\n}\n\n// TODO: deprecate prebuildCommand in eas.json\nfunction sanitizeUserDefinedPrebuildCommand({\n customPrebuildCommand,\n platform,\n clean,\n}: {\n customPrebuildCommand: string;\n platform: Platform;\n clean: boolean;\n}): string[] {\n let prebuildCommand = customPrebuildCommand;\n if (!prebuildCommand.match(/(?:--platform| -p)/)) {\n prebuildCommand = `${prebuildCommand} --platform ${platform}`;\n }\n if (clean) {\n prebuildCommand = `${prebuildCommand} --clean`;\n }\n const npxCommandPrefix = 'npx ';\n const expoCommandPrefix = 'expo ';\n const expoCliCommandPrefix = 'expo-cli ';\n if (prebuildCommand.startsWith(npxCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(npxCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(expoCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCliCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(expoCliCommandPrefix.length).trim();\n }\n return prebuildCommand.split(' ');\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"repack.js","sourceRoot":"","sources":["../../../src/steps/functions/repack.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport resolveFrom from 'resolve-from';\nimport { Platform, type Android, type Ios, type Job } from '@expo/eas-build-job';\nimport { type bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n spawnAsync,\n} from '@expo/steps';\nimport {\n type AndroidSigningOptions,\n type IosSigningOptions,\n type SpawnProcessAsync,\n type SpawnProcessOptions,\n type SpawnProcessPromise,\n type SpawnProcessResult,\n} from '@expo/repack-app';\n\nimport { COMMON_FASTLANE_ENV } from '../../common/fastlane';\nimport IosCredentialsManager from '../utils/ios/credentials/manager';\n\nexport function createRepackBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'repack',\n name: 'Repack app',\n __metricsId: 'eas/repack',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'source_app_path',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: true,\n }),\n BuildStepInput.createProvider({\n id: 'platform',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'output_path',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: false,\n }),\n BuildStepInput.createProvider({\n id: 'embed_bundle_assets',\n allowedValueTypeName: BuildStepInputValueTypeName.BOOLEAN,\n required: false,\n }),\n BuildStepInput.createProvider({\n id: 'repack_version',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: false,\n defaultValue: 'latest',\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'output_path',\n required: true,\n }),\n ],\n fn: async (stepsCtx, { inputs, outputs, env }) => {\n const projectRoot = stepsCtx.workingDirectory;\n const verbose = stepsCtx.global.env['EAS_VERBOSE'] === '1';\n\n const platform =\n (inputs.platform.value as Platform) ?? stepsCtx.global.staticContext.job.platform;\n if (![Platform.ANDROID, Platform.IOS].includes(platform)) {\n throw new Error(\n `Unsupported platform: ${platform}. Platform must be \"${Platform.ANDROID}\" or \"${Platform.IOS}\"`\n );\n }\n\n const repackSpawnAsync = createSpawnAsyncStepAdapter({ verbose, logger: stepsCtx.logger });\n\n const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), `repack-`));\n const workingDirectory = path.join(tmpDir, 'working-directory');\n await fs.promises.mkdir(workingDirectory);\n stepsCtx.logger.info(`Created temporary working directory: ${workingDirectory}`);\n\n const sourceAppPath = inputs.source_app_path.value as string;\n const outputPath =\n (inputs.output_path.value as string) ??\n path.join(tmpDir, `repacked-${randomUUID()}${path.extname(sourceAppPath)}`);\n const exportEmbedOptions = inputs.embed_bundle_assets.value\n ? {\n sourcemapOutput: undefined,\n }\n : undefined;\n\n stepsCtx.logger.info(`Using repack tool version: ${inputs.repack_version.value}`);\n const repackApp = await installAndImportRepackAsync(inputs.repack_version.value as string);\n const { repackAppIosAsync, repackAppAndroidAsync } = repackApp;\n\n stepsCtx.logger.info('Repacking the app...');\n switch (platform) {\n case Platform.IOS:\n await repackAppIosAsync({\n platform: 'ios',\n projectRoot,\n sourceAppPath,\n outputPath,\n workingDirectory,\n exportEmbedOptions,\n iosSigningOptions: await resolveIosSigningOptionsAsync({\n job: stepsCtx.global.staticContext.job,\n logger: stepsCtx.logger,\n }),\n logger: stepsCtx.logger,\n spawnAsync: repackSpawnAsync,\n verbose,\n env: {\n ...COMMON_FASTLANE_ENV,\n ...env,\n },\n });\n break;\n case Platform.ANDROID:\n {\n const androidSigningOptions = await resolveAndroidSigningOptionsAsync({\n job: stepsCtx.global.staticContext.job,\n tmpDir,\n });\n\n try {\n await repackAppAndroidAsync({\n platform: 'android',\n projectRoot,\n sourceAppPath,\n outputPath,\n workingDirectory,\n exportEmbedOptions,\n androidSigningOptions,\n logger: stepsCtx.logger,\n spawnAsync: repackSpawnAsync,\n verbose,\n env,\n });\n } finally {\n const keyStorePath = androidSigningOptions?.keyStorePath;\n if (keyStorePath) {\n await fs.promises.rm(keyStorePath, { force: true });\n }\n }\n }\n break;\n }\n\n stepsCtx.logger.info(`Repacked the app to ${outputPath}`);\n outputs.output_path.set(outputPath);\n },\n });\n}\n\n/**\n * Install `@expo/repack-app` in a sandbox directory and import it.\n */\nasync function installAndImportRepackAsync(\n version: string = 'latest'\n): Promise<typeof import('@expo/repack-app')> {\n const sandbox = await fs.promises.mkdtemp(path.join(os.tmpdir(), `repack-package-root-`));\n await spawnAsync('yarn', ['add', `@expo/repack-app@${version}`], {\n stdio: 'inherit',\n cwd: sandbox,\n });\n return require(resolveFrom(sandbox, '@expo/repack-app'));\n}\n\n/**\n * Creates `@expo/steps` based spawnAsync for repack.\n */\nfunction createSpawnAsyncStepAdapter({\n verbose,\n logger,\n}: {\n verbose: boolean;\n logger: bunyan;\n}): SpawnProcessAsync {\n return function repackSpawnAsync(\n command: string,\n args: string[],\n options?: SpawnProcessOptions\n ): SpawnProcessPromise<SpawnProcessResult> {\n const promise = spawnAsync(command, args, {\n ...options,\n ...(verbose ? { logger, stdio: 'pipe' } : { logger: undefined }),\n });\n const child = promise.child;\n const wrappedPromise = promise.catch((error) => {\n logger.error(`Error while running command: ${command} ${args.join(' ')}`);\n logger.error(`stdout: ${error.stdout}`);\n logger.error(`stderr: ${error.stderr}`);\n throw error;\n }) as SpawnProcessPromise<SpawnProcessResult>;\n wrappedPromise.child = child;\n return wrappedPromise;\n };\n}\n\n/**\n * Resolves Android signing options from the job secrets.\n */\nexport async function resolveAndroidSigningOptionsAsync({\n job,\n tmpDir,\n}: {\n job: Job;\n tmpDir: string;\n}): Promise<AndroidSigningOptions | undefined> {\n const androidJob = job as Android.Job;\n const buildCredentials = androidJob.secrets?.buildCredentials;\n if (buildCredentials?.keystore.dataBase64 == null) {\n return undefined;\n }\n const keyStorePath = path.join(tmpDir, `keystore-${randomUUID()}`);\n await fs.promises.writeFile(\n keyStorePath,\n Buffer.from(buildCredentials.keystore.dataBase64, 'base64')\n );\n\n const keyStorePassword = `pass:${buildCredentials.keystore.keystorePassword}`;\n const keyAlias = buildCredentials.keystore.keyAlias;\n const keyPassword = buildCredentials.keystore.keyPassword\n ? `pass:${buildCredentials.keystore.keyPassword}`\n : undefined;\n return {\n keyStorePath,\n keyStorePassword,\n keyAlias,\n keyPassword,\n };\n}\n\n/**\n * Resolves iOS signing options from the job secrets.\n */\nexport async function resolveIosSigningOptionsAsync({\n job,\n logger,\n}: {\n job: Job;\n logger: bunyan;\n}): Promise<IosSigningOptions | undefined> {\n const iosJob = job as Ios.Job;\n const buildCredentials = iosJob.secrets?.buildCredentials;\n if (iosJob.simulator || buildCredentials == null) {\n return undefined;\n }\n const credentialsManager = new IosCredentialsManager(buildCredentials);\n const credentials = await credentialsManager.prepare(logger);\n\n const provisioningProfile: Record<string, string> = {};\n for (const profile of Object.values(credentials.targetProvisioningProfiles)) {\n provisioningProfile[profile.bundleIdentifier] = profile.path;\n }\n return {\n provisioningProfile,\n keychainPath: credentials.keychainPath,\n signingIdentity: credentials.applicationTargetProvisioningProfile.data.certificateCommonName,\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveAppleTeamIdFromCredentials.js","sourceRoot":"","sources":["../../../src/steps/functions/resolveAppleTeamIdFromCredentials.ts"],"names":[],"mappings":";;;;;AAUA,8FAsCC;AAhDD,uCAKqB;AAErB,+EAAqE;AACrE,sEAAiF;AAEjF,SAAgB,yCAAyC;IACvD,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,wCAAwC;QAC5C,IAAI,EAAE,wCAAwC;QAC9C,WAAW,EAAE,4CAA4C;QACzD,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,aAAa;gBACjB,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,IAAI;gBACtD,YAAY,EAAE,uCAAuC;aACtD,CAAC;SACH;QACD,eAAe,EAAE;YACf,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,eAAe;gBACnB,QAAQ,EAAE,IAAI;aACf,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACzC,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,KAA4B,CAAC;YAC5E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,uCAAyB,CAAC,QAAQ,CAAC,mBAAmB,EAAE;gBAC/E,YAAY,EAAE,IAAI;gBAClB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,kBAAkB,GAAG,IAAI,iBAAqB,CAAC,KAAK,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAErE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\n\nimport IosCredentialsManager from '../utils/ios/credentials/manager';\nimport { IosBuildCredentialsSchema } from '../utils/ios/credentials/credentials';\n\nexport function resolveAppleTeamIdFromCredentialsFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'resolve_apple_team_id_from_credentials',\n name: 'Resolve Apple team ID from credentials',\n __metricsId: 'eas/resolve_apple_team_id_from_credentials',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'credentials',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.JSON,\n defaultValue: '${ eas.job.secrets.buildCredentials }',\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'apple_team_id',\n required: true,\n }),\n ],\n fn: async (stepCtx, { inputs, outputs }) => {\n const rawCredentialsInput = inputs.credentials.value as Record<string, any>;\n const { value, error } = IosBuildCredentialsSchema.validate(rawCredentialsInput, {\n stripUnknown: true,\n convert: true,\n abortEarly: false,\n });\n if (error) {\n throw error;\n }\n\n const credentialsManager = new IosCredentialsManager(value);\n const credentials = await credentialsManager.prepare(stepCtx.logger);\n\n stepCtx.logger.info(`Using Apple Team ID: ${credentials.teamId}`);\n outputs.apple_team_id.set(credentials.teamId);\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveBuildConfig.js","sourceRoot":"","sources":["../../../src/steps/functions/resolveBuildConfig.ts"],"names":[],"mappings":";;AAQA,sFAYC;AAED,0DA+BC;AArDD,uDAA6D;AAE7D,uCAA0D;AAC1D,mCAA8B;AAE9B,oEAAyE;AAGzE,SAAgB,qCAAqC,CACnD,GAAiC;IAEjC,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,0BAA0B;QACvC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAClD,MAAM,uBAAuB,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,EAC5C,MAAM,EACN,gBAAgB,EAChB,GAAG,EACH,GAAG,GAMJ;IACC,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,4BAAY,CAAC,qBAAqB,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,2CAAwB,EAAC;YAC7D,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG;YACH,MAAM;YACN,GAAG,EAAE,gBAAgB;YACrB,mBAAmB,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS;SAC7E,CAAC,CAAC;QACH,GAAG,CAAC,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,GAAG,EAAE,IAAA,aAAI,EAAC,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAC3E,IAAI,EACJ,CAAC,CACF,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { BuildJob, BuildTrigger } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport { BuildFunction, BuildStepEnv } from '@expo/steps';\nimport { omit } from 'lodash';\n\nimport { runEasBuildInternalAsync } from '../../common/easBuildInternal';\nimport { CustomBuildContext } from '../../customBuildContext';\n\nexport function createResolveBuildConfigBuildFunction(\n ctx: CustomBuildContext<BuildJob>\n): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'resolve_build_config',\n name: 'Resolve build config',\n __metricsId: 'eas/resolve_build_config',\n fn: async ({ logger, workingDirectory }, { env }) => {\n await resolveBuildConfigAsync({ logger, workingDirectory, env, ctx });\n },\n });\n}\n\nexport async function resolveBuildConfigAsync({\n logger,\n workingDirectory,\n env,\n ctx,\n}: {\n logger: bunyan;\n workingDirectory: string;\n env: BuildStepEnv;\n ctx: CustomBuildContext<BuildJob>;\n}): Promise<void> {\n if (ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION) {\n logger.info('Resolving build config...');\n const { newJob, newMetadata } = await runEasBuildInternalAsync({\n job: ctx.job,\n env,\n logger,\n cwd: workingDirectory,\n projectRootOverride: env.EAS_NO_VCS ? ctx.projectTargetDirectory : undefined,\n });\n ctx.updateJobInformation(newJob, newMetadata);\n }\n\n logger.info('Build config resolved:');\n logger.info(\n JSON.stringify(\n { job: omit(ctx.job, 'secrets', 'projectArchive'), metadata: ctx.metadata },\n null,\n 2\n )\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"restoreBuildCache.js","sourceRoot":"","sources":["../../../src/steps/functions/restoreBuildCache.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport { Platform } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\n\nimport {\n CACHE_KEY_PREFIX_BY_PLATFORM,\n generateDefaultBuildCacheKeyAsync,\n getCcachePath,\n} from '../../utils/cacheKey';\nimport { TurtleFetchError } from '../../utils/turtleFetch';\n\nimport { downloadCacheAsync, decompressCacheAsync, downloadPublicCacheAsync } from './restoreCache';\nimport { sendCcacheStatsAsync } from './ccacheStats';\n\nexport function createRestoreBuildCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'restore_build_cache',\n name: 'Restore Cache',\n __metricsId: 'eas/restore_build_cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'platform',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepCtx, { env, inputs }) => {\n const { logger } = stepCtx;\n const workingDirectory = stepCtx.workingDirectory;\n const platform =\n (inputs.platform.value as Platform | undefined) ??\n stepCtx.global.staticContext.job.platform;\n if (!platform || ![Platform.ANDROID, Platform.IOS].includes(platform)) {\n throw new Error(\n `Unsupported platform: ${platform}. Platform must be \"${Platform.ANDROID}\" or \"${Platform.IOS}\"`\n );\n }\n\n await restoreCcacheAsync({\n logger,\n workingDirectory,\n platform,\n env,\n secrets: stepCtx.global.staticContext.job.secrets,\n });\n },\n });\n}\n\nexport function createCacheStatsBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'cache_stats',\n name: 'Cache Stats',\n __metricsId: 'eas/cache_stats',\n fn: async (stepCtx, { env }) => {\n const platform = stepCtx.global.staticContext.job.platform;\n if (!platform) {\n stepCtx.logger.warn('Platform not set, skipping cache stats');\n return;\n }\n await cacheStatsAsync({\n logger: stepCtx.logger,\n env,\n secrets: stepCtx.global.staticContext.job.secrets,\n });\n },\n });\n}\n\nexport async function restoreCcacheAsync({\n logger,\n workingDirectory,\n platform,\n env,\n secrets,\n}: {\n logger: bunyan;\n workingDirectory: string;\n platform: Platform;\n env: Record<string, string | undefined>;\n secrets?: { robotAccessToken?: string };\n}): Promise<void> {\n const enabled =\n env.EAS_RESTORE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_RESTORE_CACHE !== '0');\n\n if (!enabled) {\n return;\n }\n const robotAccessToken = nullthrows(\n secrets?.robotAccessToken,\n 'Robot access token is required for cache operations'\n );\n const expoApiServerURL = nullthrows(env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const cachePath = getCcachePath(env);\n\n // Check if ccache is installed before proceeding\n const checkInstall = await asyncResult(\n spawnAsync('command', ['-v', 'ccache'], {\n env,\n stdio: 'pipe',\n shell: true,\n })\n );\n if (!checkInstall.ok) {\n return;\n }\n\n try {\n // Zero ccache stats for accurate tracking\n await asyncResult(\n spawnAsync('ccache', ['--zero-stats'], {\n env,\n stdio: 'pipe',\n })\n );\n\n const cacheKey = await generateDefaultBuildCacheKeyAsync(workingDirectory, platform);\n logger.info(`Restoring cache key: ${cacheKey}`);\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const { archivePath, matchedKey } = await downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths: [cachePath],\n key: cacheKey,\n keyPrefixes: [CACHE_KEY_PREFIX_BY_PLATFORM[platform]],\n platform,\n });\n\n await decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose: env.EXPO_DEBUG === '1',\n logger,\n });\n\n logger.info(\n `Cache restored successfully ${matchedKey === cacheKey ? '(direct hit)' : '(prefix match)'}`\n );\n } catch (err: unknown) {\n if (err instanceof TurtleFetchError && err.response?.status === 404) {\n logger.info('No cache found for this key');\n } else {\n logger.warn('Failed to restore cache: ', err);\n }\n if (env.EAS_USE_PUBLIC_CACHE === '1') {\n try {\n logger.info('Downloading public cache...');\n const { archivePath } = await downloadPublicCacheAsync({\n logger,\n expoApiServerURL,\n robotAccessToken,\n paths: [cachePath],\n platform,\n });\n await decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose: env.EXPO_DEBUG === '1',\n logger,\n });\n } catch (err: unknown) {\n logger.warn({ err }, 'Failed to download public cache');\n }\n }\n }\n}\n\nexport async function cacheStatsAsync({\n logger,\n env,\n secrets,\n}: {\n logger: bunyan;\n env: Record<string, string | undefined>;\n secrets?: { robotAccessToken?: string };\n}): Promise<void> {\n const enabled =\n env.EAS_RESTORE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_RESTORE_CACHE !== '0');\n\n if (!enabled) {\n return;\n }\n\n // Check if ccache is installed\n const checkInstall = await asyncResult(\n spawnAsync('command', ['-v', 'ccache'], {\n env,\n stdio: 'pipe',\n shell: true,\n })\n );\n if (!checkInstall.ok) {\n return;\n }\n\n await asyncResult(\n spawnAsync('ccache', ['--show-stats', '-v'], {\n env,\n logger,\n stdio: 'pipe',\n })\n );\n\n const robotAccessToken = secrets?.robotAccessToken;\n const expoApiServerURL = env.__API_SERVER_URL;\n const buildId = env.EAS_BUILD_ID;\n\n if (robotAccessToken && expoApiServerURL && buildId) {\n await sendCcacheStatsAsync({\n env,\n expoApiServerURL,\n robotAccessToken,\n buildId,\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"restoreCache.js","sourceRoot":"","sources":["../../../src/steps/functions/restoreCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport stream from 'stream';\nimport { promisify } from 'util';\n\nimport * as tar from 'tar';\nimport { bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\nimport z from 'zod';\nimport nullthrows from 'nullthrows';\nimport fetch from 'node-fetch';\nimport { asyncResult } from '@expo/results';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { retryOnDNSFailure } from '../../utils/retryOnDNSFailure';\nimport { formatBytes } from '../../utils/artifacts';\nimport { getCacheVersion } from '../utils/cache';\nimport { turtleFetch, TurtleFetchError } from '../../utils/turtleFetch';\nimport { PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM } from '../../utils/cacheKey';\n\nconst streamPipeline = promisify(stream.pipeline);\n\nexport function createRestoreCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'restore_cache',\n name: 'Restore Cache',\n __metricsId: 'eas/restore_cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'path',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'restore_keys',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'cache_hit',\n required: false,\n }),\n ],\n fn: async (stepsCtx, { env, inputs, outputs }) => {\n const { logger } = stepsCtx;\n\n try {\n if (stepsCtx.global.staticContext.job.platform) {\n logger.error('Caches are not supported in build jobs yet.');\n return;\n }\n\n const paths = z\n .array(z.string())\n .parse(((inputs.path.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((path) => path.length > 0);\n const key = z.string().parse(inputs.key.value);\n const restoreKeys = z\n .array(z.string())\n .parse(((inputs.restore_keys.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((key) => key !== '');\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n stepsCtx.global.staticContext.job.secrets?.robotAccessToken,\n 'robotAccessToken is not set'\n );\n\n const { archivePath, matchedKey } = await downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n keyPrefixes: restoreKeys,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n logger.info(`Downloaded cache archive from ${archivePath} (${formatBytes(size)}).`);\n\n await decompressCacheAsync({\n archivePath,\n workingDirectory: stepsCtx.workingDirectory,\n verbose: true,\n logger,\n });\n\n outputs.cache_hit.set(`${matchedKey === key}`);\n } catch (error) {\n logger.error({ err: error }, 'Failed to restore cache');\n }\n },\n });\n}\n\nexport async function downloadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n keyPrefixes,\n platform,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n keyPrefixes: string[];\n platform: Platform | undefined;\n}): Promise<{ archivePath: string; matchedKey: string }> {\n const routerURL = platform ? 'v2/turtle-builds/caches/download' : 'v2/turtle-caches/download';\n\n try {\n const response = await turtleFetch(new URL(routerURL, expoApiServerURL).toString(), 'POST', {\n json: platform\n ? {\n buildId: jobId,\n key,\n version: getCacheVersion(paths),\n keyPrefixes,\n }\n : {\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n keyPrefixes,\n },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n // It's ok to retry POST caches/download, because we're only retrying signing a download URL.\n retries: 2,\n shouldThrowOnNotOk: true,\n });\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { matchedKey, downloadUrl } = result.value.data;\n\n logger.info(`Matched cache key: ${matchedKey}. Downloading...`);\n\n const downloadDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'restore-cache-')\n );\n\n const downloadResponse = await retryOnDNSFailure(fetch)(downloadUrl);\n if (!downloadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${downloadResponse.status}): ${downloadResponse.statusText}`\n );\n }\n\n // URL may contain percent-encoded characters, e.g. my%20file.apk\n // this replaces all non-alphanumeric characters (excluding dot) with underscore\n const archiveFilename = path\n .basename(new URL(downloadUrl).pathname)\n .replace(/([^a-z0-9.-]+)/gi, '_');\n const archivePath = path.join(downloadDestinationDirectory, archiveFilename);\n\n await streamPipeline(downloadResponse.body, fs.createWriteStream(archivePath));\n\n return { archivePath, matchedKey };\n } catch (err: any) {\n if (err instanceof TurtleFetchError && err.response.status !== 404) {\n const textResult = await asyncResult(err.response.text());\n throw new Error(\n `Unexpected response from server (${err.response.status}): ${textResult.value}`\n );\n }\n throw err;\n }\n}\n\nexport async function downloadPublicCacheAsync({\n logger,\n expoApiServerURL,\n robotAccessToken,\n paths,\n platform,\n}: {\n logger: bunyan;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n platform: Platform;\n}): Promise<{ archivePath: string; matchedKey: string }> {\n const routerURL = 'v2/public-turtle-caches/download';\n const key = PUBLIC_CACHE_KEY_PREFIX_BY_PLATFORM[platform];\n\n try {\n const response = await turtleFetch(new URL(routerURL, expoApiServerURL).toString(), 'POST', {\n json: {\n key,\n version: getCacheVersion(paths),\n keyPrefixes: [key],\n },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n retries: 2,\n shouldThrowOnNotOk: true,\n });\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { matchedKey, downloadUrl } = result.value.data;\n\n logger.info(`Matched public cache key: ${matchedKey}. Downloading...`);\n\n const downloadDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'restore-cache-')\n );\n\n const downloadResponse = await retryOnDNSFailure(fetch)(downloadUrl);\n if (!downloadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${downloadResponse.status}): ${downloadResponse.statusText}`\n );\n }\n\n const archiveFilename = path\n .basename(new URL(downloadUrl).pathname)\n .replace(/([^a-z0-9.-]+)/gi, '_');\n const archivePath = path.join(downloadDestinationDirectory, archiveFilename);\n\n await streamPipeline(downloadResponse.body, fs.createWriteStream(archivePath));\n\n return { archivePath, matchedKey };\n } catch (err: any) {\n if (err instanceof TurtleFetchError && err.response.status !== 404) {\n const textResult = await asyncResult(err.response.text());\n throw new Error(\n `Unexpected response from server (${err.response.status}): ${textResult.value}`\n );\n }\n throw err;\n }\n}\n\nexport async function decompressCacheAsync({\n archivePath,\n workingDirectory,\n verbose,\n logger,\n}: {\n archivePath: string;\n workingDirectory: string;\n verbose: boolean;\n logger: bunyan;\n}): Promise<void> {\n if (verbose) {\n logger.info(`Extracting cache to ${workingDirectory}:`);\n }\n\n // First, extract everything to the working directory\n const fileHandle = await fs.promises.open(archivePath, 'r');\n const extractedFiles: string[] = [];\n\n await streamPipeline(\n fileHandle.createReadStream(),\n tar.extract({\n cwd: workingDirectory,\n onwarn: (code, message, data) => {\n logger.warn({ code, data }, message);\n },\n preservePaths: true,\n onReadEntry: (entry) => {\n extractedFiles.push(entry.path);\n if (verbose) {\n logger.info(`- ${entry.path}`);\n }\n },\n })\n );\n\n // Handle absolute paths that were prefixed with __absolute__\n for (const extractedPath of extractedFiles) {\n if (extractedPath.startsWith('__absolute__/')) {\n const originalAbsolutePath = extractedPath.slice('__absolute__'.length);\n const currentPath = path.join(workingDirectory, extractedPath);\n\n try {\n // Ensure the target directory exists\n await fs.promises.mkdir(path.dirname(originalAbsolutePath), { recursive: true });\n\n // Move the file to its original absolute location\n await fs.promises.rename(currentPath, originalAbsolutePath);\n\n if (verbose) {\n logger.info(`Moved ${extractedPath} to ${originalAbsolutePath}`);\n }\n } catch (error) {\n logger.warn(`Failed to restore absolute path ${originalAbsolutePath}: ${error}`);\n }\n }\n }\n\n // Clean up any remaining __absolute__ directories\n const absoluteDir = path.join(workingDirectory, '__absolute__');\n if (\n await fs.promises\n .access(absoluteDir)\n .then(() => true)\n .catch(() => false)\n ) {\n await fs.promises.rm(absoluteDir, { recursive: true, force: true });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runFastlane.js","sourceRoot":"","sources":["../../../src/steps/functions/runFastlane.ts"],"names":[],"mappings":";;AAUA,kDA8CC;AAxDD,uCAKqB;AAErB,oDAAuD;AACvD,kFAA0F;AAE1F,SAAgB,mBAAmB;IACjC,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,kBAAkB;QAC/B,eAAe,EAAE;YACf,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,WAAW;gBACnC,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,UAAU;gBAClC,QAAQ,EAAE,KAAK;aAChB,CAAC;SACH;QACD,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,qCAAqC;gBACzC,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;YAC9C,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,+BAA+B,GAAG,MAAM,CAAC,mCAAmC,CAAC,KAEtE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,IAAA,yBAAc,EAAC;oBACnB,UAAU,EAAE,OAAO,CAAC,gBAAgB;oBACpC,GAAG;oBACH,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB;oBACrD,GAAG,CAAC,+BAA+B;wBACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,iCAAiC,EAAE,+BAA+B,EAAE,EAAE;wBACtF,CAAC,CAAC,IAAI,CAAC;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,KAAK,CAAC,CAAC;gBACpE,OAAO,CAAC,+CAAmB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\n\nimport { runFastlaneGym } from '../utils/ios/fastlane';\nimport { BuildStatusText, BuildStepOutputName } from '../utils/slackMessageDynamicFields';\n\nexport function runFastlaneFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'run_fastlane',\n name: 'Run fastlane',\n __metricsId: 'eas/run_fastlane',\n outputProviders: [\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.STATUS_TEXT,\n required: true,\n }),\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.ERROR_TEXT,\n required: false,\n }),\n ],\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'resolved_eas_update_runtime_version',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepCtx, { env, outputs, inputs }) => {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.STARTED);\n const resolvedEASUpdateRuntimeVersion = inputs.resolved_eas_update_runtime_version.value as\n | string\n | undefined;\n try {\n await runFastlaneGym({\n workingDir: stepCtx.workingDirectory,\n env,\n logger: stepCtx.logger,\n buildLogsDirectory: stepCtx.global.buildLogsDirectory,\n ...(resolvedEASUpdateRuntimeVersion\n ? { extraEnv: { EXPO_UPDATES_FINGERPRINT_OVERRIDE: resolvedEASUpdateRuntimeVersion } }\n : null),\n });\n } catch (error) {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.ERROR);\n outputs[BuildStepOutputName.ERROR_TEXT].set((error as Error).toString());\n throw error;\n }\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.SUCCESS);\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runGradle.js","sourceRoot":"","sources":["../../../src/steps/functions/runGradle.ts"],"names":[],"mappings":";;;;;AAcA,8CA6DC;AA3ED,gDAAwB;AACxB,oDAA4B;AAE5B,uDAA+C;AAC/C,uCAKqB;AAErB,oDAAiF;AACjF,kFAA0F;AAE1F,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gBAAgB;QAC7B,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,qCAAqC;gBACzC,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,eAAe,EAAE;YACf,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,WAAW;gBACnC,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,UAAU;gBAClC,QAAQ,EAAE,KAAK;aAChB,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9C,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;YACtE,IAAA,gBAAM,EAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC5D,IAAA,gBAAM,EACJ,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,KAAK,wBAAQ,CAAC,OAAO,EAC9D,2DAA2D,CAC5D,CAAC;YACF,MAAM,OAAO,GAAG,IAAA,6BAAoB,EAClC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAChC,MAAM,CAAC,OAAO,CAAC,KAA2B,CAC3C,CAAC;YAEF,MAAM,+BAA+B,GAAG,MAAM,CAAC,mCAAmC,CAAC,KAEtE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,IAAA,yBAAgB,EAAC;oBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,aAAa,EAAE,OAAO;oBACtB,UAAU,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC;oBAC1D,GAAG;oBACH,GAAG,CAAC,+BAA+B;wBACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,iCAAiC,EAAE,+BAA+B,EAAE,EAAE;wBACtF,CAAC,CAAC,IAAI,CAAC;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,KAAK,CAAC,CAAC;gBACpE,OAAO,CAAC,+CAAmB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import path from 'path';\nimport assert from 'assert';\n\nimport { Platform } from '@expo/eas-build-job';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\n\nimport { resolveGradleCommand, runGradleCommand } from '../utils/android/gradle';\nimport { BuildStatusText, BuildStepOutputName } from '../utils/slackMessageDynamicFields';\n\nexport function runGradleFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'run_gradle',\n name: 'Run gradle',\n __metricsId: 'eas/run_gradle',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'command',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'resolved_eas_update_runtime_version',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.STATUS_TEXT,\n required: true,\n }),\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.ERROR_TEXT,\n required: false,\n }),\n ],\n fn: async (stepCtx, { env, inputs, outputs }) => {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.STARTED);\n assert(stepCtx.global.staticContext.job, 'Job is required');\n assert(\n stepCtx.global.staticContext.job.platform === Platform.ANDROID,\n 'This function is only available when building for Android'\n );\n const command = resolveGradleCommand(\n stepCtx.global.staticContext.job,\n inputs.command.value as string | undefined\n );\n\n const resolvedEASUpdateRuntimeVersion = inputs.resolved_eas_update_runtime_version.value as\n | string\n | undefined;\n try {\n await runGradleCommand({\n logger: stepCtx.logger,\n gradleCommand: command,\n androidDir: path.join(stepCtx.workingDirectory, 'android'),\n env,\n ...(resolvedEASUpdateRuntimeVersion\n ? { extraEnv: { EXPO_UPDATES_FINGERPRINT_OVERRIDE: resolvedEASUpdateRuntimeVersion } }\n : null),\n });\n } catch (error) {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.ERROR);\n outputs[BuildStepOutputName.ERROR_TEXT].set((error as Error).toString());\n throw error;\n }\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.SUCCESS);\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"saveBuildCache.js","sourceRoot":"","sources":["../../../src/steps/functions/saveBuildCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\n\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport { Platform } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\n\nimport { generateDefaultBuildCacheKeyAsync, getCcachePath } from '../../utils/cacheKey';\n\nimport { compressCacheAsync, uploadCacheAsync } from './saveCache';\n\nexport function createSaveBuildCacheFunction(evictUsedBefore: Date): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'save_build_cache',\n name: 'Save Cache',\n __metricsId: 'eas/save_build_cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'platform',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepCtx, { env, inputs }) => {\n const { logger } = stepCtx;\n const workingDirectory = stepCtx.workingDirectory;\n const platform =\n (inputs.platform.value as Platform | undefined) ??\n stepCtx.global.staticContext.job.platform;\n if (!platform || ![Platform.ANDROID, Platform.IOS].includes(platform)) {\n throw new Error(\n `Unsupported platform: ${platform}. Platform must be \"${Platform.ANDROID}\" or \"${Platform.IOS}\"`\n );\n }\n\n await saveCcacheAsync({\n logger,\n workingDirectory,\n platform,\n evictUsedBefore,\n env,\n secrets: stepCtx.global.staticContext.job.secrets,\n });\n },\n });\n}\n\nexport async function saveCcacheAsync({\n logger,\n workingDirectory,\n platform,\n evictUsedBefore,\n env,\n secrets,\n}: {\n logger: bunyan;\n workingDirectory: string;\n platform: Platform;\n evictUsedBefore: Date;\n env: Record<string, string | undefined>;\n secrets?: { robotAccessToken?: string };\n}): Promise<void> {\n const enabled =\n env.EAS_SAVE_CACHE === '1' || (env.EAS_USE_CACHE === '1' && env.EAS_SAVE_CACHE !== '0');\n\n if (!enabled) {\n return;\n }\n\n // Check if ccache is installed before proceeding\n const checkInstall = await asyncResult(\n spawnAsync('command', ['-v', 'ccache'], {\n env,\n stdio: 'pipe',\n shell: true,\n })\n );\n if (!checkInstall.ok) {\n return;\n }\n\n try {\n const cacheKey = await generateDefaultBuildCacheKeyAsync(workingDirectory, platform);\n logger.info(`Saving cache key: ${cacheKey}`);\n\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n secrets?.robotAccessToken,\n 'Robot access token is required for cache operations'\n );\n const expoApiServerURL = nullthrows(env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const cachePath = getCcachePath(env);\n\n // Cache size can blow up over time over many builds, so evict stale files\n // and only upload what was used within this build's time window\n\n const evictWindow = Math.floor((Date.now() - evictUsedBefore.getTime()) / 1000);\n logger.info('Pruning cache...');\n await asyncResult(\n spawnAsync('ccache', ['--evict-older-than', evictWindow + 's'], {\n env,\n logger,\n stdio: 'pipe',\n })\n );\n\n logger.info('Preparing cache archive...');\n\n const { archivePath } = await compressCacheAsync({\n paths: [cachePath],\n workingDirectory,\n verbose: env.EXPO_DEBUG === '1',\n logger,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n\n await uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n archivePath,\n key: cacheKey,\n paths: [cachePath],\n size,\n platform,\n });\n } catch (err) {\n logger.error({ err }, 'Failed to save cache');\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"saveCache.js","sourceRoot":"","sources":["../../../src/steps/functions/saveCache.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport * as tar from 'tar';\nimport fg from 'fast-glob';\nimport { bunyan } from '@expo/logger';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport z from 'zod';\nimport nullthrows from 'nullthrows';\nimport fetch from 'node-fetch';\nimport { asyncResult } from '@expo/results';\nimport { Platform } from '@expo/eas-build-job';\n\nimport { retryOnDNSFailure } from '../../utils/retryOnDNSFailure';\nimport { formatBytes } from '../../utils/artifacts';\nimport { getCacheVersion } from '../utils/cache';\n\nexport function createSaveCacheFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'save_cache',\n name: 'Save Cache',\n __metricsId: 'eas/save_cache',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'path',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepsCtx, { env, inputs }) => {\n const { logger } = stepsCtx;\n\n try {\n const paths = z\n .array(z.string())\n .parse(((inputs.path.value ?? '') as string).split(/[\\r\\n]+/))\n .filter((path) => path.length > 0);\n const key = z.string().parse(inputs.key.value);\n const jobId = nullthrows(env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const robotAccessToken = nullthrows(\n stepsCtx.global.staticContext.job.secrets?.robotAccessToken,\n 'robotAccessToken is not set'\n );\n\n const { archivePath } = await compressCacheAsync({\n paths,\n workingDirectory: stepsCtx.workingDirectory,\n verbose: true,\n logger,\n });\n\n const { size } = await fs.promises.stat(archivePath);\n\n if (env.EAS_PUBLIC_CACHE === '1') {\n await uploadPublicCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n archivePath,\n key,\n paths,\n size,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n } else {\n await uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL: stepsCtx.global.staticContext.expoApiServerURL,\n robotAccessToken,\n archivePath,\n key,\n paths,\n size,\n platform: stepsCtx.global.staticContext.job.platform,\n });\n }\n } catch (error) {\n logger.error({ err: error }, 'Failed to create cache');\n }\n },\n });\n}\n\nexport async function uploadCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n archivePath,\n size,\n platform,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n archivePath: string;\n size: number;\n platform: Platform | undefined;\n}): Promise<void> {\n const routerURL = platform\n ? 'v2/turtle-builds/caches/upload-sessions'\n : 'v2/turtle-caches/upload-sessions';\n\n // attempts to upload should only attempt on DNS errors, and not application errors such as 409 (cache exists)\n const response = await retryOnDNSFailure(fetch)(new URL(routerURL, expoApiServerURL), {\n method: 'POST',\n body: platform\n ? JSON.stringify({\n buildId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n })\n : JSON.stringify({\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n }),\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n if (response.status === 409) {\n logger.info(`Cache already exists, skipping upload`);\n return;\n }\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { url, headers } = result.value.data;\n\n logger.info(`Uploading cache...`);\n\n const uploadResponse = await retryOnDNSFailure(fetch)(new URL(url), {\n method: 'PUT',\n headers,\n body: fs.createReadStream(archivePath),\n });\n if (!uploadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${uploadResponse.status}): ${uploadResponse.statusText}`\n );\n }\n logger.info(`Uploaded cache archive to ${archivePath} (${formatBytes(size)}).`);\n}\n\nexport async function uploadPublicCacheAsync({\n logger,\n jobId,\n expoApiServerURL,\n robotAccessToken,\n paths,\n key,\n archivePath,\n size,\n}: {\n logger: bunyan;\n jobId: string;\n expoApiServerURL: string;\n robotAccessToken: string;\n paths: string[];\n key: string;\n archivePath: string;\n size: number;\n platform: Platform | undefined;\n}): Promise<void> {\n const routerPath = 'v2/public-turtle-caches/upload-sessions';\n const response = await retryOnDNSFailure(fetch)(new URL(routerPath, expoApiServerURL), {\n method: 'POST',\n body: JSON.stringify({\n jobRunId: jobId,\n key,\n version: getCacheVersion(paths),\n size,\n }),\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n if (response.status === 409) {\n logger.info(`Cache ${key} already exists, skipping upload`);\n return;\n }\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const result = await asyncResult(response.json());\n if (!result.ok) {\n throw new Error(`Unexpected response from server (${response.status}): ${result.reason}`);\n }\n\n const { url, headers } = result.value.data;\n\n logger.info(`Uploading public cache...`);\n\n const uploadResponse = await retryOnDNSFailure(fetch)(new URL(url), {\n method: 'PUT',\n headers,\n body: fs.createReadStream(archivePath),\n });\n if (!uploadResponse.ok) {\n throw new Error(\n `Unexpected response from cache server (${uploadResponse.status}): ${uploadResponse.statusText}`\n );\n }\n logger.info(`Uploaded cache archive to ${archivePath} (${formatBytes(size)}).`);\n}\n\nexport async function compressCacheAsync({\n paths,\n workingDirectory,\n verbose,\n logger,\n}: {\n paths: string[];\n workingDirectory: string;\n verbose: boolean;\n logger: bunyan;\n}): Promise<{ archivePath: string }> {\n const archiveDestinationDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'save-cache-')\n );\n\n // Process and normalize all paths\n const allFiles: { absolutePath: string; archivePath: string }[] = [];\n\n for (const inputPath of paths) {\n // Resolve to absolute path\n const absolutePath = path.isAbsolute(inputPath)\n ? inputPath\n : path.resolve(workingDirectory, inputPath);\n\n try {\n const stat = await fs.promises.stat(absolutePath);\n\n if (stat.isDirectory()) {\n // For directories, get all files recursively\n const pattern = fg.isDynamicPattern(inputPath) ? inputPath : `${absolutePath}/**`;\n const dirFiles = await fg(pattern, {\n absolute: true,\n onlyFiles: true,\n cwd: fg.isDynamicPattern(inputPath) ? workingDirectory : undefined,\n });\n\n for (const filePath of dirFiles) {\n // Calculate the archive path\n let archivePath: string;\n\n if (path.isAbsolute(inputPath)) {\n // For absolute input paths, check if they're within workingDirectory\n const relativeToWorkdir = path.relative(workingDirectory, filePath);\n if (!relativeToWorkdir.startsWith('..') && !path.isAbsolute(relativeToWorkdir)) {\n // File is within working directory - use relative path\n archivePath = relativeToWorkdir;\n } else {\n // File is outside working directory - preserve relative structure from original path\n const relativeToInput = path.relative(absolutePath, filePath);\n archivePath = path.posix.join('__absolute__' + inputPath, relativeToInput);\n }\n } else {\n // For relative input paths, maintain relative structure\n archivePath = path.relative(workingDirectory, filePath);\n }\n\n allFiles.push({ absolutePath: filePath, archivePath });\n }\n } else {\n // Single file\n let archivePath: string;\n\n if (path.isAbsolute(inputPath)) {\n const relativeToWorkdir = path.relative(workingDirectory, absolutePath);\n if (!relativeToWorkdir.startsWith('..') && !path.isAbsolute(relativeToWorkdir)) {\n archivePath = relativeToWorkdir;\n } else {\n archivePath = '__absolute__' + inputPath;\n }\n } else {\n archivePath = inputPath;\n }\n\n allFiles.push({ absolutePath, archivePath });\n }\n } catch (error) {\n logger.warn({ error }, 'Failed to resolve paths');\n // Handle glob patterns\n if (fg.isDynamicPattern(inputPath)) {\n const globFiles = await fg(inputPath, {\n absolute: true,\n cwd: workingDirectory,\n onlyFiles: true,\n });\n\n for (const filePath of globFiles) {\n const archivePath = path.relative(workingDirectory, filePath);\n allFiles.push({ absolutePath: filePath, archivePath });\n }\n } else {\n throw new Error(`Path does not exist: ${inputPath}`);\n }\n }\n }\n\n if (allFiles.length === 0) {\n throw new Error('No files found to cache');\n }\n\n const archivePath = path.join(archiveDestinationDirectory, 'cache.tar.gz');\n\n if (verbose) {\n logger.info(`Compressing cache with ${allFiles.length} files:`);\n }\n\n // Create a temporary directory with the correct structure\n const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'cache-temp-'));\n\n try {\n // Copy all files to temp directory maintaining archive structure\n for (const { absolutePath, archivePath: targetRelativePath } of allFiles) {\n const targetPath = path.join(tempDir, targetRelativePath);\n await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.promises.copyFile(absolutePath, targetPath);\n\n if (verbose) {\n logger.info(`- ${targetRelativePath}`);\n }\n }\n\n // Create tar archive from the structured temp directory\n await tar.c(\n {\n gzip: true,\n file: archivePath,\n cwd: tempDir,\n },\n allFiles.map(({ archivePath: targetPath }) => targetPath)\n );\n } finally {\n await fs.promises.rm(tempDir, { recursive: true, force: true });\n }\n\n return { archivePath };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sendSlackMessage.js","sourceRoot":"","sources":["../../../src/steps/functions/sendSlackMessage.ts"],"names":[],"mappings":"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","sourcesContent":["import { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport fetch, { Response } from 'node-fetch';\nimport { bunyan } from '@expo/logger';\n\nexport function createSendSlackMessageFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'send_slack_message',\n name: 'Send Slack message',\n __metricsId: 'eas/send_slack_message',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'message',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: false,\n }),\n BuildStepInput.createProvider({\n id: 'payload',\n allowedValueTypeName: BuildStepInputValueTypeName.JSON,\n required: false,\n }),\n BuildStepInput.createProvider({\n id: 'slack_hook_url',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n required: false,\n }),\n ],\n fn: async (stepCtx, { inputs, env }) => {\n const { logger } = stepCtx;\n const slackMessage = inputs.message.value as string;\n const slackPayload = inputs.payload.value as object;\n if (!slackMessage && !slackPayload) {\n throw new Error(\n 'You need to provide either \"message\" input or \"payload\" input to specify the Slack message contents'\n );\n }\n if (slackMessage && slackPayload) {\n throw new Error(\n 'You cannot specify both \"message\" input and \"payload\" input - choose one for the Slack message contents'\n );\n }\n const slackHookUrl = (inputs.slack_hook_url.value as string) ?? env.SLACK_HOOK_URL;\n if (!slackHookUrl) {\n logger.warn(\n 'Slack webhook URL not provided - provide input \"slack_hook_url\" or set \"SLACK_HOOK_URL\" secret'\n );\n throw new Error(\n 'Sending Slack message failed - provide input \"slack_hook_url\" or set \"SLACK_HOOK_URL\" secret'\n );\n }\n await sendSlackMessageAsync({ logger, slackHookUrl, slackMessage, slackPayload });\n },\n });\n}\n\nasync function sendSlackMessageAsync({\n logger,\n slackHookUrl,\n slackMessage,\n slackPayload,\n}: {\n logger: bunyan;\n slackHookUrl: string;\n slackMessage: string | undefined;\n slackPayload: object | undefined;\n}): Promise<void> {\n logger.info('Sending Slack message');\n\n const body = slackPayload ? slackPayload : { text: slackMessage };\n let fetchResult: Response;\n try {\n fetchResult = await fetch(slackHookUrl, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n logger.debug(error);\n throw new Error(`Sending Slack message to webhook url \"${slackHookUrl}\" failed`);\n }\n if (!fetchResult.ok) {\n logger.debug(`${fetchResult.status} - ${fetchResult.statusText}`);\n throw new Error(\n `Sending Slack message to webhook url \"${slackHookUrl}\" failed with status ${fetchResult.status}`\n );\n }\n logger.info('Slack message sent successfully');\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"startAndroidEmulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startAndroidEmulator.ts"],"names":[],"mappings":"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","sourcesContent":["import { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { asyncResult } from '@expo/results';\n\nimport { retryAsync } from '../../utils/retry';\nimport {\n AndroidDeviceName,\n AndroidEmulatorUtils,\n AndroidVirtualDeviceName,\n} from '../../utils/AndroidEmulatorUtils';\n\nexport function createStartAndroidEmulatorBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_android_emulator',\n name: 'Start Android Emulator',\n __metricsId: 'eas/start_android_emulator',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'device_name',\n required: false,\n defaultValue: 'EasAndroidDevice01',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'device_identifier',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'system_image_package',\n required: false,\n defaultValue: AndroidEmulatorUtils.defaultSystemImagePackage,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { inputs, env }) => {\n try {\n const availableDevices = await AndroidEmulatorUtils.getAvailableDevicesAsync({ env });\n logger.info(`Available Android devices:\\n- ${availableDevices.join(`\\n- `)}`);\n } catch (error) {\n logger.info('Failed to list available Android devices.', error);\n } finally {\n logger.info('');\n }\n\n const deviceName = `${inputs.device_name.value}` as AndroidVirtualDeviceName;\n const systemImagePackage = `${inputs.system_image_package.value}`;\n // We can cast because allowedValueTypeName validated this is a string.\n const deviceIdentifier = inputs.device_identifier.value as AndroidDeviceName | undefined;\n\n logger.info('Making sure system image is installed');\n await retryAsync(\n async () => {\n await spawn('sdkmanager', [systemImagePackage], {\n env,\n logger,\n });\n },\n {\n logger,\n retryOptions: {\n retries: 3, // Retry 3 times\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info('Creating emulator device');\n await AndroidEmulatorUtils.createAsync({\n deviceName,\n systemImagePackage,\n deviceIdentifier: deviceIdentifier ?? null,\n env,\n logger,\n });\n\n logger.info('Starting emulator device');\n const { emulatorPromise, serialId } = await AndroidEmulatorUtils.startAsync({\n deviceName,\n env,\n });\n await AndroidEmulatorUtils.waitForReadyAsync({\n env,\n serialId,\n });\n logger.info(`${deviceName} is ready.`);\n\n const count = Number(inputs.count.value ?? 1);\n if (count > 1) {\n logger.info(`Requested ${count} emulators, shutting down ${deviceName} for cloning.`);\n await spawn('adb', ['-s', serialId, 'shell', 'reboot', '-p'], {\n logger,\n env,\n });\n // Waiting for source emulator to shutdown.\n // We don't care about resolved/rejected.\n await asyncResult(emulatorPromise);\n\n for (let i = 0; i < count; i++) {\n const cloneIdentifier = `eas-simulator-${i + 1}` as AndroidVirtualDeviceName;\n logger.info(`Cloning ${deviceName} to ${cloneIdentifier}...`);\n await AndroidEmulatorUtils.cloneAsync({\n sourceDeviceName: deviceName,\n destinationDeviceName: cloneIdentifier,\n env,\n logger,\n });\n\n logger.info('Starting emulator device');\n const { serialId } = await AndroidEmulatorUtils.startAsync({\n deviceName: cloneIdentifier,\n env,\n });\n\n logger.info('Waiting for emulator to become ready');\n await AndroidEmulatorUtils.waitForReadyAsync({\n serialId,\n env,\n });\n\n logger.info(`${cloneIdentifier} is ready.`);\n }\n }\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"startCuttlefishDevice.js","sourceRoot":"","sources":["../../../src/steps/functions/startCuttlefishDevice.ts"],"names":[],"mappings":";;;;;AAuCA,4FAmGC;AA1ID,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAE7B,uCAAyF;AACzF,sEAAuC;AACvC,2CAA4C;AAE5C,6CAA+C;AAE/C,6LAA6L;AAC7L,oKAAoK;AACpK,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE;QACN,YAAY,EAAE,qEAAqE;KACpF;IACD,SAAS,EAAE;QACT;YACE,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE;gBACR,QAAQ,EAAE;oBACR,UAAU;oBACV;wBACE,GAAG,EAAE,GAAG;wBACR,MAAM,EAAE,IAAI;wBACZ,KAAK,EAAE,IAAI;qBACZ;iBACF;aACF;YACD,EAAE,EAAE;gBACF,SAAS,EAAE,IAAI;aAChB;YACD,IAAI,EAAE;gBACJ,aAAa,EAAE,4DAA4D;aAC5E;SACF;KACF;CACF,CAAC;AAEF,SAAgB,wCAAwC;IACtD,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,yBAAyB;QAC7B,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,6BAA6B;QAC1C,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,CAAC;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,mCAAI,CAAC,CAAC,CAAC;YAExC,MAAM,eAAe,GAAG,MAAM,IAAA,qBAAW,EACvC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAA,sBAAK,EAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAA,sBAAK,EAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAC3F,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,KAAK,CACV,eAAe,CAAC,MAAM,EACtB,0KAA0K,CAC3K,CAAC;gBACF,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtD,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAE1D,MAAM,IAAA,sBAAK,EACT,QAAQ,EACR;gBACE,KAAK;gBACL,UAAU;gBACV,QAAQ;gBACR,yBAAyB;gBACzB,WAAW;gBACX,WAAW;gBACX,OAAO;gBACP,wBAAwB;gBACxB,UAAU;gBACV,sCAAsC;gBACtC,UAAU;gBACV,2CAA2C;gBAC3C,OAAO;gBACP,gHAAgH;aACjH,EACD,EAAE,GAAG,EAAE,MAAM,EAAE,CAChB,CAAC;YAEF,0CAA0C;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM,CAAC;YAC1C,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAW,EAAC,IAAA,sBAAK,EAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;oBACd,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBACjD,MAAM;gBACR,CAAC;gBACD,qBAAqB;gBACrB,MAAM,IAAA,kBAAU,EAAC,IAAK,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE5B,MAAM,IAAI,GAAG,EAAE,CAAC;YAEhB,MAAM,aAAa,GAAG,MAAA,GAAG,CAAC,eAAe,mCAAI,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC7E,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,mBAAmB,GAAG,MAAM,iBAAE,CAAC,QAAQ,CAAC,OAAO,CACnD,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAC5C,CAAC;gBACF,MAAM,cAAc,GAAG,mBAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;gBACrE,MAAM,iBAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBAC3D,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,IAAA,sBAAK,EAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAE1D,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACtC,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { asyncResult } from '@expo/results';\n\nimport { sleepAsync } from '../../utils/retry';\n\n// Needs to conform to https://github.com/google/android-cuttlefish/blob/928026d2833b3e326d9d3b4a9a477e522b37b825/base/cvd/cuttlefish/host/commands/cvd/cli/parser/load_config.proto#L29-L36.\n// See example: https://github.com/google/android-cuttlefish/blob/928026d2833b3e326d9d3b4a9a477e522b37b825/base/cvd/cuttlefish/host/cvd_test_configs/main_phone.json\nconst CVD_CONFIG_JSON = {\n common: {\n host_package: '@ab/aosp-android-latest-release/aosp_cf_x86_64_only_phone-userdebug',\n },\n instances: [\n {\n '@import': 'phone',\n graphics: {\n displays: [\n // Pixel 5\n {\n dpi: 432,\n height: 2340,\n width: 1080,\n },\n ],\n },\n vm: {\n memory_mb: 4096,\n },\n disk: {\n default_build: '@ab/aosp-main/aosp_cf_x86_64_phone-trunk_staging-userdebug',\n },\n },\n ],\n};\n\nexport function createStartCuttlefishDeviceBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_cuttlefish_device',\n name: 'Start Cuttlefish Device',\n __metricsId: 'eas/start_cuttlefish_device',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { env, inputs }) => {\n const count = Number(inputs.count ?? 1);\n\n const dependencyCheck = await asyncResult(\n Promise.all([spawn('docker', ['--version'], { env }), spawn('cvdr', ['--help'], { env })])\n );\n if (!dependencyCheck.ok) {\n logger.error(\n dependencyCheck.reason,\n 'Cuttlefish requires Docker and cvdr, which are only available on the latest Android worker image. Add `image: latest` to your job configuration to use the latest image.'\n );\n throw new Error(\n 'Cuttlefish device start is only supported on the latest Android worker image.'\n );\n }\n\n logger.info('Starting adb server');\n await spawn('adb', ['start-server'], { env, logger });\n\n logger.info('Starting Cuttlefish Orchestrator container');\n\n await spawn(\n 'docker',\n [\n 'run',\n '--detach',\n '--name',\n 'cuttlefish-orchestrator',\n '--publish',\n '8080:8080',\n '--env',\n 'CONFIG_FILE=/conf.toml',\n '--volume',\n '/etc/cuttlefish/conf.toml:/conf.toml',\n '--volume',\n '/var/run/docker.sock:/var/run/docker.sock',\n '--tty',\n 'us-docker.pkg.dev/android-cuttlefish-artifacts/cuttlefish-orchestration/cuttlefish-cloud-orchestrator:unstable',\n ],\n { env, logger }\n );\n\n // Wait a minute tops for cvdr to be ready\n const readyDeadline = Date.now() + 60_000;\n let cvdrReady = false;\n while (Date.now() < readyDeadline) {\n const result = await asyncResult(spawn('cvdr', ['list'], { env }));\n if (result.ok) {\n cvdrReady = true;\n logger.info('Cuttlefish Orchestrator is ready!');\n break;\n }\n // Chekc every second\n await sleepAsync(1_000);\n }\n\n if (!cvdrReady) {\n throw new Error('Timed out waiting for Cuttlefish Orchestrator to be ready.');\n }\n\n logger.info('Creating CVD');\n\n const args = [];\n\n const cvdConfigJson = env.CVD_CONFIG_JSON ?? JSON.stringify(CVD_CONFIG_JSON);\n if (cvdConfigJson) {\n const configJsonDirectory = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), 'start_cuttlefish-')\n );\n const configJsonPath = path.join(configJsonDirectory, 'config.json');\n await fs.promises.writeFile(configJsonPath, cvdConfigJson);\n args.push(configJsonPath);\n }\n\n if (count > 1) {\n args.push('--num_instances', String(count));\n }\n\n await spawn('cvdr', ['create', ...args], { env, logger });\n\n logger.info('Listing adb devices...');\n await spawn('adb', ['devices'], { env, logger });\n await spawn('adb', ['shell', 'input', 'keyevent', '82'], { env, logger });\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"startIosSimulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startIosSimulator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BuildFunction,\n BuildStepEnv,\n BuildStepInput,\n BuildStepInputValueTypeName,\n} from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { minBy } from 'lodash';\n\nimport {\n IosSimulatorName,\n IosSimulatorUtils,\n IosSimulatorUuid,\n} from '../../utils/IosSimulatorUtils';\n\nexport function createStartIosSimulatorBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_ios_simulator',\n name: 'Start iOS Simulator',\n __metricsId: 'eas/start_ios_simulator',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'device_identifier',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { inputs, env }) => {\n try {\n const availableDevices = await IosSimulatorUtils.getAvailableDevicesAsync({\n env,\n filter: 'available',\n });\n logger.info(\n `Available Simulator devices:\\n- ${availableDevices\n .map((device) => device.displayName)\n .join(`\\n- `)}`\n );\n } catch (error) {\n logger.info('Failed to list available Simulator devices.', error);\n } finally {\n logger.info('');\n }\n\n const deviceIdentifierInput = inputs.device_identifier.value?.toString() as\n | IosSimulatorUuid\n | IosSimulatorName\n | undefined;\n const originalDeviceIdentifier =\n deviceIdentifierInput ?? (await findMostGenericIphoneUuidAsync({ env }));\n\n if (!originalDeviceIdentifier) {\n throw new Error('Could not find an iPhone among available simulator devices.');\n }\n\n const { udid } = await IosSimulatorUtils.startAsync({\n deviceIdentifier: originalDeviceIdentifier,\n env,\n });\n\n await IosSimulatorUtils.waitForReadyAsync({ udid, env });\n\n logger.info('');\n\n const device = await IosSimulatorUtils.getDeviceAsync({ udid, env });\n const formattedDevice = device?.displayName ?? originalDeviceIdentifier;\n logger.info(`${formattedDevice} is ready.`);\n\n const count = Number(inputs.count.value ?? 1);\n if (count > 1) {\n logger.info(`Requested ${count} Simulators, shutting down ${formattedDevice} for cloning.`);\n await spawn('xcrun', ['simctl', 'shutdown', originalDeviceIdentifier], {\n logger,\n env,\n });\n\n for (let i = 0; i < count; i++) {\n const cloneDeviceName = `eas-simulator-${i + 1}` as IosSimulatorName;\n logger.info(`Cloning ${formattedDevice} to ${cloneDeviceName}...`);\n\n await IosSimulatorUtils.cloneAsync({\n sourceDeviceIdentifier: originalDeviceIdentifier,\n destinationDeviceName: cloneDeviceName,\n env,\n });\n\n const { udid: cloneUdid } = await IosSimulatorUtils.startAsync({\n deviceIdentifier: cloneDeviceName,\n env,\n });\n\n await IosSimulatorUtils.waitForReadyAsync({\n udid: cloneUdid,\n env,\n });\n\n logger.info(`${cloneDeviceName} is ready.`);\n logger.info('');\n }\n }\n },\n });\n}\n\nasync function findMostGenericIphoneUuidAsync({\n env,\n}: {\n env: BuildStepEnv;\n}): Promise<IosSimulatorUuid | null> {\n const availableSimulatorDevices = await IosSimulatorUtils.getAvailableDevicesAsync({\n env,\n filter: 'available',\n });\n const availableIphones = availableSimulatorDevices.filter((device) =>\n device.name.startsWith('iPhone')\n );\n // It's funny, but it works.\n const iphoneWithShortestName = minBy(availableIphones, (device) => device.name.length);\n return iphoneWithShortestName?.udid ?? null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploadArtifact.js","sourceRoot":"","sources":["../../../src/steps/functions/uploadArtifact.ts"],"names":[],"mappings":";;;;;AAkBA,8EA0HC;AA5ID,oDAA4B;AAE5B,uDAAoF;AACpF,uCAKqB;AAGrB,qDAA0E;AAE1E,MAAM,sCAAsC,GAAoD;IAC9F,qBAAqB,EAAE,mCAAmB,CAAC,mBAAmB;IAC9D,gBAAgB,EAAE,mCAAmB,CAAC,eAAe;CACtD,CAAC;AAEF,SAAgB,iCAAiC,CAAC,GAAuB;IACvE,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,qBAAqB;QAClC,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,aAAa,EAAE;oBACb,mCAAmB,CAAC,mBAAmB;oBACvC,mCAAmB,CAAC,eAAe;oBACnC,GAAG,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC;oBACtD,GAAG,MAAM,CAAC,MAAM,CAAC,mCAAmB,CAAC;iBACtC;gBACD,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,KAAK;gBACT,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF;;;;;;;;;eASG;YACH,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,OAAO;aAC1D,CAAC;SACH;QACD,eAAe,EAAE;YACf,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,aAAa;gBACjB,QAAQ,EAAE,KAAK;aAChB,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;;YACpD,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;YAEzD,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK;iBAC1C,QAAQ,EAAE;iBACV,KAAK,CAAC,IAAI,CAAC;gBACZ,2CAA2C;iBAC1C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YAE5B,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,UAAU,CACrD,mBAAmB,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CACxC,IAAA,yBAAa,EAAC;gBACZ,OAAO,EAAE,MAAM,CAAC,sBAAsB;gBACtC,aAAa;gBACb,qCAAqC;gBACrC,MAAM,EAAE,IAAI;aACb,CAAC,CACH,CACF,CAAC;YAEF,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBACrE,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CACT,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,oBAAoB,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAC/E,CAAC;oBACF,OAAO,MAAM,CAAC,KAAK,CAAC;gBACtB,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,YAAY,8BAAkB,EAAE,CAAC;oBAChF,MAAM,CAAC,IAAI,CAAC,oCAAoC,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACzF,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,MAAM,MAAM,CAAC,MAAM,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,sBAAsB,CAAC;oBAC3B,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ;oBAC1B,UAAU,EAAE,GAAG,MAAA,MAAM,CAAC,IAAI,CAAC,KAAK,mCAAI,EAAE,EAAE;iBACzC,CAAC;gBACF,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAW;aACxD,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;oBACzD,QAAQ;oBACR,MAAM;iBACP,CAAC,CAAC;gBAEH,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;oBAC9B,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,IAAI,mBAAmB,EAAE,KAAK,CAAC,CAAC;oBAC1E,kBAAkB;oBAClB,OAAO;gBACT,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,EAC9B,UAAU,EACV,QAAQ,GAIT;IACC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,kEAAkE;QAClE,OAAO,QAAQ,CAAC,CAAC,CAAC,mCAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC,mCAAmB,CAAC,KAAK,CAAC;IACxF,CAAC;IAED,+CAA+C;IAC/C,kDAAkD;IAClD,kCAAkC;IAClC,MAAM,6BAA6B,GAAG,sCAAsC,CAAC,UAAU,CAAC,CAAC;IACzF,IAAI,6BAA6B,EAAE,CAAC;QAClC,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,OAAO,UAAuD,CAAC;AACjE,CAAC","sourcesContent":["import assert from 'assert';\n\nimport { GenericArtifactType, Job, ManagedArtifactType } from '@expo/eas-build-job';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\n\nimport { CustomBuildContext } from '../../customBuildContext';\nimport { FindArtifactsError, findArtifacts } from '../../utils/artifacts';\n\nconst artifactTypeInputToManagedArtifactType: Record<string, ManagedArtifactType | undefined> = {\n 'application-archive': ManagedArtifactType.APPLICATION_ARCHIVE,\n 'build-artifact': ManagedArtifactType.BUILD_ARTIFACTS,\n};\n\nexport function createUploadArtifactBuildFunction(ctx: CustomBuildContext): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'upload_artifact',\n name: 'Upload artifact',\n __metricsId: 'eas/upload_artifact',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'type',\n allowedValues: [\n ManagedArtifactType.APPLICATION_ARCHIVE,\n ManagedArtifactType.BUILD_ARTIFACTS,\n ...Object.keys(artifactTypeInputToManagedArtifactType),\n ...Object.values(GenericArtifactType),\n ],\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n defaultValue: '',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'name',\n defaultValue: '',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n /**\n * path inputs expects a list of newline-delimited search paths.\n * Valid examples include:\n * - path: app/artifact.app\n * - path: app/*.app\n * - path: |\n * assets/*.png\n * assets/*.jpg\n * public/another-photo.jpg\n */\n BuildStepInput.createProvider({\n id: 'path',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'ignore_error',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.BOOLEAN,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: 'artifact_id',\n required: false,\n }),\n ],\n fn: async ({ logger, global }, { inputs, outputs }) => {\n assert(inputs.path.value, 'Path input cannot be empty.');\n\n const artifactSearchPaths = inputs.path.value\n .toString()\n .split('\\n')\n // It's easy to get an empty line with YAML\n .filter((entry) => entry);\n\n const artifactsSearchResults = await Promise.allSettled(\n artifactSearchPaths.map((patternOrPath) =>\n findArtifacts({\n rootDir: global.projectTargetDirectory,\n patternOrPath,\n // We're logging the error ourselves.\n logger: null,\n })\n )\n );\n\n const artifactPaths = artifactsSearchResults.flatMap((result, index) => {\n if (result.status === 'fulfilled') {\n logger.info(\n `Found ${result.value.length} paths matching \"${artifactSearchPaths[index]}\".`\n );\n return result.value;\n }\n\n if (result.status === 'rejected' && result.reason instanceof FindArtifactsError) {\n logger.warn(`Did not find any paths matching \"${artifactSearchPaths[index]}. Ignoring.`);\n return [];\n }\n\n throw result.reason;\n });\n\n const artifact = {\n type: parseArtifactTypeInput({\n platform: ctx.job.platform,\n inputValue: `${inputs.type.value ?? ''}`,\n }),\n paths: artifactPaths,\n name: (inputs.name.value || inputs.key.value) as string,\n };\n\n try {\n const { artifactId } = await ctx.runtimeApi.uploadArtifact({\n artifact,\n logger,\n });\n\n if (artifactId) {\n outputs.artifact_id.set(artifactId);\n }\n } catch (error) {\n if (inputs.ignore_error.value) {\n logger.error(`Failed to upload ${artifact.type}. Ignoring error.`, error);\n // Ignoring error.\n return;\n }\n\n throw error;\n }\n },\n });\n}\n\n/**\n * Initially, upload_artifact supported application-archive and build-artifact.\n * Then, mistakenly, support for it was removed in favor of supporting ManagedArtifactType\n * values. This makes sure we support all:\n * - kebab-case managed artifact types (the original)\n * - snake-caps-case managed artifact types (the mistake)\n * - generic artifact types.\n */\nfunction parseArtifactTypeInput({\n inputValue,\n platform,\n}: {\n inputValue: string;\n platform: Job['platform'];\n}): GenericArtifactType | ManagedArtifactType {\n if (!inputValue) {\n // In build jobs the default artifact type is application-archive.\n return platform ? ManagedArtifactType.APPLICATION_ARCHIVE : GenericArtifactType.OTHER;\n }\n\n // Step's allowedValues ensures input is either\n // a key of artifactTypeInputToManagedArtifactType\n // or a value of an artifact type.\n const translatedManagedArtifactType = artifactTypeInputToManagedArtifactType[inputValue];\n if (translatedManagedArtifactType) {\n return translatedManagedArtifactType;\n }\n\n return inputValue as GenericArtifactType | ManagedArtifactType;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useNpmToken.js","sourceRoot":"","sources":["../../../src/steps/functions/useNpmToken.ts"],"names":[],"mappings":";;;;;AAQA,sEA+BC;AAvCD,gDAAwB;AAExB,wDAA0B;AAC1B,uCAA4C;AAE5C,+DAAiE;AACjE,iDAAsD;AAEtD,SAAgB,6BAA6B;IAC3C,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,mBAAmB;QAChC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAC3B,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;gBAC3E,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;gBACpF,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;oBACtF,MAAM,CAAC,IAAI,CAAC,qBAAa,CAAC,CAAC;oBAC3B,MAAM,kBAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,qBAAa,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,oCAAmB,EAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC5F,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC1C,MAAM,CAAC,IAAI,CACT,mBAAmB,cAAI,CAAC,QAAQ,CAC9B,OAAO,CAAC,MAAM,CAAC,sBAAsB,EACrC,gBAAgB,CACjB,EAAE,CACJ,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import path from 'path';\n\nimport fs from 'fs-extra';\nimport { BuildFunction } from '@expo/steps';\n\nimport { findPackagerRootDir } from '../../utils/packageManager';\nimport { NpmrcTemplate } from '../../templates/npmrc';\n\nexport function createSetUpNpmrcBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'use_npm_token',\n name: 'Use NPM_TOKEN',\n __metricsId: 'eas/use_npm_token',\n fn: async (stepCtx, { env }) => {\n const { logger } = stepCtx;\n if (env.NPM_TOKEN) {\n logger.info('We detected that you set the NPM_TOKEN environment variable');\n const projectNpmrcPath = path.join(stepCtx.global.projectTargetDirectory, '.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 } else {\n const projectNpmrcPath = path.join(findPackagerRootDir(stepCtx.workingDirectory), '.npmrc');\n if (await fs.pathExists(projectNpmrcPath)) {\n logger.info(\n `.npmrc found at ${path.relative(\n stepCtx.global.projectTargetDirectory,\n projectNpmrcPath\n )}`\n );\n }\n }\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../../../src/steps/utils/android/expoUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import { AndroidConfig } from '@expo/config-plugins';\nimport fs from 'fs-extra';\n\nexport enum AndroidMetadataName {\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n}\n\nexport async function androidSetChannelNativelyAsync(\n channel: string,\n workingDirectory: string\n): Promise<void> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(workingDirectory);\n\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n const stringifiedUpdatesRequestHeaders = AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY\n );\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY,\n JSON.stringify({\n ...JSON.parse(stringifiedUpdatesRequestHeaders ?? '{}'),\n 'expo-channel-name': channel,\n }),\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidSetRuntimeVersionNativelyAsync(\n runtimeVersion: string,\n workingDirectory: string\n): Promise<void> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(workingDirectory);\n\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.RUNTIME_VERSION,\n runtimeVersion,\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidGetNativelyDefinedChannelAsync(\n workingDirectory: string\n): Promise<string | null> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(workingDirectory);\n\n if (!(await fs.pathExists(manifestPath))) {\n return null;\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const stringifiedUpdatesRequestHeaders = AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY\n );\n try {\n const updatesRequestHeaders = JSON.parse(stringifiedUpdatesRequestHeaders ?? '{}');\n return updatesRequestHeaders['expo-channel-name'] ?? null;\n } catch (err: any) {\n throw new Error(\n `Failed to parse ${AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY} from AndroidManifest.xml: ${err.message}`\n );\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../../../src/steps/utils/android/gradle.ts"],"names":[],"mappings":";;;;;AASA,4CAkCC;AAgED,oDAcC;AAzHD,oDAA4B;AAC5B,gDAAwB;AAExB,wDAA0B;AAG1B,sEAAsE;AACtE,uDAA8C;AAEvC,KAAK,UAAU,gBAAgB,CAAC,EACrC,MAAM,EACN,aAAa,EACb,UAAU,EACV,GAAG,EACH,QAAQ,GAOT;IACC,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,MAAM,CAAC,IAAI,CAAC,oBAAoB,aAAa,IAAI,WAAW,QAAQ,UAAU,EAAE,CAAC,CAAC;IAClF,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAA,sBAAK,EAAC,MAAM,EAAE,CAAC,IAAI,EAAE,aAAa,aAAa,IAAI,WAAW,EAAE,CAAC,EAAE;QACtF,GAAG,EAAE,UAAU;QACf,MAAM;QACN,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE;KAC7B,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,gBAAgB,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzE,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,YAAY,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,YAAuC,EAAE,MAAc;IAC7E,UAAU,CACR,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,IAAA,gBAAM,EAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,sCAAsC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClF,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC7B,uEAAuE;gBACvE,kFAAkF;gBAClF,sEAAsE;gBACtE,MAAM,gBAAgB,GAAG,GAAG,CAAC;gBAC7B,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,IAAI,CAAC,CAAC;YAC5E,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,+DAA+D;IAC/D,KAAK,CACN,CAAC;AACJ,CAAC;AAED,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;AAED,KAAK,UAAU,sCAAsC,CAAC,IAAY;IAChE,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;AAED,SAAgB,oBAAoB,CAAC,GAAgB,EAAE,OAAgB;IACrE,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;SAAM,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,aAAa,CAAC;IAC3B,CAAC;SAAM,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACjC,OAAO,oBAAoB,CAAC;IAC9B,CAAC;SAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,oBAAoB,CAAC;IAC9B,CAAC;SAAM,IAAI,GAAG,CAAC,SAAS,KAAK,uBAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,sBAAsB,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,oBAAoB,CAAC;IAC9B,CAAC;AACH,CAAC","sourcesContent":["import assert from 'assert';\nimport path from 'path';\n\nimport fs from 'fs-extra';\nimport { bunyan } from '@expo/logger';\nimport { BuildStepEnv } from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { Android } from '@expo/eas-build-job';\n\nexport async function runGradleCommand({\n logger,\n gradleCommand,\n androidDir,\n env,\n extraEnv,\n}: {\n logger: bunyan;\n gradleCommand: string;\n androidDir: string;\n env: BuildStepEnv;\n extraEnv?: BuildStepEnv;\n}): Promise<void> {\n const verboseFlag = env['EAS_VERBOSE'] === '1' ? '--info' : '';\n\n logger.info(`Running 'gradlew ${gradleCommand} ${verboseFlag}' in ${androidDir}`);\n await fs.chmod(path.join(androidDir, 'gradlew'), 0o755);\n const spawnPromise = spawn('bash', ['-c', `./gradlew ${gradleCommand} ${verboseFlag}`], {\n cwd: androidDir,\n logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: { ...env, ...extraEnv },\n });\n if (env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {\n adjustOOMScore(spawnPromise, logger);\n }\n\n await spawnPromise;\n}\n\n/**\n * OOM Killer sometimes kills worker server while build is exceeding memory limits.\n * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.\n * It defines which process is more likely to get killed (higher value more likely).\n *\n * This function sets oom_score_adj for Gradle process and all its child processes.\n */\nfunction adjustOOMScore(spawnPromise: SpawnPromise<SpawnResult>, logger: bunyan): void {\n setTimeout(\n async () => {\n try {\n assert(spawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(spawnPromise.child.pid);\n await Promise.all(\n pids.map(async (pid: number) => {\n // Value 800 is just a guess here. It's probably higher than most other\n // process. I didn't want to set it any higher, because I'm not sure if OOM Killer\n // can start killing processes when there is still enough memory left.\n const oomScoreOverride = 800;\n await fs.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\\n`);\n })\n );\n } catch (err: any) {\n logger.debug({ err, stderr: err?.stderr }, 'Failed to override oom_score_adj');\n }\n },\n // Wait 20 seconds to make sure all child processes are started\n 20000\n );\n}\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\nasync 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\nexport function resolveGradleCommand(job: Android.Job, command?: string): string {\n if (command) {\n return command;\n } else if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}