@pipeline-builder/pipeline-core 0.0.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 +69 -0
- package/lib/cdk.d.ts +38 -0
- package/lib/cdk.js +44 -0
- package/lib/config/app-config.d.ts +109 -0
- package/lib/config/app-config.js +197 -0
- package/lib/config/aws-config-cdk.d.ts +49 -0
- package/lib/config/aws-config-cdk.js +65 -0
- package/lib/config/billing-config.d.ts +24 -0
- package/lib/config/billing-config.js +497 -0
- package/lib/config/config-types.d.ts +346 -0
- package/lib/config/config-types.js +4 -0
- package/lib/config/entitlements.d.ts +23 -0
- package/lib/config/entitlements.js +46 -0
- package/lib/config/handler-constants.d.ts +10 -0
- package/lib/config/handler-constants.js +39 -0
- package/lib/config/infrastructure-config.d.ts +66 -0
- package/lib/config/infrastructure-config.js +197 -0
- package/lib/config/server-config.d.ts +53 -0
- package/lib/config/server-config.js +175 -0
- package/lib/config/service-client.d.ts +13 -0
- package/lib/config/service-client.js +20 -0
- package/lib/core/artifact-manager.d.ts +62 -0
- package/lib/core/artifact-manager.js +83 -0
- package/lib/core/id-generator.d.ts +50 -0
- package/lib/core/id-generator.js +50 -0
- package/lib/core/metadata-builder.d.ts +48 -0
- package/lib/core/metadata-builder.js +278 -0
- package/lib/core/metadata-helpers.d.ts +31 -0
- package/lib/core/metadata-helpers.js +55 -0
- package/lib/core/network-types.d.ts +200 -0
- package/lib/core/network-types.js +4 -0
- package/lib/core/network.d.ts +33 -0
- package/lib/core/network.js +112 -0
- package/lib/core/pipeline-helpers.d.ts +61 -0
- package/lib/core/pipeline-helpers.js +563 -0
- package/lib/core/pipeline-types.d.ts +118 -0
- package/lib/core/pipeline-types.js +131 -0
- package/lib/core/role-types.d.ts +254 -0
- package/lib/core/role-types.js +4 -0
- package/lib/core/role.d.ts +14 -0
- package/lib/core/role.js +117 -0
- package/lib/core/security-group-types.d.ts +84 -0
- package/lib/core/security-group-types.js +4 -0
- package/lib/core/security-group.d.ts +14 -0
- package/lib/core/security-group.js +33 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +32 -0
- package/lib/handlers/plugin-lookup-handler.js +292 -0
- package/lib/handlers/pnpm-lock.yaml +12 -0
- package/lib/index.d.ts +45 -0
- package/lib/index.js +53 -0
- package/lib/pipeline/pipeline-builder.d.ts +123 -0
- package/lib/pipeline/pipeline-builder.js +476 -0
- package/lib/pipeline/pipeline-configuration.d.ts +81 -0
- package/lib/pipeline/pipeline-configuration.js +214 -0
- package/lib/pipeline/plugin-lookup.d.ts +131 -0
- package/lib/pipeline/plugin-lookup.js +316 -0
- package/lib/pipeline/plugin-spec.d.ts +138 -0
- package/lib/pipeline/plugin-spec.js +4 -0
- package/lib/pipeline/source-builder.d.ts +62 -0
- package/lib/pipeline/source-builder.js +164 -0
- package/lib/pipeline/source-types.d.ts +221 -0
- package/lib/pipeline/source-types.js +4 -0
- package/lib/pipeline/stage-builder.d.ts +78 -0
- package/lib/pipeline/stage-builder.js +129 -0
- package/lib/pipeline/step-types.d.ts +222 -0
- package/lib/pipeline/step-types.js +4 -0
- package/lib/template/evaluator.d.ts +42 -0
- package/lib/template/evaluator.js +164 -0
- package/lib/template/index.d.ts +34 -0
- package/lib/template/index.js +118 -0
- package/lib/template/metrics.d.ts +10 -0
- package/lib/template/metrics.js +43 -0
- package/lib/template/plugin-resolver.d.ts +8 -0
- package/lib/template/plugin-resolver.js +48 -0
- package/lib/template/tokenizer.d.ts +49 -0
- package/lib/template/tokenizer.js +233 -0
- package/lib/template/topo-sort.d.ts +17 -0
- package/lib/template/topo-sort.js +88 -0
- package/lib/template/validate.d.ts +45 -0
- package/lib/template/validate.js +96 -0
- package/lib/template/walker.d.ts +34 -0
- package/lib/template/walker.js +83 -0
- package/package.json +184 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { createLogger } from '@pipeline-builder/api-core';
|
|
4
|
+
import { SecretValue } from 'aws-cdk-lib';
|
|
5
|
+
import { Repository } from 'aws-cdk-lib/aws-codecommit';
|
|
6
|
+
import { CodeCommitTrigger, GitHubTrigger, S3Trigger } from 'aws-cdk-lib/aws-codepipeline-actions';
|
|
7
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
8
|
+
import { CodePipelineSource } from 'aws-cdk-lib/pipelines';
|
|
9
|
+
import { Construct } from 'constructs';
|
|
10
|
+
import { UniqueId } from '../core/id-generator.js';
|
|
11
|
+
import { unwrapSecret } from '../core/pipeline-helpers.js';
|
|
12
|
+
import { TriggerType } from '../core/pipeline-types.js';
|
|
13
|
+
import { resolveTemplates } from '../template/index.js';
|
|
14
|
+
import { hasTemplate } from '../template/tokenizer.js';
|
|
15
|
+
const log = createLogger('source-builder');
|
|
16
|
+
/** A Secrets Manager ARN (`arn:aws:secretsmanager:...`, incl. partition variants). */
|
|
17
|
+
const SECRETS_MANAGER_ARN = /^arn:aws[a-z-]*:secretsmanager:/i;
|
|
18
|
+
/** A `secretsmanager:<secret-name>` shorthand reference. */
|
|
19
|
+
const SECRETS_MANAGER_REF_PREFIX = 'secretsmanager:';
|
|
20
|
+
/**
|
|
21
|
+
* Creates the appropriate CodePipelineSource based on the pipeline configuration.
|
|
22
|
+
*
|
|
23
|
+
* Supports S3, GitHub, CodeStar connection, and CodeCommit sources.
|
|
24
|
+
*
|
|
25
|
+
* **Note on SCHEDULE triggers:** Scheduled pipelines require an EventBridge rule
|
|
26
|
+
* that starts the pipeline on a cron schedule. The source trigger is set to NONE
|
|
27
|
+
* (no polling/webhook). The EventBridge rule must be created separately as a
|
|
28
|
+
* pipeline-level construct, not at the source level. The `schedule` field on
|
|
29
|
+
* source options captures the cron expression for API/frontend use. The actual
|
|
30
|
+
* EventBridge rule creation is implemented in `PipelineBuilder` (the
|
|
31
|
+
* `ScheduleRule` `events.Rule` targeting the pipeline), not at the source level.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const sourceBuilder = new SourceBuilder(this, config);
|
|
36
|
+
* const source = sourceBuilder.create(uniqueId);
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export class SourceBuilder {
|
|
40
|
+
scope;
|
|
41
|
+
config;
|
|
42
|
+
constructor(scope, config) {
|
|
43
|
+
this.scope = scope;
|
|
44
|
+
this.config = config;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates the appropriate CodePipelineSource based on source type
|
|
48
|
+
*/
|
|
49
|
+
create(id) {
|
|
50
|
+
switch (this.config.source.type) {
|
|
51
|
+
case 's3':
|
|
52
|
+
return this.createS3Source(id);
|
|
53
|
+
case 'github':
|
|
54
|
+
return this.createGitHubSource();
|
|
55
|
+
case 'codestar':
|
|
56
|
+
return this.createCodeStarSource();
|
|
57
|
+
case 'codecommit':
|
|
58
|
+
return this.createCodeCommitSource(id);
|
|
59
|
+
default: {
|
|
60
|
+
const _exhaustive = this.config.source;
|
|
61
|
+
throw new Error(`Unsupported source type: ${_exhaustive.type}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates an S3 source for the pipeline
|
|
67
|
+
*/
|
|
68
|
+
createS3Source(id) {
|
|
69
|
+
const options = this.config.getS3Options();
|
|
70
|
+
const bucket = Bucket.fromBucketName(this.scope, id.generate('source:bucket'), options.bucketName);
|
|
71
|
+
const trigger = options.trigger === TriggerType.AUTO ? S3Trigger.EVENTS : S3Trigger.NONE;
|
|
72
|
+
return CodePipelineSource.s3(bucket, options.objectKey, { trigger });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a GitHub source for the pipeline
|
|
76
|
+
*/
|
|
77
|
+
createGitHubSource() {
|
|
78
|
+
const options = this.config.getGitHubOptions();
|
|
79
|
+
return CodePipelineSource.gitHub(options.repo, options.branch, {
|
|
80
|
+
trigger: options.trigger === TriggerType.AUTO ? GitHubTrigger.POLL : GitHubTrigger.NONE,
|
|
81
|
+
authentication: this.resolveGitHubAuthentication(options),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resolve the GitHub authentication token into a {@link SecretValue} without
|
|
86
|
+
* leaking the token value into the synthesized template.
|
|
87
|
+
*
|
|
88
|
+
* - `undefined` token → no authentication (CDK default).
|
|
89
|
+
* - A `SecretValue` → passed through (already a reference, never plaintext).
|
|
90
|
+
* - A Secrets Manager ARN or `secretsmanager:<name>` string → resolved via
|
|
91
|
+
* `SecretValue.secretsManager`, so only the reference lands in the template.
|
|
92
|
+
* - A genuine raw plaintext token → rejected by default (it would be baked as
|
|
93
|
+
* plaintext into CloudFormation/CDK context). Only when
|
|
94
|
+
* `allowPlainTextToken` is explicitly set is it embedded via
|
|
95
|
+
* `SecretValue.unsafePlainText`, and a loud warning is emitted.
|
|
96
|
+
*/
|
|
97
|
+
resolveGitHubAuthentication(options) {
|
|
98
|
+
let token = options.token;
|
|
99
|
+
if (token === undefined)
|
|
100
|
+
return undefined;
|
|
101
|
+
// A SecretValue is already a reference (e.g. Secrets Manager) — never plaintext.
|
|
102
|
+
if (typeof token !== 'string')
|
|
103
|
+
return token;
|
|
104
|
+
// Synth-time templating: resolve `{{ pipeline.* }}` in the token against the
|
|
105
|
+
// pipeline scope (e.g. `secretsmanager:pipeline-builder/{{ pipeline.vars.orgId }}/
|
|
106
|
+
// github-token`) so the secret reference can be parameterized by pipeline vars —
|
|
107
|
+
// the only source field that is templatable. No-op when the token carries no
|
|
108
|
+
// template (a plain ARN, `secretsmanager:` ref, or plaintext resolves to itself).
|
|
109
|
+
if (hasTemplate(token)) {
|
|
110
|
+
const holder = { token };
|
|
111
|
+
const { errors } = resolveTemplates(holder, this.config.getPipelineScope(), (f) => f === 'token', 'pipeline');
|
|
112
|
+
if (errors.length > 0) {
|
|
113
|
+
const e = errors[0];
|
|
114
|
+
throw new Error(`GitHub source token template resolution failed at '${e.field ?? 'token'}': ${e.message}`);
|
|
115
|
+
}
|
|
116
|
+
token = holder.token;
|
|
117
|
+
}
|
|
118
|
+
// A string that names a Secrets Manager secret is resolved to a reference so
|
|
119
|
+
// only the pointer — not the token — is written to the template / CDK context.
|
|
120
|
+
if (SECRETS_MANAGER_ARN.test(token)) {
|
|
121
|
+
return SecretValue.secretsManager(token);
|
|
122
|
+
}
|
|
123
|
+
if (token.toLowerCase().startsWith(SECRETS_MANAGER_REF_PREFIX)) {
|
|
124
|
+
return SecretValue.secretsManager(token.slice(SECRETS_MANAGER_REF_PREFIX.length));
|
|
125
|
+
}
|
|
126
|
+
// Genuine raw plaintext token — this is the exposure. Reject by default and
|
|
127
|
+
// point the caller at a secret reference or a CodeStar connection.
|
|
128
|
+
if (!options.allowPlainTextToken) {
|
|
129
|
+
throw new Error('GitHub source `token` is a raw plaintext value, which would be baked into the ' +
|
|
130
|
+
'synthesized CloudFormation template (and CDK context / stack state). Provide a ' +
|
|
131
|
+
'Secrets Manager reference instead — an `arn:aws:secretsmanager:...` ARN, a ' +
|
|
132
|
+
'`secretsmanager:<secret-name>` string, or a `SecretValue.secretsManager(...)` — or ' +
|
|
133
|
+
'prefer a CodeStar connection (`type: "codestar"`). To intentionally embed the token ' +
|
|
134
|
+
'in plaintext, set `allowPlainTextToken: true`.');
|
|
135
|
+
}
|
|
136
|
+
log.warn('GitHub source `token` is being embedded as PLAINTEXT in the synthesized CloudFormation ' +
|
|
137
|
+
'template because `allowPlainTextToken` is set. Anyone with template, CDK context, or ' +
|
|
138
|
+
'stack state access can read this token. Use a Secrets Manager reference or a CodeStar ' +
|
|
139
|
+
'connection instead.');
|
|
140
|
+
return SecretValue.unsafePlainText(token);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Creates a CodeStar connection source for the pipeline
|
|
144
|
+
*/
|
|
145
|
+
createCodeStarSource() {
|
|
146
|
+
const options = this.config.getCodeStarOptions();
|
|
147
|
+
return CodePipelineSource.connection(options.repo, options.branch, {
|
|
148
|
+
connectionArn: unwrapSecret(options.connectionArn),
|
|
149
|
+
triggerOnPush: options.trigger === TriggerType.AUTO,
|
|
150
|
+
codeBuildCloneOutput: options.codeBuildCloneOutput,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Creates a CodeCommit source for the pipeline
|
|
155
|
+
*/
|
|
156
|
+
createCodeCommitSource(id) {
|
|
157
|
+
const options = this.config.getCodeCommitOptions();
|
|
158
|
+
const repository = Repository.fromRepositoryName(this.scope, id.generate('source:repo'), options.repositoryName);
|
|
159
|
+
return CodePipelineSource.codeCommit(repository, options.branch ?? 'main', {
|
|
160
|
+
trigger: options.trigger === TriggerType.AUTO ? CodeCommitTrigger.EVENTS : CodeCommitTrigger.NONE,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmUvc291cmNlLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNuRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUd2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFM0Msc0ZBQXNGO0FBQ3RGLE1BQU0sbUJBQW1CLEdBQUcsa0NBQWtDLENBQUM7QUFDL0QsNERBQTREO0FBQzVELE1BQU0sMEJBQTBCLEdBQUcsaUJBQWlCLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBRUwsS0FBSztJQUNM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LG9CQUFvQjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFakQsT0FBTyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ2pFLGFBQWEsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNsRCxhQUFhLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyxXQUFXLENBQUMsSUFBSTtZQUNuRCxvQkFBb0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQixDQUFDLEVBQVk7UUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRW5ELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUMsSUFBSSxDQUFDLEtBQUssRUFDVixFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUMxQixPQUFPLENBQUMsY0FBYyxDQUN2QixDQUFDO1FBRUYsT0FBTyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFO1lBQ3pFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSTtTQUNsRyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVjb21taXQnO1xuaW1wb3J0IHsgQ29kZUNvbW1pdFRyaWdnZXIsIEdpdEh1YlRyaWdnZXIsIFMzVHJpZ2dlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9ucyc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBHaXRIdWJPcHRpb25zLCBTb3VyY2VUeXBlIH0gZnJvbSAnLi9zb3VyY2UtdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvci5qcyc7XG5pbXBvcnQgeyB1bndyYXBTZWNyZXQgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLWhlbHBlcnMuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVUZW1wbGF0ZXMgfSBmcm9tICcuLi90ZW1wbGF0ZS9pbmRleC5qcyc7XG5pbXBvcnQgeyBoYXNUZW1wbGF0ZSB9IGZyb20gJy4uL3RlbXBsYXRlL3Rva2VuaXplci5qcyc7XG5cbmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcignc291cmNlLWJ1aWxkZXInKTtcblxuLyoqIEEgU2VjcmV0cyBNYW5hZ2VyIEFSTiAoYGFybjphd3M6c2VjcmV0c21hbmFnZXI6Li4uYCwgaW5jbC4gcGFydGl0aW9uIHZhcmlhbnRzKS4gKi9cbmNvbnN0IFNFQ1JFVFNfTUFOQUdFUl9BUk4gPSAvXmFybjphd3NbYS16LV0qOnNlY3JldHNtYW5hZ2VyOi9pO1xuLyoqIEEgYHNlY3JldHNtYW5hZ2VyOjxzZWNyZXQtbmFtZT5gIHNob3J0aGFuZCByZWZlcmVuY2UuICovXG5jb25zdCBTRUNSRVRTX01BTkFHRVJfUkVGX1BSRUZJWCA9ICdzZWNyZXRzbWFuYWdlcjonO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIENvZGVQaXBlbGluZVNvdXJjZSBiYXNlZCBvbiB0aGUgcGlwZWxpbmUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBTdXBwb3J0cyBTMywgR2l0SHViLCBDb2RlU3RhciBjb25uZWN0aW9uLCBhbmQgQ29kZUNvbW1pdCBzb3VyY2VzLlxuICpcbiAqICoqTm90ZSBvbiBTQ0hFRFVMRSB0cmlnZ2VyczoqKiBTY2hlZHVsZWQgcGlwZWxpbmVzIHJlcXVpcmUgYW4gRXZlbnRCcmlkZ2UgcnVsZVxuICogdGhhdCBzdGFydHMgdGhlIHBpcGVsaW5lIG9uIGEgY3JvbiBzY2hlZHVsZS4gVGhlIHNvdXJjZSB0cmlnZ2VyIGlzIHNldCB0byBOT05FXG4gKiAobm8gcG9sbGluZy93ZWJob29rKS4gVGhlIEV2ZW50QnJpZGdlIHJ1bGUgbXVzdCBiZSBjcmVhdGVkIHNlcGFyYXRlbHkgYXMgYVxuICogcGlwZWxpbmUtbGV2ZWwgY29uc3RydWN0LCBub3QgYXQgdGhlIHNvdXJjZSBsZXZlbC4gVGhlIGBzY2hlZHVsZWAgZmllbGQgb25cbiAqIHNvdXJjZSBvcHRpb25zIGNhcHR1cmVzIHRoZSBjcm9uIGV4cHJlc3Npb24gZm9yIEFQSS9mcm9udGVuZCB1c2UuIFRoZSBhY3R1YWxcbiAqIEV2ZW50QnJpZGdlIHJ1bGUgY3JlYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gYFBpcGVsaW5lQnVpbGRlcmAgKHRoZVxuICogYFNjaGVkdWxlUnVsZWAgYGV2ZW50cy5SdWxlYCB0YXJnZXRpbmcgdGhlIHBpcGVsaW5lKSwgbm90IGF0IHRoZSBzb3VyY2UgbGV2ZWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNvdXJjZUJ1aWxkZXIgPSBuZXcgU291cmNlQnVpbGRlcih0aGlzLCBjb25maWcpO1xuICogY29uc3Qgc291cmNlID0gc291cmNlQnVpbGRlci5jcmVhdGUodW5pcXVlSWQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY29wZTogQ29uc3RydWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBQaXBlbGluZUNvbmZpZ3VyYXRpb24sXG4gICkge31cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUgQ29kZVBpcGVsaW5lU291cmNlIGJhc2VkIG9uIHNvdXJjZSB0eXBlXG4gICAqL1xuICBjcmVhdGUoaWQ6IFVuaXF1ZUlkKTogQ29kZVBpcGVsaW5lU291cmNlIHtcbiAgICBzd2l0Y2ggKHRoaXMuY29uZmlnLnNvdXJjZS50eXBlKSB7XG4gICAgICBjYXNlICdzMyc6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVMzU291cmNlKGlkKTtcbiAgICAgIGNhc2UgJ2dpdGh1Yic6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUdpdEh1YlNvdXJjZSgpO1xuICAgICAgY2FzZSAnY29kZXN0YXInOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDb2RlU3RhclNvdXJjZSgpO1xuICAgICAgY2FzZSAnY29kZWNvbW1pdCc6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvZGVDb21taXRTb3VyY2UoaWQpO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSB0aGlzLmNvbmZpZy5zb3VyY2U7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc291cmNlIHR5cGU6ICR7KF9leGhhdXN0aXZlIGFzIFNvdXJjZVR5cGUpLnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gUzMgc291cmNlIGZvciB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUzNTb3VyY2UoaWQ6IFVuaXF1ZUlkKTogQ29kZVBpcGVsaW5lU291cmNlIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuZ2V0UzNPcHRpb25zKCk7XG5cbiAgICBjb25zdCBidWNrZXQgPSBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICB0aGlzLnNjb3BlLFxuICAgICAgaWQuZ2VuZXJhdGUoJ3NvdXJjZTpidWNrZXQnKSxcbiAgICAgIG9wdGlvbnMuYnVja2V0TmFtZSxcbiAgICApO1xuXG4gICAgY29uc3QgdHJpZ2dlciA9XG4gICAgICBvcHRpb25zLnRyaWdnZXIgPT09IFRyaWdnZXJUeXBlLkFVVE8gPyBTM1RyaWdnZXIuRVZFTlRTIDogUzNUcmlnZ2VyLk5PTkU7XG5cbiAgICByZXR1cm4gQ29kZVBpcGVsaW5lU291cmNlLnMzKGJ1Y2tldCwgb3B0aW9ucy5vYmplY3RLZXksIHsgdHJpZ2dlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgR2l0SHViIHNvdXJjZSBmb3IgdGhlIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUdpdEh1YlNvdXJjZSgpOiBDb2RlUGlwZWxpbmVTb3VyY2Uge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRHaXRIdWJPcHRpb25zKCk7XG5cbiAgICByZXR1cm4gQ29kZVBpcGVsaW5lU291cmNlLmdpdEh1YihvcHRpb25zLnJlcG8sIG9wdGlvbnMuYnJhbmNoLCB7XG4gICAgICB0cmlnZ2VyOiBvcHRpb25zLnRyaWdnZXIgPT09IFRyaWdnZXJUeXBlLkFVVE8gPyBHaXRIdWJUcmlnZ2VyLlBPTEwgOiBHaXRIdWJUcmlnZ2VyLk5PTkUsXG4gICAgICBhdXRoZW50aWNhdGlvbjogdGhpcy5yZXNvbHZlR2l0SHViQXV0aGVudGljYXRpb24ob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHRva2VuIGludG8gYSB7QGxpbmsgU2VjcmV0VmFsdWV9IHdpdGhvdXRcbiAgICogbGVha2luZyB0aGUgdG9rZW4gdmFsdWUgaW50byB0aGUgc3ludGhlc2l6ZWQgdGVtcGxhdGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgdG9rZW4g4oaSIG5vIGF1dGhlbnRpY2F0aW9uIChDREsgZGVmYXVsdCkuXG4gICAqIC0gQSBgU2VjcmV0VmFsdWVgIOKGkiBwYXNzZWQgdGhyb3VnaCAoYWxyZWFkeSBhIHJlZmVyZW5jZSwgbmV2ZXIgcGxhaW50ZXh0KS5cbiAgICogLSBBIFNlY3JldHMgTWFuYWdlciBBUk4gb3IgYHNlY3JldHNtYW5hZ2VyOjxuYW1lPmAgc3RyaW5nIOKGkiByZXNvbHZlZCB2aWFcbiAgICogICBgU2VjcmV0VmFsdWUuc2VjcmV0c01hbmFnZXJgLCBzbyBvbmx5IHRoZSByZWZlcmVuY2UgbGFuZHMgaW4gdGhlIHRlbXBsYXRlLlxuICAgKiAtIEEgZ2VudWluZSByYXcgcGxhaW50ZXh0IHRva2VuIOKGkiByZWplY3RlZCBieSBkZWZhdWx0IChpdCB3b3VsZCBiZSBiYWtlZCBhc1xuICAgKiAgIHBsYWludGV4dCBpbnRvIENsb3VkRm9ybWF0aW9uL0NESyBjb250ZXh0KS4gT25seSB3aGVuXG4gICAqICAgYGFsbG93UGxhaW5UZXh0VG9rZW5gIGlzIGV4cGxpY2l0bHkgc2V0IGlzIGl0IGVtYmVkZGVkIHZpYVxuICAgKiAgIGBTZWNyZXRWYWx1ZS51bnNhZmVQbGFpblRleHRgLCBhbmQgYSBsb3VkIHdhcm5pbmcgaXMgZW1pdHRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUdpdEh1YkF1dGhlbnRpY2F0aW9uKG9wdGlvbnM6IEdpdEh1Yk9wdGlvbnMpOiBTZWNyZXRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHRva2VuID0gb3B0aW9ucy50b2tlbjtcbiAgICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIEEgU2VjcmV0VmFsdWUgaXMgYWxyZWFkeSBhIHJlZmVyZW5jZSAoZS5nLiBTZWNyZXRzIE1hbmFnZXIpIOKAlCBuZXZlciBwbGFpbnRleHQuXG4gICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHJldHVybiB0b2tlbjtcblxuICAgIC8vIFN5bnRoLXRpbWUgdGVtcGxhdGluZzogcmVzb2x2ZSBge3sgcGlwZWxpbmUuKiB9fWAgaW4gdGhlIHRva2VuIGFnYWluc3QgdGhlXG4gICAgLy8gcGlwZWxpbmUgc2NvcGUgKGUuZy4gYHNlY3JldHNtYW5hZ2VyOnBpcGVsaW5lLWJ1aWxkZXIve3sgcGlwZWxpbmUudmFycy5vcmdJZCB9fS9cbiAgICAvLyBnaXRodWItdG9rZW5gKSBzbyB0aGUgc2VjcmV0IHJlZmVyZW5jZSBjYW4gYmUgcGFyYW1ldGVyaXplZCBieSBwaXBlbGluZSB2YXJzIOKAlFxuICAgIC8vIHRoZSBvbmx5IHNvdXJjZSBmaWVsZCB0aGF0IGlzIHRlbXBsYXRhYmxlLiBOby1vcCB3aGVuIHRoZSB0b2tlbiBjYXJyaWVzIG5vXG4gICAgLy8gdGVtcGxhdGUgKGEgcGxhaW4gQVJOLCBgc2VjcmV0c21hbmFnZXI6YCByZWYsIG9yIHBsYWludGV4dCByZXNvbHZlcyB0byBpdHNlbGYpLlxuICAgIGlmIChoYXNUZW1wbGF0ZSh0b2tlbikpIHtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHsgdG9rZW4gfTtcbiAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSByZXNvbHZlVGVtcGxhdGVzKGhvbGRlciwgdGhpcy5jb25maWcuZ2V0UGlwZWxpbmVTY29wZSgpLCAoZikgPT4gZiA9PT0gJ3Rva2VuJywgJ3BpcGVsaW5lJyk7XG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZSA9IGVycm9yc1swXSE7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIHNvdXJjZSB0b2tlbiB0ZW1wbGF0ZSByZXNvbHV0aW9uIGZhaWxlZCBhdCAnJHtlLmZpZWxkID8/ICd0b2tlbid9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICB0b2tlbiA9IGhvbGRlci50b2tlbjtcbiAgICB9XG5cbiAgICAvLyBBIHN0cmluZyB0aGF0IG5hbWVzIGEgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBpcyByZXNvbHZlZCB0byBhIHJlZmVyZW5jZSBzb1xuICAgIC8vIG9ubHkgdGhlIHBvaW50ZXIg4oCUIG5vdCB0aGUgdG9rZW4g4oCUIGlzIHdyaXR0ZW4gdG8gdGhlIHRlbXBsYXRlIC8gQ0RLIGNvbnRleHQuXG4gICAgaWYgKFNFQ1JFVFNfTUFOQUdFUl9BUk4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiBTZWNyZXRWYWx1ZS5zZWNyZXRzTWFuYWdlcih0b2tlbik7XG4gICAgfVxuICAgIGlmICh0b2tlbi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoU0VDUkVUU19NQU5BR0VSX1JFRl9QUkVGSVgpKSB7XG4gICAgICByZXR1cm4gU2VjcmV0VmFsdWUuc2VjcmV0c01hbmFnZXIodG9rZW4uc2xpY2UoU0VDUkVUU19NQU5BR0VSX1JFRl9QUkVGSVgubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLy8gR2VudWluZSByYXcgcGxhaW50ZXh0IHRva2VuIOKAlCB0aGlzIGlzIHRoZSBleHBvc3VyZS4gUmVqZWN0IGJ5IGRlZmF1bHQgYW5kXG4gICAgLy8gcG9pbnQgdGhlIGNhbGxlciBhdCBhIHNlY3JldCByZWZlcmVuY2Ugb3IgYSBDb2RlU3RhciBjb25uZWN0aW9uLlxuICAgIGlmICghb3B0aW9ucy5hbGxvd1BsYWluVGV4dFRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdHaXRIdWIgc291cmNlIGB0b2tlbmAgaXMgYSByYXcgcGxhaW50ZXh0IHZhbHVlLCB3aGljaCB3b3VsZCBiZSBiYWtlZCBpbnRvIHRoZSAnICtcbiAgICAgICAgJ3N5bnRoZXNpemVkIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIChhbmQgQ0RLIGNvbnRleHQgLyBzdGFjayBzdGF0ZSkuIFByb3ZpZGUgYSAnICtcbiAgICAgICAgJ1NlY3JldHMgTWFuYWdlciByZWZlcmVuY2UgaW5zdGVhZCDigJQgYW4gYGFybjphd3M6c2VjcmV0c21hbmFnZXI6Li4uYCBBUk4sIGEgJyArXG4gICAgICAgICdgc2VjcmV0c21hbmFnZXI6PHNlY3JldC1uYW1lPmAgc3RyaW5nLCBvciBhIGBTZWNyZXRWYWx1ZS5zZWNyZXRzTWFuYWdlciguLi4pYCDigJQgb3IgJyArXG4gICAgICAgICdwcmVmZXIgYSBDb2RlU3RhciBjb25uZWN0aW9uIChgdHlwZTogXCJjb2Rlc3RhclwiYCkuIFRvIGludGVudGlvbmFsbHkgZW1iZWQgdGhlIHRva2VuICcgK1xuICAgICAgICAnaW4gcGxhaW50ZXh0LCBzZXQgYGFsbG93UGxhaW5UZXh0VG9rZW46IHRydWVgLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxvZy53YXJuKFxuICAgICAgJ0dpdEh1YiBzb3VyY2UgYHRva2VuYCBpcyBiZWluZyBlbWJlZGRlZCBhcyBQTEFJTlRFWFQgaW4gdGhlIHN5bnRoZXNpemVkIENsb3VkRm9ybWF0aW9uICcgK1xuICAgICAgJ3RlbXBsYXRlIGJlY2F1c2UgYGFsbG93UGxhaW5UZXh0VG9rZW5gIGlzIHNldC4gQW55b25lIHdpdGggdGVtcGxhdGUsIENESyBjb250ZXh0LCBvciAnICtcbiAgICAgICdzdGFjayBzdGF0ZSBhY2Nlc3MgY2FuIHJlYWQgdGhpcyB0b2tlbi4gVXNlIGEgU2VjcmV0cyBNYW5hZ2VyIHJlZmVyZW5jZSBvciBhIENvZGVTdGFyICcgK1xuICAgICAgJ2Nvbm5lY3Rpb24gaW5zdGVhZC4nLFxuICAgICk7XG4gICAgcmV0dXJuIFNlY3JldFZhbHVlLnVuc2FmZVBsYWluVGV4dCh0b2tlbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENvZGVTdGFyIGNvbm5lY3Rpb24gc291cmNlIGZvciB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29kZVN0YXJTb3VyY2UoKTogQ29kZVBpcGVsaW5lU291cmNlIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuZ2V0Q29kZVN0YXJPcHRpb25zKCk7XG5cbiAgICByZXR1cm4gQ29kZVBpcGVsaW5lU291cmNlLmNvbm5lY3Rpb24ob3B0aW9ucy5yZXBvLCBvcHRpb25zLmJyYW5jaCwge1xuICAgICAgY29ubmVjdGlvbkFybjogdW53cmFwU2VjcmV0KG9wdGlvbnMuY29ubmVjdGlvbkFybiksXG4gICAgICB0cmlnZ2VyT25QdXNoOiBvcHRpb25zLnRyaWdnZXIgPT09IFRyaWdnZXJUeXBlLkFVVE8sXG4gICAgICBjb2RlQnVpbGRDbG9uZU91dHB1dDogb3B0aW9ucy5jb2RlQnVpbGRDbG9uZU91dHB1dCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29kZUNvbW1pdCBzb3VyY2UgZm9yIHRoZSBwaXBlbGluZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb2RlQ29tbWl0U291cmNlKGlkOiBVbmlxdWVJZCk6IENvZGVQaXBlbGluZVNvdXJjZSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLmdldENvZGVDb21taXRPcHRpb25zKCk7XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeU5hbWUoXG4gICAgICB0aGlzLnNjb3BlLFxuICAgICAgaWQuZ2VuZXJhdGUoJ3NvdXJjZTpyZXBvJyksXG4gICAgICBvcHRpb25zLnJlcG9zaXRvcnlOYW1lLFxuICAgICk7XG5cbiAgICByZXR1cm4gQ29kZVBpcGVsaW5lU291cmNlLmNvZGVDb21taXQocmVwb3NpdG9yeSwgb3B0aW9ucy5icmFuY2ggPz8gJ21haW4nLCB7XG4gICAgICB0cmlnZ2VyOiBvcHRpb25zLnRyaWdnZXIgPT09IFRyaWdnZXJUeXBlLkFVVE8gPyBDb2RlQ29tbWl0VHJpZ2dlci5FVkVOVFMgOiBDb2RlQ29tbWl0VHJpZ2dlci5OT05FLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import type { SecretValue } from 'aws-cdk-lib';
|
|
2
|
+
import type { TriggerType } from '../core/pipeline-types.js';
|
|
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 authentication token.
|
|
102
|
+
*
|
|
103
|
+
* Prefer a Secrets Manager reference so the token value never lands in the
|
|
104
|
+
* synthesized CloudFormation template / CDK context. Accepted forms:
|
|
105
|
+
* - a `SecretValue` (e.g. `SecretValue.secretsManager(...)`),
|
|
106
|
+
* - a Secrets Manager ARN string (`arn:aws:secretsmanager:...`),
|
|
107
|
+
* - a `secretsmanager:<secret-name>` shorthand string.
|
|
108
|
+
*
|
|
109
|
+
* A genuine raw plaintext token (e.g. a `ghp_...` PAT) is rejected by default,
|
|
110
|
+
* because baking it in would expose it to anyone with template/state access —
|
|
111
|
+
* set {@link allowPlainTextToken} to intentionally embed it.
|
|
112
|
+
*
|
|
113
|
+
* If not provided, uses default GitHub authentication. Consider a CodeStar
|
|
114
|
+
* connection (`type: 'codestar'`) as the modern, credential-free path.
|
|
115
|
+
*/
|
|
116
|
+
readonly token?: SecretValue | string;
|
|
117
|
+
/**
|
|
118
|
+
* Opt-in escape hatch to embed a raw plaintext {@link token} directly in the
|
|
119
|
+
* synthesized template. Insecure — the token becomes readable by anyone with
|
|
120
|
+
* template, CDK context, or stack state access. Leave unset (default) to force
|
|
121
|
+
* a Secrets Manager reference instead.
|
|
122
|
+
* @default false
|
|
123
|
+
*/
|
|
124
|
+
readonly allowPlainTextToken?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Pipeline trigger behavior
|
|
127
|
+
* @default TriggerType.NONE
|
|
128
|
+
*/
|
|
129
|
+
readonly trigger?: TriggerType;
|
|
130
|
+
/**
|
|
131
|
+
* Cron expression for scheduled trigger (e.g., 'cron(0 0 * * ? *)' for daily).
|
|
132
|
+
* Only used when trigger is SCHEDULE.
|
|
133
|
+
*/
|
|
134
|
+
readonly schedule?: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Configuration options for CodeStar connection pipeline source
|
|
138
|
+
*/
|
|
139
|
+
export interface CodeStarOptions {
|
|
140
|
+
/**
|
|
141
|
+
* Repository identifier in the format "owner/repo"
|
|
142
|
+
* @example 'myorg/myrepo'
|
|
143
|
+
*/
|
|
144
|
+
readonly repo: string;
|
|
145
|
+
/**
|
|
146
|
+
* Branch to track
|
|
147
|
+
* @default 'main'
|
|
148
|
+
*/
|
|
149
|
+
readonly branch?: string;
|
|
150
|
+
/**
|
|
151
|
+
* ARN of the CodeStar connection to use
|
|
152
|
+
* Can be a string ARN or SecretValue
|
|
153
|
+
* @example 'arn:aws:codestar-connections:us-east-1:123456789012:connection/abc123'
|
|
154
|
+
*/
|
|
155
|
+
readonly connectionArn: SecretValue | string;
|
|
156
|
+
/**
|
|
157
|
+
* Pipeline trigger behavior
|
|
158
|
+
* @default TriggerType.NONE
|
|
159
|
+
*/
|
|
160
|
+
readonly trigger?: TriggerType;
|
|
161
|
+
/**
|
|
162
|
+
* Cron expression for scheduled trigger (e.g., 'cron(0 0 * * ? *)' for daily).
|
|
163
|
+
* Only used when trigger is SCHEDULE.
|
|
164
|
+
*/
|
|
165
|
+
readonly schedule?: string;
|
|
166
|
+
/**
|
|
167
|
+
* Whether to enable full clone capability in CodeBuild
|
|
168
|
+
* When true, CodeBuild can perform git operations on the full repository
|
|
169
|
+
* @default false
|
|
170
|
+
*/
|
|
171
|
+
readonly codeBuildCloneOutput?: boolean;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* CodeCommit source configuration for CodePipeline
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```typescript
|
|
178
|
+
* const source: CodeCommitSourceConfig = {
|
|
179
|
+
* type: 'codecommit',
|
|
180
|
+
* options: {
|
|
181
|
+
* repositoryName: 'my-repo',
|
|
182
|
+
* branch: 'main',
|
|
183
|
+
* trigger: TriggerType.AUTO
|
|
184
|
+
* }
|
|
185
|
+
* };
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
export interface CodeCommitSourceConfig {
|
|
189
|
+
readonly type: 'codecommit';
|
|
190
|
+
readonly options: CodeCommitOptions;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Configuration options for CodeCommit pipeline source
|
|
194
|
+
*/
|
|
195
|
+
export interface CodeCommitOptions {
|
|
196
|
+
/**
|
|
197
|
+
* Name of the CodeCommit repository
|
|
198
|
+
* @example 'my-repo'
|
|
199
|
+
*/
|
|
200
|
+
readonly repositoryName: string;
|
|
201
|
+
/**
|
|
202
|
+
* Branch to track
|
|
203
|
+
* @default 'main'
|
|
204
|
+
*/
|
|
205
|
+
readonly branch?: string;
|
|
206
|
+
/**
|
|
207
|
+
* Pipeline trigger behavior
|
|
208
|
+
* @default TriggerType.NONE
|
|
209
|
+
*/
|
|
210
|
+
readonly trigger?: TriggerType;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Union type of all supported pipeline source types
|
|
214
|
+
*
|
|
215
|
+
* Supported sources:
|
|
216
|
+
* - S3SourceConfig: Source code from S3 bucket
|
|
217
|
+
* - GitHubSourceConfig: Source code from GitHub repository
|
|
218
|
+
* - CodeStarSourceConfig: Source code via CodeStar connection (GitHub, Bitbucket, GitLab)
|
|
219
|
+
* - CodeCommitSourceConfig: Source code from AWS CodeCommit repository
|
|
220
|
+
*/
|
|
221
|
+
export type SourceType = S3SourceConfig | GitHubSourceConfig | CodeStarSourceConfig | CodeCommitSourceConfig;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
export {};
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL3NvdXJjZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IFRyaWdnZXJUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5cbi8qKlxuICogUzMgc291cmNlIGNvbmZpZ3VyYXRpb24gZm9yIENvZGVQaXBlbGluZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzb3VyY2U6IFMzU291cmNlQ29uZmlnID0ge1xuICogICB0eXBlOiAnczMnLFxuICogICBvcHRpb25zOiB7XG4gKiAgICAgYnVja2V0TmFtZTogJ215LXNvdXJjZS1idWNrZXQnLFxuICogICAgIG9iamVjdEtleTogJ3NvdXJjZS56aXAnLFxuICogICAgIHRyaWdnZXI6IFRyaWdnZXJUeXBlLkFVVE9cbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzU291cmNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgdHlwZTogJ3MzJztcbiAgcmVhZG9ubHkgb3B0aW9uczogUzNPcHRpb25zO1xufVxuXG4vKipcbiAqIEdpdEh1YiBzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgQ29kZVBpcGVsaW5lXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNvdXJjZTogR2l0SHViU291cmNlQ29uZmlnID0ge1xuICogICB0eXBlOiAnZ2l0aHViJyxcbiAqICAgb3B0aW9uczoge1xuICogICAgIHJlcG86ICdvd25lci9yZXBvc2l0b3J5JyxcbiAqICAgICBicmFuY2g6ICdtYWluJyxcbiAqICAgICB0cmlnZ2VyOiBUcmlnZ2VyVHlwZS5BVVRPXG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJTb3VyY2VDb25maWcge1xuICByZWFkb25seSB0eXBlOiAnZ2l0aHViJztcbiAgcmVhZG9ubHkgb3B0aW9uczogR2l0SHViT3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb2RlU3RhciBjb25uZWN0aW9uIHNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBDb2RlUGlwZWxpbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc291cmNlOiBDb2RlU3RhclNvdXJjZUNvbmZpZyA9IHtcbiAqICAgdHlwZTogJ2NvZGVzdGFyJyxcbiAqICAgb3B0aW9uczoge1xuICogICAgIHJlcG86ICdvd25lci9yZXBvc2l0b3J5JyxcbiAqICAgICBicmFuY2g6ICdtYWluJyxcbiAqICAgICBjb25uZWN0aW9uQXJuOiAnYXJuOmF3czpjb2Rlc3Rhci1jb25uZWN0aW9uczouLi4nLFxuICogICAgIHRyaWdnZXI6IFRyaWdnZXJUeXBlLkFVVE9cbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVTdGFyU291cmNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2NvZGVzdGFyJztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ29kZVN0YXJPcHRpb25zO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgUzMgcGlwZWxpbmUgc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIFMzIGJ1Y2tldCBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZVxuICAgKiBAZXhhbXBsZSAnbXktcGlwZWxpbmUtc291cmNlLWJ1Y2tldCdcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT2JqZWN0IGtleSAocGF0aCkgdG8gdGhlIHNvdXJjZSBhcmNoaXZlIHdpdGhpbiB0aGUgYnVja2V0XG4gICAqIEBkZWZhdWx0ICdzb3VyY2UuemlwJ1xuICAgKi9cbiAgcmVhZG9ubHkgb2JqZWN0S2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSB0cmlnZ2VyIGJlaGF2aW9yXG4gICAqIEBkZWZhdWx0IFRyaWdnZXJUeXBlLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHRyaWdnZXI/OiBUcmlnZ2VyVHlwZTtcblxuICAvKipcbiAgICogQ3JvbiBleHByZXNzaW9uIGZvciBzY2hlZHVsZWQgdHJpZ2dlciAoZS5nLiwgJ2Nyb24oMCAwICogKiA/ICopJyBmb3IgZGFpbHkpLlxuICAgKiBPbmx5IHVzZWQgd2hlbiB0cmlnZ2VyIGlzIFNDSEVEVUxFLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBHaXRIdWIgcGlwZWxpbmUgc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBHaXRIdWIgcmVwb3NpdG9yeSBpbiB0aGUgZm9ybWF0IFwib3duZXIvcmVwb1wiXG4gICAqIEBleGFtcGxlICdteW9yZy9teXJlcG8nXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJyYW5jaCB0byB0cmFja1xuICAgKiBAZGVmYXVsdCAnbWFpbidcbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaD86IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIGF1dGhlbnRpY2F0aW9uIHRva2VuLlxuICAgKlxuICAgKiBQcmVmZXIgYSBTZWNyZXRzIE1hbmFnZXIgcmVmZXJlbmNlIHNvIHRoZSB0b2tlbiB2YWx1ZSBuZXZlciBsYW5kcyBpbiB0aGVcbiAgICogc3ludGhlc2l6ZWQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgLyBDREsgY29udGV4dC4gQWNjZXB0ZWQgZm9ybXM6XG4gICAqICAgLSBhIGBTZWNyZXRWYWx1ZWAgKGUuZy4gYFNlY3JldFZhbHVlLnNlY3JldHNNYW5hZ2VyKC4uLilgKSxcbiAgICogICAtIGEgU2VjcmV0cyBNYW5hZ2VyIEFSTiBzdHJpbmcgKGBhcm46YXdzOnNlY3JldHNtYW5hZ2VyOi4uLmApLFxuICAgKiAgIC0gYSBgc2VjcmV0c21hbmFnZXI6PHNlY3JldC1uYW1lPmAgc2hvcnRoYW5kIHN0cmluZy5cbiAgICpcbiAgICogQSBnZW51aW5lIHJhdyBwbGFpbnRleHQgdG9rZW4gKGUuZy4gYSBgZ2hwXy4uLmAgUEFUKSBpcyByZWplY3RlZCBieSBkZWZhdWx0LFxuICAgKiBiZWNhdXNlIGJha2luZyBpdCBpbiB3b3VsZCBleHBvc2UgaXQgdG8gYW55b25lIHdpdGggdGVtcGxhdGUvc3RhdGUgYWNjZXNzIOKAlFxuICAgKiBzZXQge0BsaW5rIGFsbG93UGxhaW5UZXh0VG9rZW59IHRvIGludGVudGlvbmFsbHkgZW1iZWQgaXQuXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdXNlcyBkZWZhdWx0IEdpdEh1YiBhdXRoZW50aWNhdGlvbi4gQ29uc2lkZXIgYSBDb2RlU3RhclxuICAgKiBjb25uZWN0aW9uIChgdHlwZTogJ2NvZGVzdGFyJ2ApIGFzIHRoZSBtb2Rlcm4sIGNyZWRlbnRpYWwtZnJlZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW4/OiBTZWNyZXRWYWx1ZSB8IHN0cmluZztcblxuICAvKipcbiAgICogT3B0LWluIGVzY2FwZSBoYXRjaCB0byBlbWJlZCBhIHJhdyBwbGFpbnRleHQge0BsaW5rIHRva2VufSBkaXJlY3RseSBpbiB0aGVcbiAgICogc3ludGhlc2l6ZWQgdGVtcGxhdGUuIEluc2VjdXJlIOKAlCB0aGUgdG9rZW4gYmVjb21lcyByZWFkYWJsZSBieSBhbnlvbmUgd2l0aFxuICAgKiB0ZW1wbGF0ZSwgQ0RLIGNvbnRleHQsIG9yIHN0YWNrIHN0YXRlIGFjY2Vzcy4gTGVhdmUgdW5zZXQgKGRlZmF1bHQpIHRvIGZvcmNlXG4gICAqIGEgU2VjcmV0cyBNYW5hZ2VyIHJlZmVyZW5jZSBpbnN0ZWFkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dQbGFpblRleHRUb2tlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHRyaWdnZXIgYmVoYXZpb3JcbiAgICogQGRlZmF1bHQgVHJpZ2dlclR5cGUuTk9ORVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBDcm9uIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCB0cmlnZ2VyIChlLmcuLCAnY3JvbigwIDAgKiAqID8gKiknIGZvciBkYWlseSkuXG4gICAqIE9ubHkgdXNlZCB3aGVuIHRyaWdnZXIgaXMgU0NIRURVTEUuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIENvZGVTdGFyIGNvbm5lY3Rpb24gcGlwZWxpbmUgc291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZVN0YXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcG9zaXRvcnkgaWRlbnRpZmllciBpbiB0aGUgZm9ybWF0IFwib3duZXIvcmVwb1wiXG4gICAqIEBleGFtcGxlICdteW9yZy9teXJlcG8nXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJyYW5jaCB0byB0cmFja1xuICAgKiBAZGVmYXVsdCAnbWFpbidcbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaD86IHN0cmluZztcblxuICAvKipcbiAgICogQVJOIG9mIHRoZSBDb2RlU3RhciBjb25uZWN0aW9uIHRvIHVzZVxuICAgKiBDYW4gYmUgYSBzdHJpbmcgQVJOIG9yIFNlY3JldFZhbHVlXG4gICAqIEBleGFtcGxlICdhcm46YXdzOmNvZGVzdGFyLWNvbm5lY3Rpb25zOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Y29ubmVjdGlvbi9hYmMxMjMnXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uQXJuOiBTZWNyZXRWYWx1ZSB8IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgdHJpZ2dlciBiZWhhdmlvclxuICAgKiBAZGVmYXVsdCBUcmlnZ2VyVHlwZS5OT05FXG4gICAqL1xuICByZWFkb25seSB0cmlnZ2VyPzogVHJpZ2dlclR5cGU7XG5cbiAgLyoqXG4gICAqIENyb24gZXhwcmVzc2lvbiBmb3Igc2NoZWR1bGVkIHRyaWdnZXIgKGUuZy4sICdjcm9uKDAgMCAqICogPyAqKScgZm9yIGRhaWx5KS5cbiAgICogT25seSB1c2VkIHdoZW4gdHJpZ2dlciBpcyBTQ0hFRFVMRS5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBmdWxsIGNsb25lIGNhcGFiaWxpdHkgaW4gQ29kZUJ1aWxkXG4gICAqIFdoZW4gdHJ1ZSwgQ29kZUJ1aWxkIGNhbiBwZXJmb3JtIGdpdCBvcGVyYXRpb25zIG9uIHRoZSBmdWxsIHJlcG9zaXRvcnlcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNvZGVCdWlsZENsb25lT3V0cHV0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb2RlQ29tbWl0IHNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBDb2RlUGlwZWxpbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc291cmNlOiBDb2RlQ29tbWl0U291cmNlQ29uZmlnID0ge1xuICogICB0eXBlOiAnY29kZWNvbW1pdCcsXG4gKiAgIG9wdGlvbnM6IHtcbiAqICAgICByZXBvc2l0b3J5TmFtZTogJ215LXJlcG8nLFxuICogICAgIGJyYW5jaDogJ21haW4nLFxuICogICAgIHRyaWdnZXI6IFRyaWdnZXJUeXBlLkFVVE9cbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVDb21taXRTb3VyY2VDb25maWcge1xuICByZWFkb25seSB0eXBlOiAnY29kZWNvbW1pdCc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVDb21taXRPcHRpb25zO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQ29kZUNvbW1pdCBwaXBlbGluZSBzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQ29tbWl0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBDb2RlQ29tbWl0IHJlcG9zaXRvcnlcbiAgICogQGV4YW1wbGUgJ215LXJlcG8nXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCcmFuY2ggdG8gdHJhY2tcbiAgICogQGRlZmF1bHQgJ21haW4nXG4gICAqL1xuICByZWFkb25seSBicmFuY2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIHRyaWdnZXIgYmVoYXZpb3JcbiAgICogQGRlZmF1bHQgVHJpZ2dlclR5cGUuTk9ORVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJUeXBlO1xufVxuXG4vKipcbiAqIFVuaW9uIHR5cGUgb2YgYWxsIHN1cHBvcnRlZCBwaXBlbGluZSBzb3VyY2UgdHlwZXNcbiAqXG4gKiBTdXBwb3J0ZWQgc291cmNlczpcbiAqIC0gUzNTb3VyY2VDb25maWc6IFNvdXJjZSBjb2RlIGZyb20gUzMgYnVja2V0XG4gKiAtIEdpdEh1YlNvdXJjZUNvbmZpZzogU291cmNlIGNvZGUgZnJvbSBHaXRIdWIgcmVwb3NpdG9yeVxuICogLSBDb2RlU3RhclNvdXJjZUNvbmZpZzogU291cmNlIGNvZGUgdmlhIENvZGVTdGFyIGNvbm5lY3Rpb24gKEdpdEh1YiwgQml0YnVja2V0LCBHaXRMYWIpXG4gKiAtIENvZGVDb21taXRTb3VyY2VDb25maWc6IFNvdXJjZSBjb2RlIGZyb20gQVdTIENvZGVDb21taXQgcmVwb3NpdG9yeVxuICovXG5leHBvcnQgdHlwZSBTb3VyY2VUeXBlID0gUzNTb3VyY2VDb25maWcgfCBHaXRIdWJTb3VyY2VDb25maWcgfCBDb2RlU3RhclNvdXJjZUNvbmZpZyB8IENvZGVDb21taXRTb3VyY2VDb25maWc7XG4iXX0=
|
|
@@ -0,0 +1,78 @@
|
|
|
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.js';
|
|
5
|
+
import type { StageOptions } from './step-types.js';
|
|
6
|
+
import type { ArtifactManager } from '../core/artifact-manager.js';
|
|
7
|
+
import { UniqueId } from '../core/id-generator.js';
|
|
8
|
+
import type { MetaDataType } from '../core/pipeline-types.js';
|
|
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
|
+
* Pipeline-level scope used to resolve `{{ pipeline.* }}` template tokens
|
|
29
|
+
* inside plugin specs. Required — passed through to `createCodeBuildStep`
|
|
30
|
+
* on every step.
|
|
31
|
+
*/
|
|
32
|
+
readonly pipelineScope: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Builds and adds pipeline stages (waves) to a CodePipeline.
|
|
36
|
+
*
|
|
37
|
+
* Each stage is resolved from high-level configuration (plugin names)
|
|
38
|
+
* into CDK CodeBuild steps via PluginLookup, then added as a wave.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const stageBuilder = new StageBuilder({
|
|
43
|
+
* scope: this,
|
|
44
|
+
* pluginLookup,
|
|
45
|
+
* uniqueId,
|
|
46
|
+
* globalMetadata: mergedMetadata,
|
|
47
|
+
* });
|
|
48
|
+
* stageBuilder.addStage(pipeline, {
|
|
49
|
+
* stageName: 'Integration Tests',
|
|
50
|
+
* alias: 'integration',
|
|
51
|
+
* steps: [
|
|
52
|
+
* { plugin: { name: 'jest-integration' } },
|
|
53
|
+
* { plugin: { name: 'e2e-tests', alias: 'cypress' } },
|
|
54
|
+
* ],
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare class StageBuilder {
|
|
59
|
+
private readonly scope;
|
|
60
|
+
private readonly pluginLookup;
|
|
61
|
+
private readonly uniqueId;
|
|
62
|
+
private readonly globalMetadata;
|
|
63
|
+
private readonly defaultComputeType?;
|
|
64
|
+
private readonly artifactManager?;
|
|
65
|
+
private readonly orgId?;
|
|
66
|
+
private readonly pipelineScope;
|
|
67
|
+
constructor(props: StageBuilderProps);
|
|
68
|
+
/**
|
|
69
|
+
* Resolves a stage's plugin-based step configs into CodeBuild steps
|
|
70
|
+
* and adds them as a wave to the pipeline.
|
|
71
|
+
*/
|
|
72
|
+
addStage(pipeline: CodePipeline, stage: StageOptions): void;
|
|
73
|
+
private resolveStep;
|
|
74
|
+
/**
|
|
75
|
+
* Resolves and adds multiple stages as waves to the pipeline, in order.
|
|
76
|
+
*/
|
|
77
|
+
addStages(pipeline: CodePipeline, stages: StageOptions[]): void;
|
|
78
|
+
}
|