@pipeline-builder/pipeline-core 3.1.1
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/LICENSE +202 -0
- package/README.md +32 -0
- package/lib/config/app-config.d.ts +81 -0
- package/lib/config/app-config.js +151 -0
- package/lib/config/billing-config.d.ts +17 -0
- package/lib/config/billing-config.js +95 -0
- package/lib/config/config-types.d.ts +213 -0
- package/lib/config/config-types.js +5 -0
- package/lib/config/infrastructure-config.d.ts +55 -0
- package/lib/config/infrastructure-config.js +200 -0
- package/lib/config/server-config.d.ts +53 -0
- package/lib/config/server-config.js +180 -0
- package/lib/core/artifact-manager.d.ts +62 -0
- package/lib/core/artifact-manager.js +86 -0
- package/lib/core/id-generator.d.ts +26 -0
- package/lib/core/id-generator.js +44 -0
- package/lib/core/metadata-builder.d.ts +13 -0
- package/lib/core/metadata-builder.js +81 -0
- package/lib/core/network-types.d.ts +200 -0
- package/lib/core/network-types.js +5 -0
- package/lib/core/network.d.ts +20 -0
- package/lib/core/network.js +84 -0
- package/lib/core/pipeline-helpers.d.ts +53 -0
- package/lib/core/pipeline-helpers.js +273 -0
- package/lib/core/pipeline-types.d.ts +136 -0
- package/lib/core/pipeline-types.js +140 -0
- package/lib/core/role-types.d.ts +254 -0
- package/lib/core/role-types.js +5 -0
- package/lib/core/role.d.ts +14 -0
- package/lib/core/role.js +118 -0
- package/lib/core/security-group-types.d.ts +84 -0
- package/lib/core/security-group-types.js +5 -0
- package/lib/core/security-group.d.ts +14 -0
- package/lib/core/security-group.js +34 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +32 -0
- package/lib/handlers/plugin-lookup-handler.js +313 -0
- package/lib/handlers/pnpm-lock.yaml +12 -0
- package/lib/index.d.ts +54 -0
- package/lib/index.js +112 -0
- package/lib/pipeline/pipeline-builder.d.ts +82 -0
- package/lib/pipeline/pipeline-builder.js +292 -0
- package/lib/pipeline/pipeline-configuration.d.ts +72 -0
- package/lib/pipeline/pipeline-configuration.js +196 -0
- package/lib/pipeline/plugin-lookup.d.ts +100 -0
- package/lib/pipeline/plugin-lookup.js +247 -0
- package/lib/pipeline/source-builder.d.ts +47 -0
- package/lib/pipeline/source-builder.js +111 -0
- package/lib/pipeline/source-types.d.ts +191 -0
- package/lib/pipeline/source-types.js +5 -0
- package/lib/pipeline/stage-builder.d.ts +71 -0
- package/lib/pipeline/stage-builder.js +118 -0
- package/lib/pipeline/step-types.d.ts +307 -0
- package/lib/pipeline/step-types.js +5 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmUvc291cmNlLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0Qyw2Q0FBMEM7QUFDMUMsK0RBQXdEO0FBQ3hELG1GQUFtRztBQUNuRywrQ0FBNEM7QUFDNUMscURBQTJEO0FBSTNELCtEQUF3RDtBQUN4RCwyREFBc0U7QUFFdEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBYSxhQUFhO0lBRUw7SUFDQTtJQUZuQixZQUNtQixLQUFnQixFQUNoQixNQUE2QjtRQUQ3QixVQUFLLEdBQUwsS0FBSyxDQUFXO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQXVCO0lBQzdDLENBQUM7SUFFSjs7T0FFRztJQUNILE1BQU0sQ0FBQyxFQUFZO1FBQ2pCLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsS0FBSyxJQUFJO2dCQUNQLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNuQyxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNyQyxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixNQUFNLFdBQVcsR0FBVSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNkIsV0FBMEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLEVBQVk7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUzQyxNQUFNLE1BQU0sR0FBRyxlQUFNLENBQUMsY0FBYyxDQUNsQyxJQUFJLENBQUMsS0FBSyxFQUNWLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQzVCLE9BQU8sQ0FBQyxVQUFVLENBQ25CLENBQUM7UUFFRixJQUFJLE9BQWtCLENBQUM7UUFDdkIsUUFBUSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsS0FBSyw0QkFBVyxDQUFDLElBQUk7Z0JBQUUsT0FBTyxHQUFHLG9DQUFTLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU07WUFDekQsS0FBSyw0QkFBVyxDQUFDLFFBQVE7Z0JBQUUsT0FBTyxHQUFHLG9DQUFTLENBQUMsSUFBSSxDQUFDO2dCQUFDLE1BQU07WUFDM0QsT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLG9DQUFTLENBQUMsSUFBSSxDQUFDO1FBQ3BDLENBQUM7UUFFRCxPQUFPLDhCQUFrQixDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUUvQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSztZQUNsQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyx5QkFBVyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDbEcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE9BQU8sOEJBQWtCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM3RCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyw0QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsd0NBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHdDQUFhLENBQUMsSUFBSTtZQUN2RixjQUFjO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CO1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUVqRCxPQUFPLDhCQUFrQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDakUsYUFBYSxFQUFFLElBQUEsK0JBQVksRUFBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ2xELGFBQWEsRUFBRSxPQUFPLENBQUMsT0FBTyxLQUFLLDRCQUFXLENBQUMsSUFBSTtZQUNuRCxvQkFBb0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQixDQUFDLEVBQVk7UUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRW5ELE1BQU0sVUFBVSxHQUFHLDJCQUFVLENBQUMsa0JBQWtCLENBQzlDLElBQUksQ0FBQyxLQUFLLEVBQ1YsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDMUIsT0FBTyxDQUFDLGNBQWMsQ0FDdkIsQ0FBQztRQUVGLE9BQU8sOEJBQWtCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRTtZQUN6RSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyw0QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsNENBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyw0Q0FBaUIsQ0FBQyxJQUFJO1NBQ2xHLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdGRCxzQ0E2RkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVjb21taXQnO1xuaW1wb3J0IHsgQ29kZUNvbW1pdFRyaWdnZXIsIEdpdEh1YlRyaWdnZXIsIFMzVHJpZ2dlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9ucyc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyB1bndyYXBTZWNyZXQgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLWhlbHBlcnMnO1xuaW1wb3J0IHsgVHJpZ2dlclR5cGUsIHR5cGUgU291cmNlVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMnO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIENvZGVQaXBlbGluZVNvdXJjZSBiYXNlZCBvbiB0aGUgcGlwZWxpbmUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBTdXBwb3J0cyBTMywgR2l0SHViLCBDb2RlU3RhciBjb25uZWN0aW9uLCBhbmQgQ29kZUNvbW1pdCBzb3VyY2VzLlxuICpcbiAqICoqTm90ZSBvbiBTQ0hFRFVMRSB0cmlnZ2VyczoqKiBTY2hlZHVsZWQgcGlwZWxpbmVzIHJlcXVpcmUgYW4gRXZlbnRCcmlkZ2UgcnVsZVxuICogdGhhdCBzdGFydHMgdGhlIHBpcGVsaW5lIG9uIGEgY3JvbiBzY2hlZHVsZS4gVGhlIHNvdXJjZSB0cmlnZ2VyIGlzIHNldCB0byBOT05FXG4gKiAobm8gcG9sbGluZy93ZWJob29rKS4gVGhlIEV2ZW50QnJpZGdlIHJ1bGUgbXVzdCBiZSBjcmVhdGVkIHNlcGFyYXRlbHkgYXMgYVxuICogcGlwZWxpbmUtbGV2ZWwgY29uc3RydWN0LCBub3QgYXQgdGhlIHNvdXJjZSBsZXZlbC4gVGhlIGBzY2hlZHVsZWAgZmllbGQgb25cbiAqIHNvdXJjZSBvcHRpb25zIGNhcHR1cmVzIHRoZSBjcm9uIGV4cHJlc3Npb24gZm9yIEFQSS9mcm9udGVuZCB1c2UsIGJ1dCB0aGVcbiAqIGFjdHVhbCBFdmVudEJyaWRnZSBydWxlIGNyZWF0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gdGhpcyBidWlsZGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzb3VyY2VCdWlsZGVyID0gbmV3IFNvdXJjZUJ1aWxkZXIodGhpcywgY29uZmlnKTtcbiAqIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUJ1aWxkZXIuY3JlYXRlKHVuaXF1ZUlkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU291cmNlQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUGlwZWxpbmVDb25maWd1cmF0aW9uLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIENvZGVQaXBlbGluZVNvdXJjZSBiYXNlZCBvbiBzb3VyY2UgdHlwZVxuICAgKi9cbiAgY3JlYXRlKGlkOiBVbmlxdWVJZCk6IENvZGVQaXBlbGluZVNvdXJjZSB7XG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZy5zb3VyY2UudHlwZSkge1xuICAgICAgY2FzZSAnczMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTM1NvdXJjZShpZCk7XG4gICAgICBjYXNlICdnaXRodWInOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVHaXRIdWJTb3VyY2UoKTtcbiAgICAgIGNhc2UgJ2NvZGVzdGFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29kZVN0YXJTb3VyY2UoKTtcbiAgICAgIGNhc2UgJ2NvZGVjb21taXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDb2RlQ29tbWl0U291cmNlKGlkKTtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gdGhpcy5jb25maWcuc291cmNlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNvdXJjZSB0eXBlOiAkeyhfZXhoYXVzdGl2ZSBhcyBTb3VyY2VUeXBlKS50eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIFMzIHNvdXJjZSBmb3IgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVMzU291cmNlKGlkOiBVbmlxdWVJZCk6IENvZGVQaXBlbGluZVNvdXJjZSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLmdldFMzT3B0aW9ucygpO1xuXG4gICAgY29uc3QgYnVja2V0ID0gQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIGlkLmdlbmVyYXRlKCdzb3VyY2U6YnVja2V0JyksXG4gICAgICBvcHRpb25zLmJ1Y2tldE5hbWUsXG4gICAgKTtcblxuICAgIGxldCB0cmlnZ2VyOiBTM1RyaWdnZXI7XG4gICAgc3dpdGNoIChvcHRpb25zLnRyaWdnZXIpIHtcbiAgICAgIGNhc2UgVHJpZ2dlclR5cGUuQVVUTzogdHJpZ2dlciA9IFMzVHJpZ2dlci5FVkVOVFM7IGJyZWFrO1xuICAgICAgY2FzZSBUcmlnZ2VyVHlwZS5TQ0hFRFVMRTogdHJpZ2dlciA9IFMzVHJpZ2dlci5OT05FOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHRyaWdnZXIgPSBTM1RyaWdnZXIuTk9ORTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ29kZVBpcGVsaW5lU291cmNlLnMzKGJ1Y2tldCwgb3B0aW9ucy5vYmplY3RLZXksIHsgdHJpZ2dlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgR2l0SHViIHNvdXJjZSBmb3IgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUdpdEh1YlNvdXJjZSgpOiBDb2RlUGlwZWxpbmVTb3VyY2Uge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRHaXRIdWJPcHRpb25zKCk7XG5cbiAgICBjb25zdCBhdXRoZW50aWNhdGlvbiA9IG9wdGlvbnMudG9rZW5cbiAgICAgID8gKHR5cGVvZiBvcHRpb25zLnRva2VuID09PSAnc3RyaW5nJyA/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9zdGFnZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUFTdEMsK0RBQXNFO0FBNkJ0RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFhLFlBQVk7SUFDTixLQUFLLENBQVk7SUFDakIsWUFBWSxDQUFlO0lBQzNCLFFBQVEsQ0FBVztJQUNuQixjQUFjLENBQWU7SUFDN0Isa0JBQWtCLENBQWtCO0lBQ3BDLGVBQWUsQ0FBbUI7SUFDbEMsS0FBSyxDQUFVO0lBRWhDLFlBQVksS0FBd0I7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLFFBQXNCLEVBQUUsS0FBbUI7UUFDbEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLFFBQVEsQ0FBQztRQUU3RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSzthQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDO2FBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSzthQUMxQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQzthQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDM0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sV0FBVyxDQUFDLFVBQXlDLEVBQUUsU0FBaUIsRUFBRSxVQUFrQjtRQUNsRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsSUFBQSx3QkFBSyxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUV0RSxJQUFJLFVBQVUsQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FDYixTQUFTLFdBQVcsZ0VBQWdFLENBQ3JGLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxXQUFXLDJFQUEyRSxDQUNoRyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWU7WUFDNUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDMUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZTtZQUMxRixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDbEIsVUFBVSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDbkUsU0FBUyxJQUFJLFFBQVEsQ0FBQyxlQUFlO2dCQUNyQyxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO2FBQzFDLENBQUMsQ0FDSDtZQUNELENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxPQUFPLElBQUEsc0NBQW1CLEVBQUM7WUFDekIsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNO1lBQ04sUUFBUSxFQUFFLFlBQVk7WUFDdEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQzNDLEtBQUs7WUFDTCxnQkFBZ0I7WUFDaEIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLFNBQVM7WUFDVCxVQUFVO1lBQ1YsV0FBVztZQUNYLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxrQkFBa0I7WUFDakQsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLG1CQUFtQjtZQUNuRCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7WUFDbkMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZO1lBQ3JDLEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRztZQUNuQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLFNBQVM7WUFDMUQsZUFBZSxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUErQjtZQUNyRyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLFFBQXNCLEVBQUUsTUFBc0I7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBckdELG9DQXFHQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IENvbXB1dGVUeXBlIGFzIENka0NvbXB1dGVUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBDb2RlUGlwZWxpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBQbHVnaW5Mb29rdXAgfSBmcm9tICcuL3BsdWdpbi1sb29rdXAnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU9wdGlvbnMgfSBmcm9tICcuL3N0ZXAtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBcnRpZmFjdE1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL2FydGlmYWN0LW1hbmFnZXInO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyBjcmVhdGVDb2RlQnVpbGRTdGVwLCBtZXJnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIFN0YWdlQnVpbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlQnVpbGRlclByb3BzIHtcbiAgLyoqIENESyBjb25zdHJ1Y3Qgc2NvcGUgZm9yIGNyZWF0aW5nIGNoaWxkIGNvbnN0cnVjdHMgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKiogUGx1Z2luIGxvb2t1cCBzZXJ2aWNlIGZvciByZXNvbHZpbmcgcGx1Z2luIHJlZmVyZW5jZXMgdG8gQ0RLIGNvbnN0cnVjdHMgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTG9va3VwOiBQbHVnaW5Mb29rdXA7XG5cbiAgLyoqIFVuaXF1ZSBJRCBnZW5lcmF0b3IgZm9yIGNyZWF0aW5nIGRldGVybWluaXN0aWMgY29uc3RydWN0IElEcyAqL1xuICByZWFkb25seSB1bmlxdWVJZDogVW5pcXVlSWQ7XG5cbiAgLyoqIEdsb2JhbCBtZXRhZGF0YSBpbmhlcml0ZWQgYnkgYWxsIHN0YWdlIHN0ZXBzICovXG4gIHJlYWRvbmx5IGdsb2JhbE1ldGFkYXRhOiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqIERlZmF1bHQgQ29kZUJ1aWxkIGNvbXB1dGUgdHlwZSBmb3Igc3RlcHMgdGhhdCBkb24ndCBzcGVjaWZ5IG9uZSAqL1xuICByZWFkb25seSBkZWZhdWx0Q29tcHV0ZVR5cGU/OiBDZGtDb21wdXRlVHlwZTtcblxuICAvKiogQXJ0aWZhY3QgbWFuYWdlciBmb3IgcmVzb2x2aW5nIGlucHV0IGFydGlmYWN0IGtleXMgdG8gRmlsZVNldHMgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RNYW5hZ2VyPzogQXJ0aWZhY3RNYW5hZ2VyO1xuXG4gIC8qKiBUZW5hbnQgaWRlbnRpZmllciBmb3IgcmVzb2x2aW5nIHBlci1vcmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKi9cbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIGFuZCBhZGRzIHBpcGVsaW5lIHN0YWdlcyAod2F2ZXMpIHRvIGEgQ29kZVBpcGVsaW5lLlxuICpcbiAqIEVhY2ggc3RhZ2UgaXMgcmVzb2x2ZWQgZnJvbSBoaWdoLWxldmVsIGNvbmZpZ3VyYXRpb24gKHBsdWdpbiBuYW1lcylcbiAqIGludG8gQ0RLIENvZGVCdWlsZCBzdGVwcyB2aWEgUGx1Z2luTG9va3VwLCB0aGVuIGFkZGVkIGFzIGEgd2F2ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3RhZ2VCdWlsZGVyID0gbmV3IFN0YWdlQnVpbGRlcih7XG4gKiAgIHNjb3BlOiB0aGlzLFxuICogICBwbHVnaW5Mb29rdXAsXG4gKiAgIHVuaXF1ZUlkLFxuICogICBnbG9iYWxNZXRhZGF0YTogbWVyZ2VkTWV0YWRhdGEsXG4gKiB9KTtcbiAqIHN0YWdlQnVpbGRlci5hZGRTdGFnZShwaXBlbGluZSwge1xuICogICBzdGFnZU5hbWU6ICdJbnRlZ3JhdGlvbiBUZXN0cycsXG4gKiAgIGFsaWFzOiAnaW50ZWdyYXRpb24nLFxuICogICBzdGVwczogW1xuICogICAgIHsgcGx1Z2luOiB7IG5hbWU6ICdqZXN0LWludGVncmF0aW9uJyB9IH0sXG4gKiAgICAgeyBwbHVnaW46IHsgbmFtZTogJ2UyZS10ZXN0cycsIGFsaWFzOiAnY3lwcmVzcycgfSB9LFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWdlQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Mb29rdXA6IFBsdWdpbkxvb2t1cDtcbiAgcHJpdmF0ZSByZWFkb25seSB1bmlxdWVJZDogVW5pcXVlSWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsTWV0YWRhdGE6IE1ldGFEYXRhVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0Q29tcHV0ZVR5cGU/OiBDZGtDb21wdXRlVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcnRpZmFjdE1hbmFnZXI/OiBBcnRpZmFjdE1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN0YWdlQnVpbGRlclByb3BzKSB7XG4gICAgdGhpcy5zY29wZSA9IHByb3BzLnNjb3BlO1xuICAgIHRoaXMucGx1Z2luTG9va3VwID0gcHJvcHMucGx1Z2luTG9va3VwO1xuICAgIHRoaXMudW5pcXVlSWQgPSBwcm9wcy51bmlxdWVJZDtcbiAgICB0aGlzLmdsb2JhbE1ldGFkYXRhID0gcHJvcHMuZ2xvYmFsTWV0YWRhdGE7XG4gICAgdGhpcy5kZWZhdWx0Q29tcHV0ZVR5cGUgPSBwcm9wcy5kZWZhdWx0Q29tcHV0ZVR5cGU7XG4gICAgdGhpcy5hcnRpZmFjdE1hbmFnZXIgPSBwcm9wcy5hcnRpZmFjdE1hbmFnZXI7XG4gICAgdGhpcy5vcmdJZCA9IHByb3BzLm9yZ0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgc3RhZ2UncyBwbHVnaW4tYmFzZWQgc3RlcCBjb25maWdzIGludG8gQ29kZUJ1aWxkIHN0ZXBzXG4gICAqIGFuZCBhZGRzIHRoZW0gYXMgYSB3YXZlIHRvIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIGFkZFN0YWdlKHBpcGVsaW5lOiBDb2RlUGlwZWxpbmUsIHN0YWdlOiBTdGFnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnZUFsaWFzID0gc3RhZ2UuYWxpYXMgPz8gYCR7c3RhZ2Uuc3RhZ2VOYW1lfS1hbGlhc2A7XG5cbiAgICBjb25zdCBwcmVTdGVwcyA9IHN0YWdlLnN0ZXBzXG4gICAgICAuZmlsdGVyKHMgPT4gKHMucG9zaXRpb24gPz8gJ3ByZScpID09PSAncHJlJylcbiAgICAgIC5tYXAocyA9PiB0aGlzLnJlc29sdmVTdGVwKHMsIHN0YWdlLnN0YWdlTmFtZSwgc3RhZ2VBbGlhcykpO1xuICAgIGNvbnN0IHBvc3RTdGVwcyA9IHN0YWdlLnN0ZXBzXG4gICAgICAuZmlsdGVyKHMgPT4gcy5wb3NpdGlvbiA9PT0gJ3Bvc3QnKVxuICAgICAgLm1hcChzID0+IHRoaXMucmVzb2x2ZVN0ZXAocywgc3RhZ2Uuc3RhZ2VOYW1lLCBzdGFnZUFsaWFzKSk7XG5cbiAgICBwaXBlbGluZS5hZGRXYXZlKHN0YWdlQWxpYXMsIHtcbiAgICAgIC4uLihwcmVTdGVwcy5sZW5ndGggPiAwICYmIHsgcHJlOiBwcmVTdGVwcyB9KSxcbiAgICAgIC4uLihwb3N0U3RlcHMubGVuZ3RoID4gMCAmJiB7IHBvc3Q6IHBvc3RTdGVwcyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0ZXAoc3RlcENvbmZpZzogU3RhZ2VPcHRpb25zWydzdGVwcyddW251bWJlcl0sIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUFsaWFzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwbHVnaW4gPSB0aGlzLnBsdWdpbkxvb2t1cC5wbHVnaW4oc3RlcENvbmZpZy5wbHVnaW4pO1xuICAgIGNvbnN0IHN0ZXBNZXRhZGF0YSA9IG1lcmdlKHRoaXMuZ2xvYmFsTWV0YWRhdGEsIHN0ZXBDb25maWcubWV0YWRhdGEgPz8ge30pO1xuICAgIGNvbnN0IHBsdWdpbkFsaWFzID0gc3RlcENvbmZpZy5wbHVnaW4uYWxpYXMgPz8gc3RlcENvbmZpZy5wbHVnaW4ubmFtZTtcblxuICAgIGlmIChzdGVwQ29uZmlnLmlucHV0QXJ0aWZhY3QgJiYgIXRoaXMuYXJ0aWZhY3RNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTdGVwIFwiJHtwbHVnaW5BbGlhc31cIiByZXF1aXJlcyBpbnB1dEFydGlmYWN0IGJ1dCBubyBhcnRpZmFjdE1hbmFnZXIgaXMgY29uZmlndXJlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0ZXBDb25maWcuYWRkaXRpb25hbElucHV0QXJ0aWZhY3RzPy5sZW5ndGggJiYgIXRoaXMuYXJ0aWZhY3RNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTdGVwIFwiJHtwbHVnaW5BbGlhc31cIiByZXF1aXJlcyBhZGRpdGlvbmFsSW5wdXRBcnRpZmFjdHMgYnV0IG5vIGFydGlmYWN0TWFuYWdlciBpcyBjb25maWd1cmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gc3RlcENvbmZpZy5pbnB1dEFydGlmYWN0ICYmIHRoaXMuYXJ0aWZhY3RNYW5hZ2VyXG4gICAgICA/IHRoaXMuYXJ0aWZhY3RNYW5hZ2VyLmdldE91dHB1dChzdGVwQ29uZmlnLmlucHV0QXJ0aWZhY3QpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFkZGl0aW9uYWxJbnB1dHMgPSBzdGVwQ29uZmlnLmFkZGl0aW9uYWxJbnB1dEFydGlmYWN0cz8ubGVuZ3RoICYmIHRoaXMuYXJ0aWZhY3RNYW5hZ2VyXG4gICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgc3RlcENvbmZpZy5hZGRpdGlvbmFsSW5wdXRBcnRpZmFjdHMubWFwKCh7IGFydGlmYWN0LCBkaXJlY3RvcnkgfSkgPT4gW1xuICAgICAgICAgIGRpcmVjdG9yeSB8fCBhcnRpZmFjdC5vdXRwdXREaXJlY3RvcnksXG4gICAgICAgICAgdGhpcy5hcnRpZmFjdE1hbmFnZXIhLmdldE91dHB1dChhcnRpZmFjdCksXG4gICAgICAgIF0pLFxuICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gY3JlYXRlQ29kZUJ1aWxkU3RlcCh7XG4gICAgICBpZDogdGhpcy51bmlxdWVJZC5nZW5lcmF0ZShgc3RhZ2U6JHtzdGFnZUFsaWFzfToke3BsdWdpbkFsaWFzfWApLFxuICAgICAgdW5pcXVlSWQ6IHRoaXMudW5pcXVlSWQsXG4gICAgICBwbHVnaW4sXG4gICAgICBtZXRhZGF0YTogc3RlcE1ldGFkYXRhLFxuICAgICAgbmV0d29yazogc3RlcENvbmZpZy5uZXR3b3JrLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG4gICAgICBkZWZhdWx0Q29tcHV0ZVR5cGU6IHRoaXMuZGVmYXVsdENvbXB1dGVUeXBlLFxuICAgICAgaW5wdXQsXG4gICAgICBhZGRpdGlvbmFsSW5wdXRzLFxuICAgICAgYXJ0aWZhY3RNYW5hZ2VyOiB0aGlzLmFydGlmYWN0TWFuYWdlcixcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHN0YWdlQWxpYXMsXG4gICAgICBwbHVnaW5BbGlhcyxcbiAgICAgIHByZUluc3RhbGxDb21tYW5kczogc3RlcENvbmZpZy5wcmVJbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwb3N0SW5zdGFsbENvbW1hbmRzOiBzdGVwQ29uZmlnLnBvc3RJbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwcmVDb21tYW5kczogc3RlcENvbmZpZy5wcmVDb21tYW5kcyxcbiAgICAgIHBvc3RDb21tYW5kczogc3RlcENvbmZpZy5wb3N0Q29tbWFuZHMsXG4gICAgICBlbnY6IHN0ZXBDb25maWcuZW52LFxuICAgICAgdGltZW91dDogc3RlcENvbmZpZy50aW1lb3V0ID8/IHBsdWdpbi50aW1lb3V0ID8/IHVuZGVmaW5lZCxcbiAgICAgIGZhaWx1cmVCZWhhdmlvcjogKHN0ZXBDb25maWcuZmFpbHVyZUJlaGF2aW9yID8/IHBsdWdpbi5mYWlsdXJlQmVoYXZpb3IpIGFzICdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnLFxuICAgICAgb3JnSWQ6IHRoaXMub3JnSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIGFkZHMgbXVsdGlwbGUgc3RhZ2VzIGFzIHdhdmVzIHRvIHRoZSBwaXBlbGluZSwgaW4gb3JkZXIuXG4gICAqL1xuICBhZGRTdGFnZXMocGlwZWxpbmU6IENvZGVQaXBlbGluZSwgc3RhZ2VzOiBTdGFnZU9wdGlvbnNbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2Ygc3RhZ2VzKSB7XG4gICAgICB0aGlzLmFkZFN0YWdlKHBpcGVsaW5lLCBzdGFnZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|