@composurecdk/cloudwatch 0.4.5 → 0.4.7

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 (42) hide show
  1. package/README.md +51 -0
  2. package/dist/alarm-config.d.ts +14 -0
  3. package/dist/alarm-config.d.ts.map +1 -1
  4. package/dist/alarm-definition-builder.d.ts +7 -0
  5. package/dist/alarm-definition-builder.d.ts.map +1 -1
  6. package/dist/alarm-definition-builder.js +11 -0
  7. package/dist/alarm-definition-builder.js.map +1 -1
  8. package/dist/alarm-definition.d.ts +5 -0
  9. package/dist/alarm-definition.d.ts.map +1 -1
  10. package/dist/alarm-name.d.ts +32 -0
  11. package/dist/alarm-name.d.ts.map +1 -0
  12. package/dist/alarm-name.js +47 -0
  13. package/dist/alarm-name.js.map +1 -0
  14. package/dist/create-alarms.d.ts +5 -2
  15. package/dist/create-alarms.d.ts.map +1 -1
  16. package/dist/create-alarms.js +7 -2
  17. package/dist/create-alarms.js.map +1 -1
  18. package/dist/default-alarm-name.d.ts +14 -0
  19. package/dist/default-alarm-name.d.ts.map +1 -0
  20. package/dist/default-alarm-name.js +17 -0
  21. package/dist/default-alarm-name.js.map +1 -0
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +3 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/policies/alarm-actions-policy.d.ts +4 -29
  27. package/dist/policies/alarm-actions-policy.d.ts.map +1 -1
  28. package/dist/policies/alarm-actions-policy.js +1 -15
  29. package/dist/policies/alarm-actions-policy.js.map +1 -1
  30. package/dist/policies/alarm-name-policy.d.ts +77 -0
  31. package/dist/policies/alarm-name-policy.d.ts.map +1 -0
  32. package/dist/policies/alarm-name-policy.js +97 -0
  33. package/dist/policies/alarm-name-policy.js.map +1 -0
  34. package/dist/policies/policy-matcher.d.ts +31 -0
  35. package/dist/policies/policy-matcher.d.ts.map +1 -0
  36. package/dist/policies/policy-matcher.js +16 -0
  37. package/dist/policies/policy-matcher.js.map +1 -0
  38. package/dist/resolve-alarm-config.d.ts +12 -6
  39. package/dist/resolve-alarm-config.d.ts.map +1 -1
  40. package/dist/resolve-alarm-config.js +3 -1
  41. package/dist/resolve-alarm-config.js.map +1 -1
  42. package/package.json +1 -1
package/README.md CHANGED
@@ -59,6 +59,57 @@ const alarms = createAlarms(scope, "MyFunction", definitions);
59
59
 
60
60
  Construct IDs follow the pattern `${id}${Capitalize(key)}Alarm` (e.g., `MyFunctionErrorsAlarm`).
61
61
 
62
+ ### Alarm names
63
+
64
+ Each alarm receives an explicit, hierarchical name of the form `${stackName}/${kebab(id)}/${kebab(key)}` (e.g. `payments-prod/checkout-fn/errors`) instead of CloudFormation's hash-suffixed default. Slashes render hierarchy in the console; segments are kebab-cased so names scan cleanly in dashboards, oncall pages, and email subjects, where word separation matters more than in code.
65
+
66
+ Per-alarm overrides go through [`alarmName()`][alarm-name-src] — a validating constructor for the branded [`AlarmName`][alarm-name-src] type — and cross-cutting decoration through [alarmNamePolicy](#alarmnamepolicy). The default fallback lives in [`defaultAlarmName`][default-alarm-name-src].
67
+
68
+ [alarm-name-src]: ./src/alarm-name.ts
69
+ [default-alarm-name-src]: ./src/default-alarm-name.ts
70
+
71
+ ## alarmNamePolicy
72
+
73
+ A [Policy](../../docs/adr/0002-policies.md) that decorates CloudWatch alarm names across an entire scope. Mirrors the shape of `alarmActionsPolicy` — install it once on an `App` or `Stack` and it applies to every alarm the subtree produces, including alarms created later by builders or nested composed systems.
74
+
75
+ ```ts
76
+ import { alarmNamePolicy } from "@composurecdk/cloudwatch";
77
+
78
+ alarmNamePolicy(app, {
79
+ defaults: { prefix: "prod" },
80
+ rules: [
81
+ { match: /Errors$/, suffix: "critical" },
82
+ { match: "throttles", suffix: "warning" },
83
+ { match: (ctx) => ctx.path.includes("payments"), prefix: "payments" },
84
+ ],
85
+ });
86
+ ```
87
+
88
+ For each alarm the policy reads the existing name (from `defaultAlarmName` or a per-alarm override), applies `defaults.prefix` / `defaults.suffix`, then layers each matching rule in declaration order. The result is validated via `alarmName()` and written back to the CFN resource.
89
+
90
+ Rules support `prefix`, `suffix`, and `transform`. `transform` produces a new name from scratch and wins over `prefix`/`suffix` on the same rule. `replaceDefaults: true` on a matched rule suppresses the `defaults` decoration for that alarm.
91
+
92
+ ```ts
93
+ alarmNamePolicy(app, {
94
+ defaults: { prefix: "prod" },
95
+ rules: [
96
+ { match: "team-x", prefix: "team-x", replaceDefaults: true },
97
+ {
98
+ match: /payments/,
99
+ transform: (ctx) => alarmName(`payments/${ctx.id}`),
100
+ },
101
+ ],
102
+ });
103
+ ```
104
+
105
+ Matchers use the same shape as `alarmActionsPolicy`: substring (tested against both `id` and `path`), `RegExp` (tested against `path`), or a predicate receiving the full match context. `singleOnly` / `compositeOnly` scope rules to one alarm kind.
106
+
107
+ The separator between `prefix` / current-name / `suffix` segments defaults to `-`; pass `separator` to override.
108
+
109
+ ### Limitation: L1 reads only
110
+
111
+ The policy reads `cfn.alarmName` and writes the decorated value back. If a name is set as an unresolved CDK token that doesn't resolve to a string at synth time, the alarm is skipped and the original name is left in place. In practice every alarm produced by ComposureCDK builders (and aws-cdk-lib's L2 `Alarm`) sets a resolvable string, so this is rare.
112
+
62
113
  ## alarmActionsPolicy
