@go-to-k/cdkd 0.282.5 → 0.282.7

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,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as configStringRefusal, $t as resolveUseCdkBootstrapAssets, A as green, An as PartialFailureError, At as BOOTSTRAP_MARKER_PREFIX, B as slowCcOperationTimeoutMs, Bn as normalizeAwsError, Bt as runDockerStreaming, C as MULTI_REGION_RECREATE_BLOCKED_TYPES, Cn as DeployCancelledError, Ct as stringifyValue, D as bold, Dt as loadPublishableAssetManifest, E as formatResourceLine, En as LocalStartServiceError, Et as createAssetRedirectResolver, F as clearOnUpdateRemoval, Fn as StackTerminationProtectionError, Ft as validateContainerRepoName, G as getAccountInfo, Gt as getDefaultStateBucketName, H as isTerminationProtectionPropagationError, Ht as getDockerImageBySourceHash, I as ProviderRegistry, It as buildDockerImage, J as normalizeAwsTagsToCfn, Jt as resolveAutoAssetStorage, K as refStateLookupFromResource, Kt as getLegacyStateBucketName, L as findActionableSilentDrops, Lt as formatDockerLoginError, M as yellow, Mn as ResourceTimeoutError, Mt as getBootstrapMarkerKey, N as IAMRoleProvider, Nn as ResourceUpdateNotSupportedError, Nt as parseBootstrapMarker, O as cyan, On as MissingCdkCliError, Ot as rewriteTemplateAssetReferences, P as collectInlinePolicyNamesManagedBySiblings, Pn as StackHasActiveImportsError, Pt as validateAssetBucketName, Q as configBooleanRefusal, Qt as resolveStateBucketWithDefaultAndSource, R as findSilentDropProperties, Rt as getDockerCmd, S as extractDeploymentEventError, St as AssetPublisher, T as renderStatefulReason, Tn as LocalMigrateError, Tt as buildAssetRedirectMap, U as IntrinsicFunctionResolver, Ut as Synthesizer, V as disableInstanceApiTermination, Vn as withErrorHandling, Vt as AssetManifestLoader, W as cfnRefValueFromPhysicalId, Wt as synthesisStatusMessage, X as assertRegionMatch, Xt as resolveSkipPrefix, Y as resolveExplicitPhysicalId, Yt as resolveCaptureObservedState, Z as coerceCfnBoolean, Zt as resolveStateBucketWithDefault, _ as createPreDeleteFinalSnapshot, _n as resetAwsClients, _t as TemplateParser, a as DeploymentEventsStore, an as findLargeInlineResources, at as s3BucketArn, b as unsupportedFinalSnapshotError, bn as CdkdError, bt as rebuildClientForBucketRegion, c as replayFailedOperations, cn as PARTITION_TABLE, ct as s3BucketRegionalDomainName, d as IMPLICIT_DELETE_DEPENDENCIES, dn as AssemblyReader, dt as DiffCalculator, en as stateBucketExistenceConfirmed, et as readConfigString, f as computeImplicitDeleteEdges, fn as processStackMessages, ft as describeTypeWithThrottleRetry, g as ccRoutedFinalSnapshotError, gn as getAwsClients, gt as DagBuilder, h as buildFinalSnapshotIdentifier, hn as AwsClients, ht as isThrottlingError, i as DeploymentEventsReader, in as MIGRATE_TMP_PREFIX, it as requireConfigString, j as red, jn as ProvisioningError, jt as ensureAssetStorage, k as gray, kn as NestedStackChildDirectDestroyError, kt as AssetModeResolver, l as replayRollback, ln as canonicalizeRegion, lt as s3BucketWebsiteUrl, m as PRE_DELETE_SNAPSHOT_TYPES, mn as resolveBucketRegion, mt as isRetryableTransientError, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as CFN_TEMPLATE_BODY_LIMIT, nt as requireConfigArray, o as planFailedOps, on as uploadCfnTemplate, ot as s3BucketDomainName, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pt as withRetry, q as WAFv2WebACLProvider, qt as resolveApp, r as DeployEngine, rn as CFN_TEMPLATE_URL_LIMIT, rt as requireConfigObject, s as planRollback, sn as expectedOwnerParam, st as s3BucketDualStackDomainName, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as warnDeprecatedNoPrefixCliFlag, tt as replayWarn, u as withResourceDeadline, un as derivePartitionAndUrlSuffix, ut as applyRoleArnIfSet, v as isFinalSnapshotError, vn as setAwsClients, vt as LockManager, w as isStatefulRecreateTargetSync, wn as LocalInvokeBuildError$1, wt as WorkGraph, x as makeCanonicalizePropertiesFn, xt as shouldRetainResource, y as refusesFinalSnapshot, yt as S3StateBackend, z as CloudControlProvider, zt as runDockerForeground } from "./deploy-engine-Cg_wFdJP.js";
2
+ import { $ as configStringRefusal, $t as resolveStateBucketWithDefaultAndSource, A as green, An as NestedStackChildDirectDestroyError, At as BOOTSTRAP_MARKER_PREFIX, B as slowCcOperationTimeoutMs, Bt as runDockerForeground, C as MULTI_REGION_RECREATE_BLOCKED_TYPES, Ct as stringifyValue, D as bold, Dn as LocalStartServiceError, Dt as loadPublishableAssetManifest, E as formatResourceLine, En as LocalMigrateError, Et as createAssetRedirectResolver, F as clearOnUpdateRemoval, Fn as StackHasActiveImportsError, Ft as validateContainerRepoName, G as getAccountInfo, Gt as synthesisStatusMessage, H as isTerminationProtectionPropagationError, Hn as withErrorHandling, Ht as AssetManifestLoader, I as ProviderRegistry, In as StackTerminationProtectionError, It as buildDenyExternalAccessPolicy, J as normalizeAwsTagsToCfn, Jt as resolveApp, K as refStateLookupFromResource, Kt as getDefaultStateBucketName, L as findActionableSilentDrops, Lt as buildDockerImage, M as yellow, Mn as ProvisioningError, Mt as getBootstrapMarkerKey, N as IAMRoleProvider, Nn as ResourceTimeoutError, Nt as parseBootstrapMarker, O as cyan, Ot as rewriteTemplateAssetReferences, P as collectInlinePolicyNamesManagedBySiblings, Pn as ResourceUpdateNotSupportedError, Pt as validateAssetBucketName, Q as configBooleanRefusal, Qt as resolveStateBucketWithDefault, R as findSilentDropProperties, Rt as formatDockerLoginError, S as extractDeploymentEventError, St as AssetPublisher, T as renderStatefulReason, Tn as LocalInvokeBuildError$1, Tt as buildAssetRedirectMap, U as IntrinsicFunctionResolver, Ut as getDockerImageBySourceHash, V as disableInstanceApiTermination, Vn as normalizeAwsError, Vt as runDockerStreaming, W as cfnRefValueFromPhysicalId, Wt as Synthesizer, X as assertRegionMatch, Xt as resolveCaptureObservedState, Y as resolveExplicitPhysicalId, Yt as resolveAutoAssetStorage, Z as coerceCfnBoolean, Zt as resolveSkipPrefix, _ as createPreDeleteFinalSnapshot, _n as getAwsClients, _t as TemplateParser, a as DeploymentEventsStore, an as MIGRATE_TMP_PREFIX, at as s3BucketArn, b as unsupportedFinalSnapshotError, bt as rebuildClientForBucketRegion, c as replayFailedOperations, cn as expectedOwnerParam, ct as s3BucketRegionalDomainName, d as IMPLICIT_DELETE_DEPENDENCIES, dn as derivePartitionAndUrlSuffix, dt as DiffCalculator, en as resolveUseCdkBootstrapAssets, et as readConfigString, f as computeImplicitDeleteEdges, fn as AssemblyReader, ft as describeTypeWithThrottleRetry, g as ccRoutedFinalSnapshotError, gn as AwsClients, gt as DagBuilder, h as buildFinalSnapshotIdentifier, hn as resolveBucketRegion, ht as isThrottlingError, i as DeploymentEventsReader, in as CFN_TEMPLATE_URL_LIMIT, it as requireConfigString, j as red, jn as PartialFailureError, jt as ensureAssetStorage, k as gray, kn as MissingCdkCliError, kt as AssetModeResolver, l as replayRollback, ln as PARTITION_TABLE, lt as s3BucketWebsiteUrl, m as PRE_DELETE_SNAPSHOT_TYPES, mt as isRetryableTransientError, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as warnDeprecatedNoPrefixCliFlag, nt as requireConfigArray, o as planFailedOps, on as findLargeInlineResources, ot as s3BucketDomainName, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as processStackMessages, pt as withRetry, q as WAFv2WebACLProvider, qt as getLegacyStateBucketName, r as DeployEngine, rn as CFN_TEMPLATE_BODY_LIMIT, rt as requireConfigObject, s as planRollback, sn as uploadCfnTemplate, st as s3BucketDualStackDomainName, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as stateBucketExistenceConfirmed, tt as replayWarn, u as withResourceDeadline, un as canonicalizeRegion, ut as applyRoleArnIfSet, v as isFinalSnapshotError, vn as resetAwsClients, vt as LockManager, w as isStatefulRecreateTargetSync, wn as DeployCancelledError, wt as WorkGraph, x as makeCanonicalizePropertiesFn, xn as CdkdError, xt as shouldRetainResource, y as refusesFinalSnapshot, yn as setAwsClients, yt as S3StateBackend, z as CloudControlProvider, zt as getDockerCmd } from "./deploy-engine-NA36xDvk.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, h as withStackName, i as runStackBuffered, m as withSkipPrefix, n as getLogger, o as PATTERN_B_NAME_OPTIONS, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-zRrlbaQt.js";
4
- import { t as ASGProvider } from "./asg-provider-Dl8-YYQR.js";
4
+ import { t as ASGProvider } from "./asg-provider-DulIbRCK.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketEncryptionCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketOwnershipControlsCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketOwnershipControlsCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -1164,17 +1164,7 @@ async function bootstrapCommand(options) {
1164
1164
  }));
