@liflig/cdk 3.18.1 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,22 +13,23 @@ are not yet resolved. Some relevant information:
13
13
 
14
14
  - <https://github.com/aws/aws-cdk-rfcs/blob/master/text/0006-monolothic-packaging.md>
15
15
 
16
- ## Pre-commit checklist
16
+ ## Development
17
17
 
18
- 1. Lint code
18
+ Project commands are defined using `Make`. Examples:
19
19
 
20
- ```bash
21
- npm run lint
22
- ```
23
-
24
- 1. Run tests and update snapshots
20
+ ```sh
21
+ # Primary commands
22
+ $ make # runs '$ make build'
23
+ $ make build # build project, apply lint and formatting fixes, update snapshots
24
+ $ make verify # verify project, ensure lint, formatting and snapshots are up-to-date
25
25
 
26
- ```bash
27
- npm run snapshots
28
- npm run test -- -u
29
- ```
26
+ # Misc commands
27
+ $ make lint # lint code
28
+ $ make fmt # reformat code
29
+ $ make snapshots # regenerate snapshots
30
+ ```
30
31
 
31
- Investigate any changes before committing.
32
+ For a complete list of commands, refer to the `Makefile`.
32
33
 
33
34
  ## Testing library changes before releasing
34
35
 
@@ -14,6 +14,7 @@ secrets_manager = boto3.client("secretsmanager")
14
14
  ACCOUNT_FRIENDLY_NAME = os.getenv("ACCOUNT_FRIENDLY_NAME", None)
15
15
  SLACK_URL_SECRET_NAME = os.getenv("SLACK_URL_SECRET_NAME", None)
16
16
  NOTIFICATION_LEVEL = os.getenv("NOTIFICATION_LEVEL", "WARN")
17
+ SLACK_MENTIONS = os.getenv("SLACK_MENTIONS", None)
17
18
 
18
19
  # Example event:
19
20
  #
@@ -260,6 +261,9 @@ def handler(event, context):
260
261
  for s in [f"*Execution:* <{execution_url}|{execution_id}>", text_for_failed]
261
262
  if s
262
263
  )
264
+
265
+ mentions_str = SLACK_MENTIONS if state == "FAILED" and not previous_failed else ""
266
+
263
267
  pretext = " ".join(
264
268
  s
265
269
  for s in [
@@ -269,6 +273,11 @@ def handler(event, context):
269
273
  ]
270
274
  if s
271
275
  )
276
+
277
+ # Add mentions to pretext
278
+ if mentions_str:
279
+ pretext = f"{pretext} {mentions_str}"
280
+
272
281
  fallback = f"Pipeline {pipeline_name} {state}"
