@intentius/chant-lexicon-aws 0.55.0 → 0.57.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.
Files changed (45) hide show
  1. package/dist/condition.d.ts +27 -0
  2. package/dist/condition.d.ts.map +1 -0
  3. package/dist/generated/index.d.ts +1 -1
  4. package/dist/generated/index.d.ts.map +1 -1
  5. package/dist/import/generator.d.ts +19 -0
  6. package/dist/import/generator.d.ts.map +1 -1
  7. package/dist/import/parser.d.ts +19 -0
  8. package/dist/import/parser.d.ts.map +1 -1
  9. package/dist/index.d.ts +3 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/integrity.json +4 -3
  12. package/dist/intrinsics.d.ts +77 -3
  13. package/dist/intrinsics.d.ts.map +1 -1
  14. package/dist/lint/audit-catalog.d.ts.map +1 -1
  15. package/dist/lint/post-synth/index.d.ts.map +1 -1
  16. package/dist/lint/post-synth/waw069.d.ts +15 -0
  17. package/dist/lint/post-synth/waw069.d.ts.map +1 -0
  18. package/dist/manifest.json +29 -1
  19. package/dist/okf/index.md +1 -0
  20. package/dist/okf/rules/WAW069.md +11 -0
  21. package/dist/plugin.d.ts.map +1 -1
  22. package/dist/rules/waw069.ts +0 -0
  23. package/dist/serializer.d.ts.map +1 -1
  24. package/dist/types/index.d.ts +3 -3
  25. package/package.json +2 -2
  26. package/src/codegen/generate-typescript.ts +3 -3
  27. package/src/codegen/generate.ts +1 -1
  28. package/src/condition.test.ts +129 -0
  29. package/src/condition.ts +40 -0
  30. package/src/generated/index.d.ts +3 -3
  31. package/src/generated/index.ts +1 -1
  32. package/src/import/generator.ts +131 -50
  33. package/src/import/parser.test.ts +96 -0
  34. package/src/import/parser.ts +86 -1
  35. package/src/import/roundtrip-fixtures.test.ts +50 -0
  36. package/src/index.ts +12 -0
  37. package/src/intrinsics.ts +130 -5
  38. package/src/lint/audit-catalog.ts +1 -0
  39. package/src/lint/post-synth/index.ts +2 -0
  40. package/src/lint/post-synth/waw069.test.ts +94 -0
  41. package/src/lint/post-synth/waw069.ts +0 -0
  42. package/src/plugin.test.ts +5 -1
  43. package/src/plugin.ts +4 -0
  44. package/src/serializer.ts +24 -3
  45. package/src/testdata/roundtrip/with-conditions.json +16 -0
