@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
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alarmActionsPolicy = alarmActionsPolicy;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const policy_matcher_js_1 = require("./policy-matcher.js");
6
+ function isL2AlarmLike(node) {
7
+ if (node === undefined)
8
+ return false;
9
+ const candidate = node;
10
+ return (typeof candidate.addAlarmAction === "function" &&
11
+ typeof candidate.addOkAction === "function" &&
12
+ typeof candidate.addInsufficientDataAction === "function");
13
+ }
14
+ function isAlreadyConfigured(cfn) {
15
+ // `cfn.alarmActions` is always a Lazy-wrapped array at aspect-visit time,
16
+ // even when empty. Resolve it against the owning Stack to inspect real contents.
17
+ const actions = cfn.alarmActions;
18
+ if (actions === undefined)
19
+ return false;
20
+ const resolved = aws_cdk_lib_1.Stack.of(cfn).resolve(actions);
21
+ if (resolved === undefined || resolved === null)
22
+ return false;
23
+ if (Array.isArray(resolved))
24
+ return resolved.length > 0;
25
+ return true;
26
+ }
27
+ function dedupe(items) {
28
+ const seen = new Set();
29
+ const result = [];
30
+ for (const item of items) {
31
+ if (!seen.has(item)) {
32
+ seen.add(item);
33
+ result.push(item);
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ function visitAlarms(scope, visit) {
39
+ aws_cdk_lib_1.Aspects.of(scope).add({
40
+ visit(node) {
41
+ const isAlarm = (0, policy_matcher_js_1.isCfnAlarm)(node);
42
+ const isComposite = (0, policy_matcher_js_1.isCfnCompositeAlarm)(node);
43
+ if (!isAlarm && !isComposite)
44
+ return;
45
+ const parent = node.node.scope;
46
+ const l2 = isL2AlarmLike(parent) ? parent : undefined;
47
+ visit(node, l2, isComposite);
48
+ },
49
+ });
50
+ }
51
+ /**
52
+ * Registers a CDK {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
53
+ * on `scope` that attaches CloudWatch alarm actions to every `Alarm` and
54
+ * `CompositeAlarm` (L2) construct in the subtree at synth time. Call once
55
+ * with any scope — an `App`, a `Stack`, or the scope passed to `.build()`
56
+ * for a composed system; alarms added after the call still pick up the
57
+ * policy, so call ordering is irrelevant as
58
+ * long as it happens before `app.synth()`. In particular, there is no need
59
+ * to wrap this call in `afterBuild` — the Aspect runs after the construct
60
+ * tree is finalised, not at call time. The only temporal constraint is that
61
+ * any `IAlarmAction` instances in `config` (e.g. `new SnsAction(topic)`)
62
+ * must reference constructs that already exist when the policy is called.
63
+ *
64
+ * Detection uses the version-portable `isCfnAlarm` / `isCfnCompositeAlarm`
65
+ * guards (`CfnResource.isCfnResource` + `cfnResourceType`, so they work below
66
+ * aws-cdk-lib 2.231.0) on the L1 resource; the L2 parent is found via
67
+ * duck-typing on `addAlarmAction`. Actions are attached through
68
+ * the L2 so that `IAlarmAction.bind()` runs and permissions are wired
69
+ * correctly. Bare `CfnAlarm` nodes (created without an L2 wrapper) are
70
+ * detected but silently skipped.
71
+ *
72
+ * `defaults` apply to every matched alarm; `rules` append additional actions.
73
+ * A rule matches if any of its `match` entries matches. Set
74
+ * `replaceDefaults: true` on a rule to suppress defaults for its matched
75
+ * alarms.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * alarmActionsPolicy(app, {
80
+ * defaults: { alarmActions: [new SnsAction(standardTopic)] },
81
+ * rules: [
82
+ * { match: "HighSev", alarmActions: [new SnsAction(pagerTopic)] },
83
+ * ],
84
+ * });
85
+ * ```
86
+ */
87
+ function alarmActionsPolicy(scope, config) {
88
+ const { defaults, rules = [], skipIfAlreadyConfigured = false } = config;
89
+ const processed = new WeakSet();
90
+ visitAlarms(scope, (cfn, alarm, isComposite) => {
91
+ if (alarm === undefined)
92
+ return;
93
+ if (processed.has(alarm))
94
+ return;
95
+ if (skipIfAlreadyConfigured && isAlreadyConfigured(cfn))
96
+ return;
97
+ const ctx = {
98
+ alarm: alarm,
99
+ cfn,
100
+ id: alarm.node.id,
101
+ path: alarm.node.path,
102
+ isComposite,
103
+ };
104
+ const matched = rules.filter((r) => (0, policy_matcher_js_1.ruleMatches)(r, ctx));
105
+ const replaceDefaults = matched.some((r) => r.replaceDefaults === true);
106
+ const alarmActions = [];
107
+ const okActions = [];
108
+ const insufficientDataActions = [];
109
+ if (defaults !== undefined && !replaceDefaults) {
110
+ if (defaults.alarmActions !== undefined)
111
+ alarmActions.push(...defaults.alarmActions);
112
+ if (defaults.okActions !== undefined)
113
+ okActions.push(...defaults.okActions);
114
+ if (defaults.insufficientDataActions !== undefined) {
115
+ insufficientDataActions.push(...defaults.insufficientDataActions);
116
+ }
117
+ }
118
+ for (const rule of matched) {
119
+ if (rule.alarmActions !== undefined)
120
+ alarmActions.push(...rule.alarmActions);
121
+ if (rule.okActions !== undefined)
122
+ okActions.push(...rule.okActions);
123
+ if (rule.insufficientDataActions !== undefined) {
124
+ insufficientDataActions.push(...rule.insufficientDataActions);
125
+ }
126
+ }
127
+ const uniqueAlarm = dedupe(alarmActions);
128
+ const uniqueOk = dedupe(okActions);
129
+ const uniqueInsufficient = dedupe(insufficientDataActions);
130
+ if (uniqueAlarm.length > 0)
131
+ alarm.addAlarmAction(...uniqueAlarm);
132
+ if (uniqueOk.length > 0)
133
+ alarm.addOkAction(...uniqueOk);
134
+ if (uniqueInsufficient.length > 0)
135
+ alarm.addInsufficientDataAction(...uniqueInsufficient);
136
+ processed.add(alarm);
137
+ });
138
+ }
139
+ //# sourceMappingURL=alarm-actions-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-actions-policy.js","sourceRoot":"","sources":["../../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":";;AAkIA,gDAkDC;AApLD,6CAA6C;AAG7C,2DAM6B;AAiC7B,SAAS,aAAa,CAAC,IAA4B;IACjD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,SAAS,GAAG,IAA0C,CAAC;IAC7D,OAAO,CACL,OAAO,SAAS,CAAC,cAAc,KAAK,UAAU;QAC9C,OAAO,SAAS,CAAC,WAAW,KAAK,UAAU;QAC3C,OAAO,SAAS,CAAC,yBAAyB,KAAK,UAAU,CAC1D,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAiC;IAC5D,0EAA0E;IAC1E,iFAAiF;IACjF,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;IACjC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,QAAQ,GAAY,mBAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAI,KAAmB;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAK,CAAC;IAC1B,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAS,WAAW,CAAC,KAAiB,EAAE,KAAmB;IACzD,qBAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;QACpB,KAAK,CAAC,IAAgB;YACpB,MAAM,OAAO,GAAG,IAAA,8BAAU,EAAC,IAAI,CAAC,CAAC;YACjC,MAAM,WAAW,GAAG,IAAA,uCAAmB,EAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW;gBAAE,OAAO;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/B,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACtD,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,SAAgB,kBAAkB,CAAC,KAAiB,EAAE,MAAgC;IACpF,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,uBAAuB,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,OAAO,EAAc,CAAC;IAE5C,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QAC7C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO;QACjC,IAAI,uBAAuB,IAAI,mBAAmB,CAAC,GAAG,CAAC;YAAE,OAAO;QAEhE,MAAM,GAAG,GAAsB;YAC7B,KAAK,EAAE,KAA0B;YACjC,GAAG;YACH,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;YACrB,WAAW;SACZ,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,+BAAW,EAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC;QAExE,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,MAAM,uBAAuB,GAAmB,EAAE,CAAC;QAEnD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YACrF,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC5E,IAAI,QAAQ,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;gBACnD,uBAAuB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;gBAC/C,uBAAuB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAE3D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC;QACxD,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,CAAC,CAAC;QAE1F,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-name-policy.d.ts","sourceRoot":"","sources":["../../../src/policies/alarm-name-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAIpB,MAAM,qBAAqB,CAAC;AAE7B,yDAAyD;AACzD,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,SAAS,CAAC;IAC1D,iGAAiG;IACjG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACpD,4DAA4D;IAC5D,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAgDtF"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alarmNamePolicy = alarmNamePolicy;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const alarm_name_js_1 = require("../alarm-name.js");
6
+ const policy_matcher_js_1 = require("./policy-matcher.js");
7
+ function decorate(current, prefix, suffix, sep) {
8
+ const parts = [];
9
+ if (prefix !== undefined && prefix.length > 0)
10
+ parts.push(prefix);
11
+ parts.push(current);
12
+ if (suffix !== undefined && suffix.length > 0)
13
+ parts.push(suffix);
14
+ return parts.join(sep);
15
+ }
16
+ function resolveAlarmName(cfn) {
17
+ const value = cfn.alarmName;
18
+ if (value === undefined)
19
+ return undefined;
20
+ const resolved = aws_cdk_lib_1.Stack.of(cfn).resolve(value);
21
+ return typeof resolved === "string" ? resolved : undefined;
22
+ }
23
+ /**
24
+ * Decorates CloudWatch alarm names across an entire scope.
25
+ *
26
+ * Installs a CDK
27
+ * {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
28
+ * that fires during the synth prepare phase. For every `AWS::CloudWatch::Alarm`
29
+ * (and `AWS::CloudWatch::CompositeAlarm`) found beneath `scope`:
30
+ *
31
+ * 1. The alarm's existing name is read (set by the library default or the
32
+ * consumer's per-alarm override).
33
+ * 2. `defaults.prefix` / `defaults.suffix` decorate it, unless a matched
34
+ * rule sets `replaceDefaults: true`.
35
+ * 3. Each matching rule contributes in declaration order — `transform`
36
+ * replaces the current name; otherwise `prefix`/`suffix` decorate.
37
+ * 4. The final value is validated via {@link alarmName} and written back to
38
+ * `cfn.alarmName`.
39
+ *
40
+ * Use cases: stage prefixing (`prod-…`), severity tagging (`…-critical`),
41
+ * team scoping. Composes with per-alarm `alarmName` overrides — those run
42
+ * first, the policy decorates the result.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * alarmNamePolicy(app, {
47
+ * defaults: { prefix: "prod" },
48
+ * rules: [
49
+ * { match: /Errors$/, suffix: "critical" },
50
+ * { match: "throttles", suffix: "warning" },
51
+ * ],
52
+ * });
53
+ * ```
54
+ */
55
+ function alarmNamePolicy(scope, config) {
56
+ const { defaults, rules = [], separator = "-" } = config;
57
+ const processed = new WeakSet();
58
+ aws_cdk_lib_1.Aspects.of(scope).add({
59
+ visit(node) {
60
+ const isAlarm = (0, policy_matcher_js_1.isCfnAlarm)(node);
61
+ const isComposite = (0, policy_matcher_js_1.isCfnCompositeAlarm)(node);
62
+ if (!isAlarm && !isComposite)
63
+ return;
64
+ const cfn = node;
65
+ if (processed.has(cfn))
66
+ return;
67
+ const original = resolveAlarmName(cfn);
68
+ if (original === undefined)
69
+ return;
70
+ const parent = cfn.node.scope;
71
+ const ctx = {
72
+ alarm: undefined,
73
+ cfn,
74
+ id: parent?.node.id ?? cfn.node.id,
75
+ path: parent?.node.path ?? cfn.node.path,
76
+ isComposite,
77
+ };
78
+ const matched = rules.filter((r) => (0, policy_matcher_js_1.ruleMatches)(r, ctx));
79
+ const replaceDefaults = matched.some((r) => r.replaceDefaults === true);
80
+ let current = original;
81
+ if (defaults !== undefined && !replaceDefaults) {
82
+ current = decorate(current, defaults.prefix, defaults.suffix, separator);
83
+ }
84
+ for (const rule of matched) {
85
+ if (rule.transform !== undefined) {
86
+ current = rule.transform({ ...ctx, currentName: current });
87
+ continue;
88
+ }
89
+ current = decorate(current, rule.prefix, rule.suffix, separator);
90
+ }
91
+ if (current === original)
92
+ return;
93
+ const validated = (0, alarm_name_js_1.alarmName)(current);
94
+ cfn.alarmName = validated;
95
+ processed.add(cfn);
96
+ },
97
+ });
98
+ }
99
+ //# sourceMappingURL=alarm-name-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-name-policy.js","sourceRoot":"","sources":["../../../src/policies/alarm-name-policy.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,18 @@
1
- import type { CfnAlarm, CfnCompositeAlarm, IAlarm } from "aws-cdk-lib/aws-cloudwatch";
1
+ import { CfnAlarm, CfnCompositeAlarm, type IAlarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { IConstruct } from "constructs";
3
+ /**
4
+ * Version-portable replacement for `CfnAlarm.isCfnAlarm`, which only exists in
5
+ * aws-cdk-lib >= 2.231.0 and throws `TypeError` on older versions inside our
6
+ * declared `^2.0.0` peer range (issue #146). Checks the foundational
7
+ * `CfnResource.isCfnResource` guard plus a `cfnResourceType` compare — exactly
8
+ * what the modern static does internally — so it works across the full range.
9
+ */
10
+ export declare function isCfnAlarm(x: IConstruct): x is CfnAlarm;
11
+ /**
12
+ * Version-portable replacement for `CfnCompositeAlarm.isCfnCompositeAlarm`.
13
+ * See {@link isCfnAlarm} for why this exists.
14
+ */
15
+ export declare function isCfnCompositeAlarm(x: IConstruct): x is CfnCompositeAlarm;
2
16
  /**
3
17
  * Selects which alarms a rule applies to.
4
18
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-matcher.d.ts","sourceRoot":"","sources":["../../../src/policies/policy-matcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,IAAI,QAAQ,CAEvD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,IAAI,iBAAiB,CAIzE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAIjF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAKjF"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCfnAlarm = isCfnAlarm;
4
+ exports.isCfnCompositeAlarm = isCfnCompositeAlarm;
5
+ exports.matchesOne = matchesOne;
6
+ exports.ruleMatches = ruleMatches;
7
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
8
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
9
+ /**
10
+ * Version-portable replacement for `CfnAlarm.isCfnAlarm`, which only exists in
11
+ * aws-cdk-lib >= 2.231.0 and throws `TypeError` on older versions inside our
12
+ * declared `^2.0.0` peer range (issue #146). Checks the foundational
13
+ * `CfnResource.isCfnResource` guard plus a `cfnResourceType` compare — exactly
14
+ * what the modern static does internally — so it works across the full range.
15
+ */
16
+ function isCfnAlarm(x) {
17
+ return aws_cdk_lib_1.CfnResource.isCfnResource(x) && x.cfnResourceType === aws_cloudwatch_1.CfnAlarm.CFN_RESOURCE_TYPE_NAME;
18
+ }
19
+ /**
20
+ * Version-portable replacement for `CfnCompositeAlarm.isCfnCompositeAlarm`.
21
+ * See {@link isCfnAlarm} for why this exists.
22
+ */
23
+ function isCfnCompositeAlarm(x) {
24
+ return (aws_cdk_lib_1.CfnResource.isCfnResource(x) && x.cfnResourceType === aws_cloudwatch_1.CfnCompositeAlarm.CFN_RESOURCE_TYPE_NAME);
25
+ }
26
+ function matchesOne(matcher, ctx) {
27
+ if (typeof matcher === "function")
28
+ return matcher(ctx);
29
+ if (matcher instanceof RegExp)
30
+ return matcher.test(ctx.path);
31
+ return ctx.id.includes(matcher) || ctx.path.includes(matcher);
32
+ }
33
+ function ruleMatches(rule, ctx) {
34
+ if (rule.singleOnly === true && ctx.isComposite)
35
+ return false;
36
+ if (rule.compositeOnly === true && !ctx.isComposite)
37
+ return false;
38
+ const matchers = Array.isArray(rule.match) ? rule.match : [rule.match];
39
+ return matchers.some((m) => matchesOne(m, ctx));
40
+ }
41
+ //# sourceMappingURL=policy-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-matcher.js","sourceRoot":"","sources":["../../../src/policies/policy-matcher.ts"],"names":[],"mappings":";;AAWA,gCAEC;AAMD,kDAIC;AAgCD,gCAIC;AAED,kCAKC;AAlED,6CAA0C;AAC1C,+DAAsF;AAGtF;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,CAAa;IACtC,OAAO,yBAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,KAAK,yBAAQ,CAAC,sBAAsB,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,CAAa;IAC/C,OAAO,CACL,yBAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,KAAK,kCAAiB,CAAC,sBAAsB,CAC/F,CAAC;AACJ,CAAC;AAgCD,SAAgB,UAAU,CAAC,OAAqB,EAAE,GAAsB;IACtE,IAAI,OAAO,OAAO,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,OAAO,YAAY,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,WAAW,CAAC,IAAoB,EAAE,GAAsB;IACtE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-alarm-config.d.ts","sourceRoot":"","sources":["../../src/resolve-alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,QAAQ,EAAE,mBAAmB,GAC5B,mBAAmB,CAQrB"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveAlarmConfig = resolveAlarmConfig;
4
+ /**
5
+ * Resolves an absolute-threshold alarm config by layering user overrides
6
+ * onto the defaults. `alarmName` is propagated from user config only;
7
+ * defaults intentionally do not specify a name.
8
+ */
9
+ function resolveAlarmConfig(userConfig, defaults) {
10
+ return {
11
+ alarmName: userConfig?.alarmName,
12
+ threshold: userConfig?.threshold ?? defaults.threshold,
13
+ evaluationPeriods: userConfig?.evaluationPeriods ?? defaults.evaluationPeriods,
14
+ datapointsToAlarm: userConfig?.datapointsToAlarm ?? defaults.datapointsToAlarm,
15
+ treatMissingData: userConfig?.treatMissingData ?? defaults.treatMissingData,
16
+ };
17
+ }
18
+ //# sourceMappingURL=resolve-alarm-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-alarm-config.js","sourceRoot":"","sources":["../../src/resolve-alarm-config.ts"],"names":[],"mappings":";;AAyBA,gDAWC;AAhBD;;;;GAIG;AACH,SAAgB,kBAAkB,CAChC,UAAmC,EACnC,QAA6B;IAE7B,OAAO;QACL,SAAS,EAAE,UAAU,EAAE,SAAS;QAChC,SAAS,EAAE,UAAU,EAAE,SAAS,IAAI,QAAQ,CAAC,SAAS;QACtD,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,IAAI,QAAQ,CAAC,iBAAiB;QAC9E,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,IAAI,QAAQ,CAAC,iBAAiB;QAC9E,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB;KAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { AlarmName } from "./alarm-name.js";
3
+ /**
4
+ * Configuration for a single recommended CloudWatch alarm.
5
+ * Every field has a documented default; users override individual
6
+ * fields to tune thresholds without replacing the entire alarm.
7
+ */
8
+ export interface AlarmConfig {
9
+ /**
10
+ * Explicit CloudWatch alarm name. When omitted, the library derives a
11
+ * readable default from the stack name, builder id, and alarm key.
12
+ *
13
+ * Construct via the {@link alarmName} helper to opt into the same
14
+ * validation the library applies to its own auto-generated names.
15
+ */
16
+ alarmName?: AlarmName;
17
+ /** Alarm threshold. Default varies per alarm type. */
18
+ threshold?: number;
19
+ /** Number of evaluation periods before triggering. @default 1 */
20
+ evaluationPeriods?: number;
21
+ /** Datapoints within evaluation periods required to trigger. @default 1 */
22
+ datapointsToAlarm?: number;
23
+ /** How to treat missing data points. @default TreatMissingData.NOT_BREACHING */
24
+ treatMissingData?: TreatMissingData;
25
+ }
26
+ /**
27
+ * Type for per-package `*_ALARM_DEFAULTS` constants. Defaults set every
28
+ * tunable field but never `alarmName` — names are derived per-instance.
29
+ */
30
+ export type AlarmConfigDefaults = Required<Omit<AlarmConfig, "alarmName">>;
31
+ //# sourceMappingURL=alarm-config.d.ts.map
@@ -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 @@
1
+ {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { AlarmDefinition, AlarmMetric } from "./alarm-definition.js";
3
+ import type { AlarmName } from "./alarm-name.js";
4
+ /**
5
+ * Fluent builder for constructing deferred {@link AlarmDefinition}s.
6
+ *
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
+ *
11
+ * @typeParam TConstruct - The construct type the metric factory receives.
12
+ */
13
+ export declare class AlarmDefinitionBuilder<TConstruct> {
14
+ #private;
15
+ constructor(key: string);
16
+ metric(factory: (construct: TConstruct) => AlarmMetric): this;
17
+ /**
18
+ * Sets an explicit CloudWatch alarm name. When unset, {@link createAlarms}
19
+ * derives a default from the stack name, builder id, and alarm key. Use
20
+ * the {@link alarmName} helper to construct branded values.
21
+ */
22
+ alarmName(name: AlarmName): this;
23
+ threshold(value: number): this;
24
+ greaterThan(): this;
25
+ greaterThanOrEqual(): this;
26
+ lessThan(): this;
27
+ lessThanOrEqual(): this;
28
+ evaluationPeriods(n: number): this;
29
+ datapointsToAlarm(n: number): this;
30
+ treatMissingData(treatment: TreatMissingData): this;
31
+ description(text: string | ((definition: AlarmDefinition) => string)): this;
32
+ /**
33
+ * Resolves the deferred metric factory against a construct and
34
+ * returns a complete {@link AlarmDefinition}.
35
+ *
36
+ * @throws If {@link metric} was not called before resolve.
37
+ */
38
+ resolve(construct: TConstruct): AlarmDefinition;
39
+ }
40
+ //# sourceMappingURL=alarm-definition-builder.d.ts.map
@@ -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"}
@@ -2,9 +2,9 @@ import { ComparisonOperator, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch
2
2
  /**
3
3
  * Fluent builder for constructing deferred {@link AlarmDefinition}s.
4
4
  *
5
- * Stores a metric factory `(construct: T) => Metric` at configuration time.
6
- * Call {@link resolve} during build to invoke the factory and produce a
7
- * complete {@link AlarmDefinition}.
5
+ * Stores a metric factory `(construct: T) => AlarmMetric` at configuration time
6
+ * (a `Metric` or a `MathExpression`). Call {@link resolve} during build to
7
+ * invoke the factory and produce a complete {@link AlarmDefinition}.
8
8
  *
9
9
  * @typeParam TConstruct - The construct type the metric factory receives.
10
10
  */
@@ -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 @@
1
+ {"version":3,"file":"alarm-definition.js","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ declare const alarmNameBrand: unique symbol;
2
+ /**
3
+ * A validated CloudWatch alarm name. Construct via {@link alarmName} or
4
+ * {@link joinAlarmName}; the brand prevents bare strings from being passed
5
+ * where an `AlarmName` is required.
6
+ */
7
+ export type AlarmName = string & {
8
+ readonly [alarmNameBrand]: true;
9
+ };
10
+ /**
11
+ * Validates and brands a string as an {@link AlarmName}. The string is used
12
+ * verbatim — no sanitisation — so what the caller writes is exactly what
13
+ * appears in CloudWatch.
14
+ *
15
+ * @throws If the input is empty, exceeds 255 chars, or contains characters
16
+ * outside CloudWatch's allowed set: `[A-Za-z0-9-_./#:()+ =@]`.
17
+ */
18
+ export declare function alarmName(input: string): AlarmName;
19
+ /**
20
+ * Builds an {@link AlarmName} by kebab-casing each segment and joining with
21
+ * `sep`. Empty segments after kebab-casing are dropped, so callers can pass
22
+ * e.g. `Stack.of(scope).stackName` without worrying about token-resolution
23
+ * artefacts.
24
+ */
25
+ export declare function joinAlarmName(segments: readonly string[], sep?: string): AlarmName;
26
+ /**
27
+ * Lower-cases and hyphenates a string: splits camelCase / PascalCase /
28
+ * snake_case / dotted boundaries into hyphen-separated lowercase words.
29
+ */
30
+ export declare function kebab(input: string): string;
31
+ export {};
32
+ //# sourceMappingURL=alarm-name.d.ts.map
@@ -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 @@
1
+ {"version":3,"file":"alarm-name.js","sourceRoot":"","sources":["../../src/alarm-name.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAClD,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;;;;GAOG;AACH,MAAM,UAAU,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,MAAM,UAAU,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,MAAM,UAAU,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,19 @@
1
+ import { Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { IConstruct } from "constructs";
3
+ import type { AlarmDefinition } from "./alarm-definition.js";
4
+ /**
5
+ * Creates CDK {@link Alarm} constructs from fully-resolved {@link AlarmDefinition}s.
6
+ *
7
+ * Validates that all definition keys are unique before creating alarms. Each
8
+ * alarm's `AlarmName` is taken verbatim from `def.alarmName` when supplied;
9
+ * otherwise it is derived from the scope, `id`, and `def.key` via
10
+ * {@link defaultAlarmName}.
11
+ *
12
+ * @param scope - CDK construct scope.
13
+ * @param id - Base identifier; each alarm's construct id is `${id}${Capitalize(key)}Alarm`.
14
+ * @param definitions - Fully-resolved alarm definitions.
15
+ * @returns A record mapping each definition's key to its created Alarm.
16
+ * @throws If duplicate keys are found in the definitions.
17
+ */
18
+ export declare function createAlarms(scope: IConstruct, id: string, definitions: AlarmDefinition[]): Record<string, Alarm>;
19
+ //# sourceMappingURL=create-alarms.d.ts.map
@@ -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 @@
1
+ {"version":3,"file":"create-alarms.js","sourceRoot":"","sources":["../../src/create-alarms.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;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,MAAM,UAAU,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,gBAAgB,CAAC,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,14 @@
1
+ import type { IConstruct } from "constructs";
2
+ import { type AlarmName } from "./alarm-name.js";
3
+ /**
4
+ * Builds a human-readable, stack-scoped {@link AlarmName} from the alarm's
5
+ * scope, base id, and key.
6
+ *
7
+ * Format: `${stackName}/${kebab(id)}/${kebab(key)}`. Slashes are valid in
8
+ * CloudWatch alarm names and render hierarchy clearly in the console.
9
+ *
10
+ * Used by {@link createAlarms} as the fallback whenever an explicit
11
+ * `alarmName` is not supplied on the {@link AlarmDefinition}.
12
+ */
13
+ export declare function defaultAlarmName(scope: IConstruct, id: string, key: string): AlarmName;
14
+ //# sourceMappingURL=default-alarm-name.d.ts.map
@@ -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 @@
1
+ {"version":3,"file":"default-alarm-name.js","sourceRoot":"","sources":["../../src/default-alarm-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAkB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,EAAU,EAAE,GAAW;IACzE,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC5C,OAAO,aAAa,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type { AlarmConfig, AlarmConfigDefaults } from "./alarm-config.js";
2
+ export type { AlarmDefinition, AlarmMetric } from "./alarm-definition.js";
3
+ export { AlarmDefinitionBuilder } from "./alarm-definition-builder.js";
4
+ export { type AlarmName, alarmName } from "./alarm-name.js";
5
+ export { defaultAlarmName } from "./default-alarm-name.js";
6
+ export { createAlarms } from "./create-alarms.js";
7
+ export { resolveAlarmConfig, type ResolvedAlarmConfig } from "./resolve-alarm-config.js";
8
+ export { alarmActionsPolicy } from "./policies/alarm-actions-policy.js";
9
+ export type { AlarmActionsPolicyConfig, AlarmMatchContext, AlarmMatcher, } from "./policies/alarm-actions-policy.js";
10
+ export { alarmNamePolicy, type AlarmNamePolicyConfig, type AlarmNameRule, type AlarmNameTransformContext, } from "./policies/alarm-name-policy.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAkB,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,EAA4B,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAMxE,OAAO,EACL,eAAe,GAIhB,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }