@pipeline-builder/pipeline-core 3.1.0

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 (54) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +32 -0
  3. package/lib/config/app-config.d.ts +81 -0
  4. package/lib/config/app-config.js +151 -0
  5. package/lib/config/billing-config.d.ts +17 -0
  6. package/lib/config/billing-config.js +95 -0
  7. package/lib/config/config-types.d.ts +213 -0
  8. package/lib/config/config-types.js +5 -0
  9. package/lib/config/infrastructure-config.d.ts +55 -0
  10. package/lib/config/infrastructure-config.js +200 -0
  11. package/lib/config/server-config.d.ts +53 -0
  12. package/lib/config/server-config.js +180 -0
  13. package/lib/core/artifact-manager.d.ts +62 -0
  14. package/lib/core/artifact-manager.js +86 -0
  15. package/lib/core/id-generator.d.ts +26 -0
  16. package/lib/core/id-generator.js +44 -0
  17. package/lib/core/metadata-builder.d.ts +13 -0
  18. package/lib/core/metadata-builder.js +81 -0
  19. package/lib/core/network-types.d.ts +200 -0
  20. package/lib/core/network-types.js +5 -0
  21. package/lib/core/network.d.ts +20 -0
  22. package/lib/core/network.js +84 -0
  23. package/lib/core/pipeline-helpers.d.ts +53 -0
  24. package/lib/core/pipeline-helpers.js +273 -0
  25. package/lib/core/pipeline-types.d.ts +136 -0
  26. package/lib/core/pipeline-types.js +140 -0
  27. package/lib/core/role-types.d.ts +254 -0
  28. package/lib/core/role-types.js +5 -0
  29. package/lib/core/role.d.ts +14 -0
  30. package/lib/core/role.js +118 -0
  31. package/lib/core/security-group-types.d.ts +84 -0
  32. package/lib/core/security-group-types.js +5 -0
  33. package/lib/core/security-group.d.ts +14 -0
  34. package/lib/core/security-group.js +34 -0
  35. package/lib/handlers/plugin-lookup-handler.d.ts +32 -0
  36. package/lib/handlers/plugin-lookup-handler.js +313 -0
  37. package/lib/handlers/pnpm-lock.yaml +12 -0
  38. package/lib/index.d.ts +54 -0
  39. package/lib/index.js +112 -0
  40. package/lib/pipeline/pipeline-builder.d.ts +82 -0
  41. package/lib/pipeline/pipeline-builder.js +292 -0
  42. package/lib/pipeline/pipeline-configuration.d.ts +72 -0
  43. package/lib/pipeline/pipeline-configuration.js +196 -0
  44. package/lib/pipeline/plugin-lookup.d.ts +100 -0
  45. package/lib/pipeline/plugin-lookup.js +247 -0
  46. package/lib/pipeline/source-builder.d.ts +47 -0
  47. package/lib/pipeline/source-builder.js +111 -0
  48. package/lib/pipeline/source-types.d.ts +191 -0
  49. package/lib/pipeline/source-types.js +5 -0
  50. package/lib/pipeline/stage-builder.d.ts +71 -0
  51. package/lib/pipeline/stage-builder.js +118 -0
  52. package/lib/pipeline/step-types.d.ts +307 -0
  53. package/lib/pipeline/step-types.js +5 -0
  54. package/package.json +137 -0
