@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.
Files changed (84) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +69 -0
  3. package/lib/cdk.d.ts +38 -0
  4. package/lib/cdk.js +44 -0
  5. package/lib/config/app-config.d.ts +109 -0
  6. package/lib/config/app-config.js +197 -0
  7. package/lib/config/aws-config-cdk.d.ts +49 -0
  8. package/lib/config/aws-config-cdk.js +65 -0
  9. package/lib/config/billing-config.d.ts +24 -0
  10. package/lib/config/billing-config.js +497 -0
  11. package/lib/config/config-types.d.ts +346 -0
  12. package/lib/config/config-types.js +4 -0
  13. package/lib/config/entitlements.d.ts +23 -0
  14. package/lib/config/entitlements.js +46 -0
  15. package/lib/config/handler-constants.d.ts +10 -0
  16. package/lib/config/handler-constants.js +39 -0
  17. package/lib/config/infrastructure-config.d.ts +66 -0
  18. package/lib/config/infrastructure-config.js +197 -0
  19. package/lib/config/server-config.d.ts +53 -0
  20. package/lib/config/server-config.js +175 -0
  21. package/lib/config/service-client.d.ts +13 -0
  22. package/lib/config/service-client.js +20 -0
  23. package/lib/core/artifact-manager.d.ts +62 -0
  24. package/lib/core/artifact-manager.js +83 -0
  25. package/lib/core/id-generator.d.ts +50 -0
  26. package/lib/core/id-generator.js +50 -0
  27. package/lib/core/metadata-builder.d.ts +48 -0
  28. package/lib/core/metadata-builder.js +278 -0
  29. package/lib/core/metadata-helpers.d.ts +31 -0
  30. package/lib/core/metadata-helpers.js +55 -0
  31. package/lib/core/network-types.d.ts +200 -0
  32. package/lib/core/network-types.js +4 -0
  33. package/lib/core/network.d.ts +33 -0
  34. package/lib/core/network.js +112 -0
  35. package/lib/core/pipeline-helpers.d.ts +61 -0
  36. package/lib/core/pipeline-helpers.js +563 -0
  37. package/lib/core/pipeline-types.d.ts +118 -0
  38. package/lib/core/pipeline-types.js +131 -0
  39. package/lib/core/role-types.d.ts +254 -0
  40. package/lib/core/role-types.js +4 -0
  41. package/lib/core/role.d.ts +14 -0
  42. package/lib/core/role.js +117 -0
  43. package/lib/core/security-group-types.d.ts +84 -0
  44. package/lib/core/security-group-types.js +4 -0
  45. package/lib/core/security-group.d.ts +14 -0
  46. package/lib/core/security-group.js +33 -0
  47. package/lib/handlers/plugin-lookup-handler.d.ts +32 -0
  48. package/lib/handlers/plugin-lookup-handler.js +292 -0
  49. package/lib/handlers/pnpm-lock.yaml +12 -0
  50. package/lib/index.d.ts +45 -0
  51. package/lib/index.js +53 -0
  52. package/lib/pipeline/pipeline-builder.d.ts +123 -0
  53. package/lib/pipeline/pipeline-builder.js +476 -0
  54. package/lib/pipeline/pipeline-configuration.d.ts +81 -0
  55. package/lib/pipeline/pipeline-configuration.js +214 -0
  56. package/lib/pipeline/plugin-lookup.d.ts +131 -0
  57. package/lib/pipeline/plugin-lookup.js +316 -0
  58. package/lib/pipeline/plugin-spec.d.ts +138 -0
  59. package/lib/pipeline/plugin-spec.js +4 -0
  60. package/lib/pipeline/source-builder.d.ts +62 -0
  61. package/lib/pipeline/source-builder.js +164 -0
  62. package/lib/pipeline/source-types.d.ts +221 -0
  63. package/lib/pipeline/source-types.js +4 -0
  64. package/lib/pipeline/stage-builder.d.ts +78 -0
  65. package/lib/pipeline/stage-builder.js +129 -0
  66. package/lib/pipeline/step-types.d.ts +222 -0
  67. package/lib/pipeline/step-types.js +4 -0
  68. package/lib/template/evaluator.d.ts +42 -0
  69. package/lib/template/evaluator.js +164 -0
  70. package/lib/template/index.d.ts +34 -0
  71. package/lib/template/index.js +118 -0
  72. package/lib/template/metrics.d.ts +10 -0
  73. package/lib/template/metrics.js +43 -0
  74. package/lib/template/plugin-resolver.d.ts +8 -0
  75. package/lib/template/plugin-resolver.js +48 -0
  76. package/lib/template/tokenizer.d.ts +49 -0
  77. package/lib/template/tokenizer.js +233 -0
  78. package/lib/template/topo-sort.d.ts +17 -0
  79. package/lib/template/topo-sort.js +88 -0
  80. package/lib/template/validate.d.ts +45 -0
  81. package/lib/template/validate.js +96 -0
  82. package/lib/template/walker.d.ts +34 -0
  83. package/lib/template/walker.js +83 -0
  84. 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
+ }