@composurecdk/cloudwatch 0.7.0 → 0.8.1

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 (114) hide show
  1. package/README.md +60 -1
  2. package/dist/commonjs/alarm-config.d.ts.map +1 -0
  3. package/dist/commonjs/alarm-config.js +3 -0
  4. package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
  5. package/dist/{alarm-definition-builder.d.ts → commonjs/alarm-definition-builder.d.ts} +6 -6
  6. package/dist/commonjs/alarm-definition-builder.d.ts.map +1 -0
  7. package/dist/commonjs/alarm-definition-builder.js +103 -0
  8. package/dist/commonjs/alarm-definition-builder.js.map +1 -0
  9. package/dist/commonjs/alarm-definition.d.ts +31 -0
  10. package/dist/commonjs/alarm-definition.d.ts.map +1 -0
  11. package/dist/commonjs/alarm-definition.js +3 -0
  12. package/dist/{alarm-definition.js.map → commonjs/alarm-definition.js.map} +1 -1
  13. package/dist/commonjs/alarm-name.d.ts.map +1 -0
  14. package/dist/commonjs/alarm-name.js +52 -0
  15. package/dist/commonjs/alarm-name.js.map +1 -0
  16. package/dist/commonjs/create-alarms.d.ts.map +1 -0
  17. package/dist/commonjs/create-alarms.js +41 -0
  18. package/dist/commonjs/create-alarms.js.map +1 -0
  19. package/dist/commonjs/default-alarm-name.d.ts.map +1 -0
  20. package/dist/commonjs/default-alarm-name.js +20 -0
  21. package/dist/commonjs/default-alarm-name.js.map +1 -0
  22. package/dist/{index.d.ts → commonjs/index.d.ts} +1 -1
  23. package/dist/commonjs/index.d.ts.map +1 -0
  24. package/dist/commonjs/index.js +18 -0
  25. package/dist/commonjs/index.js.map +1 -0
  26. package/dist/commonjs/package.json +3 -0
  27. package/dist/{policies → commonjs/policies}/alarm-actions-policy.d.ts +19 -11
  28. package/dist/commonjs/policies/alarm-actions-policy.d.ts.map +1 -0
  29. package/dist/commonjs/policies/alarm-actions-policy.js +139 -0
  30. package/dist/commonjs/policies/alarm-actions-policy.js.map +1 -0
  31. package/dist/commonjs/policies/alarm-name-policy.d.ts.map +1 -0
  32. package/dist/commonjs/policies/alarm-name-policy.js +99 -0
  33. package/dist/commonjs/policies/alarm-name-policy.js.map +1 -0
  34. package/dist/{policies → commonjs/policies}/policy-matcher.d.ts +15 -1
  35. package/dist/commonjs/policies/policy-matcher.d.ts.map +1 -0
  36. package/dist/commonjs/policies/policy-matcher.js +41 -0
  37. package/dist/commonjs/policies/policy-matcher.js.map +1 -0
  38. package/dist/commonjs/resolve-alarm-config.d.ts.map +1 -0
  39. package/dist/commonjs/resolve-alarm-config.js +18 -0
  40. package/dist/commonjs/resolve-alarm-config.js.map +1 -0
  41. package/dist/esm/alarm-config.d.ts +31 -0
  42. package/dist/esm/alarm-config.d.ts.map +1 -0
  43. package/dist/esm/alarm-config.js.map +1 -0
  44. package/dist/esm/alarm-definition-builder.d.ts +40 -0
  45. package/dist/esm/alarm-definition-builder.d.ts.map +1 -0
  46. package/dist/{alarm-definition-builder.js → esm/alarm-definition-builder.js} +3 -3
  47. package/dist/esm/alarm-definition-builder.js.map +1 -0
  48. package/dist/esm/alarm-definition.d.ts +31 -0
  49. package/dist/esm/alarm-definition.d.ts.map +1 -0
  50. package/dist/esm/alarm-definition.js.map +1 -0
  51. package/dist/esm/alarm-name.d.ts +32 -0
  52. package/dist/esm/alarm-name.d.ts.map +1 -0
  53. package/dist/esm/alarm-name.js.map +1 -0
  54. package/dist/esm/create-alarms.d.ts +19 -0
  55. package/dist/esm/create-alarms.d.ts.map +1 -0
  56. package/dist/esm/create-alarms.js.map +1 -0
  57. package/dist/esm/default-alarm-name.d.ts +14 -0
  58. package/dist/esm/default-alarm-name.d.ts.map +1 -0
  59. package/dist/esm/default-alarm-name.js.map +1 -0
  60. package/dist/esm/index.d.ts +11 -0
  61. package/dist/esm/index.d.ts.map +1 -0
  62. package/dist/esm/index.js.map +1 -0
  63. package/dist/esm/package.json +3 -0
  64. package/dist/esm/policies/alarm-actions-policy.d.ts +62 -0
  65. package/dist/esm/policies/alarm-actions-policy.d.ts.map +1 -0
  66. package/dist/{policies → esm/policies}/alarm-actions-policy.js +21 -14
  67. package/dist/esm/policies/alarm-actions-policy.js.map +1 -0
  68. package/dist/esm/policies/alarm-name-policy.d.ts +77 -0
  69. package/dist/esm/policies/alarm-name-policy.d.ts.map +1 -0
  70. package/dist/{policies → esm/policies}/alarm-name-policy.js +3 -4
  71. package/dist/esm/policies/alarm-name-policy.js.map +1 -0
  72. package/dist/esm/policies/policy-matcher.d.ts +45 -0
  73. package/dist/esm/policies/policy-matcher.d.ts.map +1 -0
  74. package/dist/esm/policies/policy-matcher.js +35 -0
  75. package/dist/esm/policies/policy-matcher.js.map +1 -0
  76. package/dist/esm/resolve-alarm-config.d.ts +25 -0
  77. package/dist/esm/resolve-alarm-config.d.ts.map +1 -0
  78. package/dist/esm/resolve-alarm-config.js.map +1 -0
  79. package/package.json +33 -15
  80. package/dist/alarm-config.d.ts.map +0 -1
  81. package/dist/alarm-definition-builder.d.ts.map +0 -1
  82. package/dist/alarm-definition-builder.js.map +0 -1
  83. package/dist/alarm-definition.d.ts +0 -21
  84. package/dist/alarm-definition.d.ts.map +0 -1
  85. package/dist/alarm-name.d.ts.map +0 -1
  86. package/dist/alarm-name.js.map +0 -1
  87. package/dist/create-alarms.d.ts.map +0 -1
  88. package/dist/create-alarms.js.map +0 -1
  89. package/dist/default-alarm-name.d.ts.map +0 -1
  90. package/dist/default-alarm-name.js.map +0 -1
  91. package/dist/index.d.ts.map +0 -1
  92. package/dist/index.js.map +0 -1
  93. package/dist/policies/alarm-actions-policy.d.ts.map +0 -1
  94. package/dist/policies/alarm-actions-policy.js.map +0 -1
  95. package/dist/policies/alarm-name-policy.d.ts.map +0 -1
  96. package/dist/policies/alarm-name-policy.js.map +0 -1
  97. package/dist/policies/policy-matcher.d.ts.map +0 -1
  98. package/dist/policies/policy-matcher.js +0 -16
  99. package/dist/policies/policy-matcher.js.map +0 -1
  100. package/dist/resolve-alarm-config.d.ts.map +0 -1
  101. package/dist/resolve-alarm-config.js.map +0 -1
  102. /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
  103. /package/dist/{alarm-name.d.ts → commonjs/alarm-name.d.ts} +0 -0
  104. /package/dist/{create-alarms.d.ts → commonjs/create-alarms.d.ts} +0 -0
  105. /package/dist/{default-alarm-name.d.ts → commonjs/default-alarm-name.d.ts} +0 -0
  106. /package/dist/{policies → commonjs/policies}/alarm-name-policy.d.ts +0 -0
  107. /package/dist/{resolve-alarm-config.d.ts → commonjs/resolve-alarm-config.d.ts} +0 -0
  108. /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
  109. /package/dist/{alarm-definition.js → esm/alarm-definition.js} +0 -0
  110. /package/dist/{alarm-name.js → esm/alarm-name.js} +0 -0
  111. /package/dist/{create-alarms.js → esm/create-alarms.js} +0 -0
  112. /package/dist/{default-alarm-name.js → esm/default-alarm-name.js} +0 -0
  113. /package/dist/{index.js → esm/index.js} +0 -0
  114. /package/dist/{resolve-alarm-config.js → esm/resolve-alarm-config.js} +0 -0