273
282
  attachments = [
274
283
  {
@@ -1,5 +1,5 @@
1
1
  export type { LifligCdkPipelineProps } from "./liflig-cdk-pipeline";
2
2
  export { LifligCdkPipeline } from "./liflig-cdk-pipeline";
3
3
  export type { SlackNotificationProps } from "./slack-notification";
4
- export { SlackNotification } from "./slack-notification";
4
+ export { SlackMention, SlackNotification } from "./slack-notification";
5
5
  export { getVariable } from "./variables";
@@ -1,4 +1,4 @@
1
1
  export { LifligCdkPipeline } from "./liflig-cdk-pipeline";
2
- export { SlackNotification } from "./slack-notification";
2
+ export { SlackMention, SlackNotification } from "./slack-notification";
3
3
  export { getVariable } from "./variables";
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2RrLXBpcGVsaW5lcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBMaWZsaWdDZGtQaXBlbGluZVByb3BzIH0gZnJvbSBcIi4vbGlmbGlnLWNkay1waXBlbGluZVwiXG5leHBvcnQgeyBMaWZsaWdDZGtQaXBlbGluZSB9IGZyb20gXCIuL2xpZmxpZy1jZGstcGlwZWxpbmVcIlxuZXhwb3J0IHR5cGUgeyBTbGFja05vdGlmaWNhdGlvblByb3BzIH0gZnJvbSBcIi4vc2xhY2stbm90aWZpY2F0aW9uXCJcbmV4cG9ydCB7IFNsYWNrTm90aWZpY2F0aW9uIH0gZnJvbSBcIi4vc2xhY2stbm90aWZpY2F0aW9uXCJcbmV4cG9ydCB7IGdldFZhcmlhYmxlIH0gZnJvbSBcIi4vdmFyaWFibGVzXCJcbiJdfQ==
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2RrLXBpcGVsaW5lcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgTGlmbGlnQ2RrUGlwZWxpbmVQcm9wcyB9IGZyb20gXCIuL2xpZmxpZy1jZGstcGlwZWxpbmVcIlxuZXhwb3J0IHsgTGlmbGlnQ2RrUGlwZWxpbmUgfSBmcm9tIFwiLi9saWZsaWctY2RrLXBpcGVsaW5lXCJcbmV4cG9ydCB0eXBlIHsgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyB9IGZyb20gXCIuL3NsYWNrLW5vdGlmaWNhdGlvblwiXG5leHBvcnQgeyBTbGFja01lbnRpb24sIFNsYWNrTm90aWZpY2F0aW9uIH0gZnJvbSBcIi4vc2xhY2stbm90aWZpY2F0aW9uXCJcbmV4cG9ydCB7IGdldFZhcmlhYmxlIH0gZnJvbSBcIi4vdmFyaWFibGVzXCJcbiJdfQ==
@@ -41,6 +41,12 @@ export interface SlackNotificationProps {
41
41
  * @default - the Lambda function can read all objects in the artifacts bucket.
42
42
  */
43
43
  triggerObjectKey?: string;
44
+ /**
45
+ * Slack mentions to include in failure notifications (only on new failures, not repeated ones).
46
+ * Use special mentions (@here, @channel, @everyone) or user/group IDs (e.g., 'U1234567890', 'S9876543210').
47
+ * @default - none
48
+ */
49
+ mentions?: string[];
44
50
  }
45
51
  /**
46
52
  * Monitor a CodePipeline and send message to Slack on failure
@@ -49,3 +55,39 @@ export interface SlackNotificationProps {
49
55
  export declare class SlackNotification extends constructs.Construct {
50
56
  constructor(scope: constructs.Construct, id: string, props: SlackNotificationProps);
51
57
  }
58
+ /**
59
+ * Slack mention formatter with validation per Slack API format:
60
+ * https://docs.slack.dev/messaging/formatting-message-text/
61
+ *
62
+ * Supported mention types:
63
+ * - Special mentions: @here, @channel, @everyone
64
+ * - User IDs: U or W prefix + alphanumeric (e.g., U024BE7LH, W024BE7LH)
65
+ * - User group IDs: S prefix + alphanumeric (e.g., SAZ94GDB8)
66
+ *
67
+ * Usage:
68
+ * SlackMention.format(['@here', 'U024BE7LH', 'SAZ94GDB8'])
69
+ */
70
+ export declare class SlackMention {
71
+ private static readonly SPECIAL_MENTIONS;
72
+ private static readonly USER_PATTERN;
73
+ private static readonly USER_GROUP_PATTERN;
74
+ /**
75
+ * Format an array of mentions into a single Slack-formatted string.
76
+ * @param mentions Array of mention strings
77
+ */
78
+ static format(mentions: string[]): string;
79
+ /**
80
+ * Format a mention string for Slack API message format.
81
+ * Validates format and converts to proper Slack markup:
82
+ * '@here' -> '<!here>'
83
+ * 'U1234567890' -> '<@U1234567890>'
84
+ * 'S1234567890' -> '<!subteam^S1234567890>'
85
+ *
86
+ * @param mention Mention string (e.g., '@here', 'U1234567890', 'S1234567890')
87
+ * @throws if mention format is invalid
88
+ */
89
+ static formatMention(mention: string): string;
90
+ private static formatSpecialMention;
91
+ private static formatUser;
92
+ private static formatUserGroup;
93
+ }
@@ -21,6 +21,9 @@ export class SlackNotification extends constructs.Construct {
21
21
  if (props.accountFriendlyName != null) {
22
22
  environment.ACCOUNT_FRIENDLY_NAME = props.accountFriendlyName;
23
23
  }
24
+ if (props.mentions != null && props.mentions.length > 0) {
25
+ environment.SLACK_MENTIONS = SlackMention.format(props.mentions);
26
+ }
24
27
  const reportFunction = new lambda.Function(this, "Function", {
25
28
  code: lambda.Code.fromAsset(path.join(__dirname, "../../assets/pipeline-slack-notification-lambda")),
26
29
  handler: "index.handler",
@@ -49,4 +52,73 @@ export class SlackNotification extends constructs.Construct {
49
52
  });
50
53
  }
51
54
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvc2xhY2stbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFFbEMsT0FBTyxLQUFLLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMvRCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFBO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFHaEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFFeEMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQTJDMUM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3pELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZCO1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxXQUFXLEdBQTJCO1lBQzFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVO1lBQzdELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxNQUFNO1NBQ3RELENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QyxXQUFXLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFBO1FBQy9ELENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUMzRCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlEQUFpRCxDQUFDLENBQ3hFO1lBQ0QsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFdBQVc7WUFDWCxXQUFXLEVBQ1QsK0RBQStEO1NBQ2xFLENBQUMsQ0FBQTtRQUVGLGNBQWMsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQ2hELElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUU7Z0JBQ1AsbUNBQW1DO2dCQUNuQyxxQ0FBcUM7YUFDdEM7WUFDRCxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztTQUN4QyxDQUFDLENBQ0gsQ0FBQTtRQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFckQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBRXZFLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUU7WUFDekMsWUFBWSxFQUFFO2dCQUNaLE1BQU0sRUFBRTtvQkFDTiwwSEFBMEg7b0JBQzFILEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQztpQkFDeEQ7YUFDRjtZQUNELE1BQU0sRUFBRSxJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDO1NBQ3pELENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHR5cGUgKiBhcyBjb2RlcGlwZWxpbmUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmVcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBzMyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCJcbmltcG9ydCB0eXBlICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBDb2RlUGlwZWxpbmUgdG8gbW9uaXRvci5cbiAgICovXG4gIHBpcGVsaW5lOiBjb2RlcGlwZWxpbmUuSVBpcGVsaW5lXG4gIC8qKlxuICAgKiBBcnRpZmFjdHMgYnVja2V0IHVzZWQgYnkgcGlwZWxpbmVcbiAgICovXG4gIGFydGlmYWN0c0J1Y2tldDogczMuSUJ1Y2tldFxuICAvKipcbiAgICogQSBwbGFpbnRleHQgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIFVSTCBvZiBhIFNsYWNrIGluY29taW5nIHdlYmhvb2suXG4gICAqIFRoZSB3ZWJob29rIHNob3VsZCBiZSBjcmVhdGVkIHRocm91Z2ggYSBTbGFjayBhcHAsIGFuZCBvbmx5IGFsbG93cyBwb3N0aW5nIHRvIG9uZSBzcGVjaWZpYyBTbGFjayBjaGFubmVsLlxuICAgKiBTZWUgU2xhY2sncyBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIChlLmcuLCBodHRwczovL2FwaS5zbGFjay5jb20vbWVzc2FnaW5nL3dlYmhvb2tzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBOT1RFOiBJbmNvbWluZyB3ZWJob29rcyBjcmVhdGVkIHRocm91Z2ggbGVnYWN5IGN1c3RvbSBpbnRlZ3JhdGlvbnMgaW4gU2xhY2sgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICBzbGFja1dlYmhvb2tVcmxTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXRcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZyaWVuZGx5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIFNsYWNrIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiB0aGUgQVdTIGFjY291bnQgSURcbiAgICovXG4gIGFjY291bnRGcmllbmRseU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGFtb3VudCBhbmQgdHlwZXMgb2Ygbm90aWZpY2F0aW9ucyBiZWluZyBzZW50IHRvIFNsYWNrLlxuICAgKiBcIldBUk5cIiBpcyB0aGUgbGVhc3QgdmVyYm9zZSwgd2hpbGUgXCJERUJVR1wiIGlzIHRoZSBtb3N0IHZlcmJvc2UuXG4gICAqXG4gICAqIFwiV0FSTlwiIC0gSW5jbHVkZXMgbm90aWZpY2F0aW9ucyByZWxhdGVkIHRvIHRoZSBmYWlsdXJlIG9mIGEgcGlwZWxpbmUgZXhlY3V0aW9uLlxuICAgKiBcIklORk9cIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN1Y2Nlc3Mgb2YgYSBwaXBlbGluZSBleGVjdXRpb24uXG4gICAqIFwiREVCVUdcIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN0YXJ0IGFuZCBzdXBlcnNlZGluZyBvZiBhIHBpcGVsaW5lIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJXQVJOXCJcbiAgICovXG4gIG5vdGlmaWNhdGlvbkxldmVsPzogXCJXQVJOXCIgfCBcIklORk9cIiB8IFwiREVCVUdcIlxuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgb2JqZWN0IChlLmcuLCBgbXktcHJlZml4L215LWZpbGUuanNvbmApIHRoYXQgdHJpZ2dlcnMgdGhlIFMzIFNvdXJjZSBBY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXBlbGluZS5cbiAgICogQnkgY29uZmlndXJpbmcgdGhpcyBwYXJhbWV0ZXIgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIG9iamVjdHMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IHNlbmRzIG1lc3NhZ2VzIHRvIFNsYWNrIGNhbiBhY2Nlc3MgaW4gdGhlIGFydGlmYWN0cyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIExhbWJkYSBmdW5jdGlvbiBjYW4gcmVhZCBhbGwgb2JqZWN0cyBpbiB0aGUgYXJ0aWZhY3RzIGJ1Y2tldC5cbiAgICovXG4gIHRyaWdnZXJPYmplY3RLZXk/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBNb25pdG9yIGEgQ29kZVBpcGVsaW5lIGFuZCBzZW5kIG1lc3NhZ2UgdG8gU2xhY2sgb24gZmFpbHVyZVxuICogYW5kIHNvbWUgc3VjY2VlZGVkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsYWNrTm90aWZpY2F0aW9uIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogU2xhY2tOb3RpZmljYXRpb25Qcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBTTEFDS19VUkxfU0VDUkVUX05BTUU6IHByb3BzLnNsYWNrV2ViaG9va1VybFNlY3JldC5zZWNyZXROYW1lLFxuICAgICAgTk9USUZJQ0FUSU9OX0xFVkVMOiBwcm9wcy5ub3RpZmljYXRpb25MZXZlbCA/PyBcIldBUk5cIixcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWNjb3VudEZyaWVuZGx5TmFtZSAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5BQ0NPVU5UX0ZSSUVORExZX05BTUUgPSBwcm9wcy5hY2NvdW50RnJpZW5kbHlOYW1lXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiRnVuY3Rpb25cIiwge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9waXBlbGluZS1zbGFjay1ub3RpZmljYXRpb24tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTMsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhhbmRsZSBDb2RlUGlwZWxpbmUgcGlwZWxpbmUgc3RhdGUgY2hhbmdlIGFuZCByZXBvcnQgdG8gU2xhY2tcIixcbiAgICB9KVxuXG4gICAgcmVwb3J0RnVuY3Rpb24uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImNvZGVwaXBlbGluZTpMaXN0QWN0aW9uRXhlY3V0aW9uc1wiLFxuICAgICAgICAgIFwiY29kZXBpcGVsaW5lOkxpc3RQaXBlbGluZUV4ZWN1dGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucGlwZWxpbmUucGlwZWxpbmVBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LmdyYW50UmVhZChyZXBvcnRGdW5jdGlvbilcblxuICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldC5ncmFudFJlYWQocmVwb3J0RnVuY3Rpb24sIHByb3BzLnRyaWdnZXJPYmplY3RLZXkpXG5cbiAgICBwcm9wcy5waXBlbGluZS5vblN0YXRlQ2hhbmdlKGBFdmVudCR7aWR9YCwge1xuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIC8vIEF2YWlsYWJsZSBzdGF0ZXM6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlcGlwZWxpbmUvbGF0ZXN0L3VzZXJndWlkZS9kZXRlY3Qtc3RhdGUtY2hhbmdlcy1jbG91ZHdhdGNoLWV2ZW50cy5odG1sXG4gICAgICAgICAgc3RhdGU6IFtcIlNVQ0NFRURFRFwiLCBcIkZBSUxFRFwiLCBcIlNUQVJURURcIiwgXCJTVVBFUlNFREVEXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhcmdldDogbmV3IGV2ZW50c1RhcmdldHMuTGFtYmRhRnVuY3Rpb24ocmVwb3J0RnVuY3Rpb24pLFxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
55
+ /**
56
+ * Slack mention formatter with validation per Slack API format:
57
+ * https://docs.slack.dev/messaging/formatting-message-text/
58
+ *
59
+ * Supported mention types:
60
+ * - Special mentions: @here, @channel, @everyone
61
+ * - User IDs: U or W prefix + alphanumeric (e.g., U024BE7LH, W024BE7LH)
62
+ * - User group IDs: S prefix + alphanumeric (e.g., SAZ94GDB8)
63
+ *
64
+ * Usage:
65
+ * SlackMention.format(['@here', 'U024BE7LH', 'SAZ94GDB8'])
66
+ */
67
+ export class SlackMention {
68
+ static SPECIAL_MENTIONS = [
69
+ "@here",
70
+ "@channel",
71
+ "@everyone",
72
+ ];
73
+ // Note: Slack doesn't specify length constraints for these identifiers, leaving them unbounded
74
+ static USER_PATTERN = /^[UW][A-Z0-9]+$/;
75
+ static USER_GROUP_PATTERN = /^S[A-Z0-9]+$/;
76
+ /**
77
+ * Format an array of mentions into a single Slack-formatted string.
78
+ * @param mentions Array of mention strings
79
+ */
80
+ static format(mentions) {
81
+ return mentions.map((m) => SlackMention.formatMention(m)).join(" ");
82
+ }
83
+ /**
84
+ * Format a mention string for Slack API message format.
85
+ * Validates format and converts to proper Slack markup:
86
+ * '@here' -> '<!here>'
87
+ * 'U1234567890' -> '<@U1234567890>'
88
+ * 'S1234567890' -> '<!subteam^S1234567890>'
89
+ *
90
+ * @param mention Mention string (e.g., '@here', 'U1234567890', 'S1234567890')
91
+ * @throws if mention format is invalid
92
+ */
93
+ static formatMention(mention) {
94
+ if (mention.startsWith("@")) {
95
+ return SlackMention.formatSpecialMention(mention);
96
+ }
97
+ if (mention.startsWith("U") || mention.startsWith("W")) {
98
+ return SlackMention.formatUser(mention);
99
+ }
100
+ if (mention.startsWith("S")) {
101
+ return SlackMention.formatUserGroup(mention);
102
+ }
103
+ throw new Error(`Unknown Slack mention format: ${mention}`);
104
+ }
105
+ static formatSpecialMention(mention) {
106
+ if (!SlackMention.SPECIAL_MENTIONS.includes(mention)) {
107
+ throw new Error(`Invalid special mention: ${mention}`);
108
+ }
109
+ return `<!${mention.substring(1)}>`;
110
+ }
111
+ static formatUser(mention) {
112
+ if (!SlackMention.USER_PATTERN.test(mention)) {
113
+ throw new Error(`Invalid user ID: ${mention}`);
114
+ }
115
+ return `<@${mention}>`;
116
+ }
117
+ static formatUserGroup(mention) {
118
+ if (!SlackMention.USER_GROUP_PATTERN.test(mention)) {
119
+ throw new Error(`Invalid user group ID: ${mention}`);
120
+ }
121
+ return `<!subteam^${mention}>`;
122
+ }
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvc2xhY2stbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFFbEMsT0FBTyxLQUFLLGFBQWEsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMvRCxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFBO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFHaEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFFeEMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQWlEMUM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3pELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZCO1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxXQUFXLEdBQTJCO1lBQzFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVO1lBQzdELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxNQUFNO1NBQ3RELENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QyxXQUFXLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFBO1FBQy9ELENBQUM7UUFFRCxJ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QUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsT0FBZTtRQUNqRCxJQUNFLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FDckMsT0FBNkMsQ0FDOUMsRUFDRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBQ0QsT0FBTyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtJQUNyQyxDQUFDO0lBRU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFlO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDaEQsQ0FBQztRQUNELE9BQU8sS0FBSyxPQUFPLEdBQUcsQ0FBQTtJQUN4QixDQUFDO0lBRU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFlO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBQ0QsT0FBTyxhQUFhLE9BQU8sR0FBRyxDQUFBO0lBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB0eXBlICogYXMgY29kZXBpcGVsaW5lIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lXCJcbmltcG9ydCAqIGFzIGV2ZW50c1RhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB0eXBlICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgdHlwZSAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIlxuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5cbmNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKVxuXG5leHBvcnQgaW50ZXJmYWNlIFNsYWNrTm90aWZpY2F0aW9uUHJvcHMge1xuICAvKipcbiAgICogQ29kZVBpcGVsaW5lIHRvIG1vbml0b3IuXG4gICAqL1xuICBwaXBlbGluZTogY29kZXBpcGVsaW5lLklQaXBlbGluZVxuICAvKipcbiAgICogQXJ0aWZhY3RzIGJ1Y2tldCB1c2VkIGJ5IHBpcGVsaW5lXG4gICAqL1xuICBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXRcbiAgLyoqXG4gICAqIEEgcGxhaW50ZXh0IHNlY3JldCBjb250YWluaW5nIHRoZSBVUkwgb2YgYSBTbGFjayBpbmNvbWluZyB3ZWJob29rLlxuICAgKiBUaGUgd2ViaG9vayBzaG91bGQgYmUgY3JlYXRlZCB0aHJvdWdoIGEgU2xhY2sgYXBwLCBhbmQgb25seSBhbGxvd3MgcG9zdGluZyB0byBvbmUgc3BlY2lmaWMgU2xhY2sgY2hhbm5lbC5cbiAgICogU2VlIFNsYWNrJ3Mgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiAoZS5nLiwgaHR0cHM6Ly9hcGkuc2xhY2suY29tL21lc3NhZ2luZy93ZWJob29rcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogTk9URTogSW5jb21pbmcgd2ViaG9va3MgY3JlYXRlZCB0aHJvdWdoIGxlZ2FjeSBjdXN0b20gaW50ZWdyYXRpb25zIGluIFNsYWNrIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgKi9cbiAgc2xhY2tXZWJob29rVXJsU2VjcmV0OiBzZWNyZXRzbWFuYWdlci5JU2VjcmV0XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBmcmllbmRseSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBTbGFjayBub3RpZmljYXRpb25zIGluc3RlYWQgb2YgdGhlIEFXUyBhY2NvdW50IElEXG4gICAqL1xuICBhY2NvdW50RnJpZW5kbHlOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBDb250cm9sIHRoZSBhbW91bnQgYW5kIHR5cGVzIG9mIG5vdGlmaWNhdGlvbnMgYmVpbmcgc2VudCB0byBTbGFjay5cbiAgICogXCJXQVJOXCIgaXMgdGhlIGxlYXN0IHZlcmJvc2UsIHdoaWxlIFwiREVCVUdcIiBpcyB0aGUgbW9zdCB2ZXJib3NlLlxuICAgKlxuICAgKiBcIldBUk5cIiAtIEluY2x1ZGVzIG5vdGlmaWNhdGlvbnMgcmVsYXRlZCB0byB0aGUgZmFpbHVyZSBvZiBhIHBpcGVsaW5lIGV4ZWN1dGlvbi5cbiAgICogXCJJTkZPXCIgLSBBZGRzIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzdWNjZXNzIG9mIGEgcGlwZWxpbmUgZXhlY3V0aW9uLlxuICAgKiBcIkRFQlVHXCIgLSBBZGRzIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzdGFydCBhbmQgc3VwZXJzZWRpbmcgb2YgYSBwaXBlbGluZSBleGVjdXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiV0FSTlwiXG4gICAqL1xuICBub3RpZmljYXRpb25MZXZlbD86IFwiV0FSTlwiIHwgXCJJTkZPXCIgfCBcIkRFQlVHXCJcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIG9iamVjdCAoZS5nLiwgYG15LXByZWZpeC9teS1maWxlLmpzb25gKSB0aGF0IHRyaWdnZXJzIHRoZSBTMyBTb3VyY2UgQWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmUuXG4gICAqIEJ5IGNvbmZpZ3VyaW5nIHRoaXMgcGFyYW1ldGVyIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBvYmplY3RzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBzZW5kcyBtZXNzYWdlcyB0byBTbGFjayBjYW4gYWNjZXNzIGluIHRoZSBhcnRpZmFjdHMgYnVja2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBMYW1iZGEgZnVuY3Rpb24gY2FuIHJlYWQgYWxsIG9iamVjdHMgaW4gdGhlIGFydGlmYWN0cyBidWNrZXQuXG4gICAqL1xuICB0cmlnZ2VyT2JqZWN0S2V5Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBTbGFjayBtZW50aW9ucyB0byBpbmNsdWRlIGluIGZhaWx1cmUgbm90aWZpY2F0aW9ucyAob25seSBvbiBuZXcgZmFpbHVyZXMsIG5vdCByZXBlYXRlZCBvbmVzKS5cbiAgICogVXNlIHNwZWNpYWwgbWVudGlvbnMgKEBoZXJlLCBAY2hhbm5lbCwgQGV2ZXJ5b25lKSBvciB1c2VyL2dyb3VwIElEcyAoZS5nLiwgJ1UxMjM0NTY3ODkwJywgJ1M5ODc2NTQzMjEwJykuXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgbWVudGlvbnM/OiBzdHJpbmdbXVxufVxuXG4vKipcbiAqIE1vbml0b3IgYSBDb2RlUGlwZWxpbmUgYW5kIHNlbmQgbWVzc2FnZSB0byBTbGFjayBvbiBmYWlsdXJlXG4gKiBhbmQgc29tZSBzdWNjZWVkZWQgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU2xhY2tOb3RpZmljYXRpb24gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBTbGFja05vdGlmaWNhdGlvblByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFNMQUNLX1VSTF9TRUNSRVRfTkFNRTogcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LnNlY3JldE5hbWUsXG4gICAgICBOT1RJRklDQVRJT05fTEVWRUw6IHByb3BzLm5vdGlmaWNhdGlvbkxldmVsID8/IFwiV0FSTlwiLFxuICAgIH1cblxuICAgIGlmIChwcm9wcy5hY2NvdW50RnJpZW5kbHlOYW1lICE9IG51bGwpIHtcbiAgICAgIGVudmlyb25tZW50LkFDQ09VTlRfRlJJRU5ETFlfTkFNRSA9IHByb3BzLmFjY291bnRGcmllbmRseU5hbWVcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubWVudGlvbnMgIT0gbnVsbCAmJiBwcm9wcy5tZW50aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnZpcm9ubWVudC5TTEFDS19NRU5USU9OUyA9IFNsYWNrTWVudGlvbi5mb3JtYXQocHJvcHMubWVudGlvbnMpXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiRnVuY3Rpb25cIiwge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9waXBlbGluZS1zbGFjay1ub3RpZmljYXRpb24tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTMsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhhbmRsZSBDb2RlUGlwZWxpbmUgcGlwZWxpbmUgc3RhdGUgY2hhbmdlIGFuZCByZXBvcnQgdG8gU2xhY2tcIixcbiAgICB9KVxuXG4gICAgcmVwb3J0RnVuY3Rpb24uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImNvZGVwaXBlbGluZTpMaXN0QWN0aW9uRXhlY3V0aW9uc1wiLFxuICAgICAgICAgIFwiY29kZXBpcGVsaW5lOkxpc3RQaXBlbGluZUV4ZWN1dGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucGlwZWxpbmUucGlwZWxpbmVBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LmdyYW50UmVhZChyZXBvcnRGdW5jdGlvbilcblxuICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldC5ncmFudFJlYWQocmVwb3J0RnVuY3Rpb24sIHByb3BzLnRyaWdnZXJPYmplY3RLZXkpXG5cbiAgICBwcm9wcy5waXBlbGluZS5vblN0YXRlQ2hhbmdlKGBFdmVudCR7aWR9YCwge1xuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIC8vIEF2YWlsYWJsZSBzdGF0ZXM6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlcGlwZWxpbmUvbGF0ZXN0L3VzZXJndWlkZS9kZXRlY3Qtc3RhdGUtY2hhbmdlcy1jbG91ZHdhdGNoLWV2ZW50cy5odG1sXG4gICAgICAgICAgc3RhdGU6IFtcIlNVQ0NFRURFRFwiLCBcIkZBSUxFRFwiLCBcIlNUQVJURURcIiwgXCJTVVBFUlNFREVEXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhcmdldDogbmV3IGV2ZW50c1RhcmdldHMuTGFtYmRhRnVuY3Rpb24ocmVwb3J0RnVuY3Rpb24pLFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBTbGFjayBtZW50aW9uIGZvcm1hdHRlciB3aXRoIHZhbGlkYXRpb24gcGVyIFNsYWNrIEFQSSBmb3JtYXQ6XG4gKiBodHRwczovL2RvY3Muc2xhY2suZGV2L21lc3NhZ2luZy9mb3JtYXR0aW5nLW1lc3NhZ2UtdGV4dC9cbiAqXG4gKiBTdXBwb3J0ZWQgbWVudGlvbiB0eXBlczpcbiAqIC0gU3BlY2lhbCBtZW50aW9uczogQGhlcmUsIEBjaGFubmVsLCBAZXZlcnlvbmVcbiAqIC0gVXNlciBJRHM6IFUgb3IgVyBwcmVmaXggKyBhbHBoYW51bWVyaWMgKGUuZy4sIFUwMjRCRTdMSCwgVzAyNEJFN0xIKVxuICogLSBVc2VyIGdyb3VwIElEczogUyBwcmVmaXggKyBhbHBoYW51bWVyaWMgKGUuZy4sIFNBWjk0R0RCOClcbiAqXG4gKiBVc2FnZTpcbiAqICAgU2xhY2tNZW50aW9uLmZvcm1hdChbJ0BoZXJlJywgJ1UwMjRCRTdMSCcsICdTQVo5NEdEQjgnXSlcbiAqL1xuZXhwb3J0IGNsYXNzIFNsYWNrTWVudGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQRUNJQUxfTUVOVElPTlMgPSBbXG4gICAgXCJAaGVyZVwiLFxuICAgIFwiQGNoYW5uZWxcIixcbiAgICBcIkBldmVyeW9uZVwiLFxuICBdIGFzIGNvbnN0XG5cbiAgLy8gTm90ZTogU2xhY2sgZG9lc24ndCBzcGVjaWZ5IGxlbmd0aCBjb25zdHJhaW50cyBmb3IgdGhlc2UgaWRlbnRpZmllcnMsIGxlYXZpbmcgdGhlbSB1bmJvdW5kZWRcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVVNFUl9QQVRURVJOID0gL15bVVddW0EtWjAtOV0rJC9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVVNFUl9HUk9VUF9QQVRURVJOID0gL15TW0EtWjAtOV0rJC9cblxuICAvKipcbiAgICogRm9ybWF0IGFuIGFycmF5IG9mIG1lbnRpb25zIGludG8gYSBzaW5nbGUgU2xhY2stZm9ybWF0dGVkIHN0cmluZy5cbiAgICogQHBhcmFtIG1lbnRpb25zIEFycmF5IG9mIG1lbnRpb24gc3RyaW5nc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdChtZW50aW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBtZW50aW9ucy5tYXAoKG0pID0+IFNsYWNrTWVudGlvbi5mb3JtYXRNZW50aW9uKG0pKS5qb2luKFwiIFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhIG1lbnRpb24gc3RyaW5nIGZvciBTbGFjayBBUEkgbWVzc2FnZSBmb3JtYXQuXG4gICAqIFZhbGlkYXRlcyBmb3JtYXQgYW5kIGNvbnZlcnRzIHRvIHByb3BlciBTbGFjayBtYXJrdXA6XG4gICAqICAgJ0BoZXJlJyAtPiAnPCFoZXJlPidcbiAgICogICAnVTEyMzQ1Njc4OTAnIC0+ICc8QFUxMjM0NTY3ODkwPidcbiAgICogICAnUzEyMzQ1Njc4OTAnIC0+ICc8IXN1YnRlYW1eUzEyMzQ1Njc4OTA+J1xuICAgKlxuICAgKiBAcGFyYW0gbWVudGlvbiBNZW50aW9uIHN0cmluZyAoZS5nLiwgJ0BoZXJlJywgJ1UxMjM0NTY3ODkwJywgJ1MxMjM0NTY3ODkwJylcbiAgICogQHRocm93cyBpZiBtZW50aW9uIGZvcm1hdCBpcyBpbnZhbGlkXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0TWVudGlvbihtZW50aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChtZW50aW9uLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICByZXR1cm4gU2xhY2tNZW50aW9uLmZvcm1hdFNwZWNpYWxNZW50aW9uKG1lbnRpb24pXG4gICAgfVxuICAgIGlmIChtZW50aW9uLnN0YXJ0c1dpdGgoXCJVXCIpIHx8IG1lbnRpb24uc3RhcnRzV2l0aChcIldcIikpIHtcbiAgICAgIHJldHVybiBTbGFja01lbnRpb24uZm9ybWF0VXNlcihtZW50aW9uKVxuICAgIH1cbiAgICBpZiAobWVudGlvbi5zdGFydHNXaXRoKFwiU1wiKSkge1xuICAgICAgcmV0dXJuIFNsYWNrTWVudGlvbi5mb3JtYXRVc2VyR3JvdXAobWVudGlvbilcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFNsYWNrIG1lbnRpb24gZm9ybWF0OiAke21lbnRpb259YClcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdFNwZWNpYWxNZW50aW9uKG1lbnRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgIVNsYWNrTWVudGlvbi5TUEVDSUFMX01FTlRJT05TLmluY2x1ZGVzKFxuICAgICAgICBtZW50aW9uIGFzIFwiQGhlcmVcIiB8IFwiQGNoYW5uZWxcIiB8IFwiQGV2ZXJ5b25lXCIsXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3BlY2lhbCBtZW50aW9uOiAke21lbnRpb259YClcbiAgICB9XG4gICAgcmV0dXJuIGA8ISR7bWVudGlvbi5zdWJzdHJpbmcoMSl9PmBcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdFVzZXIobWVudGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIVNsYWNrTWVudGlvbi5VU0VSX1BBVFRFUk4udGVzdChtZW50aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVzZXIgSUQ6ICR7bWVudGlvbn1gKVxuICAgIH1cbiAgICByZXR1cm4gYDxAJHttZW50aW9ufT5gXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBmb3JtYXRVc2VyR3JvdXAobWVudGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIVNsYWNrTWVudGlvbi5VU0VSX0dST1VQX1BBVFRFUk4udGVzdChtZW50aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVzZXIgZ3JvdXAgSUQ6ICR7bWVudGlvbn1gKVxuICAgIH1cbiAgICByZXR1cm4gYDwhc3VidGVhbV4ke21lbnRpb259PmBcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "3.18.1",
3
+ "version": "3.19.0",
4
4
  "description": "CDK library for Liflig",
5
5
  "type": "module",
6
6
  "repository": {
@@ -40,30 +40,30 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@aws-cdk/assert": "2.68.0",
43
- "@aws-sdk/client-cloudwatch-logs": "3.948.0",
44
- "@aws-sdk/client-codebuild": "3.948.0",
45
- "@aws-sdk/client-codepipeline": "3.948.0",
46
- "@aws-sdk/client-ecs": "3.948.0",
47
- "@aws-sdk/client-s3": "3.948.0",
48
- "@aws-sdk/client-secrets-manager": "3.950.0",
49
- "@aws-sdk/client-ses": "3.948.0",
50
- "@aws-sdk/client-sesv2": "3.950.0",
51
- "@aws-sdk/client-sfn": "3.948.0",
52
- "@aws-sdk/client-ssm": "3.948.0",
53
- "@aws-sdk/lib-storage": "3.948.0",
54
- "@biomejs/biome": "2.3.8",
55
- "@commitlint/cli": "20.2.0",
56
- "@commitlint/config-conventional": "20.2.0",
43
+ "@aws-sdk/client-cloudwatch-logs": "3.958.0",
44
+ "@aws-sdk/client-codebuild": "3.958.0",
45
+ "@aws-sdk/client-codepipeline": "3.958.0",
46
+ "@aws-sdk/client-ecs": "3.958.0",
47
+ "@aws-sdk/client-s3": "3.958.0",
48
+ "@aws-sdk/client-secrets-manager": "3.958.0",
49
+ "@aws-sdk/client-ses": "3.958.0",
50
+ "@aws-sdk/client-sesv2": "3.958.0",
51
+ "@aws-sdk/client-sfn": "3.958.0",
52
+ "@aws-sdk/client-ssm": "3.958.0",
53
+ "@aws-sdk/lib-storage": "3.958.0",
54
+ "@biomejs/biome": "2.3.10",
55
+ "@commitlint/cli": "20.3.0",
56
+ "@commitlint/config-conventional": "20.3.0",
57
57
  "@types/aws-lambda": "8.10.159",
58
58
  "@types/jest": "30.0.0",
59
- "@types/node": "24.10.2",
60
- "aws-cdk": "2.1034.0",
61
- "aws-cdk-lib": "2.232.1",
59
+ "@types/node": "24.10.4",
60
+ "aws-cdk": "2.1100.1",
61
+ "aws-cdk-lib": "2.232.2",
62
62
  "constructs": "10.4.4",
63
- "esbuild": "0.27.1",
63
+ "esbuild": "0.27.2",
64
64
  "jest": "30.2.0",
65
65
  "jest-cdk-snapshot": "2.3.6",
66
- "lefthook": "2.0.11",
66
+ "lefthook": "2.0.13",
67
67
  "npm-check-updates": "19.2.0",
68
68
  "semantic-release": "25.0.2",
69
69
  "ts-jest": "29.4.6",