@go-to-k/cdkd 0.196.0 → 0.198.0

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.
@@ -1,6 +1,6 @@
1
- import { a as runDockerStreaming, c as getLogger, d as getLiveRenderer, g as generateResourceNameWithFallback, m as applyDefaultNameForFallback, n as formatDockerLoginError, o as spawnStreaming, r as getDockerCmd, v as withStackName } from "./docker-cmd-iDMcWcre.js";
2
- import { r as getAwsClients } from "./aws-clients-B15NAPbL.js";
3
- import { randomUUID } from "node:crypto";
1
+ import { r as getAwsClients } from "./aws-clients-DWUnLza1.js";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ import { createHash, randomUUID } from "node:crypto";
4
4
  import { DeleteObjectCommand, GetBucketLocationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, NoSuchKey, PutObjectCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
5
5
  import { CloudControlClient, CreateResourceCommand, DeleteResourceCommand, GetResourceCommand, GetResourceRequestStatusCommand, ListResourcesCommand, UpdateResourceCommand } from "@aws-sdk/client-cloudcontrol";
6
6
  import { AttachRolePolicyCommand, CreateRoleCommand, DeleteRoleCommand, DeleteRolePermissionsBoundaryCommand, DeleteRolePolicyCommand, DetachRolePolicyCommand, GetRoleCommand, GetRolePolicyCommand, IAMClient, ListAttachedRolePoliciesCommand, ListInstanceProfilesForRoleCommand, ListRolePoliciesCommand, ListRoleTagsCommand, ListRolesCommand, NoSuchEntityException, PutRolePermissionsBoundaryCommand, PutRolePolicyCommand, RemoveRoleFromInstanceProfileCommand, TagRoleCommand, UntagRoleCommand, UpdateAssumeRolePolicyCommand, UpdateRoleCommand } from "@aws-sdk/client-iam";
@@ -27,6 +27,806 @@ import graphlib from "graphlib";
27
27
  import { DescribeDBClustersCommand, RDSClient } from "@aws-sdk/client-rds";
28
28
  import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
29
29
 
30
+ //#region src/provisioning/resource-name.ts
31
+ /**
32
+ * Per-async-context stack name. Resource-name generation reads this so that
33
+ * concurrent deploys (`cdkd deploy --all` runs stacks in parallel up to
34
+ * `--stack-concurrency`) don't fight over a single shared variable.
35
+ *
36
+ * History: this was `let currentStackName: string | undefined` until
37
+ * 2026-05-01. Two parallel `deploy()` calls would each call
38
+ * `setCurrentStackName(...)` and the second would overwrite the first;
39
+ * any IAM Role / SQS Queue / etc. created by the first stack while the
40
+ * second was active would get the second stack's prefix in its physical
41
+ * name, then the second stack's own create attempt for the same logical
42
+ * id would collide ("Role with name X already exists"). Switching to
43
+ * `AsyncLocalStorage` scopes the value to each deploy's async chain.
44
+ */
45
+ const stackNameStore = new AsyncLocalStorage();
46
+ function withStackName(stackName, fn) {
47
+ return stackNameStore.run(stackName, fn);
48
+ }
49
+ /**
50
+ * Read the current async context's stack name, if any.
51
+ *
52
+ * Returns `undefined` outside any `withStackName` / `setCurrentStackName`
53
+ * scope. Used by the live renderer to scope per-stack in-flight task
54
+ * entries so concurrent deploys don't clobber each other's tasks (same
55
+ * `logicalId` in two stacks would collide on the singleton renderer's
56
+ * task Map without this).
57
+ */
58
+ function getCurrentStackName() {
59
+ return stackNameStore.getStore();
60
+ }
61
+ /**
62
+ * Per-async-context "skip the stack-name prefix on user-supplied physical
63
+ * names" flag. Read by `generateResourceName` when its caller passes
64
+ * `userSupplied: true`; auto-generated-name paths
65
+ * (`generateResourceName(logicalId, ...)`) ignore this flag.
66
+ *
67
+ * Scoped via AsyncLocalStorage so that `--stack-concurrency > 1` runs
68
+ * cannot cross-contaminate — each deploy's body is wrapped in its own
69
+ * `withSkipPrefix(...)` scope (the deploy CLI plumbs the resolved
70
+ * `--no-prefix-user-supplied-names` value through here). Default
71
+ * `false` preserves pre-PR behavior when the flag is not set.
72
+ */
73
+ const skipPrefixStore = new AsyncLocalStorage();
74
+ function withSkipPrefix(skip, fn) {
75
+ return skipPrefixStore.run(skip, fn);
76
+ }
77
+ /**
78
+ * Read the current async context's skip-prefix flag. Defaults to
79
+ * `false` when no `withSkipPrefix` scope is active.
80
+ *
81
+ * Public for unit tests; `generateResourceName` consumes this
82
+ * internally.
83
+ */
84
+ function getCurrentSkipPrefix() {
85
+ return skipPrefixStore.getStore() ?? false;
86
+ }
87
+ /**
88
+ * Resource types whose pre-PR #297 code path ran user-supplied
89
+ * physical names through `generateResourceName` (= got the stack-name
90
+ * prefix). These are the only types affected by
91
+ * `--no-prefix-user-supplied-names`; flipping the flag against an
92
+ * existing stack proposes REPLACEMENT on every state resource of
93
+ * one of these types whose `physicalId` is still prefixed.
94
+ *
95
+ * Pattern A providers (Lambda, S3, SNS, SQS, DynamoDB, Logs LogGroup,
96
+ * Events Rule, etc.) historically short-circuited user-supplied names
97
+ * **out** of `generateResourceName` entirely — those types never got
98
+ * the prefix regardless of the flag, so they are NOT included here.
99
+ *
100
+ * Used by the deploy-time pre-flight migration check in
101
+ * `src/cli/commands/prefix-migration-check.ts`. Keep in sync with the
102
+ * Pattern B provider call sites that consume
103
+ * `generateResourceNameWithFallback(...)`.
104
+ */
105
+ const PATTERN_B_RESOURCE_TYPES = [
106
+ "AWS::IAM::Role",
107
+ "AWS::IAM::User",
108
+ "AWS::IAM::Group",
109
+ "AWS::IAM::InstanceProfile",
110
+ "AWS::IAM::ManagedPolicy",
111
+ "AWS::ElasticLoadBalancingV2::LoadBalancer",
112
+ "AWS::ElasticLoadBalancingV2::TargetGroup"
113
+ ];
114
+ /**
115
+ * For each Pattern B resource type, the CFn template `Properties` field
116
+ * the user sets to supply a physical name (`new iam.Role(this, 'X',
117
+ * { roleName: 'my-role' })` → `Properties.RoleName: 'my-role'`).
118
+ *
119
+ * Used by the prefix-migration check to distinguish user-supplied
120
+ * physical names (which the v0.94.0 default flip would actually
121
+ * REPLACE on next deploy) from auto-generated logical-id-fallback
122
+ * names (which keep the prefix in BOTH old and new default — no
123
+ * REPLACE pending). Without this discriminator, the migration
124
+ * check naively flags every prefix-style physicalId regardless of
125
+ * its origin, surfacing a false-positive WARNING on auto-generated
126
+ * names that won't actually be touched.
127
+ *
128
+ * Keep in sync with `PATTERN_B_RESOURCE_TYPES` and with each
129
+ * provider's `Properties[<NameField>]` lookup in
130
+ * `src/provisioning/providers/`.
131
+ */
132
+ const PATTERN_B_NAME_PROPERTIES = {
133
+ "AWS::IAM::Role": "RoleName",
134
+ "AWS::IAM::User": "UserName",
135
+ "AWS::IAM::Group": "GroupName",
136
+ "AWS::IAM::InstanceProfile": "InstanceProfileName",
137
+ "AWS::IAM::ManagedPolicy": "ManagedPolicyName",
138
+ "AWS::ElasticLoadBalancingV2::LoadBalancer": "Name",
139
+ "AWS::ElasticLoadBalancingV2::TargetGroup": "Name"
140
+ };
141
+ /**
142
+ * Generate a unique resource name from the logical ID.
143
+ *
144
+ * Generates names in CloudFormation-compatible format:
145
+ * `{StackName}-{LogicalId}-{Hash}` (truncated to maxLength).
146
+ *
147
+ * @param name The raw name (from properties or logicalId fallback)
148
+ * @param options Length and character constraints
149
+ * @returns A sanitized, truncated name that fits the constraints
150
+ */
151
+ function generateResourceName(name, options) {
152
+ const { maxLength, lowercase = false, allowedPattern = /[^a-zA-Z0-9-]/g, userSupplied = false } = options;
153
+ const currentStackName = stackNameStore.getStore();
154
+ const fullName = currentStackName && !(userSupplied && getCurrentSkipPrefix()) ? `${currentStackName}-${name}` : name;
155
+ let sanitized = lowercase ? fullName.toLowerCase() : fullName;
156
+ sanitized = sanitized.replace(allowedPattern, "-");
157
+ sanitized = sanitized.replace(/-{2,}/g, "-").replace(/^-+|-+$/g, "");
158
+ if (sanitized.length <= maxLength) return sanitized;
159
+ const hash = createHash("sha256").update(fullName).digest("hex").substring(0, 8);
160
+ const maxPrefixLength = maxLength - hash.length - 1;
161
+ return `${sanitized.substring(0, maxPrefixLength).replace(/-+$/, "")}-${hash}`;
162
+ }
163
+ /**
164
+ * Generate a resource name from a user-declared physical name OR
165
+ * fall back to the logical id.
166
+ *
167
+ * Wraps {@link generateResourceName} to express the Pattern B call-site
168
+ * shape (`generateResourceName((properties['Name'] as string | undefined)
169
+ * || logicalId, opts)`) as a single typed helper. The user-supplied
170
+ * branch passes `userSupplied: true`, which makes the per-deploy
171
+ * `withSkipPrefix(true)` flag drop the stack-name prefix on that name.
172
+ * The fallback (logical-id) branch is `userSupplied: false` and keeps
173
+ * the prefix regardless of the flag — auto-generated names rely on
174
+ * the prefix for cross-stack uniqueness.
175
+ *
176
+ * Use at every Pattern B provider call site (currently IAM Role, IAM
177
+ * User, IAM Group, IAM InstanceProfile, ELBv2 LoadBalancer, ELBv2
178
+ * TargetGroup) so the `--no-prefix-user-supplied-names` flag controls
179
+ * those types consistently. Pattern A providers (Lambda, S3, SNS,
180
+ * SQS, DynamoDB, etc.) do NOT need this helper — they already
181
+ * short-circuit the user-supplied name out of the
182
+ * `generateResourceName` call entirely, so the prefix is never
183
+ * applied to user-supplied names regardless of the flag.
184
+ */
185
+ function generateResourceNameWithFallback(userSuppliedName, logicalId, options) {
186
+ if (userSuppliedName !== void 0 && userSuppliedName !== "") return generateResourceName(userSuppliedName, {
187
+ ...options,
188
+ userSupplied: true
189
+ });
190
+ return generateResourceName(logicalId, {
191
+ ...options,
192
+ userSupplied: false
193
+ });
194
+ }
195
+ /**
196
+ * Default name generation rules for CC API fallback.
197
+ *
198
+ * When an SDK provider falls back to CC API, the resource may need a
199
+ * default name that the SDK provider would have generated. This map
200
+ * defines the name property and generation options for each resource type.
201
+ *
202
+ * Format: resourceType → { nameProperty, options, postProcess? }
203
+ */
204
+ const FALLBACK_NAME_RULES = {
205
+ "AWS::S3::Bucket": {
206
+ nameProperty: "BucketName",
207
+ options: {
208
+ maxLength: 63,
209
+ lowercase: true
210
+ }
211
+ },
212
+ "AWS::SQS::Queue": {
213
+ nameProperty: "QueueName",
214
+ options: { maxLength: 80 }
215
+ },
216
+ "AWS::SNS::Topic": {
217
+ nameProperty: "TopicName",
218
+ options: { maxLength: 256 }
219
+ },
220
+ "AWS::Lambda::Function": {
221
+ nameProperty: "FunctionName",
222
+ options: { maxLength: 64 }
223
+ },
224
+ "AWS::Lambda::LayerVersion": {
225
+ nameProperty: "LayerName",
226
+ options: { maxLength: 64 }
227
+ },
228
+ "AWS::IAM::Role": {
229
+ nameProperty: "RoleName",
230
+ options: { maxLength: 64 }
231
+ },
232
+ "AWS::IAM::Policy": {
233
+ nameProperty: "PolicyName",
234
+ options: { maxLength: 64 }
235
+ },
236
+ "AWS::IAM::ManagedPolicy": {
237
+ nameProperty: "ManagedPolicyName",
238
+ options: { maxLength: 128 }
239
+ },
240
+ "AWS::IAM::User": {
241
+ nameProperty: "UserName",
242
+ options: { maxLength: 64 }
243
+ },
244
+ "AWS::IAM::Group": {
245
+ nameProperty: "GroupName",
246
+ options: { maxLength: 128 }
247
+ },
248
+ "AWS::IAM::InstanceProfile": {
249
+ nameProperty: "InstanceProfileName",
250
+ options: { maxLength: 128 }
251
+ },
252
+ "AWS::DynamoDB::Table": {
253
+ nameProperty: "TableName",
254
+ options: { maxLength: 255 }
255
+ },
256
+ "AWS::ECR::Repository": {
257
+ nameProperty: "RepositoryName",
258
+ options: {
259
+ maxLength: 256,
260
+ lowercase: true
261
+ }
262
+ },
263
+ "AWS::ECS::Cluster": {
264
+ nameProperty: "ClusterName",
265
+ options: { maxLength: 255 }
266
+ },
267
+ "AWS::ECS::Service": {
268
+ nameProperty: "ServiceName",
269
+ options: { maxLength: 255 }
270
+ },
271
+ "AWS::Logs::LogGroup": {
272
+ nameProperty: "LogGroupName",
273
+ options: { maxLength: 512 }
274
+ },
275
+ "AWS::CloudWatch::Alarm": {
276
+ nameProperty: "AlarmName",
277
+ options: { maxLength: 256 }
278
+ },
279
+ "AWS::Events::Rule": {
280
+ nameProperty: "Name",
281
+ options: { maxLength: 64 }
282
+ },
283
+ "AWS::Events::EventBus": {
284
+ nameProperty: "Name",
285
+ options: { maxLength: 256 }
286
+ },
287
+ "AWS::Kinesis::Stream": {
288
+ nameProperty: "Name",
289
+ options: { maxLength: 128 }
290
+ },
291
+ "AWS::StepFunctions::StateMachine": {
292
+ nameProperty: "StateMachineName",
293
+ options: { maxLength: 80 }
294
+ },
295
+ "AWS::SecretsManager::Secret": {
296
+ nameProperty: "Name",
297
+ options: {
298
+ maxLength: 512,
299
+ allowedPattern: /[^a-zA-Z0-9-/_]/g
300
+ }
301
+ },
302
+ "AWS::SSM::Parameter": {
303
+ nameProperty: "Name",
304
+ options: { maxLength: 2048 }
305
+ },
306
+ "AWS::Cognito::UserPool": {
307
+ nameProperty: "UserPoolName",
308
+ options: { maxLength: 128 }
309
+ },
310
+ "AWS::ElastiCache::SubnetGroup": {
311
+ nameProperty: "CacheSubnetGroupName",
312
+ options: {
313
+ maxLength: 255,
314
+ lowercase: true
315
+ }
316
+ },
317
+ "AWS::ElastiCache::CacheCluster": {
318
+ nameProperty: "ClusterName",
319
+ options: {
320
+ maxLength: 40,
321
+ lowercase: true
322
+ }
323
+ },
324
+ "AWS::RDS::DBSubnetGroup": {
325
+ nameProperty: "DBSubnetGroupName",
326
+ options: {
327
+ maxLength: 255,
328
+ lowercase: true
329
+ }
330
+ },
331
+ "AWS::RDS::DBCluster": {
332
+ nameProperty: "DBClusterIdentifier",
333
+ options: {
334
+ maxLength: 63,
335
+ lowercase: true
336
+ }
337
+ },
338
+ "AWS::RDS::DBInstance": {
339
+ nameProperty: "DBInstanceIdentifier",
340
+ options: {
341
+ maxLength: 63,
342
+ lowercase: true
343
+ }
344
+ },
345
+ "AWS::DocDB::DBSubnetGroup": {
346
+ nameProperty: "DBSubnetGroupName",
347
+ options: {
348
+ maxLength: 255,
349
+ lowercase: true
350
+ }
351
+ },
352
+ "AWS::DocDB::DBCluster": {
353
+ nameProperty: "DBClusterIdentifier",
354
+ options: {
355
+ maxLength: 63,
356
+ lowercase: true
357
+ }
358
+ },
359
+ "AWS::DocDB::DBInstance": {
360
+ nameProperty: "DBInstanceIdentifier",
361
+ options: {
362
+ maxLength: 63,
363
+ lowercase: true
364
+ }
365
+ },
366
+ "AWS::Neptune::DBSubnetGroup": {
367
+ nameProperty: "DBSubnetGroupName",
368
+ options: {
369
+ maxLength: 255,
370
+ lowercase: true
371
+ }
372
+ },
373
+ "AWS::Neptune::DBCluster": {
374
+ nameProperty: "DBClusterIdentifier",
375
+ options: {
376
+ maxLength: 63,
377
+ lowercase: true
378
+ }
379
+ },
380
+ "AWS::Neptune::DBInstance": {
381
+ nameProperty: "DBInstanceIdentifier",
382
+ options: {
383
+ maxLength: 63,
384
+ lowercase: true
385
+ }
386
+ },
387
+ "AWS::ElasticLoadBalancingV2::LoadBalancer": {
388
+ nameProperty: "Name",
389
+ options: { maxLength: 32 }
390
+ },
391
+ "AWS::ElasticLoadBalancingV2::TargetGroup": {
392
+ nameProperty: "Name",
393
+ options: { maxLength: 32 }
394
+ },
395
+ "AWS::WAFv2::WebACL": {
396
+ nameProperty: "Name",
397
+ options: { maxLength: 128 }
398
+ },
399
+ "AWS::CodeBuild::Project": {
400
+ nameProperty: "Name",
401
+ options: { maxLength: 255 }
402
+ },
403
+ "AWS::S3Express::DirectoryBucket": {
404
+ nameProperty: "BucketName",
405
+ options: {
406
+ maxLength: 63,
407
+ lowercase: true
408
+ }
409
+ }
410
+ };
411
+ /**
412
+ * Apply default name generation for CC API fallback.
413
+ *
414
+ * When a resource doesn't have an explicit name property set,
415
+ * generates the same default name that the SDK provider would have created.
416
+ * This ensures consistent naming regardless of whether SDK or CC API handles the resource.
417
+ *
418
+ * @param logicalId Logical ID from the template
419
+ * @param resourceType CloudFormation resource type
420
+ * @param properties Resource properties (will not be mutated)
421
+ * @returns Properties with default name applied if needed, or original properties if no rule exists
422
+ */
423
+ function applyDefaultNameForFallback(logicalId, resourceType, properties) {
424
+ const rule = FALLBACK_NAME_RULES[resourceType];
425
+ if (!rule) return properties;
426
+ if (properties[rule.nameProperty]) return properties;
427
+ const generatedName = generateResourceName(logicalId, rule.options);
428
+ return {
429
+ ...properties,
430
+ [rule.nameProperty]: generatedName
431
+ };
432
+ }
433
+
434
+ //#endregion
435
+ //#region src/utils/live-renderer.ts
436
+ /**
437
+ * Live multi-line progress renderer for the bottom of the terminal.
438
+ *
439
+ * Maintains a "live area" listing in-flight tasks (Creating MyBucket...),
440
+ * redrawn on a spinner timer. Other log output is routed through
441
+ * {@link LiveRenderer.printAbove} so it appears above the live area without
442
+ * disturbing the currently-displayed in-flight tasks.
443
+ *
444
+ * Design notes:
445
+ * - Multiple resources can be in flight concurrently (cdkd uses parallel DAG
446
+ * dispatch), so a single in-place line overwrite is not enough — each
447
+ * in-flight resource is its own line in the live area.
448
+ * - On non-TTY (CI/log-collection), the renderer stays inactive and
449
+ * {@link LiveRenderer.printAbove} falls through to a direct write, so output
450
+ * matches the previous append-only behavior.
451
+ * - In verbose mode (debug level) the caller should not start the renderer:
452
+ * debug logs would interleave too aggressively with the live area.
453
+ */
454
+ const SPINNER_FRAMES = [
455
+ "⠋",
456
+ "⠙",
457
+ "⠹",
458
+ "⠸",
459
+ "⠼",
460
+ "⠴",
461
+ "⠦",
462
+ "⠧",
463
+ "⠇",
464
+ "⠏"
465
+ ];
466
+ const FRAME_INTERVAL_MS = 80;
467
+ const ESC = "\x1B[";
468
+ /**
469
+ * Scope a task `id` to its calling stack so two stacks running in
470
+ * parallel — `cdkd deploy --all` with `--stack-concurrency > 1` — don't
471
+ * collide on the same `logicalId` in the renderer's task Map. Without
472
+ * this, stack B's `addTask('MyQueue', ...)` would overwrite stack A's
473
+ * entry, and stack A's later `removeTask('MyQueue')` would erase
474
+ * stack B's.
475
+ */
476
+ function scopedKey(id, stackName) {
477
+ return stackName ? `${stackName}:${id}` : id;
478
+ }
479
+ var LiveRenderer = class {
480
+ tasks = /* @__PURE__ */ new Map();
481
+ active = false;
482
+ spinnerIndex = 0;
483
+ interval = null;
484
+ linesDrawn = 0;
485
+ cursorHidden = false;
486
+ exitListener = null;
487
+ stream;
488
+ constructor(stream = process.stdout) {
489
+ this.stream = stream;
490
+ }
491
+ isActive() {
492
+ return this.active;
493
+ }
494
+ /**
495
+ * Enable the live renderer. No-op if stdout is not a TTY or if
496
+ * `CDKD_NO_LIVE=1`. Returns true if successfully enabled.
497
+ */
498
+ start() {
499
+ if (this.active) return true;
500
+ if (!this.stream.isTTY) return false;
501
+ if (process.env["CDKD_NO_LIVE"] === "1") return false;
502
+ this.active = true;
503
+ this.hideCursor();
504
+ if (!this.exitListener) {
505
+ this.exitListener = () => this.showCursor();
506
+ process.on("exit", this.exitListener);
507
+ }
508
+ this.interval = setInterval(() => this.draw(), FRAME_INTERVAL_MS);
509
+ if (typeof this.interval.unref === "function") this.interval.unref();
510
+ return true;
511
+ }
512
+ stop() {
513
+ if (!this.active) return;
514
+ if (this.interval) {
515
+ clearInterval(this.interval);
516
+ this.interval = null;
517
+ }
518
+ this.clear();
519
+ this.showCursor();
520
+ if (this.exitListener) {
521
+ process.removeListener("exit", this.exitListener);
522
+ this.exitListener = null;
523
+ }
524
+ this.tasks.clear();
525
+ this.active = false;
526
+ }
527
+ addTask(id, label) {
528
+ const stackName = getCurrentStackName();
529
+ this.tasks.set(scopedKey(id, stackName), {
530
+ label,
531
+ startedAt: Date.now(),
532
+ stackName
533
+ });
534
+ if (this.active) this.draw();
535
+ }
536
+ removeTask(id) {
537
+ const stackName = getCurrentStackName();
538
+ if (!this.tasks.delete(scopedKey(id, stackName))) return;
539
+ if (this.active) this.draw();
540
+ }
541
+ /**
542
+ * Replace the label of a previously-added task in place. No-op if the
543
+ * task is not currently tracked (e.g. it already finished). Used by the
544
+ * per-resource deadline wrapper to surface a "[taking longer than
545
+ * expected, Nm+]" suffix without disturbing the elapsed-time counter
546
+ * the renderer tracks via `startedAt`.
547
+ */
548
+ updateTaskLabel(id, label) {
549
+ const stackName = getCurrentStackName();
550
+ const task = this.tasks.get(scopedKey(id, stackName));
551
+ if (!task) return;
552
+ task.label = label;
553
+ if (this.active) this.draw();
554
+ }
555
+ /**
556
+ * Print content above the live area. Clears the live area, runs the writer,
557
+ * then redraws the live area. When the renderer is inactive, the writer
558
+ * runs directly so callers can use this unconditionally.
559
+ */
560
+ printAbove(write) {
561
+ if (!this.active) {
562
+ write();
563
+ return;
564
+ }
565
+ this.clear();
566
+ write();
567
+ this.draw();
568
+ }
569
+ clear() {
570
+ if (this.linesDrawn === 0) return;
571
+ this.stream.write("\r");
572
+ for (let i = 0; i < this.linesDrawn; i++) this.stream.write(`${ESC}1A${ESC}2K`);
573
+ this.linesDrawn = 0;
574
+ }
575
+ draw() {
576
+ if (!this.active) return;
577
+ this.clear();
578
+ if (this.tasks.size === 0) return;
579
+ const frame = SPINNER_FRAMES[this.spinnerIndex % SPINNER_FRAMES.length];
580
+ this.spinnerIndex++;
581
+ const distinctStacks = /* @__PURE__ */ new Set();
582
+ for (const task of this.tasks.values()) distinctStacks.add(task.stackName);
583
+ const showStackPrefix = distinctStacks.size > 1;
584
+ const cols = this.stream.columns ?? 80;
585
+ const lines = [];
586
+ for (const task of this.tasks.values()) {
587
+ const elapsed = ((Date.now() - task.startedAt) / 1e3).toFixed(1);
588
+ const raw = ` ${frame} ${showStackPrefix && task.stackName ? `[${task.stackName}] ` : ""}${task.label} (${elapsed}s)`;
589
+ lines.push(this.truncate(raw, cols));
590
+ }
591
+ this.stream.write(lines.join("\n") + "\n");
592
+ this.linesDrawn = lines.length;
593
+ }
594
+ truncate(s, maxLen) {
595
+ if (s.length <= maxLen) return s;
596
+ if (maxLen <= 1) return "…";
597
+ return s.substring(0, maxLen - 1) + "…";
598
+ }
599
+ hideCursor() {
600
+ if (this.cursorHidden) return;
601
+ this.stream.write(`${ESC}?25l`);
602
+ this.cursorHidden = true;
603
+ }
604
+ showCursor() {
605
+ if (!this.cursorHidden) return;
606
+ this.stream.write(`${ESC}?25h`);
607
+ this.cursorHidden = false;
608
+ }
609
+ };
610
+ let globalRenderer = null;
611
+ function getLiveRenderer() {
612
+ if (!globalRenderer) globalRenderer = new LiveRenderer();
613
+ return globalRenderer;
614
+ }
615
+
616
+ //#endregion
617
+ //#region src/utils/stack-context.ts
618
+ const outputBufferStore = new AsyncLocalStorage();
619
+ /**
620
+ * Run `fn` with a fresh log buffer scoped to its async chain. Any
621
+ * `logger.info / debug / warn / error` calls inside `fn` (and any
622
+ * `await`s) push into the buffer instead of writing to stdout/stderr.
623
+ * Returns the buffered lines (and either `result` or `error`) so the
624
+ * caller can flush them in one block.
625
+ */
626
+ async function runStackBuffered(fn) {
627
+ const buffer = { lines: [] };
628
+ return outputBufferStore.run(buffer, async () => {
629
+ try {
630
+ return {
631
+ ok: true,
632
+ result: await fn(),
633
+ lines: buffer.lines
634
+ };
635
+ } catch (error) {
636
+ return {
637
+ ok: false,
638
+ error,
639
+ lines: buffer.lines
640
+ };
641
+ }
642
+ });
643
+ }
644
+ /**
645
+ * Get the current async context's stack output buffer, or `undefined`
646
+ * if no `runStackBuffered` is active. The logger consults this on every
647
+ * call: present → push to buffer; absent → fall through to live
648
+ * renderer / console.
649
+ */
650
+ function getCurrentStackOutputBuffer() {
651
+ return outputBufferStore.getStore();
652
+ }
653
+
654
+ //#endregion
655
+ //#region src/utils/logger.ts
656
+ /**
657
+ * ANSI color codes
658
+ *
659
+ * Kept internal — `ConsoleLogger.formatMessage` references these for the
660
+ * verbose/compact mode level prefixes. For inline color wrapping in
661
+ * production code, import from `./colors.js` instead (which lives in a
662
+ * separate module so unit tests that mock `logger.ts` don't strip color
663
+ * helpers as a side effect).
664
+ */
665
+ const colors = {
666
+ reset: "\x1B[0m",
667
+ bright: "\x1B[1m",
668
+ dim: "\x1B[2m",
669
+ red: "\x1B[31m",
670
+ green: "\x1B[32m",
671
+ yellow: "\x1B[33m",
672
+ blue: "\x1B[34m",
673
+ cyan: "\x1B[36m",
674
+ gray: "\x1B[90m"
675
+ };
676
+ /**
677
+ * Format timestamp
678
+ */
679
+ function formatTimestamp() {
680
+ return (/* @__PURE__ */ new Date()).toISOString();
681
+ }
682
+ /**
683
+ * Console logger implementation
684
+ *
685
+ * Supports two output modes:
686
+ * - verbose (debug level): timestamps, module prefixes, all details
687
+ * - compact (info level): clean output without timestamps or prefixes
688
+ */
689
+ var ConsoleLogger = class {
690
+ level;
691
+ useColors;
692
+ constructor(level = "info", useColors = true) {
693
+ this.level = level;
694
+ this.useColors = useColors;
695
+ }
696
+ shouldLog(level) {
697
+ const levels = [
698
+ "debug",
699
+ "info",
700
+ "warn",
701
+ "error"
702
+ ];
703
+ const currentLevelIndex = levels.indexOf(this.level);
704
+ return levels.indexOf(level) >= currentLevelIndex;
705
+ }
706
+ formatMessage(level, message, ...args) {
707
+ const formattedArgs = args.length > 0 ? " " + args.map((a) => JSON.stringify(a)).join(" ") : "";
708
+ if (this.level === "debug") {
709
+ const timestamp = formatTimestamp();
710
+ const levelStr = level.toUpperCase().padEnd(5);
711
+ if (this.useColors) {
712
+ const levelColor = {
713
+ debug: colors.gray,
714
+ info: colors.blue,
715
+ warn: colors.yellow,
716
+ error: colors.red
717
+ }[level];
718
+ return `${colors.dim}${timestamp}${colors.reset} ${levelColor}${levelStr}${colors.reset} ${message}${formattedArgs}`;
719
+ }
720
+ return `${timestamp} ${levelStr} ${message}${formattedArgs}`;
721
+ }
722
+ if (this.useColors) {
723
+ if (level === "error") return `${colors.red}${message}${formattedArgs}${colors.reset}`;
724
+ if (level === "warn") return `${colors.yellow}${message}${formattedArgs}${colors.reset}`;
725
+ return `${message}${formattedArgs}`;
726
+ }
727
+ return `${message}${formattedArgs}`;
728
+ }
729
+ /**
730
+ * Route a formatted log line. When a per-stack output buffer is active in
731
+ * the current async context (parallel multi-stack deploy), capture the
732
+ * line into the buffer so it can be flushed as one atomic block when the
733
+ * stack finishes. Otherwise fall through to the live renderer / console
734
+ * as before.
735
+ */
736
+ emit(level, formatted) {
737
+ const buffer = getCurrentStackOutputBuffer();
738
+ if (buffer) {
739
+ buffer.lines.push(formatted);
740
+ return;
741
+ }
742
+ getLiveRenderer().printAbove(() => {
743
+ if (level === "error") console.error(formatted);
744
+ else if (level === "warn") console.warn(formatted);
745
+ else if (level === "info") console.info(formatted);
746
+ else console.debug(formatted);
747
+ });
748
+ }
749
+ debug(message, ...args) {
750
+ if (this.shouldLog("debug")) this.emit("debug", this.formatMessage("debug", message, ...args));
751
+ }
752
+ info(message, ...args) {
753
+ if (this.shouldLog("info")) this.emit("info", this.formatMessage("info", message, ...args));
754
+ }
755
+ warn(message, ...args) {
756
+ if (this.shouldLog("warn")) this.emit("warn", this.formatMessage("warn", message, ...args));
757
+ }
758
+ error(message, ...args) {
759
+ if (this.shouldLog("error")) this.emit("error", this.formatMessage("error", message, ...args));
760
+ }
761
+ /**
762
+ * Set log level
763
+ */
764
+ setLevel(level) {
765
+ this.level = level;
766
+ }
767
+ getLevel() {
768
+ return this.level;
769
+ }
770
+ /**
771
+ * Create a child logger with a prefix
772
+ *
773
+ * In verbose mode, prefix is shown as [Prefix]. In compact mode, prefix is hidden.
774
+ */
775
+ child(prefix) {
776
+ return new ChildLogger(prefix, this.useColors);
777
+ }
778
+ };
779
+ /**
780
+ * Child logger that always syncs level from global logger
781
+ */
782
+ var ChildLogger = class extends ConsoleLogger {
783
+ prefix;
784
+ constructor(prefix, useColors) {
785
+ super("info", useColors);
786
+ this.prefix = prefix;
787
+ }
788
+ syncLevel() {
789
+ if (globalLogger) this.setLevel(globalLogger.getLevel());
790
+ }
791
+ debug(message, ...args) {
792
+ this.syncLevel();
793
+ super.debug(`[${this.prefix}] ${message}`, ...args);
794
+ }
795
+ info(message, ...args) {
796
+ this.syncLevel();
797
+ const msg = this.getLevel() === "debug" ? `[${this.prefix}] ${message}` : message;
798
+ super.info(msg, ...args);
799
+ }
800
+ warn(message, ...args) {
801
+ this.syncLevel();
802
+ const msg = this.getLevel() === "debug" ? `[${this.prefix}] ${message}` : message;
803
+ super.warn(msg, ...args);
804
+ }
805
+ error(message, ...args) {
806
+ this.syncLevel();
807
+ const msg = this.getLevel() === "debug" ? `[${this.prefix}] ${message}` : message;
808
+ super.error(msg, ...args);
809
+ }
810
+ };
811
+ /**
812
+ * Global logger instance
813
+ */
814
+ let globalLogger = null;
815
+ /**
816
+ * Get or create global logger
817
+ */
818
+ function getLogger() {
819
+ if (!globalLogger) globalLogger = new ConsoleLogger();
820
+ return globalLogger;
821
+ }
822
+ /**
823
+ * Set global logger instance
824
+ */
825
+ function setLogger(logger) {
826
+ globalLogger = logger;
827
+ }
828
+
829
+ //#endregion
30
830
  //#region src/utils/error-handler.ts
31
831
  /**
32
832
  * Base error class for cdkd
@@ -2412,7 +3212,7 @@ async function resolveStateBucketWithDefaultAndSource(cliBucket, region) {
2412
3212
  logger.debug("No state bucket specified, resolving default from account...");
2413
3213
  const { GetCallerIdentityCommand } = await import("@aws-sdk/client-sts");
2414
3214
  const { S3Client } = await import("@aws-sdk/client-s3");
2415
- const { getAwsClients } = await import("./aws-clients-B15NAPbL.js").then((n) => n.n);
3215
+ const { getAwsClients } = await import("./aws-clients-DWUnLza1.js").then((n) => n.n);
2416
3216
  const accountId = (await getAwsClients().sts.send(new GetCallerIdentityCommand({}))).Account;
2417
3217
  const newName = getDefaultStateBucketName(accountId);
2418
3218
  const legacyName = getLegacyStateBucketName(accountId, region);
@@ -2787,6 +3587,195 @@ var FileAssetPublisher = class {
2787
3587
  }
2788
3588
  };
2789
3589
 
3590
+ //#endregion
3591
+ //#region src/utils/docker-cmd.ts
3592
+ /**
3593
+ * Shared helpers for invoking the docker-compatible CLI binary across cdkd.
3594
+ *
3595
+ * Two parity decisions with `aws-cdk-cli`'s `cdk-assets-lib`:
3596
+ * 1. `CDK_DOCKER` env var swaps the binary so podman / finch users can
3597
+ * run cdkd without code changes (`CDK_DOCKER=podman cdkd deploy`).
3598
+ * 2. `runDockerStreaming` uses streaming spawn rather than `execFile`'s
3599
+ * buffered `maxBuffer` ceiling. BuildKit's progress output can run to
3600
+ * tens of MB on multi-stage builds with `# syntax=docker/dockerfile:1`
3601
+ * frontend downloads + heredoc / `RUN --mount=...` features; the 50 MB
3602
+ * `execFile` ceiling cdkd used to set silently killed those builds
3603
+ * with `ERR_CHILD_PROCESS_STDIO_MAXBUFFER`.
3604
+ *
3605
+ * Output handling: stdout/stderr are collected in memory unconditionally so
3606
+ * `runDockerStreaming` can return them to the caller for error wrapping.
3607
+ * When the logger is at debug level (i.e. the user passed `--verbose`),
3608
+ * the chunks are ALSO mirrored to `process.stdout` / `process.stderr` so
3609
+ * the user sees live build progress.
3610
+ */
3611
+ /**
3612
+ * Return the docker-compatible CLI binary to invoke. Matches CDK CLI:
3613
+ * `CDK_DOCKER` env var overrides the default `docker` so users on
3614
+ * podman / finch / nerdctl can swap without changing cdkd code.
3615
+ */
3616
+ function getDockerCmd() {
3617
+ const override = process.env["CDK_DOCKER"];
3618
+ return override && override.length > 0 ? override : "docker";
3619
+ }
3620
+ /**
3621
+ * Spawn a docker-compatible CLI binary (resolved via `getDockerCmd`) with
3622
+ * streaming I/O. Collects stdout/stderr in memory and resolves with both
3623
+ * on exit code 0; rejects with a `SpawnError` carrying both streams on any
3624
+ * non-zero exit so the caller can wrap with its own error class without
3625
+ * losing the upstream output.
3626
+ *
3627
+ * No `maxBuffer` ceiling: BuildKit progress output frequently exceeds the
3628
+ * `child_process.execFile` default of 1 MB (cdkd previously bumped to 50 MB
3629
+ * but BuildKit + frontend pulls can still exceed that on first-time builds).
3630
+ */
3631
+ async function runDockerStreaming(args, options = {}) {
3632
+ return spawnStreaming(getDockerCmd(), args, options);
3633
+ }
3634
+ /**
3635
+ * Generic streaming spawn — used by `runDockerStreaming` AND by the
3636
+ * `executable` source mode in `docker-build.ts` (which runs an arbitrary
3637
+ * user-supplied build command, not docker).
3638
+ */
3639
+ async function spawnStreaming(cmd, args, options = {}) {
3640
+ const streamLive = options.streamLive ?? getLogger().getLevel() === "debug";
3641
+ const env = options.env ? mergeEnv(options.env) : void 0;
3642
+ return new Promise((resolve, reject) => {
3643
+ const child = spawn(cmd, args, {
3644
+ cwd: options.cwd,
3645
+ env,
3646
+ stdio: [
3647
+ options.input ? "pipe" : "ignore",
3648
+ "pipe",
3649
+ "pipe"
3650
+ ]
3651
+ });
3652
+ const stdoutChunks = [];
3653
+ const stderrChunks = [];
3654
+ child.stdout.on("data", (chunk) => {
3655
+ stdoutChunks.push(chunk);
3656
+ if (streamLive) process.stdout.write(chunk);
3657
+ });
3658
+ child.stderr.on("data", (chunk) => {
3659
+ stderrChunks.push(chunk);
3660
+ if (streamLive) process.stderr.write(chunk);
3661
+ });
3662
+ child.once("error", (err) => {
3663
+ if (err.code === "ENOENT") {
3664
+ const usingOverride = process.env["CDK_DOCKER"] === cmd && cmd !== "docker";
3665
+ reject(/* @__PURE__ */ new Error(usingOverride ? `Failed to find and execute '${cmd}' (resolved via CDK_DOCKER). Install '${cmd}' or unset CDK_DOCKER to fall back to 'docker'.` : `Failed to find and execute '${cmd}'. Install Docker (or set the 'CDK_DOCKER' environment variable to a compatible binary such as podman / finch).`));
3666
+ } else reject(err);
3667
+ });
3668
+ child.once("close", (code) => {
3669
+ const stdout = Buffer.concat(stdoutChunks).toString("utf-8");
3670
+ const stderr = Buffer.concat(stderrChunks).toString("utf-8");
3671
+ if (code === 0) resolve({
3672
+ stdout,
3673
+ stderr
3674
+ });
3675
+ else {
3676
+ const message = stderr.trim() || stdout.trim() || `${cmd} ${args[0] ?? ""} exited with code ${code}`;
3677
+ const err = new Error(message);
3678
+ err.stderr = stderr;
3679
+ err.stdout = stdout;
3680
+ err.exitCode = code;
3681
+ reject(err);
3682
+ }
3683
+ });
3684
+ if (options.input !== void 0) {
3685
+ child.stdin.on("error", () => {});
3686
+ child.stdin.write(options.input);
3687
+ child.stdin.end();
3688
+ }
3689
+ });
3690
+ }
3691
+ /**
3692
+ * Spawn a docker-compatible CLI binary (resolved via `getDockerCmd`) attached
3693
+ * to the parent process's stdio so the user sees live output (`docker pull`
3694
+ * layer progress, `docker login` interactive prompts that should never fire
3695
+ * with `--password-stdin` but still safe to inherit, etc.). Resolves on exit
3696
+ * code 0; rejects with a plain `Error` carrying the exit code on any non-zero
3697
+ * exit, so the caller can wrap with its own error class.
3698
+ *
3699
+ * Differs from {@link runDockerStreaming} in two ways:
3700
+ * 1. `stdio: 'inherit'` — output is NOT captured, so terminal control codes
3701
+ * (color, progress bar overwrites) flow through unchanged. This is the
3702
+ * load-bearing reason for the split: `docker pull`'s progress bars only
3703
+ * animate properly when stdout is a real TTY connected to the parent.
3704
+ * 2. No `input` / `streamLive` options — inherit-mode has nothing to
3705
+ * capture and nothing to mirror.
3706
+ *
3707
+ * Used by the `--verbose`-mode `docker pull` plumbing in `docker-runner.ts`
3708
+ * and `ecr-puller.ts` (visible layer progress). Non-verbose pulls go through
3709
+ * {@link runDockerStreaming} so stderr can be folded into the error message.
3710
+ */
3711
+ async function runDockerForeground(args, options = {}) {
3712
+ return spawnForeground(getDockerCmd(), args, options);
3713
+ }
3714
+ /**
3715
+ * Foreground (stdio-inherit) spawn — the inherit-mode counterpart to
3716
+ * {@link spawnStreaming}. Used by {@link runDockerForeground} for docker-CLI
3717
+ * subprocesses.
3718
+ *
3719
+ * The ENOENT branch crafts a docker-specific install hint ("Install Docker
3720
+ * (or set CDK_DOCKER ...)"), so non-docker callers reusing this helper
3721
+ * would see a misleading error on missing-binary failures. Keep the binary
3722
+ * docker-shaped, or update the ENOENT message before adding a non-docker
3723
+ * call site.
3724
+ */
3725
+ async function spawnForeground(cmd, args, options = {}) {
3726
+ const env = options.env ? mergeEnv(options.env) : void 0;
3727
+ return new Promise((resolve, reject) => {
3728
+ const child = spawn(cmd, args, {
3729
+ cwd: options.cwd,
3730
+ env,
3731
+ stdio: "inherit"
3732
+ });
3733
+ child.once("error", (err) => {
3734
+ if (err.code === "ENOENT") {
3735
+ const usingOverride = process.env["CDK_DOCKER"] === cmd && cmd !== "docker";
3736
+ reject(/* @__PURE__ */ new Error(usingOverride ? `Failed to find and execute '${cmd}' (resolved via CDK_DOCKER). Install '${cmd}' or unset CDK_DOCKER to fall back to 'docker'.` : `Failed to find and execute '${cmd}'. Install Docker (or set the 'CDK_DOCKER' environment variable to a compatible binary such as podman / finch).`));
3737
+ } else reject(/* @__PURE__ */ new Error(`${cmd} failed: ${err.message}`));
3738
+ });
3739
+ child.once("close", (code) => {
3740
+ if (code === 0) resolve();
3741
+ else reject(/* @__PURE__ */ new Error(`${cmd} exited with code ${code}`));
3742
+ });
3743
+ });
3744
+ }
3745
+ /**
3746
+ * Format the stderr from a failed `docker login` so the surfaced cdkd
3747
+ * error gives the user an actionable workaround when the underlying
3748
+ * failure is a credential-helper persistence bug (which has nothing to
3749
+ * do with cdkd, AWS, or IAM perms — the docker CLI itself fails to
3750
+ * save the auth token to the platform's credential store). The most
3751
+ * common shape is `osxkeychain` on macOS rejecting an overwrite for
3752
+ * an existing entry, but `wincred` (Windows), `pass` (Linux), and
3753
+ * `secretservice` (Linux) hit the same class of `Error saving
3754
+ * credentials` failure, so the rewritten message stays platform-
3755
+ * agnostic — `docker logout <endpoint>` is the correct recovery on
3756
+ * every backend.
3757
+ *
3758
+ * Detected docker / docker-credential-* output patterns:
3759
+ * - `error storing credentials - err: exit status 1, out: \`The
3760
+ * specified item already exists in the keychain.\`` (osxkeychain)
3761
+ * - `Error saving credentials: ...` (any backend)
3762
+ *
3763
+ * Non-matching failures (genuine IAM / network / endpoint problems)
3764
+ * pass through with just the stderr trimmed — the original message
3765
+ * stays load-bearing for diagnosis.
3766
+ */
3767
+ function formatDockerLoginError(stderr, endpoint) {
3768
+ const trimmed = stderr.trim();
3769
+ if (trimmed.includes("already exists in the keychain") || trimmed.includes("Error saving credentials")) return `docker's credential helper (osxkeychain on macOS / wincred on Windows / pass / secretservice on Linux) failed to persist the ECR auth token. The "already exists in the keychain" / "Error saving credentials" output is a known docker-credential-helpers issue — unrelated to cdkd, AWS credentials, or IAM perms. Quick fix: run \`docker logout ${endpoint}\` to clear the stale entry, then retry the cdkd command. Permanent fix: edit ~/.docker/config.json and remove (or empty) the platform-specific "credsStore" entry (e.g. "osxkeychain" → "" or "desktop" on macOS Docker Desktop). Original docker stderr: ${trimmed}`;
3770
+ return trimmed;
3771
+ }
3772
+ function mergeEnv(overrides) {
3773
+ const merged = { ...process.env };
3774
+ for (const [k, v] of Object.entries(overrides)) if (v === void 0) delete merged[k];
3775
+ else merged[k] = v;
3776
+ return merged;
3777
+ }
3778
+
2790
3779
  //#endregion
2791
3780
  //#region src/assets/docker-build.ts
2792
3781
  /**
@@ -8325,8 +9314,8 @@ const PROPERTY_COVERAGE_BY_TYPE = new Map([
8325
9314
  silentDrop: /* @__PURE__ */ new Map()
8326
9315
  }],
