@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.
Files changed (54) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +32 -0
  3. package/lib/config/app-config.d.ts +81 -0
  4. package/lib/config/app-config.js +151 -0
  5. package/lib/config/billing-config.d.ts +17 -0
  6. package/lib/config/billing-config.js +95 -0
  7. package/lib/config/config-types.d.ts +213 -0
  8. package/lib/config/config-types.js +5 -0
  9. package/lib/config/infrastructure-config.d.ts +55 -0
  10. package/lib/config/infrastructure-config.js +200 -0
  11. package/lib/config/server-config.d.ts +53 -0
  12. package/lib/config/server-config.js +180 -0
  13. package/lib/core/artifact-manager.d.ts +62 -0
  14. package/lib/core/artifact-manager.js +86 -0
  15. package/lib/core/id-generator.d.ts +26 -0
  16. package/lib/core/id-generator.js +44 -0
  17. package/lib/core/metadata-builder.d.ts +13 -0
  18. package/lib/core/metadata-builder.js +81 -0
  19. package/lib/core/network-types.d.ts +200 -0
  20. package/lib/core/network-types.js +5 -0
  21. package/lib/core/network.d.ts +20 -0
  22. package/lib/core/network.js +84 -0
  23. package/lib/core/pipeline-helpers.d.ts +53 -0
  24. package/lib/core/pipeline-helpers.js +273 -0
  25. package/lib/core/pipeline-types.d.ts +136 -0
  26. package/lib/core/pipeline-types.js +140 -0
  27. package/lib/core/role-types.d.ts +254 -0
  28. package/lib/core/role-types.js +5 -0
  29. package/lib/core/role.d.ts +14 -0
  30. package/lib/core/role.js +118 -0
  31. package/lib/core/security-group-types.d.ts +84 -0
  32. package/lib/core/security-group-types.js +5 -0
  33. package/lib/core/security-group.d.ts +14 -0
  34. package/lib/core/security-group.js +34 -0
  35. package/lib/handlers/plugin-lookup-handler.d.ts +32 -0
  36. package/lib/handlers/plugin-lookup-handler.js +313 -0
  37. package/lib/handlers/pnpm-lock.yaml +12 -0
  38. package/lib/index.d.ts +54 -0
  39. package/lib/index.js +112 -0
  40. package/lib/pipeline/pipeline-builder.d.ts +82 -0
  41. package/lib/pipeline/pipeline-builder.js +292 -0
  42. package/lib/pipeline/pipeline-configuration.d.ts +72 -0
  43. package/lib/pipeline/pipeline-configuration.js +196 -0
  44. package/lib/pipeline/plugin-lookup.d.ts +100 -0
  45. package/lib/pipeline/plugin-lookup.js +247 -0
  46. package/lib/pipeline/source-builder.d.ts +47 -0
  47. package/lib/pipeline/source-builder.js +111 -0
  48. package/lib/pipeline/source-types.d.ts +191 -0
  49. package/lib/pipeline/source-types.js +5 -0
  50. package/lib/pipeline/stage-builder.d.ts +71 -0
  51. package/lib/pipeline/stage-builder.js +118 -0
  52. package/lib/pipeline/step-types.d.ts +307 -0
  53. package/lib/pipeline/step-types.js +5 -0
  54. package/package.json +137 -0