package/README.md CHANGED
@@ -46,6 +46,40 @@ The `description` method also accepts a factory for contextual descriptions:
46
46
  builder.description((def) => `Alert when invocations >= ${def.threshold} per minute`);
47
47
  ```
48
48
 
49
+ ### Rate and ratio alarms
50
+
51
+ The metric factory may return either a `Metric` or a `MathExpression` (the
52
+ exported `AlarmMetric` union), so rate/ratio alarms share the same definition
53
+ shape:
54
+
55
+ ```ts
56
+ import { MathExpression } from "aws-cdk-lib/aws-cloudwatch";
57
+
58
+ new AlarmDefinitionBuilder<LambdaFunction>("errorRate")
59
+ // Guard the denominator: a divide-by-zero data point is dropped, which would
60
+ // otherwise push the alarm into INSUFFICIENT_DATA when there are no invocations.
61
+ .metric(
62
+ (fn) =>
63
+ new MathExpression({
64
+ expression: "IF(invocations > 0, errors / invocations, 0)",
65
+ usingMetrics: {
66
+ errors: fn.metricErrors(),
67
+ invocations: fn.metricInvocations(),
68
+ },
69
+ // Set the period on the expression — it overrides the period of every
70
+ // metric in usingMetrics (default 5 minutes otherwise).
71
+ period: Duration.minutes(1),
72
+ }),
73
+ )
74
+ .threshold(0.05)
75
+ .greaterThanOrEqual()
76
+ .treatMissingData(TreatMissingData.NOT_BREACHING);
77
+ ```
78
+
79
+ Only single-time-series expressions can be alarmed: a `MathExpression` whose
80
+ expression uses `SEARCH(...)` (or otherwise returns multiple series) is rejected
81
+ by CloudWatch at deploy time.
82
+
49
83
  ## createAlarms
50
84
 
51
85
  Factory function that creates CDK [Alarm](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudwatch.Alarm.html) constructs from fully-resolved `AlarmDefinition`s. Returns a `Record<string, Alarm>` keyed by each definition's key.
@@ -123,6 +157,8 @@ alarmActionsPolicy(app, {
123
157
  });
124
158
  ```
