diff --git a/packages/cdkConstructs/src/changesets/checkDestructiveChanges.ts b/packages/cdkConstructs/src/changesets/checkDestructiveChanges.ts index 0f8807d5..84ab85ba 100644 --- a/packages/cdkConstructs/src/changesets/checkDestructiveChanges.ts +++ b/packages/cdkConstructs/src/changesets/checkDestructiveChanges.ts @@ -5,6 +5,16 @@ import { Change as CloudFormationChange } from "@aws-sdk/client-cloudformation" +const isConditionalCdkMetadataChange = (resourceChange: CloudFormationChange["ResourceChange"]): boolean => { + if (!resourceChange) { + return false + } + + return resourceChange.LogicalResourceId === "CDKMetadata" && + resourceChange.ResourceType === "AWS::CDK::Metadata" && + String(resourceChange.Replacement ?? "") === "Conditional" +} + export type ChangeRequiringAttention = { logicalId: string; physicalId: string; @@ -66,6 +76,10 @@ export function checkDestructiveChanges( const action = resourceChange.Action const isRemoval = action === "Remove" + if (replacementNeeded && isConditionalCdkMetadataChange(resourceChange)) { + return undefined + } + if (!replacementNeeded && !isRemoval) { return undefined } diff --git a/packages/cdkConstructs/tests/changesets/checkDestructiveChanges.test.ts b/packages/cdkConstructs/tests/changesets/checkDestructiveChanges.test.ts index 7cdb31bd..ab83f783 100644 --- a/packages/cdkConstructs/tests/changesets/checkDestructiveChanges.test.ts +++ b/packages/cdkConstructs/tests/changesets/checkDestructiveChanges.test.ts @@ -100,6 +100,25 @@ describe("checkDestructiveChanges", () => { } ]) }) + + test("ignores conditional CDK metadata replacements", () => { + const changeSet = { + Changes: [ + { + ResourceChange: { + LogicalResourceId: "CDKMetadata", + PhysicalResourceId: "metadata-id", + ResourceType: "AWS::CDK::Metadata", + Replacement: "Conditional" + } + } + ] + } + + const replacements = checkDestructiveChanges(changeSet) + + expect(replacements).toEqual([]) + }) }) describe("checkDestructiveChangeSet", () => {