@go-to-k/cdkd 0.278.18 → 0.278.19

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 DagBuilder, A as red, At as resolveApp, B as isTerminationProtectionPropagationError, Bt as CFN_TEMPLATE_URL_LIMIT, C as isStatefulRecreateTargetSync, Ct as runDockerStreaming, D as cyan, Dt as synthesisStatusMessage, E as bold, Et as Synthesizer, F as ProviderRegistry, Ft as resolveStateBucketWithDefaultAndSource, G as normalizeAwsTagsToCfn, Gt as AssemblyReader, H as cfnRefValueFromPhysicalId, Ht as findLargeInlineResources, I as findActionableSilentDrops, It as resolveUseCdkBootstrapAssets, J as applyRoleArnIfSet, Jt as resolveBucketRegion, K as resolveExplicitPhysicalId, Kt as processStackMessages, L as CloudControlProvider, Lt as stateBucketExistenceConfirmed, M as IAMRoleProvider, Mt as resolveCaptureObservedState, N as collectInlinePolicyNamesManagedBySiblings, Nt as resolveSkipPrefix, O as gray, Ot as getDefaultStateBucketName, P as clearOnUpdateRemoval, Pt as resolveStateBucketWithDefault, Q as isRetryableTransientError, Qt as setAwsClients, R as slowCcOperationTimeoutMs, Rt as warnDeprecatedNoPrefixCliFlag, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as runDockerForeground, T as formatResourceLine, Tt as getDockerImageBySourceHash, U as refStateLookupFromResource, Ut as uploadCfnTemplate, V as IntrinsicFunctionResolver, Vt as MIGRATE_TMP_PREFIX, W as WAFv2WebACLProvider, Wt as expectedOwnerParam, X as describeTypeWithThrottleRetry, Xt as getAwsClients, Y as DiffCalculator, Yt as AwsClients, Z as withRetry, Zt as resetAwsClients, _ as createPreDeleteFinalSnapshot, _t as validateAssetBucketName, a as DeploymentEventsStore, an as LocalMigrateError, at as AssetPublisher, b as unsupportedFinalSnapshotError, bn as normalizeAwsError, bt as formatDockerLoginError, c as replayFailedOperations, cn as MissingCdkCliError, ct as buildAssetRedirectMap, d as IMPLICIT_DELETE_DEPENDENCIES, dn as ProvisioningError, dt as rewriteTemplateAssetReferences, en as CdkdError, et as TemplateParser, f as computeImplicitDeleteEdges, fn as ResourceTimeoutError, ft as AssetModeResolver, g as ccRoutedFinalSnapshotError, gt as parseBootstrapMarker, h as buildFinalSnapshotIdentifier, hn as StackTerminationProtectionError, ht as getBootstrapMarkerKey, i as DeploymentEventsReader, in as LocalInvokeBuildError$1, it as shouldRetainResource, j as yellow, jt as resolveAutoAssetStorage, k as green, kt as getLegacyStateBucketName, l as replayRollback, ln as NestedStackChildDirectDestroyError, lt as createAssetRedirectResolver, m as PRE_DELETE_SNAPSHOT_TYPES, mn as StackHasActiveImportsError, mt as ensureAssetStorage, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as S3StateBackend, o as planFailedOps, on as LocalStartServiceError, ot as stringifyValue, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as ResourceUpdateNotSupportedError, pt as BOOTSTRAP_MARKER_PREFIX, q as assertRegionMatch, r as DeployEngine, rn as DeployCancelledError, rt as rebuildClientForBucketRegion, s as planRollback, st as WorkGraph, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as LockManager, u as withResourceDeadline, un as PartialFailureError, ut as loadPublishableAssetManifest, v as isFinalSnapshotError, vt as validateContainerRepoName, w as renderStatefulReason, wt as AssetManifestLoader, x as extractDeploymentEventError, xn as withErrorHandling, xt as getDockerCmd, y as refusesFinalSnapshot, yt as buildDockerImage, z as disableInstanceApiTermination, zt as CFN_TEMPLATE_BODY_LIMIT } from "./deploy-engine-D9TPJSZY.js";
2
+ import { $ as DagBuilder, A as red, At as resolveApp, B as isTerminationProtectionPropagationError, Bt as CFN_TEMPLATE_URL_LIMIT, C as isStatefulRecreateTargetSync, Ct as runDockerStreaming, D as cyan, Dt as synthesisStatusMessage, E as bold, Et as Synthesizer, F as ProviderRegistry, Ft as resolveStateBucketWithDefaultAndSource, G as normalizeAwsTagsToCfn, Gt as AssemblyReader, H as cfnRefValueFromPhysicalId, Ht as findLargeInlineResources, I as findActionableSilentDrops, It as resolveUseCdkBootstrapAssets, J as applyRoleArnIfSet, Jt as resolveBucketRegion, K as resolveExplicitPhysicalId, Kt as processStackMessages, L as CloudControlProvider, Lt as stateBucketExistenceConfirmed, M as IAMRoleProvider, Mt as resolveCaptureObservedState, N as collectInlinePolicyNamesManagedBySiblings, Nt as resolveSkipPrefix, O as gray, Ot as getDefaultStateBucketName, P as clearOnUpdateRemoval, Pt as resolveStateBucketWithDefault, Q as isRetryableTransientError, Qt as setAwsClients, R as slowCcOperationTimeoutMs, Rt as warnDeprecatedNoPrefixCliFlag, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as runDockerForeground, T as formatResourceLine, Tt as getDockerImageBySourceHash, U as refStateLookupFromResource, Ut as uploadCfnTemplate, V as IntrinsicFunctionResolver, Vt as MIGRATE_TMP_PREFIX, W as WAFv2WebACLProvider, Wt as expectedOwnerParam, X as describeTypeWithThrottleRetry, Xt as getAwsClients, Y as DiffCalculator, Yt as AwsClients, Z as withRetry, Zt as resetAwsClients, _ as createPreDeleteFinalSnapshot, _t as validateAssetBucketName, a as DeploymentEventsStore, an as LocalMigrateError, at as AssetPublisher, b as unsupportedFinalSnapshotError, bn as normalizeAwsError, bt as formatDockerLoginError, c as replayFailedOperations, cn as MissingCdkCliError, ct as buildAssetRedirectMap, d as IMPLICIT_DELETE_DEPENDENCIES, dn as ProvisioningError, dt as rewriteTemplateAssetReferences, en as CdkdError, et as TemplateParser, f as computeImplicitDeleteEdges, fn as ResourceTimeoutError, ft as AssetModeResolver, g as ccRoutedFinalSnapshotError, gt as parseBootstrapMarker, h as buildFinalSnapshotIdentifier, hn as StackTerminationProtectionError, ht as getBootstrapMarkerKey, i as DeploymentEventsReader, in as LocalInvokeBuildError$1, it as shouldRetainResource, j as yellow, jt as resolveAutoAssetStorage, k as green, kt as getLegacyStateBucketName, l as replayRollback, ln as NestedStackChildDirectDestroyError, lt as createAssetRedirectResolver, m as PRE_DELETE_SNAPSHOT_TYPES, mn as StackHasActiveImportsError, mt as ensureAssetStorage, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as S3StateBackend, o as planFailedOps, on as LocalStartServiceError, ot as stringifyValue, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as ResourceUpdateNotSupportedError, pt as BOOTSTRAP_MARKER_PREFIX, q as assertRegionMatch, r as DeployEngine, rn as DeployCancelledError, rt as rebuildClientForBucketRegion, s as planRollback, st as WorkGraph, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as LockManager, u as withResourceDeadline, un as PartialFailureError, ut as loadPublishableAssetManifest, v as isFinalSnapshotError, vt as validateContainerRepoName, w as renderStatefulReason, wt as AssetManifestLoader, x as extractDeploymentEventError, xn as withErrorHandling, xt as getDockerCmd, y as refusesFinalSnapshot, yt as buildDockerImage, z as disableInstanceApiTermination, zt as CFN_TEMPLATE_BODY_LIMIT } from "./deploy-engine-DOQs235O.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
4
- import { t as ASGProvider } from "./asg-provider-DHs3PmZU.js";
4
+ import { t as ASGProvider } from "./asg-provider-DaP2cw8z.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, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, 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";
@@ -12535,6 +12535,7 @@ var DynamoDBGlobalTableProvider = class {
12535
12535
  }