125
159
 
160
+ The policy is implemented as a CDK [Aspect](https://docs.aws.amazon.com/cdk/v2/guide/aspects.html) — it has no dependency on `@composurecdk/core` and works in any CDK app. Because aspects fire during synth, the policy can be registered before or after the alarms it targets, and there is **no need to wrap the call in `afterBuild`** — calling `alarmActionsPolicy(app, …)` at app scope outside any `compose()` chain is the recommended shape. The only constraint is that any `IAlarmAction` instances in the config (e.g. `new SnsAction(topic)`) must reference constructs that already exist when the policy is called.
161
+
126
162
  Per-alarm routing is expressed as rules. Matchers can be a substring (tested against both the alarm's `id` and `path`), a `RegExp` (tested against `path`), or a predicate receiving the full match context. Rules append actions on top of `defaults`; set `replaceDefaults: true` on a rule to suppress defaults for its matched alarms.
127
163
 
128
164
  ```ts
@@ -137,7 +173,30 @@ alarmActionsPolicy(app, {
137
173
 
138
174
  All three action states are supported: `alarmActions`, `okActions`, and `insufficientDataActions`.
139
175
 
140
- The policy is implemented as a CDK [Aspect](https://docs.aws.amazon.com/cdk/v2/guide/aspects.html) — it has no dependency on `@composurecdk/core` and works in any CDK app. Because aspects fire during synth, the policy can be registered before or after the alarms it targets. The only constraint is that any `IAlarmAction` instances in the config (e.g. `new SnsAction(topic)`) must reference constructs that already exist when the policy is called.
176
+ ### Per-scope routing: different topics for different stacks
177
+
178
+ Rules route by _alarm identity_ (id, path, predicate). When you instead need to route by _scope_ — e.g. one SNS topic for everything in `us-east-1` and another for the primary region — call `alarmActionsPolicy` multiple times, once per target scope. If the topics are themselves built by the composed system, this is the case where wrapping in [`afterBuild`](../core/README.md) is load-bearing: the closure captures the build `results` so each call can reference its topic.
179
+
180
+ ```ts
181
+ compose(
182
+ { usEast1Alerts: createTopicBuilder(), siteAlerts: createTopicBuilder() },
183
+ {
184
+ /* … */
185
+ },
186
+ )
187
+ .withStacks({ usEast1Alerts: usEast1AlertsStack, siteAlerts: siteStack })
188
+ .afterBuild((_scope, _id, results) => {
189
+ alarmActionsPolicy(usEast1AlertsStack, {
190
+ defaults: { alarmActions: [new SnsAction(results.usEast1Alerts.topic)] },
191
+ });
192
+ alarmActionsPolicy(siteStack, {
193
+ defaults: { alarmActions: [new SnsAction(results.siteAlerts.topic)] },
194
+ });
195
+ })
196
+ .build(app, "MySystem");
197
+ ```
198
+
199
+ If a _single_ topic covers the whole app, prefer the top-level form above — `afterBuild` adds nothing in that case.
141
200
 
142
201
  ### Limitation: L2 alarms only
143
202
 
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-config.d.ts","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=alarm-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../src/alarm-config.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
@@ -1,19 +1,19 @@
1
- import { type Metric, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
- import type { AlarmDefinition } from "./alarm-definition.js";
1
+ import { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { AlarmDefinition, AlarmMetric } from "./alarm-definition.js";
3
3
  import type { AlarmName } from "./alarm-name.js";
4
4
  /**
5
5
  * Fluent builder for constructing deferred {@link AlarmDefinition}s.
6
6
  *
7
- * Stores a metric factory `(construct: T) => Metric` at configuration time.
8
- * Call {@link resolve} during build to invoke the factory and produce a
9
- * complete {@link AlarmDefinition}.
7
+ * Stores a metric factory `(construct: T) => AlarmMetric` at configuration time
8
+ * (a `Metric` or a `MathExpression`). Call {@link resolve} during build to
9
+ * invoke the factory and produce a complete {@link AlarmDefinition}.
10
10
  *
11
11
  * @typeParam TConstruct - The construct type the metric factory receives.
12
12
  */
13
13
  export declare class AlarmDefinitionBuilder<TConstruct> {
14
14
  #private;
15
15
  constructor(key: string);
16
- metric(factory: (construct: TConstruct) => Metric): this;
16
+ metric(factory: (construct: TConstruct) => AlarmMetric): this;
17
17
  /**
18
18
  * Sets an explicit CloudWatch alarm name. When unset, {@link createAlarms}
19
19
  * derives a default from the stack name, builder id, and alarm key. Use
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-definition-builder.d.ts","sourceRoot":"","sources":["../../src/alarm-definition-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;GAQG;AACH,qBAAa,sBAAsB,CAAC,UAAU;;gBAWhC,GAAG,EAAE,MAAM;IAIvB,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,GAAG,IAAI;IAK7D;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAKhC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B,WAAW,IAAI,IAAI;IAKnB,kBAAkB,IAAI,IAAI;IAK1B,QAAQ,IAAI,IAAI;IAKhB,eAAe,IAAI,IAAI;IAKvB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlC,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlC,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAKnD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,eAAe,KAAK,MAAM,CAAC,GAAG,IAAI;IAK3E;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,eAAe;CAwBhD"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlarmDefinitionBuilder = void 0;
4
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
5
+ /**
6
+ * Fluent builder for constructing deferred {@link AlarmDefinition}s.
7
+ *
8
+ * Stores a metric factory `(construct: T) => AlarmMetric` at configuration time
9
+ * (a `Metric` or a `MathExpression`). Call {@link resolve} during build to
10
+ * invoke the factory and produce a complete {@link AlarmDefinition}.
11
+ *
12
+ * @typeParam TConstruct - The construct type the metric factory receives.
13
+ */
14
+ class AlarmDefinitionBuilder {
15
+ #key;
16
+ #alarmName;
17
+ #metricFactory;
18
+ #threshold = 0;
19
+ #comparisonOperator = aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD;
20
+ #evaluationPeriods = 1;
21
+ #datapointsToAlarm = 1;
22
+ #treatMissingData = aws_cloudwatch_1.TreatMissingData.NOT_BREACHING;
23
+ #description = "";
24
+ constructor(key) {
25
+ this.#key = key;
26
+ }
27
+ metric(factory) {
28
+ this.#metricFactory = factory;
29
+ return this;
30
+ }
31
+ /**
32
+ * Sets an explicit CloudWatch alarm name. When unset, {@link createAlarms}
33
+ * derives a default from the stack name, builder id, and alarm key. Use
34
+ * the {@link alarmName} helper to construct branded values.
35
+ */
36
+ alarmName(name) {
37
+ this.#alarmName = name;
38
+ return this;
39
+ }
40
+ threshold(value) {
41
+ this.#threshold = value;
42
+ return this;
43
+ }
44
+ greaterThan() {
45
+ this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD;
46
+ return this;
47
+ }
48
+ greaterThanOrEqual() {
49
+ this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD;
50
+ return this;
51
+ }
52
+ lessThan() {
53
+ this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.LESS_THAN_THRESHOLD;
54
+ return this;
55
+ }
56
+ lessThanOrEqual() {
57
+ this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD;
58
+ return this;
59
+ }
60
+ evaluationPeriods(n) {
61
+ this.#evaluationPeriods = n;
62
+ return this;
63
+ }
64
+ datapointsToAlarm(n) {
65
+ this.#datapointsToAlarm = n;
66
+ return this;
67
+ }
68
+ treatMissingData(treatment) {
69
+ this.#treatMissingData = treatment;
70
+ return this;
71
+ }
72
+ description(text) {
73
+ this.#description = text;
74
+ return this;
75
+ }
76
+ /**
77
+ * Resolves the deferred metric factory against a construct and
78
+ * returns a complete {@link AlarmDefinition}.
79
+ *
80
+ * @throws If {@link metric} was not called before resolve.
81
+ */
82
+ resolve(construct) {
83
+ if (!this.#metricFactory) {
84
+ throw new Error(`AlarmDefinitionBuilder "${this.#key}": metric() must be called before resolve()`);
85
+ }
86
+ const definition = {
87
+ key: this.#key,
88
+ alarmName: this.#alarmName,
89
+ metric: this.#metricFactory(construct),
90
+ threshold: this.#threshold,
91
+ comparisonOperator: this.#comparisonOperator,
92
+ evaluationPeriods: this.#evaluationPeriods,
93
+ datapointsToAlarm: this.#datapointsToAlarm,
94
+ treatMissingData: this.#treatMissingData,
95
+ description: "",
96
+ };
97
+ definition.description =
98
+ typeof this.#description === "function" ? this.#description(definition) : this.#description;
99
+ return definition;
100
+ }
101
+ }
102
+ exports.AlarmDefinitionBuilder = AlarmDefinitionBuilder;
103
+ //# sourceMappingURL=alarm-definition-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-definition-builder.js","sourceRoot":"","sources":["../../src/alarm-definition-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ComparisonOperator, MathExpression, Metric, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { AlarmName } from "./alarm-name.js";
3
+ /**
4
+ * A metric an alarm can be created from: either a single {@link Metric} or a
5
+ * {@link MathExpression} (e.g. a rate/ratio like `errors / invocations`).
6
+ *
7
+ * Both classes carry `createAlarm(...)` — it is declared on the concrete
8
+ * classes, not on `IMetric` — so this union is exactly what {@link createAlarms}
9
+ * needs to call. When using a `MathExpression`, set its `period` explicitly:
10
+ * the expression overrides the period of every metric in `usingMetrics`.
11
+ */
12
+ export type AlarmMetric = Metric | MathExpression;
13
+ /**
14
+ * A fully-resolved alarm descriptor. All fields are required —
15
+ * this is the canonical form consumed by {@link createAlarms}.
16
+ *
17
+ * `alarmName` is the only optional field: when omitted, {@link createAlarms}
18
+ * derives a default via `defaultAlarmName(scope, id, key)`.
19
+ */
20
+ export interface AlarmDefinition {
21
+ key: string;
22
+ alarmName?: AlarmName;
23
+ metric: AlarmMetric;
24
+ threshold: number;
25
+ comparisonOperator: ComparisonOperator;
26
+ evaluationPeriods: number;
27
+ datapointsToAlarm: number;
28
+ treatMissingData: TreatMissingData;
29
+ description: string;
30
+ }
31
+ //# sourceMappingURL=alarm-definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-definition.d.ts","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,MAAM,EACN,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=alarm-definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-definition.js","sourceRoot":"","sources":["../src/alarm-definition.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"alarm-definition.js","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-name.d.ts","sourceRoot":"","sources":["../../src/alarm-name.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAKrE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAclD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,SAAM,GAAG,SAAS,CAG/E;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3C"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alarmName = alarmName;
4
+ exports.joinAlarmName = joinAlarmName;
5
+ exports.kebab = kebab;
6
+ const VALID_CHARS = /^[A-Za-z0-9\-_./#:()+ =@]+$/;
7
+ const MAX_LEN = 255;
8
+ /**
9
+ * Validates and brands a string as an {@link AlarmName}. The string is used
10
+ * verbatim — no sanitisation — so what the caller writes is exactly what
11
+ * appears in CloudWatch.
12
+ *
13
+ * @throws If the input is empty, exceeds 255 chars, or contains characters
14
+ * outside CloudWatch's allowed set: `[A-Za-z0-9-_./#:()+ =@]`.
15
+ */
16
+ function alarmName(input) {
17
+ const trimmed = input.trim();
18
+ if (trimmed.length === 0) {
19
+ throw new Error("alarm name cannot be empty");
20
+ }
21
+ if (trimmed.length > MAX_LEN) {
22
+ throw new Error(`alarm name exceeds ${String(MAX_LEN)} chars: "${trimmed}"`);
23
+ }
24
+ if (!VALID_CHARS.test(trimmed)) {
25
+ throw new Error(`alarm name contains invalid characters (allowed: A-Z a-z 0-9 - _ . / # : ( ) + = @ space): "${trimmed}"`);
26
+ }
27
+ return trimmed;
28
+ }
29
+ /**
30
+ * Builds an {@link AlarmName} by kebab-casing each segment and joining with
31
+ * `sep`. Empty segments after kebab-casing are dropped, so callers can pass
32
+ * e.g. `Stack.of(scope).stackName` without worrying about token-resolution
33
+ * artefacts.
34
+ */
35
+ function joinAlarmName(segments, sep = "/") {
36
+ const parts = segments.map(kebab).filter((s) => s.length > 0);
37
+ return alarmName(parts.join(sep));
38
+ }
39
+ /**
40
+ * Lower-cases and hyphenates a string: splits camelCase / PascalCase /
41
+ * snake_case / dotted boundaries into hyphen-separated lowercase words.
42
+ */
43
+ function kebab(input) {
44
+ return input
45
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
46
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
47
+ .replace(/[_\s.]+/g, "-")
48
+ .replace(/-+/g, "-")
49
+ .replace(/^-|-$/g, "")
50
+ .toLowerCase();
51
+ }
52
+ //# sourceMappingURL=alarm-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-name.js","sourceRoot":"","sources":["../../src/alarm-name.ts"],"names":[],"mappings":";;AAoBA,8BAcC;AAQD,sCAGC;AAMD,sBAQC;AAlDD,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAClD,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,YAAY,OAAO,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,+FAA+F,OAAO,GAAG,CAC1G,CAAC;IACJ,CAAC;IACD,OAAO,OAAoB,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,QAA2B,EAAE,GAAG,GAAG,GAAG;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,KAAa;IACjC,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-alarms.d.ts","sourceRoot":"","sources":["../../src/create-alarms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,eAAe,EAAE,GAC7B,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAsBvB"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAlarms = createAlarms;
4
+ const default_alarm_name_js_1 = require("./default-alarm-name.js");
5
+ function capitalize(s) {
6
+ return s[0].toUpperCase() + s.slice(1);
7
+ }
8
+ /**
9
+ * Creates CDK {@link Alarm} constructs from fully-resolved {@link AlarmDefinition}s.
10
+ *
11
+ * Validates that all definition keys are unique before creating alarms. Each
12
+ * alarm's `AlarmName` is taken verbatim from `def.alarmName` when supplied;
13
+ * otherwise it is derived from the scope, `id`, and `def.key` via
14
+ * {@link defaultAlarmName}.
15
+ *
16
+ * @param scope - CDK construct scope.
17
+ * @param id - Base identifier; each alarm's construct id is `${id}${Capitalize(key)}Alarm`.
18
+ * @param definitions - Fully-resolved alarm definitions.
19
+ * @returns A record mapping each definition's key to its created Alarm.
20
+ * @throws If duplicate keys are found in the definitions.
21
+ */
22
+ function createAlarms(scope, id, definitions) {
23
+ const alarms = {};
24
+ for (const def of definitions) {
25
+ if (def.key in alarms) {
26
+ throw new Error(`Duplicate alarm key "${def.key}". Custom alarms cannot use the same key as a recommended alarm. ` +
27
+ `Disable the recommended alarm first, or use a different key.`);
28
+ }
29
+ alarms[def.key] = def.metric.createAlarm(scope, `${id}${capitalize(def.key)}Alarm`, {
30
+ alarmName: def.alarmName ?? (0, default_alarm_name_js_1.defaultAlarmName)(scope, id, def.key),
31
+ threshold: def.threshold,
32
+ evaluationPeriods: def.evaluationPeriods,
33
+ datapointsToAlarm: def.datapointsToAlarm,
34
+ treatMissingData: def.treatMissingData,
35
+ comparisonOperator: def.comparisonOperator,
36
+ alarmDescription: def.description,
37
+ });
38
+ }
39
+ return alarms;
40
+ }
41
+ //# sourceMappingURL=create-alarms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-alarms.js","sourceRoot":"","sources":["../../src/create-alarms.ts"],"names":[],"mappings":";;AAuBA,oCA0BC;AA9CD,mEAA2D;AAE3D,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,YAAY,CAC1B,KAAiB,EACjB,EAAU,EACV,WAA8B;IAE9B,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,CAAC,GAAG,mEAAmE;gBAChG,8DAA8D,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;YAClF,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAA,wCAAgB,EAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;YAChE,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;YAC1C,gBAAgB,EAAE,GAAG,CAAC,WAAW;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-alarm-name.d.ts","sourceRoot":"","sources":["../../src/default-alarm-name.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAGtF"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultAlarmName = defaultAlarmName;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const alarm_name_js_1 = require("./alarm-name.js");
6
+ /**
7
+ * Builds a human-readable, stack-scoped {@link AlarmName} from the alarm's
8
+ * scope, base id, and key.
9
+ *
10
+ * Format: `${stackName}/${kebab(id)}/${kebab(key)}`. Slashes are valid in
11
+ * CloudWatch alarm names and render hierarchy clearly in the console.
12
+ *
13
+ * Used by {@link createAlarms} as the fallback whenever an explicit
14
+ * `alarmName` is not supplied on the {@link AlarmDefinition}.
15
+ */
16
+ function defaultAlarmName(scope, id, key) {
17
+ const stackName = aws_cdk_lib_1.Stack.of(scope).stackName;
18
+ return (0, alarm_name_js_1.joinAlarmName)([stackName, id, key]);
19
+ }
20
+ //# sourceMappingURL=default-alarm-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-alarm-name.js","sourceRoot":"","sources":["../../src/default-alarm-name.ts"],"names":[],"mappings":";;AAcA,4CAGC;AAjBD,6CAAoC;AAEpC,mDAAgE;AAEhE;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,KAAiB,EAAE,EAAU,EAAE,GAAW;IACzE,MAAM,SAAS,GAAG,mBAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC5C,OAAO,IAAA,6BAAa,EAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export type { AlarmConfig, AlarmConfigDefaults } from "./alarm-config.js";
2
- export type { AlarmDefinition } from "./alarm-definition.js";
2
+ export type { AlarmDefinition, AlarmMetric } from "./alarm-definition.js";
3
3
  export { AlarmDefinitionBuilder } from "./alarm-definition-builder.js";
4
4
  export { type AlarmName, alarmName } from "./alarm-name.js";
5
5
  export { defaultAlarmName } from "./default-alarm-name.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,GACb,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alarmNamePolicy = exports.alarmActionsPolicy = exports.resolveAlarmConfig = exports.createAlarms = exports.defaultAlarmName = exports.alarmName = exports.AlarmDefinitionBuilder = void 0;
4
+ var alarm_definition_builder_js_1 = require("./alarm-definition-builder.js");
5
+ Object.defineProperty(exports, "AlarmDefinitionBuilder", { enumerable: true, get: function () { return alarm_definition_builder_js_1.AlarmDefinitionBuilder; } });
6
+ var alarm_name_js_1 = require("./alarm-name.js");
7
+ Object.defineProperty(exports, "alarmName", { enumerable: true, get: function () { return alarm_name_js_1.alarmName; } });
8
+ var default_alarm_name_js_1 = require("./default-alarm-name.js");
9
+ Object.defineProperty(exports, "defaultAlarmName", { enumerable: true, get: function () { return default_alarm_name_js_1.defaultAlarmName; } });
10
+ var create_alarms_js_1 = require("./create-alarms.js");
11
+ Object.defineProperty(exports, "createAlarms", { enumerable: true, get: function () { return create_alarms_js_1.createAlarms; } });
12
+ var resolve_alarm_config_js_1 = require("./resolve-alarm-config.js");
13
+ Object.defineProperty(exports, "resolveAlarmConfig", { enumerable: true, get: function () { return resolve_alarm_config_js_1.resolveAlarmConfig; } });
14
+ var alarm_actions_policy_js_1 = require("./policies/alarm-actions-policy.js");
15
+ Object.defineProperty(exports, "alarmActionsPolicy", { enumerable: true, get: function () { return alarm_actions_policy_js_1.alarmActionsPolicy; } });
16
+ var alarm_name_policy_js_1 = require("./policies/alarm-name-policy.js");
17
+ Object.defineProperty(exports, "alarmNamePolicy", { enumerable: true, get: function () { return alarm_name_policy_js_1.alarmNamePolicy; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAEA,6EAAuE;AAA9D,qIAAA,sBAAsB,OAAA;AAC/B,iDAA4D;AAAnC,0GAAA,SAAS,OAAA;AAClC,iEAA2D;AAAlD,yHAAA,gBAAgB,OAAA;AACzB,uDAAkD;AAAzC,gHAAA,YAAY,OAAA;AACrB,qEAAyF;AAAhF,6HAAA,kBAAkB,OAAA;AAC3B,8EAAwE;AAA/D,6HAAA,kBAAkB,OAAA;AAM3B,wEAKyC;AAJvC,uHAAA,eAAe,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -1,4 +1,4 @@
1
- import { type IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
1
+ import type { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
2
2
  import { type IConstruct } from "constructs";
3
3
  import { type AlarmRuleScope } from "./policy-matcher.js";
4
4
  export type { AlarmMatchContext, AlarmMatcher } from "./policy-matcher.js";
@@ -23,17 +23,25 @@ export interface AlarmActionsPolicyConfig {
23
23
  skipIfAlreadyConfigured?: boolean;
24
24
  }
25
25
  /**
26
- * Attaches CloudWatch alarm actions to every `Alarm` and `CompositeAlarm`
27
- * (L2) construct in the subtree under `scope`.
26
+ * Registers a CDK {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
27
+ * on `scope` that attaches CloudWatch alarm actions to every `Alarm` and
28
+ * `CompositeAlarm` (L2) construct in the subtree at synth time. Call once
29
+ * with any scope — an `App`, a `Stack`, or the scope passed to `.build()`
30
+ * for a composed system; alarms added after the call still pick up the
31
+ * policy, so call ordering is irrelevant as
32
+ * long as it happens before `app.synth()`. In particular, there is no need
33
+ * to wrap this call in `afterBuild` — the Aspect runs after the construct
34
+ * tree is finalised, not at call time. The only temporal constraint is that
35
+ * any `IAlarmAction` instances in `config` (e.g. `new SnsAction(topic)`)
36
+ * must reference constructs that already exist when the policy is called.
28
37
  *
29
- * The policy installs a CDK {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
30
- * that fires during the synth prepare phase, so late-added alarms are also
31
- * covered. Detection uses the jsii type guards
32
- * `CfnAlarm.isCfnAlarm` / `CfnCompositeAlarm.isCfnCompositeAlarm` on the L1
33
- * resource; the L2 parent is found via duck-typing on `addAlarmAction`.
34
- * Actions are attached through the L2 so that `IAlarmAction.bind()` runs and
35
- * permissions are wired correctly. Bare `CfnAlarm` nodes (created without an
36
- * L2 wrapper) are detected but silently skipped.
38
+ * Detection uses the version-portable `isCfnAlarm` / `isCfnCompositeAlarm`
39
+ * guards (`CfnResource.isCfnResource` + `cfnResourceType`, so they work below
40
+ * aws-cdk-lib 2.231.0) on the L1 resource; the L2 parent is found via
41
+ * duck-typing on `addAlarmAction`. Actions are attached through
42
+ * the L2 so that `IAlarmAction.bind()` runs and permissions are wired
43
+ * correctly. Bare `CfnAlarm` nodes (created without an L2 wrapper) are
44
+ * detected but silently skipped.
37
45
  *
38
46
  * `defaults` apply to every matched alarm; `rules` append additional actions.
39
47
  * A rule matches if any of its `match` entries matches. Set
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-actions-policy.d.ts","sourceRoot":"","sources":["../../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuC,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE3E,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1C;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAgB,SAAQ,cAAc,EAAE,cAAc;IACrE,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,oDAAoD;AACpD,MAAM,WAAW,wBAAwB;IACvC,kGAAkG;IAClG,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,mFAAmF;IACnF,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AA4DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAkD5F"}