@go-to-k/cdkd 0.291.9 → 0.291.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as isVersionOnlyInvocation, t as getCdkdVersion } from "./version-RzKz4JAW.js";
2
+ import { n as isVersionOnlyInvocation, t as getCdkdVersion } from "./version-5OUy_OlQ.js";
3
3
 
4
4
  //#region src/cli/pipe-close-handler.ts
5
5
  /**
@@ -74,7 +74,7 @@ async function main() {
74
74
  console.log(getCdkdVersion());
75
75
  return;
76
76
  }
77
- const { buildProgram } = await import("./program-CY92mXcX.js");
77
+ const { buildProgram } = await import("./program-BfCsjuyU.js");
78
78
  const program = buildProgram();
79
79
  const args = reorderArgs(process.argv);
80
80
  await program.parseAsync(args);
@@ -1,6 +1,6 @@
1
1
  import { C as displayAwsMessage, D as truncateCodePoints, E as isPasteableIdent, S as UNRENDERABLE, T as displaySafe, d as applyDefaultNameForFallback, f as explicitNamePropertyFor, g as looksLikeCdkdGeneratedName, h as getCurrentStackName, m as generateResourceNameWithFallback, n as getLogger, p as generateResourceName, r as isStdoutReservedForPayload, s as getLiveRenderer, v as withStackName, w as displayIdent, x as STACK_REF_MAX_CODE_POINTS, y as withoutGeneratedFallbackName } from "./logger-GASr9bAF.js";
2
2
  import { a as setAssumedRoleCredentials, c as currentStackAwsScope, i as getPreAssumeEnvCredentials, l as runInStackAwsScope, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-jISU4PHo.js";
3
- import { t as getCdkdVersion } from "./version-RzKz4JAW.js";
3
+ import { t as getCdkdVersion } from "./version-5OUy_OlQ.js";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
5
  import { createHash, randomUUID } from "node:crypto";
6
6
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -10,7 +10,7 @@ import { SQSClient } from "@aws-sdk/client-sqs";
10
10
  import { PublishCommand, SNSClient } from "@aws-sdk/client-sns";
11
11
  import { GetFunctionCommand, GetFunctionUrlConfigCommand, InvokeCommand, LambdaClient, UpdateFunctionConfigurationCommand, waitUntilFunctionActiveV2, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
12
12
  import { AssumeRoleCommand, GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
13
- import { CreateSnapshotCommand, DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSnapshotsCommand, DescribeSubnetsCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
13
+ import { CreateSnapshotCommand, DeleteVolumeCommand, DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSnapshotsCommand, DescribeSubnetsCommand, DescribeVolumesCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
14
14
  import { DescribeTableCommand, DynamoDBClient } from "@aws-sdk/client-dynamodb";
15
15
  import { CloudFormationClient, CreateChangeSetCommand, DeleteStackCommand, DescribeChangeSetCommand, DescribeStacksCommand, DescribeTypeCommand, GetTemplateCommand, ListExportsCommand, waitUntilChangeSetCreateComplete } from "@aws-sdk/client-cloudformation";
16
16
  import { APIGatewayClient, GetRestApiCommand } from "@aws-sdk/client-api-gateway";
@@ -35,9 +35,10 @@ import { GetHostedZoneCommand, ListHostedZonesByNameCommand, Route53Client } fro
35
35
  import { DescribeListenersCommand, DescribeLoadBalancersCommand, ElasticLoadBalancingV2Client } from "@aws-sdk/client-elastic-load-balancing-v2";
36
36
  import { KMSClient, ListAliasesCommand } from "@aws-sdk/client-kms";
37
37
  import { readFile } from "fs/promises";
38
- import { isAbsolute as isAbsolute$1, resolve as resolve$1 } from "path";
38
+ import { isAbsolute as isAbsolute$1, relative, resolve as resolve$1, sep } from "path";
39
39
  import { CreateRepositoryCommand, DescribeImagesCommand as DescribeImagesCommand$1, DescribeRepositoriesCommand, ECRClient, GetAuthorizationTokenCommand, PutImageTagMutabilityCommand } from "@aws-sdk/client-ecr";
40
40
  import { inspect } from "node:util";
41
+ import { realpathSync as realpathSync$1 } from "fs";
41
42
  import { hostname } from "os";
42
43
  import graphlib from "graphlib";
43
44
  import { DescribeDBClustersCommand, DescribeDBInstancesCommand, RDSClient } from "@aws-sdk/client-rds";
@@ -8135,6 +8136,39 @@ const DOCKER_CLIENT_ENV_KEYS = /* @__PURE__ */ new Set([
8135
8136
  "GLIBC_TUNABLES",
8136
8137
  "GCONV_PATH",
8137
8138
  "BASH_ENV",
8139
+ "SHELLOPTS",
8140
+ "PS4",
8141
+ "PYTHONPATH",
8142
+ "PYTHONHOME",
8143
+ "PYTHONUSERBASE",
8144
+ "PYTHONPYCACHEPREFIX",
8145
+ "PYTHONPLATLIBDIR",
8146
+ "PYTHONWARNINGS",
8147
+ "BROWSER",
8148
+ "REQUESTS_CA_BUNDLE",
8149
+ "CURL_CA_BUNDLE",
8150
+ "HTTPLIB2_CA_CERTS",
8151
+ "SSLKEYLOGFILE",
8152
+ "GCE_METADATA_HOST",
8153
+ "GCE_METADATA_ROOT",
8154
+ "GCE_METADATA_IP",
8155
+ "NODE_OPTIONS",
8156
+ "NODE_PATH",
8157
+ "NODE_COMPILE_CACHE",
8158
+ "NODE_EXTRA_CA_CERTS",
8159
+ "NODE_TLS_REJECT_UNAUTHORIZED",
8160
+ "RUBYOPT",
8161
+ "RUBYLIB",
8162
+ "GEM_PATH",
8163
+ "GEM_HOME",
8164
+ "RUBYGEMS_GEMDEPS",
8165
+ "PERL5OPT",
8166
+ "PERL5LIB",
8167
+ "PERLLIB",
8168
+ "PERL5DB",
8169
+ "OPENSSL_CONF",
8170
+ "OPENSSL_MODULES",
8171
+ "OPENSSL_ENGINES",
8138
8172
  "SSH_AUTH_SOCK",
8139
8173
  "SSH_ASKPASS",
8140
8174
  "SSH_ASKPASS_REQUIRE",
@@ -8203,10 +8237,16 @@ const DOCKER_CLIENT_ENV_KEYS_UPPER = new Set([...DOCKER_CLIENT_ENV_KEYS].map((k)
8203
8237
  * family aws-sdk-go-v2 (and so `docker-credential-ecr-login`) honours — a
8204
8238
  * secret named `AWS_ENDPOINT_URL_ECR` walks around the exact
8205
8239
  * `AWS_ENDPOINT_URL` entry and redirects a request signed with the operator's
8206
- * real credentials (#2186 round 4). No plausible secret name collides with
8207
- * any of the three. Matched by prefix rather than enumerated (issue #2183
8208
- * review). `SSH_` was a prefix here and was demoted to an EXACT enumeration
8209
- * in {@link DOCKER_CLIENT_ENV_KEYS} (#2186 review round 3): the family is not
8240
+ * real credentials (#2186 round 4). `CLOUDSDK_` is gcloud's (#3599): every
8241
+ * gcloud property is settable as `CLOUDSDK_<SECTION>_<NAME>`, which covers
8242
+ * its token host, API endpoint overrides, proxy, CA bundle and account, and
8243
+ * the `docker-credential-gcloud` wrapper execs `$CLOUDSDK_PYTHON
8244
+ * $CLOUDSDK_PYTHON_ARGS`. `BASH_FUNC_` is bash's exported-function family.
8245
+ * No plausible secret name collides with these, apart from the one listed in
8246
+ * {@link DOCKER_CLIENT_ENV_PREFIX_EXEMPTIONS}. Matched by prefix rather than
8247
+ * enumerated (issue #2183 review). `SSH_` was a prefix here and was demoted to
8248
+ * an EXACT enumeration in {@link DOCKER_CLIENT_ENV_KEYS} (#2186 review round
8249
+ * 3): the family is not
8210
8250
  * uniformly dangerous and is not growing, while the prefix broke realistic,
8211
8251
  * currently-working secrets (`SSH_PRIVATE_KEY`, GitLab CI's canonical
8212
8252
  * deploy-key spelling). Exported so the test fence can assert the EXACT
@@ -8216,19 +8256,37 @@ const DOCKER_CLIENT_ENV_KEYS_UPPER = new Set([...DOCKER_CLIENT_ENV_KEYS].map((k)
8216
8256
  const DOCKER_CLIENT_ENV_PREFIXES = [
8217
8257
  "LD_",
8218
8258
  "DYLD_",
8219
- "AWS_ENDPOINT_URL_"
8259
+ "AWS_ENDPOINT_URL_",
8260
+ "CLOUDSDK_",
8261
+ "BASH_FUNC_"
8220
8262
  ];
8221
8263
  /**
8264
+ * Exact names inside a {@link DOCKER_CLIENT_ENV_PREFIXES} family that are still
8265
+ * delivered. An entry must be a realistic secret name AND harmless to the
8266
+ * helper that reads it. `CLOUDSDK_AUTH_ACCESS_TOKEN` is gcloud's own variable
8267
+ * for a caller-supplied access token (#3599). Given to `docker-credential-gcloud`,
8268
+ * it only changes which token gcloud hands docker, with no network call of its
8269
+ * own. gcloud's `auth docker-helper` answers only for a registry in its own
8270
+ * supported list unless `artifacts/allow_unrecognized_registry` is set, and
8271
+ * that property, the token host, the universe domain and every other variable
8272
+ * that could redirect or weaken the exchange stay refused by the `CLOUDSDK_`
8273
+ * prefix. Stored upper-case and matched case-insensitively. Never exempt an
8274
+ * exact {@link DOCKER_CLIENT_ENV_KEYS} member: the exact list wins.
8275
+ */
8276
+ const DOCKER_CLIENT_ENV_PREFIX_EXEMPTIONS = /* @__PURE__ */ new Set(["CLOUDSDK_AUTH_ACCESS_TOKEN"]);
8277
+ /**
8222
8278
  * Is `key` the name of a var the docker client reads? Case-INSENSITIVE, because
8223
8279
  * Windows environment lookups are, so a lowercase `docker_host` must be caught
8224
8280
  * too (issue #2183). Matches the exact denylist OR a prefixed family — the
8225
8281
  * prefix families are fail-closed on the whole prefix, so an unlisted `LD_*` /
8226
- * `DYLD_*` / `AWS_ENDPOINT_URL_*` secret is dropped (with a rename warning)
8227
- * rather than reaching the client.
8282
+ * `DYLD_*` / `AWS_ENDPOINT_URL_*` / `CLOUDSDK_*` / `BASH_FUNC_*` secret is
8283
+ * dropped (with a rename warning) rather than reaching the client, except for
8284
+ * a name in {@link DOCKER_CLIENT_ENV_PREFIX_EXEMPTIONS}.
8228
8285
  */
8229
8286
  function isDockerClientEnvKey(key) {
8230
8287
  const upper = key.toUpperCase();
8231
8288
  if (DOCKER_CLIENT_ENV_KEYS_UPPER.has(upper)) return true;
8289
+ if (DOCKER_CLIENT_ENV_PREFIX_EXEMPTIONS.has(upper)) return false;
8232
8290
  return DOCKER_CLIENT_ENV_PREFIXES.some((prefix) => upper.startsWith(prefix));
8233
8291
  }
8234
8292
  /**
@@ -9436,6 +9494,62 @@ function dockerSubject(assetId) {
9436
9494
  return assetId === void 0 ? "A Docker asset" : `Docker asset '${displaySafe(assetId)}'`;
9437
9495
  }
9438
9496
  /**
9497
+ * Refuse a Docker asset whose build context the bundled `cdk-local` engine
9498
+ * would take from outside the assembly (issue
9499
+ * [#3503](https://github.com/go-to-k/cdkd/issues/3503)).
9500
+ *
9501
+ * `cdk-local`'s own `buildDockerImage` spells the context (and the
9502
+ * `executable` arm's cwd) as `${cdkOutDir}/${source.directory}` with no
9503
+ * containment, and cdkd cannot hand it a pre-resolved path without changing
9504
+ * the image tag it derives from `source`. So this judges the path the engine
9505
+ * WILL open, before the engine runs, through the same
9506
+ * {@link resolveDockerContextDirectory} cdkd's own build uses.
9507
+ *
9508
+ * An ABSOLUTE value is judged by the engine's spelling, not honoured: the
9509
+ * concatenation folds it UNDER the manifest directory, so its leading
9510
+ * separators are stripped and the remainder takes the relative arm. That
9511
+ * keeps a symlink inside the assembly from becoming an escape through an
9512
+ * absolute spelling, and keeps the honour-and-warn arm, which describes a
9513
+ * build this engine never performs, out of these paths.
9514
+ */
9515
+ function assertCdkLocalDockerContextContained(opts) {
9516
+ const { manifestDir, source, assetOutdir, wrapError } = opts;
9517
+ const directory = source.directory;
9518
+ if (!directory) return;
9519
+ const asEngineJoinsIt = isAbsolute$1(directory) ? directory.replace(/^[/\\]+/, "") : directory;
9520
+ resolveDockerContextDirectory({
9521
+ manifestDir,
9522
+ directory: asEngineJoinsIt,
9523
+ wrapError,
9524
+ assetOutdir,
9525
+ sink: source.executable && source.executable.length > 0 ? "run this asset's source.executable with that directory as its working directory" : "send that directory to docker build as the context of an image cdkd then runs locally"
9526
+ });
9527
+ const engineSpelled = `${manifestDir}/${asEngineJoinsIt}`;
9528
+ const physical = tryRealpathNative(engineSpelled);
9529
+ if (physical === void 0) return;
9530
+ const bound = tryRealpathNative(assetOutdir) ?? resolve$1(assetOutdir);
9531
+ const rel = relative(bound, physical);
9532
+ if (rel === "" || rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute$1(rel)) return;
9533
+ throw wrapError(`asset source.directory='${displaySafe(directory)}' which ` + renderAssemblyPathEscape({
9534
+ contained: false,
9535
+ escape: "symlink",
9536
+ path: engineSpelled,
9537
+ realPath: physical
9538
+ }, assetOutdir, "build it"));
9539
+ }
9540
+ /**
9541
+ * `realpath(3)`, or `undefined` when the path does not resolve. `.native` is
9542
+ * load-bearing: the JavaScript `realpathSync` folds `..` lexically first,
9543
+ * which is the very reading the check above exists to avoid.
9544
+ */
9545
+ function tryRealpathNative(p) {
9546
+ try {
9547
+ return realpathSync$1.native(p);
9548
+ } catch {
9549
+ return;
9550
+ }
9551
+ }
9552
+ /**
9439
9553
  * Build a Docker image from a CDK asset source. Returns the local image
9440
9554
  * tag the caller should use for `docker tag` / `docker push` (publisher)
9441
9555
  * or `docker run` (local-invoke).
@@ -34318,6 +34432,221 @@ function isTerminationProtectionPropagationError(message) {
34318
34432
  return /may not be terminated|disableApiTermination/i.test(message);
34319
34433
  }
34320
34434
 
34435
+ //#endregion
34436
+ //#region src/provisioning/wait-abandoned.ts
34437
+ /**
34438
+ * The "cdkd stopped watching an operation that may still be running" marker
34439
+ * (issue [#3236](https://github.com/go-to-k/cdkd/issues/3236), widened by
34440
+ * [#3253](https://github.com/go-to-k/cdkd/issues/3253)).
34441
+ *
34442
+ * `CloudControlWaitAbandonedError` is raised in `cloud-control-provider.ts`,
34443
+ * and `ec2-volume-delete.ts` marks its own abandoned volume-delete wait (issue
34444
+ * [#3455](https://github.com/go-to-k/cdkd/issues/3455)) with the same marker,
34445
+ * but FIVE call sites have to refuse it, and three of them live in other
34446
+ * files. Four are GOVERNED by
34447
+ * `tests/unit/provisioning/wait-abandoned-guard-population.test.ts`:
34448
+ *
34449
+ * - `cloud-control-provider.ts`'s own `delete()` catch,
34450
+ * - `deploy-engine.ts`'s replacement delete-then-CREATE arm,
34451
+ * - `deploy-engine.ts`'s template-removal delete arm,
34452
+ * - `destroy-runner.ts`'s per-resource delete loop.
34453
+ *
34454
+ * The FIFTH is `cleanupFailedCreateRemnant`, and it is outside that population
34455
+ * by construction rather than by oversight: its partner classifier is the
34456
+ * REGEX helper `isNotFoundMessage`, which carries no literal needles, so no
34457
+ * needle-driven scan can find it. It has a behavioural case instead, and it
34458
+ * needs the guard for a sharper reason than the other four — that regex is
34459
+ * case-INSENSITIVE, so `getaddrinfo ENOTFOUND ...` matches `/not\s*found/i`.
34460
+ *
34461
+ * Each decides "the resource is already gone" by SUBSTRING-matching the error
34462
+ * message, and each then DROPS the state row. An abandoned wait says the
34463
+ * opposite — the delete may still be running — and its message interpolates
34464
+ * the LOGICAL ID and the last-seen IDENTIFIER, both user- or template-chosen,
34465
+ * so a resource named `PageNotFound` satisfies those needles. Round 1 of
34466
+ * go-to-k/cdkd#3249 guarded the first site with a local `instanceof` and left
34467
+ * the other three, which is what this module exists to fix: ONE predicate the
34468
+ * three foreign sites can import without importing the provider.
34469
+ *
34470
+ * **A marker rather than an exported class + `instanceof`**, for the reason
34471
+ * `markNonRetryable` is one: `deploy-engine.ts` reaches the provider only
34472
+ * through `ProviderRegistry`, so importing the class there would add an edge
34473
+ * into an already dense ring, and a marker survives a wrapper that copies a
34474
+ * message without preserving a prototype.
34475
+ *
34476
+ * **NOT `markNonRetryable`**, though the mechanism is identical: a DELETE or
34477
+ * UPDATE abandonment is deliberately left RETRYABLE so the destroy runner can
34478
+ * re-issue an idempotent delete, and only CREATE is marked. Reusing that
34479
+ * marker would either make the guards miss DELETE — the case that drops a
34480
+ * state row — or make a DELETE non-retryable and lose the recovery.
34481
+ *
34482
+ * A LEAF: no imports, ever. All four consumers sit on the deploy engine ->
34483
+ * rollback executor -> registry -> provider ring, and a new edge into it from
34484
+ * any of them would close a cycle.
34485
+ */
34486
+ const WAIT_ABANDONED_MARKER = Symbol.for("cdkd.waitAbandoned");
34487
+ /**
34488
+ * The `.cause` walk depth, the same bound `retryable-errors.ts` uses. cdkd
34489
+ * wraps errors, so the marked error is routinely one or two hops down.
34490
+ */
34491
+ const MAX_CAUSE_CHAIN_DEPTH = 5;
34492
+ /**
34493
+ * Stamp an error as an abandoned wait.
34494
+ *
34495
+ * `E extends Error`, not `object`: the reader below is a PROTOTYPE-CHAIN
34496
+ * lookup, so marking a class or a shared prototype would silently mark every
34497
+ * instance of it. A non-extensible (frozen / sealed) error is returned
34498
+ * UNMARKED rather than allowed to throw — callers use this inline, so a
34499
+ * `TypeError` raised here would REPLACE the error the caller meant to raise.
34500
+ * Both rules are `markNonRetryable`'s, for its reasons.
34501
+ */
34502
+ function markWaitAbandoned(error) {
34503
+ if (!Object.isExtensible(error)) return error;
34504
+ Object.defineProperty(error, WAIT_ABANDONED_MARKER, {
34505
+ value: true,
34506
+ enumerable: false,
34507
+ configurable: true,
34508
+ writable: false
34509
+ });
34510
+ return error;
34511
+ }
34512
+ /**
34513
+ * True when the error, or anything in its bounded `.cause` chain, was marked
34514
+ * by {@link markWaitAbandoned}.
34515
+ *
34516
+ * Every already-deleted classifier must test this BEFORE its substring match,
34517
+ * and must treat a true answer as "not already deleted" — i.e. re-throw. The
34518
+ * ordering is the whole point: a message-first guard has already decided by
34519
+ * the time it would consult the marker.
34520
+ */
34521
+ function isWaitAbandonedError(error) {
34522
+ let current = error;
34523
+ for (let depth = 0; depth < MAX_CAUSE_CHAIN_DEPTH && current != null; depth++) {
34524
+ if (current[WAIT_ABANDONED_MARKER] === true) return true;
34525
+ current = current.cause;
34526
+ }
34527
+ return false;
34528
+ }
34529
+
34530
+ //#endregion
34531
+ //#region src/provisioning/ec2-volume-delete.ts
34532
+ /**
34533
+ * Delete a Cloud-Control-routed `AWS::EC2::Volume` with EC2 `DeleteVolume`
34534
+ * instead of Cloud Control `DeleteResource` (issue
34535
+ * [#3455](https://github.com/go-to-k/cdkd/issues/3455)).
34536
+ *
34537
+ * WHY THE CLOUD CONTROL DELETE IS BYPASSED. The registry delete handler for
34538
+ * this type holds `ec2:CreateSnapshot` (it implements CloudFormation's
34539
+ * `DeletionPolicy: Snapshot` itself), and it has been observed taking that
34540
+ * snapshot on a plain Cloud Control delete, which carries no deletion policy
34541
+ * at all: CloudTrail shows a `CreateSnapshot` from `cloudformation.amazonaws.com`
34542
+ * in the same second as cdkd's `DeleteResource`, then the handler's
34543
+ * `DeleteVolume` while that snapshot was still pending. Both times it
34544
+ * happened, the volume then sat in `deleting` for well over the 15-minute
34545
+ * wait, the delete failed, and the handler's snapshot was left behind
34546
+ * untracked. What makes the handler do it is not known, so the only fix that
34547
+ * does not depend on the trigger is not to invoke the handler. The EC2 call is
34548
+ * the same one the handler makes; cdkd's own final snapshot (when the policy
34549
+ * asks for one) is taken and waited to `completed` before this runs.
34550
+ *
34551
+ * CONTRACT, matching the Cloud Control delete it replaces:
34552
+ * - Resolves only once the volume is GONE (`InvalidVolume.NotFound`, or state
34553
+ * `deleted`) — returning means "deleted" to every caller.
34554
+ * - `DeleteVolume`'s own errors propagate UNCHANGED, so the caller's
34555
+ * existing already-deleted arm (region-checked) sees `InvalidVolume.NotFound`
34556
+ * exactly as it saw Cloud Control's `NotFound`, and every other failure
34557
+ * takes the caller's ordinary wrap.
34558
+ * - `IncorrectState` from `DeleteVolume` on a volume that is already
34559
+ * `deleting`, `deleted` or gone (a re-run after an interrupted destroy, or
34560
+ * a race with one) is waited on rather than failed. If the describe that
34561
+ * classifies it fails, the ORIGINAL `IncorrectState` is rethrown, carrying
34562
+ * the describe failure as its `cause`.
34563
+ * - A TRANSIENT describe failure during the wait (a throttle, a 5xx, a
34564
+ * socket error — `isTransientFailure`, the Cloud Control poll's own
34565
+ * classifier) is re-polled for up to `transientGraceMs` of unbroken
34566
+ * failures, the same grace the Cloud Control wait gives its status poll.
34567
+ * - Every way the wait can end without seeing the volume gone — the
34568
+ * `maxWaitMs` deadline, the grace running out, a non-transient describe
34569
+ * failure — throws an error marked as an abandoned wait
34570
+ * (`wait-abandoned.ts`). Every already-deleted classifier refuses that
34571
+ * marker structurally, and they must: they match SUBSTRINGS of a message
34572
+ * that interpolates the user's logical id (`PageNotFound` would match). So
34573
+ * the state record is KEPT, and the error stays retryable, like a Cloud
34574
+ * Control DELETE abandonment, because a re-issued `DeleteVolume` is
34575
+ * idempotent.
34576
+ */
34577
+ async function deleteEc2VolumeDirect(client, volumeId, logicalId, opts) {
34578
+ const now = opts.now ?? Date.now;
34579
+ try {
34580
+ await client.send(new DeleteVolumeCommand({ VolumeId: volumeId }));
34581
+ opts.logger.debug(`DeleteVolume accepted for ${logicalId} (${volumeId})`);
34582
+ } catch (error) {
34583
+ if (errorName(error) !== "IncorrectState") throw error;
34584
+ let state;
34585
+ try {
34586
+ state = await readVolumeState(client, volumeId);
34587
+ } catch (describeError) {
34588
+ throw withCause(error, describeError);
34589
+ }
34590
+ if (!(state === void 0 || state === "deleted" || state === "deleting")) throw error;
34591
+ opts.logger.debug(`${logicalId} (${volumeId}) is already ${state ?? "gone"}; waiting for it to go`);
34592
+ }
34593
+ const abandoned = (reason, cause) => markWaitAbandoned(new ProvisioningError(`DELETE of ${logicalId} (${volumeId}) was accepted by EC2, but ${reason}. The state record is kept; re-run the command once the volume is gone.`, "AWS::EC2::Volume", logicalId, volumeId, cause instanceof Error ? cause : void 0));
34594
+ const deadline = now() + opts.maxWaitMs;
34595
+ let interval = 2e3;
34596
+ let outageStartedAt;
34597
+ for (;;) {
34598
+ let state;
34599
+ let polled = false;
34600
+ try {
34601
+ state = await readVolumeState(client, volumeId);
34602
+ polled = true;
34603
+ outageStartedAt = void 0;
34604
+ } catch (pollError) {
34605
+ if (!opts.isTransientFailure(pollError)) throw abandoned(`cdkd could not read the volume's state: ${describeAwsFailure(pollError).summary}`, pollError);
34606
+ outageStartedAt ??= now();
34607
+ const outageMs = now() - outageStartedAt;
34608
+ if (outageMs >= opts.transientGraceMs) throw abandoned(`cdkd could not read the volume's state for ${Math.round(outageMs / 1e3)}s: ` + describeAwsFailure(pollError).summary, pollError);
34609
+ opts.logger.debug(`Could not read ${logicalId} (${volumeId}) while waiting for its delete; re-polling: ${describeAwsFailure(pollError).detail}`);
34610
+ }
34611
+ if (polled && (state === void 0 || state === "deleted")) return;
34612
+ if (now() >= deadline) throw abandoned(polled ? `the volume was still '${state}' after ${Math.round(opts.maxWaitMs / 1e3)}s` : `cdkd could not read the volume's state before the ${Math.round(opts.maxWaitMs / 1e3)}s wait ran out`);
34613
+ if (polled) opts.logger.debug(`Waiting for ${logicalId} (${volumeId}) to be deleted (state: ${state})`);
34614
+ await opts.sleep(interval);
34615
+ interval = Math.min(Math.ceil(interval * 1.5), 1e4);
34616
+ }
34617
+ }
34618
+ /**
34619
+ * Rethrow `original` carrying `cause`, without replacing it: the caller's
34620
+ * classification (the idempotent arm, the retry classifier) must see the
34621
+ * `DeleteVolume` failure, not the describe that tried to explain it. A
34622
+ * non-extensible error, or one that already has a cause, is returned as-is.
34623
+ */
34624
+ function withCause(original, cause) {
34625
+ if (typeof original === "object" && original !== null && Object.isExtensible(original) && original.cause === void 0) Object.defineProperty(original, "cause", {
34626
+ value: cause,
34627
+ configurable: true,
34628
+ writable: true,
34629
+ enumerable: false
34630
+ });
34631
+ return original;
34632
+ }
34633
+ /** The volume's state, or `undefined` when EC2 reports it does not exist. */
34634
+ async function readVolumeState(client, volumeId) {
34635
+ try {
34636
+ const volume = (await client.send(new DescribeVolumesCommand({ VolumeIds: [volumeId] }))).Volumes?.[0];
34637
+ return volume === void 0 ? void 0 : volume.State ?? "unknown";
34638
+ } catch (error) {
34639
+ if (errorName(error) === "InvalidVolume.NotFound") return void 0;
34640
+ throw error;
34641
+ }
34642
+ }
34643
+ /** The error's `name`, or `''` — never throws, whatever was rejected. */
34644
+ function errorName(error) {
34645
+ if (typeof error !== "object" || error === null) return "";
34646
+ const name = error.name;
34647
+ return typeof name === "string" ? name : "";
34648
+ }
34649
+
34321
34650
  //#endregion
34322
34651
  //#region src/deployment/delete-outcome.ts
34323
34652
  /**
@@ -35188,99 +35517,6 @@ function slowCcOperationTimeoutMs(resourceType, operation) {
35188
35517
  }
35189
35518
  }
35190
35519
 
35191
- //#endregion
35192
- //#region src/provisioning/wait-abandoned.ts
35193
- /**
35194
- * The "cdkd stopped watching an operation that may still be running" marker
35195
- * (issue [#3236](https://github.com/go-to-k/cdkd/issues/3236), widened by
35196
- * [#3253](https://github.com/go-to-k/cdkd/issues/3253)).
35197
- *
35198
- * `CloudControlWaitAbandonedError` is raised in `cloud-control-provider.ts`,
35199
- * but FIVE call sites have to refuse it, and three of them live in other
35200
- * files. Four are GOVERNED by
35201
- * `tests/unit/provisioning/wait-abandoned-guard-population.test.ts`:
35202
- *
35203
- * - `cloud-control-provider.ts`'s own `delete()` catch,
35204
- * - `deploy-engine.ts`'s replacement delete-then-CREATE arm,
35205
- * - `deploy-engine.ts`'s template-removal delete arm,
35206
- * - `destroy-runner.ts`'s per-resource delete loop.
35207
- *
35208
- * The FIFTH is `cleanupFailedCreateRemnant`, and it is outside that population
35209
- * by construction rather than by oversight: its partner classifier is the
35210
- * REGEX helper `isNotFoundMessage`, which carries no literal needles, so no
35211
- * needle-driven scan can find it. It has a behavioural case instead, and it
35212
- * needs the guard for a sharper reason than the other four — that regex is
35213
- * case-INSENSITIVE, so `getaddrinfo ENOTFOUND ...` matches `/not\s*found/i`.
35214
- *
35215
- * Each decides "the resource is already gone" by SUBSTRING-matching the error
35216
- * message, and each then DROPS the state row. An abandoned wait says the
35217
- * opposite — the delete may still be running — and its message interpolates
35218
- * the LOGICAL ID and the last-seen IDENTIFIER, both user- or template-chosen,
35219
- * so a resource named `PageNotFound` satisfies those needles. Round 1 of
35220
- * go-to-k/cdkd#3249 guarded the first site with a local `instanceof` and left
35221
- * the other three, which is what this module exists to fix: ONE predicate the
35222
- * three foreign sites can import without importing the provider.
35223
- *
35224
- * **A marker rather than an exported class + `instanceof`**, for the reason
35225
- * `markNonRetryable` is one: `deploy-engine.ts` reaches the provider only
35226
- * through `ProviderRegistry`, so importing the class there would add an edge
35227
- * into an already dense ring, and a marker survives a wrapper that copies a
35228
- * message without preserving a prototype.
35229
- *
35230
- * **NOT `markNonRetryable`**, though the mechanism is identical: a DELETE or
35231
- * UPDATE abandonment is deliberately left RETRYABLE so the destroy runner can
35232
- * re-issue an idempotent delete, and only CREATE is marked. Reusing that
35233
- * marker would either make the guards miss DELETE — the case that drops a
35234
- * state row — or make a DELETE non-retryable and lose the recovery.
35235
- *
35236
- * A LEAF: no imports, ever. All four consumers sit on the deploy engine ->
35237
- * rollback executor -> registry -> provider ring, and a new edge into it from
35238
- * any of them would close a cycle.
35239
- */
35240
- const WAIT_ABANDONED_MARKER = Symbol.for("cdkd.waitAbandoned");
35241
- /**
35242
- * The `.cause` walk depth, the same bound `retryable-errors.ts` uses. cdkd
35243
- * wraps errors, so the marked error is routinely one or two hops down.
35244
- */
35245
- const MAX_CAUSE_CHAIN_DEPTH = 5;
35246
- /**
35247
- * Stamp an error as an abandoned wait.
35248
- *
35249
- * `E extends Error`, not `object`: the reader below is a PROTOTYPE-CHAIN
35250
- * lookup, so marking a class or a shared prototype would silently mark every
35251
- * instance of it. A non-extensible (frozen / sealed) error is returned
35252
- * UNMARKED rather than allowed to throw — callers use this inline, so a
35253
- * `TypeError` raised here would REPLACE the error the caller meant to raise.
35254
- * Both rules are `markNonRetryable`'s, for its reasons.
35255
- */
35256
- function markWaitAbandoned(error) {
35257
- if (!Object.isExtensible(error)) return error;
35258
- Object.defineProperty(error, WAIT_ABANDONED_MARKER, {
35259
- value: true,
35260
- enumerable: false,
35261
- configurable: true,
35262
- writable: false
35263
- });
35264
- return error;
35265
- }
35266
- /**
35267
- * True when the error, or anything in its bounded `.cause` chain, was marked
35268
- * by {@link markWaitAbandoned}.
35269
- *
35270
- * Every already-deleted classifier must test this BEFORE its substring match,
35271
- * and must treat a true answer as "not already deleted" — i.e. re-throw. The
35272
- * ordering is the whole point: a message-first guard has already decided by
35273
- * the time it would consult the marker.
35274
- */
35275
- function isWaitAbandonedError(error) {
35276
- let current = error;
35277
- for (let depth = 0; depth < MAX_CAUSE_CHAIN_DEPTH && current != null; depth++) {
35278
- if (current[WAIT_ABANDONED_MARKER] === true) return true;
35279
- current = current.cause;
35280
- }
35281
- return false;
35282
- }
35283
-
35284
35520
  //#endregion
35285
35521
  //#region src/provisioning/cloud-control-provider.ts
35286
35522
  /**
@@ -35961,7 +36197,7 @@ var CloudControlProvider = class {
35961
36197
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
35962
36198
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
35963
36199
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
35964
- const { ASGProvider } = await import("./asg-provider-D9EJApN9.js").then((n) => n.n);
36200
+ const { ASGProvider } = await import("./asg-provider-BY-tj21g.js").then((n) => n.n);
35965
36201
  const asgProvider = new ASGProvider();
35966
36202
  return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
35967
36203
  }
@@ -35971,8 +36207,20 @@ var CloudControlProvider = class {
35971
36207
  const protectionEntry = ccProtectionProperty(resourceType);
35972
36208
  if (protectionEntry) await this.disableCcProtection(logicalId, physicalId, resourceType, protectionEntry);
35973
36209
  }
36210
+ const volumeEc2Client = resourceType === "AWS::EC2::Volume" ? await this.ec2ClientInCcRegion(resourceType, logicalId, physicalId) : void 0;
35974
36211
  const maxAttempts = isProtectedEc2Instance ? 5 : 1;
35975
36212
  for (let attempt = 1;; attempt++) try {
36213
+ if (volumeEc2Client !== void 0) {
36214
+ await deleteEc2VolumeDirect(volumeEc2Client, physicalId, logicalId, {
36215
+ logger: this.logger,
36216
+ sleep: (ms) => this.sleep(ms),
36217
+ maxWaitMs: Math.max(this.MAX_WAIT_TIME_MS, slowCcOperationTimeoutMs(resourceType, "DELETE")),
36218
+ transientGraceMs: this.POLL_TRANSIENT_GRACE_MS,
36219
+ isTransientFailure: isTransientPollFailure
36220
+ });
36221
+ this.logger.debug(`Deleted resource ${logicalId}`);
36222
+ return withIndeterminateGuard(void 0, indeterminateGuard);
36223
+ }
35976
36224
  const deleteResponse = await this.cloudControlClient.send(new DeleteResourceCommand({
35977
36225
  TypeName: resourceType,
35978
36226
  Identifier: physicalId
@@ -36000,6 +36248,32 @@ var CloudControlProvider = class {
36000
36248
  }
36001
36249
  }
36002
36250
  /**
36251
+ * The EC2 client for a delete this provider issues through EC2 instead of
36252
+ * Cloud Control (issue #3455), refused unless it targets the SAME region as
36253
+ * the Cloud Control client the region pre-flight vetted.
36254
+ *
36255
+ * `getAwsClients()` is read at call time while `cloudControlClient` was
36256
+ * captured at construction, so the two are not the same object and could
36257
+ * name different regions. The comparison is load-bearing rather than
36258
+ * defensive: a volume id is region-scoped, so a wrong-region `DeleteVolume`
36259
+ * answers `InvalidVolume.NotFound`, which the caller's already-deleted arm
36260
+ * would take as success and drop the record of a live volume.
36261
+ */
36262
+ async ec2ClientInCcRegion(resourceType, logicalId, physicalId) {
36263
+ const ec2 = getAwsClients().ec2;
36264
+ const resolve = async (client) => {
36265
+ try {
36266
+ return canonicalizeRegion((await client.config.region())?.trim());
36267
+ } catch {
36268
+ return;
36269
+ }
36270
+ };
36271
+ const ccRegion = await resolve(this.cloudControlClient);
36272
+ const ec2Region = await resolve(ec2);
36273
+ if (ccRegion === void 0 || ccRegion === "" || ccRegion !== ec2Region) throw markNonRetryable(new ProvisioningError(`Refusing to delete ${logicalId} (${resourceType}, ${physicalId}): the EC2 client targets region '${ec2Region ?? "unknown"}' but the Cloud Control client targets '${ccRegion ?? "unknown"}', so cdkd cannot show the delete would reach this volume. Re-run with --region set to the stack's region.`, resourceType, logicalId, physicalId));
36274
+ return ec2;
36275
+ }
36276
+ /**
36003
36277
  * Refuse a Cloud Control call whose target region cannot be shown to be the
36004
36278
  * one the state record was written in (issue #2301).
36005
36279
  *
@@ -51280,5 +51554,5 @@ var DeployEngine = class DeployEngine {
51280
51554
  };
51281
51555
 
51282
51556
  //#endregion
51283
- export { yellow as $, markRedactedCause as $a, PARTITION_TABLE as $i, repairMalformedResourcePropertiesForReadOnly as $n, AssetModeResolver as $r, requireConfigObject as $t, createPreDeleteFinalSnapshot as A, LocalStartServiceError as Aa, getLegacyStateBucketName as Ai, malformedOutputsRefusalMessage as An, buildForceUnlockCommand as Ar, carriesDynamicReference as At, isStatefulRecreateTargetSync as B, StateError as Ba, ssmResolvedValueType as Bi, refuseMalformedOrphansForDestroy as Bn, importableOutputKeys as Br, isSettledInstanceState as Bt, namesAnyDeclaredParameter as C, ConfigError as Ca, escapeRegExp$1 as Ci, isReadableResourceEntry as Cn, recoverMaskedOutput as Cr, slowCcOperationTimeoutMs as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, DynamicReferenceRegionAmbiguousError as Da, Synthesizer as Di, malformedOrphanRecordsWarning as Dn, S3StateBackend as Dr, disableInstanceApiTermination as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, DeployCancelledError as Ea, getDockerImageBySourceHash as Ei, malformedLocalOutputsWarning as En, LockManager as Er, deleteSkipReason as Et, extractDeploymentEventError as F, ProvisioningError as Fa, resolveStateBucketWithDefault as Fi, malformedResourcesWarning as Fn, DEFAULT_STATE_PREFIX as Fr, isImpossibleEmptyStoredAttribute as Ft, toCfnInteger as G, withErrorHandling as Ga, uploadCfnTemplate as Gi, refuseMalformedResourceEntries as Gn, shouldRetainResource as Gr, coerceCfnBoolean as Gt, WARM_THROUGHPUT_MEMBERS as H, formatError as Ha, CFN_TEMPLATE_URL_LIMIT as Hi, refuseMalformedOutputs as Hn, isReadableBag as Hr, normalizeAwsTagsToCfn as Ht, makeSiblingClaimReader as I, ResourceTimeoutError as Ia, resolveStateBucketWithDefaultAndSource as Ii, malformedStateRefusalMessage as In, exportNamesCarriedFrom as Ir, isNamelessDynamicReferenceError as It, bold as J, isMarkedNonRetryable as Ja, injectiveKeyPrefix as Ji, refuseMalformedResourcesForDestroy as Jn, WorkGraph as Jr, configIntegerRefusal as Jt, toFiniteNumber as K, pasteableCommand as Ka, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Ki, refuseMalformedResourceEntriesForOrphan as Kn, AssetPublisher as Kr, coerceCfnInteger as Kt, planOrphanAdoption as L, ResourceUpdateNotSupportedError as La, resolveUseCdkBootstrapAssets as Li, refuseDivergentRecordRegionForDestroy as Ln, hasReadableExportSet as Lr, isUnboundTemplateParameter as Lt, refusesFinalSnapshot as M, MalformedProducerRecordRefusalError as Ma, resolveAutoAssetStorage as Mi, malformedRenderedContainersWarning as Mn, forceQuitRecoveryClause as Mr, cfnRefValueFromPhysicalId as Mt, unsupportedFinalSnapshotError as N, NestedStackChildDirectDestroyError as Na, resolveCaptureObservedState as Ni, malformedResourceEntriesWarning as Nn, formatLockExpiry as Nr, coerceParameterTypedValue as Nt, buildFinalSnapshotIdentifier as O, IntrinsicResolutionRefusalError as Oa, synthesisStatusMessage as Oi, malformedOrphansRefusalMessage as On, rebuildClientForBucketRegion as Or, isTerminationProtectionPropagationError as Ot, makeCanonicalizePropertiesFn as P, PartialFailureError as Pa, resolveSkipPrefix as Pi, malformedResourcePropertiesWarning as Pn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Pr, getAccountInfo as Pt, red as Q, markNonRetryable as Qa, expectedOwnerParam as Qi, repairMalformedResourceEntriesForReadOnly as Qn, rewriteTemplateAssetReferences as Qr, requireConfigArray as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, StackHasActiveImportsError as Ra, stateBucketExistenceConfirmed as Ri, refuseMalformedNestedChildOutputs as Rn, hasReasonlessBaselineRefusal as Rr, parameterTypeMayLoseSecretIdentity as Rt, computeParameterTaint as S, CdkdError as Sa, runDockerStreaming as Si, hasReadableResources as Sn, recordMaskOnlyValue as Sr, isWaitAbandonedError as St, resourcesNamingDeclaredParameter as T, DependencyError as Ta, AssetManifestLoader as Ti, malformedExportSourceWarning as Tn, scrubResourceRecord as Tr, deleteIndeterminateGuards as Tt, coerceWarmThroughput as U, isCdkdError as Ua, MIGRATE_TMP_PREFIX as Ui, refuseMalformedOutputsForDestroy as Un, orphansAfterRollback as Ur, resolveExplicitPhysicalId as Ut, renderStatefulReason as V, SynthesisError as Va, CFN_TEMPLATE_BODY_LIMIT as Vi, refuseMalformedOrphansForOrphan as Vn, importableOutputs as Vr, WAFv2WebACLProvider as Vt, isWarmThroughputDecrease as W, normalizeAwsError as Wa, findLargeInlineResources as Wi, refuseMalformedResourceAttributesForOrphan as Wn, orphansCarriedFrom as Wr, assertRegionMatch as Wt, gray as X, isThrottlingError as Xa, producerRecordKey as Xi, repairMalformedOrphansForReadOnly as Xn, createAssetRedirectResolver as Xr, readConfigString as Xt, cyan as Y, isRetryableTransientError as Ya, producerCoordinateKey as Yi, refuseMalformedState as Yn, buildAssetRedirectMap as Yr, configStringRefusal as Yt, green as Z, isTransientServerError as Za, decodeListingKey as Zi, repairMalformedOutputsForReadOnly as Zn, loadPublishableAssetManifest as Zr, replayWarn as Zt, bagHoldsSecretExpression as _, getAwsClients as _a, formatDockerLoginError as _i, UNREADABLE_ORPHANS_CONTAINER_ROW as _n, identityKeyFor as _r, endCommandInterruptScope as _t, DeploymentEventsStore as a, processStackMessages as aa, parseBootstrapMarker as ai, s3BucketDomainName as an, describeTypeWithThrottleRetry as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, setAwsClients as ba, redactDockerArgvValues as bi, hasReadableOrphans as bn, maskSecretsInError as br, startInterruptWatch as bt, replayFailedOperations as c, hasPlainPrototype$1 as ca, validateContainerRepoName as ci, s3BucketWebsiteUrl as cn, TemplateParser as cr, IAMRoleProvider as ct, updatePartialMessage as d, absoluteAssemblyPathEscape as da, resolveDockerContextDirectory as di, applyCallerIdentityCredentials as dn, STATE_SOURCED_READBACK_RULES as dr, ProviderRegistry as dt, canonicalizeRegion as ea, BOOTSTRAP_MARKER_PREFIX as ei, requireConfigString as en, retryClassificationText as eo, repairMalformedResourcesForReadOnly as er, collectDeclaredOutputNames as et, updatePartialReason as f, renderAssemblyPathEscape as fa, warnManifestExecutable as fi, callerEnvCredentials as fn, TEMPLATE_SOURCED_RULES as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, AwsClients as ga, dockerSpawnEnvWithSensitive as gi, STATE_RESOURCES_MALFORMED as gn, errorCauseChain as gr, beginCommandInterruptScope as gt, IMPLICIT_DELETE_DEPENDENCIES as h, resolveBucketRegion as ha, describeDockerFailure as hi, INTRINSIC_KEYS as hn, dynamicReferenceTokens as hr, maskerOrIdentity as ht, DeploymentEventsReader as i, globMatches as ia, isCrossRegionRedirect as ii, s3BucketArn as in, findSilentDropProperties as ir, secretBearing as it, isFinalSnapshotError as j, LockError as ja, resolveApp as ji, malformedOutputsWarning as jn, buildLockContentionMessage as jr, carriesFetchableDynamicReference as jt, ccRoutedFinalSnapshotError as k, LocalInvokeBuildError as ka, getDefaultStateBucketName as ki, malformedOrphansWarning as kn, UNREPRODUCIBLE_LOCK_CLAUSE as kr, IntrinsicFunctionResolver as kt, replayRollback as l, nullPrototypeRecord as la, buildDenyExternalAccessPolicy as li, applyRoleArnIfSet as ln, STATE_SOURCED_BASELINE_RULES as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, clearBucketRegionCache as ma, describeDockerExecFailure as mi, DiffCalculator as mn, createSecretMasker as mr, maskDeep as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, AssemblyReader as na, ensureAssetStorage as ni, producerRegionsFromState as nn, safeStringify$1 as no, safeStackName as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, defineOwnKey as oa, readBootstrapMarkerBody as oi, s3BucketDualStackDomainName as on, withRetry as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, resolveAssemblyPath as pa, describeDockerCapturedOutput as pi, envCredentialsAreAssumedRole as pn, carriesSecretMask as pr, createMaskedRetryLogger as pt, formatResourceLine as q, shellQuote as qa, injectiveKey as qi, refuseMalformedResourcePropertiesForOrphan as qn, stringifyValue as qr, configBooleanRefusal as qt, DeployEngine as r, failedStageNote as ra, getBootstrapMarkerKey as ri, withSharedDrainBudget as rn, __exportAll as ro, findActionableSilentDrops as rr, isExportAliasCollision as rt, planRollback as s, hasOwnKey as sa, validateAssetBucketName as si, s3BucketRegionalDomainName as sn, DagBuilder as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, derivePartitionAndUrlSuffix as ta, assertAssetBucketRegion as ti, classifyReplaySecretRegion as tn, describeAwsFailure as to, safeRegion as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, ownValue as ua, buildDockerImage as ui, AWS_CREDENTIAL_ENV_KEYS as un, STATE_SOURCED_CROSS_GENERATION_RULES as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, resetAwsClients as va, getDockerCmd as vi, UNREADABLE_RESOURCES_MAP_ROW as vn, isSingleDynamicReferenceToken as vr, interruptWatchListenerCount as vt, reachableDivergentParameters as w, CrossAccountSecretRefusalError as wa, stripControlChars as wi, malformedExportNamesWarning as wn, redactSecretsForState as wr, UNSPECIFIED_SKIP_REASON as wt, bindingSkippedOutputs as x, AssetError as xa, runDockerForeground as xi, hasReadableOutputs as xn, maskSecretsInText as xr, CloudControlProvider as xt, keptWholeReasonText as y, runWithStackAwsClients as ya, partitionSensitiveEnv as yi, displayLogicalId as yn, markSameGenerationBag as yr, isInterruptedWaitError as yt, isStatefulRecreateTargetForReplace as z, StackTerminationProtectionError as za, warnDeprecatedNoPrefixCliFlag as zi, refuseMalformedOrphans as zn, hasUnverifiableParameterRefusal as zr, refStateLookupFromResource as zt };
51284
- //# sourceMappingURL=deploy-engine-TkL9nyq8.js.map
51557
+ export { yellow as $, markNonRetryable as $a, expectedOwnerParam as $i, repairMalformedResourcePropertiesForReadOnly as $n, AssetModeResolver as $r, requireConfigObject as $t, createPreDeleteFinalSnapshot as A, LocalInvokeBuildError as Aa, getDefaultStateBucketName as Ai, malformedOutputsRefusalMessage as An, buildForceUnlockCommand as Ar, carriesDynamicReference as At, isStatefulRecreateTargetSync as B, StackTerminationProtectionError as Ba, warnDeprecatedNoPrefixCliFlag as Bi, refuseMalformedOrphansForDestroy as Bn, importableOutputKeys as Br, isSettledInstanceState as Bt, namesAnyDeclaredParameter as C, CdkdError as Ca, runDockerStreaming as Ci, isReadableResourceEntry as Cn, recoverMaskedOutput as Cr, UNSPECIFIED_SKIP_REASON as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, DeployCancelledError as Da, getDockerImageBySourceHash as Di, malformedOrphanRecordsWarning as Dn, S3StateBackend as Dr, disableInstanceApiTermination as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, DependencyError as Ea, AssetManifestLoader as Ei, malformedLocalOutputsWarning as En, LockManager as Er, isWaitAbandonedError as Et, extractDeploymentEventError as F, PartialFailureError as Fa, resolveSkipPrefix as Fi, malformedResourcesWarning as Fn, DEFAULT_STATE_PREFIX as Fr, isImpossibleEmptyStoredAttribute as Ft, toCfnInteger as G, normalizeAwsError as Ga, findLargeInlineResources as Gi, refuseMalformedResourceEntries as Gn, shouldRetainResource as Gr, coerceCfnBoolean as Gt, WARM_THROUGHPUT_MEMBERS as H, SynthesisError as Ha, CFN_TEMPLATE_BODY_LIMIT as Hi, refuseMalformedOutputs as Hn, isReadableBag as Hr, normalizeAwsTagsToCfn as Ht, makeSiblingClaimReader as I, ProvisioningError as Ia, resolveStateBucketWithDefault as Ii, malformedStateRefusalMessage as In, exportNamesCarriedFrom as Ir, isNamelessDynamicReferenceError as It, bold as J, shellQuote as Ja, injectiveKey as Ji, refuseMalformedResourcesForDestroy as Jn, WorkGraph as Jr, configIntegerRefusal as Jt, toFiniteNumber as K, withErrorHandling as Ka, uploadCfnTemplate as Ki, refuseMalformedResourceEntriesForOrphan as Kn, AssetPublisher as Kr, coerceCfnInteger as Kt, planOrphanAdoption as L, ResourceTimeoutError as La, resolveStateBucketWithDefaultAndSource as Li, refuseDivergentRecordRegionForDestroy as Ln, hasReadableExportSet as Lr, isUnboundTemplateParameter as Lt, refusesFinalSnapshot as M, LockError as Ma, resolveApp as Mi, malformedRenderedContainersWarning as Mn, forceQuitRecoveryClause as Mr, cfnRefValueFromPhysicalId as Mt, unsupportedFinalSnapshotError as N, MalformedProducerRecordRefusalError as Na, resolveAutoAssetStorage as Ni, malformedResourceEntriesWarning as Nn, formatLockExpiry as Nr, coerceParameterTypedValue as Nt, buildFinalSnapshotIdentifier as O, DynamicReferenceRegionAmbiguousError as Oa, Synthesizer as Oi, malformedOrphansRefusalMessage as On, rebuildClientForBucketRegion as Or, isTerminationProtectionPropagationError as Ot, makeCanonicalizePropertiesFn as P, NestedStackChildDirectDestroyError as Pa, resolveCaptureObservedState as Pi, malformedResourcePropertiesWarning as Pn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Pr, getAccountInfo as Pt, red as Q, isTransientServerError as Qa, decodeListingKey as Qi, repairMalformedResourceEntriesForReadOnly as Qn, rewriteTemplateAssetReferences as Qr, requireConfigArray as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, ResourceUpdateNotSupportedError as Ra, resolveUseCdkBootstrapAssets as Ri, refuseMalformedNestedChildOutputs as Rn, hasReasonlessBaselineRefusal as Rr, parameterTypeMayLoseSecretIdentity as Rt, computeParameterTaint as S, AssetError as Sa, runDockerForeground as Si, hasReadableResources as Sn, recordMaskOnlyValue as Sr, slowCcOperationTimeoutMs as St, resourcesNamingDeclaredParameter as T, CrossAccountSecretRefusalError as Ta, stripControlChars as Ti, malformedExportSourceWarning as Tn, scrubResourceRecord as Tr, deleteSkipReason as Tt, coerceWarmThroughput as U, formatError as Ua, CFN_TEMPLATE_URL_LIMIT as Ui, refuseMalformedOutputsForDestroy as Un, orphansAfterRollback as Ur, resolveExplicitPhysicalId as Ut, renderStatefulReason as V, StateError as Va, ssmResolvedValueType as Vi, refuseMalformedOrphansForOrphan as Vn, importableOutputs as Vr, WAFv2WebACLProvider as Vt, isWarmThroughputDecrease as W, isCdkdError as Wa, MIGRATE_TMP_PREFIX as Wi, refuseMalformedResourceAttributesForOrphan as Wn, orphansCarriedFrom as Wr, assertRegionMatch as Wt, gray as X, isRetryableTransientError as Xa, producerCoordinateKey as Xi, repairMalformedOrphansForReadOnly as Xn, createAssetRedirectResolver as Xr, readConfigString as Xt, cyan as Y, isMarkedNonRetryable as Ya, injectiveKeyPrefix as Yi, refuseMalformedState as Yn, buildAssetRedirectMap as Yr, configStringRefusal as Yt, green as Z, isThrottlingError as Za, producerRecordKey as Zi, repairMalformedOutputsForReadOnly as Zn, loadPublishableAssetManifest as Zr, replayWarn as Zt, bagHoldsSecretExpression as _, AwsClients as _a, dockerSpawnEnvWithSensitive as _i, UNREADABLE_ORPHANS_CONTAINER_ROW as _n, identityKeyFor as _r, endCommandInterruptScope as _t, DeploymentEventsStore as a, globMatches as aa, parseBootstrapMarker as ai, s3BucketDomainName as an, describeTypeWithThrottleRetry as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, runWithStackAwsClients as ba, partitionSensitiveEnv as bi, hasReadableOrphans as bn, maskSecretsInError as br, startInterruptWatch as bt, replayFailedOperations as c, hasOwnKey as ca, validateContainerRepoName as ci, s3BucketWebsiteUrl as cn, TemplateParser as cr, IAMRoleProvider as ct, updatePartialMessage as d, ownValue as da, buildDockerImage as di, applyCallerIdentityCredentials as dn, STATE_SOURCED_READBACK_RULES as dr, ProviderRegistry as dt, PARTITION_TABLE as ea, BOOTSTRAP_MARKER_PREFIX as ei, requireConfigString as en, markRedactedCause as eo, repairMalformedResourcesForReadOnly as er, collectDeclaredOutputNames as et, updatePartialReason as f, absoluteAssemblyPathEscape as fa, resolveDockerContextDirectory as fi, callerEnvCredentials as fn, TEMPLATE_SOURCED_RULES as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, resolveBucketRegion as ga, describeDockerFailure as gi, STATE_RESOURCES_MALFORMED as gn, errorCauseChain as gr, beginCommandInterruptScope as gt, IMPLICIT_DELETE_DEPENDENCIES as h, clearBucketRegionCache as ha, describeDockerExecFailure as hi, INTRINSIC_KEYS as hn, dynamicReferenceTokens as hr, maskerOrIdentity as ht, DeploymentEventsReader as i, failedStageNote as ia, isCrossRegionRedirect as ii, s3BucketArn as in, __exportAll as io, findSilentDropProperties as ir, secretBearing as it, isFinalSnapshotError as j, LocalStartServiceError as ja, getLegacyStateBucketName as ji, malformedOutputsWarning as jn, buildLockContentionMessage as jr, carriesFetchableDynamicReference as jt, ccRoutedFinalSnapshotError as k, IntrinsicResolutionRefusalError as ka, synthesisStatusMessage as ki, malformedOrphansWarning as kn, UNREPRODUCIBLE_LOCK_CLAUSE as kr, IntrinsicFunctionResolver as kt, replayRollback as l, hasPlainPrototype$1 as la, buildDenyExternalAccessPolicy as li, applyRoleArnIfSet as ln, STATE_SOURCED_BASELINE_RULES as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, resolveAssemblyPath as ma, describeDockerCapturedOutput as mi, DiffCalculator as mn, createSecretMasker as mr, maskDeep as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, derivePartitionAndUrlSuffix as na, ensureAssetStorage as ni, producerRegionsFromState as nn, describeAwsFailure as no, safeStackName as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, processStackMessages as oa, readBootstrapMarkerBody as oi, s3BucketDualStackDomainName as on, withRetry as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, renderAssemblyPathEscape as pa, warnManifestExecutable as pi, envCredentialsAreAssumedRole as pn, carriesSecretMask as pr, createMaskedRetryLogger as pt, formatResourceLine as q, pasteableCommand as qa, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as qi, refuseMalformedResourcePropertiesForOrphan as qn, stringifyValue as qr, configBooleanRefusal as qt, DeployEngine as r, AssemblyReader as ra, getBootstrapMarkerKey as ri, withSharedDrainBudget as rn, safeStringify$1 as ro, findActionableSilentDrops as rr, isExportAliasCollision as rt, planRollback as s, defineOwnKey as sa, validateAssetBucketName as si, s3BucketRegionalDomainName as sn, DagBuilder as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, canonicalizeRegion as ta, assertAssetBucketRegion as ti, classifyReplaySecretRegion as tn, retryClassificationText as to, safeRegion as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, nullPrototypeRecord as ua, assertCdkLocalDockerContextContained as ui, AWS_CREDENTIAL_ENV_KEYS as un, STATE_SOURCED_CROSS_GENERATION_RULES as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, getAwsClients as va, formatDockerLoginError as vi, UNREADABLE_RESOURCES_MAP_ROW as vn, isSingleDynamicReferenceToken as vr, interruptWatchListenerCount as vt, reachableDivergentParameters as w, ConfigError as wa, escapeRegExp$1 as wi, malformedExportNamesWarning as wn, redactSecretsForState as wr, deleteIndeterminateGuards as wt, bindingSkippedOutputs as x, setAwsClients as xa, redactDockerArgvValues as xi, hasReadableOutputs as xn, maskSecretsInText as xr, CloudControlProvider as xt, keptWholeReasonText as y, resetAwsClients as ya, getDockerCmd as yi, displayLogicalId as yn, markSameGenerationBag as yr, isInterruptedWaitError as yt, isStatefulRecreateTargetForReplace as z, StackHasActiveImportsError as za, stateBucketExistenceConfirmed as zi, refuseMalformedOrphans as zn, hasUnverifiableParameterRefusal as zr, refStateLookupFromResource as zt };
51558
+ //# sourceMappingURL=deploy-engine-BomFOZF4.js.map