@@ -40,6 +40,25 @@ export declare class CFGenerator implements TypeScriptGenerator {
40
40
  * Sort resources by dependencies
41
41
  */
42
42
  private sortByDependencies;
43
+ /**
44
+ * Sort conditions so `{ Condition: ... }` references point at earlier
45
+ * declarations (#2069).
46
+ */
47
+ private sortConditions;
48
+ /**
49
+ * Render a condition reference as the condition's variable when the
50
+ * template declares it, or as a literal name string when it doesn't (an
51
+ * undeclared reference stays visible rather than breaking generation).
52
+ */
53
+ private conditionVarRef;
54
+ /**
55
+ * Generate a condition declaration (#2069)
56
+ */
57
+ private generateCondition;
58
+ /**
59
+ * Generate an output declaration as stackOutput(...) (#2069)
60
+ */
61
+ private generateOutput;
43
62
  /**
44
63
  * Generate a parameter declaration
45
64
  */
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/import/generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,gCAAgC,CAAC;AAE1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAK5F;;GAEG;AACH,qBAAa,WAAY,YAAW,mBAAmB;IACrD,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,aAAa,CAAc;;IAiBnC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,UAAU,GAAG,aAAa,EAAE;IAiCzC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmDvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoGrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuD5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/import/generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,gCAAgC,CAAC;AAEjH,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAK5F;;GAEG;AACH,qBAAa,WAAY,YAAW,mBAAmB;IACrD,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,aAAa,CAAc;;IAiBnC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,UAAU,GAAG,aAAa,EAAE;IAsDzC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgCtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwHrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuD5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -10,6 +10,25 @@ export declare class CFParser extends BaseValueParser implements TemplateParser
10
10
  * Parse CF JSON content into intermediate representation
11
11
  */
12
12
  parse(content: string): TemplateIR;
13
+ /**
14
+ * Template sections import carries. Anything else is named in a warning
15
+ * rather than dropped silently (#2069).
16
+ */
17
+ private static readonly CARRIED_SECTIONS;
18
+ private collectDroppedSectionWarnings;
19
+ /**
20
+ * Parse the Conditions section (#2069). Inside a condition expression the
21
+ * single-key `{ "Condition": "<name>" }` form references another declared
22
+ * condition; `inConditionExpression` scopes that dispatch to this section
23
+ * so a resource property that happens to hold a single-key `Condition`
24
+ * object is left alone.
25
+ */
26
+ private inConditionExpression;
27
+ private parseConditions;
28
+ /**
29
+ * Parse the Outputs section (#2069).
30
+ */
31
+ private parseOutputs;
13
32
  /**
14
33
  * Parse parameters section
15
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/import/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAGX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAqItE;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,eAAgB,YAAW,cAAc;IACrE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAsBlC;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI;CAwIxG"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/import/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAKX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAiJtE;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,eAAgB,YAAW,cAAc;IACrE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IA4BlC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAOrC;IAEH,OAAO,CAAC,6BAA6B;IAUrC;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI;CA8IxG"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { Parameter } from "./parameter.js";
2
+ export { Condition, isCondition, CONDITION_ENTITY_TYPE } from "./condition.js";
2
3
  export { defaultTags, isDefaultTags, DEFAULT_TAGS_MARKER } from "./default-tags.js";
3
4
  export type { DefaultTags, TagEntry } from "./default-tags.js";
4
5
  export { templateTransform, isTemplateTransform, TEMPLATE_TRANSFORM_MARKER } from "./template-transform.js";
@@ -21,7 +22,8 @@ export { awsPlugin } from "./plugin.js";
21
22
  export { observeResourcesDeepAws, awsDeepNormalizationHooks, hasOwnershipMarker, DEEP_READABLE_TYPES, AWS_READ_ONLY_NAMES, AWS_SERVICE_DEFAULTS, } from "./deep-observe.js";
22
23
  export { describeStackResources, describeStackOutputs, describeStackDetail, getResource, listResources, parseResourceDescription, resolveEndpointOverride, serviceEndpointEnvVar, AwsReadError, type AwsReadHttp, type AwsReadClientOptions, type CloudControlDescription, type StackResource, type StackDetail, type AwsCredentials, type AwsCredentialResolver, type AwsCredentialSource, } from "./api/read-client.js";
23
24
  export { signRequest, resolveCredentials, EMPTY_PAYLOAD_SHA256, type SigV4Request, } from "./api/sigv4.js";
24
- export { Sub, Ref, GetAtt, If, Join, Select, Split, Base64, GetAZs, SubIntrinsic, RefIntrinsic, GetAttIntrinsic, IfIntrinsic, JoinIntrinsic, SelectIntrinsic, SplitIntrinsic, Base64Intrinsic, GetAZsIntrinsic, } from "./intrinsics.js";
25
+ export { Sub, Ref, GetAtt, If, Join, Select, Split, Base64, GetAZs, Equals, And, Or, Not, SubIntrinsic, RefIntrinsic, GetAttIntrinsic, IfIntrinsic, JoinIntrinsic, SelectIntrinsic, SplitIntrinsic, Base64Intrinsic, GetAZsIntrinsic, EqualsIntrinsic, AndIntrinsic, OrIntrinsic, NotIntrinsic, } from "./intrinsics.js";
26
+ export type { ConditionOperand } from "./intrinsics.js";
25
27
  export { AWS, StackName, Region, AccountId, StackId, URLSuffix, NoValue, NotificationARNs, Partition, } from "./pseudo.js";
26
28
  export * from "./generated/index.js";
27
29
  export { fetchSchemaZip } from "./spec/fetch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACzG,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxG,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAQrF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACvI,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtF,YAAY,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChG,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,GAAG,EACH,GAAG,EACH,MAAM,EACN,EAAE,EACF,IAAI,EACJ,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,GAAG,EACH,SAAS,EACT,MAAM,EACN,SAAS,EACT,OAAO,EACP,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,SAAS,GACV,MAAM,UAAU,CAAC;AAIlB,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAG5J,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGrJ,OAAO,EACL,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAClE,SAAS,EACT,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAC/F,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,sBAAsB,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAC/G,kBAAkB,EAClB,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAC1D,kBAAkB,EAClB,UAAU,EAAE,cAAc,EAC1B,cAAc,EAAE,2BAA2B,EAAE,gBAAgB,EAC7D,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAC5E,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,mBAAmB,EAAE,cAAc,EAAE,oBAAoB,EACzD,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAChO,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAC1H,uBAAuB,EACvB,oBAAoB,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,eAAe,EAAE,eAAe,EAC5G,uBAAuB,EACvB,eAAe,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,gBAAgB,EAClF,mBAAmB,EAAE,oBAAoB,EACzC,qBAAqB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,sBAAsB,EAChG,0BAA0B,EAC1B,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,sBAAsB,GAC9C,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChI,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "algorithm": "sha256",
3
3
  "artifacts": {
4
- "manifest.json": "94996aac9fb9c95f6c901e82d85b5f51ef5643013c956b7f0898c10687b8fed9",
4
+ "manifest.json": "e40f9769b0d2610a47d5d69fe973e32b99375e0566ccd688e7dc2f57f25f3a44",
5
5
  "meta.json": "49cbb2ca9b454391a7644e14ee9cfd91bcf906c6af683bf46a182aa85047ecc4",
6
- "types/index.d.ts": "6d6b37bd14a9b40fb3ff5c66e1cb49be1ae1032de47a4e167cf5f411c943b7f5",
6
+ "types/index.d.ts": "624cf99a0be147e922baf957e31a9007e830b50397d098c8f4adb9dabf417ff8",
7
7
  "rules/hardcoded-region.ts": "5a0eaf7ab391231fe6cd51426ece29539cb4b36f31c8dd060956638fed55722a",
8
8
  "rules/iam-wildcard.ts": "135d7217d278fef50939e605c5da32603ba35674b8c4b5c4d66a06c77903e945",
9
9
  "rules/s3-encryption.ts": "c4f9f8aa8dc382ed98c7b04e820a600590cc75335a8db2e087cbfbfe4003d09e",
@@ -68,9 +68,10 @@
68
68
  "rules/waw066.ts": "f30e4996fdeb1703f24e1152ffe0698b6a55d140a341dcd9528199206abb18c0",
69
69
  "rules/waw067.ts": "8e66f3512569c106c4c6868786bb870af1b3b05d3542118ca6bb5c61c57314e7",
70
70
  "rules/waw068.ts": "adbfe84e9b3cdafc072346d87a5df81a97ab07bc5171f3d4abb824c29e9a66a0",
71
+ "rules/waw069.ts": "4792bb3943d5e08039f45cbf554f45263703288acf4ca01d88ad778083023d27",
71
72
  "skills/chant-aws.md": "4d65eb160e001f2af42eb7c622a5b498c2fd1f5afbd6c8155615c010fb265c63",
72
73
  "skills/chant-aws-eks.md": "8789255709ff004ad0a875fd5999edcdc66fc6e33d710db058d9f42703bcfdfe",
73
74
  "skills/chant-aws-carve-terraform.md": "0ae4376590db47979be144d3ac6cdcfd56c9640d0536421aacf7330459d38e52"
74
75
  },
75
- "composite": "eae98ef7a950706432edaa62001c121b905c5e1165f60d9bc98e5fd153488855"
76
+ "composite": "61566fe27fca8d8061f3dcbd3cecb2b98281de9b7f5fbed0a8de922c9740ef4a"
76
77
  }
@@ -1,5 +1,13 @@
1
1
  import { INTRINSIC_MARKER, type Intrinsic } from "@intentius/chant/intrinsic";
2
2
  import { type Declarable } from "@intentius/chant/declarable";
3
+ import { type Condition } from "./condition.js";
4
+ /**
5
+ * An operand allowed where CloudFormation expects a condition (#2068): a
6
+ * nested condition intrinsic (`Equals`/`And`/`Or`/`Not`), the `Condition`
7
+ * declarable itself, or a condition name string. The latter two both emit
8
+ * the `{ "Condition": "<name>" }` reference form.
9
+ */
10
+ export type ConditionOperand = Intrinsic | Condition | string;
3
11
  /**
4
12
  * Fn::Sub intrinsic function implementation
5
13
  * Supports template string interpolation with AttrRefs, Declarables, and pseudo-parameters
@@ -63,15 +71,81 @@ export declare class IfIntrinsic implements Intrinsic {
63
71
  private conditionName;
64
72
  private valueIfTrue;
65
73
  private valueIfFalse;
66
- constructor(conditionName: string, valueIfTrue: unknown, valueIfFalse: unknown);
74
+ constructor(conditionName: string | Condition, valueIfTrue: unknown, valueIfFalse: unknown);
67
75
  toJSON(): {
68
76
  "Fn::If": [string, unknown, unknown];
69
77
  };
70
78
  }
71
79
  /**
72
- * Create an If intrinsic
80
+ * Create an If intrinsic. The condition is a name string, or the `Condition`
81
+ * declarable itself (resolved to its logical name at serialization, #2068).
82
+ */
83
+ export declare function If(conditionName: string | Condition, valueIfTrue: unknown, valueIfFalse: unknown): IfIntrinsic;
84
+ /**
85
+ * Fn::Equals condition intrinsic (#2068).
86
+ * Compares two values; each may be a literal or a value intrinsic (Ref etc.).
87
+ */
88
+ export declare class EqualsIntrinsic implements Intrinsic {
89
+ readonly [INTRINSIC_MARKER]: true;
90
+ private left;
91
+ private right;
92
+ constructor(left: unknown, right: unknown);
93
+ toJSON(): {
94
+ "Fn::Equals": [unknown, unknown];
95
+ };
96
+ }
97
+ /**
98
+ * Create an Equals condition intrinsic: `Equals(Ref(cutover), "true")`.
99
+ */
100
+ export declare function Equals(left: unknown, right: unknown): EqualsIntrinsic;
101
+ /**
102
+ * Fn::And condition intrinsic (#2068).
103
+ */
104
+ export declare class AndIntrinsic implements Intrinsic {
105
+ readonly [INTRINSIC_MARKER]: true;
106
+ private conditions;
107
+ constructor(conditions: ConditionOperand[]);
108
+ toJSON(): {
109
+ "Fn::And": unknown[];
110
+ };
111
+ }
112
+ /**
113
+ * Create an And condition intrinsic over 2–10 operands, each a nested
114
+ * condition intrinsic, a `Condition` declarable, or a condition name.
115
+ */
116
+ export declare function And(...conditions: ConditionOperand[]): AndIntrinsic;
117
+ /**
118
+ * Fn::Or condition intrinsic (#2068).
119
+ */
120
+ export declare class OrIntrinsic implements Intrinsic {
121
+ readonly [INTRINSIC_MARKER]: true;
122
+ private conditions;
123
+ constructor(conditions: ConditionOperand[]);
124
+ toJSON(): {
125
+ "Fn::Or": unknown[];
126
+ };
127
+ }
128
+ /**
129
+ * Create an Or condition intrinsic over 2–10 operands, each a nested
130
+ * condition intrinsic, a `Condition` declarable, or a condition name.
131
+ */
132
+ export declare function Or(...conditions: ConditionOperand[]): OrIntrinsic;
133
+ /**
134
+ * Fn::Not condition intrinsic (#2068).
135
+ */
136
+ export declare class NotIntrinsic implements Intrinsic {
137
+ readonly [INTRINSIC_MARKER]: true;
138
+ private condition;
139
+ constructor(condition: ConditionOperand);
140
+ toJSON(): {
141
+ "Fn::Not": [unknown];
142
+ };
143
+ }
144
+ /**
145
+ * Create a Not condition intrinsic over a nested condition intrinsic, a
146
+ * `Condition` declarable, or a condition name.
73
147
  */
74
- export declare function If(conditionName: string, valueIfTrue: unknown, valueIfFalse: unknown): IfIntrinsic;
148
+ export declare function Not(condition: ConditionOperand): NotIntrinsic;
75
149
  /**
76
150
  * Fn::Join intrinsic function
77
151
  * Joins values with a delimiter
@@ -1 +1 @@
1
- {"version":3,"file":"intrinsics.d.ts","sourceRoot":"","sources":["../src/intrinsics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intrinsics.d.ts","sourceRoot":"","sources":["../src/intrinsics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,KAAK,QAAQ,EAAkB,MAAM,gCAAgC,CAAC;AAQ1F,6CAA6C;AAC7C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CA0EpD,CAAC"}
1
+ {"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,KAAK,QAAQ,EAAkB,MAAM,gCAAgC,CAAC;AAQ1F,6CAA6C;AAC7C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CA2EpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AA8DvE,eAAO,MAAM,eAAe,EAAE,cAAc,EA6D3C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AA+DvE,eAAO,MAAM,eAAe,EAAE,cAAc,EA8D3C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * WAW069: Template references an undeclared condition
3
+ *
4
+ * A resource's `Condition` key, an output's `Condition` key, `Fn::If`, and
5
+ * the `{ "Condition": "<name>" }` reference form inside the `Conditions`
6
+ * section all name a condition that must be declared in the template's
7
+ * `Conditions` section — CloudFormation rejects the template otherwise
8
+ * (cfn-lint E8002/E1028). chant can build such a template when a source
9
+ * names a condition that was never declared (#2068); this check turns that
10
+ * deploy-time rejection into a build error.
11
+ */
12
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
13
+ export declare function checkUndeclaredConditions(ctx: PostSynthContext): PostSynthDiagnostic[];
14
+ export declare const waw069: PostSynthCheck;
15
+ //# sourceMappingURL=waw069.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waw069.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/waw069.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAuC9G,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAiDtF;AAED,eAAO,MAAM,MAAM,EAAE,cAOpB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aws",
3
- "version": "0.55.0",
3
+ "version": "0.57.0",
4
4
  "chantVersion": ">=0.1.0",
5
5
  "namespace": "AWS",
6
6
  "intrinsics": [
@@ -65,6 +65,34 @@
65
65
  "outputKey": "Fn::GetAZs",
66
66
  "isTag": false,
67
67
  "foldsAsCall": true
68
+ },
69
+ {
70
+ "name": "Equals",
71
+ "description": "Fn::Equals — condition comparing two values",
72
+ "outputKey": "Fn::Equals",
73
+ "isTag": false,
74
+ "foldsAsCall": true
75
+ },
76
+ {
77
+ "name": "And",
78
+ "description": "Fn::And — condition conjunction",
79
+ "outputKey": "Fn::And",
80
+ "isTag": false,
81
+ "foldsAsCall": true
82
+ },
83
+ {
84
+ "name": "Or",
85
+ "description": "Fn::Or — condition disjunction",
86
+ "outputKey": "Fn::Or",
87
+ "isTag": false,
88
+ "foldsAsCall": true
89
+ },
90
+ {
91
+ "name": "Not",
92
+ "description": "Fn::Not — condition negation",
93
+ "outputKey": "Fn::Not",
94
+ "isTag": false,
95
+ "foldsAsCall": true
68
96
  }
69
97
  ],