12536
12536
  const previousSdkIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling);
12537
12537
  const gsiDiff = diffGlobalSecondaryIndexes(previousSdkIndexes, toSdkGlobalSecondaryIndexes(properties, currentRegion, newBilling));
12538
+ const rawOnDemandDeclarations = collectRawOnDemandDeclarations(properties, currentRegion);
12538
12539
  const previousSdkByName = /* @__PURE__ */ new Map();
12539
12540
  for (const prev of previousSdkIndexes) if (prev.IndexName) previousSdkByName.set(prev.IndexName, prev);
12540
12541
  for (const gsi of gsiDiff.removed) {
@@ -12564,22 +12565,27 @@ var DynamoDBGlobalTableProvider = class {
12564
12565
  await this.waitForTableActiveAfterUpdate(physicalId, logicalId);
12565
12566
  }
12566
12567
  for (const gsi of gsiDiff.modified) {
12567
- if (!gsi.IndexName) continue;
12568
+ if (typeof gsi.IndexName !== "string" || gsi.IndexName.length === 0) continue;
12568
12569
  if (gsiHandledByBillingFlip.has(gsi.IndexName)) continue;
12569
12570
  const billingFlipped = oldBilling !== newBilling;
12570
12571
  const update = { IndexName: gsi.IndexName };
12571
12572
  const previousOnDemand = previousSdkByName.get(gsi.IndexName)?.OnDemandThroughput;
12573
+ const declared = rawOnDemandDeclarations.get(gsi.IndexName);
12572
12574
  const onDemand = { ...gsi.OnDemandThroughput };
12575
+ const unresolvedMembers = [];
12573
12576
  if (!billingFlipped && previousOnDemand) {
12574
- if (previousOnDemand.MaxReadRequestUnits !== void 0 && onDemand.MaxReadRequestUnits === void 0) onDemand.MaxReadRequestUnits = ON_DEMAND_LIMIT_RESET;
12575
- if (previousOnDemand.MaxWriteRequestUnits !== void 0 && onDemand.MaxWriteRequestUnits === void 0) onDemand.MaxWriteRequestUnits = ON_DEMAND_LIMIT_RESET;
12577
+ if (previousOnDemand.MaxReadRequestUnits !== void 0 && onDemand.MaxReadRequestUnits === void 0) if (declared?.readDeclared) unresolvedMembers.push("MaxReadRequestUnits");
12578
+ else onDemand.MaxReadRequestUnits = ON_DEMAND_LIMIT_RESET;
12579
+ if (previousOnDemand.MaxWriteRequestUnits !== void 0 && onDemand.MaxWriteRequestUnits === void 0) if (declared?.writeDeclared) unresolvedMembers.push("MaxWriteRequestUnits");
12580
+ else onDemand.MaxWriteRequestUnits = ON_DEMAND_LIMIT_RESET;
12576
12581
  }
12582
+ if (unresolvedMembers.length > 0) this.logger.warn(`GSI '${gsi.IndexName}' on ${physicalId}: the template declares ${unresolvedMembers.join(" / ")} but the value did not resolve to a number, so the on-demand limit was left UNCHANGED on AWS rather than applied or cleared. This is usually an unresolved intrinsic in the template; resolve it to a literal to change the ceiling, or remove the property entirely to clear it.`);
12577
12583
  if (Object.keys(onDemand).length > 0) update.OnDemandThroughput = onDemand;
12578
12584
  if (!billingFlipped && gsi.ProvisionedThroughput) update.ProvisionedThroughput = gsi.ProvisionedThroughput;
12579
12585
  const previousSdk = previousSdkByName.get(gsi.IndexName);
12580
12586
  if (gsi.WarmThroughput !== void 0 && !deepEqual$1(gsi.WarmThroughput, previousSdk?.WarmThroughput)) update.WarmThroughput = gsi.WarmThroughput;
12581
12587
  if (!update.ProvisionedThroughput && !update.OnDemandThroughput && !update.WarmThroughput) {
12582
- if (!billingFlipped) this.logger.warn(`GSI '${gsi.IndexName}' on ${physicalId} changed in a way DynamoDB's UpdateTable cannot express (KeySchema / Projection are immutable on an existing index). Recreate the index under a new name to apply the change.`);
12588
+ if (!billingFlipped && unresolvedMembers.length === 0) this.logger.warn(`GSI '${gsi.IndexName}' on ${physicalId} changed in a way DynamoDB's UpdateTable cannot express (KeySchema / Projection are immutable on an existing index). Recreate the index under a new name to apply the change.`);
12583
12589
  continue;
12584
12590
  }
12585
12591
  const gsiUpdate = { Update: update };
@@ -13536,6 +13542,89 @@ function toSdkGlobalSecondaryIndexes(properties, region, billingMode) {
13536
13542
  return result;
13537
13543
  }
13538
13544
  /**
13545
+ * True when a CFn sub-object is nothing but an unresolved intrinsic
13546
+ * (`{"Fn::If": […]}` / `{"Ref": …}`), i.e. the template DID declare the block
13547
+ * but its value could not be resolved to a shape with members.
13548
+ *
13549
+ * Needed because presence is otherwise tested on the MEMBER key: an
13550
+ * intrinsic-valued block IS a record, so `asRecord` succeeds while
13551
+ * `['MaxReadRequestUnits']` is undefined — reporting "not declared" and firing
13552
+ * the destructive `-1` reset on a ceiling the template was trying to SET. That
13553
+ * is issue #1440 one level up from where the member test looks.
13554
+ */
13555
+ function isUnresolvedIntrinsicBlock(value) {
13556
+ const record = asRecord(value);
13557
+ if (!record) return false;
13558
+ const keys = Object.keys(record);
13559
+ return keys.length > 0 && keys.every((k) => k === "Ref" || k.startsWith("Fn::"));
13560
+ }
13561
+ /**
13562
+ * Per-index RAW presence of the two per-GSI on-demand members, keyed by
13563
+ * `IndexName` (issue #1440).
13564
+ *
13565
+ * The per-GSI reset needs to know "did the template DROP this member", and the
13566
+ * only faithful answer is whether the CFn key is THERE — not whether its value
13567
+ * coerced. `toSdkGlobalSecondaryIndexes` runs every value through
13568
+ * {@link toFiniteNumber}, which returns `undefined` for a present-but-
13569
+ * unparseable value (an unresolved `{Ref: …}`, `''`, an object). Deciding
13570
+ * "dropped" from that collapsed view sent the `-1` reset for a member the
13571
+ * template was actively trying to SET, silently clearing the ceiling — the same
13572
+ * silent-wrong-action class the reset exists to remove, and the exact hazard
13573
+ * the table-level path was corrected for in #1434's PR.
13574
+ *
13575
+ * So this walks the same two sources as `toSdkGlobalSecondaryIndexes` — the
13576
+ * top-level GSI for the write half, the LOCAL replica's index entry (with the
13577
+ * GSI-level spelling as the documented fallback) for the read half — and
13578
+ * reports presence only. Keeping it beside that function is deliberate: the
13579
+ * two must agree on where each member lives, and a divergence between them is
13580
+ * exactly what would re-open the bug.
13581
+ *
13582
+ * A missing entry means "not declared", which lets the reset FIRE — i.e. the
13583
+ * DESTRUCTIVE direction, not a conservative one. Two DIFFERENT mechanisms keep
13584
+ * that safe, and neither is "the translation validates everything":
13585
+ * - a non-array `GlobalSecondaryIndexes` is refused LOUDLY by
13586
+ * `toSdkGlobalSecondaryIndexes` before any of this runs;
13587
+ * - a malformed per-ENTRY shape is NOT refused — it is passed through
13588
+ * untouched so AWS surfaces the real error — but such an entry carries no
13589
+ * usable `IndexName`, so the reset loop skips it before consulting this map.
13590
+ * Do not relax either behavior on the assumption that this helper degrades
13591
+ * safely on its own; it does not.
13592
+ */
13593
+ function collectRawOnDemandDeclarations(properties, region) {
13594
+ const out = /* @__PURE__ */ new Map();
13595
+ const rawIndexes = properties["GlobalSecondaryIndexes"];
13596
+ if (!Array.isArray(rawIndexes)) return out;
13597
+ const replicas = properties["Replicas"];
13598
+ const localReplicaIndexes = asRecord(Array.isArray(replicas) ? replicas.find((r) => asRecord(r)?.["Region"] === region) : void 0)?.["GlobalSecondaryIndexes"];
13599
+ const localByName = /* @__PURE__ */ new Map();
13600
+ if (Array.isArray(localReplicaIndexes)) for (const entry of localReplicaIndexes) {
13601
+ const record = asRecord(entry);
13602
+ const name = record?.["IndexName"];
13603
+ if (record && typeof name === "string") localByName.set(name, record);
13604
+ }
13605
+ for (const entry of rawIndexes) {
13606
+ const gsi = asRecord(entry);
13607
+ const name = gsi?.["IndexName"];
13608
+ if (!gsi || typeof name !== "string") continue;
13609
+ const localEntry = localByName.get(name);
13610
+ const explicitOnDemand = asRecord(gsi["OnDemandThroughput"]);
13611
+ if (explicitOnDemand) {
13612
+ out.set(name, {
13613
+ readDeclared: explicitOnDemand["MaxReadRequestUnits"] !== void 0,
13614
+ writeDeclared: explicitOnDemand["MaxWriteRequestUnits"] !== void 0
13615
+ });
13616
+ continue;
13617
+ }
13618
+ const readBlocks = [localEntry?.["ReadOnDemandThroughputSettings"], gsi["ReadOnDemandThroughputSettings"]];
13619
+ const writeBlock = gsi["WriteOnDemandThroughputSettings"];
13620
+ out.set(name, {
13621
+ readDeclared: readBlocks.some((block) => asRecord(block)?.["MaxReadRequestUnits"] !== void 0 || isUnresolvedIntrinsicBlock(block)),
13622
+ writeDeclared: asRecord(writeBlock)?.["MaxWriteRequestUnits"] !== void 0 || isUnresolvedIntrinsicBlock(writeBlock)
13623
+ });
13624
+ }
13625
+ return out;
13626
+ }
13627
+ /**
13539
13628
  * Translate a CFn `Replicas[].GlobalSecondaryIndexes[]` blob (the
13540
13629
  * `ReplicaGlobalSecondaryIndexSpecification` shape) into the SDK's
13541
13630
  * `ReplicaGlobalSecondaryIndex[]` used by `CreateReplicationGroupMemberAction`
@@ -65020,7 +65109,7 @@ function createMigrateCommand() {
65020
65109
  */
65021
65110
  function buildProgram() {
65022
65111
  const program = new Command();
65023
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.18");
65112
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.19");
65024
65113
  program.hook("preAction", (_thisCommand, actionCommand) => {
65025
65114
  const { profile } = actionCommand.optsWithGlobals();
65026
65115
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;