63
114
 
64
115
  A [Policy](../../docs/adr/0002-policies.md) that routes CloudWatch alarm actions (e.g. SNS notifications) to every `Alarm` and `CompositeAlarm` in a construct subtree. Install it once on an `App` or `Stack` and it applies to every alarm the subtree produces — including alarms created later by builders or nested composed systems.
@@ -1,10 +1,19 @@
1
1
  import type { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { AlarmName } from "./alarm-name.js";
2
3
  /**
3
4
  * Configuration for a single recommended CloudWatch alarm.
4
5
  * Every field has a documented default; users override individual
5
6
  * fields to tune thresholds without replacing the entire alarm.
6
7
  */
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;
8
17
  /** Alarm threshold. Default varies per alarm type. */
9
18
  threshold?: number;
10
19
  /** Number of evaluation periods before triggering. @default 1 */
@@ -14,4 +23,9 @@ export interface AlarmConfig {
14
23
  /** How to treat missing data points. @default TreatMissingData.NOT_BREACHING */
15
24
  treatMissingData?: TreatMissingData;
16
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">>;
17
31
  //# sourceMappingURL=alarm-config.d.ts.map
@@ -1 +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;AAEnE;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,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"}
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"}
@@ -1,5 +1,6 @@
1
1
  import { type Metric, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
2
  import type { AlarmDefinition } from "./alarm-definition.js";
3
+ import type { AlarmName } from "./alarm-name.js";
3
4
  /**
4
5
  * Fluent builder for constructing deferred {@link AlarmDefinition}s.
5
6
  *
@@ -13,6 +14,12 @@ export declare class AlarmDefinitionBuilder<TConstruct> {
13
14
  #private;
14
15
  constructor(key: string);
15
16
  metric(factory: (construct: TConstruct) => Metric): 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;
16
23
  threshold(value: number): this;
17
24
  greaterThan(): this;
18
25
  greaterThanOrEqual(): this;
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-definition-builder.d.ts","sourceRoot":"","sources":["../src/alarm-definition-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D;;;;;;;;GAQG;AACH,qBAAa,sBAAsB,CAAC,UAAU;;gBAUhC,GAAG,EAAE,MAAM;IAIvB,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI;IAKxD,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;CAuBhD"}
1
+ {"version":3,"file":"alarm-definition-builder.d.ts","sourceRoot":"","sources":["../src/alarm-definition-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,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,MAAM,GAAG,IAAI;IAKxD;;;;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"}
@@ -10,6 +10,7 @@ import { ComparisonOperator, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch
10
10
  */
11
11
  export class AlarmDefinitionBuilder {
12
12
  #key;
13
+ #alarmName;
13
14
  #metricFactory;
14
15
  #threshold = 0;
15
16
  #comparisonOperator = ComparisonOperator.GREATER_THAN_THRESHOLD;
@@ -24,6 +25,15 @@ export class AlarmDefinitionBuilder {
24
25
  this.#metricFactory = factory;
25
26
  return this;
26
27
  }
28
+ /**
29
+ * Sets an explicit CloudWatch alarm name. When unset, {@link createAlarms}
30
+ * derives a default from the stack name, builder id, and alarm key. Use
31
+ * the {@link alarmName} helper to construct branded values.
32
+ */
33
+ alarmName(name) {
34
+ this.#alarmName = name;
35
+ return this;
36
+ }
27
37
  threshold(value) {
28
38
  this.#threshold = value;
29
39
  return this;
@@ -72,6 +82,7 @@ export class AlarmDefinitionBuilder {
72
82
  }
73
83
  const definition = {
74
84
  key: this.#key,
85
+ alarmName: this.#alarmName,
75
86
  metric: this.#metricFactory(construct),
76
87
  threshold: this.#threshold,
77
88
  comparisonOperator: this.#comparisonOperator,
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-definition-builder.js","sourceRoot":"","sources":["../src/alarm-definition-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAe,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG/F;;;;;;;;GAQG;AACH,MAAM,OAAO,sBAAsB;IACxB,IAAI,CAAS;IACtB,cAAc,CAAqC;IACnD,UAAU,GAAG,CAAC,CAAC;IACf,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,CAAC;IAChE,kBAAkB,GAAG,CAAC,CAAC;IACvB,kBAAkB,GAAG,CAAC,CAAC;IACvB,iBAAiB,GAAG,gBAAgB,CAAC,aAAa,CAAC;IACnD,YAAY,GAAuD,EAAE,CAAC;IAEtE,YAAY,GAAW;QACrB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,OAA0C;QAC/C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW;QACT,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,kCAAkC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,mBAAmB,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe;QACb,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,+BAA+B,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CAAC,CAAS;QACzB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CAAC,CAAS;QACzB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAA2B;QAC1C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAAwD;QAClE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,SAAqB;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,CAAC,IAAI,6CAA6C,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAoB;YAClC,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;YACtC,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,kBAAkB,EAAE,IAAI,CAAC,mBAAmB;YAC5C,iBAAiB,EAAE,IAAI,CAAC,kBAAkB;YAC1C,iBAAiB,EAAE,IAAI,CAAC,kBAAkB;YAC1C,gBAAgB,EAAE,IAAI,CAAC,iBAAiB;YACxC,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,UAAU,CAAC,WAAW;YACpB,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QAE9F,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"alarm-definition-builder.js","sourceRoot":"","sources":["../src/alarm-definition-builder.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
1
  import type { ComparisonOperator, Metric, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { AlarmName } from "./alarm-name.js";
2
3
  /**
3
4
  * A fully-resolved alarm descriptor. All fields are required —
4
5
  * this is the canonical form consumed by {@link createAlarms}.
6
+ *
7
+ * `alarmName` is the only optional field: when omitted, {@link createAlarms}
8
+ * derives a default via `defaultAlarmName(scope, id, key)`.
5
9
  */
6
10
  export interface AlarmDefinition {
7
11
  key: string;
12
+ alarmName?: AlarmName;
8
13
  metric: Metric;
9
14
  threshold: number;
10
15
  comparisonOperator: ComparisonOperator;
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-definition.d.ts","sourceRoot":"","sources":["../src/alarm-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE/F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,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"}
1
+ {"version":3,"file":"alarm-definition.d.ts","sourceRoot":"","sources":["../src/alarm-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,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,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,47 @@
1
+ const VALID_CHARS = /^[A-Za-z0-9\-_./#:()+ =@]+$/;
2
+ const MAX_LEN = 255;
3
+ /**
4
+ * Validates and brands a string as an {@link AlarmName}. The string is used
5
+ * verbatim — no sanitisation — so what the caller writes is exactly what
6
+ * appears in CloudWatch.
7
+ *
8
+ * @throws If the input is empty, exceeds 255 chars, or contains characters
9
+ * outside CloudWatch's allowed set: `[A-Za-z0-9-_./#:()+ =@]`.
10
+ */
11
+ export function alarmName(input) {
12
+ const trimmed = input.trim();
13
+ if (trimmed.length === 0) {
14
+ throw new Error("alarm name cannot be empty");
15
+ }
16
+ if (trimmed.length > MAX_LEN) {
17
+ throw new Error(`alarm name exceeds ${String(MAX_LEN)} chars: "${trimmed}"`);
18
+ }
19
+ if (!VALID_CHARS.test(trimmed)) {
20
+ throw new Error(`alarm name contains invalid characters (allowed: A-Z a-z 0-9 - _ . / # : ( ) + = @ space): "${trimmed}"`);
21
+ }
22
+ return trimmed;
23
+ }
24
+ /**
25
+ * Builds an {@link AlarmName} by kebab-casing each segment and joining with
26
+ * `sep`. Empty segments after kebab-casing are dropped, so callers can pass
27
+ * e.g. `Stack.of(scope).stackName` without worrying about token-resolution
28
+ * artefacts.
29
+ */
30
+ export function joinAlarmName(segments, sep = "/") {
31
+ const parts = segments.map(kebab).filter((s) => s.length > 0);
32
+ return alarmName(parts.join(sep));
33
+ }
34
+ /**
35
+ * Lower-cases and hyphenates a string: splits camelCase / PascalCase /
36
+ * snake_case / dotted boundaries into hyphen-separated lowercase words.
37
+ */
38
+ export function kebab(input) {
39
+ return input
40
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
41
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
42
+ .replace(/[_\s.]+/g, "-")
43
+ .replace(/-+/g, "-")
44
+ .replace(/^-|-$/g, "")
45
+ .toLowerCase();
46
+ }
47
+ //# sourceMappingURL=alarm-name.js.map
@@ -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"}
@@ -4,10 +4,13 @@ import type { AlarmDefinition } from "./alarm-definition.js";
4
4
  /**
5
5
  * Creates CDK {@link Alarm} constructs from fully-resolved {@link AlarmDefinition}s.
6
6
  *
7
- * Validates that all definition keys are unique before creating alarms.
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}.
8
11
  *
9
12
  * @param scope - CDK construct scope.
10
- * @param id - Base identifier; each alarm ID is `${id}${Capitalize(key)}Alarm`.
13
+ * @param id - Base identifier; each alarm's construct id is `${id}${Capitalize(key)}Alarm`.
11
14
  * @param definitions - Fully-resolved alarm definitions.
12
15
  * @returns A record mapping each definition's key to its created Alarm.
13
16
  * @throws If duplicate keys are found in the definitions.
@@ -1 +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;AAM7D;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,eAAe,EAAE,GAC7B,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAqBvB"}
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"}
@@ -1,13 +1,17 @@
1
+ import { defaultAlarmName } from "./default-alarm-name.js";
1
2
  function capitalize(s) {
2
3
  return s[0].toUpperCase() + s.slice(1);
3
4
  }
4
5
  /**
5
6
  * Creates CDK {@link Alarm} constructs from fully-resolved {@link AlarmDefinition}s.
6
7
  *
7
- * Validates that all definition keys are unique before creating alarms.
8
+ * Validates that all definition keys are unique before creating alarms. Each
9
+ * alarm's `AlarmName` is taken verbatim from `def.alarmName` when supplied;
10
+ * otherwise it is derived from the scope, `id`, and `def.key` via
11
+ * {@link defaultAlarmName}.
8
12
  *
9
13
  * @param scope - CDK construct scope.
10
- * @param id - Base identifier; each alarm ID is `${id}${Capitalize(key)}Alarm`.
14
+ * @param id - Base identifier; each alarm's construct id is `${id}${Capitalize(key)}Alarm`.
11
15
  * @param definitions - Fully-resolved alarm definitions.
12
16
  * @returns A record mapping each definition's key to its created Alarm.
13
17
  * @throws If duplicate keys are found in the definitions.
@@ -20,6 +24,7 @@ export function createAlarms(scope, id, definitions) {
20
24
  `Disable the recommended alarm first, or use a different key.`);
21
25
  }
22
26
  alarms[def.key] = def.metric.createAlarm(scope, `${id}${capitalize(def.key)}Alarm`, {
27
+ alarmName: def.alarmName ?? defaultAlarmName(scope, id, def.key),
23
28
  threshold: def.threshold,
24
29
  evaluationPeriods: def.evaluationPeriods,
25
30
  datapointsToAlarm: def.datapointsToAlarm,
@@ -1 +1 @@
1
- {"version":3,"file":"create-alarms.js","sourceRoot":"","sources":["../src/create-alarms.ts"],"names":[],"mappings":"AAIA,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;GAUG;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;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"}
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,17 @@
1
+ import { Stack } from "aws-cdk-lib";
2
+ import { joinAlarmName } 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 function defaultAlarmName(scope, id, key) {
14
+ const stackName = Stack.of(scope).stackName;
15
+ return joinAlarmName([stackName, id, key]);
16
+ }
17
+ //# 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":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
- export type { AlarmConfig } from "./alarm-config.js";
1
+ export type { AlarmConfig, AlarmConfigDefaults } from "./alarm-config.js";
2
2
  export type { AlarmDefinition } from "./alarm-definition.js";
3
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";
4
6
  export { createAlarms } from "./create-alarms.js";
5
7
  export { resolveAlarmConfig, type ResolvedAlarmConfig } from "./resolve-alarm-config.js";
6
8
  export { alarmActionsPolicy } from "./policies/alarm-actions-policy.js";
7
- export type { AlarmActionsPolicyConfig, AlarmMatchContext, } 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";
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,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,GAClB,MAAM,oCAAoC,CAAC"}
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,MAAM,uBAAuB,CAAC;AAC7D,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"}
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  export { AlarmDefinitionBuilder } from "./alarm-definition-builder.js";
2
+ export { alarmName } from "./alarm-name.js";
3
+ export { defaultAlarmName } from "./default-alarm-name.js";
2
4
  export { createAlarms } from "./create-alarms.js";
3
5
  export { resolveAlarmConfig } from "./resolve-alarm-config.js";
4
6
  export { alarmActionsPolicy } from "./policies/alarm-actions-policy.js";
7
+ export { alarmNamePolicy, } from "./policies/alarm-name-policy.js";
5
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAA4B,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC"}
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"}
@@ -1,26 +1,7 @@
1
- import { CfnAlarm, CfnCompositeAlarm, type IAlarm, 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
- /**
4
- * Selects which alarms a rule applies to.
5
- *
6
- * - `string` — substring match against the alarm's `id` OR `path`.
7
- * - `RegExp` — tested against `path`.
8
- * - predicate — receives the full {@link AlarmMatchContext}.
9
- */
10
- export type AlarmMatcher = string | RegExp | ((ctx: AlarmMatchContext) => boolean);
11
- /**
12
- * Context passed to matcher predicates and derived for every visited alarm.
13
- *
14
- * `id` and `path` come from the L2 alarm when one is present, otherwise from
15
- * the L1 `CfnAlarm` / `CfnCompositeAlarm`.
16
- */
17
- export interface AlarmMatchContext {
18
- readonly alarm: IAlarm | undefined;
19
- readonly cfn: CfnAlarm | CfnCompositeAlarm;
20
- readonly id: string;
21
- readonly path: string;
22
- readonly isComposite: boolean;
23
- }
3
+ import { type AlarmRuleScope } from "./policy-matcher.js";
4
+ export type { AlarmMatchContext, AlarmMatcher } from "./policy-matcher.js";
24
5
  /** A set of actions, one array per alarm state. All arrays are optional. */
25
6
  export interface AlarmActionSet {
26
7
  alarmActions?: IAlarmAction[];
@@ -28,15 +9,9 @@ export interface AlarmActionSet {
28
9
  insufficientDataActions?: IAlarmAction[];
29
10
  }
30
11
  /** A rule: a matcher (or matchers) plus an action set, with optional scoping flags. */
31
- export interface AlarmActionRule extends AlarmActionSet {
32
- /** Matcher(s). A rule matches when **any** supplied matcher matches. */
33
- match: AlarmMatcher | AlarmMatcher[];
12
+ export interface AlarmActionRule extends AlarmActionSet, AlarmRuleScope {
34
13
  /** When this rule matches, suppress `defaults` for the alarm. */
35
14
  replaceDefaults?: boolean;
36
- /** Apply only to single (non-composite) alarms. */
37
- singleOnly?: boolean;
38
- /** Apply only to composite alarms. */
39
- compositeOnly?: boolean;
40
15
  }
41
16
  /** Configuration for {@link alarmActionsPolicy}. */
42
17
  export interface AlarmActionsPolicyConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-actions-policy.d.ts","sourceRoot":"","sources":["../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;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,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;IACrD,wEAAwE;IACxE,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;IACrC,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;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;AAyED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAkD5F"}
1
+ {"version":3,"file":"alarm-actions-policy.d.ts","sourceRoot":"","sources":["../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAGvE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAkD5F"}
@@ -1,5 +1,6 @@
1
1
  import { Aspects, Stack } from "aws-cdk-lib";
2
2
  import { CfnAlarm, CfnCompositeAlarm, } from "aws-cdk-lib/aws-cloudwatch";
3
+ import { ruleMatches } from "./policy-matcher.js";
3
4
  function isL2AlarmLike(node) {
4
5
  if (node === undefined)
5
6
  return false;
@@ -21,21 +22,6 @@ function isAlreadyConfigured(cfn) {
21
22
  return resolved.length > 0;
22
23
  return true;
23
24
  }
24
- function matchesOne(matcher, ctx) {
25
- if (typeof matcher === "function")
26
- return matcher(ctx);
27
- if (matcher instanceof RegExp)
28
- return matcher.test(ctx.path);
29
- return ctx.id.includes(matcher) || ctx.path.includes(matcher);
30
- }
31
- function ruleMatches(rule, ctx) {
32
- if (rule.singleOnly === true && ctx.isComposite)
33
- return false;
34
- if (rule.compositeOnly === true && !ctx.isComposite)
35
- return false;
36
- const matchers = Array.isArray(rule.match) ? rule.match : [rule.match];
37
- return matchers.some((m) => matchesOne(m, ctx));
38
- }
39
25
  function dedupe(items) {
40
26
  const seen = new Set();
41
27
  const result = [];
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-actions-policy.js","sourceRoot":"","sources":["../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alarm-actions-policy.js","sourceRoot":"","sources":["../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type IConstruct } from "constructs";
2
+ import { type AlarmName } from "../alarm-name.js";
3
+ import { type AlarmMatchContext, type AlarmRuleScope } from "./policy-matcher.js";
4
+ /** Context passed to {@link AlarmNameRule.transform}. */
5
+ export interface AlarmNameTransformContext extends AlarmMatchContext {
6
+ /**
7
+ * The alarm name as it stands at the moment this rule's transform runs:
8
+ * the original alarm name plus any prefix/suffix decorations contributed
9
+ * by `defaults` and earlier matched rules.
10
+ */
11
+ readonly currentName: string;
12
+ }
13
+ /**
14
+ * A rule for {@link alarmNamePolicy}. A rule matches when **any** supplied
15
+ * matcher matches.
16
+ *
17
+ * - `prefix` / `suffix` decorate the current name.
18
+ * - `transform` produces a new name from scratch and wins over `prefix`/`suffix`
19
+ * when both are set on the same rule.
20
+ * - Multiple matched rules layer in declaration order.
21
+ */
22
+ export interface AlarmNameRule extends AlarmRuleScope {
23
+ /** Prepended to the current name with the configured separator. */
24
+ prefix?: string;
25
+ /** Appended to the current name with the configured separator. */
26
+ suffix?: string;
27
+ /** Full transform — wins over `prefix`/`suffix` on the same rule. */
28
+ transform?: (ctx: AlarmNameTransformContext) => AlarmName;
29
+ /** When `true`, this rule's `prefix`/`suffix` replace `defaults` rather than layering on top. */
30
+ replaceDefaults?: boolean;
31
+ }
32
+ /** Configuration for {@link alarmNamePolicy}. */
33
+ export interface AlarmNamePolicyConfig {
34
+ /** Decorations applied to every alarm unless a matching rule sets `replaceDefaults: true`. */
35
+ defaults?: Pick<AlarmNameRule, "prefix" | "suffix">;
36
+ /** Ordered list of rules. All matching rules contribute. */
37
+ rules?: AlarmNameRule[];
38
+ /**
39
+ * Separator between prefix / current-name / suffix segments.
40
+ * @default "-"
41
+ */
42
+ separator?: string;
43
+ }
44
+ /**
45
+ * Decorates CloudWatch alarm names across an entire scope.
46
+ *
47
+ * Installs a CDK
48
+ * {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
49
+ * that fires during the synth prepare phase. For every `AWS::CloudWatch::Alarm`
50
+ * (and `AWS::CloudWatch::CompositeAlarm`) found beneath `scope`:
51
+ *
52
+ * 1. The alarm's existing name is read (set by the library default or the
53
+ * consumer's per-alarm override).
54
+ * 2. `defaults.prefix` / `defaults.suffix` decorate it, unless a matched
55
+ * rule sets `replaceDefaults: true`.
56
+ * 3. Each matching rule contributes in declaration order — `transform`
57
+ * replaces the current name; otherwise `prefix`/`suffix` decorate.
58
+ * 4. The final value is validated via {@link alarmName} and written back to
59
+ * `cfn.alarmName`.
60
+ *
61
+ * Use cases: stage prefixing (`prod-…`), severity tagging (`…-critical`),
62
+ * team scoping. Composes with per-alarm `alarmName` overrides — those run
63
+ * first, the policy decorates the result.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * alarmNamePolicy(app, {
68
+ * defaults: { prefix: "prod" },
69
+ * rules: [
70
+ * { match: /Errors$/, suffix: "critical" },
71
+ * { match: "throttles", suffix: "warning" },
72
+ * ],
73
+ * });
74
+ * ```
75
+ */
76
+ export declare function alarmNamePolicy(scope: IConstruct, config: AlarmNamePolicyConfig): void;
77
+ //# sourceMappingURL=alarm-name-policy.d.ts.map
@@ -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,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAE/F,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,97 @@
1
+ import { Aspects, Stack } from "aws-cdk-lib";
2
+ import { CfnAlarm, CfnCompositeAlarm } from "aws-cdk-lib/aws-cloudwatch";
3
+ import { alarmName as brandAlarmName } from "../alarm-name.js";
4
+ import { ruleMatches } from "./policy-matcher.js";
5
+ function decorate(current, prefix, suffix, sep) {
6
+ const parts = [];
7
+ if (prefix !== undefined && prefix.length > 0)
8
+ parts.push(prefix);
9
+ parts.push(current);
10
+ if (suffix !== undefined && suffix.length > 0)
11
+ parts.push(suffix);
12
+ return parts.join(sep);
13
+ }
14
+ function resolveAlarmName(cfn) {
15
+ const value = cfn.alarmName;
16
+ if (value === undefined)
17
+ return undefined;
18
+ const resolved = Stack.of(cfn).resolve(value);
19
+ return typeof resolved === "string" ? resolved : undefined;
20
+ }
21
+ /**
22
+ * Decorates CloudWatch alarm names across an entire scope.
23
+ *
24
+ * Installs a CDK
25
+ * {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
26
+ * that fires during the synth prepare phase. For every `AWS::CloudWatch::Alarm`
27
+ * (and `AWS::CloudWatch::CompositeAlarm`) found beneath `scope`:
28
+ *
29
+ * 1. The alarm's existing name is read (set by the library default or the
30
+ * consumer's per-alarm override).
31
+ * 2. `defaults.prefix` / `defaults.suffix` decorate it, unless a matched
32
+ * rule sets `replaceDefaults: true`.
33
+ * 3. Each matching rule contributes in declaration order — `transform`
34
+ * replaces the current name; otherwise `prefix`/`suffix` decorate.
35
+ * 4. The final value is validated via {@link alarmName} and written back to
36
+ * `cfn.alarmName`.
37
+ *
38
+ * Use cases: stage prefixing (`prod-…`), severity tagging (`…-critical`),
39
+ * team scoping. Composes with per-alarm `alarmName` overrides — those run
40
+ * first, the policy decorates the result.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * alarmNamePolicy(app, {
45
+ * defaults: { prefix: "prod" },
46
+ * rules: [
47
+ * { match: /Errors$/, suffix: "critical" },
48
+ * { match: "throttles", suffix: "warning" },
49
+ * ],
50
+ * });
51
+ * ```
52
+ */
53
+ export function alarmNamePolicy(scope, config) {
54
+ const { defaults, rules = [], separator = "-" } = config;
55
+ const processed = new WeakSet();
56
+ Aspects.of(scope).add({
57
+ visit(node) {
58
+ const isAlarm = CfnAlarm.isCfnAlarm(node);
59
+ const isComposite = CfnCompositeAlarm.isCfnCompositeAlarm(node);
60
+ if (!isAlarm && !isComposite)
61
+ return;
62
+ const cfn = node;
63
+ if (processed.has(cfn))
64
+ return;
65
+ const original = resolveAlarmName(cfn);
66
+ if (original === undefined)
67
+ return;
68
+ const parent = cfn.node.scope;
69
+ const ctx = {
70
+ alarm: undefined,
71
+ cfn,
72
+ id: parent?.node.id ?? cfn.node.id,
73
+ path: parent?.node.path ?? cfn.node.path,
74
+ isComposite,
75
+ };
76
+ const matched = rules.filter((r) => ruleMatches(r, ctx));
77
+ const replaceDefaults = matched.some((r) => r.replaceDefaults === true);
78
+ let current = original;
79
+ if (defaults !== undefined && !replaceDefaults) {
80
+ current = decorate(current, defaults.prefix, defaults.suffix, separator);
81
+ }
82
+ for (const rule of matched) {
83
+ if (rule.transform !== undefined) {
84
+ current = rule.transform({ ...ctx, currentName: current });
85
+ continue;
86
+ }
87
+ current = decorate(current, rule.prefix, rule.suffix, separator);
88
+ }
89
+ if (current === original)
90
+ return;
91
+ const validated = brandAlarmName(current);
92
+ cfn.alarmName = validated;
93
+ processed.add(cfn);
94
+ },
95
+ });
96
+ }
97
+ //# 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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"}
@@ -0,0 +1,31 @@
1
+ import type { CfnAlarm, CfnCompositeAlarm, IAlarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ /**
3
+ * Selects which alarms a rule applies to.
4
+ *
5
+ * - `string` — substring match against the alarm's `id` OR `path`.
6
+ * - `RegExp` — tested against `path`.
7
+ * - predicate — receives the full {@link AlarmMatchContext}.
8
+ */
9
+ export type AlarmMatcher = string | RegExp | ((ctx: AlarmMatchContext) => boolean);
10
+ /**
11
+ * Context passed to matcher predicates and derived for every visited alarm.
12
+ *
13
+ * `id` and `path` come from the L2 alarm when one is present, otherwise from
14
+ * the L1 `CfnAlarm` / `CfnCompositeAlarm`.
15
+ */
16
+ export interface AlarmMatchContext {
17
+ readonly alarm: IAlarm | undefined;
18
+ readonly cfn: CfnAlarm | CfnCompositeAlarm;
19
+ readonly id: string;
20
+ readonly path: string;
21
+ readonly isComposite: boolean;
22
+ }
23
+ /** Common scoping flags shared by every alarm-policy rule shape. */
24
+ export interface AlarmRuleScope {
25
+ match: AlarmMatcher | AlarmMatcher[];
26
+ singleOnly?: boolean;
27
+ compositeOnly?: boolean;
28
+ }
29
+ export declare function matchesOne(matcher: AlarmMatcher, ctx: AlarmMatchContext): boolean;
30
+ export declare function ruleMatches(rule: AlarmRuleScope, ctx: AlarmMatchContext): boolean;
31
+ //# sourceMappingURL=policy-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-matcher.d.ts","sourceRoot":"","sources":["../../src/policies/policy-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEtF;;;;;;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,16 @@
1
+ export function matchesOne(matcher, ctx) {
2
+ if (typeof matcher === "function")
3
+ return matcher(ctx);
4
+ if (matcher instanceof RegExp)
5
+ return matcher.test(ctx.path);
6
+ return ctx.id.includes(matcher) || ctx.path.includes(matcher);
7
+ }
8
+ export function ruleMatches(rule, ctx) {
9
+ if (rule.singleOnly === true && ctx.isComposite)
10
+ return false;
11
+ if (rule.compositeOnly === true && !ctx.isComposite)
12
+ return false;
13
+ const matchers = Array.isArray(rule.match) ? rule.match : [rule.match];
14
+ return matchers.some((m) => matchesOne(m, ctx));
15
+ }
16
+ //# sourceMappingURL=policy-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-matcher.js","sourceRoot":"","sources":["../../src/policies/policy-matcher.ts"],"names":[],"mappings":"AAgCA,MAAM,UAAU,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,MAAM,UAAU,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"}
@@ -1,11 +1,16 @@
1
1
  import type { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
2
- import type { AlarmConfig } from "./alarm-config.js";
2
+ import type { AlarmConfig, AlarmConfigDefaults } from "./alarm-config.js";
3
+ import type { AlarmName } from "./alarm-name.js";
3
4
  /**
4
- * A fully-resolved alarm configuration where every field is required.
5
- * Produced by {@link resolveAlarmConfig} after merging user overrides
6
- * onto defaults.
5
+ * A fully-resolved alarm configuration. Every numeric/enum field is required;
6
+ * `alarmName` is carried through verbatim from user config (or `undefined`
7
+ * when the consumer is happy with the library default).
8
+ *
9
+ * Produced by {@link resolveAlarmConfig} after merging user overrides onto
10
+ * defaults.
7
11
  */
8
12
  export interface ResolvedAlarmConfig {
13
+ alarmName?: AlarmName;
9
14
  threshold: number;
10
15
  evaluationPeriods: number;
11
16
  datapointsToAlarm: number;
@@ -13,7 +18,8 @@ export interface ResolvedAlarmConfig {
13
18
  }
14
19
  /**
15
20
  * Resolves an absolute-threshold alarm config by layering user overrides
16
- * onto the defaults.
21
+ * onto the defaults. `alarmName` is propagated from user config only;
22
+ * defaults intentionally do not specify a name.
17
23
  */
18
- export declare function resolveAlarmConfig(userConfig: AlarmConfig | undefined, defaults: Required<AlarmConfig>): ResolvedAlarmConfig;
24
+ export declare function resolveAlarmConfig(userConfig: AlarmConfig | undefined, defaults: AlarmConfigDefaults): ResolvedAlarmConfig;
19
25
  //# sourceMappingURL=resolve-alarm-config.d.ts.map
@@ -1 +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,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC9B,mBAAmB,CAOrB"}
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"}
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * Resolves an absolute-threshold alarm config by layering user overrides
3
- * onto the defaults.
3
+ * onto the defaults. `alarmName` is propagated from user config only;
4
+ * defaults intentionally do not specify a name.
4
5
  */
5
6
  export function resolveAlarmConfig(userConfig, defaults) {
6
7
  return {
8
+ alarmName: userConfig?.alarmName,
7
9
  threshold: userConfig?.threshold ?? defaults.threshold,
8
10
  evaluationPeriods: userConfig?.evaluationPeriods ?? defaults.evaluationPeriods,
9
11
  datapointsToAlarm: userConfig?.datapointsToAlarm ?? defaults.datapointsToAlarm,
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-alarm-config.js","sourceRoot":"","sources":["../src/resolve-alarm-config.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAmC,EACnC,QAA+B;IAE/B,OAAO;QACL,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"}
1
+ {"version":3,"file":"resolve-alarm-config.js","sourceRoot":"","sources":["../src/resolve-alarm-config.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,UAAU,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@composurecdk/cloudwatch",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "description": "Composable CloudWatch alarm primitives for composureCDK resource packages",
5
5
  "repository": {
6
6
  "type": "git",