@liflig/cdk 3.18.0 → 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.0",
3
+ "version": "3.19.0",
4
4
  "description": "CDK library for Liflig",
5
5
  "type": "module",
6
6
  "repository": {
@@ -40,31 +40,31 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@aws-cdk/assert": "2.68.0",
43
- "@aws-sdk/client-cloudwatch-logs": "3.947.0",
44
- "@aws-sdk/client-codebuild": "3.947.0",
45
- "@aws-sdk/client-codepipeline": "3.947.0",
46
- "@aws-sdk/client-ecs": "3.947.0",
47
- "@aws-sdk/client-s3": "3.947.0",
48
- "@aws-sdk/client-secrets-manager": "3.947.0",
49
- "@aws-sdk/client-ses": "3.947.0",
50
- "@aws-sdk/client-sesv2": "3.947.0",
51
- "@aws-sdk/client-sfn": "3.947.0",
52
- "@aws-sdk/client-ssm": "3.947.0",
53
- "@aws-sdk/lib-storage": "3.947.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.1033.0",
61
- "aws-cdk-lib": "2.231.0",
62
- "constructs": "10.4.3",
63
- "esbuild": "0.27.1",
59
+ "@types/node": "24.10.4",
60
+ "aws-cdk": "2.1100.1",
61
+ "aws-cdk-lib": "2.232.2",
62
+ "constructs": "10.4.4",
63
+ "esbuild": "0.27.2",
64
64
  "jest": "30.2.0",
65
65
  "jest-cdk-snapshot": "2.3.6",
66
- "lefthook": "2.0.9",
67
- "npm-check-updates": "19.1.2",
66
+ "lefthook": "2.0.13",
67
+ "npm-check-updates": "19.2.0",
68
68
  "semantic-release": "25.0.2",
69
69
  "ts-jest": "29.4.6",
70
70
  "tsx": "4.21.0",
@@ -72,7 +72,7 @@
72
72
  "typescript": "5.9.3"
73
73
  },
74
74
  "dependencies": {
75
- "@capraconsulting/webapp-deploy-lambda": "2.5.2",
75
+ "@capraconsulting/webapp-deploy-lambda": "2.5.3",
76
76
  "aws-jwt-verify": "5.1.1"
77
77
  },
78
78
  "peerDependencies": {