@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,88 @@
1
+ /**
2
+ * Step registry - manages available YAML steps
3
+ */
4
+ import type { StepExecutor, StepMetadata } from './base.js';
5
+ export declare class UnrecognizedStepError extends Error {
6
+ readonly stepName: string;
7
+ readonly availableSteps: string[];
8
+ constructor(stepName: string, availableSteps: string[]);
9
+ }
10
+ /**
11
+ * Global step registry
12
+ */
13
+ declare class StepRegistry {
14
+ private steps;
15
+ /**
16
+ * Registers a step executor
17
+ * @param name Step name (e.g., 'git-clone')
18
+ * @param executor Step executor instance
19
+ * @param metadata Optional step metadata
20
+ */
21
+ register(name: string, executor: StepExecutor, metadata?: StepMetadata): void;
22
+ /**
23
+ * Gets a step executor by name
24
+ * @param name Step name
25
+ * @returns Step executor
26
+ * @throws UnrecognizedStepError if step not found
27
+ */
28
+ getExecutor(name: string): StepExecutor;
29
+ /**
30
+ * Checks if a step is registered
31
+ * @param name Step name
32
+ * @returns True if step exists
33
+ */
34
+ has(name: string): boolean;
35
+ /**
36
+ * Gets all registered step names
37
+ * @returns Array of step names
38
+ */
39
+ getStepNames(): string[];
40
+ /**
41
+ * Gets metadata for a step
42
+ * @param name Step name
43
+ * @returns Step metadata or undefined
44
+ */
45
+ getMetadata(name: string): StepMetadata | undefined;
46
+ /**
47
+ * Clears all registered steps (useful for testing)
48
+ */
49
+ clear(): void;
50
+ }
51
+ declare const registry: StepRegistry;
52
+ /**
53
+ * Registers a step in the global registry
54
+ * @param name Step name
55
+ * @param executor Step executor
56
+ * @param metadata Optional metadata
57
+ */
58
+ export declare function registerStep(name: string, executor: StepExecutor, metadata?: StepMetadata): void;
59
+ /**
60
+ * Gets a step executor from the global registry
61
+ * @param name Step name
62
+ * @returns Step executor
63
+ * @throws UnrecognizedStepError if step not found
64
+ */
65
+ export declare function getStepExecutor(name: string): StepExecutor;
66
+ /**
67
+ * Checks if a step is registered
68
+ * @param name Step name
69
+ * @returns True if step exists
70
+ */
71
+ export declare function hasStep(name: string): boolean;
72
+ /**
73
+ * Gets all registered step names
74
+ * @returns Array of step names
75
+ */
76
+ export declare function getAvailableSteps(): string[];
77
+ /**
78
+ * Gets metadata for a step
79
+ * @param name Step name
80
+ * @returns Step metadata or undefined
81
+ */
82
+ export declare function getStepMetadata(name: string): StepMetadata | undefined;
83
+ /**
84
+ * Clears the registry (for testing)
85
+ */
86
+ export declare function clearRegistry(): void;
87
+ export { registry };
88
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5D,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,QAAQ,EAAE,MAAM;aAChB,cAAc,EAAE,MAAM,EAAE;gBADxB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EAAE;CAQ3C;AAUD;;GAEG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAA6C;IAE1D;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI;IAI7E;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IASvC;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;OAGG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKnD;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,QAAA,MAAM,QAAQ,cAAqB,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE,YAAY,GACtB,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAGD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Step registry - manages available YAML steps
3
+ */
4
+ export class UnrecognizedStepError extends Error {
5
+ stepName;
6
+ availableSteps;
7
+ constructor(stepName, availableSteps) {
8
+ super(`Unrecognized step: '${stepName}'\n` +
9
+ `Supported steps: ${availableSteps.join(', ')}`);
10
+ this.stepName = stepName;
11
+ this.availableSteps = availableSteps;
12
+ this.name = 'UnrecognizedStepError';
13
+ }
14
+ }
15
+ /**
16
+ * Global step registry
17
+ */
18
+ class StepRegistry {
19
+ steps = new Map();
20
+ /**
21
+ * Registers a step executor
22
+ * @param name Step name (e.g., 'git-clone')
23
+ * @param executor Step executor instance
24
+ * @param metadata Optional step metadata
25
+ */
26
+ register(name, executor, metadata) {
27
+ this.steps.set(name, { executor, metadata });
28
+ }
29
+ /**
30
+ * Gets a step executor by name
31
+ * @param name Step name
32
+ * @returns Step executor
33
+ * @throws UnrecognizedStepError if step not found
34
+ */
35
+ getExecutor(name) {
36
+ const entry = this.steps.get(name);
37
+ if (!entry) {
38
+ const availableSteps = Array.from(this.steps.keys()).sort();
39
+ throw new UnrecognizedStepError(name, availableSteps);
40
+ }
41
+ return entry.executor;
42
+ }
43
+ /**
44
+ * Checks if a step is registered
45
+ * @param name Step name
46
+ * @returns True if step exists
47
+ */
48
+ has(name) {
49
+ return this.steps.has(name);
50
+ }
51
+ /**
52
+ * Gets all registered step names
53
+ * @returns Array of step names
54
+ */
55
+ getStepNames() {
56
+ return Array.from(this.steps.keys()).sort();
57
+ }
58
+ /**
59
+ * Gets metadata for a step
60
+ * @param name Step name
61
+ * @returns Step metadata or undefined
62
+ */
63
+ getMetadata(name) {
64
+ const entry = this.steps.get(name);
65
+ return entry?.metadata;
66
+ }
67
+ /**
68
+ * Clears all registered steps (useful for testing)
69
+ */
70
+ clear() {
71
+ this.steps.clear();
72
+ }
73
+ }
74
+ // Global registry instance
75
+ const registry = new StepRegistry();
76
+ /**
77
+ * Registers a step in the global registry
78
+ * @param name Step name
79
+ * @param executor Step executor
80
+ * @param metadata Optional metadata
81
+ */
82
+ export function registerStep(name, executor, metadata) {
83
+ registry.register(name, executor, metadata);
84
+ }
85
+ /**
86
+ * Gets a step executor from the global registry
87
+ * @param name Step name
88
+ * @returns Step executor
89
+ * @throws UnrecognizedStepError if step not found
90
+ */
91
+ export function getStepExecutor(name) {
92
+ return registry.getExecutor(name);
93
+ }
94
+ /**
95
+ * Checks if a step is registered
96
+ * @param name Step name
97
+ * @returns True if step exists
98
+ */
99
+ export function hasStep(name) {
100
+ return registry.has(name);
101
+ }
102
+ /**
103
+ * Gets all registered step names
104
+ * @returns Array of step names
105
+ */
106
+ export function getAvailableSteps() {
107
+ return registry.getStepNames();
108
+ }
109
+ /**
110
+ * Gets metadata for a step
111
+ * @param name Step name
112
+ * @returns Step metadata or undefined
113
+ */
114
+ export function getStepMetadata(name) {
115
+ return registry.getMetadata(name);
116
+ }
117
+ /**
118
+ * Clears the registry (for testing)
119
+ */
120
+ export function clearRegistry() {
121
+ registry.clear();
122
+ }
123
+ // Export the registry instance for advanced usage
124
+ export { registry };
125
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unit tests for step registry
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/registry.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Unit tests for step registry
3
+ */
4
+ import { describe, test, expect, beforeEach } from '@jest/globals';
5
+ import { testConfig } from './test-config.js';
6
+ import { registerStep, getStepExecutor, hasStep, getAvailableSteps, getStepMetadata, clearRegistry, UnrecognizedStepError, } from './registry.js';
7
+ import { BaseStepExecutor } from './base.js';
8
+ // Mock step executor for testing
9
+ class MockStepExecutor extends BaseStepExecutor {
10
+ async execute(inputs, env) {
11
+ return this.createScriptStep('echo "mock step"', 'mock-step');
12
+ }
13
+ }
14
+ describe('Step Registry', () => {
15
+ beforeEach(() => {
16
+ // Clear registry before each test to ensure clean state
17
+ clearRegistry();
18
+ });
19
+ describe('registerStep', () => {
20
+ test('should register a step successfully', () => {
21
+ const executor = new MockStepExecutor();
22
+ registerStep('test-step', executor);
23
+ expect(hasStep('test-step')).toBe(true);
24
+ });
25
+ test('should register a step with metadata', () => {
26
+ const executor = new MockStepExecutor();
27
+ const metadata = {
28
+ name: 'test-step',
29
+ description: 'A test step',
30
+ inputs: {
31
+ test_input: {
32
+ description: 'Test input',
33
+ required: true,
34
+ },
35
+ },
36
+ };
37
+ registerStep('test-step', executor, metadata);
38
+ expect(hasStep('test-step')).toBe(true);
39
+ expect(getStepMetadata('test-step')).toEqual(metadata);
40
+ });
41
+ test('should allow overwriting an existing step', () => {
42
+ const executor1 = new MockStepExecutor();
43
+ const executor2 = new MockStepExecutor();
44
+ registerStep('test-step', executor1);
45
+ registerStep('test-step', executor2);
46
+ expect(hasStep('test-step')).toBe(true);
47
+ expect(getStepExecutor('test-step')).toBe(executor2);
48
+ });
49
+ });
50
+ describe('getStepExecutor', () => {
51
+ test('should retrieve a registered step executor', () => {
52
+ const executor = new MockStepExecutor();
53
+ registerStep('test-step', executor);
54
+ const retrieved = getStepExecutor('test-step');
55
+ expect(retrieved).toBe(executor);
56
+ });
57
+ test('should throw UnrecognizedStepError for unknown step', () => {
58
+ expect(() => {
59
+ getStepExecutor('unknown-step');
60
+ }).toThrow(UnrecognizedStepError);
61
+ });
62
+ test('UnrecognizedStepError should include step name', () => {
63
+ try {
64
+ getStepExecutor('unknown-step');
65
+ expect(true).toBe(false); // Should not reach here
66
+ }
67
+ catch (error) {
68
+ expect(error).toBeInstanceOf(UnrecognizedStepError);
69
+ expect(error.stepName).toBe('unknown-step');
70
+ }
71
+ });
72
+ test('UnrecognizedStepError should include available steps', () => {
73
+ registerStep('step-a', new MockStepExecutor());
74
+ registerStep('step-b', new MockStepExecutor());
75
+ try {
76
+ getStepExecutor('unknown-step');
77
+ expect(true).toBe(false); // Should not reach here
78
+ }
79
+ catch (error) {
80
+ expect(error).toBeInstanceOf(UnrecognizedStepError);
81
+ const err = error;
82
+ expect(err.availableSteps).toContain('step-a');
83
+ expect(err.availableSteps).toContain('step-b');
84
+ }
85
+ });
86
+ test('UnrecognizedStepError message should be helpful', () => {
87
+ registerStep('git-clone', new MockStepExecutor());
88
+ registerStep('script', new MockStepExecutor());
89
+ try {
90
+ getStepExecutor('git-push');
91
+ expect(true).toBe(false); // Should not reach here
92
+ }
93
+ catch (error) {
94
+ expect(error).toBeInstanceOf(UnrecognizedStepError);
95
+ const message = error.message;
96
+ expect(message).toContain('git-push');
97
+ expect(message).toContain('Supported steps');
98
+ expect(message).toContain('git-clone');
99
+ expect(message).toContain('script');
100
+ }
101
+ });
102
+ });
103
+ describe('hasStep', () => {
104
+ test('should return true for registered step', () => {
105
+ registerStep('test-step', new MockStepExecutor());
106
+ expect(hasStep('test-step')).toBe(true);
107
+ });
108
+ test('should return false for unregistered step', () => {
109
+ expect(hasStep('unknown-step')).toBe(false);
110
+ });
111
+ test('should return false after clearing registry', () => {
112
+ registerStep('test-step', new MockStepExecutor());
113
+ clearRegistry();
114
+ expect(hasStep('test-step')).toBe(false);
115
+ });
116
+ });
117
+ describe('getAvailableSteps', () => {
118
+ test('should return empty array when no steps registered', () => {
119
+ expect(getAvailableSteps()).toEqual([]);
120
+ });
121
+ test('should return all registered step names', () => {
122
+ registerStep('step-a', new MockStepExecutor());
123
+ registerStep('step-b', new MockStepExecutor());
124
+ registerStep('step-c', new MockStepExecutor());
125
+ const steps = getAvailableSteps();
126
+ expect(steps).toHaveLength(3);
127
+ expect(steps).toContain('step-a');
128
+ expect(steps).toContain('step-b');
129
+ expect(steps).toContain('step-c');
130
+ });
131
+ test('should return steps in sorted order', () => {
132
+ registerStep('zebra', new MockStepExecutor());
133
+ registerStep('apple', new MockStepExecutor());
134
+ registerStep('mango', new MockStepExecutor());
135
+ const steps = getAvailableSteps();
136
+ expect(steps).toEqual(['apple', 'mango', 'zebra']);
137
+ });
138
+ });
139
+ describe('getStepMetadata', () => {
140
+ test('should return metadata for registered step', () => {
141
+ const metadata = {
142
+ name: 'test-step',
143
+ description: 'A test step',
144
+ };
145
+ registerStep('test-step', new MockStepExecutor(), metadata);
146
+ expect(getStepMetadata('test-step')).toEqual(metadata);
147
+ });
148
+ test('should return undefined for step without metadata', () => {
149
+ registerStep('test-step', new MockStepExecutor());
150
+ expect(getStepMetadata('test-step')).toBeUndefined();
151
+ });
152
+ test('should return undefined for unregistered step', () => {
153
+ expect(getStepMetadata('unknown-step')).toBeUndefined();
154
+ });
155
+ });
156
+ describe('clearRegistry', () => {
157
+ test('should remove all registered steps', () => {
158
+ registerStep('step-a', new MockStepExecutor());
159
+ registerStep('step-b', new MockStepExecutor());
160
+ expect(getAvailableSteps()).toHaveLength(2);
161
+ clearRegistry();
162
+ expect(getAvailableSteps()).toHaveLength(0);
163
+ expect(hasStep('step-a')).toBe(false);
164
+ expect(hasStep('step-b')).toBe(false);
165
+ });
166
+ test('should allow re-registration after clear', () => {
167
+ registerStep('test-step', new MockStepExecutor());
168
+ clearRegistry();
169
+ registerStep('test-step', new MockStepExecutor());
170
+ expect(hasStep('test-step')).toBe(true);
171
+ });
172
+ });
173
+ describe('Step execution', () => {
174
+ test('should execute registered step', async () => {
175
+ const executor = new MockStepExecutor();
176
+ registerStep('test-step', executor);
177
+ const retrieved = getStepExecutor('test-step');
178
+ const result = await retrieved.execute({}, {}, testConfig);
179
+ expect(result).toHaveProperty('kind', 'script');
180
+ expect(result).toHaveProperty('name', 'mock-step');
181
+ expect(result).toHaveProperty('script');
182
+ });
183
+ test('should pass inputs and env to executor', async () => {
184
+ class InputCapturingExecutor extends BaseStepExecutor {
185
+ capturedInputs;
186
+ capturedEnv;
187
+ async execute(inputs, env) {
188
+ this.capturedInputs = inputs;
189
+ this.capturedEnv = env;
190
+ return this.createScriptStep('echo "test"', 'test');
191
+ }
192
+ }
193
+ const executor = new InputCapturingExecutor();
194
+ registerStep('test-step', executor);
195
+ const inputs = { test: 'value' };
196
+ const env = { VAR: 'test' };
197
+ const retrieved = getStepExecutor('test-step');
198
+ await retrieved.execute(inputs, env, testConfig);
199
+ expect(executor.capturedInputs).toEqual(inputs);
200
+ expect(executor.capturedEnv).toEqual(env);
201
+ });
202
+ });
203
+ describe('Integration scenarios', () => {
204
+ test('should handle multiple steps with same prefix', () => {
205
+ registerStep('git-clone', new MockStepExecutor());
206
+ registerStep('git-push', new MockStepExecutor());
207
+ registerStep('git-pull', new MockStepExecutor());
208
+ expect(hasStep('git-clone')).toBe(true);
209
+ expect(hasStep('git-push')).toBe(true);
210
+ expect(hasStep('git-pull')).toBe(true);
211
+ const steps = getAvailableSteps();
212
+ expect(steps).toEqual(['git-clone', 'git-pull', 'git-push']);
213
+ });
214
+ test('should handle case-sensitive step names', () => {
215
+ registerStep('Step-A', new MockStepExecutor());
216
+ registerStep('step-a', new MockStepExecutor());
217
+ expect(hasStep('Step-A')).toBe(true);
218
+ expect(hasStep('step-a')).toBe(true);
219
+ expect(getAvailableSteps()).toHaveLength(2);
220
+ });
221
+ test('should provide helpful error when typo in step name', () => {
222
+ registerStep('git-clone', new MockStepExecutor());
223
+ try {
224
+ getStepExecutor('git-clonee'); // Common typo
225
+ expect(true).toBe(false);
226
+ }
227
+ catch (error) {
228
+ const message = error.message;
229
+ expect(message).toContain('git-clonee');
230
+ expect(message).toContain('git-clone');
231
+ }
232
+ });
233
+ });
234
+ });
235
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Release steps: generate-changelog, github-release
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
+ export interface GenerateChangelogInputs {
8
+ /** Path to write the changelog file */
9
+ changelog_path?: string;
10
+ /** Working directory containing the git repo */
11
+ working_dir?: string;
12
+ }
13
+ /**
14
+ * Generates changelog from git commit history since the last tag.
15
+ */
16
+ export declare class GenerateChangelogStepExecutor extends BaseStepExecutor {
17
+ getValidationRequirements(_inputs: GenerateChangelogInputs, _env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
18
+ getOutputs(): StepOutput[];
19
+ execute(inputs: GenerateChangelogInputs, _env: Record<string, string>, _config: CIConfig): Promise<StepDef>;
20
+ }
21
+ export interface GithubReleaseInputs {
22
+ /** GitHub repository (owner/repo) */
23
+ repository_url?: string;
24
+ /** Release tag name */
25
+ tag?: string;
26
+ /** Release title */
27
+ name?: string;
28
+ /** Release body / notes */
29
+ body?: string;
30
+ /** Path to changelog file to use as body (alternative to body) */
31
+ changelog_path?: string;
32
+ /** Whether this is a draft release (true/false) */
33
+ draft?: string;
34
+ /** Whether this is a pre-release (true/false) */
35
+ pre_release?: string;
36
+ /** File paths to attach as release assets (newline-separated) */
37
+ files_to_upload?: string;
38
+ /** GitHub API token */
39
+ api_token?: string;
40
+ }
41
+ /**
42
+ * Creates a GitHub release with optional artifact attachments using the gh CLI.
43
+ */
44
+ export declare class GithubReleaseStepExecutor extends BaseStepExecutor {
45
+ getValidationRequirements(_inputs: GithubReleaseInputs, _env: Record<string, string>, _config: CIConfig): ValidationRequirement[];
46
+ getOutputs(): StepOutput[];
47
+ isSkippedInLocalMode(): boolean;
48
+ execute(inputs: GithubReleaseInputs, _env: Record<string, string>, _config: CIConfig): Promise<StepDef>;
49
+ }
50
+ //# sourceMappingURL=release.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/release.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMhF,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,gBAAgB;IACjE,yBAAyB,CACvB,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,OAAO,EAAE,QAAQ,GAChB,qBAAqB,EAAE;IAM1B,UAAU,IAAI,UAAU,EAAE;IAMpB,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAqDlH;AAMD,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;IAC7D,yBAAyB,CACvB,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,OAAO,EAAE,QAAQ,GAChB,qBAAqB,EAAE;IAM1B,UAAU,IAAI,UAAU,EAAE;IAM1B,oBAAoB,IAAI,OAAO;IAIzB,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAmF9G"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Release steps: generate-changelog, github-release
3
+ */
4
+ import { BaseStepExecutor } from './base.js';
5
+ /**
6
+ * Generates changelog from git commit history since the last tag.
7
+ */
8
+ export class GenerateChangelogStepExecutor extends BaseStepExecutor {
9
+ getValidationRequirements(_inputs, _env, _config) {
10
+ return [
11
+ this.requireCommand('git', 'git is required for changelog generation'),
12
+ ];
13
+ }
14
+ getOutputs() {
15
+ return [
16
+ { name: 'CIBUILD_CHANGELOG', type: 'environment', description: 'The generated changelog content' },
17
+ ];
18
+ }
19
+ async execute(inputs, _env, _config) {
20
+ const stepName = 'generate-changelog';
21
+ const changelogPath = this.getInput(inputs, 'changelog_path', './CHANGELOG.md');
22
+ const workingDir = this.getInput(inputs, 'working_dir', '.');
23
+ const commands = [];
24
+ commands.push('# generate-changelog — from git history');
25
+ commands.push('echo "📝 Generating changelog..."');
26
+ commands.push('');
27
+ commands.push(`cd '${this.escapeBash(workingDir)}'`);
28
+ commands.push('');
29
+ // Find the latest tag
30
+ commands.push('# Find the latest tag');
31
+ commands.push('LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")');
32
+ commands.push('');
33
+ // Generate changelog
34
+ commands.push('if [ -n "$LATEST_TAG" ]; then');
35
+ commands.push(' echo "Generating changelog since tag: $LATEST_TAG"');
36
+ commands.push(' CHANGELOG=$(git log "$LATEST_TAG"..HEAD --pretty=format:"- %s (%h)" --no-merges)');
37
+ commands.push('else');
38
+ commands.push(' echo "No tags found — generating changelog from all commits"');
39
+ commands.push(' CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges)');
40
+ commands.push('fi');
41
+ commands.push('');
42
+ // Handle empty changelog
43
+ commands.push('if [ -z "$CHANGELOG" ]; then');
44
+ commands.push(' CHANGELOG="No changes since last release."');
45
+ commands.push('fi');
46
+ commands.push('');
47
+ // Write to file
48
+ commands.push(`CHANGELOG_PATH='${this.escapeBash(changelogPath)}'`);
49
+ commands.push('mkdir -p "$(dirname "$CHANGELOG_PATH")"');
50
+ commands.push('echo "$CHANGELOG" > "$CHANGELOG_PATH"');
51
+ commands.push('echo "Changelog written to: $CHANGELOG_PATH"');
52
+ commands.push('echo "---"');
53
+ commands.push('echo "$CHANGELOG"');
54
+ commands.push('echo "---"');
55
+ commands.push('');
56
+ // Export
57
+ commands.push('envman add --key CIBUILD_CHANGELOG --value "$CHANGELOG"');
58
+ commands.push('echo "✅ Changelog generated"');
59
+ const script = this.createBashScriptFromCommands(commands, stepName);
60
+ return this.createScriptStep(script, stepName);
61
+ }
62
+ }
63
+ /**
64
+ * Creates a GitHub release with optional artifact attachments using the gh CLI.
65
+ */
66
+ export class GithubReleaseStepExecutor extends BaseStepExecutor {
67
+ getValidationRequirements(_inputs, _env, _config) {
68
+ return [
69
+ this.requireCommand('gh', 'GitHub CLI (gh) is required for creating releases'),
70
+ ];
71
+ }
72
+ getOutputs() {
73
+ return [
74
+ { name: 'CIBUILD_RELEASE_URL', type: 'environment', description: 'URL of the created GitHub release' },
75
+ ];
76
+ }
77
+ isSkippedInLocalMode() {
78
+ return true;
79
+ }
80
+ async execute(inputs, _env, _config) {
81
+ const stepName = 'github-release';
82
+ const tag = this.getRequiredInput(inputs, 'tag', stepName);
83
+ const repositoryUrl = this.getInput(inputs, 'repository_url', '');
84
+ const name = this.getInput(inputs, 'name', '');
85
+ const body = this.getInput(inputs, 'body', '');
86
+ const changelogPath = this.getInput(inputs, 'changelog_path', '');
87
+ const draft = this.getInput(inputs, 'draft', 'false') === 'true';
88
+ const preRelease = this.getInput(inputs, 'pre_release', 'false') === 'true';
89
+ const filesToUpload = this.getInput(inputs, 'files_to_upload', '');
90
+ const apiToken = this.getInput(inputs, 'api_token', '$GITHUB_TOKEN');
91
+ const commands = [];
92
+ commands.push('# github-release — create a GitHub release');
93
+ commands.push('echo "🚀 Creating GitHub release..."');
94
+ commands.push('');
95
+ // Auth
96
+ commands.push(`export GH_TOKEN='${this.escapeBash(apiToken)}'`);
97
+ commands.push('');
98
+ // Build gh release create command
99
+ const flags = [];
100
+ flags.push(`--title '${this.escapeBash(name || tag)}'`);
101
+ if (body) {
102
+ flags.push(`--notes '${this.escapeBash(body)}'`);
103
+ }
104
+ else if (changelogPath) {
105
+ flags.push(`--notes-file '${this.escapeBash(changelogPath)}'`);
106
+ }
107
+ else {
108
+ flags.push('--generate-notes');
109
+ }
110
+ if (draft) {
111
+ flags.push('--draft');
112
+ }
113
+ if (preRelease) {
114
+ flags.push('--prerelease');
115
+ }
116
+ // Repository flag
117
+ let repoFlag = '';
118
+ if (repositoryUrl) {
119
+ repoFlag = ` --repo '${this.escapeBash(repositoryUrl)}'`;
120
+ }
121
+ // File attachments
122
+ if (filesToUpload) {
123
+ commands.push('# Collect files to upload');
124
+ commands.push(`FILES_INPUT='${this.escapeBash(filesToUpload)}'`);
125
+ commands.push('FILE_ARGS=""');
126
+ commands.push('while IFS= read -r file; do');
127
+ commands.push(' file=$(echo "$file" | xargs)');
128
+ commands.push(' [ -z "$file" ] && continue');
129
+ commands.push(' if [ -f "$file" ]; then');
130
+ commands.push(' FILE_ARGS="$FILE_ARGS \\"$file\\""');
131
+ commands.push(' else');
132
+ commands.push(' echo "⚠️ File not found: $file"');
133
+ commands.push(' fi');
134
+ commands.push('done <<< "$FILES_INPUT"');
135
+ commands.push('');
136
+ }
137
+ const flagStr = flags.join(' ');
138
+ commands.push(`TAG='${this.escapeBash(tag)}'`);
139
+ commands.push('');
140
+ if (filesToUpload) {
141
+ commands.push(`RELEASE_URL=$(eval gh release create "$TAG" ${flagStr}${repoFlag} $FILE_ARGS 2>&1)`);
142
+ }
143
+ else {
144
+ commands.push(`RELEASE_URL=$(gh release create "$TAG" ${flagStr}${repoFlag} 2>&1)`);
145
+ }
146
+ commands.push('');
147
+ commands.push('echo "Release URL: $RELEASE_URL"');
148
+ commands.push('envman add --key CIBUILD_RELEASE_URL --value "$RELEASE_URL"');
149
+ commands.push('echo "✅ GitHub release created"');
150
+ const script = this.createBashScriptFromCommands(commands, stepName);
151
+ return this.createScriptStep(script, stepName);
152
+ }
153
+ }
154
+ //# sourceMappingURL=release.js.map