@@ -0,0 +1,200 @@
1
+ import type { SecretValue } from 'aws-cdk-lib';
2
+ import type { MetaDataType } from './pipeline-types';
3
+ import type { SecurityGroupConfig } from './security-group-types';
4
+ /**
5
+ * Network configuration using explicit subnet IDs
6
+ *
7
+ * Use when you know the exact subnet IDs where CodeBuild should run.
8
+ * Subnets are selected directly by ID; VPC is looked up from the provided vpcId.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const network: SubnetIdsNetwork = {
13
+ * type: 'subnetIds',
14
+ * options: {
15
+ * vpcId: 'vpc-0a1b2c3d4e5f6a7b8',
16
+ * subnetIds: ['subnet-0a1b2c3d', 'subnet-4e5f6a7b'],
17
+ * securityGroupIds: ['sg-12345678']
18
+ * }
19
+ * };
20
+ * ```
21
+ */
22
+ export interface SubnetIdsNetwork {
23
+ readonly type: 'subnetIds';
24
+ readonly options: SubnetIdsNetworkOptions;
25
+ }
26
+ /**
27
+ * Network configuration using VPC lookup by ID
28
+ *
29
+ * Looks up an existing VPC by its ID and resolves subnets via subnetSelection filters.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const network: VpcIdNetwork = {
34
+ * type: 'vpcId',
35
+ * options: {
36
+ * vpcId: 'vpc-0a1b2c3d4e5f6a7b8',
37
+ * subnetType: 'PRIVATE_WITH_EGRESS',
38
+ * securityGroupIds: ['sg-12345678']
39
+ * }
40
+ * };
41
+ * ```
42
+ */
43
+ export interface VpcIdNetwork {
44
+ readonly type: 'vpcId';
45
+ readonly options: VpcIdNetworkOptions;
46
+ }
47
+ /**
48
+ * Network configuration using VPC lookup by tags
49
+ *
50
+ * Looks up an existing VPC by tag filters and resolves subnets via subnetSelection filters.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const network: VpcLookupNetwork = {
55
+ * type: 'vpcLookup',
56
+ * options: {
57
+ * tags: { 'aws:cloudformation:stack-name': 'NetworkStack' },
58
+ * subnetType: 'PRIVATE_WITH_EGRESS',
59
+ * availabilityZones: ['us-east-1a', 'us-east-1b']
60
+ * }
61
+ * };
62
+ * ```
63
+ */
64
+ export interface VpcLookupNetwork {
65
+ readonly type: 'vpcLookup';
66
+ readonly options: VpcLookupNetworkOptions;
67
+ }
68
+ /**
69
+ * Common subnet selection filters shared by VPC-based network options
70
+ */
71
+ interface SubnetSelectionOptions {
72
+ /**
73
+ * Subnet type filter for subnet selection
74
+ * Maps to CDK SubnetType values
75
+ * @default 'PRIVATE_WITH_EGRESS'
76
+ */
77
+ readonly subnetType?: SubnetTypeName;
78
+ /**
79
+ * Filter subnets to specific availability zones
80
+ * @example ['us-east-1a', 'us-east-1b']
81
+ */
82
+ readonly availabilityZones?: string[];
83
+ /**
84
+ * Filter subnets by CDK subnet group name
85
+ * Matches the groupName assigned during VPC creation
86
+ */
87
+ readonly subnetGroupName?: string;
88
+ /**
89
+ * Security group IDs to attach to CodeBuild projects
90
+ * @example ['sg-12345678']
91
+ */
92
+ readonly securityGroupIds?: string[];
93
+ }
94
+ /**
95
+ * Configuration options for explicit subnet ID network
96
+ */
97
+ export interface SubnetIdsNetworkOptions {
98
+ /**
99
+ * VPC ID that contains the subnets.
100
+ * Required because CDK CodeBuildStep needs a vpc reference.
101
+ * Can be a plain string or a SecretValue (e.g. from Secrets Manager).
102
+ * @example 'vpc-0a1b2c3d4e5f6a7b8'
103
+ */
104
+ readonly vpcId: SecretValue | string;
105
+ /**
106
+ * Explicit list of subnet IDs where CodeBuild projects will run
107
+ * @example ['subnet-0a1b2c3d', 'subnet-4e5f6a7b']
108
+ */
109
+ readonly subnetIds: string[];
110
+ /**
111
+ * Security group IDs to attach to CodeBuild projects
112
+ * @example ['sg-12345678']
113
+ */
114
+ readonly securityGroupIds?: string[];
115
+ }
116
+ /**
117
+ * Configuration options for VPC lookup by ID
118
+ */
119
+ export interface VpcIdNetworkOptions extends SubnetSelectionOptions {
120
+ /**
121
+ * VPC ID to look up
122
+ * Can be a plain string or a SecretValue (e.g. from Secrets Manager).
123
+ * @example 'vpc-0a1b2c3d4e5f6a7b8'
124
+ */
125
+ readonly vpcId: SecretValue | string;
126
+ }
127
+ /**
128
+ * Configuration options for VPC lookup by tags
129
+ */
130
+ export interface VpcLookupNetworkOptions extends SubnetSelectionOptions {
131
+ /**
132
+ * Tag key-value pairs to identify the VPC
133
+ * All tags must match for lookup to succeed
134
+ * @example { Environment: 'production', Team: 'platform' }
135
+ */
136
+ readonly tags: Record<string, string>;
137
+ /**
138
+ * Optional VPC name (value of the 'Name' tag) for additional filtering
139
+ */
140
+ readonly vpcName?: string;
141
+ /**
142
+ * Optional AWS region override for cross-region VPC lookup
143
+ * @example 'us-west-2'
144
+ */
145
+ readonly region?: string;
146
+ }
147
+ /**
148
+ * Subnet type names corresponding to CDK SubnetType enum values
149
+ *
150
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.SubnetType.html
151
+ */
152
+ export type SubnetTypeName = 'PRIVATE_WITH_EGRESS' | 'PRIVATE_WITH_NAT' | 'PRIVATE_ISOLATED' | 'PUBLIC';
153
+ /**
154
+ * Union type of all supported network configurations.
155
+ *
156
+ * Used at two independent levels:
157
+ * - Pipeline-level (`defaults.network`) — applies to all CodeBuild actions
158
+ * - Step-level (`synth.network`, `CodeBuildStepOptions.network`) — applies to an individual build step
159
+ *
160
+ * Each variant resolves to vpc, subnetSelection, and optional securityGroups:
161
+ * - SubnetIdsNetwork: VPC looked up by ID, subnets selected explicitly by ID
162
+ * - VpcIdNetwork: VPC looked up by ID, subnets resolved via subnetSelection filters
163
+ * - VpcLookupNetwork: VPC looked up by tags, subnets resolved via subnetSelection filters
164
+ */
165
+ export type NetworkConfig = SubnetIdsNetwork | VpcIdNetwork | VpcLookupNetwork;
166
+ /**
167
+ * Pipeline-level CodeBuild defaults applied to every CodeBuild action
168
+ * (synth, self-mutation, asset publishing) via `codeBuildDefaults`.
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const defaults: CodeBuildDefaults = {
173
+ * network: {
174
+ * type: 'vpcId',
175
+ * options: { vpcId: 'vpc-abc123', subnetType: 'PRIVATE_WITH_EGRESS' }
176
+ * },
177
+ * metadata: {
178
+ * [MetadataKeys.PRIVILEGED]: true,
179
+ * },
180
+ * };
181
+ * ```
182
+ */
183
+ export interface CodeBuildDefaults {
184
+ /**
185
+ * Network configuration for all CodeBuild actions.
186
+ * Resolves to vpc, subnetSelection, and optional securityGroups.
187
+ */
188
+ readonly network?: NetworkConfig;
189
+ /**
190
+ * Standalone security groups for all CodeBuild actions.
191
+ * Merged with any security groups resolved from network config.
192
+ */
193
+ readonly securityGroups?: SecurityGroupConfig;
194
+ /**
195
+ * Metadata applied to all CodeBuild actions.
196
+ * Merged with step-level metadata; step-level keys take precedence.
197
+ */
198
+ readonly metadata?: MetaDataType;
199
+ }
200
+ export {};
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL25ldHdvcmstdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBTZWNyZXRWYWx1ZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi9waXBlbGluZS10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFNlY3VyaXR5R3JvdXBDb25maWcgfSBmcm9tICcuL3NlY3VyaXR5LWdyb3VwLXR5cGVzJztcblxuLyoqXG4gKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gdXNpbmcgZXhwbGljaXQgc3VibmV0IElEc1xuICpcbiAqIFVzZSB3aGVuIHlvdSBrbm93IHRoZSBleGFjdCBzdWJuZXQgSURzIHdoZXJlIENvZGVCdWlsZCBzaG91bGQgcnVuLlxuICogU3VibmV0cyBhcmUgc2VsZWN0ZWQgZGlyZWN0bHkgYnkgSUQ7IFZQQyBpcyBsb29rZWQgdXAgZnJvbSB0aGUgcHJvdmlkZWQgdnBjSWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5ldHdvcms6IFN1Ym5ldElkc05ldHdvcmsgPSB7XG4gKiAgIHR5cGU6ICdzdWJuZXRJZHMnLFxuICogICBvcHRpb25zOiB7XG4gKiAgICAgdnBjSWQ6ICd2cGMtMGExYjJjM2Q0ZTVmNmE3YjgnLFxuICogICAgIHN1Ym5ldElkczogWydzdWJuZXQtMGExYjJjM2QnLCAnc3VibmV0LTRlNWY2YTdiJ10sXG4gKiAgICAgc2VjdXJpdHlHcm91cElkczogWydzZy0xMjM0NTY3OCddXG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJuZXRJZHNOZXR3b3JrIHtcbiAgcmVhZG9ubHkgdHlwZTogJ3N1Ym5ldElkcyc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFN1Ym5ldElkc05ldHdvcmtPcHRpb25zO1xufVxuXG4vKipcbiAqIE5ldHdvcmsgY29uZmlndXJhdGlvbiB1c2luZyBWUEMgbG9va3VwIGJ5IElEXG4gKlxuICogTG9va3MgdXAgYW4gZXhpc3RpbmcgVlBDIGJ5IGl0cyBJRCBhbmQgcmVzb2x2ZXMgc3VibmV0cyB2aWEgc3VibmV0U2VsZWN0aW9uIGZpbHRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5ldHdvcms6IFZwY0lkTmV0d29yayA9IHtcbiAqICAgdHlwZTogJ3ZwY0lkJyxcbiAqICAgb3B0aW9uczoge1xuICogICAgIHZwY0lkOiAndnBjLTBhMWIyYzNkNGU1ZjZhN2I4JyxcbiAqICAgICBzdWJuZXRUeXBlOiAnUFJJVkFURV9XSVRIX0VHUkVTUycsXG4gKiAgICAgc2VjdXJpdHlHcm91cElkczogWydzZy0xMjM0NTY3OCddXG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJZE5ldHdvcmsge1xuICByZWFkb25seSB0eXBlOiAndnBjSWQnO1xuICByZWFkb25seSBvcHRpb25zOiBWcGNJZE5ldHdvcmtPcHRpb25zO1xufVxuXG4vKipcbiAqIE5ldHdvcmsgY29uZmlndXJhdGlvbiB1c2luZyBWUEMgbG9va3VwIGJ5IHRhZ3NcbiAqXG4gKiBMb29rcyB1cCBhbiBleGlzdGluZyBWUEMgYnkgdGFnIGZpbHRlcnMgYW5kIHJlc29sdmVzIHN1Ym5ldHMgdmlhIHN1Ym5ldFNlbGVjdGlvbiBmaWx0ZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXR3b3JrOiBWcGNMb29rdXBOZXR3b3JrID0ge1xuICogICB0eXBlOiAndnBjTG9va3VwJyxcbiAqICAgb3B0aW9uczoge1xuICogICAgIHRhZ3M6IHsgJ2F3czpjbG91ZGZvcm1hdGlvbjpzdGFjay1uYW1lJzogJ05ldHdvcmtTdGFjaycgfSxcbiAqICAgICBzdWJuZXRUeXBlOiAnUFJJVkFURV9XSVRIX0VHUkVTUycsXG4gKiAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IFsndXMtZWFzdC0xYScsICd1cy1lYXN0LTFiJ11cbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0xvb2t1cE5ldHdvcmsge1xuICByZWFkb25seSB0eXBlOiAndnBjTG9va3VwJztcbiAgcmVhZG9ubHkgb3B0aW9uczogVnBjTG9va3VwTmV0d29ya09wdGlvbnM7XG59XG5cbi8qKlxuICogQ29tbW9uIHN1Ym5ldCBzZWxlY3Rpb24gZmlsdGVycyBzaGFyZWQgYnkgVlBDLWJhc2VkIG5ldHdvcmsgb3B0aW9uc1xuICovXG5pbnRlcmZhY2UgU3VibmV0U2VsZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdWJuZXQgdHlwZSBmaWx0ZXIgZm9yIHN1Ym5ldCBzZWxlY3Rpb25cbiAgICogTWFwcyB0byBDREsgU3VibmV0VHlwZSB2YWx1ZXNcbiAgICogQGRlZmF1bHQgJ1BSSVZBVEVfV0lUSF9FR1JFU1MnXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRUeXBlPzogU3VibmV0VHlwZU5hbWU7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBzdWJuZXRzIHRvIHNwZWNpZmljIGF2YWlsYWJpbGl0eSB6b25lc1xuICAgKiBAZXhhbXBsZSBbJ3VzLWVhc3QtMWEnLCAndXMtZWFzdC0xYiddXG4gICAqL1xuICByZWFkb25seSBhdmFpbGFiaWxpdHlab25lcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgc3VibmV0cyBieSBDREsgc3VibmV0IGdyb3VwIG5hbWVcbiAgICogTWF0Y2hlcyB0aGUgZ3JvdXBOYW1lIGFzc2lnbmVkIGR1cmluZyBWUEMgY3JlYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldEdyb3VwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXAgSURzIHRvIGF0dGFjaCB0byBDb2RlQnVpbGQgcHJvamVjdHNcbiAgICogQGV4YW1wbGUgWydzZy0xMjM0NTY3OCddXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwSWRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBleHBsaWNpdCBzdWJuZXQgSUQgbmV0d29ya1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym5ldElkc05ldHdvcmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFZQQyBJRCB0aGF0IGNvbnRhaW5zIHRoZSBzdWJuZXRzLlxuICAgKiBSZXF1aXJlZCBiZWNhdXNlIENESyBDb2RlQnVpbGRTdGVwIG5lZWRzIGEgdnBjIHJlZmVyZW5jZS5cbiAgICogQ2FuIGJlIGEgcGxhaW4gc3RyaW5nIG9yIGEgU2VjcmV0VmFsdWUgKGUuZy4gZnJvbSBTZWNyZXRzIE1hbmFnZXIpLlxuICAgKiBAZXhhbXBsZSAndnBjLTBhMWIyYzNkNGU1ZjZhN2I4J1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjSWQ6IFNlY3JldFZhbHVlIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHN1Ym5ldCBJRHMgd2hlcmUgQ29kZUJ1aWxkIHByb2plY3RzIHdpbGwgcnVuXG4gICAqIEBleGFtcGxlIFsnc3VibmV0LTBhMWIyYzNkJywgJ3N1Ym5ldC00ZTVmNmE3YiddXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBJRHMgdG8gYXR0YWNoIHRvIENvZGVCdWlsZCBwcm9qZWN0c1xuICAgKiBAZXhhbXBsZSBbJ3NnLTEyMzQ1Njc4J11cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBJZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIFZQQyBsb29rdXAgYnkgSURcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNJZE5ldHdvcmtPcHRpb25zIGV4dGVuZHMgU3VibmV0U2VsZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWUEMgSUQgdG8gbG9vayB1cFxuICAgKiBDYW4gYmUgYSBwbGFpbiBzdHJpbmcgb3IgYSBTZWNyZXRWYWx1ZSAoZS5nLiBmcm9tIFNlY3JldHMgTWFuYWdlcikuXG4gICAqIEBleGFtcGxlICd2cGMtMGExYjJjM2Q0ZTVmNmE3YjgnXG4gICAqL1xuICByZWFkb25seSB2cGNJZDogU2VjcmV0VmFsdWUgfCBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBWUEMgbG9va3VwIGJ5IHRhZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNMb29rdXBOZXR3b3JrT3B0aW9ucyBleHRlbmRzIFN1Ym5ldFNlbGVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGFnIGtleS12YWx1ZSBwYWlycyB0byBpZGVudGlmeSB0aGUgVlBDXG4gICAqIEFsbCB0YWdzIG11c3QgbWF0Y2ggZm9yIGxvb2t1cCB0byBzdWNjZWVkXG4gICAqIEBleGFtcGxlIHsgRW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJywgVGVhbTogJ3BsYXRmb3JtJyB9XG4gICAqL1xuICByZWFkb25seSB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBWUEMgbmFtZSAodmFsdWUgb2YgdGhlICdOYW1lJyB0YWcpIGZvciBhZGRpdGlvbmFsIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgQVdTIHJlZ2lvbiBvdmVycmlkZSBmb3IgY3Jvc3MtcmVnaW9uIFZQQyBsb29rdXBcbiAgICogQGV4YW1wbGUgJ3VzLXdlc3QtMidcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdWJuZXQgdHlwZSBuYW1lcyBjb3JyZXNwb25kaW5nIHRvIENESyBTdWJuZXRUeXBlIGVudW0gdmFsdWVzXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2FwaS92Mi9kb2NzL2F3cy1jZGstbGliLmF3c19lYzIuU3VibmV0VHlwZS5odG1sXG4gKi9cbmV4cG9ydCB0eXBlIFN1Ym5ldFR5cGVOYW1lID1cbiAgfCAnUFJJVkFURV9XSVRIX0VHUkVTUydcbiAgfCAnUFJJVkFURV9XSVRIX05BVCdcbiAgfCAnUFJJVkFURV9JU09MQVRFRCdcbiAgfCAnUFVCTElDJztcblxuLyoqXG4gKiBVbmlvbiB0eXBlIG9mIGFsbCBzdXBwb3J0ZWQgbmV0d29yayBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGF0IHR3byBpbmRlcGVuZGVudCBsZXZlbHM6XG4gKiAtIFBpcGVsaW5lLWxldmVsIChgZGVmYXVsdHMubmV0d29ya2ApIOKAlCBhcHBsaWVzIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICogLSBTdGVwLWxldmVsIChgc3ludGgubmV0d29ya2AsIGBDb2RlQnVpbGRTdGVwT3B0aW9ucy5uZXR3b3JrYCkg4oCUIGFwcGxpZXMgdG8gYW4gaW5kaXZpZHVhbCBidWlsZCBzdGVwXG4gKlxuICogRWFjaCB2YXJpYW50IHJlc29sdmVzIHRvIHZwYywgc3VibmV0U2VsZWN0aW9uLCBhbmQgb3B0aW9uYWwgc2VjdXJpdHlHcm91cHM6XG4gKiAtIFN1Ym5ldElkc05ldHdvcms6IFZQQyBsb29rZWQgdXAgYnkgSUQsIHN1Ym5ldHMgc2VsZWN0ZWQgZXhwbGljaXRseSBieSBJRFxuICogLSBWcGNJZE5ldHdvcms6IFZQQyBsb29rZWQgdXAgYnkgSUQsIHN1Ym5ldHMgcmVzb2x2ZWQgdmlhIHN1Ym5ldFNlbGVjdGlvbiBmaWx0ZXJzXG4gKiAtIFZwY0xvb2t1cE5ldHdvcms6IFZQQyBsb29rZWQgdXAgYnkgdGFncywgc3VibmV0cyByZXNvbHZlZCB2aWEgc3VibmV0U2VsZWN0aW9uIGZpbHRlcnNcbiAqL1xuZXhwb3J0IHR5cGUgTmV0d29ya0NvbmZpZyA9IFN1Ym5ldElkc05ldHdvcmsgfCBWcGNJZE5ldHdvcmsgfCBWcGNMb29rdXBOZXR3b3JrO1xuXG4vKipcbiAqIFBpcGVsaW5lLWxldmVsIENvZGVCdWlsZCBkZWZhdWx0cyBhcHBsaWVkIHRvIGV2ZXJ5IENvZGVCdWlsZCBhY3Rpb25cbiAqIChzeW50aCwgc2VsZi1tdXRhdGlvbiwgYXNzZXQgcHVibGlzaGluZykgdmlhIGBjb2RlQnVpbGREZWZhdWx0c2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlZmF1bHRzOiBDb2RlQnVpbGREZWZhdWx0cyA9IHtcbiAqICAgbmV0d29yazoge1xuICogICAgIHR5cGU6ICd2cGNJZCcsXG4gKiAgICAgb3B0aW9uczogeyB2cGNJZDogJ3ZwYy1hYmMxMjMnLCBzdWJuZXRUeXBlOiAnUFJJVkFURV9XSVRIX0VHUkVTUycgfVxuICogICB9LFxuICogICBtZXRhZGF0YToge1xuICogICAgIFtNZXRhZGF0YUtleXMuUFJJVklMRUdFRF06IHRydWUsXG4gKiAgIH0sXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJ1aWxkRGVmYXVsdHMge1xuICAvKipcbiAgICogTmV0d29yayBjb25maWd1cmF0aW9uIGZvciBhbGwgQ29kZUJ1aWxkIGFjdGlvbnMuXG4gICAqIFJlc29sdmVzIHRvIHZwYywgc3VibmV0U2VsZWN0aW9uLCBhbmQgb3B0aW9uYWwgc2VjdXJpdHlHcm91cHMuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrPzogTmV0d29ya0NvbmZpZztcblxuICAvKipcbiAgICogU3RhbmRhbG9uZSBzZWN1cml0eSBncm91cHMgZm9yIGFsbCBDb2RlQnVpbGQgYWN0aW9ucy5cbiAgICogTWVyZ2VkIHdpdGggYW55IHNlY3VyaXR5IGdyb3VwcyByZXNvbHZlZCBmcm9tIG5ldHdvcmsgY29uZmlnLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBTZWN1cml0eUdyb3VwQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBhcHBsaWVkIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9ucy5cbiAgICogTWVyZ2VkIHdpdGggc3RlcC1sZXZlbCBtZXRhZGF0YTsgc3RlcC1sZXZlbCBrZXlzIHRha2UgcHJlY2VkZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogTWV0YURhdGFUeXBlO1xufVxuIl19
@@ -0,0 +1,20 @@
1
+ import { ISecurityGroup, IVpc, SubnetSelection } from 'aws-cdk-lib/aws-ec2';
2
+ import { Construct } from 'constructs';
3
+ import { UniqueId } from './id-generator';
4
+ import type { NetworkConfig } from './network-types';
5
+ /** Resolved CDK network props ready to spread into CodeBuildStep or codeBuildDefaults */
6
+ export interface ResolvedNetwork {
7
+ vpc: IVpc;
8
+ subnetSelection: SubnetSelection;
9
+ securityGroups?: ISecurityGroup[];
10
+ }
11
+ /**
12
+ * Resolve a NetworkConfig into CDK props for CodeBuildStep or codeBuildDefaults.
13
+ * Uses discriminated union narrowing to delegate to the appropriate CDK lookups.
14
+ *
15
+ * @param scope - CDK construct scope
16
+ * @param id - UniqueId instance for generating unique construct IDs
17
+ * @param network - Network configuration to resolve
18
+ * @returns Resolved network props ready to spread into CDK constructs
19
+ */
20
+ export declare function resolveNetwork(scope: Construct, id: UniqueId, network: NetworkConfig): ResolvedNetwork;
@@ -0,0 +1,84 @@
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.resolveNetwork = resolveNetwork;
6
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
7
+ const pipeline_helpers_1 = require("./pipeline-helpers");
8
+ /**
9
+ * Mapping from string subnet type names to CDK SubnetType enum values
10
+ */
11
+ const SUBNET_TYPE_MAP = {
12
+ PRIVATE_WITH_EGRESS: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS,
13
+ PRIVATE_WITH_NAT: aws_ec2_1.SubnetType.PRIVATE_WITH_NAT,
14
+ PRIVATE_ISOLATED: aws_ec2_1.SubnetType.PRIVATE_ISOLATED,
15
+ PUBLIC: aws_ec2_1.SubnetType.PUBLIC,
16
+ };
17
+ const DEFAULT_SUBNET_TYPE = 'PRIVATE_WITH_EGRESS';
18
+ /**
19
+ * Resolve a NetworkConfig into CDK props for CodeBuildStep or codeBuildDefaults.
20
+ * Uses discriminated union narrowing to delegate to the appropriate CDK lookups.
21
+ *
22
+ * @param scope - CDK construct scope
23
+ * @param id - UniqueId instance for generating unique construct IDs
24
+ * @param network - Network configuration to resolve
25
+ * @returns Resolved network props ready to spread into CDK constructs
26
+ */
27
+ function resolveNetwork(scope, id, network) {
28
+ switch (network.type) {
29
+ case 'subnetIds': {
30
+ const vpc = aws_ec2_1.Vpc.fromLookup(scope, id.generate('network:vpc'), {
31
+ vpcId: (0, pipeline_helpers_1.unwrapSecret)(network.options.vpcId),
32
+ });
33
+ const subnets = network.options.subnetIds.map((subnetId) => aws_ec2_1.Subnet.fromSubnetId(scope, id.generate('network:subnet'), subnetId));
34
+ return withSecurityGroups({ vpc, subnetSelection: { subnets } }, scope, id, network.options.securityGroupIds);
35
+ }
36
+ case 'vpcId': {
37
+ const vpc = aws_ec2_1.Vpc.fromLookup(scope, id.generate('network:vpc'), {
38
+ vpcId: (0, pipeline_helpers_1.unwrapSecret)(network.options.vpcId),
39
+ });
40
+ return withSecurityGroups({ vpc, subnetSelection: resolveSubnetSelection(network.options) }, scope, id, network.options.securityGroupIds);
41
+ }
42
+ case 'vpcLookup': {
43
+ const vpc = aws_ec2_1.Vpc.fromLookup(scope, id.generate('network:vpc'), {
44
+ tags: network.options.tags,
45
+ ...(network.options.vpcName && { vpcName: network.options.vpcName }),
46
+ ...(network.options.region && { region: network.options.region }),
47
+ });
48
+ return withSecurityGroups({ vpc, subnetSelection: resolveSubnetSelection(network.options) }, scope, id, network.options.securityGroupIds);
49
+ }
50
+ default: {
51
+ const _exhaustive = network;
52
+ throw new Error(`Unknown network config type: ${_exhaustive.type}`);
53
+ }
54
+ }
55
+ }
56
+ /**
57
+ * Attach resolved security groups to a network result when present.
58
+ */
59
+ function withSecurityGroups(result, scope, id, securityGroupIds) {
60
+ const securityGroups = resolveSecurityGroups(scope, id, securityGroupIds);
61
+ return securityGroups ? { ...result, securityGroups } : result;
62
+ }
63
+ /**
64
+ * Build a SubnetSelection from options that carry subnetType, availabilityZones,
65
+ * and subnetGroupName. Shared by vpcId and vpcLookup branches.
66
+ */
67
+ function resolveSubnetSelection(options) {
68
+ return {
69
+ subnetType: SUBNET_TYPE_MAP[options.subnetType ?? DEFAULT_SUBNET_TYPE],
70
+ ...(options.availabilityZones && { availabilityZones: options.availabilityZones }),
71
+ ...(options.subnetGroupName && { subnetGroupName: options.subnetGroupName }),
72
+ };
73
+ }
74
+ /**
75
+ * Resolve security group IDs into CDK security group references.
76
+ * Returns undefined when no IDs are provided.
77
+ */
78
+ function resolveSecurityGroups(scope, id, securityGroupIds) {
79
+ if (!securityGroupIds?.length) {
80
+ return undefined;
81
+ }
82
+ return securityGroupIds.map((sgId) => aws_ec2_1.SecurityGroup.fromSecurityGroupId(scope, id.generate('network:sg'), sgId));
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL25ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBdUN0Qyx3Q0FxREM7QUExRkQsaURBQW9IO0FBT3BILHlEQUFrRDtBQUVsRDs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUF1QztJQUMxRCxtQkFBbUIsRUFBRSxvQkFBVSxDQUFDLG1CQUFtQjtJQUNuRCxnQkFBZ0IsRUFBRSxvQkFBVSxDQUFDLGdCQUFnQjtJQUM3QyxnQkFBZ0IsRUFBRSxvQkFBVSxDQUFDLGdCQUFnQjtJQUM3QyxNQUFNLEVBQUUsb0JBQVUsQ0FBQyxNQUFNO0NBQzFCLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFtQixxQkFBcUIsQ0FBQztBQVNsRTs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGNBQWMsQ0FDNUIsS0FBZ0IsRUFDaEIsRUFBWSxFQUNaLE9BQXNCO0lBRXRCLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLEdBQUcsR0FBRyxhQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUM1RCxLQUFLLEVBQUUsSUFBQSwrQkFBWSxFQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2FBQzNDLENBQUMsQ0FBQztZQUVILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FDM0MsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQ2xGLENBQUM7WUFFRixPQUFPLGtCQUFrQixDQUN2QixFQUFF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QUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUN6QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsdUJBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FDcEYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgSVNlY3VyaXR5R3JvdXAsIElWcGMsIFNlY3VyaXR5R3JvdXAsIFN1Ym5ldCwgU3VibmV0U2VsZWN0aW9uLCBTdWJuZXRUeXBlLCBWcGMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgdHlwZSB7XG4gIE5ldHdvcmtDb25maWcsXG4gIFN1Ym5ldFR5cGVOYW1lLFxufSBmcm9tICcuL25ldHdvcmstdHlwZXMnO1xuaW1wb3J0IHsgdW53cmFwU2VjcmV0IH0gZnJvbSAnLi9waXBlbGluZS1oZWxwZXJzJztcblxuLyoqXG4gKiBNYXBwaW5nIGZyb20gc3RyaW5nIHN1Ym5ldCB0eXBlIG5hbWVzIHRvIENESyBTdWJuZXRUeXBlIGVudW0gdmFsdWVzXG4gKi9cbmNvbnN0IFNVQk5FVF9UWVBFX01BUDogUmVjb3JkPFN1Ym5ldFR5cGVOYW1lLCBTdWJuZXRUeXBlPiA9IHtcbiAgUFJJVkFURV9XSVRIX0VHUkVTUzogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTLFxuICBQUklWQVRFX1dJVEhfTkFUOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9OQVQsXG4gIFBSSVZBVEVfSVNPTEFURUQ6IFN1Ym5ldFR5cGUuUFJJVkFURV9JU09MQVRFRCxcbiAgUFVCTElDOiBTdWJuZXRUeXBlLlBVQkxJQyxcbn07XG5cbmNvbnN0IERFRkFVTFRfU1VCTkVUX1RZUEU6IFN1Ym5ldFR5cGVOYW1lID0gJ1BSSVZBVEVfV0lUSF9FR1JFU1MnO1xuXG4vKiogUmVzb2x2ZWQgQ0RLIG5ldHdvcmsgcHJvcHMgcmVhZHkgdG8gc3ByZWFkIGludG8gQ29kZUJ1aWxkU3RlcCBvciBjb2RlQnVpbGREZWZhdWx0cyAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE5ldHdvcmsge1xuICB2cGM6IElWcGM7XG4gIHN1Ym5ldFNlbGVjdGlvbjogU3VibmV0U2VsZWN0aW9uO1xuICBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIE5ldHdvcmtDb25maWcgaW50byBDREsgcHJvcHMgZm9yIENvZGVCdWlsZFN0ZXAgb3IgY29kZUJ1aWxkRGVmYXVsdHMuXG4gKiBVc2VzIGRpc2NyaW1pbmF0ZWQgdW5pb24gbmFycm93aW5nIHRvIGRlbGVnYXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBDREsgbG9va3Vwcy5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBDREsgY29uc3RydWN0IHNjb3BlXG4gKiBAcGFyYW0gaWQgLSBVbmlxdWVJZCBpbnN0YW5jZSBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgY29uc3RydWN0IElEc1xuICogQHBhcmFtIG5ldHdvcmsgLSBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gdG8gcmVzb2x2ZVxuICogQHJldHVybnMgUmVzb2x2ZWQgbmV0d29yayBwcm9wcyByZWFkeSB0byBzcHJlYWQgaW50byBDREsgY29uc3RydWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5ldHdvcmsoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBVbmlxdWVJZCxcbiAgbmV0d29yazogTmV0d29ya0NvbmZpZyxcbik6IFJlc29sdmVkTmV0d29yayB7XG4gIHN3aXRjaCAobmV0d29yay50eXBlKSB7XG4gICAgY2FzZSAnc3VibmV0SWRzJzoge1xuICAgICAgY29uc3QgdnBjID0gVnBjLmZyb21Mb29rdXAoc2NvcGUsIGlkLmdlbmVyYXRlKCduZXR3b3JrOnZwYycpLCB7XG4gICAgICAgIHZwY0lkOiB1bndyYXBTZWNyZXQobmV0d29yay5vcHRpb25zLnZwY0lkKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdWJuZXRzID0gbmV0d29yay5vcHRpb25zLnN1Ym5ldElkcy5tYXAoXG4gICAgICAgIChzdWJuZXRJZCkgPT4gU3VibmV0LmZyb21TdWJuZXRJZChzY29wZSwgaWQuZ2VuZXJhdGUoJ25ldHdvcms6c3VibmV0JyksIHN1Ym5ldElkKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB3aXRoU2VjdXJpdHlHcm91cHMoXG4gICAgICAgIHsgdnBjLCBzdWJuZXRTZWxlY3Rpb246IHsgc3VibmV0cyB9IH0sXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCxcbiAgICAgICAgbmV0d29yay5vcHRpb25zLnNlY3VyaXR5R3JvdXBJZHMsXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICd2cGNJZCc6IHtcbiAgICAgIGNvbnN0IHZwYyA9IFZwYy5mcm9tTG9va3VwKHNjb3BlLCBpZC5nZW5lcmF0ZSgnbmV0d29yazp2cGMnKSwge1xuICAgICAgICB2cGNJZDogdW53cmFwU2VjcmV0KG5ldHdvcmsub3B0aW9ucy52cGNJZCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHdpdGhTZWN1cml0eUdyb3VwcyhcbiAgICAgICAgeyB2cGMsIHN1Ym5ldFNlbGVjdGlvbjogcmVzb2x2ZVN1Ym5ldFNlbGVjdGlvbihuZXR3b3JrLm9wdGlvbnMpIH0sXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCxcbiAgICAgICAgbmV0d29yay5vcHRpb25zLnNlY3VyaXR5R3JvdXBJZHMsXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICd2cGNMb29rdXAnOiB7XG4gICAgICBjb25zdCB2cGMgPSBWcGMuZnJvbUxvb2t1cChzY29wZSwgaWQuZ2VuZXJhdGUoJ25ldHdvcms6dnBjJyksIHtcbiAgICAgICAgdGFnczogbmV0d29yay5vcHRpb25zLnRhZ3MsXG4gICAgICAgIC4uLihuZXR3b3JrLm9wdGlvbnMudnBjTmFtZSAmJiB7IHZwY05hbWU6IG5ldHdvcmsub3B0aW9ucy52cGNOYW1lIH0pLFxuICAgICAgICAuLi4obmV0d29yay5vcHRpb25zLnJlZ2lvbiAmJiB7IHJlZ2lvbjogbmV0d29yay5vcHRpb25zLnJlZ2lvbiB9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gd2l0aFNlY3VyaXR5R3JvdXBzKFxuICAgICAgICB7IHZwYywgc3VibmV0U2VsZWN0aW9uOiByZXNvbHZlU3VibmV0U2VsZWN0aW9uKG5ldHdvcmsub3B0aW9ucykgfSxcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGlkLFxuICAgICAgICBuZXR3b3JrLm9wdGlvbnMuc2VjdXJpdHlHcm91cElkcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IG5ldHdvcms7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbmV0d29yayBjb25maWcgdHlwZTogJHsoX2V4aGF1c3RpdmUgYXMgTmV0d29ya0NvbmZpZykudHlwZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggcmVzb2x2ZWQgc2VjdXJpdHkgZ3JvdXBzIHRvIGEgbmV0d29yayByZXN1bHQgd2hlbiBwcmVzZW50LlxuICovXG5mdW5jdGlvbiB3aXRoU2VjdXJpdHlHcm91cHMoXG4gIHJlc3VsdDogT21pdDxSZXNvbHZlZE5ldHdvcmssICdzZWN1cml0eUdyb3Vwcyc+LFxuICBzY29wZTogQ29uc3RydWN0LFxuICBpZDogVW5pcXVlSWQsXG4gIHNlY3VyaXR5R3JvdXBJZHM/OiBzdHJpbmdbXSxcbik6IFJlc29sdmVkTmV0d29yayB7XG4gIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gcmVzb2x2ZVNlY3VyaXR5R3JvdXBzKHNjb3BlLCBpZCwgc2VjdXJpdHlHcm91cElkcyk7XG4gIHJldHVybiBzZWN1cml0eUdyb3VwcyA/IHsgLi4ucmVzdWx0LCBzZWN1cml0eUdyb3VwcyB9IDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgU3VibmV0U2VsZWN0aW9uIGZyb20gb3B0aW9ucyB0aGF0IGNhcnJ5IHN1Ym5ldFR5cGUsIGF2YWlsYWJpbGl0eVpvbmVzLFxuICogYW5kIHN1Ym5ldEdyb3VwTmFtZS4gU2hhcmVkIGJ5IHZwY0lkIGFuZCB2cGNMb29rdXAgYnJhbmNoZXMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdWJuZXRTZWxlY3Rpb24oXG4gIG9wdGlvbnM6IHsgc3VibmV0VHlwZT86IFN1Ym5ldFR5cGVOYW1lOyBhdmFpbGFiaWxpdHlab25lcz86IHN0cmluZ1tdOyBzdWJuZXRHcm91cE5hbWU/OiBzdHJpbmcgfSxcbik6IFN1Ym5ldFNlbGVjdGlvbiB7XG4gIHJldHVybiB7XG4gICAgc3VibmV0VHlwZTogU1VCTkVUX1RZUEVfTUFQW29wdGlvbnMuc3VibmV0VHlwZSA/PyBERUZBVUxUX1NVQk5FVF9UWVBFXSxcbiAgICAuLi4ob3B0aW9ucy5hdmFpbGFiaWxpdHlab25lcyAmJiB7IGF2YWlsYWJpbGl0eVpvbmVzOiBvcHRpb25zLmF2YWlsYWJpbGl0eVpvbmVzIH0pLFxuICAgIC4uLihvcHRpb25zLnN1Ym5ldEdyb3VwTmFtZSAmJiB7IHN1Ym5ldEdyb3VwTmFtZTogb3B0aW9ucy5zdWJuZXRHcm91cE5hbWUgfSksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBzZWN1cml0eSBncm91cCBJRHMgaW50byBDREsgc2VjdXJpdHkgZ3JvdXAgcmVmZXJlbmNlcy5cbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm8gSURzIGFyZSBwcm92aWRlZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNlY3VyaXR5R3JvdXBzKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBpZDogVW5pcXVlSWQsXG4gIHNlY3VyaXR5R3JvdXBJZHM/OiBzdHJpbmdbXSxcbik6IElTZWN1cml0eUdyb3VwW10gfCB1bmRlZmluZWQge1xuICBpZiAoIXNlY3VyaXR5R3JvdXBJZHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHNlY3VyaXR5R3JvdXBJZHMubWFwKFxuICAgIChzZ0lkKSA9PiBTZWN1cml0eUdyb3VwLmZyb21TZWN1cml0eUdyb3VwSWQoc2NvcGUsIGlkLmdlbmVyYXRlKCduZXR3b3JrOnNnJyksIHNnSWQpLFxuICApO1xufVxuIl19
@@ -0,0 +1,53 @@
1
+ import { SecretValue } from 'aws-cdk-lib';
2
+ import { ComputeType as CDKComputeType } from 'aws-cdk-lib/aws-codebuild';
3
+ import { CodeBuildStep, ManualApprovalStep, ShellStep } from 'aws-cdk-lib/pipelines';
4
+ import { MetaDataType } from './pipeline-types';
5
+ import type { CodeBuildStepOptions } from '../pipeline/step-types';
6
+ /**
7
+ * Merge multiple metadata objects into one. Later sources override earlier ones.
8
+ */
9
+ export declare function merge(...sources: Array<Partial<MetaDataType>>): MetaDataType;
10
+ /**
11
+ * Extract non-namespaced metadata keys as environment variable strings.
12
+ * Keys starting with 'aws:cdk:' are reserved for CDK construct props
13
+ * (processed by metadata extraction functions) and are excluded here.
14
+ *
15
+ * All values are converted to strings for CodeBuild compatibility.
16
+ */
17
+ export declare function extractMetadataEnv(metadata: MetaDataType): Record<string, string>;
18
+ /**
19
+ * Create a CodeBuild step or Shell step based on plugin configuration.
20
+ *
21
+ * Metadata merge order (last wins):
22
+ * 1. Step-level metadata (from options.metadata)
23
+ * 2. Plugin metadata (from plugin.metadata in database)
24
+ *
25
+ * Environment merge order (last wins):
26
+ * 1. Plugin env vars (from plugin.env)
27
+ * 2. Custom env vars (from options.env)
28
+ * 3. WORKDIR from merged metadata
29
+ *
30
+ * CDK prop spread order (last wins):
31
+ * programmatic defaults (input, commands, env, network) → metadata overrides
32
+ *
33
+ * This means metadata keys like `aws:cdk:pipelines:codebuildstep:commands`
34
+ * will override the plugin-derived commands when explicitly set.
35
+ */
36
+ export declare function createCodeBuildStep(options: CodeBuildStepOptions): ShellStep | CodeBuildStep | ManualApprovalStep;
37
+ /**
38
+ * Convert string or ComputeType enum to CDK ComputeType
39
+ */
40
+ export declare function getComputeType(input?: string | CDKComputeType): CDKComputeType;
41
+ /**
42
+ * Replaces all characters that are not letters or numbers with the specified value
43
+ * @param input - The string to process
44
+ * @param replaceValue - The character(s) to replace non-alphanumeric characters with (default: '_')
45
+ * @returns The string with non-alphanumeric characters replaced
46
+ */
47
+ export declare function replaceNonAlphanumeric(input: string, replaceValue?: string): string;
48
+ /**
49
+ * Unwrap a SecretValue | string into a plain string.
50
+ * When a SecretValue is provided (e.g. from Secrets Manager), calls unsafeUnwrap()
51
+ * to extract the underlying value.
52
+ */
53
+ export declare function unwrapSecret(value: SecretValue | string): string;