@invarn/cibuild 2.9.6 → 2.9.8

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 (559) hide show
  1. package/dist/chunk-35SI42CD.mjs +1 -0
  2. package/dist/chunk-IC45KVLJ.mjs +1 -0
  3. package/dist/chunk-XDY4V23V.mjs +1 -0
  4. package/dist/cli.cjs +14 -14
  5. package/dist/commands.mjs +1 -0
  6. package/dist/lib.mjs +3934 -0
  7. package/package.json +6 -10
  8. package/dist/src/cli.d.ts +0 -3
  9. package/dist/src/cli.d.ts.map +0 -1
  10. package/dist/src/cli.js +0 -399
  11. package/dist/src/commands/a-credential-target-follows-the-flavor-source-set.test.d.ts +0 -38
  12. package/dist/src/commands/a-credential-target-follows-the-flavor-source-set.test.d.ts.map +0 -1
  13. package/dist/src/commands/a-credential-target-follows-the-flavor-source-set.test.js +0 -222
  14. package/dist/src/commands/a-credential-two-workflows-cannot-share-is-declared-per-workflow.test.d.ts +0 -41
  15. package/dist/src/commands/a-credential-two-workflows-cannot-share-is-declared-per-workflow.test.d.ts.map +0 -1
  16. package/dist/src/commands/a-credential-two-workflows-cannot-share-is-declared-per-workflow.test.js +0 -324
  17. package/dist/src/commands/a-properties-stand-in-declares-the-keys-the-build-reads.test.d.ts +0 -2
  18. package/dist/src/commands/a-properties-stand-in-declares-the-keys-the-build-reads.test.d.ts.map +0 -1
  19. package/dist/src/commands/a-properties-stand-in-declares-the-keys-the-build-reads.test.js +0 -382
  20. package/dist/src/commands/an-already-stored-value-does-not-answer-the-target-question.test.d.ts +0 -29
  21. package/dist/src/commands/an-already-stored-value-does-not-answer-the-target-question.test.d.ts.map +0 -1
  22. package/dist/src/commands/an-already-stored-value-does-not-answer-the-target-question.test.js +0 -160
  23. package/dist/src/commands/android-gms-guard.test.d.ts +0 -9
  24. package/dist/src/commands/android-gms-guard.test.d.ts.map +0 -1
  25. package/dist/src/commands/android-gms-guard.test.js +0 -78
  26. package/dist/src/commands/android-java-version.test.d.ts +0 -12
  27. package/dist/src/commands/android-java-version.test.d.ts.map +0 -1
  28. package/dist/src/commands/android-java-version.test.js +0 -209
  29. package/dist/src/commands/android-scanner-java.test.d.ts +0 -2
  30. package/dist/src/commands/android-scanner-java.test.d.ts.map +0 -1
  31. package/dist/src/commands/android-scanner-java.test.js +0 -130
  32. package/dist/src/commands/android-scanner.d.ts +0 -250
  33. package/dist/src/commands/android-scanner.d.ts.map +0 -1
  34. package/dist/src/commands/android-scanner.js +0 -1639
  35. package/dist/src/commands/build.d.ts +0 -215
  36. package/dist/src/commands/build.d.ts.map +0 -1
  37. package/dist/src/commands/build.js +0 -1433
  38. package/dist/src/commands/build.test.d.ts +0 -13
  39. package/dist/src/commands/build.test.d.ts.map +0 -1
  40. package/dist/src/commands/build.test.js +0 -121
  41. package/dist/src/commands/detect-platform.d.ts +0 -13
  42. package/dist/src/commands/detect-platform.d.ts.map +0 -1
  43. package/dist/src/commands/detect-platform.js +0 -51
  44. package/dist/src/commands/detect-project.d.ts +0 -7
  45. package/dist/src/commands/detect-project.d.ts.map +0 -1
  46. package/dist/src/commands/detect-project.js +0 -12
  47. package/dist/src/commands/each-flavor-is-asked-for-its-own-properties-file.test.d.ts +0 -26
  48. package/dist/src/commands/each-flavor-is-asked-for-its-own-properties-file.test.d.ts.map +0 -1
  49. package/dist/src/commands/each-flavor-is-asked-for-its-own-properties-file.test.js +0 -196
  50. package/dist/src/commands/edit.d.ts +0 -12
  51. package/dist/src/commands/edit.d.ts.map +0 -1
  52. package/dist/src/commands/edit.js +0 -652
  53. package/dist/src/commands/edit.test.d.ts +0 -6
  54. package/dist/src/commands/edit.test.d.ts.map +0 -1
  55. package/dist/src/commands/edit.test.js +0 -45
  56. package/dist/src/commands/fidelity-trim.d.ts +0 -13
  57. package/dist/src/commands/fidelity-trim.d.ts.map +0 -1
  58. package/dist/src/commands/fidelity-trim.js +0 -21
  59. package/dist/src/commands/fidelity-trim.test.d.ts +0 -8
  60. package/dist/src/commands/fidelity-trim.test.d.ts.map +0 -1
  61. package/dist/src/commands/fidelity-trim.test.js +0 -79
  62. package/dist/src/commands/file-secret-collector.d.ts +0 -50
  63. package/dist/src/commands/file-secret-collector.d.ts.map +0 -1
  64. package/dist/src/commands/file-secret-collector.js +0 -217
  65. package/dist/src/commands/flavors-a-convention-plugin-creates-are-still-found.test.d.ts +0 -38
  66. package/dist/src/commands/flavors-a-convention-plugin-creates-are-still-found.test.d.ts.map +0 -1
  67. package/dist/src/commands/flavors-a-convention-plugin-creates-are-still-found.test.js +0 -300
  68. package/dist/src/commands/github-workflow.d.ts +0 -5
  69. package/dist/src/commands/github-workflow.d.ts.map +0 -1
  70. package/dist/src/commands/github-workflow.js +0 -45
  71. package/dist/src/commands/index.d.ts +0 -33
  72. package/dist/src/commands/index.d.ts.map +0 -1
  73. package/dist/src/commands/index.js +0 -33
  74. package/dist/src/commands/init.d.ts +0 -20
  75. package/dist/src/commands/init.d.ts.map +0 -1
  76. package/dist/src/commands/init.js +0 -264
  77. package/dist/src/commands/ios-scanner.d.ts +0 -104
  78. package/dist/src/commands/ios-scanner.d.ts.map +0 -1
  79. package/dist/src/commands/ios-scanner.js +0 -492
  80. package/dist/src/commands/ios-scheme-ranking.test.d.ts +0 -2
  81. package/dist/src/commands/ios-scheme-ranking.test.d.ts.map +0 -1
  82. package/dist/src/commands/ios-scheme-ranking.test.js +0 -264
  83. package/dist/src/commands/local-properties-reaches-every-workflow.test.d.ts +0 -30
  84. package/dist/src/commands/local-properties-reaches-every-workflow.test.d.ts.map +0 -1
  85. package/dist/src/commands/local-properties-reaches-every-workflow.test.js +0 -146
  86. package/dist/src/commands/reset.d.ts +0 -7
  87. package/dist/src/commands/reset.d.ts.map +0 -1
  88. package/dist/src/commands/reset.js +0 -81
  89. package/dist/src/commands/run.d.ts +0 -22
  90. package/dist/src/commands/run.d.ts.map +0 -1
  91. package/dist/src/commands/run.js +0 -141
  92. package/dist/src/commands/secrets-sync-workflow.d.ts +0 -15
  93. package/dist/src/commands/secrets-sync-workflow.d.ts.map +0 -1
  94. package/dist/src/commands/secrets-sync-workflow.js +0 -255
  95. package/dist/src/commands/secrets-upload.d.ts +0 -21
  96. package/dist/src/commands/secrets-upload.d.ts.map +0 -1
  97. package/dist/src/commands/secrets-upload.js +0 -177
  98. package/dist/src/commands/secrets-upload.test.d.ts +0 -5
  99. package/dist/src/commands/secrets-upload.test.d.ts.map +0 -1
  100. package/dist/src/commands/secrets-upload.test.js +0 -60
  101. package/dist/src/commands/validate.d.ts +0 -10
  102. package/dist/src/commands/validate.d.ts.map +0 -1
  103. package/dist/src/commands/validate.js +0 -46
  104. package/dist/src/config.d.ts +0 -3
  105. package/dist/src/config.d.ts.map +0 -1
  106. package/dist/src/config.js +0 -47
  107. package/dist/src/envman/cli.d.ts +0 -21
  108. package/dist/src/envman/cli.d.ts.map +0 -1
  109. package/dist/src/envman/cli.js +0 -240
  110. package/dist/src/envman/envman.d.ts +0 -83
  111. package/dist/src/envman/envman.d.ts.map +0 -1
  112. package/dist/src/envman/envman.js +0 -361
  113. package/dist/src/envman/envman.test.d.ts +0 -5
  114. package/dist/src/envman/envman.test.d.ts.map +0 -1
  115. package/dist/src/envman/envman.test.js +0 -236
  116. package/dist/src/envman/envstore-round-trip.test.d.ts +0 -27
  117. package/dist/src/envman/envstore-round-trip.test.d.ts.map +0 -1
  118. package/dist/src/envman/envstore-round-trip.test.js +0 -130
  119. package/dist/src/envman/index.d.ts +0 -23
  120. package/dist/src/envman/index.d.ts.map +0 -1
  121. package/dist/src/envman/index.js +0 -23
  122. package/dist/src/envman/shim.d.ts +0 -16
  123. package/dist/src/envman/shim.d.ts.map +0 -1
  124. package/dist/src/envman/shim.js +0 -66
  125. package/dist/src/envman/types.d.ts +0 -55
  126. package/dist/src/envman/types.d.ts.map +0 -1
  127. package/dist/src/envman/types.js +0 -12
  128. package/dist/src/lib.d.ts +0 -33
  129. package/dist/src/lib.d.ts.map +0 -1
  130. package/dist/src/lib.js +0 -37
  131. package/dist/src/pipeline.d.ts +0 -3
  132. package/dist/src/pipeline.d.ts.map +0 -1
  133. package/dist/src/pipeline.js +0 -57
  134. package/dist/src/runner-node-step.test.d.ts +0 -12
  135. package/dist/src/runner-node-step.test.d.ts.map +0 -1
  136. package/dist/src/runner-node-step.test.js +0 -61
  137. package/dist/src/runner.d.ts +0 -31
  138. package/dist/src/runner.d.ts.map +0 -1
  139. package/dist/src/runner.js +0 -240
  140. package/dist/src/shared/detect-project.d.ts +0 -57
  141. package/dist/src/shared/detect-project.d.ts.map +0 -1
  142. package/dist/src/shared/detect-project.js +0 -219
  143. package/dist/src/shared/detect-project.test.d.ts +0 -2
  144. package/dist/src/shared/detect-project.test.d.ts.map +0 -1
  145. package/dist/src/shared/detect-project.test.js +0 -161
  146. package/dist/src/shared/git.d.ts +0 -25
  147. package/dist/src/shared/git.d.ts.map +0 -1
  148. package/dist/src/shared/git.js +0 -53
  149. package/dist/src/shared/git.test.d.ts +0 -9
  150. package/dist/src/shared/git.test.d.ts.map +0 -1
  151. package/dist/src/shared/git.test.js +0 -66
  152. package/dist/src/shared/gitignore.d.ts +0 -6
  153. package/dist/src/shared/gitignore.d.ts.map +0 -1
  154. package/dist/src/shared/gitignore.js +0 -26
  155. package/dist/src/shared/gradle-settings.d.ts +0 -49
  156. package/dist/src/shared/gradle-settings.d.ts.map +0 -1
  157. package/dist/src/shared/gradle-settings.js +0 -138
  158. package/dist/src/shared/gradle-settings.test.d.ts +0 -2
  159. package/dist/src/shared/gradle-settings.test.d.ts.map +0 -1
  160. package/dist/src/shared/gradle-settings.test.js +0 -65
  161. package/dist/src/shared/prompts.d.ts +0 -30
  162. package/dist/src/shared/prompts.d.ts.map +0 -1
  163. package/dist/src/shared/prompts.js +0 -121
  164. package/dist/src/shared/xcode-container.test.d.ts +0 -2
  165. package/dist/src/shared/xcode-container.test.d.ts.map +0 -1
  166. package/dist/src/shared/xcode-container.test.js +0 -123
  167. package/dist/src/step-marker.d.ts +0 -12
  168. package/dist/src/step-marker.d.ts.map +0 -1
  169. package/dist/src/step-marker.js +0 -29
  170. package/dist/src/step-marker.test.d.ts +0 -11
  171. package/dist/src/step-marker.test.d.ts.map +0 -1
  172. package/dist/src/step-marker.test.js +0 -45
  173. package/dist/src/types.d.ts +0 -58
  174. package/dist/src/types.d.ts.map +0 -1
  175. package/dist/src/types.js +0 -2
  176. package/dist/src/yaml/a-cache-path-must-not-swallow-a-credential.test.d.ts +0 -28
  177. package/dist/src/yaml/a-cache-path-must-not-swallow-a-credential.test.d.ts.map +0 -1
  178. package/dist/src/yaml/a-cache-path-must-not-swallow-a-credential.test.js +0 -223
  179. package/dist/src/yaml/a-declared-secret-reaches-the-file-step.test.d.ts +0 -20
  180. package/dist/src/yaml/a-declared-secret-reaches-the-file-step.test.d.ts.map +0 -1
  181. package/dist/src/yaml/a-declared-secret-reaches-the-file-step.test.js +0 -201
  182. package/dist/src/yaml/a-declared-slot-may-name-the-workflow-it-belongs-to.test.d.ts +0 -37
  183. package/dist/src/yaml/a-declared-slot-may-name-the-workflow-it-belongs-to.test.d.ts.map +0 -1
  184. package/dist/src/yaml/a-declared-slot-may-name-the-workflow-it-belongs-to.test.js +0 -255
  185. package/dist/src/yaml/a-missing-credential-is-loud.test.d.ts +0 -32
  186. package/dist/src/yaml/a-missing-credential-is-loud.test.d.ts.map +0 -1
  187. package/dist/src/yaml/a-missing-credential-is-loud.test.js +0 -301
  188. package/dist/src/yaml/a-runtime-requirement-names-a-real-provider.test.d.ts +0 -18
  189. package/dist/src/yaml/a-runtime-requirement-names-a-real-provider.test.d.ts.map +0 -1
  190. package/dist/src/yaml/a-runtime-requirement-names-a-real-provider.test.js +0 -66
  191. package/dist/src/yaml/a-scoped-slot-must-name-a-workflow-the-pipeline-has.test.d.ts +0 -34
  192. package/dist/src/yaml/a-scoped-slot-must-name-a-workflow-the-pipeline-has.test.d.ts.map +0 -1
  193. package/dist/src/yaml/a-scoped-slot-must-name-a-workflow-the-pipeline-has.test.js +0 -218
  194. package/dist/src/yaml/a-value-this-instance-stored-is-a-value-it-has.test.d.ts +0 -27
  195. package/dist/src/yaml/a-value-this-instance-stored-is-a-value-it-has.test.d.ts.map +0 -1
  196. package/dist/src/yaml/a-value-this-instance-stored-is-a-value-it-has.test.js +0 -126
  197. package/dist/src/yaml/bitrise-compat.d.ts +0 -65
  198. package/dist/src/yaml/bitrise-compat.d.ts.map +0 -1
  199. package/dist/src/yaml/bitrise-compat.js +0 -206
  200. package/dist/src/yaml/bitrise-compat.test.d.ts +0 -5
  201. package/dist/src/yaml/bitrise-compat.test.d.ts.map +0 -1
  202. package/dist/src/yaml/bitrise-compat.test.js +0 -347
  203. package/dist/src/yaml/cache-key-missing-file.test.d.ts +0 -12
  204. package/dist/src/yaml/cache-key-missing-file.test.d.ts.map +0 -1
  205. package/dist/src/yaml/cache-key-missing-file.test.js +0 -116
  206. package/dist/src/yaml/converter.d.ts +0 -103
  207. package/dist/src/yaml/converter.d.ts.map +0 -1
  208. package/dist/src/yaml/converter.js +0 -420
  209. package/dist/src/yaml/converter.test.d.ts +0 -5
  210. package/dist/src/yaml/converter.test.d.ts.map +0 -1
  211. package/dist/src/yaml/converter.test.js +0 -548
  212. package/dist/src/yaml/e2e.test.d.ts +0 -6
  213. package/dist/src/yaml/e2e.test.d.ts.map +0 -1
  214. package/dist/src/yaml/e2e.test.js +0 -446
  215. package/dist/src/yaml/env-resolver.d.ts +0 -218
  216. package/dist/src/yaml/env-resolver.d.ts.map +0 -1
  217. package/dist/src/yaml/env-resolver.js +0 -591
  218. package/dist/src/yaml/env-resolver.test.d.ts +0 -5
  219. package/dist/src/yaml/env-resolver.test.d.ts.map +0 -1
  220. package/dist/src/yaml/env-resolver.test.js +0 -502
  221. package/dist/src/yaml/every-build-log-witnesses-the-commit-on-disk.test.d.ts +0 -16
  222. package/dist/src/yaml/every-build-log-witnesses-the-commit-on-disk.test.d.ts.map +0 -1
  223. package/dist/src/yaml/every-build-log-witnesses-the-commit-on-disk.test.js +0 -126
  224. package/dist/src/yaml/fidelity-input-digest.d.ts +0 -37
  225. package/dist/src/yaml/fidelity-input-digest.d.ts.map +0 -1
  226. package/dist/src/yaml/fidelity-input-digest.js +0 -208
  227. package/dist/src/yaml/fidelity-input-digest.test.d.ts +0 -2
  228. package/dist/src/yaml/fidelity-input-digest.test.d.ts.map +0 -1
  229. package/dist/src/yaml/fidelity-input-digest.test.js +0 -167
  230. package/dist/src/yaml/fidelity-manifest.d.ts +0 -126
  231. package/dist/src/yaml/fidelity-manifest.d.ts.map +0 -1
  232. package/dist/src/yaml/fidelity-manifest.js +0 -134
  233. package/dist/src/yaml/fidelity-manifest.test.d.ts +0 -12
  234. package/dist/src/yaml/fidelity-manifest.test.d.ts.map +0 -1
  235. package/dist/src/yaml/fidelity-manifest.test.js +0 -251
  236. package/dist/src/yaml/interactive-prompts.d.ts +0 -71
  237. package/dist/src/yaml/interactive-prompts.d.ts.map +0 -1
  238. package/dist/src/yaml/interactive-prompts.js +0 -260
  239. package/dist/src/yaml/meta-helpers.d.ts +0 -28
  240. package/dist/src/yaml/meta-helpers.d.ts.map +0 -1
  241. package/dist/src/yaml/meta-helpers.js +0 -46
  242. package/dist/src/yaml/missing-env-handler.d.ts +0 -45
  243. package/dist/src/yaml/missing-env-handler.d.ts.map +0 -1
  244. package/dist/src/yaml/missing-env-handler.js +0 -64
  245. package/dist/src/yaml/parser.d.ts +0 -33
  246. package/dist/src/yaml/parser.d.ts.map +0 -1
  247. package/dist/src/yaml/parser.js +0 -148
  248. package/dist/src/yaml/parser.test.d.ts +0 -5
  249. package/dist/src/yaml/parser.test.d.ts.map +0 -1
  250. package/dist/src/yaml/parser.test.js +0 -83
  251. package/dist/src/yaml/pipeline-with-secrets.d.ts +0 -25
  252. package/dist/src/yaml/pipeline-with-secrets.d.ts.map +0 -1
  253. package/dist/src/yaml/pipeline-with-secrets.js +0 -76
  254. package/dist/src/yaml/platform-detector.d.ts +0 -83
  255. package/dist/src/yaml/platform-detector.d.ts.map +0 -1
  256. package/dist/src/yaml/platform-detector.js +0 -189
  257. package/dist/src/yaml/platform-detector.test.d.ts +0 -5
  258. package/dist/src/yaml/platform-detector.test.d.ts.map +0 -1
  259. package/dist/src/yaml/platform-detector.test.js +0 -525
  260. package/dist/src/yaml/preflight-validation.d.ts +0 -29
  261. package/dist/src/yaml/preflight-validation.d.ts.map +0 -1
  262. package/dist/src/yaml/preflight-validation.js +0 -21
  263. package/dist/src/yaml/secrets-manager.d.ts +0 -87
  264. package/dist/src/yaml/secrets-manager.d.ts.map +0 -1
  265. package/dist/src/yaml/secrets-manager.js +0 -230
  266. package/dist/src/yaml/shell-assignments.d.ts +0 -40
  267. package/dist/src/yaml/shell-assignments.d.ts.map +0 -1
  268. package/dist/src/yaml/shell-assignments.js +0 -77
  269. package/dist/src/yaml/step-validator-check-failure.test.d.ts +0 -24
  270. package/dist/src/yaml/step-validator-check-failure.test.d.ts.map +0 -1
  271. package/dist/src/yaml/step-validator-check-failure.test.js +0 -130
  272. package/dist/src/yaml/step-validator-self-assigned.test.d.ts +0 -23
  273. package/dist/src/yaml/step-validator-self-assigned.test.d.ts.map +0 -1
  274. package/dist/src/yaml/step-validator-self-assigned.test.js +0 -191
  275. package/dist/src/yaml/step-validator.d.ts +0 -67
  276. package/dist/src/yaml/step-validator.d.ts.map +0 -1
  277. package/dist/src/yaml/step-validator.js +0 -466
  278. package/dist/src/yaml/step-validator.test.d.ts +0 -18
  279. package/dist/src/yaml/step-validator.test.d.ts.map +0 -1
  280. package/dist/src/yaml/step-validator.test.js +0 -140
  281. package/dist/src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.d.ts +0 -2
  282. package/dist/src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.d.ts.map +0 -1
  283. package/dist/src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.js +0 -96
  284. package/dist/src/yaml/steps/android-sign.d.ts +0 -35
  285. package/dist/src/yaml/steps/android-sign.d.ts.map +0 -1
  286. package/dist/src/yaml/steps/android-sign.js +0 -147
  287. package/dist/src/yaml/steps/android-variant-resolution.test.d.ts +0 -2
  288. package/dist/src/yaml/steps/android-variant-resolution.test.d.ts.map +0 -1
  289. package/dist/src/yaml/steps/android-variant-resolution.test.js +0 -260
  290. package/dist/src/yaml/steps/android-version.d.ts +0 -26
  291. package/dist/src/yaml/steps/android-version.d.ts.map +0 -1
  292. package/dist/src/yaml/steps/android-version.js +0 -128
  293. package/dist/src/yaml/steps/android-version.test.d.ts +0 -5
  294. package/dist/src/yaml/steps/android-version.test.d.ts.map +0 -1
  295. package/dist/src/yaml/steps/android-version.test.js +0 -196
  296. package/dist/src/yaml/steps/android.d.ts +0 -156
  297. package/dist/src/yaml/steps/android.d.ts.map +0 -1
  298. package/dist/src/yaml/steps/android.js +0 -1100
  299. package/dist/src/yaml/steps/app-store-deploy.d.ts +0 -48
  300. package/dist/src/yaml/steps/app-store-deploy.d.ts.map +0 -1
  301. package/dist/src/yaml/steps/app-store-deploy.js +0 -167
  302. package/dist/src/yaml/steps/base.d.ts +0 -263
  303. package/dist/src/yaml/steps/base.d.ts.map +0 -1
  304. package/dist/src/yaml/steps/base.js +0 -380
  305. package/dist/src/yaml/steps/bitrise-android-tools.d.ts +0 -26
  306. package/dist/src/yaml/steps/bitrise-android-tools.d.ts.map +0 -1
  307. package/dist/src/yaml/steps/bitrise-android-tools.js +0 -200
  308. package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts +0 -5
  309. package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts.map +0 -1
  310. package/dist/src/yaml/steps/bitrise-android-tools.test.js +0 -280
  311. package/dist/src/yaml/steps/bitrise-apk-info.d.ts +0 -22
  312. package/dist/src/yaml/steps/bitrise-apk-info.d.ts.map +0 -1
  313. package/dist/src/yaml/steps/bitrise-apk-info.js +0 -144
  314. package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts +0 -5
  315. package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts.map +0 -1
  316. package/dist/src/yaml/steps/bitrise-apk-info.test.js +0 -331
  317. package/dist/src/yaml/steps/bitrise-slack.d.ts +0 -49
  318. package/dist/src/yaml/steps/bitrise-slack.d.ts.map +0 -1
  319. package/dist/src/yaml/steps/bitrise-slack.js +0 -280
  320. package/dist/src/yaml/steps/bitrise-slack.test.d.ts +0 -5
  321. package/dist/src/yaml/steps/bitrise-slack.test.d.ts.map +0 -1
  322. package/dist/src/yaml/steps/bitrise-slack.test.js +0 -484
  323. package/dist/src/yaml/steps/bitrise-ssh.d.ts +0 -27
  324. package/dist/src/yaml/steps/bitrise-ssh.d.ts.map +0 -1
  325. package/dist/src/yaml/steps/bitrise-ssh.js +0 -134
  326. package/dist/src/yaml/steps/bitrise-ssh.test.d.ts +0 -5
  327. package/dist/src/yaml/steps/bitrise-ssh.test.d.ts.map +0 -1
  328. package/dist/src/yaml/steps/bitrise-ssh.test.js +0 -205
  329. package/dist/src/yaml/steps/cache-pull-daemon.test.d.ts +0 -27
  330. package/dist/src/yaml/steps/cache-pull-daemon.test.d.ts.map +0 -1
  331. package/dist/src/yaml/steps/cache-pull-daemon.test.js +0 -212
  332. package/dist/src/yaml/steps/cache-pull-restore-roots.test.d.ts +0 -42
  333. package/dist/src/yaml/steps/cache-pull-restore-roots.test.d.ts.map +0 -1
  334. package/dist/src/yaml/steps/cache-pull-restore-roots.test.js +0 -209
  335. package/dist/src/yaml/steps/cache-push-daemon.test.d.ts +0 -27
  336. package/dist/src/yaml/steps/cache-push-daemon.test.d.ts.map +0 -1
  337. package/dist/src/yaml/steps/cache-push-daemon.test.js +0 -171
  338. package/dist/src/yaml/steps/cache.d.ts +0 -59
  339. package/dist/src/yaml/steps/cache.d.ts.map +0 -1
  340. package/dist/src/yaml/steps/cache.js +0 -1027
  341. package/dist/src/yaml/steps/capture-injection.d.ts +0 -30
  342. package/dist/src/yaml/steps/capture-injection.d.ts.map +0 -1
  343. package/dist/src/yaml/steps/capture-injection.js +0 -88
  344. package/dist/src/yaml/steps/capture-injection.test.d.ts +0 -2
  345. package/dist/src/yaml/steps/capture-injection.test.d.ts.map +0 -1
  346. package/dist/src/yaml/steps/capture-injection.test.js +0 -163
  347. package/dist/src/yaml/steps/cocoapods-deployment-floor.d.ts +0 -42
  348. package/dist/src/yaml/steps/cocoapods-deployment-floor.d.ts.map +0 -1
  349. package/dist/src/yaml/steps/cocoapods-deployment-floor.js +0 -140
  350. package/dist/src/yaml/steps/cocoapods-deployment-floor.test.d.ts +0 -11
  351. package/dist/src/yaml/steps/cocoapods-deployment-floor.test.d.ts.map +0 -1
  352. package/dist/src/yaml/steps/cocoapods-deployment-floor.test.js +0 -176
  353. package/dist/src/yaml/steps/cocoapods-install-emits-valid-bash.test.d.ts +0 -22
  354. package/dist/src/yaml/steps/cocoapods-install-emits-valid-bash.test.d.ts.map +0 -1
  355. package/dist/src/yaml/steps/cocoapods-install-emits-valid-bash.test.js +0 -97
  356. package/dist/src/yaml/steps/cocoapods-locked-bundler.test.d.ts +0 -17
  357. package/dist/src/yaml/steps/cocoapods-locked-bundler.test.d.ts.map +0 -1
  358. package/dist/src/yaml/steps/cocoapods-locked-bundler.test.js +0 -282
  359. package/dist/src/yaml/steps/cocoapods-skip-if-absent.test.d.ts +0 -17
  360. package/dist/src/yaml/steps/cocoapods-skip-if-absent.test.d.ts.map +0 -1
  361. package/dist/src/yaml/steps/cocoapods-skip-if-absent.test.js +0 -132
  362. package/dist/src/yaml/steps/envstore-loader.test.d.ts +0 -15
  363. package/dist/src/yaml/steps/envstore-loader.test.d.ts.map +0 -1
  364. package/dist/src/yaml/steps/envstore-loader.test.js +0 -143
  365. package/dist/src/yaml/steps/fastlane.d.ts +0 -27
  366. package/dist/src/yaml/steps/fastlane.d.ts.map +0 -1
  367. package/dist/src/yaml/steps/fastlane.js +0 -79
  368. package/dist/src/yaml/steps/fidelity-aspect-guard.d.ts +0 -53
  369. package/dist/src/yaml/steps/fidelity-aspect-guard.d.ts.map +0 -1
  370. package/dist/src/yaml/steps/fidelity-aspect-guard.js +0 -72
  371. package/dist/src/yaml/steps/fidelity-aspect-guard.test.d.ts +0 -11
  372. package/dist/src/yaml/steps/fidelity-aspect-guard.test.d.ts.map +0 -1
  373. package/dist/src/yaml/steps/fidelity-aspect-guard.test.js +0 -50
  374. package/dist/src/yaml/steps/fidelity-reference-provenance.d.ts +0 -87
  375. package/dist/src/yaml/steps/fidelity-reference-provenance.d.ts.map +0 -1
  376. package/dist/src/yaml/steps/fidelity-reference-provenance.js +0 -111
  377. package/dist/src/yaml/steps/fidelity-reference-provenance.test.d.ts +0 -22
  378. package/dist/src/yaml/steps/fidelity-reference-provenance.test.d.ts.map +0 -1
  379. package/dist/src/yaml/steps/fidelity-reference-provenance.test.js +0 -118
  380. package/dist/src/yaml/steps/file.d.ts +0 -52
  381. package/dist/src/yaml/steps/file.d.ts.map +0 -1
  382. package/dist/src/yaml/steps/file.js +0 -108
  383. package/dist/src/yaml/steps/flutter.d.ts +0 -63
  384. package/dist/src/yaml/steps/flutter.d.ts.map +0 -1
  385. package/dist/src/yaml/steps/flutter.js +0 -215
  386. package/dist/src/yaml/steps/git-clone-names-the-inputs-it-ignores.test.d.ts +0 -16
  387. package/dist/src/yaml/steps/git-clone-names-the-inputs-it-ignores.test.d.ts.map +0 -1
  388. package/dist/src/yaml/steps/git-clone-names-the-inputs-it-ignores.test.js +0 -127
  389. package/dist/src/yaml/steps/git-clone.d.ts +0 -32
  390. package/dist/src/yaml/steps/git-clone.d.ts.map +0 -1
  391. package/dist/src/yaml/steps/git-clone.js +0 -171
  392. package/dist/src/yaml/steps/git-fetch-retry-exec.test.d.ts +0 -10
  393. package/dist/src/yaml/steps/git-fetch-retry-exec.test.d.ts.map +0 -1
  394. package/dist/src/yaml/steps/git-fetch-retry-exec.test.js +0 -162
  395. package/dist/src/yaml/steps/git-fetch-retry.d.ts +0 -62
  396. package/dist/src/yaml/steps/git-fetch-retry.d.ts.map +0 -1
  397. package/dist/src/yaml/steps/git-fetch-retry.js +0 -155
  398. package/dist/src/yaml/steps/git-fetch-retry.test.d.ts +0 -5
  399. package/dist/src/yaml/steps/git-fetch-retry.test.d.ts.map +0 -1
  400. package/dist/src/yaml/steps/git-fetch-retry.test.js +0 -86
  401. package/dist/src/yaml/steps/google-play-deploy.d.ts +0 -37
  402. package/dist/src/yaml/steps/google-play-deploy.d.ts.map +0 -1
  403. package/dist/src/yaml/steps/google-play-deploy.js +0 -193
  404. package/dist/src/yaml/steps/google-play-deploy.test.d.ts +0 -5
  405. package/dist/src/yaml/steps/google-play-deploy.test.d.ts.map +0 -1
  406. package/dist/src/yaml/steps/google-play-deploy.test.js +0 -310
  407. package/dist/src/yaml/steps/gradle-memory.d.ts +0 -91
  408. package/dist/src/yaml/steps/gradle-memory.d.ts.map +0 -1
  409. package/dist/src/yaml/steps/gradle-memory.js +0 -495
  410. package/dist/src/yaml/steps/gradle-memory.test.d.ts +0 -2
  411. package/dist/src/yaml/steps/gradle-memory.test.d.ts.map +0 -1
  412. package/dist/src/yaml/steps/gradle-memory.test.js +0 -344
  413. package/dist/src/yaml/steps/gradle-sdk-cmake.d.ts +0 -28
  414. package/dist/src/yaml/steps/gradle-sdk-cmake.d.ts.map +0 -1
  415. package/dist/src/yaml/steps/gradle-sdk-cmake.js +0 -107
  416. package/dist/src/yaml/steps/gradle-sdk-cmake.test.d.ts +0 -2
  417. package/dist/src/yaml/steps/gradle-sdk-cmake.test.d.ts.map +0 -1
  418. package/dist/src/yaml/steps/gradle-sdk-cmake.test.js +0 -183
  419. package/dist/src/yaml/steps/index.d.ts +0 -10
  420. package/dist/src/yaml/steps/index.d.ts.map +0 -1
  421. package/dist/src/yaml/steps/index.js +0 -1461
  422. package/dist/src/yaml/steps/ios-deps.d.ts +0 -78
  423. package/dist/src/yaml/steps/ios-deps.d.ts.map +0 -1
  424. package/dist/src/yaml/steps/ios-deps.js +0 -279
  425. package/dist/src/yaml/steps/ios-deps.test.d.ts +0 -5
  426. package/dist/src/yaml/steps/ios-deps.test.d.ts.map +0 -1
  427. package/dist/src/yaml/steps/ios-deps.test.js +0 -90
  428. package/dist/src/yaml/steps/ios-signing.d.ts +0 -31
  429. package/dist/src/yaml/steps/ios-signing.d.ts.map +0 -1
  430. package/dist/src/yaml/steps/ios-signing.js +0 -144
  431. package/dist/src/yaml/steps/ios-version.d.ts +0 -47
  432. package/dist/src/yaml/steps/ios-version.d.ts.map +0 -1
  433. package/dist/src/yaml/steps/ios-version.js +0 -151
  434. package/dist/src/yaml/steps/java-home-version-spec.test.d.ts +0 -10
  435. package/dist/src/yaml/steps/java-home-version-spec.test.d.ts.map +0 -1
  436. package/dist/src/yaml/steps/java-home-version-spec.test.js +0 -58
  437. package/dist/src/yaml/steps/kotlin-metadata-compiles-on-a-daemon.test.d.ts +0 -2
  438. package/dist/src/yaml/steps/kotlin-metadata-compiles-on-a-daemon.test.d.ts.map +0 -1
  439. package/dist/src/yaml/steps/kotlin-metadata-compiles-on-a-daemon.test.js +0 -139
  440. package/dist/src/yaml/steps/linting.d.ts +0 -47
  441. package/dist/src/yaml/steps/linting.d.ts.map +0 -1
  442. package/dist/src/yaml/steps/linting.js +0 -148
  443. package/dist/src/yaml/steps/phase2.test.d.ts +0 -6
  444. package/dist/src/yaml/steps/phase2.test.d.ts.map +0 -1
  445. package/dist/src/yaml/steps/phase2.test.js +0 -197
  446. package/dist/src/yaml/steps/phase3.test.d.ts +0 -5
  447. package/dist/src/yaml/steps/phase3.test.d.ts.map +0 -1
  448. package/dist/src/yaml/steps/phase3.test.js +0 -144
  449. package/dist/src/yaml/steps/phase4.test.d.ts +0 -5
  450. package/dist/src/yaml/steps/phase4.test.d.ts.map +0 -1
  451. package/dist/src/yaml/steps/phase4.test.js +0 -166
  452. package/dist/src/yaml/steps/phase5.test.d.ts +0 -6
  453. package/dist/src/yaml/steps/phase5.test.d.ts.map +0 -1
  454. package/dist/src/yaml/steps/phase5.test.js +0 -263
  455. package/dist/src/yaml/steps/registry.d.ts +0 -88
  456. package/dist/src/yaml/steps/registry.d.ts.map +0 -1
  457. package/dist/src/yaml/steps/registry.js +0 -125
  458. package/dist/src/yaml/steps/registry.test.d.ts +0 -5
  459. package/dist/src/yaml/steps/registry.test.d.ts.map +0 -1
  460. package/dist/src/yaml/steps/registry.test.js +0 -235
  461. package/dist/src/yaml/steps/release.d.ts +0 -50
  462. package/dist/src/yaml/steps/release.d.ts.map +0 -1
  463. package/dist/src/yaml/steps/release.js +0 -154
  464. package/dist/src/yaml/steps/render-post-processor.d.ts +0 -100
  465. package/dist/src/yaml/steps/render-post-processor.d.ts.map +0 -1
  466. package/dist/src/yaml/steps/render-post-processor.js +0 -270
  467. package/dist/src/yaml/steps/render-post-processor.test.d.ts +0 -13
  468. package/dist/src/yaml/steps/render-post-processor.test.d.ts.map +0 -1
  469. package/dist/src/yaml/steps/render-post-processor.test.js +0 -220
  470. package/dist/src/yaml/steps/script.d.ts +0 -23
  471. package/dist/src/yaml/steps/script.d.ts.map +0 -1
  472. package/dist/src/yaml/steps/script.js +0 -63
  473. package/dist/src/yaml/steps/spec-validation.test.d.ts +0 -6
  474. package/dist/src/yaml/steps/spec-validation.test.d.ts.map +0 -1
  475. package/dist/src/yaml/steps/spec-validation.test.js +0 -130
  476. package/dist/src/yaml/steps/steps.test.d.ts +0 -6
  477. package/dist/src/yaml/steps/steps.test.d.ts.map +0 -1
  478. package/dist/src/yaml/steps/steps.test.js +0 -881
  479. package/dist/src/yaml/steps/structural-facts.d.ts +0 -992
  480. package/dist/src/yaml/steps/structural-facts.d.ts.map +0 -1
  481. package/dist/src/yaml/steps/structural-facts.js +0 -3276
  482. package/dist/src/yaml/steps/structural-facts.test.d.ts +0 -12
  483. package/dist/src/yaml/steps/structural-facts.test.d.ts.map +0 -1
  484. package/dist/src/yaml/steps/structural-facts.test.js +0 -3039
  485. package/dist/src/yaml/steps/test-config.d.ts +0 -5
  486. package/dist/src/yaml/steps/test-config.d.ts.map +0 -1
  487. package/dist/src/yaml/steps/test-config.js +0 -25
  488. package/dist/src/yaml/steps/trim-align-corpus.test.d.ts +0 -28
  489. package/dist/src/yaml/steps/trim-align-corpus.test.d.ts.map +0 -1
  490. package/dist/src/yaml/steps/trim-align-corpus.test.js +0 -383
  491. package/dist/src/yaml/steps/trim-align.d.ts +0 -87
  492. package/dist/src/yaml/steps/trim-align.d.ts.map +0 -1
  493. package/dist/src/yaml/steps/trim-align.js +0 -367
  494. package/dist/src/yaml/steps/trim-align.test.d.ts +0 -11
  495. package/dist/src/yaml/steps/trim-align.test.d.ts.map +0 -1
  496. package/dist/src/yaml/steps/trim-align.test.js +0 -261
  497. package/dist/src/yaml/steps/ui-fidelity-preview-android.d.ts +0 -66
  498. package/dist/src/yaml/steps/ui-fidelity-preview-android.d.ts.map +0 -1
  499. package/dist/src/yaml/steps/ui-fidelity-preview-android.js +0 -251
  500. package/dist/src/yaml/steps/ui-fidelity-preview-android.test.d.ts +0 -13
  501. package/dist/src/yaml/steps/ui-fidelity-preview-android.test.d.ts.map +0 -1
  502. package/dist/src/yaml/steps/ui-fidelity-preview-android.test.js +0 -302
  503. package/dist/src/yaml/steps/ui-fidelity-preview.d.ts +0 -134
  504. package/dist/src/yaml/steps/ui-fidelity-preview.d.ts.map +0 -1
  505. package/dist/src/yaml/steps/ui-fidelity-preview.js +0 -173
  506. package/dist/src/yaml/steps/ui-fidelity-preview.test.d.ts +0 -11
  507. package/dist/src/yaml/steps/ui-fidelity-preview.test.d.ts.map +0 -1
  508. package/dist/src/yaml/steps/ui-fidelity-preview.test.js +0 -210
  509. package/dist/src/yaml/steps/ui-fidelity-render-android.d.ts +0 -155
  510. package/dist/src/yaml/steps/ui-fidelity-render-android.d.ts.map +0 -1
  511. package/dist/src/yaml/steps/ui-fidelity-render-android.js +0 -1389
  512. package/dist/src/yaml/steps/ui-fidelity-render-android.test.d.ts +0 -2
  513. package/dist/src/yaml/steps/ui-fidelity-render-android.test.d.ts.map +0 -1
  514. package/dist/src/yaml/steps/ui-fidelity-render-android.test.js +0 -1106
  515. package/dist/src/yaml/steps/ui-fidelity-render.d.ts +0 -230
  516. package/dist/src/yaml/steps/ui-fidelity-render.d.ts.map +0 -1
  517. package/dist/src/yaml/steps/ui-fidelity-render.js +0 -1597
  518. package/dist/src/yaml/steps/ui-fidelity-render.test.d.ts +0 -18
  519. package/dist/src/yaml/steps/ui-fidelity-render.test.d.ts.map +0 -1
  520. package/dist/src/yaml/steps/ui-fidelity-render.test.js +0 -1871
  521. package/dist/src/yaml/steps/xcode-app-product.d.ts +0 -90
  522. package/dist/src/yaml/steps/xcode-app-product.d.ts.map +0 -1
  523. package/dist/src/yaml/steps/xcode-app-product.js +0 -247
  524. package/dist/src/yaml/steps/xcode-app-product.test.d.ts +0 -2
  525. package/dist/src/yaml/steps/xcode-app-product.test.d.ts.map +0 -1
  526. package/dist/src/yaml/steps/xcode-app-product.test.js +0 -202
  527. package/dist/src/yaml/steps/xcode-derived-data.test.d.ts +0 -30
  528. package/dist/src/yaml/steps/xcode-derived-data.test.d.ts.map +0 -1
  529. package/dist/src/yaml/steps/xcode-derived-data.test.js +0 -279
  530. package/dist/src/yaml/steps/xcode-destination.d.ts +0 -47
  531. package/dist/src/yaml/steps/xcode-destination.d.ts.map +0 -1
  532. package/dist/src/yaml/steps/xcode-destination.js +0 -202
  533. package/dist/src/yaml/steps/xcode-destination.test.d.ts +0 -9
  534. package/dist/src/yaml/steps/xcode-destination.test.d.ts.map +0 -1
  535. package/dist/src/yaml/steps/xcode-destination.test.js +0 -227
  536. package/dist/src/yaml/steps/xcode-new.test.d.ts +0 -5
  537. package/dist/src/yaml/steps/xcode-new.test.d.ts.map +0 -1
  538. package/dist/src/yaml/steps/xcode-new.test.js +0 -211
  539. package/dist/src/yaml/steps/xcode-resolve-retry.test.d.ts +0 -9
  540. package/dist/src/yaml/steps/xcode-resolve-retry.test.d.ts.map +0 -1
  541. package/dist/src/yaml/steps/xcode-resolve-retry.test.js +0 -146
  542. package/dist/src/yaml/steps/xcode-simulator-archs.d.ts +0 -53
  543. package/dist/src/yaml/steps/xcode-simulator-archs.d.ts.map +0 -1
  544. package/dist/src/yaml/steps/xcode-simulator-archs.js +0 -98
  545. package/dist/src/yaml/steps/xcode-simulator-archs.test.d.ts +0 -21
  546. package/dist/src/yaml/steps/xcode-simulator-archs.test.d.ts.map +0 -1
  547. package/dist/src/yaml/steps/xcode-simulator-archs.test.js +0 -155
  548. package/dist/src/yaml/steps/xcode.d.ts +0 -230
  549. package/dist/src/yaml/steps/xcode.d.ts.map +0 -1
  550. package/dist/src/yaml/steps/xcode.js +0 -1350
  551. package/dist/src/yaml/types.d.ts +0 -76
  552. package/dist/src/yaml/types.d.ts.map +0 -1
  553. package/dist/src/yaml/types.js +0 -5
  554. package/dist/src/yaml/validation-types.d.ts +0 -102
  555. package/dist/src/yaml/validation-types.d.ts.map +0 -1
  556. package/dist/src/yaml/validation-types.js +0 -8
  557. package/dist/src/yaml/yaml-updater.d.ts +0 -24
  558. package/dist/src/yaml/yaml-updater.d.ts.map +0 -1
  559. package/dist/src/yaml/yaml-updater.js +0 -128