1165
1165
  logger.info("✓ Enabled bucket encryption (AES-256)");
1166
1166
  logger.debug("Setting bucket policy...");
1167
- const bucketPolicy = {
1168
- Version: "2012-10-17",
1169
- Statement: [{
1170
- Sid: "DenyExternalAccess",
1171
- Effect: "Deny",
1172
- Principal: "*",
1173
- Action: "s3:*",
1174
- Resource: [`arn:aws:s3:::${bucketName}`, `arn:aws:s3:::${bucketName}/*`],
1175
- Condition: { StringNotEquals: { "aws:PrincipalAccount": accountId } }
1176
- }]
1177
- };
1167
+ const bucketPolicy = buildDenyExternalAccessPolicy(bucketName, accountId, await stateBucketS3.config.region());
1178
1168
  await stateBucketS3.send(new PutBucketPolicyCommand({
1179
1169
  Bucket: bucketName,
1180
1170
  ExpectedBucketOwner: accountId,
@@ -58779,17 +58769,7 @@ async function ensureDestinationBucket(bucketName, region, accountId, logger) {
58779
58769
  await s3.send(new PutBucketPolicyCommand({
58780
58770
  Bucket: bucketName,
58781
58771
  ...await expectedOwnerParam(s3),
58782
- Policy: JSON.stringify({
58783
- Version: "2012-10-17",
58784
- Statement: [{
58785
- Sid: "DenyExternalAccess",
58786
- Effect: "Deny",
58787
- Principal: "*",
58788
- Action: "s3:*",
58789
- Resource: [`arn:aws:s3:::${bucketName}`, `arn:aws:s3:::${bucketName}/*`],
58790
- Condition: { StringNotEquals: { "aws:PrincipalAccount": accountId } }
58791
- }]
58792
- })
58772
+ Policy: JSON.stringify(buildDenyExternalAccessPolicy(bucketName, accountId, await s3.config.region()))
58793
58773
  }));
58794
58774
  logger.info("✓ Applied versioning, encryption, and account-only access policy");
58795
58775
  return s3;
@@ -67096,9 +67076,127 @@ function notFoundError$1(target, stack, resources) {
67096
67076
  * registry (`c2s.ic.gov` / `sc2s.sgov.gov`) never matched and the caller
67097
67077
  * silently classified a real ECR image as a user-managed one — skipping the
67098
67078
  * `docker login` it needs.
67079
+ *
67080
+ * KNOWN BOUND (issue #1792): the `dkr.ecr` LABELS are still matched
67081
+ * case-sensitively, so `<acct>.DKR.ECR.<region>.<suffix>/` does not match at
67082
+ * all. Audited deliberately while fixing issue #1786 rather than missed — that
67083
+ * issue's normalization covers the captured region + suffix, i.e. the strict
67084
+ * CHECK, whereas widening the shape MATCHER makes cdkd `docker login` to a
67085
+ * host shape it previously skipped, which is a behavior expansion wanting its
67086
+ * own decision. The failure direction here is the safe one: NO credentials are
67087
+ * sent on any of the four call sites. Traced — `local run-task` and
67088
+ * `local invoke-agentcore` fall through to an anonymous `docker pull` that
67089
+ * fails, while `local invoke` and `local start-api` REFUSE before any pull.
67099
67090
  */
67100
67091
  const ECR_URI_HOST_REGEX = /^(\d{12})\.dkr\.ecr\.([^.]+)\.([^/]+)\//;
67101
67092
  /**
67093
+ * A region segment cdkd is willing to treat as a region id.
67094
+ *
67095
+ * Case is not the only way the `startsWith` partition classification can be
67096
+ * side-stepped: any leading junk defeats it the same way, and the captured
67097
+ * segment does not stay inert — it becomes an `ECRClient({region})` and is
67098
+ * interpolated into the fallback `docker login` endpoint. Measured before this
67099
+ * guard: `…dkr.ecr. us-iso-east-1.amazonaws.com/…` (leading space) and a
67100
+ * combining-mark form both parsed, yielding regions `" us-iso-east-1"` and
67101
+ * `"us-i̇so-east-1"`. Neither leaks credentials — an ACCEPTED suffix is always
67102
+ * an AWS-owned domain — but a region id is ASCII alphanumeric plus `-`, so
67103
+ * anything else is a malformed host and refusing it keeps the classification
67104
+ * honest.
67105
+ *
67106
+ * TESTED AGAINST THE RAW SEGMENT, BEFORE `toLowerCase()`, and that order is the
67107
+ * whole point: `String.prototype.toLowerCase` performs full Unicode case
67108
+ * folding, so the Kelvin sign U+212A folds to a plain ASCII `k`. Checking the
67109
+ * FOLDED segment therefore accepts `us-eKst-1` and yields the region
67110
+ * `us-ekst-1` — a region the host does not name — which is precisely the
67111
+ * class of substitution this guard exists to refuse. Matching `[A-Za-z0-9-]`
67112
+ * on the raw capture keeps case-insensitivity (the point of issue #1786) while
67113
+ * admitting only characters that fold to themselves.
67114
+ *
67115
+ * ONE DELIBERATE SIDE EFFECT, called out because it is a withdrawal rather than
67116
+ * an addition: a malformed-region host is now classified as an ordinary public
67117
+ * image with NO cdkd-side signal at all — neither the ECR verdict nor the #1764
67118
+ * foreign-suffix diagnostic. Both arms change, not just the foreign one:
67119
+ * `<acct>.dkr.ecr.us_east_1.example.com/…` used to log the partition-gap
67120
+ * warning and now logs nothing, and `<acct>.dkr.ecr.us_east_1.amazonaws.com/…`
67121
+ * used to be ACCEPTED as ECR and is now refused. That is the correct verdict
67122
+ * rather than a regression — the diagnostic's whole subject is "this suffix does
67123
+ * not belong to its region's PARTITION", and a segment that is not a region id
67124
+ * has no partition to belong to, so reporting it would send the reader hunting
67125
+ * for a table entry that could never exist — but it does mean a typo'd region
67126
+ * gets no cdkd-side hint, only docker's own pull failure. Both arms are pinned
67127
+ * by tests so a future widening of the guard cannot flip them silently.
67128
+ */
67129
+ const CANONICAL_REGION_SEGMENT = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
67130
+ /**
67131
+ * A URL suffix cdkd is willing to compare against the partition table.
67132
+ *
67133
+ * The SAME raw-capture rule as the region, and for the same reason one layer
67134
+ * over: the suffix is folded before the comparison, so a code point folding
67135
+ * into ASCII can impersonate a partition's suffix. This became reachable the
67136
+ * moment issue #1764 landed `aws-isoe`'s `cloud.adc-e.uk` — that suffix
67137
+ * contains a `k`, so `…dkr.ecr.eu-isoe-west-1.cloud.adc-e.uK/…` (Kelvin
67138
+ * sign) folded onto it and was ACCEPTED. Not a credential leak, since UTS-46
67139
+ * maps U+212A to `k` too and the host resolves to the real AWS domain, but it
67140
+ * falsifies the invariant the region guard's comment above states, so both
67141
+ * captures are held to the same rule rather than only the one that was
67142
+ * measured first.
67143
+ *
67144
+ * Dots are admitted because a suffix is a dotted DNS name; every other
67145
+ * character is refused, so the accepted set stays exactly the partition
67146
+ * table's own literals.
67147
+ */
67148
+ const CANONICAL_URL_SUFFIX = /^[A-Za-z0-9][A-Za-z0-9.-]*$/;
67149
+ /**
67150
+ * The ONE case-normalization boundary of this module (issue #1786).
67151
+ *
67152
+ * DNS is case-INSENSITIVE, so `US-ISO-EAST-1.amazonaws.com` and
67153
+ * `us-iso-east-1.amazonaws.com` name the same host — but both halves of the
67154
+ * #1758 suffix check were case-SENSITIVE, in OPPOSITE directions:
67155
+ *
67156
+ * - an upper-cased REGION fails every `startsWith` prefix test in
67157
+ * `derivePartitionAndUrlSuffix`, so it falls through to the commercial
67158
+ * partition whose suffix is `amazonaws.com` — which is exactly what an ISO
67159
+ * look-alike host carries, so the strict check ACCEPTED it (the bypass);
67160
+ * - an upper-cased region or SUFFIX on a GENUINE host stopped matching its own
67161
+ * partition's suffix, so a real ECR registry was REJECTED and the caller
67162
+ * silently classified it as a user-managed image — the #1758 regression, one
67163
+ * layer up.
67164
+ *
67165
+ * The normalization lives HERE rather than inside `derivePartitionAndUrlSuffix`
67166
+ * because this is the boundary where an untrusted, DNS-shaped string enters
67167
+ * cdkd, and keeping it in ONE function means both exported entry points below —
67168
+ * and the suffix COMPARISON itself — cannot drift apart.
67169
+ *
67170
+ * This does NOT duplicate `canonicalizeRegion`, which issue #1795 added inside
67171
+ * `derivePartitionAndUrlSuffix` so the mapping folds its own input. The two
67172
+ * answer different questions and both are needed: that one makes the partition
67173
+ * LOOKUP case-insensitive for every caller, while these guards decide whether
67174
+ * the captured segments are a region id and a URL suffix AT ALL. Folding alone
67175
+ * cannot do that — folding is precisely what turns `us-eKst-1` into the
67176
+ * plausible `us-ekst-1` (see the guards' own comments), so a fold-only helper
67177
+ * makes the substitution easier to reach, not harder. Double-folding is a
67178
+ * no-op, which is why the redundant `toLowerCase()` calls below are left in
67179
+ * rather than removed: they keep this function the single answer for the
67180
+ * comparison even if the helper's behaviour changes again.
67181
+ *
67182
+ * The derived suffix is lower-cased too. Every entry in the partition table is
67183
+ * a lower-case literal today, so that is a no-op; it is there so this function
67184
+ * stays the single answer even if that table ever gains a mixed-case entry.
67185
+ */
67186
+ function matchEcrRegistryHost(imageUri) {
67187
+ const m = ECR_URI_HOST_REGEX.exec(imageUri);
67188
+ if (!m) return void 0;
67189
+ if (!CANONICAL_REGION_SEGMENT.test(m[2])) return void 0;
67190
+ if (!CANONICAL_URL_SUFFIX.test(m[3])) return void 0;
67191
+ const region = m[2].toLowerCase();
67192
+ return {
67193
+ accountId: m[1],
67194
+ region,
67195
+ suffix: m[3].toLowerCase(),
67196
+ expectedSuffix: derivePartitionAndUrlSuffix(region).urlSuffix.toLowerCase()
67197
+ };
67198
+ }
67199
+ /**
67102
67200
  * The account + region of an ECR image URI, or `undefined` when the URI is not
67103
67201
  * an ECR registry host for the region it names.
67104
67202
  *
@@ -67114,15 +67212,19 @@ const ECR_URI_HOST_REGEX = /^(\d{12})\.dkr\.ecr\.([^.]+)\.([^/]+)\//;
67114
67212
  * `ecs-task-resolver.ts` consume it without breaking the invariant that module
67115
67213
  * documents about itself (it resolves secrets through a separate module for
67116
67214
  * exactly that reason).
67215
+ *
67216
+ * The returned `region` is LOWER-CASED (issue #1786) — it is consumed as an SDK
67217
+ * client region by `ecr-puller.ts` and as the `region` of a `kind: 'ecr'` image
67218
+ * by `ecs-task-resolver.ts`, and the canonical spelling of an AWS region id is
67219
+ * lower case.
67117
67220
  */
67118
67221
  function parseEcrRegistryHost(imageUri) {
67119
- const m = ECR_URI_HOST_REGEX.exec(imageUri);
67222
+ const m = matchEcrRegistryHost(imageUri);
67120
67223
  if (!m) return void 0;
67121
- const region = m[2];
67122
- if (m[3] !== derivePartitionAndUrlSuffix(region).urlSuffix) return void 0;
67224
+ if (m.suffix !== m.expectedSuffix) return void 0;
67123
67225
  return {
67124
- accountId: m[1],
67125
- region
67226
+ accountId: m.accountId,
67227
+ region: m.region
67126
67228
  };
67127
67229
  }
67128
67230
  /**
@@ -67136,8 +67238,8 @@ function parseEcrRegistryHost(imageUri) {
67136
67238
  * `undefined`, and only the second is a cdkd gap rather than a user choice.
67137
67239
  */
67138
67240
  function looksLikeEcrHostWithForeignSuffix(imageUri) {
67139
- const m = ECR_URI_HOST_REGEX.exec(imageUri);
67140
- return m !== null && m[3] !== derivePartitionAndUrlSuffix(m[2]).urlSuffix;
67241
+ const m = matchEcrRegistryHost(imageUri);
67242
+ return m !== void 0 && m.suffix !== m.expectedSuffix;
67141
67243
  }
67142
67244
 
67143
67245
  //#endregion
@@ -75841,7 +75943,7 @@ function createMigrateCommand() {
75841
75943
  */
75842
75944
  function buildProgram() {
75843
75945
  const program = new Command();
75844
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.282.5");
75946
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.282.7");
75845
75947
  program.hook("preAction", (_thisCommand, actionCommand) => {
75846
75948
  const { profile } = actionCommand.optsWithGlobals();
75847
75949
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;