@go-to-k/cdkd 0.283.36 → 0.284.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{asg-provider-BruE_3F2.js → asg-provider-CMvwsTc7.js} +2 -2
- package/dist/{asg-provider-BruE_3F2.js.map → asg-provider-CMvwsTc7.js.map} +1 -1
- package/dist/cli.js +69 -19
- package/dist/cli.js.map +1 -1
- package/dist/{deploy-engine-Bhq_JPCc.js → deploy-engine-C7JEL0Mg.js} +113 -16
- package/dist/deploy-engine-C7JEL0Mg.js.map +1 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-Bhq_JPCc.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { $ as
|
|
2
|
+
import { $ as IntrinsicFunctionResolver, $n as StackTerminationProtectionError, $t as buildDenyExternalAccessPolicy, A as formatResourceLine, An as processStackMessages, At as withRetry, B as isExportAliasCollision, Bt as buildAssetRedirectMap, C as refusesFinalSnapshot, Cn as findLargeInlineResources, Ct as s3BucketDualStackDomainName, D as MULTI_REGION_RECREATE_BLOCKED_TYPES, Dn as canonicalizeRegion, Dt as DiffCalculator, E as extractDeploymentEventError, En as PARTITION_TABLE, Et as applyRoleArnIfSet, F as red, Fn as resetAwsClients, Ft as rebuildClientForBucketRegion, G as clearOnUpdateRemoval, Gt as stripControlChars, H as stateKeySecretExposure, Hn as LocalInvokeBuildError$1, Ht as loadPublishableAssetManifest, I as yellow, In as setAwsClients, It as shouldRetainResource, J as findSilentDropProperties, Jn as PartialFailureError, Jt as ensureAssetStorage, K as ProviderRegistry, Kn as MissingCdkCliError, Kt as AssetModeResolver, L as collectDeclaredOutputNames, Lt as AssetPublisher, M as cyan, Mn as resolveBucketRegion, Mt as TemplateParser, N as gray, Nn as AwsClients, Nt as LockManager, O as isStatefulRecreateTargetSync, On as derivePartitionAndUrlSuffix, Ot as INTRINSIC_KEYS, P as green, Pn as getAwsClients, Pt as S3StateBackend, Q as isTerminationProtectionPropagationError, Qn as StackHasActiveImportsError, Qt as validateContainerRepoName, R as collectPublishedOutputNames, Rn as CdkdError, Rt as stringifyValue, S as isFinalSnapshotError, Sn as MIGRATE_TMP_PREFIX, St as s3BucketDomainName, T as makeCanonicalizePropertiesFn, Tn as expectedOwnerParam, Tt as s3BucketWebsiteUrl, U as IAMRoleProvider, Un as LocalMigrateError, Ut as rewriteTemplateAssetReferences, V as secretBearingStateKeyWarning, Vn as DeployCancelledError, Vt as createAssetRedirectResolver, W as collectInlinePolicyNamesManagedBySiblings, Wn as LocalStartServiceError, Wt as escapeRegExp, X as slowCcOperationTimeoutMs, Xn as ResourceTimeoutError, Xt as parseBootstrapMarker, Y as CloudControlProvider, Yn as ProvisioningError, Yt as getBootstrapMarkerKey, Z as disableInstanceApiTermination, Zn as ResourceUpdateNotSupportedError, Zt as validateAssetBucketName, _ as ATOMIC_FINAL_SNAPSHOT_TYPES, _n as resolveUseCdkBootstrapAssets, _t as TEMPLATE_SOURCED_RULES, a as DeploymentEventsStore, an as AssetManifestLoader, ar as withErrorHandling, at as resolveExplicitPhysicalId, b as ccRoutedFinalSnapshotError, bn as CFN_TEMPLATE_BODY_LIMIT, bt as scrubResourceRecord, c as replayFailedOperations, cn as synthesisStatusMessage, cr as isThrottlingError, ct as configBooleanRefusal, d as updatePartialReason, dn as resolveApp, dt as replayWarn, en as buildDockerImage, et as cfnRefValueFromPhysicalId, f as UNSPECIFIED_SKIP_REASON, fn as resolveAutoAssetStorage, ft as requireConfigArray, g as computeImplicitDeleteEdges, gn as resolveStateBucketWithDefaultAndSource, gt as STATE_SOURCED_READBACK_RULES, h as IMPLICIT_DELETE_DEPENDENCIES, hn as resolveStateBucketWithDefault, ht as STATE_SOURCED_CROSS_GENERATION_RULES, i as DeploymentEventsReader, in as runDockerStreaming, ir as normalizeAwsError, it as normalizeAwsTagsToCfn, j as bold, jt as DagBuilder, k as renderStatefulReason, kn as AssemblyReader, kt as describeTypeWithThrottleRetry, l as replayRollback, ln as getDefaultStateBucketName, lr as markNonRetryable, lt as configStringRefusal, m as withResourceDeadline, mn as resolveSkipPrefix, mt as requireConfigString, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as getDockerCmd, nt as refStateLookupFromResource, o as planFailedOps, on as getDockerImageBySourceHash, or as isMarkedNonRetryable, ot as assertRegionMatch, p as deleteSkipReason, pn as resolveCaptureObservedState, pt as requireConfigObject, q as findActionableSilentDrops, qn as NestedStackChildDirectDestroyError, qt as BOOTSTRAP_MARKER_PREFIX, r as DeployEngine, rn as runDockerForeground, rt as WAFv2WebACLProvider, s as planRollback, sn as Synthesizer, sr as isRetryableTransientError, st as coerceCfnBoolean, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as formatDockerLoginError, tt as getAccountInfo, u as updatePartialMessage, un as getLegacyStateBucketName, ut as readConfigString, v as PRE_DELETE_SNAPSHOT_TYPES, vn as stateBucketExistenceConfirmed, vt as maskSecretsInText, w as unsupportedFinalSnapshotError, wn as uploadCfnTemplate, wt as s3BucketRegionalDomainName, x as createPreDeleteFinalSnapshot, xn as CFN_TEMPLATE_URL_LIMIT, xt as s3BucketArn, y as buildFinalSnapshotIdentifier, yn as warnDeprecatedNoPrefixCliFlag, yt as redactSecretsForState, z as exportAliasCollisionScrubWarning, zt as WorkGraph } from "./deploy-engine-C7JEL0Mg.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-
|
|
4
|
+
import { t as ASGProvider } from "./asg-provider-CMvwsTc7.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";
|
|
@@ -3098,18 +3098,27 @@ var IAMManagedPolicyProvider = class {
|
|
|
3098
3098
|
const reason = newPolicyName !== oldPolicyName ? "ManagedPolicyName" : newPath !== oldPath ? "Path" : "Description";
|
|
3099
3099
|
this.logger.debug(`${reason} changed, replacing managed policy: ${physicalId} (${reason} mutation)`);
|
|
3100
3100
|
const createResult = await this.create(logicalId, resourceType, properties);
|
|
3101
|
+
let orphanReason;
|
|
3101
3102
|
try {
|
|
3102
3103
|
const deleteResult = await this.delete(logicalId, physicalId, resourceType, previousProperties);
|
|
3103
|
-
if (deleteResult?.outcome === "skipped")
|
|
3104
|
+
if (deleteResult?.outcome === "skipped") {
|
|
3105
|
+
orphanReason = `old managed policy ${physicalId} was not deleted: ${deleteResult.reason}`;
|
|
3106
|
+
this.logger.warn(`Skipped deleting old managed policy ${physicalId} during replacement: ${deleteResult.reason}. The old policy may be orphaned and require manual cleanup.`);
|
|
3107
|
+
}
|
|
3104
3108
|
} catch (error) {
|
|
3109
|
+
orphanReason = `old managed policy ${physicalId} could not be deleted: ${String(error)}`;
|
|
3105
3110
|
this.logger.warn(`Failed to delete old managed policy ${physicalId} during replacement: ${String(error)}. The old policy may be orphaned and require manual cleanup.`);
|
|
3106
3111
|
}
|
|
3107
|
-
const
|
|
3112
|
+
const base = {
|
|
3108
3113
|
physicalId: createResult.physicalId,
|
|
3109
|
-
wasReplaced: true
|
|
3114
|
+
wasReplaced: true,
|
|
3115
|
+
...createResult.attributes ? { attributes: createResult.attributes } : {}
|
|
3110
3116
|
};
|
|
3111
|
-
|
|
3112
|
-
|
|
3117
|
+
return orphanReason !== void 0 ? {
|
|
3118
|
+
...base,
|
|
3119
|
+
outcome: "partial",
|
|
3120
|
+
reason: orphanReason
|
|
3121
|
+
} : base;
|
|
3113
3122
|
}
|
|
3114
3123
|
try {
|
|
3115
3124
|
const newDocument = properties["PolicyDocument"];
|
|
@@ -26244,16 +26253,23 @@ var ApiGatewayProvider = class ApiGatewayProvider {
|
|
|
26244
26253
|
if (newPathPart !== oldPathPart) {
|
|
26245
26254
|
this.logger.debug(`PathPart changed from "${oldPathPart}" to "${newPathPart}", replacing resource`);
|
|
26246
26255
|
const createResult = await this.createResource(logicalId, resourceType, properties);
|
|
26256
|
+
let orphanReason;
|
|
26247
26257
|
try {
|
|
26248
26258
|
await this.deleteResource(logicalId, physicalId, resourceType, previousProperties);
|
|
26249
26259
|
} catch (error) {
|
|
26260
|
+
orphanReason = `old API Gateway Resource ${physicalId} could not be deleted: ${String(error)}`;
|
|
26250
26261
|
this.logger.warn(`Failed to delete old API Gateway Resource ${physicalId} during replacement: ${String(error)}. The old resource may be orphaned and require manual cleanup.`);
|
|
26251
26262
|
}
|
|
26252
|
-
|
|
26263
|
+
const base = {
|
|
26253
26264
|
physicalId: createResult.physicalId,
|
|
26254
26265
|
wasReplaced: true,
|
|
26255
26266
|
attributes: createResult.attributes ?? {}
|
|
26256
26267
|
};
|
|
26268
|
+
return orphanReason !== void 0 ? {
|
|
26269
|
+
...base,
|
|
26270
|
+
outcome: "partial",
|
|
26271
|
+
reason: orphanReason
|
|
26272
|
+
} : base;
|
|
26257
26273
|
}
|
|
26258
26274
|
return {
|
|
26259
26275
|
physicalId,
|
|
@@ -56621,6 +56637,26 @@ var WaitConditionHandleProvider = class {
|
|
|
56621
56637
|
//#endregion
|
|
56622
56638
|
//#region src/provisioning/providers/acm-certificate-provider.ts
|
|
56623
56639
|
/**
|
|
56640
|
+
* True for ACM's refusal to delete a certificate a consumer still references
|
|
56641
|
+
* (issue [#1922](https://github.com/go-to-k/cdkd/issues/1922)).
|
|
56642
|
+
*
|
|
56643
|
+
* Matched by error NAME first, with a message fallback: the SDK raises
|
|
56644
|
+
* `ResourceInUseException`, but a wrapped / re-thrown error can lose the class
|
|
56645
|
+
* while keeping the text. Deliberately narrow — this only picks the
|
|
56646
|
+
* remediation wording and the reason phrasing, and every other failure still
|
|
56647
|
+
* reaches the same `'partial'` outcome, so a miss degrades to a less specific
|
|
56648
|
+
* message rather than to the pre-#1922 silence.
|
|
56649
|
+
*/
|
|
56650
|
+
function isCertificateInUseError(error) {
|
|
56651
|
+
let current = error;
|
|
56652
|
+
for (let depth = 0; depth < 5 && current instanceof Error; depth++) {
|
|
56653
|
+
if (current.name === "ResourceInUseException") return true;
|
|
56654
|
+
current = current.cause;
|
|
56655
|
+
}
|
|
56656
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
56657
|
+
return /ResourceInUseException|in use/i.test(message);
|
|
56658
|
+
}
|
|
56659
|
+
/**
|
|
56624
56660
|
* AWS ACM Certificate Provider
|
|
56625
56661
|
*
|
|
56626
56662
|
* Implements `AWS::CertificateManager::Certificate` using the ACM SDK.
|
|
@@ -56718,18 +56754,28 @@ var ACMCertificateProvider = class {
|
|
|
56718
56754
|
if (changedImmutable) {
|
|
56719
56755
|
this.logger.debug(`${changedImmutable} changed, replacing ACM certificate: ${physicalId}`);
|
|
56720
56756
|
const createResult = await this.create(logicalId, resourceType, properties);
|
|
56757
|
+
let orphanReason;
|
|
56721
56758
|
try {
|
|
56722
56759
|
const deleteResult = await this.delete(logicalId, physicalId, resourceType, previousProperties);
|
|
56723
|
-
if (deleteResult?.outcome === "skipped")
|
|
56760
|
+
if (deleteResult?.outcome === "skipped") {
|
|
56761
|
+
orphanReason = `old certificate ${physicalId} was not deleted: ${deleteResult.reason}`;
|
|
56762
|
+
this.logger.warn(`Skipped deleting old ACM certificate ${physicalId} during replacement: ${deleteResult.reason}. The old certificate may be orphaned and require manual cleanup.`);
|
|
56763
|
+
}
|
|
56724
56764
|
} catch (error) {
|
|
56725
|
-
|
|
56765
|
+
const inUse = isCertificateInUseError(error);
|
|
56766
|
+
orphanReason = inUse ? `old certificate ${physicalId} is still in use by another resource and was not deleted` : `old certificate ${physicalId} could not be deleted: ${String(error)}`;
|
|
56767
|
+
this.logger.warn(`Failed to delete old ACM certificate ${physicalId} during replacement: ${String(error)}. ` + (inUse ? "This usually means a consumer (e.g. a CloudFront distribution) still references it; it can be deleted once DescribeCertificate.InUseBy is empty. " : "") + `The old certificate may be orphaned and require manual cleanup.`);
|
|
56726
56768
|
}
|
|
56727
|
-
const
|
|
56769
|
+
const base = {
|
|
56728
56770
|
physicalId: createResult.physicalId,
|
|
56729
|
-
wasReplaced: true
|
|
56771
|
+
wasReplaced: true,
|
|
56772
|
+
...createResult.attributes ? { attributes: createResult.attributes } : {}
|
|
56730
56773
|
};
|
|
56731
|
-
|
|
56732
|
-
|
|
56774
|
+
return orphanReason !== void 0 ? {
|
|
56775
|
+
...base,
|
|
56776
|
+
outcome: "partial",
|
|
56777
|
+
reason: orphanReason
|
|
56778
|
+
} : base;
|
|
56733
56779
|
}
|
|
56734
56780
|
try {
|
|
56735
56781
|
const newCt = properties["CertificateTransparencyLoggingPreference"];
|
|
@@ -57590,9 +57636,11 @@ async function deployCommand(stacks, options) {
|
|
|
57590
57636
|
logger.info(`\n${bold("Deployment Summary:")}`);
|
|
57591
57637
|
logger.info(` Stack: ${bold(cyan(deployResult.stackName))}`);
|
|
57592
57638
|
logger.info(` Created: ${deployResult.created > 0 ? green(deployResult.created) : gray(deployResult.created)}`);
|
|
57593
|
-
|
|
57639
|
+
const updatedTotal = deployResult.updated + deployResult.updatePartial;
|
|
57640
|
+
logger.info(` Updated: ${updatedTotal > 0 ? yellow(updatedTotal) : gray(updatedTotal)}`);
|
|
57594
57641
|
logger.info(` Deleted: ${deployResult.deleted > 0 ? red(deployResult.deleted) : gray(deployResult.deleted)}`);
|
|
57595
57642
|
if (deployResult.deleteSkipped > 0) logger.info(` Skipped (not deleted): ${yellow(deployResult.deleteSkipped)}`);
|
|
57643
|
+
if (deployResult.updatePartial > 0) logger.info(` of which left an orphaned predecessor: ${yellow(deployResult.updatePartial)}`);
|
|
57596
57644
|
logger.info(` Unchanged: ${gray(deployResult.unchanged)}`);
|
|
57597
57645
|
logger.info(` Duration: ${cyan((deployResult.durationMs / 1e3).toFixed(2) + "s")}`);
|
|
57598
57646
|
if (deployResult.attributeFallbackCount > 0) logger.warn(`${deployResult.attributeFallbackCount} attribute resolution(s) fell back to the physical ID (potentially wrong values); re-run with --strict-getatt to fail on these`);
|
|
@@ -57604,9 +57652,9 @@ async function deployCommand(stacks, options) {
|
|
|
57604
57652
|
else logger.info(`\n${green("✓")} ${bold("Deployment completed successfully")}`);
|
|
57605
57653
|
recordRunSucceeded(eventRecorder, stackInfo.stackName, {
|
|
57606
57654
|
created: deployResult.created,
|
|
57607
|
-
updated: deployResult.updated,
|
|
57655
|
+
updated: deployResult.updated + deployResult.updatePartial,
|
|
57608
57656
|
deleted: deployResult.deleted,
|
|
57609
|
-
...deployResult.deleteSkipped > 0 && { skipped: deployResult.deleteSkipped }
|
|
57657
|
+
...deployResult.deleteSkipped + deployResult.updatePartial > 0 && { skipped: deployResult.deleteSkipped + deployResult.updatePartial }
|
|
57610
57658
|
}, deployResult.durationMs);
|
|
57611
57659
|
} catch (deployError) {
|
|
57612
57660
|
if (deployError instanceof DeployCancelledError) return;
|
|
@@ -62214,7 +62262,9 @@ async function runRevert(reports, providerRegistry, stateBackend, stateConfig, a
|
|
|
62214
62262
|
try {
|
|
62215
62263
|
const updateResult = await withRetry(() => provider.update(outcome.logicalId, stateResource.physicalId, outcome.resourceType, newProperties, outcome.awsProperties, { desiredFromAwsReadback: true }), outcome.logicalId, { logger: { debug: (msg) => logger.debug(maskSecretsInText(msg, secrets)) } });
|
|
62216
62264
|
totalSucceeded++;
|
|
62217
|
-
|
|
62265
|
+
const revertPartial = updatePartialReason(updateResult);
|
|
62266
|
+
if (revertPartial !== void 0) logger.warn(` ✓ ${report.stackName}/${outcome.logicalId} (${outcome.resourceType}): reverted, ${maskSecretsInText(updatePartialMessage(revertPartial), secrets)}`);
|
|
62267
|
+
else logger.info(` ✓ ${report.stackName}/${outcome.logicalId} (${outcome.resourceType}): reverted.`);
|
|
62218
62268
|
try {
|
|
62219
62269
|
if (updateResult?.effectiveProperties) {
|
|
62220
62270
|
const delta = collectNarrowedTopLevelKeys(newProperties, updateResult.effectiveProperties);
|
|
@@ -81246,7 +81296,7 @@ function createMigrateCommand() {
|
|
|
81246
81296
|
*/
|
|
81247
81297
|
function buildProgram() {
|
|
81248
81298
|
const program = new Command();
|
|
81249
|
-
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.
|
|
81299
|
+
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.0");
|
|
81250
81300
|
program.hook("preAction", (_thisCommand, actionCommand) => {
|
|
81251
81301
|
const { profile } = actionCommand.optsWithGlobals();
|
|
81252
81302
|
if (profile !== void 0) process.env["AWS_PROFILE"] = profile;
|