Skip to content

Commit 6359c12

Browse files
author
Romain Marcadier
authored
fix(cfn2ts): some property times have behavioral-interface names (#18275)
Some CloudFormation library generated types, such as `@aws-cdk/aws-networkfirewall.CfnRuleGroup.IPSetProperty` are meant to be jsii structs, but have names that cause them to be handled as jsii behavioral interfaces (`I` followed by a capital letter). Mangling the names (i.e: changing `IPSet` to `IpSet`) would also work, but is tedious to maintain and has been proven to lead to inadeverten releasing of stable code that does not have the intended "shape" in other languages. Instead - this uses the jsii type system hints feature introduced a few months ago in the compiler to force those interfaces to be considered as structs regardless of their name. Fixes aws/jsii#2929 (and probably more) BREAKING CHANGE: some "complex" property types within the generated CloudFormation interfaces (i.e: properties of `Cfn*` constructs) with names starting with a capital letter `I` followed by another capital letter are no longer incorrectly treated as behavioral interfaces, and might hence have different usage patterns in non-TypeScript languages. Such interfaces were previously very difficult to use in non-TypeScript languages, and required convoluted workarounds, which can now be removed. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent c208e60 commit 6359c12

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

tools/@aws-cdk/cfn2ts/lib/codegen.ts

+3
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export default class CodeGenerator {
117117
this.docLink(spec.Documentation,
118118
`Properties for defining a \`${resourceContext.className}\``,
119119
'',
120+
'@struct', // Make this interface ALWAYS be treated as a struct, event if it's named `IPSet...` or something...
120121
'@stability external');
121122
this.code.openBlock(`export interface ${name.className}`);
122123

@@ -861,6 +862,8 @@ export default class CodeGenerator {
861862
this.docLink(
862863
propTypeSpec.Documentation,
863864
docs.description,
865+
'',
866+
'@struct', // Make this interface ALWAYS be treated as a struct, event if it's named `IPSet...` or something...
864867
'@stability external',
865868
);
866869
/*

0 commit comments

Comments
 (0)