Skip to content

Commit d0dc665

Browse files
fix(lib): properly interpolate dependencies in replaceTriggeredBy
This change will address the bug identified in #3196 where using replaceTriggeredBy will improperly generate a tokenized address.
1 parent a36c83b commit d0dc665

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

packages/cdktf/lib/terraform-resource.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
processDynamicAttributesForHcl,
1212
} from "./util";
1313
import { ITerraformDependable } from "./terraform-dependable";
14-
import { ref, dependable } from "./tfExpression";
14+
import { ref, dependable, replaceTriggeredBy } from "./tfExpression";
1515
import { IResolvable } from "./tokens/resolvable";
1616
import { IInterpolatingParent } from "./terraform-addressable";
1717
import { ITerraformIterator } from "./terraform-iterator";
@@ -78,13 +78,9 @@ export function lifecycleToTerraform(
7878
...lifecycle,
7979
...(lifecycle?.replaceTriggeredBy?.length
8080
? {
81-
replaceTriggeredBy: lifecycle?.replaceTriggeredBy?.map((x) => {
82-
if (typeof x === "string") {
83-
return x;
84-
} else {
85-
return x.fqn;
86-
}
87-
}),
81+
replaceTriggeredBy: lifecycle?.replaceTriggeredBy?.map((x) =>
82+
replaceTriggeredBy(x),
83+
),
8884
}
8985
: undefined),
9086
};

packages/cdktf/lib/tfExpression.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,13 +466,39 @@ export function dependable(dependable: ITerraformDependable): string {
466466
return Token.asString(new Dependable(dependable));
467467
}
468468

469+
// eslint-disable-next-line jsdoc/require-jsdoc
470+
class ReplaceTriggeredBy extends TFExpression {
471+
constructor(private readonly trigger: ITerraformDependable | string) {
472+
super(trigger);
473+
}
474+
475+
public resolve(context: IResolveContext) {
476+
context.suppressBraces = true;
477+
478+
if (typeof this.trigger === "string") {
479+
return context.resolve(this.trigger);
480+
}
481+
return context.resolve(this.trigger.fqn);
482+
}
483+
}
484+
485+
/**
486+
* Takes either a full resource or a resource property and then
487+
* returns the logical address without braces/interpolation to
488+
* be used in replaceTriggeredBy directives.
489+
*/
490+
export function replaceTriggeredBy(trigger: ITerraformDependable | string) {
491+
return Token.asString(new ReplaceTriggeredBy(trigger));
492+
}
493+
469494
export type Expression =
470495
| Reference
471496
| FunctionCall
472497
| PropertyAccess
473498
| ConditionalExpression
474499
| OperatorExpression
475500
| Dependable
501+
| ReplaceTriggeredBy
476502
| ForExpression
477503
| string
478504
| string[]

packages/cdktf/test/__snapshots__/resource.test.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,8 @@ exports[`supports resource and attribute references in lifecycle.replaceTriggere
456456
"simple": {
457457
"lifecycle": {
458458
"replace_triggered_by": [
459-
"\${test_resource.other}",
460-
"\${test_resource.other.string_value}"
459+
"test_resource.other",
460+
"test_resource.other.string_value"
461461
]
462462
},
463463
"name": "foo"

0 commit comments

Comments
 (0)