@venturekit/core 0.0.0-dev.20260307234057

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.
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ /**
3
+ * VentureKit Presets
4
+ *
5
+ * AWS-like preset sizes that expand to explicit configuration values.
6
+ * Users can use these as shortcuts and override specific fields.
7
+ *
8
+ * Merge order: PRESET ← USER_OVERRIDES
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DATA_SAFETY_CONFIG = exports.DEFAULT_DATA_SAFETY = exports.PRESET_LARGE = exports.PRESET_MEDIUM = exports.PRESET_MICRO = exports.PRESET_NANO = void 0;
12
+ exports.getPreset = getPreset;
13
+ /**
14
+ * Default IAM config (empty - VentureKit handles basic permissions)
15
+ */
16
+ const DEFAULT_IAM = {
17
+ managedPolicyArns: [],
18
+ inlineStatements: [],
19
+ };
20
+ /**
21
+ * Default subnet config
22
+ */
23
+ const DEFAULT_SUBNETS = {
24
+ publicSubnets: { cidrMask: 24 },
25
+ privateSubnets: { cidrMask: 24 },
26
+ isolatedSubnets: undefined,
27
+ };
28
+ /**
29
+ * Default security group rules (allow all outbound)
30
+ */
31
+ const DEFAULT_SECURITY_GROUP = {
32
+ lambdaSecurityGroupIngress: [],
33
+ lambdaSecurityGroupEgress: [
34
+ { protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'], description: 'Allow all outbound' },
35
+ ],
36
+ };
37
+ /**
38
+ * NANO preset - Minimal resources for development/testing
39
+ *
40
+ * Use case: Local development, CI/CD testing, proof of concepts
41
+ * Cost: ~$5-15/month
42
+ */
43
+ exports.PRESET_NANO = {
44
+ lambda: {
45
+ memoryMb: 128,
46
+ timeoutSec: 10,
47
+ logRetentionDays: 7,
48
+ reservedConcurrency: undefined,
49
+ provisionedConcurrency: undefined,
50
+ tracingEnabled: false,
51
+ vpcEnabled: false,
52
+ runtime: 'nodejs20.x',
53
+ architecture: 'arm64',
54
+ iam: DEFAULT_IAM,
55
+ environmentVariables: {},
56
+ layers: [],
57
+ },
58
+ api: {
59
+ throttleRateLimit: 10,
60
+ throttleBurstLimit: 20,
61
+ detailedMetricsEnabled: false,
62
+ },
63
+ vpc: {
64
+ maxAzs: 2,
65
+ natGateways: 0,
66
+ cidr: '10.0.0.0/16',
67
+ flowLogsEnabled: false,
68
+ flowLogsRetentionDays: 7,
69
+ ...DEFAULT_SUBNETS,
70
+ enableVpcEndpoints: false,
71
+ ...DEFAULT_SECURITY_GROUP,
72
+ },
73
+ observability: {
74
+ logs: {
75
+ namePattern: '/venturekit/{name}/{env}/{function}',
76
+ streamNamePattern: '{instance}/{timestamp}',
77
+ retentionDays: 7,
78
+ },
79
+ metrics: {
80
+ namespace: 'VentureKit',
81
+ detailedMetricsEnabled: false,
82
+ defaultDimensions: {},
83
+ },
84
+ alarms: {
85
+ enabled: false,
86
+ topicArn: undefined,
87
+ evaluationPeriods: 3,
88
+ periodSec: 60,
89
+ },
90
+ tracing: {
91
+ enabled: false,
92
+ samplingRate: 0.05,
93
+ },
94
+ },
95
+ websocket: {
96
+ enabled: false,
97
+ routeSelectionExpression: '$request.body.action',
98
+ idleTimeoutSec: 600,
99
+ throttleRateLimit: 10,
100
+ throttleBurstLimit: 20,
101
+ },
102
+ };
103
+ /**
104
+ * MICRO preset - Small production workloads
105
+ *
106
+ * Use case: Early-stage startups, low-traffic APIs, internal tools
107
+ * Cost: ~$30-80/month
108
+ */
109
+ exports.PRESET_MICRO = {
110
+ lambda: {
111
+ memoryMb: 256,
112
+ timeoutSec: 10,
113
+ logRetentionDays: 14,
114
+ reservedConcurrency: undefined,
115
+ provisionedConcurrency: undefined,
116
+ tracingEnabled: false,
117
+ vpcEnabled: true,
118
+ runtime: 'nodejs20.x',
119
+ architecture: 'arm64',
120
+ iam: DEFAULT_IAM,
121
+ environmentVariables: {},
122
+ layers: [],
123
+ },
124
+ api: {
125
+ throttleRateLimit: 50,
126
+ throttleBurstLimit: 100,
127
+ detailedMetricsEnabled: false,
128
+ },
129
+ vpc: {
130
+ maxAzs: 2,
131
+ natGateways: 1,
132
+ cidr: '10.0.0.0/16',
133
+ flowLogsEnabled: false,
134
+ flowLogsRetentionDays: 14,
135
+ ...DEFAULT_SUBNETS,
136
+ enableVpcEndpoints: true,
137
+ ...DEFAULT_SECURITY_GROUP,
138
+ },
139
+ observability: {
140
+ logs: {
141
+ namePattern: '/venturekit/{name}/{env}/{function}',
142
+ streamNamePattern: '{instance}/{timestamp}',
143
+ retentionDays: 14,
144
+ },
145
+ metrics: {
146
+ namespace: 'VentureKit',
147
+ detailedMetricsEnabled: false,
148
+ defaultDimensions: {},
149
+ },
150
+ alarms: {
151
+ enabled: false,
152
+ topicArn: undefined,
153
+ evaluationPeriods: 3,
154
+ periodSec: 60,
155
+ },
156
+ tracing: {
157
+ enabled: false,
158
+ samplingRate: 0.1,
159
+ },
160
+ },
161
+ websocket: {
162
+ enabled: false,
163
+ routeSelectionExpression: '$request.body.action',
164
+ idleTimeoutSec: 600,
165
+ throttleRateLimit: 50,
166
+ throttleBurstLimit: 100,
167
+ },
168
+ };
169
+ /**
170
+ * MEDIUM preset - Standard production workloads
171
+ *
172
+ * Use case: Growing startups, moderate traffic, customer-facing APIs
173
+ * Cost: ~$100-300/month
174
+ */
175
+ exports.PRESET_MEDIUM = {
176
+ lambda: {
177
+ memoryMb: 512,
178
+ timeoutSec: 15,
179
+ logRetentionDays: 30,
180
+ reservedConcurrency: undefined,
181
+ provisionedConcurrency: undefined,
182
+ tracingEnabled: true,
183
+ vpcEnabled: true,
184
+ runtime: 'nodejs20.x',
185
+ architecture: 'arm64',
186
+ iam: DEFAULT_IAM,
187
+ environmentVariables: {},
188
+ layers: [],
189
+ },
190
+ api: {
191
+ throttleRateLimit: 100,
192
+ throttleBurstLimit: 200,
193
+ detailedMetricsEnabled: true,
194
+ },
195
+ vpc: {
196
+ maxAzs: 2,
197
+ natGateways: 1,
198
+ cidr: '10.0.0.0/16',
199
+ flowLogsEnabled: true,
200
+ flowLogsRetentionDays: 30,
201
+ ...DEFAULT_SUBNETS,
202
+ isolatedSubnets: { cidrMask: 24 },
203
+ enableVpcEndpoints: true,
204
+ ...DEFAULT_SECURITY_GROUP,
205
+ },
206
+ observability: {
207
+ logs: {
208
+ namePattern: '/venturekit/{name}/{env}/{function}',
209
+ streamNamePattern: '{instance}/{timestamp}',
210
+ retentionDays: 30,
211
+ },
212
+ metrics: {
213
+ namespace: 'VentureKit',
214
+ detailedMetricsEnabled: true,
215
+ defaultDimensions: {},
216
+ },
217
+ alarms: {
218
+ enabled: true,
219
+ topicArn: undefined,
220
+ evaluationPeriods: 3,
221
+ periodSec: 60,
222
+ },
223
+ tracing: {
224
+ enabled: true,
225
+ samplingRate: 0.25,
226
+ },
227
+ },
228
+ websocket: {
229
+ enabled: false,
230
+ routeSelectionExpression: '$request.body.action',
231
+ idleTimeoutSec: 600,
232
+ throttleRateLimit: 100,
233
+ throttleBurstLimit: 200,
234
+ },
235
+ };
236
+ /**
237
+ * LARGE preset - High-traffic production workloads
238
+ *
239
+ * Use case: Scaled startups, high traffic, mission-critical APIs
240
+ * Cost: ~$500+/month
241
+ */
242
+ exports.PRESET_LARGE = {
243
+ lambda: {
244
+ memoryMb: 1024,
245
+ timeoutSec: 30,
246
+ logRetentionDays: 90,
247
+ reservedConcurrency: undefined,
248
+ provisionedConcurrency: undefined,
249
+ tracingEnabled: true,
250
+ vpcEnabled: true,
251
+ runtime: 'nodejs20.x',
252
+ architecture: 'arm64',
253
+ iam: DEFAULT_IAM,
254
+ environmentVariables: {},
255
+ layers: [],
256
+ },
257
+ api: {
258
+ throttleRateLimit: 500,
259
+ throttleBurstLimit: 1000,
260
+ detailedMetricsEnabled: true,
261
+ },
262
+ vpc: {
263
+ maxAzs: 3,
264
+ natGateways: 2,
265
+ cidr: '10.0.0.0/16',
266
+ flowLogsEnabled: true,
267
+ flowLogsRetentionDays: 90,
268
+ ...DEFAULT_SUBNETS,
269
+ isolatedSubnets: { cidrMask: 24 },
270
+ enableVpcEndpoints: true,
271
+ ...DEFAULT_SECURITY_GROUP,
272
+ },
273
+ observability: {
274
+ logs: {
275
+ namePattern: '/venturekit/{name}/{env}/{function}',
276
+ streamNamePattern: '{instance}/{timestamp}',
277
+ retentionDays: 90,
278
+ },
279
+ metrics: {
280
+ namespace: 'VentureKit',
281
+ detailedMetricsEnabled: true,
282
+ defaultDimensions: {},
283
+ },
284
+ alarms: {
285
+ enabled: true,
286
+ topicArn: undefined,
287
+ evaluationPeriods: 3,
288
+ periodSec: 60,
289
+ },
290
+ tracing: {
291
+ enabled: true,
292
+ samplingRate: 0.5,
293
+ },
294
+ },
295
+ websocket: {
296
+ enabled: false,
297
+ routeSelectionExpression: '$request.body.action',
298
+ idleTimeoutSec: 600,
299
+ throttleRateLimit: 500,
300
+ throttleBurstLimit: 1000,
301
+ },
302
+ };
303
+ /**
304
+ * Get preset configuration by name
305
+ */
306
+ function getPreset(preset) {
307
+ switch (preset) {
308
+ case 'nano':
309
+ return exports.PRESET_NANO;
310
+ case 'micro':
311
+ return exports.PRESET_MICRO;
312
+ case 'medium':
313
+ return exports.PRESET_MEDIUM;
314
+ case 'large':
315
+ return exports.PRESET_LARGE;
316
+ default:
317
+ throw new Error(`Unknown preset: ${preset}`);
318
+ }
319
+ }
320
+ /**
321
+ * Default data safety per environment
322
+ */
323
+ exports.DEFAULT_DATA_SAFETY = {
324
+ dev: 'relaxed',
325
+ stage: 'standard',
326
+ prod: 'strict',
327
+ };
328
+ /**
329
+ * Data safety configurations
330
+ */
331
+ exports.DATA_SAFETY_CONFIG = {
332
+ strict: {
333
+ removalPolicy: 'retain',
334
+ deletionProtection: true,
335
+ },
336
+ standard: {
337
+ removalPolicy: 'retain',
338
+ deletionProtection: true,
339
+ },
340
+ relaxed: {
341
+ removalPolicy: 'destroy',
342
+ deletionProtection: false,
343
+ },
344
+ };
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcmVzZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7QUFnVUgsOEJBYUM7QUF6VEQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsR0FBRztJQUNsQixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLGdCQUFnQixFQUFFLEVBQUU7Q0FDckIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUc7SUFDdEIsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtJQUMvQixjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0lBQ2hDLGVBQWUsRUFBRSxTQUFTO0NBQzNCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsMEJBQTBCLEVBQUUsRUFBRTtJQUM5Qix5QkFBeUIsRUFBRTtRQUN6QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRTtLQUN6RztDQUNGLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsV0FBVyxHQUFpQjtJQUN2QyxNQUFNLEVBQUU7UUFDTixRQUFRLEVBQUUsR0FBRztRQUNiLFVBQVUsRUFBRSxFQUFFO1FBQ2QsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuQixtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLHNCQUFzQixFQUFFLFNBQVM7UUFDakMsY0FBYyxFQUFFLEtBQUs7UUFDckIsVUFBVSxFQUFFLEtBQUs7UUFDakIsT0FBTyxFQUFFLFlBQVk7UUFDckIsWUFBWSxFQUFFLE9BQU87UUFDckIsR0FBRyxFQUFFLFdBQVc7UUFDaEIsb0JBQW9CLEVBQUUsRUFBRTtRQUN4QixNQUFNLEVBQUUsRUFBRTtLQUNYO0lBQ0Qs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ZixDQUFDO0FBRUY7O0dBRUc7QUFDVSxRQUFBLGtCQUFrQixHQUcxQjtJQUNILE1BQU0sRUFBRTtRQUNOLGFBQWEsRUFBRSxRQUFRO1FBQ3ZCLGtCQUFrQixFQUFFLElBQUk7S0FDekI7SUFDRCxRQUFRLEVBQUU7UUFDUixhQUFhLEVBQUUsUUFBUTtRQUN2QixrQkFBa0IsRUFBRSxJQUFJO0tBQ3pCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsYUFBYSxFQUFFLFNBQVM7UUFDeEIsa0JBQWtCLEVBQUUsS0FBSztLQUMxQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZlbnR1cmVLaXQgUHJlc2V0c1xuICogXG4gKiBBV1MtbGlrZSBwcmVzZXQgc2l6ZXMgdGhhdCBleHBhbmQgdG8gZXhwbGljaXQgY29uZmlndXJhdGlvbiB2YWx1ZXMuXG4gKiBVc2VycyBjYW4gdXNlIHRoZXNlIGFzIHNob3J0Y3V0cyBhbmQgb3ZlcnJpZGUgc3BlY2lmaWMgZmllbGRzLlxuICogXG4gKiBNZXJnZSBvcmRlcjogUFJFU0VUIOKGkCBVU0VSX09WRVJSSURFU1xuICovXG5cbmltcG9ydCB7IExhbWJkYUVudkNvbmZpZyB9IGZyb20gJy4vdHlwZXMvbGFtYmRhJztcbmltcG9ydCB7IEFwaUVudkNvbmZpZyB9IGZyb20gJy4vdHlwZXMvYXBpJztcbmltcG9ydCB7IFZwY0VudkNvbmZpZyB9IGZyb20gJy4vdHlwZXMvdnBjJztcbmltcG9ydCB7IE9ic2VydmFiaWxpdHlFbnZDb25maWcgfSBmcm9tICcuL3R5cGVzL29ic2VydmFiaWxpdHknO1xuaW1wb3J0IHsgV2ViU29ja2V0RW52Q29uZmlnIH0gZnJvbSAnLi90eXBlcy93ZWJzb2NrZXQnO1xuaW1wb3J0IHsgUHJlc2V0LCBEYXRhU2FmZXR5IH0gZnJvbSAnLi90eXBlcy9lbnYnO1xuXG4vKipcbiAqIFByZXNldCBjb25maWd1cmF0aW9uIChmdWxseSBzcGVjaWZpZWQsIG5vIG9wdGlvbmFscylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRDb25maWcge1xuICBsYW1iZGE6IExhbWJkYUVudkNvbmZpZztcbiAgYXBpOiBPbWl0PEFwaUVudkNvbmZpZywgJ2NvcnMnIHwgJ2N1c3RvbURvbWFpbic+O1xuICB2cGM6IFZwY0VudkNvbmZpZztcbiAgb2JzZXJ2YWJpbGl0eTogT2JzZXJ2YWJpbGl0eUVudkNvbmZpZztcbiAgd2Vic29ja2V0OiBXZWJTb2NrZXRFbnZDb25maWc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBJQU0gY29uZmlnIChlbXB0eSAtIFZlbnR1cmVLaXQgaGFuZGxlcyBiYXNpYyBwZXJtaXNzaW9ucylcbiAqL1xuY29uc3QgREVGQVVMVF9JQU0gPSB7XG4gIG1hbmFnZWRQb2xpY3lBcm5zOiBbXSxcbiAgaW5saW5lU3RhdGVtZW50czogW10sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgc3VibmV0IGNvbmZpZ1xuICovXG5jb25zdCBERUZBVUxUX1NVQk5FVFMgPSB7XG4gIHB1YmxpY1N1Ym5ldHM6IHsgY2lkck1hc2s6IDI0IH0sXG4gIHByaXZhdGVTdWJuZXRzOiB7IGNpZHJNYXNrOiAyNCB9LFxuICBpc29sYXRlZFN1Ym5ldHM6IHVuZGVmaW5lZCxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZWN1cml0eSBncm91cCBydWxlcyAoYWxsb3cgYWxsIG91dGJvdW5kKVxuICovXG5jb25zdCBERUZBVUxUX1NFQ1VSSVRZX0dST1VQID0ge1xuICBsYW1iZGFTZWN1cml0eUdyb3VwSW5ncmVzczogW10sXG4gIGxhbWJkYVNlY3VyaXR5R3JvdXBFZ3Jlc3M6IFtcbiAgICB7IHByb3RvY29sOiAnLTEnLCBmcm9tUG9ydDogMCwgdG9Qb3J0OiAwLCBjaWRyQmxvY2tzOiBbJzAuMC4wLjAvMCddLCBkZXNjcmlwdGlvbjogJ0FsbG93IGFsbCBvdXRib3VuZCcgfSxcbiAgXSxcbn07XG5cbi8qKlxuICogTkFOTyBwcmVzZXQgLSBNaW5pbWFsIHJlc291cmNlcyBmb3IgZGV2ZWxvcG1lbnQvdGVzdGluZ1xuICogXG4gKiBVc2UgY2FzZTogTG9jYWwgZGV2ZWxvcG1lbnQsIENJL0NEIHRlc3RpbmcsIHByb29mIG9mIGNvbmNlcHRzXG4gKiBDb3N0OiB+JDUtMTUvbW9udGhcbiAqL1xuZXhwb3J0IGNvbnN0IFBSRVNFVF9OQU5POiBQcmVzZXRDb25maWcgPSB7XG4gIGxhbWJkYToge1xuICAgIG1lbW9yeU1iOiAxMjgsXG4gICAgdGltZW91dFNlYzogMTAsXG4gICAgbG9nUmV0ZW50aW9uRGF5czogNyxcbiAgICByZXNlcnZlZENvbmN1cnJlbmN5OiB1bmRlZmluZWQsXG4gICAgcHJvdmlzaW9uZWRDb25jdXJyZW5jeTogdW5kZWZpbmVkLFxuICAgIHRyYWNpbmdFbmFibGVkOiBmYWxzZSxcbiAgICB2cGNFbmFibGVkOiBmYWxzZSxcbiAgICBydW50aW1lOiAnbm9kZWpzMjAueCcsXG4gICAgYXJjaGl0ZWN0dXJlOiAnYXJtNjQnLFxuICAgIGlhbTogREVGQVVMVF9JQU0sXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHt9LFxuICAgIGxheWVyczogW10sXG4gIH0sXG4gIGFwaToge1xuICAgIHRocm90dGxlUmF0ZUxpbWl0OiAxMCxcbiAgICB0aHJvdHRsZUJ1cnN0TGltaXQ6IDIwLFxuICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IGZhbHNlLFxuICB9LFxuICB2cGM6IHtcbiAgICBtYXhBenM6IDIsXG4gICAgbmF0R2F0ZXdheXM6IDAsXG4gICAgY2lkcjogJzEwLjAuMC4wLzE2JyxcbiAgICBmbG93TG9nc0VuYWJsZWQ6IGZhbHNlLFxuICAgIGZsb3dMb2dzUmV0ZW50aW9uRGF5czogNyxcbiAgICAuLi5ERUZBVUxUX1NVQk5FVFMsXG4gICAgZW5hYmxlVnBjRW5kcG9pbnRzOiBmYWxzZSxcbiAgICAuLi5ERUZBVUxUX1NFQ1VSSVRZX0dST1VQLFxuICB9LFxuICBvYnNlcnZhYmlsaXR5OiB7XG4gICAgbG9nczoge1xuICAgICAgbmFtZVBhdHRlcm46ICcvdmVudHVyZWtpdC97bmFtZX0ve2Vudn0ve2Z1bmN0aW9ufScsXG4gICAgICBzdHJlYW1OYW1lUGF0dGVybjogJ3tpbnN0YW5jZX0ve3RpbWVzdGFtcH0nLFxuICAgICAgcmV0ZW50aW9uRGF5czogNyxcbiAgICB9LFxuICAgIG1ldHJpY3M6IHtcbiAgICAgIG5hbWVzcGFjZTogJ1ZlbnR1cmVLaXQnLFxuICAgICAgZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDogZmFsc2UsXG4gICAgICBkZWZhdWx0RGltZW5zaW9uczoge30sXG4gICAgfSxcbiAgICBhbGFybXM6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgdG9waWNBcm46IHVuZGVmaW5lZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAzLFxuICAgICAgcGVyaW9kU2VjOiA2MCxcbiAgICB9LFxuICAgIHRyYWNpbmc6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgc2FtcGxpbmdSYXRlOiAwLjA1LFxuICAgIH0sXG4gIH0sXG4gIHdlYnNvY2tldDoge1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHJvdXRlU2VsZWN0aW9uRXhwcmVzc2lvbjogJyRyZXF1ZXN0LmJvZHkuYWN0aW9uJyxcbiAgICBpZGxlVGltZW91dFNlYzogNjAwLFxuICAgIHRocm90dGxlUmF0ZUxpbWl0OiAxMCxcbiAgICB0aHJvdHRsZUJ1cnN0TGltaXQ6IDIwLFxuICB9LFxufTtcblxuLyoqXG4gKiBNSUNSTyBwcmVzZXQgLSBTbWFsbCBwcm9kdWN0aW9uIHdvcmtsb2Fkc1xuICogXG4gKiBVc2UgY2FzZTogRWFybHktc3RhZ2Ugc3RhcnR1cHMsIGxvdy10cmFmZmljIEFQSXMsIGludGVybmFsIHRvb2xzXG4gKiBDb3N0OiB+JDMwLTgwL21vbnRoXG4gKi9cbmV4cG9ydCBjb25zdCBQUkVTRVRfTUlDUk86IFByZXNldENvbmZpZyA9IHtcbiAgbGFtYmRhOiB7XG4gICAgbWVtb3J5TWI6IDI1NixcbiAgICB0aW1lb3V0U2VjOiAxMCxcbiAgICBsb2dSZXRlbnRpb25EYXlzOiAxNCxcbiAgICByZXNlcnZlZENvbmN1cnJlbmN5OiB1bmRlZmluZWQsXG4gICAgcHJvdmlzaW9uZWRDb25jdXJyZW5jeTogdW5kZWZpbmVkLFxuICAgIHRyYWNpbmdFbmFibGVkOiBmYWxzZSxcbiAgICB2cGNFbmFibGVkOiB0cnVlLFxuICAgIHJ1bnRpbWU6ICdub2RlanMyMC54JyxcbiAgICBhcmNoaXRlY3R1cmU6ICdhcm02NCcsXG4gICAgaWFtOiBERUZBVUxUX0lBTSxcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlczoge30sXG4gICAgbGF5ZXJzOiBbXSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgdGhyb3R0bGVSYXRlTGltaXQ6IDUwLFxuICAgIHRocm90dGxlQnVyc3RMaW1pdDogMTAwLFxuICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IGZhbHNlLFxuICB9LFxuICB2cGM6IHtcbiAgICBtYXhBenM6IDIsXG4gICAgbmF0R2F0ZXdheXM6IDEsXG4gICAgY2lkcjogJzEwLjAuMC4wLzE2JyxcbiAgICBmbG93TG9nc0VuYWJsZWQ6IGZhbHNlLFxuICAgIGZsb3dMb2dzUmV0ZW50aW9uRGF5czogMTQsXG4gICAgLi4uREVGQVVMVF9TVUJORVRTLFxuICAgIGVuYWJsZVZwY0VuZHBvaW50czogdHJ1ZSxcbiAgICAuLi5ERUZBVUxUX1NFQ1VSSVRZX0dST1VQLFxuICB9LFxuICBvYnNlcnZhYmlsaXR5OiB7XG4gICAgbG9nczoge1xuICAgICAgbmFtZVBhdHRlcm46ICcvdmVudHVyZWtpdC97bmFtZX0ve2Vudn0ve2Z1bmN0aW9ufScsXG4gICAgICBzdHJlYW1OYW1lUGF0dGVybjogJ3tpbnN0YW5jZX0ve3RpbWVzdGFtcH0nLFxuICAgICAgcmV0ZW50aW9uRGF5czogMTQsXG4gICAgfSxcbiAgICBtZXRyaWNzOiB7XG4gICAgICBuYW1lc3BhY2U6ICdWZW50dXJlS2l0JyxcbiAgICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdERpbWVuc2lvbnM6IHt9LFxuICAgIH0sXG4gICAgYWxhcm1zOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIHRvcGljQXJuOiB1bmRlZmluZWQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMyxcbiAgICAgIHBlcmlvZFNlYzogNjAsXG4gICAgfSxcbiAgICB0cmFjaW5nOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIHNhbXBsaW5nUmF0ZTogMC4xLFxuICAgIH0sXG4gIH0sXG4gIHdlYnNvY2tldDoge1xuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHJvdXRlU2VsZWN0aW9uRXhwcmVzc2lvbjogJyRyZXF1ZXN0LmJvZHkuYWN0aW9uJyxcbiAgICBpZGxlVGltZW91dFNlYzogNjAwLFxuICAgIHRocm90dGxlUmF0ZUxpbWl0OiA1MCxcbiAgICB0aHJvdHRsZUJ1cnN0TGltaXQ6IDEwMCxcbiAgfSxcbn07XG5cbi8qKlxuICogTUVESVVNIHByZXNldCAtIFN0YW5kYXJkIHByb2R1Y3Rpb24gd29ya2xvYWRzXG4gKiBcbiAqIFVzZSBjYXNlOiBHcm93aW5nIHN0YXJ0dXBzLCBtb2RlcmF0ZSB0cmFmZmljLCBjdXN0b21lci1mYWNpbmcgQVBJc1xuICogQ29zdDogfiQxMDAtMzAwL21vbnRoXG4gKi9cbmV4cG9ydCBjb25zdCBQUkVTRVRfTUVESVVNOiBQcmVzZXRDb25maWcgPSB7XG4gIGxhbWJkYToge1xuICAgIG1lbW9yeU1iOiA1MTIsXG4gICAgdGltZW91dFNlYzogMTUsXG4gICAgbG9nUmV0ZW50aW9uRGF5czogMzAsXG4gICAgcmVzZXJ2ZWRDb25jdXJyZW5jeTogdW5kZWZpbmVkLFxuICAgIHByb3Zpc2lvbmVkQ29uY3VycmVuY3k6IHVuZGVmaW5lZCxcbiAgICB0cmFjaW5nRW5hYmxlZDogdHJ1ZSxcbiAgICB2cGNFbmFibGVkOiB0cnVlLFxuICAgIHJ1bnRpbWU6ICdub2RlanMyMC54JyxcbiAgICBhcmNoaXRlY3R1cmU6ICdhcm02NCcsXG4gICAgaWFtOiBERUZBVUxUX0lBTSxcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlczoge30sXG4gICAgbGF5ZXJzOiBbXSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgdGhyb3R0bGVSYXRlTGltaXQ6IDEwMCxcbiAgICB0aHJvdHRsZUJ1cnN0TGltaXQ6IDIwMCxcbiAgICBkZXRhaWxlZE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICB9LFxuICB2cGM6IHtcbiAgICBtYXhBenM6IDIsXG4gICAgbmF0R2F0ZXdheXM6IDEsXG4gICAgY2lkcjogJzEwLjAuMC4wLzE2JyxcbiAgICBmbG93TG9nc0VuYWJsZWQ6IHRydWUsXG4gICAgZmxvd0xvZ3NSZXRlbnRpb25EYXlzOiAzMCxcbiAgICAuLi5ERUZBVUxUX1NVQk5FVFMsXG4gICAgaXNvbGF0ZWRTdWJuZXRzOiB7IGNpZHJNYXNrOiAyNCB9LFxuICAgIGVuYWJsZVZwY0VuZHBvaW50czogdHJ1ZSxcbiAgICAuLi5ERUZBVUxUX1NFQ1VSSVRZX0dST1VQLFxuICB9LFxuICBvYnNlcnZhYmlsaXR5OiB7XG4gICAgbG9nczoge1xuICAgICAgbmFtZVBhdHRlcm46ICcvdmVudHVyZWtpdC97bmFtZX0ve2Vudn0ve2Z1bmN0aW9ufScsXG4gICAgICBzdHJlYW1OYW1lUGF0dGVybjogJ3tpbnN0YW5jZX0ve3RpbWVzdGFtcH0nLFxuICAgICAgcmV0ZW50aW9uRGF5czogMzAsXG4gICAgfSxcbiAgICBtZXRyaWNzOiB7XG4gICAgICBuYW1lc3BhY2U6ICdWZW50dXJlS2l0JyxcbiAgICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICBkZWZhdWx0RGltZW5zaW9uczoge30sXG4gICAgfSxcbiAgICBhbGFybXM6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB0b3BpY0FybjogdW5kZWZpbmVkLFxuICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDMsXG4gICAgICBwZXJpb2RTZWM6IDYwLFxuICAgIH0sXG4gICAgdHJhY2luZzoge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHNhbXBsaW5nUmF0ZTogMC4yNSxcbiAgICB9LFxuICB9LFxuICB3ZWJzb2NrZXQ6IHtcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICByb3V0ZVNlbGVjdGlvbkV4cHJlc3Npb246ICckcmVxdWVzdC5ib2R5LmFjdGlvbicsXG4gICAgaWRsZVRpbWVvdXRTZWM6IDYwMCxcbiAgICB0aHJvdHRsZVJhdGVMaW1pdDogMTAwLFxuICAgIHRocm90dGxlQnVyc3RMaW1pdDogMjAwLFxuICB9LFxufTtcblxuLyoqXG4gKiBMQVJHRSBwcmVzZXQgLSBIaWdoLXRyYWZmaWMgcHJvZHVjdGlvbiB3b3JrbG9hZHNcbiAqIFxuICogVXNlIGNhc2U6IFNjYWxlZCBzdGFydHVwcywgaGlnaCB0cmFmZmljLCBtaXNzaW9uLWNyaXRpY2FsIEFQSXNcbiAqIENvc3Q6IH4kNTAwKy9tb250aFxuICovXG5leHBvcnQgY29uc3QgUFJFU0VUX0xBUkdFOiBQcmVzZXRDb25maWcgPSB7XG4gIGxhbWJkYToge1xuICAgIG1lbW9yeU1iOiAxMDI0LFxuICAgIHRpbWVvdXRTZWM6IDMwLFxuICAgIGxvZ1JldGVudGlvbkRheXM6IDkwLFxuICAgIHJlc2VydmVkQ29uY3VycmVuY3k6IHVuZGVmaW5lZCxcbiAgICBwcm92aXNpb25lZENvbmN1cnJlbmN5OiB1bmRlZmluZWQsXG4gICAgdHJhY2luZ0VuYWJsZWQ6IHRydWUsXG4gICAgdnBjRW5hYmxlZDogdHJ1ZSxcbiAgICBydW50aW1lOiAnbm9kZWpzMjAueCcsXG4gICAgYXJjaGl0ZWN0dXJlOiAnYXJtNjQnLFxuICAgIGlhbTogREVGQVVMVF9JQU0sXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHt9LFxuICAgIGxheWVyczogW10sXG4gIH0sXG4gIGFwaToge1xuICAgIHRocm90dGxlUmF0ZUxpbWl0OiA1MDAsXG4gICAgdGhyb3R0bGVCdXJzdExpbWl0OiAxMDAwLFxuICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gIH0sXG4gIHZwYzoge1xuICAgIG1heEF6czogMyxcbiAgICBuYXRHYXRld2F5czogMixcbiAgICBjaWRyOiAnMTAuMC4wLjAvMTYnLFxuICAgIGZsb3dMb2dzRW5hYmxlZDogdHJ1ZSxcbiAgICBmbG93TG9nc1JldGVudGlvbkRheXM6IDkwLFxuICAgIC4uLkRFRkFVTFRfU1VCTkVUUyxcbiAgICBpc29sYXRlZFN1Ym5ldHM6IHsgY2lkck1hc2s6IDI0IH0sXG4gICAgZW5hYmxlVnBjRW5kcG9pbnRzOiB0cnVlLFxuICAgIC4uLkRFRkFVTFRfU0VDVVJJVFlfR1JPVVAsXG4gIH0sXG4gIG9ic2VydmFiaWxpdHk6IHtcbiAgICBsb2dzOiB7XG4gICAgICBuYW1lUGF0dGVybjogJy92ZW50dXJla2l0L3tuYW1lfS97ZW52fS97ZnVuY3Rpb259JyxcbiAgICAgIHN0cmVhbU5hbWVQYXR0ZXJuOiAne2luc3RhbmNlfS97dGltZXN0YW1wfScsXG4gICAgICByZXRlbnRpb25EYXlzOiA5MCxcbiAgICB9LFxuICAgIG1ldHJpY3M6IHtcbiAgICAgIG5hbWVzcGFjZTogJ1ZlbnR1cmVLaXQnLFxuICAgICAgZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGRlZmF1bHREaW1lbnNpb25zOiB7fSxcbiAgICB9LFxuICAgIGFsYXJtczoge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHRvcGljQXJuOiB1bmRlZmluZWQsXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMyxcbiAgICAgIHBlcmlvZFNlYzogNjAsXG4gICAgfSxcbiAgICB0cmFjaW5nOiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgc2FtcGxpbmdSYXRlOiAwLjUsXG4gICAgfSxcbiAgfSxcbiAgd2Vic29ja2V0OiB7XG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgcm91dGVTZWxlY3Rpb25FeHByZXNzaW9uOiAnJHJlcXVlc3QuYm9keS5hY3Rpb24nLFxuICAgIGlkbGVUaW1lb3V0U2VjOiA2MDAsXG4gICAgdGhyb3R0bGVSYXRlTGltaXQ6IDUwMCxcbiAgICB0aHJvdHRsZUJ1cnN0TGltaXQ6IDEwMDAsXG4gIH0sXG59O1xuXG4vKipcbiAqIEdldCBwcmVzZXQgY29uZmlndXJhdGlvbiBieSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVzZXQocHJlc2V0OiBQcmVzZXQpOiBQcmVzZXRDb25maWcge1xuICBzd2l0Y2ggKHByZXNldCkge1xuICAgIGNhc2UgJ25hbm8nOlxuICAgICAgcmV0dXJuIFBSRVNFVF9OQU5PO1xuICAgIGNhc2UgJ21pY3JvJzpcbiAgICAgIHJldHVybiBQUkVTRVRfTUlDUk87XG4gICAgY2FzZSAnbWVkaXVtJzpcbiAgICAgIHJldHVybiBQUkVTRVRfTUVESVVNO1xuICAgIGNhc2UgJ2xhcmdlJzpcbiAgICAgIHJldHVybiBQUkVTRVRfTEFSR0U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcmVzZXQ6ICR7cHJlc2V0fWApO1xuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCBkYXRhIHNhZmV0eSBwZXIgZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfREFUQV9TQUZFVFk6IFJlY29yZDxzdHJpbmcsIERhdGFTYWZldHk+ID0ge1xuICBkZXY6ICdyZWxheGVkJyxcbiAgc3RhZ2U6ICdzdGFuZGFyZCcsXG4gIHByb2Q6ICdzdHJpY3QnLFxufTtcblxuLyoqXG4gKiBEYXRhIHNhZmV0eSBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgREFUQV9TQUZFVFlfQ09ORklHOiBSZWNvcmQ8RGF0YVNhZmV0eSwgeyBcbiAgcmVtb3ZhbFBvbGljeTogJ3JldGFpbicgfCAnZGVzdHJveSc7XG4gIGRlbGV0aW9uUHJvdGVjdGlvbjogYm9vbGVhbjtcbn0+ID0ge1xuICBzdHJpY3Q6IHtcbiAgICByZW1vdmFsUG9saWN5OiAncmV0YWluJyxcbiAgICBkZWxldGlvblByb3RlY3Rpb246IHRydWUsXG4gIH0sXG4gIHN0YW5kYXJkOiB7XG4gICAgcmVtb3ZhbFBvbGljeTogJ3JldGFpbicsXG4gICAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlLFxuICB9LFxuICByZWxheGVkOiB7XG4gICAgcmVtb3ZhbFBvbGljeTogJ2Rlc3Ryb3knLFxuICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogZmFsc2UsXG4gIH0sXG59O1xuIl19
@@ -0,0 +1,28 @@
1
+ /**
2
+ * VentureKit Configuration Resolution
3
+ *
4
+ * Merges base config + env config input into a fully resolved configuration.
5
+ *
6
+ * Merge order: PRESET ← USER_OVERRIDES
7
+ *
8
+ * This ensures:
9
+ * - Presets provide sensible defaults
10
+ * - Users can override any specific field
11
+ * - Final config has no undefined values (except where explicitly typed)
12
+ */
13
+ import { BaseConfig } from './types/base';
14
+ import { SecurityConfig } from './types/security';
15
+ import { EnvConfig, EnvConfigInput, Environment } from './types/env';
16
+ import { ResolvedConfig } from './types/resolved';
17
+ /**
18
+ * Resolve environment configuration
19
+ *
20
+ * Takes user input and produces a fully resolved EnvConfig.
21
+ */
22
+ export declare function resolveEnvConfig(env: Environment, input: EnvConfigInput): EnvConfig;
23
+ /**
24
+ * Resolve full configuration
25
+ *
26
+ * Merges base config + security config + env config into a complete ResolvedConfig.
27
+ */
28
+ export declare function resolveConfig(base: BaseConfig, security: SecurityConfig, env: Environment, envInput: EnvConfigInput): ResolvedConfig;
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * VentureKit Configuration Resolution
4
+ *
5
+ * Merges base config + env config input into a fully resolved configuration.
6
+ *
7
+ * Merge order: PRESET ← USER_OVERRIDES
8
+ *
9
+ * This ensures:
10
+ * - Presets provide sensible defaults
11
+ * - Users can override any specific field
12
+ * - Final config has no undefined values (except where explicitly typed)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.resolveEnvConfig = resolveEnvConfig;
16
+ exports.resolveConfig = resolveConfig;
17
+ const presets_1 = require("./presets");
18
+ /**
19
+ * Resolve Lambda configuration
20
+ */
21
+ function resolveLambda(preset, input) {
22
+ if (!input)
23
+ return preset.lambda;
24
+ const { iam, ...rest } = input;
25
+ return {
26
+ ...preset.lambda,
27
+ ...rest,
28
+ iam: iam ? {
29
+ managedPolicyArns: iam.managedPolicyArns ?? preset.lambda.iam.managedPolicyArns,
30
+ inlineStatements: iam.inlineStatements ?? preset.lambda.iam.inlineStatements,
31
+ } : preset.lambda.iam,
32
+ };
33
+ }
34
+ /**
35
+ * Resolve API configuration
36
+ */
37
+ function resolveApi(preset, input) {
38
+ const base = {
39
+ ...preset.api,
40
+ cors: undefined,
41
+ customDomain: undefined,
42
+ };
43
+ if (!input)
44
+ return base;
45
+ const { cors, customDomain, ...rest } = input;
46
+ const result = { ...base, ...rest };
47
+ // Handle CORS separately (partial merge)
48
+ if (cors) {
49
+ const defaultCors = {
50
+ allowOrigins: ['*'],
51
+ allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
52
+ allowHeaders: ['Content-Type', 'Authorization'],
53
+ allowCredentials: false,
54
+ maxAgeSec: 86400,
55
+ };
56
+ result.cors = { ...defaultCors, ...cors };
57
+ }
58
+ // Custom domain is all-or-nothing
59
+ if (customDomain) {
60
+ result.customDomain = customDomain;
61
+ }
62
+ return result;
63
+ }
64
+ /**
65
+ * Resolve VPC configuration
66
+ */
67
+ function resolveVpc(preset, input) {
68
+ if (!input)
69
+ return preset.vpc;
70
+ const { publicSubnets, privateSubnets, isolatedSubnets, ...rest } = input;
71
+ const result = { ...preset.vpc, ...rest };
72
+ if (publicSubnets) {
73
+ result.publicSubnets = { ...preset.vpc.publicSubnets, ...publicSubnets };
74
+ }
75
+ if (privateSubnets) {
76
+ result.privateSubnets = { ...preset.vpc.privateSubnets, ...privateSubnets };
77
+ }
78
+ if (isolatedSubnets !== undefined) {
79
+ if (isolatedSubnets && preset.vpc.isolatedSubnets) {
80
+ result.isolatedSubnets = { ...preset.vpc.isolatedSubnets, ...isolatedSubnets };
81
+ }
82
+ else if (isolatedSubnets) {
83
+ result.isolatedSubnets = { cidrMask: isolatedSubnets.cidrMask ?? 24 };
84
+ }
85
+ else {
86
+ result.isolatedSubnets = undefined;
87
+ }
88
+ }
89
+ return result;
90
+ }
91
+ /**
92
+ * Resolve Observability configuration
93
+ */
94
+ function resolveObservability(preset, input) {
95
+ if (!input)
96
+ return preset.observability;
97
+ const { logs, metrics, alarms, tracing, ...shorthands } = input;
98
+ // Start with preset
99
+ const result = { ...preset.observability };
100
+ // Apply nested configs
101
+ if (logs) {
102
+ result.logs = { ...result.logs, ...logs };
103
+ }
104
+ if (metrics) {
105
+ result.metrics = { ...result.metrics, ...metrics };
106
+ }
107
+ if (alarms) {
108
+ result.alarms = { ...result.alarms, ...alarms };
109
+ }
110
+ if (tracing) {
111
+ result.tracing = { ...result.tracing, ...tracing };
112
+ }
113
+ // Apply shorthands
114
+ if (shorthands.alarmsEnabled !== undefined) {
115
+ result.alarms.enabled = shorthands.alarmsEnabled;
116
+ }
117
+ if (shorthands.tracingEnabled !== undefined) {
118
+ result.tracing.enabled = shorthands.tracingEnabled;
119
+ }
120
+ if (shorthands.logRetentionDays !== undefined) {
121
+ result.logs.retentionDays = shorthands.logRetentionDays;
122
+ }
123
+ if (shorthands.detailedMetricsEnabled !== undefined) {
124
+ result.metrics.detailedMetricsEnabled = shorthands.detailedMetricsEnabled;
125
+ }
126
+ return result;
127
+ }
128
+ /**
129
+ * Resolve WebSocket configuration
130
+ */
131
+ function resolveWebSocket(preset, input) {
132
+ if (!input)
133
+ return preset.websocket;
134
+ return { ...preset.websocket, ...input };
135
+ }
136
+ /**
137
+ * Resolve environment configuration
138
+ *
139
+ * Takes user input and produces a fully resolved EnvConfig.
140
+ */
141
+ function resolveEnvConfig(env, input) {
142
+ // Determine preset (default to 'micro' if not specified)
143
+ const presetName = input.preset ?? 'micro';
144
+ const preset = (0, presets_1.getPreset)(presetName);
145
+ // Determine data safety (default based on environment)
146
+ const dataSafety = input.dataSafety ?? presets_1.DEFAULT_DATA_SAFETY[env];
147
+ return {
148
+ env,
149
+ dataSafety,
150
+ lambda: resolveLambda(preset, input.lambda),
151
+ api: resolveApi(preset, input.api),
152
+ vpc: resolveVpc(preset, input.vpc),
153
+ observability: resolveObservability(preset, input.observability),
154
+ websocket: resolveWebSocket(preset, input.websocket),
155
+ };
156
+ }
157
+ /**
158
+ * Resolve full configuration
159
+ *
160
+ * Merges base config + security config + env config into a complete ResolvedConfig.
161
+ */
162
+ function resolveConfig(base, security, env, envInput) {
163
+ const envConfig = resolveEnvConfig(env, envInput);
164
+ return {
165
+ // From base
166
+ name: base.name,
167
+ displayName: base.displayName,
168
+ region: base.region,
169
+ // From security
170
+ scopes: security.scopes,
171
+ appClients: security.appClients,
172
+ // From env
173
+ env: envConfig.env,
174
+ dataSafety: envConfig.dataSafety,
175
+ lambda: envConfig.lambda,
176
+ api: envConfig.api,
177
+ vpc: envConfig.vpc,
178
+ observability: envConfig.observability,
179
+ websocket: envConfig.websocket,
180
+ // Auto-generated
181
+ tags: {
182
+ Project: base.name,
183
+ Environment: env,
184
+ ManagedBy: 'venturekit',
185
+ },
186
+ };
187
+ }
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7QUFzS0gsNENBb0JDO0FBT0Qsc0NBa0NDO0FBeE5ELHVDQUF5RTtBQUV6RTs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUNwQixNQUFvQixFQUNwQixLQUErQjtJQUUvQixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUVqQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRS9CLE9BQU87UUFDTCxHQUFHLE1BQU0sQ0FBQyxNQUFNO1FBQ2hCLEdBQUcsSUFBSTtRQUNQLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ1QsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQjtZQUMvRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCO1NBQzdFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxVQUFVLENBQ2pCLE1BQW9CLEVBQ3BCLEtBQTRCO0lBRTVCLE1BQU0sSUFBSSxHQUFpQjtRQUN6QixHQUFHLE1BQU0sQ0FBQyxHQUFHO1FBQ2IsSUFBSSxFQUFFLFNBQVM7UUFDZixZQUFZLEVBQUUsU0FBUztLQUN4QixDQUFDO0lBRUYsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV4QixNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztJQUU5QyxNQUFNLE1BQU0s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QUksQ0FBQyxNQUFNO1FBRW5CLGdCQUFnQjtRQUNoQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBRS9CLFdBQVc7UUFDWCxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUc7UUFDbEIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1FBQ2hDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtRQUN4QixHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUc7UUFDbEIsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1FBQ2xCLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYTtRQUN0QyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFFOUIsaUJBQWlCO1FBQ2pCLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNsQixXQUFXLEVBQUUsR0FBRztZQUNoQixTQUFTLEVBQUUsWUFBWTtTQUN4QjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZW50dXJlS2l0IENvbmZpZ3VyYXRpb24gUmVzb2x1dGlvblxuICogXG4gKiBNZXJnZXMgYmFzZSBjb25maWcgKyBlbnYgY29uZmlnIGlucHV0IGludG8gYSBmdWxseSByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICogXG4gKiBNZXJnZSBvcmRlcjogUFJFU0VUIOKGkCBVU0VSX09WRVJSSURFU1xuICogXG4gKiBUaGlzIGVuc3VyZXM6XG4gKiAtIFByZXNldHMgcHJvdmlkZSBzZW5zaWJsZSBkZWZhdWx0c1xuICogLSBVc2VycyBjYW4gb3ZlcnJpZGUgYW55IHNwZWNpZmljIGZpZWxkXG4gKiAtIEZpbmFsIGNvbmZpZyBoYXMgbm8gdW5kZWZpbmVkIHZhbHVlcyAoZXhjZXB0IHdoZXJlIGV4cGxpY2l0bHkgdHlwZWQpXG4gKi9cblxuaW1wb3J0IHsgQmFzZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMvYmFzZSc7XG5pbXBvcnQgeyBTZWN1cml0eUNvbmZpZyB9IGZyb20gJy4vdHlwZXMvc2VjdXJpdHknO1xuaW1wb3J0IHsgRW52Q29uZmlnLCBFbnZDb25maWdJbnB1dCwgRW52aXJvbm1lbnQsIERhdGFTYWZldHkgfSBmcm9tICcuL3R5cGVzL2Vudic7XG5pbXBvcnQgeyBMYW1iZGFFbnZDb25maWcgfSBmcm9tICcuL3R5cGVzL2xhbWJkYSc7XG5pbXBvcnQgeyBBcGlFbnZDb25maWcsIENvcnNDb25maWcgfSBmcm9tICcuL3R5cGVzL2FwaSc7XG5pbXBvcnQgeyBWcGNFbnZDb25maWcgfSBmcm9tICcuL3R5cGVzL3ZwYyc7XG5pbXBvcnQgeyBPYnNlcnZhYmlsaXR5RW52Q29uZmlnIH0gZnJvbSAnLi90eXBlcy9vYnNlcnZhYmlsaXR5JztcbmltcG9ydCB7IFdlYlNvY2tldEVudkNvbmZpZyB9IGZyb20gJy4vdHlwZXMvd2Vic29ja2V0JztcbmltcG9ydCB7IFJlc29sdmVkQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9yZXNvbHZlZCc7XG5pbXBvcnQgeyBnZXRQcmVzZXQsIERFRkFVTFRfREFUQV9TQUZFVFksIFByZXNldENvbmZpZyB9IGZyb20gJy4vcHJlc2V0cyc7XG5cbi8qKlxuICogUmVzb2x2ZSBMYW1iZGEgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiByZXNvbHZlTGFtYmRhKFxuICBwcmVzZXQ6IFByZXNldENvbmZpZyxcbiAgaW5wdXQ6IEVudkNvbmZpZ0lucHV0WydsYW1iZGEnXVxuKTogTGFtYmRhRW52Q29uZmlnIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIHByZXNldC5sYW1iZGE7XG4gIFxuICBjb25zdCB7IGlhbSwgLi4ucmVzdCB9ID0gaW5wdXQ7XG4gIFxuICByZXR1cm4ge1xuICAgIC4uLnByZXNldC5sYW1iZGEsXG4gICAgLi4ucmVzdCxcbiAgICBpYW06IGlhbSA/IHtcbiAgICAgIG1hbmFnZWRQb2xpY3lBcm5zOiBpYW0ubWFuYWdlZFBvbGljeUFybnMgPz8gcHJlc2V0LmxhbWJkYS5pYW0ubWFuYWdlZFBvbGljeUFybnMsXG4gICAgICBpbmxpbmVTdGF0ZW1lbnRzOiBpYW0uaW5saW5lU3RhdGVtZW50cyA/PyBwcmVzZXQubGFtYmRhLmlhbS5pbmxpbmVTdGF0ZW1lbnRzLFxuICAgIH0gOiBwcmVzZXQubGFtYmRhLmlhbSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIEFQSSBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBcGkoXG4gIHByZXNldDogUHJlc2V0Q29uZmlnLFxuICBpbnB1dDogRW52Q29uZmlnSW5wdXRbJ2FwaSddXG4pOiBBcGlFbnZDb25maWcge1xuICBjb25zdCBiYXNlOiBBcGlFbnZDb25maWcgPSB7XG4gICAgLi4ucHJlc2V0LmFwaSxcbiAgICBjb3JzOiB1bmRlZmluZWQsXG4gICAgY3VzdG9tRG9tYWluOiB1bmRlZmluZWQsXG4gIH07XG4gIFxuICBpZiAoIWlucHV0KSByZXR1cm4gYmFzZTtcbiAgXG4gIGNvbnN0IHsgY29ycywgY3VzdG9tRG9tYWluLCAuLi5yZXN0IH0gPSBpbnB1dDtcbiAgXG4gIGNvbnN0IHJlc3VsdDogQXBpRW52Q29uZmlnID0geyAuLi5iYXNlLCAuLi5yZXN0IH07XG4gIFxuICAvLyBIYW5kbGUgQ09SUyBzZXBhcmF0ZWx5IChwYXJ0aWFsIG1lcmdlKVxuICBpZiAoY29ycykge1xuICAgIGNvbnN0IGRlZmF1bHRDb3JzOiBDb3JzQ29uZmlnID0ge1xuICAgICAgYWxsb3dPcmlnaW5zOiBbJyonXSxcbiAgICAgIGFsbG93TWV0aG9kczogWydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ09QVElPTlMnXSxcbiAgICAgIGFsbG93SGVhZGVyczogWydDb250ZW50LVR5cGUnLCAnQXV0aG9yaXphdGlvbiddLFxuICAgICAgYWxsb3dDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICBtYXhBZ2VTZWM6IDg2NDAwLFxuICAgIH07XG4gICAgcmVzdWx0LmNvcnMgPSB7IC4uLmRlZmF1bHRDb3JzLCAuLi5jb3JzIH07XG4gIH1cbiAgXG4gIC8vIEN1c3RvbSBkb21haW4gaXMgYWxsLW9yLW5vdGhpbmdcbiAgaWYgKGN1c3RvbURvbWFpbikge1xuICAgIHJlc3VsdC5jdXN0b21Eb21haW4gPSBjdXN0b21Eb21haW47XG4gIH1cbiAgXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBWUEMgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiByZXNvbHZlVnBjKFxuICBwcmVzZXQ6IFByZXNldENvbmZpZyxcbiAgaW5wdXQ6IEVudkNvbmZpZ0lucHV0Wyd2cGMnXVxuKTogVnBjRW52Q29uZmlnIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIHByZXNldC52cGM7XG4gIFxuICBjb25zdCB7IHB1YmxpY1N1Ym5ldHMsIHByaXZhdGVTdWJuZXRzLCBpc29sYXRlZFN1Ym5ldHMsIC4uLnJlc3QgfSA9IGlucHV0O1xuICBcbiAgY29uc3QgcmVzdWx0OiBWcGNFbnZDb25maWcgPSB7IC4uLnByZXNldC52cGMsIC4uLnJlc3QgfTtcbiAgXG4gIGlmIChwdWJsaWNTdWJuZXRzKSB7XG4gICAgcmVzdWx0LnB1YmxpY1N1Ym5ldHMgPSB7IC4uLnByZXNldC52cGMucHVibGljU3VibmV0cywgLi4ucHVibGljU3VibmV0cyB9O1xuICB9XG4gIGlmIChwcml2YXRlU3VibmV0cykge1xuICAgIHJlc3VsdC5wcml2YXRlU3VibmV0cyA9IHsgLi4ucHJlc2V0LnZwYy5wcml2YXRlU3VibmV0cywgLi4ucHJpdmF0ZVN1Ym5ldHMgfTtcbiAgfVxuICBpZiAoaXNvbGF0ZWRTdWJuZXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXNvbGF0ZWRTdWJuZXRzICYmIHByZXNldC52cGMuaXNvbGF0ZWRTdWJuZXRzKSB7XG4gICAgICByZXN1bHQuaXNvbGF0ZWRTdWJuZXRzID0geyAuLi5wcmVzZXQudnBjLmlzb2xhdGVkU3VibmV0cywgLi4uaXNvbGF0ZWRTdWJuZXRzIH07XG4gICAgfSBlbHNlIGlmIChpc29sYXRlZFN1Ym5ldHMpIHtcbiAgICAgIHJlc3VsdC5pc29sYXRlZFN1Ym5ldHMgPSB7IGNpZHJNYXNrOiBpc29sYXRlZFN1Ym5ldHMuY2lkck1hc2sgPz8gMjQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0Lmlzb2xhdGVkU3VibmV0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBPYnNlcnZhYmlsaXR5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU9ic2VydmFiaWxpdHkoXG4gIHByZXNldDogUHJlc2V0Q29uZmlnLFxuICBpbnB1dDogRW52Q29uZmlnSW5wdXRbJ29ic2VydmFiaWxpdHknXVxuKTogT2JzZXJ2YWJpbGl0eUVudkNvbmZpZyB7XG4gIGlmICghaW5wdXQpIHJldHVybiBwcmVzZXQub2JzZXJ2YWJpbGl0eTtcbiAgXG4gIGNvbnN0IHsgbG9ncywgbWV0cmljcywgYWxhcm1zLCB0cmFjaW5nLCAuLi5zaG9ydGhhbmRzIH0gPSBpbnB1dDtcbiAgXG4gIC8vIFN0YXJ0IHdpdGggcHJlc2V0XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4ucHJlc2V0Lm9ic2VydmFiaWxpdHkgfTtcbiAgXG4gIC8vIEFwcGx5IG5lc3RlZCBjb25maWdzXG4gIGlmIChsb2dzKSB7XG4gICAgcmVzdWx0LmxvZ3MgPSB7IC4uLnJlc3VsdC5sb2dzLCAuLi5sb2dzIH07XG4gIH1cbiAgaWYgKG1ldHJpY3MpIHtcbiAgICByZXN1bHQubWV0cmljcyA9IHsgLi4ucmVzdWx0Lm1ldHJpY3MsIC4uLm1ldHJpY3MgfTtcbiAgfVxuICBpZiAoYWxhcm1zKSB7XG4gICAgcmVzdWx0LmFsYXJtcyA9IHsgLi4ucmVzdWx0LmFsYXJtcywgLi4uYWxhcm1zIH07XG4gIH1cbiAgaWYgKHRyYWNpbmcpIHtcbiAgICByZXN1bHQudHJhY2luZyA9IHsgLi4ucmVzdWx0LnRyYWNpbmcsIC4uLnRyYWNpbmcgfTtcbiAgfVxuICBcbiAgLy8gQXBwbHkgc2hvcnRoYW5kc1xuICBpZiAoc2hvcnRoYW5kcy5hbGFybXNFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQuYWxhcm1zLmVuYWJsZWQgPSBzaG9ydGhhbmRzLmFsYXJtc0VuYWJsZWQ7XG4gIH1cbiAgaWYgKHNob3J0aGFuZHMudHJhY2luZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlc3VsdC50cmFjaW5nLmVuYWJsZWQgPSBzaG9ydGhhbmRzLnRyYWNpbmdFbmFibGVkO1xuICB9XG4gIGlmIChzaG9ydGhhbmRzLmxvZ1JldGVudGlvbkRheXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlc3VsdC5sb2dzLnJldGVudGlvbkRheXMgPSBzaG9ydGhhbmRzLmxvZ1JldGVudGlvbkRheXM7XG4gIH1cbiAgaWYgKHNob3J0aGFuZHMuZGV0YWlsZWRNZXRyaWNzRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0Lm1ldHJpY3MuZGV0YWlsZWRNZXRyaWNzRW5hYmxlZCA9IHNob3J0aGFuZHMuZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDtcbiAgfVxuICBcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIFdlYlNvY2tldCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXZWJTb2NrZXQoXG4gIHByZXNldDogUHJlc2V0Q29uZmlnLFxuICBpbnB1dDogRW52Q29uZmlnSW5wdXRbJ3dlYnNvY2tldCddXG4pOiBXZWJTb2NrZXRFbnZDb25maWcge1xuICBpZiAoIWlucHV0KSByZXR1cm4gcHJlc2V0LndlYnNvY2tldDtcbiAgcmV0dXJuIHsgLi4ucHJlc2V0LndlYnNvY2tldCwgLi4uaW5wdXQgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbiAqIFxuICogVGFrZXMgdXNlciBpbnB1dCBhbmQgcHJvZHVjZXMgYSBmdWxseSByZXNvbHZlZCBFbnZDb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRW52Q29uZmlnKFxuICBlbnY6IEVudmlyb25tZW50LFxuICBpbnB1dDogRW52Q29uZmlnSW5wdXRcbik6IEVudkNvbmZpZyB7XG4gIC8vIERldGVybWluZSBwcmVzZXQgKGRlZmF1bHQgdG8gJ21pY3JvJyBpZiBub3Qgc3BlY2lmaWVkKVxuICBjb25zdCBwcmVzZXROYW1lID0gaW5wdXQucHJlc2V0ID8/ICdtaWNybyc7XG4gIGNvbnN0IHByZXNldCA9IGdldFByZXNldChwcmVzZXROYW1lKTtcbiAgXG4gIC8vIERldGVybWluZSBkYXRhIHNhZmV0eSAoZGVmYXVsdCBiYXNlZCBvbiBlbnZpcm9ubWVudClcbiAgY29uc3QgZGF0YVNhZmV0eSA9IGlucHV0LmRhdGFTYWZldHkgPz8gREVGQVVMVF9EQVRBX1NBRkVUWVtlbnZdO1xuICBcbiAgcmV0dXJuIHtcbiAgICBlbnYsXG4gICAgZGF0YVNhZmV0eSxcbiAgICBsYW1iZGE6IHJlc29sdmVMYW1iZGEocHJlc2V0LCBpbnB1dC5sYW1iZGEpLFxuICAgIGFwaTogcmVzb2x2ZUFwaShwcmVzZXQsIGlucHV0LmFwaSksXG4gICAgdnBjOiByZXNvbHZlVnBjKHByZXNldCwgaW5wdXQudnBjKSxcbiAgICBvYnNlcnZhYmlsaXR5OiByZXNvbHZlT2JzZXJ2YWJpbGl0eShwcmVzZXQsIGlucHV0Lm9ic2VydmFiaWxpdHkpLFxuICAgIHdlYnNvY2tldDogcmVzb2x2ZVdlYlNvY2tldChwcmVzZXQsIGlucHV0LndlYnNvY2tldCksXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBmdWxsIGNvbmZpZ3VyYXRpb25cbiAqIFxuICogTWVyZ2VzIGJhc2UgY29uZmlnICsgc2VjdXJpdHkgY29uZmlnICsgZW52IGNvbmZpZyBpbnRvIGEgY29tcGxldGUgUmVzb2x2ZWRDb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29uZmlnKFxuICBiYXNlOiBCYXNlQ29uZmlnLFxuICBzZWN1cml0eTogU2VjdXJpdHlDb25maWcsXG4gIGVudjogRW52aXJvbm1lbnQsXG4gIGVudklucHV0OiBFbnZDb25maWdJbnB1dFxuKTogUmVzb2x2ZWRDb25maWcge1xuICBjb25zdCBlbnZDb25maWcgPSByZXNvbHZlRW52Q29uZmlnKGVudiwgZW52SW5wdXQpO1xuICBcbiAgcmV0dXJuIHtcbiAgICAvLyBGcm9tIGJhc2VcbiAgICBuYW1lOiBiYXNlLm5hbWUsXG4gICAgZGlzcGxheU5hbWU6IGJhc2UuZGlzcGxheU5hbWUsXG4gICAgcmVnaW9uOiBiYXNlLnJlZ2lvbixcbiAgICBcbiAgICAvLyBGcm9tIHNlY3VyaXR5XG4gICAgc2NvcGVzOiBzZWN1cml0eS5zY29wZXMsXG4gICAgYXBwQ2xpZW50czogc2VjdXJpdHkuYXBwQ2xpZW50cyxcbiAgICBcbiAgICAvLyBGcm9tIGVudlxuICAgIGVudjogZW52Q29uZmlnLmVudixcbiAgICBkYXRhU2FmZXR5OiBlbnZDb25maWcuZGF0YVNhZmV0eSxcbiAgICBsYW1iZGE6IGVudkNvbmZpZy5sYW1iZGEsXG4gICAgYXBpOiBlbnZDb25maWcuYXBpLFxuICAgIHZwYzogZW52Q29uZmlnLnZwYyxcbiAgICBvYnNlcnZhYmlsaXR5OiBlbnZDb25maWcub2JzZXJ2YWJpbGl0eSxcbiAgICB3ZWJzb2NrZXQ6IGVudkNvbmZpZy53ZWJzb2NrZXQsXG4gICAgXG4gICAgLy8gQXV0by1nZW5lcmF0ZWRcbiAgICB0YWdzOiB7XG4gICAgICBQcm9qZWN0OiBiYXNlLm5hbWUsXG4gICAgICBFbnZpcm9ubWVudDogZW52LFxuICAgICAgTWFuYWdlZEJ5OiAndmVudHVyZWtpdCcsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,54 @@
1
+ /**
2
+ * API Gateway Environment Configuration
3
+ *
4
+ * Controls rate limiting and API behavior per environment.
5
+ * All fields are REQUIRED - no implicit defaults at the type level.
6
+ */
7
+ /**
8
+ * CORS configuration
9
+ */
10
+ export interface CorsConfig {
11
+ /** Allowed origins (e.g., ['https://app.example.com']) */
12
+ allowOrigins: string[];
13
+ /** Allowed HTTP methods */
14
+ allowMethods: string[];
15
+ /** Allowed headers */
16
+ allowHeaders: string[];
17
+ /** Allow credentials */
18
+ allowCredentials: boolean;
19
+ /** Max age in seconds for preflight cache */
20
+ maxAgeSec: number;
21
+ }
22
+ /**
23
+ * Custom domain configuration
24
+ */
25
+ export interface CustomDomainConfig {
26
+ /** Domain name (e.g., 'api.example.com') */
27
+ domainName: string;
28
+ /** ACM certificate ARN */
29
+ certificateArn: string;
30
+ }
31
+ /**
32
+ * API Gateway configuration
33
+ *
34
+ * All fields required - use presets or explicit values.
35
+ */
36
+ export interface ApiEnvConfig {
37
+ /** Steady-state request rate limit (requests per second) */
38
+ throttleRateLimit: number;
39
+ /** Burst capacity (concurrent requests) */
40
+ throttleBurstLimit: number;
41
+ /** Enable detailed CloudWatch metrics */
42
+ detailedMetricsEnabled: boolean;
43
+ /** CORS configuration (undefined = no CORS) */
44
+ cors: CorsConfig | undefined;
45
+ /** Custom domain (undefined = use default API Gateway domain) */
46
+ customDomain: CustomDomainConfig | undefined;
47
+ }
48
+ /**
49
+ * API configuration input (for user overrides)
50
+ */
51
+ export type ApiEnvConfigInput = Partial<Omit<ApiEnvConfig, 'cors' | 'customDomain'>> & {
52
+ cors?: Partial<CorsConfig>;
53
+ customDomain?: CustomDomainConfig;
54
+ };