@@ -0,0 +1,47 @@
1
+ import { CodePipelineSource } from 'aws-cdk-lib/pipelines';
2
+ import { Construct } from 'constructs';
3
+ import type { PipelineConfiguration } from './pipeline-configuration';
4
+ import { UniqueId } from '../core/id-generator';
5
+ /**
6
+ * Creates the appropriate CodePipelineSource based on the pipeline configuration.
7
+ *
8
+ * Supports S3, GitHub, CodeStar connection, and CodeCommit sources.
9
+ *
10
+ * **Note on SCHEDULE triggers:** Scheduled pipelines require an EventBridge rule
11
+ * that starts the pipeline on a cron schedule. The source trigger is set to NONE
12
+ * (no polling/webhook). The EventBridge rule must be created separately as a
13
+ * pipeline-level construct, not at the source level. The `schedule` field on
14
+ * source options captures the cron expression for API/frontend use, but the
15
+ * actual EventBridge rule creation is not yet implemented in this builder.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const sourceBuilder = new SourceBuilder(this, config);
20
+ * const source = sourceBuilder.create(uniqueId);
21
+ * ```
22
+ */
23
+ export declare class SourceBuilder {
24
+ private readonly scope;
25
+ private readonly config;
26
+ constructor(scope: Construct, config: PipelineConfiguration);
27
+ /**
28
+ * Creates the appropriate CodePipelineSource based on source type
29
+ */
30
+ create(id: UniqueId): CodePipelineSource;
31
+ /**
32
+ * Creates an S3 source for the pipeline
33
+ */
34
+ private createS3Source;
35
+ /**
36
+ * Creates a GitHub source for the pipeline
37
+ */
38
+ private createGitHubSource;
39
+ /**
40
+ * Creates a CodeStar connection source for the pipeline
41
+ */
42
+ private createCodeStarSource;
43
+ /**
44
+ * Creates a CodeCommit source for the pipeline
45
+ */
46
+ private createCodeCommitSource;
47
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.SourceBuilder = void 0;
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_codecommit_1 = require("aws-cdk-lib/aws-codecommit");
8
+ const aws_codepipeline_actions_1 = require("aws-cdk-lib/aws-codepipeline-actions");
9
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
10
+ const pipelines_1 = require("aws-cdk-lib/pipelines");
11
+ const pipeline_helpers_1 = require("../core/pipeline-helpers");
12
+ const pipeline_types_1 = require("../core/pipeline-types");
13
+ /**
14
+ * Creates the appropriate CodePipelineSource based on the pipeline configuration.
15
+ *
16
+ * Supports S3, GitHub, CodeStar connection, and CodeCommit sources.
17
+ *
18
+ * **Note on SCHEDULE triggers:** Scheduled pipelines require an EventBridge rule
19
+ * that starts the pipeline on a cron schedule. The source trigger is set to NONE
20
+ * (no polling/webhook). The EventBridge rule must be created separately as a
21
+ * pipeline-level construct, not at the source level. The `schedule` field on
22
+ * source options captures the cron expression for API/frontend use, but the
23
+ * actual EventBridge rule creation is not yet implemented in this builder.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const sourceBuilder = new SourceBuilder(this, config);
28
+ * const source = sourceBuilder.create(uniqueId);
29
+ * ```
30
+ */
31
+ class SourceBuilder {
32
+ scope;
33
+ config;
34
+ constructor(scope, config) {
35
+ this.scope = scope;
36
+ this.config = config;
37
+ }
38
+ /**
39
+ * Creates the appropriate CodePipelineSource based on source type
40
+ */
41
+ create(id) {
42
+ switch (this.config.source.type) {
43
+ case 's3':
44
+ return this.createS3Source(id);
45
+ case 'github':
46
+ return this.createGitHubSource();
47
+ case 'codestar':
48
+ return this.createCodeStarSource();
49
+ case 'codecommit':
50
+ return this.createCodeCommitSource(id);
51
+ default: {
52
+ const _exhaustive = this.config.source;
53
+ throw new Error(`Unsupported source type: ${_exhaustive.type}`);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Creates an S3 source for the pipeline
59
+ */
60
+ createS3Source(id) {
61
+ const options = this.config.getS3Options();
62
+ const bucket = aws_s3_1.Bucket.fromBucketName(this.scope, id.generate('source:bucket'), options.bucketName);
63
+ let trigger;
64
+ switch (options.trigger) {
65
+ case pipeline_types_1.TriggerType.AUTO:
66
+ trigger = aws_codepipeline_actions_1.S3Trigger.EVENTS;
67
+ break;
68
+ case pipeline_types_1.TriggerType.SCHEDULE:
69
+ trigger = aws_codepipeline_actions_1.S3Trigger.NONE;
70
+ break;
71
+ default: trigger = aws_codepipeline_actions_1.S3Trigger.NONE;
72
+ }
73
+ return pipelines_1.CodePipelineSource.s3(bucket, options.objectKey, { trigger });
74
+ }
75
+ /**
76
+ * Creates a GitHub source for the pipeline
77
+ */
78
+ createGitHubSource() {
79
+ const options = this.config.getGitHubOptions();
80
+ const authentication = options.token
81
+ ? (typeof options.token === 'string' ? aws_cdk_lib_1.SecretValue.unsafePlainText(options.token) : options.token)
82
+ : undefined;
83
+ return pipelines_1.CodePipelineSource.gitHub(options.repo, options.branch, {
84
+ trigger: options.trigger === pipeline_types_1.TriggerType.AUTO ? aws_codepipeline_actions_1.GitHubTrigger.POLL : aws_codepipeline_actions_1.GitHubTrigger.NONE,
85
+ authentication,
86
+ });
87
+ }
88
+ /**
89
+ * Creates a CodeStar connection source for the pipeline
90
+ */
91
+ createCodeStarSource() {
92
+ const options = this.config.getCodeStarOptions();
93
+ return pipelines_1.CodePipelineSource.connection(options.repo, options.branch, {
94
+ connectionArn: (0, pipeline_helpers_1.unwrapSecret)(options.connectionArn),
95
+ triggerOnPush: options.trigger === pipeline_types_1.TriggerType.AUTO,
96
+ codeBuildCloneOutput: options.codeBuildCloneOutput,
97
+ });
98
+ }
99
+ /**
100
+ * Creates a CodeCommit source for the pipeline
101
+ */
102
+ createCodeCommitSource(id) {
103
+ const options = this.config.getCodeCommitOptions();
104
+ const repository = aws_codecommit_1.Repository.fromRepositoryName(this.scope, id.generate('source:repo'), options.repositoryName);
105
+ return pipelines_1.CodePipelineSource.codeCommit(repository, options.branch ?? 'main', {
106
+ trigger: options.trigger === pipeline_types_1.TriggerType.AUTO ? aws_codepipeline_actions_1.CodeCommitTrigger.EVENTS : aws_codepipeline_actions_1.CodeCommitTrigger.NONE,
107
+ });
108
+ }
109
+ }
110
+ exports.SourceBuilder = SourceBuilder;
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmUvc291cmNlLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0Qyw2Q0FBMEM7QUFDMUMsK0RBQXdEO0FBQ3hELG1GQUFtRztBQUNuRywrQ0FBNEM7QUFDNUMscURBQTJEO0FBSTNELCtEQUF3RDtBQUN4RCwyREFBc0U7QUFFdEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBYSxhQUFhO0lBRUw7SUFDQTtJQUZuQixZQUNtQixLQUFnQixFQUNoQixNQUE2QjtRQUQ3QixVQUFLLEdBQUwsS0FBSyxDQUFXO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQXVCO0lBQzdDLENBQUM7SUFFSjs7T0FFRztJQUNILE1BQU0sQ0FBQyxFQUFZO1FBQ2pCLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsS0FBSyxJQUFJO2dCQUNQLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNuQyxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNyQyxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixNQUFNLFdBQVcsR0FBVSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNkIsV0FBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVH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O1NBQ2xHLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdGRCxzQ0E2RkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVjb21taXQnO1xuaW1wb3J0IHsgQ29kZUNvbW1pdFRyaWdnZXIsIEdpdEh1YlRyaWdnZXIsIFMzVHJpZ2dlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9ucyc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyB1bndyYXBTZWNyZXQgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLWhlbHBlcnMnO1xuaW1wb3J0IHsgVHJpZ2dlclR5cGUsIHR5cGUgU291cmNlVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMnO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIENvZGVQaXBlbGluZVNvdXJjZSBiYXNlZCBvbiB0aGUgcGlwZWxpbmUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBTdXBwb3J0cyBTMywgR2l0SHViLCBDb2RlU3RhciBjb25uZWN0aW9uLCBhbmQgQ29kZUNvbW1pdCBzb3VyY2VzLlxuICpcbiAqICoqTm90ZSBvbiBTQ0hFRFVMRSB0cmlnZ2VyczoqKiBTY2hlZHVsZWQgcGlwZWxpbmVzIHJlcXVpcmUgYW4gRXZlbnRCcmlkZ2UgcnVsZVxuICogdGhhdCBzdGFydHMgdGhlIHBpcGVsaW5lIG9uIGEgY3JvbiBzY2hlZHVsZS4gVGhlIHNvdXJjZSB0cmlnZ2VyIGlzIHNldCB0byBOT05FXG4gKiAobm8gcG9sbGluZy93ZWJob29rKS4gVGhlIEV2ZW50QnJpZGdlIHJ1bGUgbXVzdCBiZSBjcmVhdGVkIHNlcGFyYXRlbHkgYXMgYVxuICogcGlwZWxpbmUtbGV2ZWwgY29uc3RydWN0LCBub3QgYXQgdGhlIHNvdXJjZSBsZXZlbC4gVGhlIGBzY2hlZHVsZWAgZmllbGQgb25cbiAqIHNvdXJjZSBvcHRpb25zIGNhcHR1cmVzIHRoZSBjcm9uIGV4cHJlc3Npb24gZm9yIEFQSS9mcm9udGVuZCB1c2UsIGJ1dCB0aGVcbiAqIGFjdHVhbCBFdmVudEJyaWRnZSBydWxlIGNyZWF0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gdGhpcyBidWlsZGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzb3VyY2VCdWlsZGVyID0gbmV3IFNvdXJjZUJ1aWxkZXIodGhpcywgY29uZmlnKTtcbiAqIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUJ1aWxkZXIuY3JlYXRlKHVuaXF1ZUlkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU291cmNlQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUGlwZWxpbmVDb25maWd1cmF0aW9uLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIENvZGVQaXBlbGluZVNvdXJjZSBiYXNlZCBvbiBzb3VyY2UgdHlwZVxuICAgKi9cbiAgY3JlYXRlKGlkOiBVbmlxdWVJZCk6IENvZGVQaXBlbGluZVNvdXJjZSB7XG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZy5zb3VyY2UudHlwZSkge1xuICAgICAgY2FzZSAnczMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTM1NvdXJjZShpZCk7XG4gICAgICBjYXNlICdnaXRodWInOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVHaXRIdWJTb3VyY2UoKTtcbiAgICAgIGNhc2UgJ2NvZGVzdGFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29kZVN0YXJTb3VyY2UoKTtcbiAgICAgIGNhc2UgJ2NvZGVjb21taXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDb2RlQ29tbWl0U291cmNlKGlkKTtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gdGhpcy5jb25maWcuc291cmNlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNvdXJjZSB0eXBlOiAkeyhfZXhoYXVzdGl2ZSBhcyBTb3VyY2VUeXBlKS50eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIFMzIHNvdXJjZSBmb3IgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVMzU291cmNlKGlkOiBVbmlxdWVJZCk6IENvZGVQaXBlbGluZVNvdXJjZSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLmdldFMzT3B0aW9ucygpO1xuXG4gICAgY29uc3QgYnVja2V0ID0gQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIGlkLmdlbmVyYXRlKCdzb3VyY2U6YnVja2V0JyksXG4gICAgICBvcHRpb25zLmJ1Y2tldE5hbWUsXG4gICAgKTtcblxuICAgIGxldCB0cmlnZ2VyOiBTM1RyaWdnZXI7XG4gICAgc3dpdGNoIChvcHRpb25zLnRyaWdnZXIpIHtcbiAgICAgIGNhc2UgVHJpZ2dlclR5cGUuQVVUTzogdHJpZ2dlciA9IFMzVHJpZ2dlci5FVkVOVFM7IGJyZWFrO1xuICAgICAgY2FzZSBUcmlnZ2VyVHlwZS5TQ0hFRFVMRTogdHJpZ2dlciA9IFMzVHJpZ2dlci5OT05FOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHRyaWdnZXIgPSBTM1RyaWdnZXIuTk9ORTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ29kZVBpcGVsaW5lU291cmNlLnMzKGJ1Y2tldCwgb3B0aW9ucy5vYmplY3RLZXksIHsgdHJpZ2dlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgR2l0SHViIHNvdXJjZSBmb3IgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUdpdEh1YlNvdXJjZSgpOiBDb2RlUGlwZWxpbmVTb3VyY2Uge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRHaXRIdWJPcHRpb25zKCk7XG5cbiAgICBjb25zdCBhdXRoZW50aWNhdGlvbiA9IG9wdGlvbnMudG9rZW5cbiAgICAgID8gKHR5cGVvZiBvcHRpb25zLnRva2VuID09PSAnc3RyaW5nJyA/IFNlY3JldFZhbHVlLnVuc2FmZVBsYWluVGV4dChvcHRpb25zLnRva2VuKSA6IG9wdGlvbnMudG9rZW4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBDb2RlUGlwZWxpbmVTb3VyY2UuZ2l0SHViKG9wdGlvbnMucmVwbywgb3B0aW9ucy5icmFuY2gsIHtcbiAgICAgIHRyaWdnZXI6IG9wdGlvbnMudHJpZ2dlciA9PT0gVHJpZ2dlclR5cGUuQVVUTyA/IEdpdEh1YlRyaWdnZXIuUE9MTCA6IEdpdEh1YlRyaWdnZXIuTk9ORSxcbiAgICAgIGF1dGhlbnRpY2F0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb2RlU3RhciBjb25uZWN0aW9uIHNvdXJjZSBmb3IgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvZGVTdGFyU291cmNlKCk6IENvZGVQaXBlbGluZVNvdXJjZSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLmdldENvZGVTdGFyT3B0aW9ucygpO1xuXG4gICAgcmV0dXJuIENvZGVQaXBlbGluZVNvdXJjZS5jb25uZWN0aW9uKG9wdGlvbnMucmVwbywgb3B0aW9ucy5icmFuY2gsIHtcbiAgICAgIGNvbm5lY3Rpb25Bcm46IHVud3JhcFNlY3JldChvcHRpb25zLmNvbm5lY3Rpb25Bcm4pLFxuICAgICAgdHJpZ2dlck9uUHVzaDogb3B0aW9ucy50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5BVVRPLFxuICAgICAgY29kZUJ1aWxkQ2xvbmVPdXRwdXQ6IG9wdGlvbnMuY29kZUJ1aWxkQ2xvbmVPdXRwdXQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENvZGVDb21taXQgc291cmNlIGZvciB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29kZUNvbW1pdFNvdXJjZShpZDogVW5pcXVlSWQpOiBDb2RlUGlwZWxpbmVTb3VyY2Uge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRDb2RlQ29tbWl0T3B0aW9ucygpO1xuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIGlkLmdlbmVyYXRlKCdzb3VyY2U6cmVwbycpLFxuICAgICAgb3B0aW9ucy5yZXBvc2l0b3J5TmFtZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIENvZGVQaXBlbGluZVNvdXJjZS5jb2RlQ29tbWl0KHJlcG9zaXRvcnksIG9wdGlvbnMuYnJhbmNoID8/ICdtYWluJywge1xuICAgICAgdHJpZ2dlcjogb3B0aW9ucy50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5BVVRPID8gQ29kZUNvbW1pdFRyaWdnZXIuRVZFTlRTIDogQ29kZUNvbW1pdFRyaWdnZXIuTk9ORSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,191 @@
1
+ import type { SecretValue } from 'aws-cdk-lib';
2
+ import type { TriggerType } from '../core/pipeline-types';
3
+ /**
4
+ * S3 source configuration for CodePipeline
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const source: S3SourceConfig = {
9
+ * type: 's3',
10
+ * options: {
11
+ * bucketName: 'my-source-bucket',
12
+ * objectKey: 'source.zip',
13
+ * trigger: TriggerType.AUTO
14
+ * }
15
+ * };
16
+ * ```
17
+ */
18
+ export interface S3SourceConfig {
19
+ readonly type: 's3';
20
+ readonly options: S3Options;
21
+ }
22
+ /**
23
+ * GitHub source configuration for CodePipeline
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const source: GitHubSourceConfig = {
28
+ * type: 'github',
29
+ * options: {
30
+ * repo: 'owner/repository',
31
+ * branch: 'main',
32
+ * trigger: TriggerType.AUTO
33
+ * }
34
+ * };
35
+ * ```
36
+ */
37
+ export interface GitHubSourceConfig {
38
+ readonly type: 'github';
39
+ readonly options: GitHubOptions;
40
+ }
41
+ /**
42
+ * CodeStar connection source configuration for CodePipeline
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const source: CodeStarSourceConfig = {
47
+ * type: 'codestar',
48
+ * options: {
49
+ * repo: 'owner/repository',
50
+ * branch: 'main',
51
+ * connectionArn: 'arn:aws:codestar-connections:...',
52
+ * trigger: TriggerType.AUTO
53
+ * }
54
+ * };
55
+ * ```
56
+ */
57
+ export interface CodeStarSourceConfig {
58
+ readonly type: 'codestar';
59
+ readonly options: CodeStarOptions;
60
+ }
61
+ /**
62
+ * Configuration options for S3 pipeline source
63
+ */
64
+ export interface S3Options {
65
+ /**
66
+ * Name of the S3 bucket containing the source code
67
+ * @example 'my-pipeline-source-bucket'
68
+ */
69
+ readonly bucketName: string;
70
+ /**
71
+ * Object key (path) to the source archive within the bucket
72
+ * @default 'source.zip'
73
+ */
74
+ readonly objectKey?: string;
75
+ /**
76
+ * Pipeline trigger behavior
77
+ * @default TriggerType.NONE
78
+ */
79
+ readonly trigger?: TriggerType;
80
+ /**
81
+ * Cron expression for scheduled trigger (e.g., 'cron(0 0 * * ? *)' for daily).
82
+ * Only used when trigger is SCHEDULE.
83
+ */
84
+ readonly schedule?: string;
85
+ }
86
+ /**
87
+ * Configuration options for GitHub pipeline source
88
+ */
89
+ export interface GitHubOptions {
90
+ /**
91
+ * GitHub repository in the format "owner/repo"
92
+ * @example 'myorg/myrepo'
93
+ */
94
+ readonly repo: string;
95
+ /**
96
+ * Branch to track
97
+ * @default 'main'
98
+ */
99
+ readonly branch?: string;
100
+ /**
101
+ * GitHub personal access token or SecretValue
102
+ * If not provided, uses default GitHub authentication
103
+ */
104
+ readonly token?: SecretValue | string;
105
+ /**
106
+ * Pipeline trigger behavior
107
+ * @default TriggerType.NONE
108
+ */
109
+ readonly trigger?: TriggerType;
110
+ /**
111
+ * Cron expression for scheduled trigger (e.g., 'cron(0 0 * * ? *)' for daily).
112
+ * Only used when trigger is SCHEDULE.
113
+ */
114
+ readonly schedule?: string;
115
+ }
116
+ /**
117
+ * Configuration options for CodeStar connection pipeline source
118
+ */
119
+ export interface CodeStarOptions {
120
+ /**
121
+ * Repository identifier in the format "owner/repo"
122
+ * @example 'myorg/myrepo'
123
+ */
124
+ readonly repo: string;
125
+ /**
126
+ * Branch to track
127
+ * @default 'main'
128
+ */
129
+ readonly branch?: string;
130
+ /**
131
+ * ARN of the CodeStar connection to use
132
+ * Can be a string ARN or SecretValue
133
+ * @example 'arn:aws:codestar-connections:us-east-1:123456789012:connection/abc123'
134
+ */
135
+ readonly connectionArn: SecretValue | string;
136
+ /**
137
+ * Pipeline trigger behavior
138
+ * @default TriggerType.NONE
139
+ */
140
+ readonly trigger?: TriggerType;
141
+ /**
142
+ * Cron expression for scheduled trigger (e.g., 'cron(0 0 * * ? *)' for daily).
143
+ * Only used when trigger is SCHEDULE.
144
+ */
145
+ readonly schedule?: string;
146
+ /**
147
+ * Whether to enable full clone capability in CodeBuild
148
+ * When true, CodeBuild can perform git operations on the full repository
149
+ * @default false
150
+ */
151
+ readonly codeBuildCloneOutput?: boolean;
152
+ }
153
+ /**
154
+ * CodeCommit source configuration for CodePipeline
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const source: CodeCommitSourceConfig = {
159
+ * type: 'codecommit',
160
+ * options: {
161
+ * repositoryName: 'my-repo',
162
+ * branch: 'main',
163
+ * trigger: TriggerType.AUTO
164
+ * }
165
+ * };
166
+ * ```
167
+ */
168
+ export interface CodeCommitSourceConfig {
169
+ readonly type: 'codecommit';
170
+ readonly options: CodeCommitOptions;
171
+ }
172
+ /**
173
+ * Configuration options for CodeCommit pipeline source
174
+ */
175
+ export interface CodeCommitOptions {
176
+ /**
177
+ * Name of the CodeCommit repository
178
+ * @example 'my-repo'
179
+ */
180
+ readonly repositoryName: string;
181
+ /**
182
+ * Branch to track
183
+ * @default 'main'
184
+ */
185
+ readonly branch?: string;
186
+ /**
187
+ * Pipeline trigger behavior
188
+ * @default TriggerType.NONE
189
+ */
190
+ readonly trigger?: TriggerType;
191
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL3NvdXJjZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFNlY3JldFZhbHVlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBUcmlnZ2VyVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMnO1xuXG4vKipcbiAqIFMzIHNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBDb2RlUGlwZWxpbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc291cmNlOiBTM1NvdXJjZUNvbmZpZyA9IHtcbiAqICAgdHlwZTogJ3MzJyxcbiAqICAgb3B0aW9uczoge1xuICogICAgIGJ1Y2tldE5hbWU6ICdteS1zb3VyY2UtYnVja2V0JyxcbiAqICAgICBvYmplY3RLZXk6ICdzb3VyY2UuemlwJyxcbiAqICAgICB0cmlnZ2VyOiBUcmlnZ2VyVHlwZS5BVVRPXG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM1NvdXJjZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHR5cGU6ICdzMyc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFMzT3B0aW9ucztcbn1cblxuLyoqXG4gKiBHaXRIdWIgc291cmNlIGNvbmZpZ3VyYXRpb24gZm9yIENvZGVQaXBlbGluZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzb3VyY2U6IEdpdEh1YlNvdXJjZUNvbmZpZyA9IHtcbiAqICAgdHlwZTogJ2dpdGh1YicsXG4gKiAgIG9wdGlvbnM6IHtcbiAqICAgICByZXBvOiAnb3duZXIvcmVwb3NpdG9yeScsXG4gKiAgICAgYnJhbmNoOiAnbWFpbicsXG4gKiAgICAgdHJpZ2dlcjogVHJpZ2dlclR5cGUuQVVUT1xuICogICB9XG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViU291cmNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2dpdGh1Yic7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IEdpdEh1Yk9wdGlvbnM7XG59XG5cbi8qKlxuICogQ29kZVN0YXIgY29ubmVjdGlvbiBzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgQ29kZVBpcGVsaW5lXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNvdXJjZTogQ29kZVN0YXJTb3VyY2VDb25maWcgPSB7XG4gKiAgIHR5cGU6ICdjb2Rlc3RhcicsXG4gKiAgIG9wdGlvbnM6IHtcbiAqICAgICByZXBvOiAnb3duZXIvcmVwb3NpdG9yeScsXG4gKiAgICAgYnJhbmNoOiAnbWFpbicsXG4gKiAgICAgY29ubmVjdGlvbkFybjogJ2Fybjphd3M6Y29kZXN0YXItY29ubmVjdGlvbnM6Li4uJyxcbiAqICAgICB0cmlnZ2VyOiBUcmlnZ2VyVHlwZS5BVVRPXG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlU3RhclNvdXJjZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHR5cGU6ICdjb2Rlc3Rhcic7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVTdGFyT3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFMzIHBpcGVsaW5lIHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBTMyBidWNrZXQgY29udGFpbmluZyB0aGUgc291cmNlIGNvZGVcbiAgICogQGV4YW1wbGUgJ215LXBpcGVsaW5lLXNvdXJjZS1idWNrZXQnXG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9iamVjdCBrZXkgKHBhdGgpIHRvIHRoZSBzb3VyY2UgYXJjaGl2ZSB3aXRoaW4gdGhlIGJ1Y2tldFxuICAgKiBAZGVmYXVsdCAnc291cmNlLnppcCdcbiAgICovXG4gIHJlYWRvbmx5IG9iamVjdEtleT86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgdHJpZ2dlciBiZWhhdmlvclxuICAgKiBAZGVmYXVsdCBUcmlnZ2VyVHlwZS5OT05FXG4gICAqL1xuICByZWFkb25seSB0cmlnZ2VyPzogVHJpZ2dlclR5cGU7XG5cbiAgLyoqXG4gICAqIENyb24gZXhwcmVzc2lvbiBmb3Igc2NoZWR1bGVkIHRyaWdnZXIgKGUuZy4sICdjcm9uKDAgMCAqICogPyAqKScgZm9yIGRhaWx5KS5cbiAgICogT25seSB1c2VkIHdoZW4gdHJpZ2dlciBpcyBTQ0hFRFVMRS5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgR2l0SHViIHBpcGVsaW5lIHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1Yk9wdGlvbnMge1xuICAvKipcbiAgICogR2l0SHViIHJlcG9zaXRvcnkgaW4gdGhlIGZvcm1hdCBcIm93bmVyL3JlcG9cIlxuICAgKiBAZXhhbXBsZSAnbXlvcmcvbXlyZXBvJ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCcmFuY2ggdG8gdHJhY2tcbiAgICogQGRlZmF1bHQgJ21haW4nXG4gICAqL1xuICByZWFkb25seSBicmFuY2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdpdEh1YiBwZXJzb25hbCBhY2Nlc3MgdG9rZW4gb3IgU2VjcmV0VmFsdWVcbiAgICogSWYgbm90IHByb3ZpZGVkLCB1c2VzIGRlZmF1bHQgR2l0SHViIGF1dGhlbnRpY2F0aW9uXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IFNlY3JldFZhbHVlIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSB0cmlnZ2VyIGJlaGF2aW9yXG4gICAqIEBkZWZhdWx0IFRyaWdnZXJUeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHRyaWdnZXI/OiBUcmlnZ2VyVHlwZTtcblxuICAvKipcbiAgICogQ3JvbiBleHByZXNzaW9uIGZvciBzY2hlZHVsZWQgdHJpZ2dlciAoZS5nLiwgJ2Nyb24oMCAwICogKiA/ICopJyBmb3IgZGFpbHkpLlxuICAgKiBPbmx5IHVzZWQgd2hlbiB0cmlnZ2VyIGlzIFNDSEVEVUxFLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBDb2RlU3RhciBjb25uZWN0aW9uIHBpcGVsaW5lIHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVTdGFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IGlkZW50aWZpZXIgaW4gdGhlIGZvcm1hdCBcIm93bmVyL3JlcG9cIlxuICAgKiBAZXhhbXBsZSAnbXlvcmcvbXlyZXBvJ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCcmFuY2ggdG8gdHJhY2tcbiAgICogQGRlZmF1bHQgJ21haW4nXG4gICAqL1xuICByZWFkb25seSBicmFuY2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgQ29kZVN0YXIgY29ubmVjdGlvbiB0byB1c2VcbiAgICogQ2FuIGJlIGEgc3RyaW5nIEFSTiBvciBTZWNyZXRWYWx1ZVxuICAgKiBAZXhhbXBsZSAnYXJuOmF3czpjb2Rlc3Rhci1jb25uZWN0aW9uczp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmNvbm5lY3Rpb24vYWJjMTIzJ1xuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbkFybjogU2VjcmV0VmFsdWUgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHRyaWdnZXIgYmVoYXZpb3JcbiAgICogQGRlZmF1bHQgVHJpZ2dlclR5cGUuTk9ORVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBDcm9uIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCB0cmlnZ2VyIChlLmcuLCAnY3JvbigwIDAgKiAqID8gKiknIGZvciBkYWlseSkuXG4gICAqIE9ubHkgdXNlZCB3aGVuIHRyaWdnZXIgaXMgU0NIRURVTEUuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZnVsbCBjbG9uZSBjYXBhYmlsaXR5IGluIENvZGVCdWlsZFxuICAgKiBXaGVuIHRydWUsIENvZGVCdWlsZCBjYW4gcGVyZm9ybSBnaXQgb3BlcmF0aW9ucyBvbiB0aGUgZnVsbCByZXBvc2l0b3J5XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb2RlQnVpbGRDbG9uZU91dHB1dD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29kZUNvbW1pdCBzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgQ29kZVBpcGVsaW5lXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNvdXJjZTogQ29kZUNvbW1pdFNvdXJjZUNvbmZpZyA9IHtcbiAqICAgdHlwZTogJ2NvZGVjb21taXQnLFxuICogICBvcHRpb25zOiB7XG4gKiAgICAgcmVwb3NpdG9yeU5hbWU6ICdteS1yZXBvJyxcbiAqICAgICBicmFuY2g6ICdtYWluJyxcbiAqICAgICB0cmlnZ2VyOiBUcmlnZ2VyVHlwZS5BVVRPXG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQ29tbWl0U291cmNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2NvZGVjb21taXQnO1xuICByZWFkb25seSBvcHRpb25zOiBDb2RlQ29tbWl0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIENvZGVDb21taXQgcGlwZWxpbmUgc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUNvbW1pdE9wdGlvbnMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgQ29kZUNvbW1pdCByZXBvc2l0b3J5XG4gICAqIEBleGFtcGxlICdteS1yZXBvJ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQnJhbmNoIHRvIHRyYWNrXG4gICAqIEBkZWZhdWx0ICdtYWluJ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSB0cmlnZ2VyIGJlaGF2aW9yXG4gICAqIEBkZWZhdWx0IFRyaWdnZXJUeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHRyaWdnZXI/OiBUcmlnZ2VyVHlwZTtcbn1cbiJdfQ==
@@ -0,0 +1,71 @@
1
+ import type { ComputeType as CdkComputeType } from 'aws-cdk-lib/aws-codebuild';
2
+ import { CodePipeline } from 'aws-cdk-lib/pipelines';
3
+ import { Construct } from 'constructs';
4
+ import { PluginLookup } from './plugin-lookup';
5
+ import type { StageOptions } from './step-types';
6
+ import type { ArtifactManager } from '../core/artifact-manager';
7
+ import { UniqueId } from '../core/id-generator';
8
+ import type { MetaDataType } from '../core/pipeline-types';
9
+ /**
10
+ * Configuration properties for the StageBuilder
11
+ */
12
+ export interface StageBuilderProps {
13
+ /** CDK construct scope for creating child constructs */
14
+ readonly scope: Construct;
15
+ /** Plugin lookup service for resolving plugin references to CDK constructs */
16
+ readonly pluginLookup: PluginLookup;
17
+ /** Unique ID generator for creating deterministic construct IDs */
18
+ readonly uniqueId: UniqueId;
19
+ /** Global metadata inherited by all stage steps */
20
+ readonly globalMetadata: MetaDataType;
21
+ /** Default CodeBuild compute type for steps that don't specify one */
22
+ readonly defaultComputeType?: CdkComputeType;
23
+ /** Artifact manager for resolving input artifact keys to FileSets */
24
+ readonly artifactManager?: ArtifactManager;
25
+ /** Tenant identifier for resolving per-org secrets from AWS Secrets Manager */
26
+ readonly orgId?: string;
27
+ }
28
+ /**
29
+ * Builds and adds pipeline stages (waves) to a CodePipeline.
30
+ *
31
+ * Each stage is resolved from high-level configuration (plugin names)
32
+ * into CDK CodeBuild steps via PluginLookup, then added as a wave.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const stageBuilder = new StageBuilder({
37
+ * scope: this,
38
+ * pluginLookup,
39
+ * uniqueId,
40
+ * globalMetadata: mergedMetadata,
41
+ * });
42
+ * stageBuilder.addStage(pipeline, {
43
+ * stageName: 'Integration Tests',
44
+ * alias: 'integration',
45
+ * steps: [
46
+ * { plugin: { name: 'jest-integration' } },
47
+ * { plugin: { name: 'e2e-tests', alias: 'cypress' } },
48
+ * ],
49
+ * });
50
+ * ```
51
+ */
52
+ export declare class StageBuilder {
53
+ private readonly scope;
54
+ private readonly pluginLookup;
55
+ private readonly uniqueId;
56
+ private readonly globalMetadata;
57
+ private readonly defaultComputeType?;
58
+ private readonly artifactManager?;
59
+ private readonly orgId?;
60
+ constructor(props: StageBuilderProps);
61
+ /**
62
+ * Resolves a stage's plugin-based step configs into CodeBuild steps
63
+ * and adds them as a wave to the pipeline.
64
+ */
65
+ addStage(pipeline: CodePipeline, stage: StageOptions): void;
66
+ private resolveStep;
67
+ /**
68
+ * Resolves and adds multiple stages as waves to the pipeline, in order.
69
+ */
70
+ addStages(pipeline: CodePipeline, stages: StageOptions[]): void;
71
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.StageBuilder = void 0;
6
+ const pipeline_helpers_1 = require("../core/pipeline-helpers");
7
+ /**
8
+ * Builds and adds pipeline stages (waves) to a CodePipeline.
9
+ *
10
+ * Each stage is resolved from high-level configuration (plugin names)
11
+ * into CDK CodeBuild steps via PluginLookup, then added as a wave.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const stageBuilder = new StageBuilder({
16
+ * scope: this,
17
+ * pluginLookup,
18
+ * uniqueId,
19
+ * globalMetadata: mergedMetadata,
20
+ * });
21
+ * stageBuilder.addStage(pipeline, {
22
+ * stageName: 'Integration Tests',
23
+ * alias: 'integration',
24
+ * steps: [
25
+ * { plugin: { name: 'jest-integration' } },
26
+ * { plugin: { name: 'e2e-tests', alias: 'cypress' } },
27
+ * ],
28
+ * });
29
+ * ```
30
+ */
31
+ class StageBuilder {
32
+ scope;
33
+ pluginLookup;
34
+ uniqueId;
35
+ globalMetadata;
36
+ defaultComputeType;
37
+ artifactManager;
38
+ orgId;
39
+ constructor(props) {
40
+ this.scope = props.scope;
41
+ this.pluginLookup = props.pluginLookup;
42
+ this.uniqueId = props.uniqueId;
43
+ this.globalMetadata = props.globalMetadata;
44
+ this.defaultComputeType = props.defaultComputeType;
45
+ this.artifactManager = props.artifactManager;
46
+ this.orgId = props.orgId;
47
+ }
48
+ /**
49
+ * Resolves a stage's plugin-based step configs into CodeBuild steps
50
+ * and adds them as a wave to the pipeline.
51
+ */
52
+ addStage(pipeline, stage) {
53
+ const stageAlias = stage.alias ?? `${stage.stageName}-alias`;
54
+ const preSteps = stage.steps
55
+ .filter(s => (s.position ?? 'pre') === 'pre')
56
+ .map(s => this.resolveStep(s, stage.stageName, stageAlias));
57
+ const postSteps = stage.steps
58
+ .filter(s => s.position === 'post')
59
+ .map(s => this.resolveStep(s, stage.stageName, stageAlias));
60
+ pipeline.addWave(stageAlias, {
61
+ ...(preSteps.length > 0 && { pre: preSteps }),
62
+ ...(postSteps.length > 0 && { post: postSteps }),
63
+ });
64
+ }
65
+ resolveStep(stepConfig, stageName, stageAlias) {
66
+ const plugin = this.pluginLookup.plugin(stepConfig.plugin);
67
+ const stepMetadata = (0, pipeline_helpers_1.merge)(this.globalMetadata, stepConfig.metadata ?? {});
68
+ const pluginAlias = stepConfig.plugin.alias ?? stepConfig.plugin.name;
69
+ if (stepConfig.inputArtifact && !this.artifactManager) {
70
+ throw new Error(`Step "${pluginAlias}" requires inputArtifact but no artifactManager is configured.`);
71
+ }
72
+ if (stepConfig.additionalInputArtifacts?.length && !this.artifactManager) {
73
+ throw new Error(`Step "${pluginAlias}" requires additionalInputArtifacts but no artifactManager is configured.`);
74
+ }
75
+ const input = stepConfig.inputArtifact && this.artifactManager
76
+ ? this.artifactManager.getOutput(stepConfig.inputArtifact)
77
+ : undefined;
78
+ const additionalInputs = stepConfig.additionalInputArtifacts?.length && this.artifactManager
79
+ ? Object.fromEntries(stepConfig.additionalInputArtifacts.map(({ artifact, directory }) => [
80
+ directory || artifact.outputDirectory,
81
+ this.artifactManager.getOutput(artifact),
82
+ ]))
83
+ : undefined;
84
+ return (0, pipeline_helpers_1.createCodeBuildStep)({
85
+ id: this.uniqueId.generate(`stage:${stageAlias}:${pluginAlias}`),
86
+ uniqueId: this.uniqueId,
87
+ plugin,
88
+ metadata: stepMetadata,
89
+ network: stepConfig.network,
90
+ scope: this.scope,
91
+ defaultComputeType: this.defaultComputeType,
92
+ input,
93
+ additionalInputs,
94
+ artifactManager: this.artifactManager,
95
+ stageName,
96
+ stageAlias,
97
+ pluginAlias,
98
+ preInstallCommands: stepConfig.preInstallCommands,
99
+ postInstallCommands: stepConfig.postInstallCommands,
100
+ preCommands: stepConfig.preCommands,
101
+ postCommands: stepConfig.postCommands,
102
+ env: stepConfig.env,
103
+ timeout: stepConfig.timeout ?? plugin.timeout ?? undefined,
104
+ failureBehavior: (stepConfig.failureBehavior ?? plugin.failureBehavior),
105
+ orgId: this.orgId,
106
+ });
107
+ }
108
+ /**
109
+ * Resolves and adds multiple stages as waves to the pipeline, in order.
110
+ */
111
+ addStages(pipeline, stages) {
112
+ for (const stage of stages) {
113
+ this.addStage(pipeline, stage);
114
+ }
115
+ }
116
+ }
117
+ exports.StageBuilder = StageBuilder;
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9zdGFnZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUFTdEMsK0RBQXNFO0FBNkJ0RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFhLFlBQVk7SUFDTixLQUFLLENBQVk7SUFDakIsWUFBWSxDQUFlO0lBQzNCLFFBQVEsQ0FBVztJQUNuQixjQUFjLENBQWU7SUFDN0Isa0JBQWtCLENBQWtCO0lBQ3BDLGVBQWUsQ0FBbUI7SUFDbEMsS0FBSyxDQUFVO0lBRWhDLFlBQVksS0FBd0I7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLFFBQXNCLEVBQUUsS0FBbUI7UUFDbEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLFFBQVEsQ0FBQztRQUU3RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSzthQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUks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RSxJQUFJLENBQUMsa0JBQWtCO1lBQzNDLEtBQUs7WUFDTCxnQkFBZ0I7WUFDaEIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLFNBQVM7WUFDVCxVQUFVO1lBQ1YsV0FBVztZQUNYLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxrQkFBa0I7WUFDakQsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLG1CQUFtQjtZQUNuRCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7WUFDbkMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZO1lBQ3JDLEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRztZQUNuQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLFNBQVM7WUFDMUQsZUFBZSxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUErQjtZQUNyRyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLFFBQXNCLEVBQUUsTUFBc0I7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBckdELG9DQXFHQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IENvbXB1dGVUeXBlIGFzIENka0NvbXB1dGVUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBDb2RlUGlwZWxpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBQbHVnaW5Mb29rdXAgfSBmcm9tICcuL3BsdWdpbi1sb29rdXAnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU9wdGlvbnMgfSBmcm9tICcuL3N0ZXAtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBcnRpZmFjdE1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL2FydGlmYWN0LW1hbmFnZXInO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyBjcmVhdGVDb2RlQnVpbGRTdGVwLCBtZXJnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIFN0YWdlQnVpbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlQnVpbGRlclByb3BzIHtcbiAgLyoqIENESyBjb25zdHJ1Y3Qgc2NvcGUgZm9yIGNyZWF0aW5nIGNoaWxkIGNvbnN0cnVjdHMgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKiogUGx1Z2luIGxvb2t1cCBzZXJ2aWNlIGZvciByZXNvbHZpbmcgcGx1Z2luIHJlZmVyZW5jZXMgdG8gQ0RLIGNvbnN0cnVjdHMgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTG9va3VwOiBQbHVnaW5Mb29rdXA7XG5cbiAgLyoqIFVuaXF1ZSBJRCBnZW5lcmF0b3IgZm9yIGNyZWF0aW5nIGRldGVybWluaXN0aWMgY29uc3RydWN0IElEcyAqL1xuICByZWFkb25seSB1bmlxdWVJZDogVW5pcXVlSWQ7XG5cbiAgLyoqIEdsb2JhbCBtZXRhZGF0YSBpbmhlcml0ZWQgYnkgYWxsIHN0YWdlIHN0ZXBzICovXG4gIHJlYWRvbmx5IGdsb2JhbE1ldGFkYXRhOiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqIERlZmF1bHQgQ29kZUJ1aWxkIGNvbXB1dGUgdHlwZSBmb3Igc3RlcHMgdGhhdCBkb24ndCBzcGVjaWZ5IG9uZSAqL1xuICByZWFkb25seSBkZWZhdWx0Q29tcHV0ZVR5cGU/OiBDZGtDb21wdXRlVHlwZTtcblxuICAvKiogQXJ0aWZhY3QgbWFuYWdlciBmb3IgcmVzb2x2aW5nIGlucHV0IGFydGlmYWN0IGtleXMgdG8gRmlsZVNldHMgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RNYW5hZ2VyPzogQXJ0aWZhY3RNYW5hZ2VyO1xuXG4gIC8qKiBUZW5hbnQgaWRlbnRpZmllciBmb3IgcmVzb2x2aW5nIHBlci1vcmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKi9cbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIGFuZCBhZGRzIHBpcGVsaW5lIHN0YWdlcyAod2F2ZXMpIHRvIGEgQ29kZVBpcGVsaW5lLlxuICpcbiAqIEVhY2ggc3RhZ2UgaXMgcmVzb2x2ZWQgZnJvbSBoaWdoLWxldmVsIGNvbmZpZ3VyYXRpb24gKHBsdWdpbiBuYW1lcylcbiAqIGludG8gQ0RLIENvZGVCdWlsZCBzdGVwcyB2aWEgUGx1Z2luTG9va3VwLCB0aGVuIGFkZGVkIGFzIGEgd2F2ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3RhZ2VCdWlsZGVyID0gbmV3IFN0YWdlQnVpbGRlcih7XG4gKiAgIHNjb3BlOiB0aGlzLFxuICogICBwbHVnaW5Mb29rdXAsXG4gKiAgIHVuaXF1ZUlkLFxuICogICBnbG9iYWxNZXRhZGF0YTogbWVyZ2VkTWV0YWRhdGEsXG4gKiB9KTtcbiAqIHN0YWdlQnVpbGRlci5hZGRTdGFnZShwaXBlbGluZSwge1xuICogICBzdGFnZU5hbWU6ICdJbnRlZ3JhdGlvbiBUZXN0cycsXG4gKiAgIGFsaWFzOiAnaW50ZWdyYXRpb24nLFxuICogICBzdGVwczogW1xuICogICAgIHsgcGx1Z2luOiB7IG5hbWU6ICdqZXN0LWludGVncmF0aW9uJyB9IH0sXG4gKiAgICAgeyBwbHVnaW46IHsgbmFtZTogJ2UyZS10ZXN0cycsIGFsaWFzOiAnY3lwcmVzcycgfSB9LFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWdlQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Mb29rdXA6IFBsdWdpbkxvb2t1cDtcbiAgcHJpdmF0ZSByZWFkb25seSB1bmlxdWVJZDogVW5pcXVlSWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsTWV0YWRhdGE6IE1ldGFEYXRhVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0Q29tcHV0ZVR5cGU/OiBDZGtDb21wdXRlVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcnRpZmFjdE1hbmFnZXI/OiBBcnRpZmFjdE1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN0YWdlQnVpbGRlclByb3BzKSB7XG4gICAgdGhpcy5zY29wZSA9IHByb3BzLnNjb3BlO1xuICAgIHRoaXMucGx1Z2luTG9va3VwID0gcHJvcHMucGx1Z2luTG9va3VwO1xuICAgIHRoaXMudW5pcXVlSWQgPSBwcm9wcy51bmlxdWVJZDtcbiAgICB0aGlzLmdsb2JhbE1ldGFkYXRhID0gcHJvcHMuZ2xvYmFsTWV0YWRhdGE7XG4gICAgdGhpcy5kZWZhdWx0Q29tcHV0ZVR5cGUgPSBwcm9wcy5kZWZhdWx0Q29tcHV0ZVR5cGU7XG4gICAgdGhpcy5hcnRpZmFjdE1hbmFnZXIgPSBwcm9wcy5hcnRpZmFjdE1hbmFnZXI7XG4gICAgdGhpcy5vcmdJZCA9IHByb3BzLm9yZ0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgc3RhZ2UncyBwbHVnaW4tYmFzZWQgc3RlcCBjb25maWdzIGludG8gQ29kZUJ1aWxkIHN0ZXBzXG4gICAqIGFuZCBhZGRzIHRoZW0gYXMgYSB3YXZlIHRvIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIGFkZFN0YWdlKHBpcGVsaW5lOiBDb2RlUGlwZWxpbmUsIHN0YWdlOiBTdGFnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZUFsaWFzID0gc3RhZ2UuYWxpYXMgPz8gYCR7c3RhZ2Uuc3RhZ2VOYW1lfS1hbGlhc2A7XG5cbiAgICBjb25zdCBwcmVTdGVwcyA9IHN0YWdlLnN0ZXBzXG4gICAgICAuZmlsdGVyKHMgPT4gKHMucG9zaXRpb24gPz8gJ3ByZScpID09PSAncHJlJylcbiAgICAgIC5tYXAocyA9PiB0aGlzLnJlc29sdmVTdGVwKHMsIHN0YWdlLnN0YWdlTmFtZSwgc3RhZ2VBbGlhcykpO1xuICAgIGNvbnN0IHBvc3RTdGVwcyA9IHN0YWdlLnN0ZXBzXG4gICAgICAuZmlsdGVyKHMgPT4gcy5wb3NpdGlvbiA9PT0gJ3Bvc3QnKVxuICAgICAgLm1hcChzID0+IHRoaXMucmVzb2x2ZVN0ZXAocywgc3RhZ2Uuc3RhZ2VOYW1lLCBzdGFnZUFsaWFzKSk7XG5cbiAgICBwaXBlbGluZS5hZGRXYXZlKHN0YWdlQWxpYXMsIHtcbiAgICAgIC4uLihwcmVTdGVwcy5sZW5ndGggPiAwICYmIHsgcHJlOiBwcmVTdGVwcyB9KSxcbiAgICAgIC4uLihwb3N0U3RlcHMubGVuZ3RoID4gMCAmJiB7IHBvc3Q6IHBvc3RTdGVwcyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0ZXAoc3RlcENvbmZpZzogU3RhZ2VPcHRpb25zWydzdGVwcyddW251bWJlcl0sIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUFsaWFzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBsdWdpbkxvb2t1cC5wbHVnaW4oc3RlcENvbmZpZy5wbHVnaW4pO1xuICAgIGNvbnN0IHN0ZXBNZXRhZGF0YSA9IG1lcmdlKHRoaXMuZ2xvYmFsTWV0YWRhdGEsIHN0ZXBDb25maWcubWV0YWRhdGEgPz8ge30pO1xuICAgIGNvbnN0IHBsdWdpbkFsaWFzID0gc3RlcENvbmZpZy5wbHVnaW4uYWxpYXMgPz8gc3RlcENvbmZpZy5wbHVnaW4ubmFtZTtcblxuICAgIGlmIChzdGVwQ29uZmlnLmlucHV0QXJ0aWZhY3QgJiYgIXRoaXMuYXJ0aWZhY3RNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTdGVwIFwiJHtwbHVnaW5BbGlhc31cIiByZXF1aXJlcyBpbnB1dEFydGlmYWN0IGJ1dCBubyBhcnRpZmFjdE1hbmFnZXIgaXMgY29uZmlndXJlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0ZXBDb25maWcuYWRkaXRpb25hbElucHV0QXJ0aWZhY3RzPy5sZW5ndGggJiYgIXRoaXMuYXJ0aWZhY3RNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTdGVwIFwiJHtwbHVnaW5BbGlhc31cIiByZXF1aXJlcyBhZGRpdGlvbmFsSW5wdXRBcnRpZmFjdHMgYnV0IG5vIGFydGlmYWN0TWFuYWdlciBpcyBjb25maWd1cmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gc3RlcENvbmZpZy5pbnB1dEFydGlmYWN0ICYmIHRoaXMuYXJ0aWZhY3RNYW5hZ2VyXG4gICAgICA/IHRoaXMuYXJ0aWZhY3RNYW5hZ2VyLmdldE91dHB1dChzdGVwQ29uZmlnLmlucHV0QXJ0aWZhY3QpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFkZGl0aW9uYWxJbnB1dHMgPSBzdGVwQ29uZmlnLmFkZGl0aW9uYWxJbnB1dEFydGlmYWN0cz8ubGVuZ3RoICYmIHRoaXMuYXJ0aWZhY3RNYW5hZ2VyXG4gICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgc3RlcENvbmZpZy5hZGRpdGlvbmFsSW5wdXRBcnRpZmFjdHMubWFwKCh7IGFydGlmYWN0LCBkaXJlY3RvcnkgfSkgPT4gW1xuICAgICAgICAgIGRpcmVjdG9yeSB8fCBhcnRpZmFjdC5vdXRwdXREaXJlY3RvcnksXG4gICAgICAgICAgdGhpcy5hcnRpZmFjdE1hbmFnZXIhLmdldE91dHB1dChhcnRpZmFjdCksXG4gICAgICAgIF0pLFxuICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gY3JlYXRlQ29kZUJ1aWxkU3RlcCh7XG4gICAgICBpZDogdGhpcy51bmlxdWVJZC5nZW5lcmF0ZShgc3RhZ2U6JHtzdGFnZUFsaWFzfToke3BsdWdpbkFsaWFzfWApLFxuICAgICAgdW5pcXVlSWQ6IHRoaXMudW5pcXVlSWQsXG4gICAgICBwbHVnaW4sXG4gICAgICBtZXRhZGF0YTogc3RlcE1ldGFkYXRhLFxuICAgICAgbmV0d29yazogc3RlcENvbmZpZy5uZXR3b3JrLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG4gICAgICBkZWZhdWx0Q29tcHV0ZVR5cGU6IHRoaXMuZGVmYXVsdENvbXB1dGVUeXBlLFxuICAgICAgaW5wdXQsXG4gICAgICBhZGRpdGlvbmFsSW5wdXRzLFxuICAgICAgYXJ0aWZhY3RNYW5hZ2VyOiB0aGlzLmFydGlmYWN0TWFuYWdlcixcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHN0YWdlQWxpYXMsXG4gICAgICBwbHVnaW5BbGlhcyxcbiAgICAgIHByZUluc3RhbGxDb21tYW5kczogc3RlcENvbmZpZy5wcmVJbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwb3N0SW5zdGFsbENvbW1hbmRzOiBzdGVwQ29uZmlnLnBvc3RJbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwcmVDb21tYW5kczogc3RlcENvbmZpZy5wcmVDb21tYW5kcyxcbiAgICAgIHBvc3RDb21tYW5kczogc3RlcENvbmZpZy5wb3N0Q29tbWFuZHMsXG4gICAgICBlbnY6IHN0ZXBDb25maWcuZW52LFxuICAgICAgdGltZW91dDogc3RlcENvbmZpZy50aW1lb3V0ID8/IHBsdWdpbi50aW1lb3V0ID8/IHVuZGVmaW5lZCxcbiAgICAgIGZhaWx1cmVCZWhhdmlvcjogKHN0ZXBDb25maWcuZmFpbHVyZUJlaGF2aW9yID8/IHBsdWdpbi5mYWlsdXJlQmVoYXZpb3IpIGFzICdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnLFxuICAgICAgb3JnSWQ6IHRoaXMub3JnSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIGFkZHMgbXVsdGlwbGUgc3RhZ2VzIGFzIHdhdmVzIHRvIHRoZSBwaXBlbGluZSwgaW4gb3JkZXIuXG4gICAqL1xuICBhZGRTdGFnZXMocGlwZWxpbmU6IENvZGVQaXBlbGluZSwgc3RhZ2VzOiBTdGFnZU9wdGlvbnNbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2Ygc3RhZ2VzKSB7XG4gICAgICB0aGlzLmFkZFN0YWdlKHBpcGVsaW5lLCBzdGFnZSk7XG4gICAgfVxuICB9XG59XG4iXX0=