@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.
- package/dist/cli.cjs +1 -1
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +987 -0
- package/dist/src/commands/android-scanner.d.ts +32 -0
- package/dist/src/commands/android-scanner.d.ts.map +1 -0
- package/dist/src/commands/android-scanner.js +667 -0
- package/dist/src/commands/build.d.ts +5 -0
- package/dist/src/commands/build.d.ts.map +1 -0
- package/dist/src/commands/build.js +1096 -0
- package/dist/src/commands/edit.d.ts +3 -0
- package/dist/src/commands/edit.d.ts.map +1 -0
- package/dist/src/commands/edit.js +651 -0
- package/dist/src/commands/file-secret-collector.d.ts +37 -0
- package/dist/src/commands/file-secret-collector.d.ts.map +1 -0
- package/dist/src/commands/file-secret-collector.js +199 -0
- package/dist/src/commands/github-workflow.d.ts +5 -0
- package/dist/src/commands/github-workflow.d.ts.map +1 -0
- package/dist/src/commands/github-workflow.js +45 -0
- package/dist/src/commands/ios-scanner.d.ts +27 -0
- package/dist/src/commands/ios-scanner.d.ts.map +1 -0
- package/dist/src/commands/ios-scanner.js +337 -0
- package/dist/src/commands/reset.d.ts +7 -0
- package/dist/src/commands/reset.d.ts.map +1 -0
- package/dist/src/commands/reset.js +81 -0
- package/dist/src/commands/secrets-sync-workflow.d.ts +15 -0
- package/dist/src/commands/secrets-sync-workflow.d.ts.map +1 -0
- package/dist/src/commands/secrets-sync-workflow.js +255 -0
- package/dist/src/commands/secrets-upload.d.ts +21 -0
- package/dist/src/commands/secrets-upload.d.ts.map +1 -0
- package/dist/src/commands/secrets-upload.js +177 -0
- package/dist/src/commands/secrets-upload.test.d.ts +5 -0
- package/dist/src/commands/secrets-upload.test.d.ts.map +1 -0
- package/dist/src/commands/secrets-upload.test.js +60 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +47 -0
- package/dist/src/envman/cli.d.ts +21 -0
- package/dist/src/envman/cli.d.ts.map +1 -0
- package/dist/src/envman/cli.js +240 -0
- package/dist/src/envman/envman.d.ts +83 -0
- package/dist/src/envman/envman.d.ts.map +1 -0
- package/dist/src/envman/envman.js +361 -0
- package/dist/src/envman/envman.test.d.ts +5 -0
- package/dist/src/envman/envman.test.d.ts.map +1 -0
- package/dist/src/envman/envman.test.js +236 -0
- package/dist/src/envman/index.d.ts +23 -0
- package/dist/src/envman/index.d.ts.map +1 -0
- package/dist/src/envman/index.js +23 -0
- package/dist/src/envman/types.d.ts +55 -0
- package/dist/src/envman/types.d.ts.map +1 -0
- package/dist/src/envman/types.js +12 -0
- package/dist/src/lib.d.ts +27 -0
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +32 -0
- package/dist/src/pipeline.d.ts +3 -0
- package/dist/src/pipeline.d.ts.map +1 -0
- package/dist/src/pipeline.js +57 -0
- package/dist/src/runner.d.ts +17 -0
- package/dist/src/runner.d.ts.map +1 -0
- package/dist/src/runner.js +234 -0
- package/dist/src/types.d.ts +58 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/yaml/bitrise-compat.d.ts +65 -0
- package/dist/src/yaml/bitrise-compat.d.ts.map +1 -0
- package/dist/src/yaml/bitrise-compat.js +206 -0
- package/dist/src/yaml/bitrise-compat.test.d.ts +5 -0
- package/dist/src/yaml/bitrise-compat.test.d.ts.map +1 -0
- package/dist/src/yaml/bitrise-compat.test.js +347 -0
- package/dist/src/yaml/converter.d.ts +33 -0
- package/dist/src/yaml/converter.d.ts.map +1 -0
- package/dist/src/yaml/converter.js +222 -0
- package/dist/src/yaml/converter.test.d.ts +5 -0
- package/dist/src/yaml/converter.test.d.ts.map +1 -0
- package/dist/src/yaml/converter.test.js +348 -0
- package/dist/src/yaml/e2e.test.d.ts +6 -0
- package/dist/src/yaml/e2e.test.d.ts.map +1 -0
- package/dist/src/yaml/e2e.test.js +446 -0
- package/dist/src/yaml/env-resolver.d.ts +120 -0
- package/dist/src/yaml/env-resolver.d.ts.map +1 -0
- package/dist/src/yaml/env-resolver.js +405 -0
- package/dist/src/yaml/env-resolver.test.d.ts +5 -0
- package/dist/src/yaml/env-resolver.test.d.ts.map +1 -0
- package/dist/src/yaml/env-resolver.test.js +502 -0
- package/dist/src/yaml/interactive-prompts.d.ts +71 -0
- package/dist/src/yaml/interactive-prompts.d.ts.map +1 -0
- package/dist/src/yaml/interactive-prompts.js +258 -0
- package/dist/src/yaml/missing-env-handler.d.ts +45 -0
- package/dist/src/yaml/missing-env-handler.d.ts.map +1 -0
- package/dist/src/yaml/missing-env-handler.js +64 -0
- package/dist/src/yaml/parser.d.ts +33 -0
- package/dist/src/yaml/parser.d.ts.map +1 -0
- package/dist/src/yaml/parser.js +145 -0
- package/dist/src/yaml/pipeline-with-secrets.d.ts +25 -0
- package/dist/src/yaml/pipeline-with-secrets.d.ts.map +1 -0
- package/dist/src/yaml/pipeline-with-secrets.js +76 -0
- package/dist/src/yaml/platform-detector.d.ts +83 -0
- package/dist/src/yaml/platform-detector.d.ts.map +1 -0
- package/dist/src/yaml/platform-detector.js +188 -0
- package/dist/src/yaml/platform-detector.test.d.ts +5 -0
- package/dist/src/yaml/platform-detector.test.d.ts.map +1 -0
- package/dist/src/yaml/platform-detector.test.js +414 -0
- package/dist/src/yaml/preflight-validation.d.ts +40 -0
- package/dist/src/yaml/preflight-validation.d.ts.map +1 -0
- package/dist/src/yaml/preflight-validation.js +152 -0
- package/dist/src/yaml/secrets-manager.d.ts +77 -0
- package/dist/src/yaml/secrets-manager.d.ts.map +1 -0
- package/dist/src/yaml/secrets-manager.js +219 -0
- package/dist/src/yaml/step-validator.d.ts +54 -0
- package/dist/src/yaml/step-validator.d.ts.map +1 -0
- package/dist/src/yaml/step-validator.js +403 -0
- package/dist/src/yaml/steps/android-sign.d.ts +35 -0
- package/dist/src/yaml/steps/android-sign.d.ts.map +1 -0
- package/dist/src/yaml/steps/android-sign.js +147 -0
- package/dist/src/yaml/steps/android-version.d.ts +26 -0
- package/dist/src/yaml/steps/android-version.d.ts.map +1 -0
- package/dist/src/yaml/steps/android-version.js +128 -0
- package/dist/src/yaml/steps/android-version.test.d.ts +5 -0
- package/dist/src/yaml/steps/android-version.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/android-version.test.js +196 -0
- package/dist/src/yaml/steps/android.d.ts +95 -0
- package/dist/src/yaml/steps/android.d.ts.map +1 -0
- package/dist/src/yaml/steps/android.js +916 -0
- package/dist/src/yaml/steps/app-store-deploy.d.ts +48 -0
- package/dist/src/yaml/steps/app-store-deploy.d.ts.map +1 -0
- package/dist/src/yaml/steps/app-store-deploy.js +162 -0
- package/dist/src/yaml/steps/base.d.ts +238 -0
- package/dist/src/yaml/steps/base.d.ts.map +1 -0
- package/dist/src/yaml/steps/base.js +345 -0
- package/dist/src/yaml/steps/bitrise-android-tools.d.ts +26 -0
- package/dist/src/yaml/steps/bitrise-android-tools.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-android-tools.js +198 -0
- package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts +5 -0
- package/dist/src/yaml/steps/bitrise-android-tools.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-android-tools.test.js +280 -0
- package/dist/src/yaml/steps/bitrise-apk-info.d.ts +22 -0
- package/dist/src/yaml/steps/bitrise-apk-info.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-apk-info.js +144 -0
- package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts +5 -0
- package/dist/src/yaml/steps/bitrise-apk-info.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-apk-info.test.js +331 -0
- package/dist/src/yaml/steps/bitrise-slack.d.ts +49 -0
- package/dist/src/yaml/steps/bitrise-slack.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-slack.js +280 -0
- package/dist/src/yaml/steps/bitrise-slack.test.d.ts +5 -0
- package/dist/src/yaml/steps/bitrise-slack.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-slack.test.js +484 -0
- package/dist/src/yaml/steps/bitrise-ssh.d.ts +27 -0
- package/dist/src/yaml/steps/bitrise-ssh.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-ssh.js +134 -0
- package/dist/src/yaml/steps/bitrise-ssh.test.d.ts +5 -0
- package/dist/src/yaml/steps/bitrise-ssh.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/bitrise-ssh.test.js +205 -0
- package/dist/src/yaml/steps/cache.d.ts +52 -0
- package/dist/src/yaml/steps/cache.d.ts.map +1 -0
- package/dist/src/yaml/steps/cache.js +352 -0
- package/dist/src/yaml/steps/fastlane.d.ts +27 -0
- package/dist/src/yaml/steps/fastlane.d.ts.map +1 -0
- package/dist/src/yaml/steps/fastlane.js +79 -0
- package/dist/src/yaml/steps/file.d.ts +27 -0
- package/dist/src/yaml/steps/file.d.ts.map +1 -0
- package/dist/src/yaml/steps/file.js +35 -0
- package/dist/src/yaml/steps/flutter.d.ts +63 -0
- package/dist/src/yaml/steps/flutter.d.ts.map +1 -0
- package/dist/src/yaml/steps/flutter.js +215 -0
- package/dist/src/yaml/steps/git-clone.d.ts +26 -0
- package/dist/src/yaml/steps/git-clone.d.ts.map +1 -0
- package/dist/src/yaml/steps/git-clone.js +111 -0
- package/dist/src/yaml/steps/google-play-deploy.d.ts +37 -0
- package/dist/src/yaml/steps/google-play-deploy.d.ts.map +1 -0
- package/dist/src/yaml/steps/google-play-deploy.js +193 -0
- package/dist/src/yaml/steps/google-play-deploy.test.d.ts +5 -0
- package/dist/src/yaml/steps/google-play-deploy.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/google-play-deploy.test.js +310 -0
- package/dist/src/yaml/steps/index.d.ts +10 -0
- package/dist/src/yaml/steps/index.d.ts.map +1 -0
- package/dist/src/yaml/steps/index.js +1361 -0
- package/dist/src/yaml/steps/ios-deps.d.ts +43 -0
- package/dist/src/yaml/steps/ios-deps.d.ts.map +1 -0
- package/dist/src/yaml/steps/ios-deps.js +141 -0
- package/dist/src/yaml/steps/ios-deps.test.d.ts +5 -0
- package/dist/src/yaml/steps/ios-deps.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/ios-deps.test.js +90 -0
- package/dist/src/yaml/steps/ios-signing.d.ts +31 -0
- package/dist/src/yaml/steps/ios-signing.d.ts.map +1 -0
- package/dist/src/yaml/steps/ios-signing.js +144 -0
- package/dist/src/yaml/steps/ios-version.d.ts +47 -0
- package/dist/src/yaml/steps/ios-version.d.ts.map +1 -0
- package/dist/src/yaml/steps/ios-version.js +151 -0
- package/dist/src/yaml/steps/linting.d.ts +47 -0
- package/dist/src/yaml/steps/linting.d.ts.map +1 -0
- package/dist/src/yaml/steps/linting.js +148 -0
- package/dist/src/yaml/steps/phase2.test.d.ts +6 -0
- package/dist/src/yaml/steps/phase2.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/phase2.test.js +197 -0
- package/dist/src/yaml/steps/phase3.test.d.ts +5 -0
- package/dist/src/yaml/steps/phase3.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/phase3.test.js +144 -0
- package/dist/src/yaml/steps/phase4.test.d.ts +5 -0
- package/dist/src/yaml/steps/phase4.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/phase4.test.js +166 -0
- package/dist/src/yaml/steps/phase5.test.d.ts +6 -0
- package/dist/src/yaml/steps/phase5.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/phase5.test.js +263 -0
- package/dist/src/yaml/steps/registry.d.ts +88 -0
- package/dist/src/yaml/steps/registry.d.ts.map +1 -0
- package/dist/src/yaml/steps/registry.js +125 -0
- package/dist/src/yaml/steps/registry.test.d.ts +5 -0
- package/dist/src/yaml/steps/registry.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/registry.test.js +235 -0
- package/dist/src/yaml/steps/release.d.ts +50 -0
- package/dist/src/yaml/steps/release.d.ts.map +1 -0
- package/dist/src/yaml/steps/release.js +154 -0
- package/dist/src/yaml/steps/script.d.ts +23 -0
- package/dist/src/yaml/steps/script.d.ts.map +1 -0
- package/dist/src/yaml/steps/script.js +63 -0
- package/dist/src/yaml/steps/spec-validation.test.d.ts +6 -0
- package/dist/src/yaml/steps/spec-validation.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/spec-validation.test.js +130 -0
- package/dist/src/yaml/steps/steps.test.d.ts +6 -0
- package/dist/src/yaml/steps/steps.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/steps.test.js +505 -0
- package/dist/src/yaml/steps/test-config.d.ts +3 -0
- package/dist/src/yaml/steps/test-config.d.ts.map +1 -0
- package/dist/src/yaml/steps/test-config.js +17 -0
- package/dist/src/yaml/steps/xcode-new.test.d.ts +5 -0
- package/dist/src/yaml/steps/xcode-new.test.d.ts.map +1 -0
- package/dist/src/yaml/steps/xcode-new.test.js +211 -0
- package/dist/src/yaml/steps/xcode.d.ts +222 -0
- package/dist/src/yaml/steps/xcode.d.ts.map +1 -0
- package/dist/src/yaml/steps/xcode.js +999 -0
- package/dist/src/yaml/types.d.ts +68 -0
- package/dist/src/yaml/types.d.ts.map +1 -0
- package/dist/src/yaml/types.js +5 -0
- package/dist/src/yaml/validation-types.d.ts +96 -0
- package/dist/src/yaml/validation-types.d.ts.map +1 -0
- package/dist/src/yaml/validation-types.js +8 -0
- package/dist/src/yaml/yaml-updater.d.ts +24 -0
- package/dist/src/yaml/yaml-updater.d.ts.map +1 -0
- package/dist/src/yaml/yaml-updater.js +128 -0
- 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 @@
|
|
|
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
|