8327
9316
  ["AWS::CloudFront::Distribution", {
8328
- handled: new Set(["DistributionConfig"]),
8329
- silentDrop: new Map([["Tags", "not yet implemented by cdkd"]])
9317
+ handled: new Set(["DistributionConfig", "Tags"]),
9318
+ silentDrop: /* @__PURE__ */ new Map()
8330
9319
  }],
8331
9320
  ["AWS::CloudTrail::Trail", {
8332
9321
  handled: new Set([
@@ -9273,6 +10262,7 @@ const PROPERTY_COVERAGE_BY_TYPE = new Map([
9273
10262
  "MemorySize",
9274
10263
  "PackageType",
9275
10264
  "RecursiveLoop",
10265
+ "ReservedConcurrentExecutions",
9276
10266
  "Role",
9277
10267
  "Runtime",
9278
10268
  "SnapStart",
@@ -9287,7 +10277,6 @@ const PROPERTY_COVERAGE_BY_TYPE = new Map([
9287
10277
  ["DurableConfig", "not yet implemented by cdkd"],
9288
10278
  ["FunctionScalingConfig", "not yet implemented by cdkd"],
9289
10279
  ["PublishToLatestPublished", "not yet implemented by cdkd"],
9290
- ["ReservedConcurrentExecutions", "not yet implemented by cdkd"],
9291
10280
  ["RuntimeManagementConfig", "not yet implemented by cdkd"],
9292
10281
  ["TenancyConfig", "not yet implemented by cdkd"]
9293
10282
  ])
@@ -12597,5 +13586,5 @@ var DeployEngine = class {
12597
13586
  };
12598
13587
 
12599
13588
  //#endregion
12600
- export { AssetError as $, S3StateBackend as A, resolveCaptureObservedState as B, assertRegionMatch as C, DagBuilder as D, DiffCalculator as E, buildDockerImage as F, CFN_TEMPLATE_BODY_LIMIT as G, resolveStateBucketWithDefault as H, Synthesizer as I, findLargeInlineResources as J, CFN_TEMPLATE_URL_LIMIT as K, getDefaultStateBucketName as L, AssetPublisher as M, stringifyValue as N, TemplateParser as O, WorkGraph as P, resolveBucketRegion as Q, getLegacyStateBucketName as R, CloudControlProvider as S, applyRoleArnIfSet as T, resolveStateBucketWithDefaultAndSource as U, resolveSkipPrefix as V, warnDeprecatedNoPrefixCliFlag as W, AssemblyReader as X, uploadCfnTemplate as Y, clearBucketRegionCache as Z, matchesCdkPath as _, formatError as _t, withRetry as a, LocalStartServiceError as at, ProviderRegistry as b, withErrorHandling as bt, bold as c, NestedStackChildDirectDestroyError as ct, green as d, ResourceTimeoutError as dt, CdkdError as et, red as f, ResourceUpdateNotSupportedError as ft, CDK_PATH_TAG as g, SynthesisError as gt, collectInlinePolicyNamesManagedBySiblings as h, StateError as ht, withResourceDeadline as i, LocalMigrateError as it, shouldRetainResource as j, LockManager as k, cyan as l, PartialFailureError as lt, IAMRoleProvider as m, StackTerminationProtectionError as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, DependencyError as nt, IMPLICIT_DELETE_DEPENDENCIES as o, LockError as ot, yellow as p, StackHasActiveImportsError as pt, MIGRATE_TMP_PREFIX as q, DeployEngine as r, LocalInvokeBuildError as rt, formatResourceLine as s, MissingCdkCliError as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, ConfigError as tt, gray as u, ProvisioningError as ut, normalizeAwsTagsToCfn as v, isCdkdError as vt, IntrinsicFunctionResolver as w, findActionableSilentDrops as x, resolveExplicitPhysicalId as y, normalizeAwsError as yt, resolveApp as z };
12601
- //# sourceMappingURL=deploy-engine-C6v_fcDw.js.map
13589
+ export { uploadCfnTemplate as $, S3StateBackend as A, PATTERN_B_NAME_PROPERTIES as At, Synthesizer as B, assertRegionMatch as C, normalizeAwsError as Ct, DagBuilder as D, setLogger as Dt, DiffCalculator as E, getLogger as Et, buildDockerImage as F, withStackName as Ft, resolveSkipPrefix as G, getLegacyStateBucketName as H, formatDockerLoginError as I, warnDeprecatedNoPrefixCliFlag as J, resolveStateBucketWithDefault as K, getDockerCmd as L, AssetPublisher as M, generateResourceName as Mt, stringifyValue as N, generateResourceNameWithFallback as Nt, TemplateParser as O, runStackBuffered as Ot, WorkGraph as P, withSkipPrefix as Pt, findLargeInlineResources as Q, runDockerForeground as R, CloudControlProvider as S, isCdkdError as St, applyRoleArnIfSet as T, ConsoleLogger as Tt, resolveApp as U, getDefaultStateBucketName as V, resolveCaptureObservedState as W, CFN_TEMPLATE_URL_LIMIT as X, CFN_TEMPLATE_BODY_LIMIT as Y, MIGRATE_TMP_PREFIX as Z, matchesCdkPath as _, StackHasActiveImportsError as _t, withRetry as a, ConfigError as at, ProviderRegistry as b, SynthesisError as bt, bold as c, LocalMigrateError as ct, green as d, MissingCdkCliError as dt, AssemblyReader as et, red as f, NestedStackChildDirectDestroyError as ft, CDK_PATH_TAG as g, ResourceUpdateNotSupportedError as gt, collectInlinePolicyNamesManagedBySiblings as h, ResourceTimeoutError as ht, withResourceDeadline as i, CdkdError as it, shouldRetainResource as j, PATTERN_B_RESOURCE_TYPES as jt, LockManager as k, getLiveRenderer as kt, cyan as l, LocalStartServiceError as lt, IAMRoleProvider as m, ProvisioningError as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, resolveBucketRegion as nt, IMPLICIT_DELETE_DEPENDENCIES as o, DependencyError as ot, yellow as p, PartialFailureError as pt, resolveStateBucketWithDefaultAndSource as q, DeployEngine as r, AssetError as rt, formatResourceLine as s, LocalInvokeBuildError as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, clearBucketRegionCache as tt, gray as u, LockError as ut, normalizeAwsTagsToCfn as v, StackTerminationProtectionError as vt, IntrinsicFunctionResolver as w, withErrorHandling as wt, findActionableSilentDrops as x, formatError as xt, resolveExplicitPhysicalId as y, StateError as yt, runDockerStreaming as z };
13590
+ //# sourceMappingURL=deploy-engine-B3Xc-bxB.js.map