70
98
  "pseudoParameters": {
package/dist/okf/index.md CHANGED
@@ -1732,3 +1732,4 @@ okf_version: '0.2'
1732
1732
  * [WAW066](/rules/WAW066.md) - Private subnet's route table has no default route, or its default route targets a gateway that does not exist in the template
1733
1733
  * [WAW067](/rules/WAW067.md) - A single-AZ NAT gateway serves private subnets across multiple Availability Zones — single point of failure for cross-AZ egress
1734
1734
  * [WAW068](/rules/WAW068.md) - VPN Gateway or Transit Gateway has only one attached VPN Connection — no redundant path for hybrid connectivity
1735
+ * [WAW069](/rules/WAW069.md) - Template references a condition it never declares — resource/output Condition keys, Fn::If, and Condition references must name an entry in the Conditions sec...
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: WAW069
4
+ description: Template references a condition it never declares — resource/output Condition keys, Fn::If, and Condition references must name an entry in the Conditions section
5
+ id: WAW069
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: aws
9
+ docs: https://intentius.io/chant/lexicons/aws/rules/
10
+ ---
11
+ Template references a condition it never declares — resource/output Condition keys, Fn::If, and Condition references must name an entry in the Conditions section
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAqQ,MAAM,0BAA0B,CAAC;AAuCjU;yEACyE;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiBnD,eAAO,MAAM,SAAS,EAAE,aA8/BvB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAqQ,MAAM,0BAA0B,CAAC;AAuCjU;yEACyE;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiBnD,eAAO,MAAM,SAAS,EAAE,aAkgCvB,CAAC"}
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAsC,MAAM,6BAA6B,CAAC;AAiflG;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UA4E3B,CAAC"}
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAsC,MAAM,6BAA6B,CAAC;AAsgBlG;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UA4E3B,CAAC"}
@@ -135131,14 +135131,14 @@ export type ZonalAutoshiftConfiguration_ZonalAutoshiftStatus = "ENABLED";
135131
135131
  // --- Intrinsic functions ---
135132
135132
 
135133
135133
  export declare function And(conditions: unknown[]): any;
135134
+ export declare function And(...conditions: unknown[]): any;
135134
135135
  export declare function Base64(value: unknown): any;
135135
135136
  export declare function Cidr(ipBlock: unknown, count: unknown, cidrBits?: unknown): any;
135136
- export declare function Condition(condition: string): any;
135137
135137
  export declare function Equals(a: unknown, b: unknown): any;
135138
135138
  export declare function FindInMap(mapName: string, firstKey: unknown, secondKey: unknown): any;
135139
135139
  export declare function GetAtt(logicalName: string, attribute: string): any;
135140
135140
  export declare function GetAZs(region?: string): any;
135141
- export declare function If(condition: string, valueIfTrue: unknown, valueIfFalse: unknown): any;
135141
+ export declare function If(condition: string | Declarable, valueIfTrue: unknown, valueIfFalse: unknown): any;
135142
135142
  export declare function ImportValue(sharedValue: unknown): any;
135143
135143
  export declare function Join(delimiter: string, values: unknown[]): any;
135144
135144
  export declare function Not(condition: unknown): any;
@@ -135170,7 +135170,7 @@ export interface Declarable {
135170
135170
 
135171
135171
  export interface CFResourceAttributes {
135172
135172
  DependsOn?: Declarable | Declarable[] | string | string[];
135173
- Condition?: string;
135173
+ Condition?: string | Declarable;
135174
135174
  DeletionPolicy?: "Delete" | "Retain" | "RetainExceptOnCreate" | "Snapshot";
135175
135175
  UpdateReplacePolicy?: "Delete" | "Retain" | "Snapshot";
135176
135176
  UpdatePolicy?: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentius/chant-lexicon-aws",
3
- "version": "0.55.0",
3
+ "version": "0.57.0",
4
4
  "description": "AWS CloudFormation lexicon for chant — declarative IaC in TypeScript",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://intentius.io/chant",
@@ -80,7 +80,7 @@
80
80
  "typescript": "^5.9.3"
81
81
  },
82
82
  "peerDependencies": {
83
- "@intentius/chant": "^0.55.0",
83
+ "@intentius/chant": "^0.57.0",
84
84
  "typescript": "^5.9.3"
85
85
  }
86
86
  }
@@ -179,12 +179,12 @@ function staticTypeScript(): string {
179
179
  ["And", "(conditions: unknown[]): any"],
180
180
  ["Base64", "(value: unknown): any"],
181
181
  ["Cidr", "(ipBlock: unknown, count: unknown, cidrBits?: unknown): any"],
182
- ["Condition", "(condition: string): any"],
182
+ ["And", "(...conditions: unknown[]): any"],
183
183
  ["Equals", "(a: unknown, b: unknown): any"],
184
184
  ["FindInMap", "(mapName: string, firstKey: unknown, secondKey: unknown): any"],
185
185
  ["GetAtt", "(logicalName: string, attribute: string): any"],
186
186
  ["GetAZs", "(region?: string): any"],
187
- ["If", "(condition: string, valueIfTrue: unknown, valueIfFalse: unknown): any"],
187
+ ["If", "(condition: string | Declarable, valueIfTrue: unknown, valueIfFalse: unknown): any"],
188
188
  ["ImportValue", "(sharedValue: unknown): any"],
189
189
  ["Join", "(delimiter: string, values: unknown[]): any"],
190
190
  ["Not", "(condition: unknown): any"],
@@ -230,7 +230,7 @@ function staticTypeScript(): string {
230
230
  lines.push("");
231
231
  lines.push("export interface CFResourceAttributes {");
232
232
  lines.push(" DependsOn?: Declarable | Declarable[] | string | string[];");
233
- lines.push(" Condition?: string;");
233
+ lines.push(" Condition?: string | Declarable;");
234
234
  lines.push(' DeletionPolicy?: "Delete" | "Retain" | "RetainExceptOnCreate" | "Snapshot";');
235
235
  lines.push(' UpdateReplacePolicy?: "Delete" | "Retain" | "Snapshot";');
236
236
  lines.push(" UpdatePolicy?: {");
@@ -218,7 +218,7 @@ function generateRuntimeIndex(
218
218
  return coreGenerateRuntimeIndex(resourceEntries, propertyEntries, {
219
219
  lexiconName: "aws",
220
220
  intrinsicReExports: {
221
- names: ["Sub", "Ref", "GetAtt", "If", "Join", "Select", "Split", "Base64"],
221
+ names: ["Sub", "Ref", "GetAtt", "If", "Join", "Select", "Split", "Base64", "Equals", "And", "Or", "Not"],
222
222
  from: "../intrinsics",
223
223
  },
224
224
  pseudoReExports: {
@@ -0,0 +1,129 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { Condition, isCondition, CONDITION_ENTITY_TYPE } from "./condition";
3
+ import { Equals, And, Or, Not, If, Ref } from "./intrinsics";
4
+ import { Parameter } from "./parameter";
5
+ import { awsSerializer } from "./serializer";
6
+ import { stackOutput } from "@intentius/chant/stack-output";
7
+ import { createResource } from "@intentius/chant/runtime";
8
+ import { resolveAttrRefs } from "@intentius/chant/discovery/resolve";
9
+ import type { Declarable } from "@intentius/chant/declarable";
10
+
11
+ const LogGroup = createResource("AWS::Logs::LogGroup", "aws", {});
12
+
13
+ function serialize(entities: Map<string, Declarable>): Record<string, any> {
14
+ resolveAttrRefs(entities);
15
+ return JSON.parse(awsSerializer.serialize(entities) as string);
16
+ }
17
+
18
+ describe("Condition declarable", () => {
19
+ test("carries the aws lexicon and the condition entity type", () => {
20
+ const cond = new Condition(Equals("a", "b"));
21
+ expect(cond.lexicon).toBe("aws");
22
+ expect(cond.entityType).toBe(CONDITION_ENTITY_TYPE);
23
+ expect(isCondition(cond)).toBe(true);
24
+ expect(isCondition(new Parameter("String"))).toBe(false);
25
+ expect(isCondition("DoCutover")).toBe(false);
26
+ });
27
+
28
+ test("rejects a non-intrinsic expression", () => {
29
+ expect(() => new Condition("true" as never)).toThrow(/condition intrinsic/);
30
+ });
31
+ });
32
+
33
+ describe("condition intrinsics", () => {
34
+ test("Equals resolves value intrinsics", () => {
35
+ const param = new Parameter("String");
36
+ const entities = new Map<string, Declarable>([["Cutover", param]]);
37
+ resolveAttrRefs(entities);
38
+ expect(JSON.parse(JSON.stringify(Equals(Ref(param), "true")))).toEqual({
39
+ "Fn::Equals": [{ Ref: "Cutover" }, "true"],
40
+ });
41
+ });
42
+
43
+ test("Not over a Condition declarable emits the Condition reference form", () => {
44
+ const cond = new Condition(Equals("a", "b"));
45
+ const entities = new Map<string, Declarable>([["DoCutover", cond]]);
46
+ resolveAttrRefs(entities);
47
+ expect(JSON.parse(JSON.stringify(Not(cond)))).toEqual({
48
+ "Fn::Not": [{ Condition: "DoCutover" }],
49
+ });
50
+ });
51
+
52
+ test("And/Or accept names, declarables, and nested intrinsics", () => {
53
+ expect(JSON.parse(JSON.stringify(And("A", Equals("x", "y"))))).toEqual({
54
+ "Fn::And": [{ Condition: "A" }, { "Fn::Equals": ["x", "y"] }],
55
+ });
56
+ expect(JSON.parse(JSON.stringify(Or("A", Not("B"))))).toEqual({
57
+ "Fn::Or": [{ Condition: "A" }, { "Fn::Not": [{ Condition: "B" }] }],
58
+ });
59
+ });
60
+
61
+ test("And/Or enforce CloudFormation's 2–10 operand bounds", () => {
62
+ expect(() => And("A")).toThrow(/between 2 and 10/);
63
+ expect(() => Or("A")).toThrow(/between 2 and 10/);
64
+ const eleven = Array.from({ length: 11 }, (_, i) => `C${i}`);
65
+ expect(() => And(...eleven)).toThrow(/between 2 and 10/);
66
+ });
67
+
68
+ test("If accepts the Condition declarable as the condition", () => {
69
+ const cond = new Condition(Equals("a", "b"));
70
+ const entities = new Map<string, Declarable>([["DoCutover", cond]]);
71
+ resolveAttrRefs(entities);
72
+ expect(JSON.parse(JSON.stringify(If(cond, "on", "off")))).toEqual({
73
+ "Fn::If": ["DoCutover", "on", "off"],
74
+ });
75
+ });
76
+ });
77
+
78
+ describe("serializer Conditions section (#2068)", () => {
79
+ test("Condition declarables are lifted into Conditions", () => {
80
+ const param = new Parameter("String", { defaultValue: "false" });
81
+ const doCutover = new Condition(Equals(Ref(param), "true"));
82
+ const noCutover = new Condition(Not(doCutover));
83
+ const template = serialize(
84
+ new Map<string, Declarable>([
85
+ ["Cutover", param],
86
+ ["DoCutover", doCutover],
87
+ ["NoCutover", noCutover],
88
+ ]),
89
+ );
90
+ expect(template.Conditions).toEqual({
91
+ DoCutover: { "Fn::Equals": [{ Ref: "Cutover" }, "true"] },
92
+ NoCutover: { "Fn::Not": [{ Condition: "DoCutover" }] },
93
+ });
94
+ // Never emitted as a Resource
95
+ expect(template.Resources).toEqual({});
96
+ });
97
+
98
+ test("resource-level Condition accepts the declarable as well as a string", () => {
99
+ const doCutover = new Condition(Equals("a", "b"));
100
+ const byRef = new LogGroup({ RetentionInDays: 7 }, { Condition: doCutover });
101
+ const byName = new LogGroup({ RetentionInDays: 7 }, { Condition: "DoCutover" });
102
+ const template = serialize(
103
+ new Map<string, Declarable>([
104
+ ["DoCutover", doCutover],
105
+ ["ByRef", byRef],
106
+ ["ByName", byName],
107
+ ]),
108
+ );
109
+ expect(template.Resources.ByRef.Condition).toBe("DoCutover");
110
+ expect(template.Resources.ByName.Condition).toBe("DoCutover");
111
+ });
112
+
113
+ test("stackOutput condition emits the output-level Condition key", () => {
114
+ const doCutover = new Condition(Equals("a", "b"));
115
+ const group = new LogGroup({ RetentionInDays: 7 }, { Condition: doCutover });
116
+ const out = stackOutput(Ref(group), { condition: doCutover });
117
+ const outByName = stackOutput(Ref(group), { condition: "DoCutover" });
118
+ const template = serialize(
119
+ new Map<string, Declarable>([
120
+ ["DoCutover", doCutover],
121
+ ["Rule", group],
122
+ ["RuleName", out],
123
+ ["RuleNameByName", outByName],
124
+ ]),
125
+ );
126
+ expect(template.Outputs.RuleName).toEqual({ Value: { Ref: "Rule" }, Condition: "DoCutover" });
127
+ expect(template.Outputs.RuleNameByName.Condition).toBe("DoCutover");
128
+ });
129
+ });
@@ -0,0 +1,40 @@
1
+ /**
2
+ * CloudFormation template condition (#2068).
3
+ *
4
+ * A `Condition` declarable is lifted into the template's `Conditions`
5
+ * section by the serializer, the way `Parameter` is lifted into
6
+ * `Parameters`. Reference it from a resource's `Condition` attribute, an
7
+ * output's `condition` option, `If(...)`, or inside another condition via
8
+ * `And`/`Or`/`Not`.
9
+ */
10
+
11
+ import { DECLARABLE_MARKER, isDeclarable, type Declarable } from "@intentius/chant/declarable";
12
+ import { isIntrinsic, type Intrinsic } from "@intentius/chant/intrinsic";
13
+
14
+ export const CONDITION_ENTITY_TYPE = "AWS::CloudFormation::Condition";
15
+
16
+ export class Condition implements Declarable {
17
+ readonly [DECLARABLE_MARKER] = true as const;
18
+ readonly lexicon = "aws";
19
+ readonly entityType = CONDITION_ENTITY_TYPE;
20
+ /** The boolean expression: an `Equals`/`And`/`Or`/`Not` intrinsic. */
21
+ readonly expression: Intrinsic;
22
+
23
+ constructor(expression: Intrinsic) {
24
+ if (!isIntrinsic(expression)) {
25
+ throw new Error(
26
+ "new Condition(expression): expression must be a condition intrinsic (Equals, And, Or, Not)",
27
+ );
28
+ }
29
+ this.expression = expression;
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Type guard for the `Condition` declarable. Duck-typed on `entityType`
35
+ * rather than `instanceof` so a lexicon built against a separate copy of
36
+ * `@intentius/chant` still matches (the #1137 convention).
37
+ */
38
+ export function isCondition(value: unknown): value is Condition {
39
+ return isDeclarable(value) && value.entityType === CONDITION_ENTITY_TYPE;
40
+ }
@@ -135131,14 +135131,14 @@ export type ZonalAutoshiftConfiguration_ZonalAutoshiftStatus = "ENABLED";
135131
135131
  // --- Intrinsic functions ---
135132
135132
 
135133
135133
  export declare function And(conditions: unknown[]): any;
135134
+ export declare function And(...conditions: unknown[]): any;
135134
135135
  export declare function Base64(value: unknown): any;
135135
135136
  export declare function Cidr(ipBlock: unknown, count: unknown, cidrBits?: unknown): any;
135136
- export declare function Condition(condition: string): any;
135137
135137
  export declare function Equals(a: unknown, b: unknown): any;
135138
135138
  export declare function FindInMap(mapName: string, firstKey: unknown, secondKey: unknown): any;
135139
135139
  export declare function GetAtt(logicalName: string, attribute: string): any;
135140
135140
  export declare function GetAZs(region?: string): any;
135141
- export declare function If(condition: string, valueIfTrue: unknown, valueIfFalse: unknown): any;
135141
+ export declare function If(condition: string | Declarable, valueIfTrue: unknown, valueIfFalse: unknown): any;
135142
135142
  export declare function ImportValue(sharedValue: unknown): any;
135143
135143
  export declare function Join(delimiter: string, values: unknown[]): any;
135144
135144
  export declare function Not(condition: unknown): any;
@@ -135170,7 +135170,7 @@ export interface Declarable {
135170
135170
 
135171
135171
  export interface CFResourceAttributes {
135172
135172
  DependsOn?: Declarable | Declarable[] | string | string[];
135173
- Condition?: string;
135173
+ Condition?: string | Declarable;
135174
135174
  DeletionPolicy?: "Delete" | "Retain" | "RetainExceptOnCreate" | "Snapshot";
135175
135175
  UpdateReplacePolicy?: "Delete" | "Retain" | "Snapshot";
135176
135176
  UpdatePolicy?: {