@invarn/cibuild 1.3.16 → 1.3.18

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 (242) hide show
  1. package/dist/cli.cjs +1 -1
  2. package/dist/src/cli.d.ts +3 -0
  3. package/dist/src/cli.d.ts.map +1 -0
  4. package/dist/src/cli.js +987 -0
  5. package/dist/src/commands/android-scanner.d.ts +32 -0
  6. package/dist/src/commands/android-scanner.d.ts.map +1 -0
  7. package/dist/src/commands/android-scanner.js +667 -0
  8. package/dist/src/commands/build.d.ts +5 -0
  9. package/dist/src/commands/build.d.ts.map +1 -0
  10. package/dist/src/commands/build.js +1096 -0
  11. package/dist/src/commands/edit.d.ts +3 -0
  12. package/dist/src/commands/edit.d.ts.map +1 -0
  13. package/dist/src/commands/edit.js +651 -0
  14. package/dist/src/commands/file-secret-collector.d.ts +37 -0
  15. package/dist/src/commands/file-secret-collector.d.ts.map +1 -0
  16. package/dist/src/commands/file-secret-collector.js +199 -0
  17. package/dist/src/commands/github-workflow.d.ts +5 -0
  18. package/dist/src/commands/github-workflow.d.ts.map +1 -0
  19. package/dist/src/commands/github-workflow.js +45 -0
  20. package/dist/src/commands/ios-scanner.d.ts +27 -0
  21. package/dist/src/commands/ios-scanner.d.ts.map +1 -0
  22. package/dist/src/commands/ios-scanner.js +337 -0
  23. package/dist/src/commands/reset.d.ts +7 -0
  24. package/dist/src/commands/reset.d.ts.map +1 -0
  25. package/dist/src/commands/reset.js +81 -0
  26. package/dist/src/commands/secrets-sync-workflow.d.ts +15 -0
  27. package/dist/src/commands/secrets-sync-workflow.d.ts.map +1 -0
  28. package/dist/src/commands/secrets-sync-workflow.js +255 -0
  29. package/dist/src/commands/secrets-upload.d.ts +21 -0
  30. package/dist/src/commands/secrets-upload.d.ts.map +1 -0
  31. package/dist/src/commands/secrets-upload.js +177 -0
  32. package/dist/src/commands/secrets-upload.test.d.ts +5 -0
  33. package/dist/src/commands/secrets-upload.test.d.ts.map +1 -0
  34. package/dist/src/commands/secrets-upload.test.js +60 -0
  35. package/dist/src/config.d.ts +3 -0
  36. package/dist/src/config.d.ts.map +1 -0
  37. package/dist/src/config.js +47 -0
  38. package/dist/src/envman/cli.d.ts +21 -0
  39. package/dist/src/envman/cli.d.ts.map +1 -0
  40. package/dist/src/envman/cli.js +240 -0
  41. package/dist/src/envman/envman.d.ts +83 -0
  42. package/dist/src/envman/envman.d.ts.map +1 -0
  43. package/dist/src/envman/envman.js +361 -0
  44. package/dist/src/envman/envman.test.d.ts +5 -0
  45. package/dist/src/envman/envman.test.d.ts.map +1 -0
  46. package/dist/src/envman/envman.test.js +236 -0
  47. package/dist/src/envman/index.d.ts +23 -0
  48. package/dist/src/envman/index.d.ts.map +1 -0
  49. package/dist/src/envman/index.js +23 -0
  50. package/dist/src/envman/types.d.ts +55 -0
  51. package/dist/src/envman/types.d.ts.map +1 -0
  52. package/dist/src/envman/types.js +12 -0
  53. package/dist/src/lib.d.ts +27 -0
  54. package/dist/src/lib.d.ts.map +1 -0
  55. package/dist/src/lib.js +32 -0
  56. package/dist/src/pipeline.d.ts +3 -0
  57. package/dist/src/pipeline.d.ts.map +1 -0
  58. package/dist/src/pipeline.js +57 -0
  59. package/dist/src/runner.d.ts +17 -0
  60. package/dist/src/runner.d.ts.map +1 -0
  61. package/dist/src/runner.js +234 -0
  62. package/dist/src/types.d.ts +58 -0
  63. package/dist/src/types.d.ts.map +1 -0
  64. package/dist/src/types.js +2 -0
  65. package/dist/src/yaml/bitrise-compat.d.ts +65 -0
  66. package/dist/src/yaml/bitrise-compat.d.ts.map +1 -0
  67. package/dist/src/yaml/bitrise-compat.js +206 -0
  68. package/dist/src/yaml/bitrise-compat.test.d.ts +5 -0
  69. package/dist/src/yaml/bitrise-compat.test.d.ts.map +1 -0
  70. package/dist/src/yaml/bitrise-compat.test.js +347 -0
  71. package/dist/src/yaml/converter.d.ts +33 -0
  72. package/dist/src/yaml/converter.d.ts.map +1 -0
  73. package/dist/src/yaml/converter.js +222 -0
  74. package/dist/src/yaml/converter.test.d.ts +5 -0
  75. package/dist/src/yaml/converter.test.d.ts.map +1 -0
  76. package/dist/src/yaml/converter.test.js +348 -0
  77. package/dist/src/yaml/e2e.test.d.ts +6 -0
  78. package/dist/src/yaml/e2e.test.d.ts.map +1 -0
  79. package/dist/src/yaml/e2e.test.js +446 -0
  80. package/dist/src/yaml/env-resolver.d.ts +120 -0
  81. package/dist/src/yaml/env-resolver.d.ts.map +1 -0
  82. package/dist/src/yaml/env-resolver.js +405 -0
  83. package/dist/src/yaml/env-resolver.test.d.ts +5 -0
  84. package/dist/src/yaml/env-resolver.test.d.ts.map +1 -0
  85. package/dist/src/yaml/env-resolver.test.js +502 -0
  86. package/dist/src/yaml/interactive-prompts.d.ts +71 -0
  87. package/dist/src/yaml/interactive-prompts.d.ts.map +1 -0
  88. package/dist/src/yaml/interactive-prompts.js +258 -0
  89. package/dist/src/yaml/missing-env-handler.d.ts +45 -0
  90. package/dist/src/yaml/missing-env-handler.d.ts.map +1 -0
  91. package/dist/src/yaml/missing-env-handler.js +64 -0
  92. package/dist/src/yaml/parser.d.ts +33 -0
  93. package/dist/src/yaml/parser.d.ts.map +1 -0
  94. package/dist/src/yaml/parser.js +145 -0
  95. package/dist/src/yaml/pipeline-with-secrets.d.ts +25 -0
  96. package/dist/src/yaml/pipeline-with-secrets.d.ts.map +1 -0
  97. package/dist/src/yaml/pipeline-with-secrets.js +76 -0
  98. package/dist/src/yaml/platform-detector.d.ts +83 -0
  99. package/dist/src/yaml/platform-detector.d.ts.map +1 -0
  100. package/dist/src/yaml/platform-detector.js +188 -0
  101. package/dist/src/yaml/platform-detector.test.d.ts +5 -0
  102. package/dist/src/yaml/platform-detector.test.d.ts.map +1 -0
  103. package/dist/src/yaml/platform-detector.test.js +414 -0
  104. package/dist/src/yaml/preflight-validation.d.ts +40 -0
  105. package/dist/src/yaml/preflight-validation.d.ts.map +1 -0
  106. package/dist/src/yaml/preflight-validation.js +152 -0
  107. package/dist/src/yaml/secrets-manager.d.ts +77 -0
  108. package/dist/src/yaml/secrets-manager.d.ts.map +1 -0
  109. package/dist/src/yaml/secrets-manager.js +219 -0
  110. package/dist/src/yaml/step-validator.d.ts +54 -0
  111. package/dist/src/yaml/step-validator.d.ts.map +1 -0
  112. package/dist/src/yaml/step-validator.js +403 -0
  113. package/dist/src/yaml/steps/android-sign.d.ts +35 -0
  114. package/dist/src/yaml/steps/android-sign.d.ts.map +1 -0
  115. package/dist/src/yaml/steps/android-sign.js +147 -0
  116. package/dist/src/yaml/steps/android-version.d.ts +26 -0
  117. package/dist/src/yaml/steps/android-version.d.ts.map +1 -0
  118. package/dist/src/yaml/steps/android-version.js +128 -0
  119. package/dist/src/yaml/steps/android-version.test.d.ts +5 -0
  120. package/dist/src/yaml/steps/android-version.test.d.ts.map +1 -0
  121. package/dist/src/yaml/steps/android-version.test.js +196 -0
  122. package/dist/src/yaml/steps/android.d.ts +95 -0
  123. package/dist/src/yaml/steps/android.d.ts.map +1 -0
  124. package/dist/src/yaml/steps/android.js +916 -0
  125. package/dist/src/yaml/steps/app-store-deploy.d.ts +48 -0
  126. package/dist/src/yaml/steps/app-store-deploy.d.ts.map +1 -0
  127. package/dist/src/yaml/steps/app-store-deploy.js +162 -0
  128. package/dist/src/yaml/steps/base.d.ts +238 -0
  129. package/dist/src/yaml/steps/base.d.ts.map +1 -0
  130. package/dist/src/yaml/steps/base.js +345 -0
  131. package/dist/src/yaml/steps/bitrise-android-tools.d.ts +26 -0
  132. package/dist/src/yaml/steps/bitrise-android-tools.d.ts.map +1 -0
  133. package/dist/src/yaml/steps/bitrise-android-tools.js +198 -0
  134. package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts +5 -0
  135. package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts.map +1 -0
  136. package/dist/src/yaml/steps/bitrise-android-tools.test.js +280 -0
  137. package/dist/src/yaml/steps/bitrise-apk-info.d.ts +22 -0
  138. package/dist/src/yaml/steps/bitrise-apk-info.d.ts.map +1 -0
  139. package/dist/src/yaml/steps/bitrise-apk-info.js +144 -0
  140. package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts +5 -0
  141. package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts.map +1 -0
  142. package/dist/src/yaml/steps/bitrise-apk-info.test.js +331 -0
  143. package/dist/src/yaml/steps/bitrise-slack.d.ts +49 -0
  144. package/dist/src/yaml/steps/bitrise-slack.d.ts.map +1 -0
  145. package/dist/src/yaml/steps/bitrise-slack.js +280 -0
  146. package/dist/src/yaml/steps/bitrise-slack.test.d.ts +5 -0
  147. package/dist/src/yaml/steps/bitrise-slack.test.d.ts.map +1 -0
  148. package/dist/src/yaml/steps/bitrise-slack.test.js +484 -0
  149. package/dist/src/yaml/steps/bitrise-ssh.d.ts +27 -0
  150. package/dist/src/yaml/steps/bitrise-ssh.d.ts.map +1 -0
  151. package/dist/src/yaml/steps/bitrise-ssh.js +134 -0
  152. package/dist/src/yaml/steps/bitrise-ssh.test.d.ts +5 -0
  153. package/dist/src/yaml/steps/bitrise-ssh.test.d.ts.map +1 -0
  154. package/dist/src/yaml/steps/bitrise-ssh.test.js +205 -0
  155. package/dist/src/yaml/steps/cache.d.ts +52 -0
  156. package/dist/src/yaml/steps/cache.d.ts.map +1 -0
  157. package/dist/src/yaml/steps/cache.js +352 -0
  158. package/dist/src/yaml/steps/fastlane.d.ts +27 -0
  159. package/dist/src/yaml/steps/fastlane.d.ts.map +1 -0
  160. package/dist/src/yaml/steps/fastlane.js +79 -0
  161. package/dist/src/yaml/steps/file.d.ts +27 -0
  162. package/dist/src/yaml/steps/file.d.ts.map +1 -0
  163. package/dist/src/yaml/steps/file.js +35 -0
  164. package/dist/src/yaml/steps/flutter.d.ts +63 -0
  165. package/dist/src/yaml/steps/flutter.d.ts.map +1 -0
  166. package/dist/src/yaml/steps/flutter.js +215 -0
  167. package/dist/src/yaml/steps/git-clone.d.ts +26 -0
  168. package/dist/src/yaml/steps/git-clone.d.ts.map +1 -0
  169. package/dist/src/yaml/steps/git-clone.js +111 -0
  170. package/dist/src/yaml/steps/google-play-deploy.d.ts +37 -0
  171. package/dist/src/yaml/steps/google-play-deploy.d.ts.map +1 -0
  172. package/dist/src/yaml/steps/google-play-deploy.js +193 -0
  173. package/dist/src/yaml/steps/google-play-deploy.test.d.ts +5 -0
  174. package/dist/src/yaml/steps/google-play-deploy.test.d.ts.map +1 -0
  175. package/dist/src/yaml/steps/google-play-deploy.test.js +310 -0
  176. package/dist/src/yaml/steps/index.d.ts +10 -0
  177. package/dist/src/yaml/steps/index.d.ts.map +1 -0
  178. package/dist/src/yaml/steps/index.js +1361 -0
  179. package/dist/src/yaml/steps/ios-deps.d.ts +43 -0
  180. package/dist/src/yaml/steps/ios-deps.d.ts.map +1 -0
  181. package/dist/src/yaml/steps/ios-deps.js +141 -0
  182. package/dist/src/yaml/steps/ios-deps.test.d.ts +5 -0
  183. package/dist/src/yaml/steps/ios-deps.test.d.ts.map +1 -0
  184. package/dist/src/yaml/steps/ios-deps.test.js +90 -0
  185. package/dist/src/yaml/steps/ios-signing.d.ts +31 -0
  186. package/dist/src/yaml/steps/ios-signing.d.ts.map +1 -0
  187. package/dist/src/yaml/steps/ios-signing.js +144 -0
  188. package/dist/src/yaml/steps/ios-version.d.ts +47 -0
  189. package/dist/src/yaml/steps/ios-version.d.ts.map +1 -0
  190. package/dist/src/yaml/steps/ios-version.js +151 -0
  191. package/dist/src/yaml/steps/linting.d.ts +47 -0
  192. package/dist/src/yaml/steps/linting.d.ts.map +1 -0
  193. package/dist/src/yaml/steps/linting.js +148 -0
  194. package/dist/src/yaml/steps/phase2.test.d.ts +6 -0
  195. package/dist/src/yaml/steps/phase2.test.d.ts.map +1 -0
  196. package/dist/src/yaml/steps/phase2.test.js +197 -0
  197. package/dist/src/yaml/steps/phase3.test.d.ts +5 -0
  198. package/dist/src/yaml/steps/phase3.test.d.ts.map +1 -0
  199. package/dist/src/yaml/steps/phase3.test.js +144 -0
  200. package/dist/src/yaml/steps/phase4.test.d.ts +5 -0
  201. package/dist/src/yaml/steps/phase4.test.d.ts.map +1 -0
  202. package/dist/src/yaml/steps/phase4.test.js +166 -0
  203. package/dist/src/yaml/steps/phase5.test.d.ts +6 -0
  204. package/dist/src/yaml/steps/phase5.test.d.ts.map +1 -0
  205. package/dist/src/yaml/steps/phase5.test.js +263 -0
  206. package/dist/src/yaml/steps/registry.d.ts +88 -0
  207. package/dist/src/yaml/steps/registry.d.ts.map +1 -0
  208. package/dist/src/yaml/steps/registry.js +125 -0
  209. package/dist/src/yaml/steps/registry.test.d.ts +5 -0
  210. package/dist/src/yaml/steps/registry.test.d.ts.map +1 -0
  211. package/dist/src/yaml/steps/registry.test.js +235 -0
  212. package/dist/src/yaml/steps/release.d.ts +50 -0
  213. package/dist/src/yaml/steps/release.d.ts.map +1 -0
  214. package/dist/src/yaml/steps/release.js +154 -0
  215. package/dist/src/yaml/steps/script.d.ts +23 -0
  216. package/dist/src/yaml/steps/script.d.ts.map +1 -0
  217. package/dist/src/yaml/steps/script.js +63 -0
  218. package/dist/src/yaml/steps/spec-validation.test.d.ts +6 -0
  219. package/dist/src/yaml/steps/spec-validation.test.d.ts.map +1 -0
  220. package/dist/src/yaml/steps/spec-validation.test.js +130 -0
  221. package/dist/src/yaml/steps/steps.test.d.ts +6 -0
  222. package/dist/src/yaml/steps/steps.test.d.ts.map +1 -0
  223. package/dist/src/yaml/steps/steps.test.js +505 -0
  224. package/dist/src/yaml/steps/test-config.d.ts +3 -0
  225. package/dist/src/yaml/steps/test-config.d.ts.map +1 -0
  226. package/dist/src/yaml/steps/test-config.js +17 -0
  227. package/dist/src/yaml/steps/xcode-new.test.d.ts +5 -0
  228. package/dist/src/yaml/steps/xcode-new.test.d.ts.map +1 -0
  229. package/dist/src/yaml/steps/xcode-new.test.js +211 -0
  230. package/dist/src/yaml/steps/xcode.d.ts +222 -0
  231. package/dist/src/yaml/steps/xcode.d.ts.map +1 -0
  232. package/dist/src/yaml/steps/xcode.js +999 -0
  233. package/dist/src/yaml/types.d.ts +68 -0
  234. package/dist/src/yaml/types.d.ts.map +1 -0
  235. package/dist/src/yaml/types.js +5 -0
  236. package/dist/src/yaml/validation-types.d.ts +96 -0
  237. package/dist/src/yaml/validation-types.d.ts.map +1 -0
  238. package/dist/src/yaml/validation-types.js +8 -0
  239. package/dist/src/yaml/yaml-updater.d.ts +24 -0
  240. package/dist/src/yaml/yaml-updater.d.ts.map +1 -0
  241. package/dist/src/yaml/yaml-updater.js +128 -0
  242. package/package.json +16 -4
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Android version code and version name step implementation
3
+ * Updates versionCode and versionName in build.gradle
4
+ */
5
+ import { BaseStepExecutor } from './base.js';
6
+ /**
7
+ * Change Android versionCode and versionName step executor
8
+ * Modifies build.gradle in-place using sed before the build runs
9
+ */
10
+ export class ChangeAndroidVersionStepExecutor extends BaseStepExecutor {
11
+ getOutputs() {
12
+ return [
13
+ { name: 'ANDROID_VERSION_CODE', type: 'environment', description: 'Final versionCode set in build.gradle' },
14
+ { name: 'ANDROID_VERSION_NAME', type: 'environment', description: 'Final versionName set in build.gradle' },
15
+ ];
16
+ }
17
+ getValidationRequirements(inputs, _env, _config) {
18
+ return [
19
+ this.requireInput('build_gradle_path', inputs, 'Path to build.gradle file'),
20
+ ];
21
+ }
22
+ async execute(inputs, _env, _config) {
23
+ const stepName = 'change-android-versioncode-and-versionname';
24
+ const commands = [];
25
+ const buildGradlePath = this.getInput(inputs, 'build_gradle_path', '$PROJECT_LOCATION/app/build.gradle');
26
+ const newVersionName = this.getInput(inputs, 'new_version_name', '');
27
+ const newVersionCode = this.getInput(inputs, 'new_version_code', '');
28
+ const versionCodeOffset = this.getInput(inputs, 'version_code_offset', '');
29
+ commands.push('# change-android-versioncode-and-versionname step');
30
+ commands.push('echo "📝 Updating Android version in build.gradle..."');
31
+ commands.push('');
32
+ // Set variables
33
+ commands.push(`BUILD_GRADLE="${this.escapeBash(buildGradlePath)}"`);
34
+ commands.push(`NEW_VERSION_NAME="${this.escapeBash(newVersionName)}"`);
35
+ commands.push(`NEW_VERSION_CODE="${this.escapeBash(newVersionCode)}"`);
36
+ commands.push(`VERSION_CODE_OFFSET="${this.escapeBash(versionCodeOffset)}"`);
37
+ commands.push('');
38
+ // Validate build_gradle_path
39
+ commands.push('if [ -z "$BUILD_GRADLE" ]; then');
40
+ commands.push(' echo "❌ Error: build_gradle_path is required"');
41
+ commands.push(' exit 1');
42
+ commands.push('fi');
43
+ commands.push('');
44
+ commands.push('# Auto-detect Kotlin DSL (.kts) if plain .gradle not found');
45
+ commands.push('if [ ! -f "$BUILD_GRADLE" ] && [ -f "${BUILD_GRADLE}.kts" ]; then');
46
+ commands.push(' BUILD_GRADLE="${BUILD_GRADLE}.kts"');
47
+ commands.push(' echo "Auto-detected Kotlin DSL: $BUILD_GRADLE"');
48
+ commands.push('fi');
49
+ commands.push('');
50
+ commands.push('if [ ! -f "$BUILD_GRADLE" ]; then');
51
+ commands.push(' echo "❌ Error: build.gradle not found: $BUILD_GRADLE"');
52
+ commands.push(' exit 1');
53
+ commands.push('fi');
54
+ commands.push('');
55
+ commands.push('echo "build.gradle: $BUILD_GRADLE"');
56
+ commands.push('');
57
+ // When version_code_offset is used alone (without new_version_code), we must read the
58
+ // current versionCode from the file — it must be a direct integer for that to work.
59
+ commands.push('# Validate direct integer only when version_code_offset is used without new_version_code');
60
+ commands.push('if [ -n "$VERSION_CODE_OFFSET" ] && [ -z "$NEW_VERSION_CODE" ]; then');
61
+ commands.push(' VCODE_LINE=$(grep -E "^[[:space:]]*versionCode" "$BUILD_GRADLE" | grep -v \'//\' | head -n 1)');
62
+ commands.push(' VCODE_DIRECT=$(echo "$VCODE_LINE" | grep -E "^[[:space:]]*versionCode[[:space:]]*(=[[:space:]]*)?[0-9]+[[:space:]]*$" || true)');
63
+ commands.push(' if [ -z "$VCODE_DIRECT" ]; then');
64
+ commands.push(' VCODE_FOUND=$(echo "$VCODE_LINE" | sed -E \'s/^[[:space:]]*versionCode[[:space:]]*(=[[:space:]]*)?//\')');
65
+ commands.push(' echo "❌ Error: version_code_offset requires a direct integer versionCode in the file"');
66
+ commands.push(' echo " Found: $VCODE_FOUND"');
67
+ commands.push(' echo " Only direct values work with version_code_offset, e.g.: versionCode = 42"');
68
+ commands.push(' echo " Use new_version_code instead to set an explicit value."');
69
+ commands.push(' exit 1');
70
+ commands.push(' fi');
71
+ commands.push('fi');
72
+ commands.push('');
73
+ // Handle version_code_offset: if no new_version_code, read current from file
74
+ commands.push('# Resolve version code with optional offset');
75
+ commands.push('if [ -n "$VERSION_CODE_OFFSET" ] && [ -z "$NEW_VERSION_CODE" ]; then');
76
+ commands.push(' CURRENT_CODE=$(grep -E "^[[:space:]]*versionCode" "$BUILD_GRADLE" | grep -v \'//\' | sed -E \'s/.*versionCode[[:space:]]*(=[[:space:]]*)?([0-9]+).*/\\2/\' | head -n 1)');
77
+ commands.push(' if [ -z "$CURRENT_CODE" ]; then');
78
+ commands.push(' echo "❌ Error: Could not read current versionCode from $BUILD_GRADLE"');
79
+ commands.push(' exit 1');
80
+ commands.push(' fi');
81
+ commands.push(' NEW_VERSION_CODE=$((CURRENT_CODE + VERSION_CODE_OFFSET))');
82
+ commands.push(' echo "Applied offset $VERSION_CODE_OFFSET to current versionCode $CURRENT_CODE → $NEW_VERSION_CODE"');
83
+ commands.push('elif [ -n "$VERSION_CODE_OFFSET" ] && [ -n "$NEW_VERSION_CODE" ]; then');
84
+ commands.push(' NEW_VERSION_CODE=$((NEW_VERSION_CODE + VERSION_CODE_OFFSET))');
85
+ commands.push(' echo "Applied offset $VERSION_CODE_OFFSET → final versionCode: $NEW_VERSION_CODE"');
86
+ commands.push('fi');
87
+ commands.push('');
88
+ // Update versionCode
89
+ commands.push('# Update versionCode if provided');
90
+ commands.push('if [ -n "$NEW_VERSION_CODE" ]; then');
91
+ commands.push(' sed -i.bak -E "s/(^[[:space:]]*versionCode[[:space:]]*(=[[:space:]]*)?).*$/\\1${NEW_VERSION_CODE}/" "$BUILD_GRADLE"');
92
+ commands.push(' rm -f "${BUILD_GRADLE}.bak"');
93
+ commands.push(' echo "Updated versionCode to: $NEW_VERSION_CODE"');
94
+ commands.push('else');
95
+ commands.push(' echo "versionCode: not changed (new_version_code not set)"');
96
+ commands.push('fi');
97
+ commands.push('');
98
+ // Update versionName
99
+ commands.push('# Update versionName if provided');
100
+ commands.push('if [ -n "$NEW_VERSION_NAME" ]; then');
101
+ commands.push(' sed -i.bak -E "s/(^[[:space:]]*versionName[[:space:]]*(=[[:space:]]*)?).*$/\\1\\"${NEW_VERSION_NAME}\\"/" "$BUILD_GRADLE"');
102
+ commands.push(' rm -f "${BUILD_GRADLE}.bak"');
103
+ commands.push(' echo "Updated versionName to: $NEW_VERSION_NAME"');
104
+ commands.push('else');
105
+ commands.push(' echo "versionName: not changed (new_version_name not set)"');
106
+ commands.push('fi');
107
+ commands.push('');
108
+ // Read back final values
109
+ commands.push('# Read back final values from file');
110
+ commands.push('FINAL_VERSION_CODE=$(grep -E "^[[:space:]]*versionCode" "$BUILD_GRADLE" | grep -v \'//\' | sed -E \'s/.*versionCode[[:space:]]*(=[[:space:]]*)?([0-9]+).*/\\2/\' | head -n 1)');
111
+ commands.push('FINAL_VERSION_NAME=$(grep -E "^[[:space:]]*versionName" "$BUILD_GRADLE" | grep -v \'//\' | sed -E \'s/.*versionName[[:space:]]*(=[[:space:]]*)?"([^"]*)".*/\\2/\' | head -n 1)');
112
+ commands.push('');
113
+ commands.push('echo ""');
114
+ commands.push('echo "Final versionCode: $FINAL_VERSION_CODE"');
115
+ commands.push('echo "Final versionName: $FINAL_VERSION_NAME"');
116
+ commands.push('');
117
+ // Export via envman
118
+ commands.push('# Export as environment variables for subsequent steps');
119
+ commands.push('envman add --key ANDROID_VERSION_CODE --value "$FINAL_VERSION_CODE"');
120
+ commands.push('envman add --key ANDROID_VERSION_NAME --value "$FINAL_VERSION_NAME"');
121
+ commands.push('');
122
+ commands.push('echo ""');
123
+ commands.push('echo "✅ Android version updated successfully"');
124
+ const script = this.createBashScriptFromCommands(commands, stepName);
125
+ return this.createScriptStep(script, stepName);
126
+ }
127
+ }
128
+ //# sourceMappingURL=android-version.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unit tests for change-android-versioncode-and-versionname step
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=android-version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android-version.test.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/android-version.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Unit tests for change-android-versioncode-and-versionname step
3
+ */
4
+ import { describe, test, expect } from '@jest/globals';
5
+ import { ChangeAndroidVersionStepExecutor } from './android-version.js';
6
+ describe('ChangeAndroidVersionStepExecutor', () => {
7
+ const mockConfig = {
8
+ artifactsDir: '/ci/artifacts',
9
+ interpreters: {
10
+ python: '/usr/bin/python3',
11
+ ruby: '/usr/bin/ruby',
12
+ node: '/usr/bin/node',
13
+ bash: '/bin/bash',
14
+ },
15
+ maxConcurrentJobs: 4,
16
+ paths: {
17
+ buildsDir: '/ci/builds',
18
+ cacheDir: '/ci/cache',
19
+ derivedDataDir: '/ci/derived_data',
20
+ },
21
+ };
22
+ describe('Basic functionality', () => {
23
+ test('should create a script step with correct name', async () => {
24
+ const executor = new ChangeAndroidVersionStepExecutor();
25
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
26
+ expect(result.kind).toBe('script');
27
+ expect(result.name).toBe('change-android-versioncode-and-versionname');
28
+ });
29
+ test('should include step label comment', async () => {
30
+ const executor = new ChangeAndroidVersionStepExecutor();
31
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
32
+ expect(result.script).toContain('change-android-versioncode-and-versionname step');
33
+ });
34
+ test('isSkippedInLocalMode should return false', () => {
35
+ const executor = new ChangeAndroidVersionStepExecutor();
36
+ expect(executor.isSkippedInLocalMode()).toBe(false);
37
+ });
38
+ });
39
+ describe('Script structure', () => {
40
+ test('should include bash error handling directives', async () => {
41
+ const executor = new ChangeAndroidVersionStepExecutor();
42
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
43
+ expect(result.script).toContain('#!/bin/bash');
44
+ expect(result.script).toContain('set -e');
45
+ expect(result.script).toContain('set -o pipefail');
46
+ });
47
+ test('should include success message', async () => {
48
+ const executor = new ChangeAndroidVersionStepExecutor();
49
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
50
+ expect(result.script).toContain('Android version updated successfully');
51
+ });
52
+ });
53
+ describe('Validation', () => {
54
+ test('should error if build_gradle_path is empty', async () => {
55
+ const executor = new ChangeAndroidVersionStepExecutor();
56
+ const result = await executor.execute({}, {}, mockConfig);
57
+ expect(result.script).toContain('build_gradle_path is required');
58
+ expect(result.script).toContain('exit 1');
59
+ });
60
+ test('should check that build.gradle file exists on disk', async () => {
61
+ const executor = new ChangeAndroidVersionStepExecutor();
62
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
63
+ expect(result.script).toContain('build.gradle not found');
64
+ expect(result.script).toContain('if [ ! -f "$BUILD_GRADLE" ]');
65
+ });
66
+ test('should set BUILD_GRADLE variable from input', async () => {
67
+ const executor = new ChangeAndroidVersionStepExecutor();
68
+ const result = await executor.execute({ build_gradle_path: '/my/project/app/build.gradle' }, {}, mockConfig);
69
+ expect(result.script).toContain('/my/project/app/build.gradle');
70
+ });
71
+ });
72
+ describe('Default build_gradle_path', () => {
73
+ test('should default to $PROJECT_LOCATION/app/build.gradle', async () => {
74
+ const executor = new ChangeAndroidVersionStepExecutor();
75
+ const result = await executor.execute({}, {}, mockConfig);
76
+ expect(result.script).toContain('$PROJECT_LOCATION/app/build.gradle');
77
+ });
78
+ });
79
+ describe('versionCode update', () => {
80
+ test('should include sed command when new_version_code is provided', async () => {
81
+ const executor = new ChangeAndroidVersionStepExecutor();
82
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle', new_version_code: '42' }, {}, mockConfig);
83
+ expect(result.script).toContain('sed -i.bak');
84
+ expect(result.script).toContain('versionCode');
85
+ });
86
+ test('should skip versionCode update when not provided', async () => {
87
+ const executor = new ChangeAndroidVersionStepExecutor();
88
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
89
+ expect(result.script).toContain('versionCode: not changed');
90
+ });
91
+ test('should set NEW_VERSION_CODE variable', async () => {
92
+ const executor = new ChangeAndroidVersionStepExecutor();
93
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle', new_version_code: '100' }, {}, mockConfig);
94
+ expect(result.script).toContain('NEW_VERSION_CODE="100"');
95
+ });
96
+ });
97
+ describe('versionName update', () => {
98
+ test('should include sed command when new_version_name is provided', async () => {
99
+ const executor = new ChangeAndroidVersionStepExecutor();
100
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle', new_version_name: '2.0.0' }, {}, mockConfig);
101
+ expect(result.script).toContain('sed -i.bak');
102
+ expect(result.script).toContain('versionName');
103
+ });
104
+ test('should skip versionName update when not provided', async () => {
105
+ const executor = new ChangeAndroidVersionStepExecutor();
106
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
107
+ expect(result.script).toContain('versionName: not changed');
108
+ });
109
+ test('should set NEW_VERSION_NAME variable', async () => {
110
+ const executor = new ChangeAndroidVersionStepExecutor();
111
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle', new_version_name: '1.5.3' }, {}, mockConfig);
112
+ expect(result.script).toContain('NEW_VERSION_NAME="1.5.3"');
113
+ });
114
+ });
115
+ describe('version_code_offset', () => {
116
+ test('should apply offset to new_version_code when both are provided', async () => {
117
+ const executor = new ChangeAndroidVersionStepExecutor();
118
+ const result = await executor.execute({
119
+ build_gradle_path: '/app/build.gradle',
120
+ new_version_code: '100',
121
+ version_code_offset: '5',
122
+ }, {}, mockConfig);
123
+ expect(result.script).toContain('VERSION_CODE_OFFSET="5"');
124
+ expect(result.script).toContain('NEW_VERSION_CODE=$((NEW_VERSION_CODE + VERSION_CODE_OFFSET))');
125
+ });
126
+ test('should read current versionCode from file when only offset is provided', async () => {
127
+ const executor = new ChangeAndroidVersionStepExecutor();
128
+ const result = await executor.execute({
129
+ build_gradle_path: '/app/build.gradle',
130
+ version_code_offset: '1',
131
+ }, {}, mockConfig);
132
+ expect(result.script).toContain('CURRENT_CODE=$(grep');
133
+ expect(result.script).toContain('NEW_VERSION_CODE=$((CURRENT_CODE + VERSION_CODE_OFFSET))');
134
+ });
135
+ test('should error if offset-only and current code cannot be read', async () => {
136
+ const executor = new ChangeAndroidVersionStepExecutor();
137
+ const result = await executor.execute({
138
+ build_gradle_path: '/app/build.gradle',
139
+ version_code_offset: '1',
140
+ }, {}, mockConfig);
141
+ expect(result.script).toContain('Could not read current versionCode');
142
+ expect(result.script).toContain('exit 1');
143
+ });
144
+ test('should not apply offset when not provided', async () => {
145
+ const executor = new ChangeAndroidVersionStepExecutor();
146
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle', new_version_code: '50' }, {}, mockConfig);
147
+ expect(result.script).toContain('VERSION_CODE_OFFSET=""');
148
+ });
149
+ });
150
+ describe('Outputs exported via envman', () => {
151
+ test('should export ANDROID_VERSION_CODE', async () => {
152
+ const executor = new ChangeAndroidVersionStepExecutor();
153
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
154
+ expect(result.script).toContain('envman add --key ANDROID_VERSION_CODE');
155
+ });
156
+ test('should export ANDROID_VERSION_NAME', async () => {
157
+ const executor = new ChangeAndroidVersionStepExecutor();
158
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
159
+ expect(result.script).toContain('envman add --key ANDROID_VERSION_NAME');
160
+ });
161
+ test('should read back final values before exporting', async () => {
162
+ const executor = new ChangeAndroidVersionStepExecutor();
163
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle' }, {}, mockConfig);
164
+ expect(result.script).toContain('FINAL_VERSION_CODE=$(grep');
165
+ expect(result.script).toContain('FINAL_VERSION_NAME=$(grep');
166
+ });
167
+ });
168
+ describe('getOutputs', () => {
169
+ test('should declare ANDROID_VERSION_CODE output', () => {
170
+ const executor = new ChangeAndroidVersionStepExecutor();
171
+ const outputs = executor.getOutputs();
172
+ expect(outputs.some(o => o.name === 'ANDROID_VERSION_CODE')).toBe(true);
173
+ });
174
+ test('should declare ANDROID_VERSION_NAME output', () => {
175
+ const executor = new ChangeAndroidVersionStepExecutor();
176
+ const outputs = executor.getOutputs();
177
+ expect(outputs.some(o => o.name === 'ANDROID_VERSION_NAME')).toBe(true);
178
+ });
179
+ });
180
+ describe('getValidationRequirements', () => {
181
+ test('should require build_gradle_path input', () => {
182
+ const executor = new ChangeAndroidVersionStepExecutor();
183
+ const requirements = executor.getValidationRequirements({}, {}, mockConfig);
184
+ const inputReqs = requirements.filter(r => r.category === 'input');
185
+ expect(inputReqs.some(r => r.name === 'build_gradle_path')).toBe(true);
186
+ });
187
+ });
188
+ describe('Cleanup', () => {
189
+ test('should remove .bak backup files after sed', async () => {
190
+ const executor = new ChangeAndroidVersionStepExecutor();
191
+ const result = await executor.execute({ build_gradle_path: '/app/build.gradle', new_version_code: '1' }, {}, mockConfig);
192
+ expect(result.script).toContain('rm -f "${BUILD_GRADLE}.bak"');
193
+ });
194
+ });
195
+ });
196
+ //# sourceMappingURL=android-version.test.js.map
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Android step implementations (set-java-version, gradle-build, android-lint, android-unit-test)
3
+ */
4
+ import { BaseStepExecutor } from './base.js';
5
+ import type { StepDef, CIConfig } from '../../types.js';
6
+ import type { ValidationRequirement, StepOutput } from '../validation-types.js';
7
+ /**
8
+ * Inputs for set-java-version step
9
+ */
10
+ export interface SetJavaVersionInputs {
11
+ java_version?: string | number;
12
+ }
13
+ /**
14
+ * Inputs for gradle-build step
15
+ */
16
+ export interface GradleBuildInputs {
17
+ project_location?: string;
18
+ build_type?: string;
19
+ gradle_task?: string;
20
+ gradle_options?: string;
21
+ variant?: string;
22
+ module?: string;
23
+ }
24
+ /**
25
+ * Inputs for android-lint step
26
+ */
27
+ export interface AndroidLintInputs {
28
+ project_location?: string;
29
+ module?: string;
30
+ variant?: string;
31
+ }
32
+ /**
33
+ * Inputs for android-unit-test step
34
+ */
35
+ export interface AndroidUnitTestInputs {
36
+ project_location?: string;
37
+ module?: string;
38
+ variant?: string;
39
+ test_filter?: string;
40
+ }
41
+ /**
42
+ * Set Java version step executor
43
+ * Sets the Java version to use for Android builds
44
+ */
45
+ export declare class SetJavaVersionStepExecutor extends BaseStepExecutor {
46
+ getValidationRequirements(inputs: SetJavaVersionInputs, _env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
47
+ /**
48
+ * Check Java version including Homebrew installations
49
+ * Matches the logic in execute() method
50
+ */
51
+ private checkJavaVersionWithHomebrew;
52
+ getOutputs(): StepOutput[];
53
+ execute(inputs: SetJavaVersionInputs, env: Record<string, string>, config: CIConfig): Promise<StepDef>;
54
+ }
55
+ /**
56
+ * Gradle build step executor
57
+ * Builds Android projects using Gradle
58
+ */
59
+ export declare class GradleBuildStepExecutor extends BaseStepExecutor {
60
+ getOutputs(): StepOutput[];
61
+ getValidationRequirements(_inputs: GradleBuildInputs, env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
62
+ execute(inputs: GradleBuildInputs, env: Record<string, string>, config: CIConfig): Promise<StepDef>;
63
+ }
64
+ /**
65
+ * Android lint step executor
66
+ * Runs Android lint checks
67
+ */
68
+ export declare class AndroidLintStepExecutor extends BaseStepExecutor {
69
+ getValidationRequirements(_inputs: AndroidLintInputs, env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
70
+ execute(inputs: AndroidLintInputs, env: Record<string, string>, config: CIConfig): Promise<StepDef>;
71
+ }
72
+ /**
73
+ * Android unit test step executor
74
+ * Runs Android unit tests
75
+ */
76
+ export declare class AndroidUnitTestStepExecutor extends BaseStepExecutor {
77
+ getValidationRequirements(_inputs: AndroidUnitTestInputs, env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
78
+ execute(inputs: AndroidUnitTestInputs, env: Record<string, string>, config: CIConfig): Promise<StepDef>;
79
+ }
80
+ export interface AndroidBuildForUITestingInputs {
81
+ project_location?: string;
82
+ module?: string;
83
+ variant?: string;
84
+ arguments?: string;
85
+ }
86
+ /**
87
+ * Builds app APK and test APK for Android instrumented (UI) tests.
88
+ * Runs assembleVariant and assembleVariantAndroidTest gradle tasks.
89
+ */
90
+ export declare class AndroidBuildForUITestingStepExecutor extends BaseStepExecutor {
91
+ getValidationRequirements(_inputs: AndroidBuildForUITestingInputs, env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
92
+ getOutputs(): StepOutput[];
93
+ execute(inputs: AndroidBuildForUITestingInputs, _env: Record<string, string>, _config: CIConfig): Promise<StepDef>;
94
+ }
95
+ //# sourceMappingURL=android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/android.ts"],"names":[],"mappings":"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"}