@@ -1,466 +0,0 @@
1
- /**
2
- * Pre-execution validation orchestrator
3
- *
4
- * Validates all steps in a workflow BEFORE execution begins.
5
- * All validation checks are READ-ONLY and safe to run on the user's machine.
6
- * This enables catching all issues at once instead of failing on the first error.
7
- */
8
- import { getStepExecutor, hasStep, getStepMetadata } from './steps/registry.js';
9
- import { EnvResolver } from './env-resolver.js';
10
- import { shellAssignedNames } from './shell-assignments.js';
11
- import { detectPlatformInfo } from './platform-detector.js';
12
- import { declaresMultiplatformApp } from './meta-helpers.js';
13
- // POSIX env vars the shell always provides — don't flag these as undeclared.
14
- // The runner's guest shell seeds HOME, TMPDIR, PATH, etc.; requiring
15
- // pipelines to redeclare them forces literal-path-only scripts.
16
- const POSIX_ENV_ALLOWLIST = new Set([
17
- 'HOME',
18
- 'USER',
19
- 'PATH',
20
- 'TMPDIR',
21
- 'TMP',
22
- 'TEMP',
23
- 'SHELL',
24
- 'LANG',
25
- 'LC_ALL',
26
- 'PWD',
27
- 'LOGNAME',
28
- 'HOSTNAME',
29
- // Runner-provided vars (set in the sandbox execution script)
30
- 'CIBUILD_USER_HOME',
31
- 'CIBUILD_SCRATCH',
32
- 'JAVA_HOME',
33
- ]);
34
- /**
35
- * StepValidator orchestrates pre-execution validation for a workflow.
36
- * It iterates through all steps, collects validation requirements,
37
- * runs pre-execution checks, and aggregates all issues.
38
- */
39
- export class StepValidator {
40
- pipeline;
41
- workflow;
42
- workflowName;
43
- config;
44
- envResolver;
45
- yamlFilePath;
46
- // Track outputs provided by earlier steps for dependency validation
47
- availableOutputs = new Map();
48
- // Platform established by the first platform-specific step ('ios' or 'android')
49
- establishedPlatform = null;
50
- // True when the pipeline declares an app that is inherently both platforms
51
- // (KMM today), so one workflow may legitimately hold android and ios steps.
52
- // Read from the declaration only — see `declaresMultiplatformApp`.
53
- spansPlatforms;
54
- constructor(pipeline, workflowName, config, yamlFilePath) {
55
- this.pipeline = pipeline;
56
- this.workflowName = workflowName;
57
- this.workflow = pipeline.workflows[workflowName];
58
- this.config = config;
59
- this.yamlFilePath = yamlFilePath;
60
- if (!this.workflow) {
61
- throw new Error(`Workflow '${workflowName}' not found in pipeline`);
62
- }
63
- this.spansPlatforms = declaresMultiplatformApp(pipeline);
64
- // Create env resolver for variable interpolation
65
- const platformInfo = detectPlatformInfo(pipeline, workflowName);
66
- this.envResolver = new EnvResolver(pipeline, this.workflow, workflowName, platformInfo.platform, platformInfo.stack, yamlFilePath);
67
- }
68
- /**
69
- * Validates all steps in the workflow.
70
- * Returns a complete validation result with all issues grouped by step and category.
71
- */
72
- async validateWorkflow() {
73
- const issues = [];
74
- const issuesByStep = new Map();
75
- const issuesByCategory = new Map();
76
- let stepIndex = 0;
77
- for (const yamlStep of this.workflow.steps) {
78
- const parsedStep = this.parseStep(yamlStep, stepIndex);
79
- // Skip unrecognized steps (they'll be handled by converter with warnings)
80
- if (!hasStep(parsedStep.name)) {
81
- stepIndex++;
82
- continue;
83
- }
84
- const executor = getStepExecutor(parsedStep.name);
85
- // Platform compatibility check
86
- const stepMetadata = getStepMetadata(parsedStep.name);
87
- const stepPlatform = stepMetadata?.platform ?? 'all';
88
- // A declared multiplatform app is exempt: its build spans both platforms
89
- // by construction, so there is no single platform for a step to conflict
90
- // with. Everything else — including an app that declares nothing, or
91
- // declares one platform and then mixes — is still refused below.
92
- if (stepPlatform !== 'all' && !this.spansPlatforms) {
93
- if (this.establishedPlatform === null) {
94
- // First platform-specific step establishes the workflow platform
95
- this.establishedPlatform = stepPlatform;
96
- }
97
- else if (this.establishedPlatform !== stepPlatform) {
98
- // This step conflicts with the established platform
99
- const platformIssue = {
100
- stepName: parsedStep.title || parsedStep.name,
101
- stepIndex,
102
- requirement: {
103
- category: 'platform',
104
- name: parsedStep.name,
105
- description: `'${parsedStep.name}' is an ${stepPlatform} step but this workflow targets ${this.establishedPlatform}`,
106
- timing: 'pre-execution',
107
- severity: 'error',
108
- hint: `Remove this step or move it to a dedicated ${stepPlatform} workflow`,
109
- check: async () => ({
110
- passed: false,
111
- message: `Cross-platform step: '${parsedStep.name}' (${stepPlatform}) cannot be used in an ${this.establishedPlatform} workflow`,
112
- }),
113
- },
114
- result: {
115
- passed: false,
116
- message: `Cross-platform step: '${parsedStep.name}' (${stepPlatform}) cannot be used in an ${this.establishedPlatform} workflow`,
117
- },
118
- };
119
- issues.push(platformIssue);
120
- const stepIssues = issuesByStep.get(platformIssue.stepName) || [];
121
- stepIssues.push(platformIssue);
122
- issuesByStep.set(platformIssue.stepName, stepIssues);
123
- const catIssues = issuesByCategory.get('platform') || [];
124
- catIssues.push(platformIssue);
125
- issuesByCategory.set('platform', catIssues);
126
- stepIndex++;
127
- continue;
128
- }
129
- }
130
- // Skip all validation for steps that will be skipped in local mode
131
- if (this.config.local && executor.isSkippedInLocalMode?.()) {
132
- if (executor.getOutputs) {
133
- for (const output of executor.getOutputs()) {
134
- this.availableOutputs.set(output.name, { stepName: parsedStep.name, output });
135
- }
136
- }
137
- stepIndex++;
138
- continue;
139
- }
140
- // Get validation requirements if the executor supports it
141
- if (executor.getValidationRequirements) {
142
- // Interpolate inputs (but don't throw on missing vars during validation)
143
- let interpolatedInputs = parsedStep.inputs;
144
- try {
145
- interpolatedInputs = this.envResolver.interpolateObject(parsedStep.inputs, parsedStep.title || parsedStep.name);
146
- }
147
- catch {
148
- // Interpolation failed because a variable isn't set yet.
149
- // Use a lenient copy: strip unresolved $VAR / ${VAR} references to ''
150
- // so getValidationRequirements can correctly detect them as missing.
151
- interpolatedInputs = this.stripUnresolvedVars(parsedStep.inputs);
152
- }
153
- const requirements = executor.getValidationRequirements(interpolatedInputs, this.envResolver.getAll(), this.config);
154
- // Validate each requirement
155
- for (const req of requirements) {
156
- const issue = await this.validateRequirement(req, parsedStep.title || parsedStep.name, stepIndex);
157
- if (issue) {
158
- issues.push(issue);
159
- // Group by step
160
- const stepIssues = issuesByStep.get(issue.stepName) || [];
161
- stepIssues.push(issue);
162
- issuesByStep.set(issue.stepName, stepIssues);
163
- // Group by category
164
- const catIssues = issuesByCategory.get(issue.requirement.category) || [];
165
- catIssues.push(issue);
166
- issuesByCategory.set(issue.requirement.category, catIssues);
167
- }
168
- }
169
- // Auto-discover any $VAR references in raw inputs that aren't covered above
170
- const resolvedEnv = this.envResolver.getAll();
171
- const alreadyDeclared = new Set(requirements.map((r) => r.name));
172
- const referencedVars = this.extractVariableReferences(parsedStep.inputs);
173
- // Variables the step's own shell sets are not values anyone owes it.
174
- const selfAssigned = shellAssignedNames(parsedStep.inputs);
175
- for (const varName of referencedVars) {
176
- // Skip POSIX vars the shell always provides
177
- if (POSIX_ENV_ALLOWLIST.has(varName))
178
- continue;
179
- // Skip anything this step's script assigns itself — a computed local
180
- // reads like a required input, and refusing on one stops a pipeline
181
- // for a value nothing was ever meant to supply.
182
- if (selfAssigned.has(varName))
183
- continue;
184
- // Skip if already in resolved env (use hasOwnProperty so empty-string
185
- // values set by the YAML/secrets are still treated as "provided")
186
- if (Object.prototype.hasOwnProperty.call(resolvedEnv, varName))
187
- continue;
188
- // Skip if the runner (or the surrounding shell) already exported
189
- // the var into our process.env. The sandbox runner delivers
190
- // dispatch-supplied `execution.env` / `execution.secrets` this
191
- // way — without this fallback, bash-style `$VAR` refs in
192
- // repo-hosted YAML (human CLI flow) would false-trigger the
193
- // auto-discovery even though they resolve at shell runtime.
194
- if (Object.prototype.hasOwnProperty.call(process.env, varName))
195
- continue;
196
- // Skip if provided as output by an earlier step
197
- if (this.availableOutputs.has(varName))
198
- continue;
199
- // Skip if already declared by getValidationRequirements
200
- if (alreadyDeclared.has(varName))
201
- continue;
202
- // Skip if already added by a previous step
203
- if (issues.some((i) => i.requirement.name === varName))
204
- continue;
205
- // Skippable steps won't block the build if they fail — downgrade to warning
206
- // so missing vars don't prevent the run when the step can safely be skipped.
207
- const severity = parsedStep.is_skippable ? 'warning' : 'error';
208
- const req = {
209
- category: 'environment',
210
- name: varName,
211
- description: `${varName} is not set`,
212
- timing: 'pre-execution',
213
- severity,
214
- check: async () => ({ passed: false, message: `${varName} is not set` }),
215
- };
216
- const issue = await this.validateRequirement(req, parsedStep.title || parsedStep.name, stepIndex);
217
- if (issue) {
218
- issues.push(issue);
219
- const stepIssues = issuesByStep.get(issue.stepName) || [];
220
- stepIssues.push(issue);
221
- issuesByStep.set(issue.stepName, stepIssues);
222
- const catIssues = issuesByCategory.get(issue.requirement.category) || [];
223
- catIssues.push(issue);
224
- issuesByCategory.set(issue.requirement.category, catIssues);
225
- }
226
- }
227
- }
228
- // Record outputs this step provides for later steps
229
- if (executor.getOutputs) {
230
- for (const output of executor.getOutputs()) {
231
- this.availableOutputs.set(output.name, {
232
- stepName: parsedStep.name,
233
- output,
234
- });
235
- }
236
- }
237
- stepIndex++;
238
- }
239
- // Count issues by severity
240
- const counts = {
241
- errors: issues.filter((i) => i.requirement.severity === 'error').length,
242
- warnings: issues.filter((i) => i.requirement.severity === 'warning').length,
243
- info: issues.filter((i) => i.requirement.severity === 'info').length,
244
- };
245
- return {
246
- valid: counts.errors === 0,
247
- issues,
248
- issuesByStep,
249
- issuesByCategory,
250
- counts,
251
- };
252
- }
253
- /**
254
- * Validates a single requirement and returns an issue if it fails
255
- */
256
- async validateRequirement(requirement, stepName, stepIndex) {
257
- // Skip runtime-only checks (they can't be validated before execution)
258
- if (requirement.timing === 'runtime') {
259
- // For runtime dependencies, check if the providing step exists earlier
260
- if (requirement.providedBy) {
261
- const provider = this.availableOutputs.get(requirement.name);
262
- if (!provider) {
263
- // Nothing declares this name as an output, so say where it does come
264
- // from and leave it at that. `providedBy` is prose: most of these
265
- // requirements are named after a path or a command rather than a
266
- // step output, so the lookup above was never going to match one, and
267
- // the sentence must stay true when the source is not a step at all.
268
- return {
269
- stepName,
270
- stepIndex,
271
- requirement,
272
- result: {
273
- passed: false,
274
- message: `'${requirement.name}' is not here yet — expected from ${requirement.providedBy} at runtime`,
275
- },
276
- };
277
- }
278
- }
279
- return null; // Skip other runtime checks
280
- }
281
- // Run the check if available
282
- if (requirement.check) {
283
- try {
284
- const result = await requirement.check();
285
- if (!result.passed) {
286
- return {
287
- stepName,
288
- stepIndex,
289
- requirement,
290
- result,
291
- };
292
- }
293
- }
294
- catch (error) {
295
- // A check that threw did not run. That is a different event from a
296
- // check that ran and found nothing, and it must not inherit the
297
- // severity chosen for the latter: `info` is a reasonable verdict for
298
- // "looked in several places, found no JDK" and a useless one for
299
- // "never looked". Reported at `warning` so it is visible on the first
300
- // build — a check whose own failure reads as information can stay
301
- // broken for as long as nobody reads carefully.
302
- //
303
- // `error` is never downgraded. A hard requirement nothing could verify
304
- // is not softer than one that was verified and failed.
305
- return {
306
- stepName,
307
- stepIndex,
308
- requirement: requirement.severity === 'error'
309
- ? requirement
310
- : { ...requirement, severity: 'warning' },
311
- result: {
312
- passed: false,
313
- message: `Check failed: ${error instanceof Error ? error.message : String(error)}`,
314
- },
315
- };
316
- }
317
- }
318
- return null;
319
- }
320
- /**
321
- * Extracts all $VAR and ${VAR} variable names referenced in an object recursively.
322
- *
323
- * `${{ secrets.X }}` / `${{ vars.X }}` references are deliberately ignored:
324
- * those are resolved by the runner-side interpolator before cibuild sees
325
- * the YAML (or by the dashboard's secrets-resolver on dispatch). Without
326
- * this filter the inner regex would capture `{ secrets.X ` as if it were
327
- * a `${VAR}` reference, producing garbled variable names in the
328
- * missing-env error output.
329
- */
330
- extractVariableReferences(obj) {
331
- const vars = new Set();
332
- if (typeof obj === 'string') {
333
- // Strip `${{ ... }}` refs first so they can't be mis-matched as `${VAR}`.
334
- const sanitized = obj.replace(/\$\{\{[^}]*\}\}/g, '');
335
- const pattern = /\$\{([^}]+)\}|\$([A-Z_][A-Z_0-9]*)/g;
336
- let match;
337
- while ((match = pattern.exec(sanitized)) !== null) {
338
- vars.add(match[1] || match[2]);
339
- }
340
- }
341
- else if (Array.isArray(obj)) {
342
- for (const item of obj) {
343
- for (const v of this.extractVariableReferences(item))
344
- vars.add(v);
345
- }
346
- }
347
- else if (obj && typeof obj === 'object') {
348
- for (const value of Object.values(obj)) {
349
- for (const v of this.extractVariableReferences(value))
350
- vars.add(v);
351
- }
352
- }
353
- return vars;
354
- }
355
- /**
356
- * Replaces all unresolved $VAR and ${VAR} references with empty string.
357
- * Used as a lenient fallback when full interpolation fails, so that
358
- * getValidationRequirements can detect truly-missing variables correctly.
359
- *
360
- * `${{ ... }}` refs are left intact — they belong to the runner-side
361
- * interpolator / dashboard secrets-resolver layer, not to shell-level
362
- * variable substitution. Stripping them here would destroy the YAML for
363
- * any downstream consumer that still expects to see them.
364
- */
365
- stripUnresolvedVars(obj) {
366
- if (typeof obj === 'string') {
367
- // `(?!\{)` prevents `\$\{[^}]+\}` from matching a leading `${` of
368
- // `${{ ... }}` and stripping the inner content. Plain `$VAR` and
369
- // `${VAR}` are still stripped as before.
370
- return obj.replace(/\$\{(?!\{)[^}]+\}|\$[A-Z_][A-Z_0-9]*/g, '');
371
- }
372
- if (Array.isArray(obj)) {
373
- return obj.map((item) => this.stripUnresolvedVars(item));
374
- }
375
- if (obj && typeof obj === 'object') {
376
- const result = {};
377
- for (const [key, value] of Object.entries(obj)) {
378
- result[key] = this.stripUnresolvedVars(value);
379
- }
380
- return result;
381
- }
382
- return obj;
383
- }
384
- /**
385
- * Parses a YAML step into a ParsedStep (simplified version of converter logic)
386
- */
387
- parseStep(yamlStep, _index) {
388
- const stepKeys = Object.keys(yamlStep);
389
- const stepNameWithVersion = stepKeys[0];
390
- const stepConfig = yamlStep[stepNameWithVersion];
391
- const atIndex = stepNameWithVersion.indexOf('@');
392
- const name = atIndex === -1 ? stepNameWithVersion : stepNameWithVersion.substring(0, atIndex);
393
- const version = atIndex === -1 ? undefined : stepNameWithVersion.substring(atIndex + 1);
394
- let inputs = stepConfig?.inputs || {};
395
- if (Array.isArray(inputs)) {
396
- const inputsObj = {};
397
- for (const input of inputs) {
398
- if (typeof input === 'object' && input !== null) {
399
- Object.assign(inputsObj, input);
400
- }
401
- }
402
- inputs = inputsObj;
403
- }
404
- return {
405
- name,
406
- version,
407
- title: stepConfig?.title,
408
- inputs,
409
- run_if: stepConfig?.run_if,
410
- is_always_run: stepConfig?.is_always_run,
411
- is_skippable: stepConfig?.is_skippable,
412
- };
413
- }
414
- }
415
- /**
416
- * Format validation result for console output
417
- */
418
- export function formatValidationResult(result) {
419
- if (result.valid && result.issues.length === 0) {
420
- return '\n✅ All pre-execution validations passed\n';
421
- }
422
- const lines = [];
423
- lines.push('\n' + '═'.repeat(70));
424
- lines.push('PRE-EXECUTION VALIDATION RESULTS');
425
- lines.push('═'.repeat(70));
426
- // Summary
427
- lines.push(`\n📊 Summary: ${result.counts.errors} error${result.counts.errors !== 1 ? 's' : ''}, ` +
428
- `${result.counts.warnings} warning${result.counts.warnings !== 1 ? 's' : ''}, ` +
429
- `${result.counts.info} info\n`);
430
- // Group by step
431
- for (const [stepName, stepIssues] of result.issuesByStep) {
432
- const errors = stepIssues.filter((i) => i.requirement.severity === 'error');
433
- const warnings = stepIssues.filter((i) => i.requirement.severity === 'warning');
434
- const infos = stepIssues.filter((i) => i.requirement.severity === 'info');
435
- lines.push(`\n📦 Step: ${stepName}`);
436
- lines.push('─'.repeat(50));
437
- for (const issue of errors) {
438
- lines.push(` ❌ ERROR: ${issue.requirement.description}`);
439
- lines.push(` ${issue.result.message}`);
440
- if (issue.requirement.hint) {
441
- lines.push(` 💡 ${issue.requirement.hint}`);
442
- }
443
- }
444
- for (const issue of warnings) {
445
- lines.push(` ⚠️ WARNING: ${issue.requirement.description}`);
446
- lines.push(` ${issue.result.message}`);
447
- if (issue.requirement.hint) {
448
- lines.push(` 💡 ${issue.requirement.hint}`);
449
- }
450
- }
451
- for (const issue of infos) {
452
- lines.push(` ℹ️ INFO: ${issue.requirement.description}`);
453
- lines.push(` ${issue.result.message}`);
454
- }
455
- }
456
- lines.push('\n' + '═'.repeat(70));
457
- if (result.counts.errors > 0) {
458
- lines.push('❌ Validation failed. Please fix the errors above before running the pipeline.');
459
- }
460
- else {
461
- lines.push('⚠️ Validation passed with warnings. Pipeline can proceed.');
462
- }
463
- lines.push('═'.repeat(70) + '\n');
464
- return lines.join('\n');
465
- }
466
- //# sourceMappingURL=step-validator.js.map
@@ -1,18 +0,0 @@
1
- /**
2
- * Unit tests for the pre-execution platform gate.
3
- *
4
- * A workflow's platform is established by its first platform-specific step,
5
- * and any later step of a different platform is refused. That rule is right
6
- * for an app that targets one platform and wrong for one that targets both:
7
- * a Kotlin Multiplatform build is *inherently* android-then-ios — gradle
8
- * assembles the XCFramework that `xcodebuild` then consumes — and there is no
9
- * way to split it, because a workflow is one dispatch on one machine and two
10
- * workflows share no filesystem.
11
- *
12
- * On 2026-09-01 that cost a real build: a generated KMM pipeline was refused
13
- * before a single step ran. These tests pin the narrow relaxation that fixes
14
- * it — permitted only where the pipeline *declares* a multiplatform app,
15
- * never inferred from the steps themselves.
16
- */
17
- import '../yaml/steps/index.js';
18
- //# sourceMappingURL=step-validator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"step-validator.test.d.ts","sourceRoot":"","sources":["../../../src/yaml/step-validator.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,wBAAwB,CAAC"}
@@ -1,140 +0,0 @@
1
- /**
2
- * Unit tests for the pre-execution platform gate.
3
- *
4
- * A workflow's platform is established by its first platform-specific step,
5
- * and any later step of a different platform is refused. That rule is right
6
- * for an app that targets one platform and wrong for one that targets both:
7
- * a Kotlin Multiplatform build is *inherently* android-then-ios — gradle
8
- * assembles the XCFramework that `xcodebuild` then consumes — and there is no
9
- * way to split it, because a workflow is one dispatch on one machine and two
10
- * workflows share no filesystem.
11
- *
12
- * On 2026-09-01 that cost a real build: a generated KMM pipeline was refused
13
- * before a single step ran. These tests pin the narrow relaxation that fixes
14
- * it — permitted only where the pipeline *declares* a multiplatform app,
15
- * never inferred from the steps themselves.
16
- */
17
- import { describe, test, expect } from '@jest/globals';
18
- import '../yaml/steps/index.js';
19
- import { StepValidator } from './step-validator.js';
20
- import { PlatformDetectionError } from './platform-detector.js';
21
- import { loadConfig } from '../config.js';
22
- const config = loadConfig();
23
- /** What every curated template declares, and what the detector reads first. */
24
- const STACK = 'macos-xcode-26.4';
25
- /**
26
- * A KMM build in one workflow: gradle establishes android, xcodebuild follows.
27
- *
28
- * The stack is not decoration. `PlatformDetector` resolves the host OS from it
29
- * first and only falls back to reading the steps — where a mixed workflow
30
- * throws before this validator ever runs. Every curated template declares a
31
- * stack, so this is the gate a real pipeline actually meets.
32
- *
33
- * `getInvarnMeta` takes `meta.invarn` as a whole when it is present, so a test
34
- * about the legacy block has to omit `meta.invarn` entirely.
35
- */
36
- function kmmShapedPipeline({ invarn, legacy } = {}, { stack = true } = {}) {
37
- const base = stack ? { stack: STACK } : {};
38
- const meta = legacy && !invarn
39
- ? { 'cibuild.io': { ...base, ...legacy } }
40
- : {
41
- invarn: { ...base, ...invarn },
42
- ...(legacy ? { 'cibuild.io': { ...base, ...legacy } } : {}),
43
- };
44
- return {
45
- format_version: '1',
46
- meta,
47
- workflows: {
48
- primary: {
49
- steps: [
50
- { 'gradle-build@1.0.0': { inputs: { project_location: '.', gradle_task: 'assembleDebug' } } },
51
- {
52
- 'xcodebuild@1.0.0': {
53
- inputs: {
54
- project_path: 'iosApp/iosApp.xcodeproj',
55
- scheme: 'iosApp',
56
- destination: 'generic/platform=iOS Simulator',
57
- },
58
- },
59
- },
60
- ],
61
- },
62
- },
63
- };
64
- }
65
- async function platformIssues(pipeline) {
66
- const validator = new StepValidator(pipeline, 'primary', config);
67
- const result = await validator.validateWorkflow();
68
- return (result.issuesByCategory.get('platform') ?? []).map((i) => i.requirement.name);
69
- }
70
- describe('StepValidator platform gate', () => {
71
- test('refuses a mixed workflow that declares no app platform', async () => {
72
- expect(await platformIssues(kmmShapedPipeline())).toEqual(['xcodebuild']);
73
- });
74
- test('permits a mixed workflow that declares a KMM app', async () => {
75
- expect(await platformIssues(kmmShapedPipeline({ invarn: { platform: 'kmm' } }))).toEqual([]);
76
- });
77
- test('permits it through the legacy meta.cibuild.io block too', async () => {
78
- expect(await platformIssues(kmmShapedPipeline({ legacy: { platform: 'kmm' } }))).toEqual([]);
79
- });
80
- // meta.invarn wins as a whole when both blocks are present, so a stale
81
- // `kmm` under the legacy key must not grant permission the current block
82
- // withholds.
83
- test('lets meta.invarn withhold what a stale meta.cibuild.io granted', async () => {
84
- expect(await platformIssues(kmmShapedPipeline({ invarn: { platform: 'android' }, legacy: { platform: 'kmm' } }))).toEqual(['xcodebuild']);
85
- });
86
- // The regression this relaxation could introduce. A declared platform, never
87
- // inference: an ios step in a workflow that says it is android stays refused.
88
- test('still refuses an ios step in a declared-android workflow', async () => {
89
- expect(await platformIssues(kmmShapedPipeline({ invarn: { platform: 'android' } }))).toEqual([
90
- 'xcodebuild',
91
- ]);
92
- });
93
- test('still refuses an android step in a declared-ios workflow', async () => {
94
- const iosFirst = {
95
- format_version: '1',
96
- meta: { invarn: { stack: STACK, platform: 'ios' } },
97
- workflows: {
98
- primary: {
99
- steps: [
100
- { 'xcodebuild@1.0.0': { inputs: { project_path: 'App.xcodeproj', scheme: 'App' } } },
101
- { 'gradle-build@1.0.0': { inputs: { project_location: '.', gradle_task: 'assembleDebug' } } },
102
- ],
103
- },
104
- },
105
- };
106
- expect(await platformIssues(iosFirst)).toEqual(['gradle-build']);
107
- });
108
- // 'other' means the app type was not classified. An unclassified app has not
109
- // declared that it spans platforms; silence is not permission.
110
- test('still refuses when the declared platform is other', async () => {
111
- expect(await platformIssues(kmmShapedPipeline({ invarn: { platform: 'other' } }))).toEqual([
112
- 'xcodebuild',
113
- ]);
114
- });
115
- // The declaration is about mixing, not about skipping the gate: a
116
- // single-platform workflow was never at risk either way.
117
- test('leaves a single-platform workflow alone whatever it declares', async () => {
118
- const androidOnly = {
119
- format_version: '1',
120
- meta: { invarn: { stack: STACK, platform: 'kmm' } },
121
- workflows: {
122
- primary: {
123
- steps: [
124
- { 'gradle-build@1.0.0': { inputs: { project_location: '.', gradle_task: 'assembleDebug' } } },
125
- ],
126
- },
127
- },
128
- };
129
- expect(await platformIssues(androidOnly)).toEqual([]);
130
- });
131
- // Declaring the app's platform does not tell the detector which host OS to
132
- // ask for, and a mixed workflow cannot be read off its steps. That refusal
133
- // is `PlatformDetector`'s and comes first — it is not relaxed here, and its
134
- // own message already says what to add.
135
- test('does not substitute for the stack a mixed workflow still needs', async () => {
136
- const noStack = kmmShapedPipeline({ invarn: { platform: 'kmm' } }, { stack: false });
137
- expect(() => new StepValidator(noStack, 'primary', config)).toThrow(PlatformDetectionError);
138
- });
139
- });
140
- //# sourceMappingURL=step-validator.test.js.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=a-missing-pinned-jdk-yields-for-every-gradle-run.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"a-missing-pinned-jdk-yields-for-every-gradle-run.test.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/a-missing-pinned-jdk-yields-for-every-gradle-run.test.ts"],"names":[],"mappings":""}