@sylvesterllc/aws-constructs 1.1.44 → 1.1.45

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.
@@ -34,51 +34,51 @@ class CreateDynamoSingleTableDesign extends tsgBaseResource_1.TsgBaseResource {
34
34
  tableName: this.tableName,
35
35
  removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
36
36
  partitionKey: {
37
- name: 'pk',
37
+ name: "pk",
38
38
  type: aws_dynamodb_1.AttributeType.STRING,
39
39
  },
40
40
  sortKey: {
41
- name: 'sk',
41
+ name: "sk",
42
42
  type: aws_dynamodb_1.AttributeType.STRING,
43
43
  },
44
44
  billingMode: aws_dynamodb_1.BillingMode.PAY_PER_REQUEST,
45
45
  });
46
46
  const gsiIndexes = [
47
47
  {
48
- indexName: 'gsi1Index',
48
+ indexName: "gsi1Index",
49
49
  partitionKey: {
50
- name: 'gsi1pk',
51
- type: aws_dynamodb_1.AttributeType.STRING
50
+ name: "gsi1pk",
51
+ type: aws_dynamodb_1.AttributeType.STRING,
52
52
  },
53
53
  sortKey: {
54
- name: 'gsi1sk',
55
- type: aws_dynamodb_1.AttributeType.STRING
54
+ name: "gsi1sk",
55
+ type: aws_dynamodb_1.AttributeType.STRING,
56
56
  },
57
- projectionType: aws_dynamodb_1.ProjectionType.ALL
57
+ projectionType: aws_dynamodb_1.ProjectionType.ALL,
58
58
  },
59
59
  {
60
- indexName: 'gsi2Index',
60
+ indexName: "gsi2Index",
61
61
  partitionKey: {
62
- name: 'gsi2pk',
63
- type: aws_dynamodb_1.AttributeType.STRING
62
+ name: "gsi2pk",
63
+ type: aws_dynamodb_1.AttributeType.STRING,
64
64
  },
65
65
  sortKey: {
66
- name: 'gsi2sk',
67
- type: aws_dynamodb_1.AttributeType.STRING
66
+ name: "gsi2sk",
67
+ type: aws_dynamodb_1.AttributeType.STRING,
68
68
  },
69
- projectionType: aws_dynamodb_1.ProjectionType.ALL
69
+ projectionType: aws_dynamodb_1.ProjectionType.ALL,
70
70
  },
71
71
  {
72
- indexName: 'gsi3Index',
72
+ indexName: "gsi3Index",
73
73
  partitionKey: {
74
- name: 'gsi3pk',
75
- type: aws_dynamodb_1.AttributeType.STRING
74
+ name: "gsi3pk",
75
+ type: aws_dynamodb_1.AttributeType.STRING,
76
76
  },
77
77
  sortKey: {
78
- name: 'gsi3sk',
79
- type: aws_dynamodb_1.AttributeType.STRING
78
+ name: "gsi3sk",
79
+ type: aws_dynamodb_1.AttributeType.STRING,
80
80
  },
81
- projectionType: aws_dynamodb_1.ProjectionType.ALL
81
+ projectionType: aws_dynamodb_1.ProjectionType.ALL,
82
82
  },
83
83
  ];
84
84
  gsiIndexes.map((gsi) => {
@@ -86,17 +86,18 @@ class CreateDynamoSingleTableDesign extends tsgBaseResource_1.TsgBaseResource {
86
86
  indexName: gsi.indexName,
87
87
  partitionKey: gsi.partitionKey,
88
88
  sortKey: gsi.sortKey,
89
- projectionType: gsi.projectionType
89
+ projectionType: gsi.projectionType,
90
90
  };
91
91
  dbTable.addGlobalSecondaryIndex(gsiProps);
92
92
  });
93
93
  return dbTable;
94
94
  }
95
95
  createOutput(scope) {
96
- new aws_cdk_lib_1.CfnOutput(scope, `dynamoTable-${this.CreatedTable?.tableName}`, {
97
- value: `Table Name: ${this.createdResource?.tableName}\t Table Arn: ${this.createdResource?.tableArn}`
96
+ // Logical IDs must not include unresolved tokens; use a stable ID
97
+ new aws_cdk_lib_1.CfnOutput(scope, "dynamoTable", {
98
+ value: `Table Name: ${this.createdResource?.tableName}\t Table Arn: ${this.createdResource?.tableArn}`,
98
99
  });
99
100
  }
100
101
  }
101
102
  exports.CreateDynamoSingleTableDesign = CreateDynamoSingleTableDesign;
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlYXRlRHluYW1vU2luZ2xlVGFibGVEZXNpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL2R5bmFtb2RiL0NyZWF0ZUR5bmFtb1NpbmdsZVRhYmxlRGVzaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RDtBQUN2RCwyREFBb0k7QUFFcEksNkRBQTBEO0FBRzFELE1BQWEsNkJBQThCLFNBQVEsaUNBQThCO0lBcUJ2RDtJQUE0QjtJQW5CbEQsTUFBTSxDQUFDLGdCQUFnQixHQUFhO1FBQ2hDLHVCQUF1QjtRQUN2Qix5QkFBeUI7UUFDekIsNkJBQTZCO1FBQzdCLHFCQUFxQjtRQUNyQix3QkFBd0I7UUFDeEIsa0JBQWtCO1FBQ2xCLHFCQUFxQjtRQUNyQiwyQkFBMkI7UUFDM0Isa0JBQWtCO1FBQ2xCLGdCQUFnQjtRQUNoQixlQUFlO1FBQ2YscUJBQXFCO0tBQ3hCLENBQUM7SUFFRixJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQXNCLEtBQWdCLEVBQVksU0FBaUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUROLFVBQUssR0FBTCxLQUFLLENBQVc7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUFRO0lBRW5FLENBQUM7SUFFUyxjQUFjLENBQUMsS0FBZ0I7UUFFckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxvQkFBSyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUVwQyxZQUFZLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTthQUM3QjtZQUNELE9BQU8sRUFBRTtnQkFDTCxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2FBQzdCO1lBQ0QsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtTQUMzQyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRztZQUNmO2dCQUNJLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixZQUFZLEVBQUU7b0JBQ1YsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTtpQkFDN0I7Z0JBQ0QsT0FBTyxFQUFFO29CQUNMLElBQUksRUFBRSxRQUFRO29CQUNkLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07aUJBQzdCO2dCQUNELGNBQWMsRUFBRSw2QkFBYyxDQUFDLEdBQUc7YUFDckM7WUFDRDtnQkFDSSxTQUFTLEVBQUUsV0FBVztnQkFDdEIsWUFBWSxFQUFFO29CQUNWLElBQUksRUFBRSxRQUFRO29CQUNkLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07aUJBQzdCO2dCQUNELE9BQU8sRUFBRTtvQkFDTCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2lCQUM3QjtnQkFDRCxjQUFjLEVBQUUsNkJBQWMsQ0FBQyxHQUFHO2FBQ3JDO1lBQ0Q7Z0JBQ0ksU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFlBQVksRUFBRTtvQkFDVixJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2lCQUM3QjtnQkFDRCxPQUFPLEVBQUU7b0JBQ0wsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTtpQkFDN0I7Z0JBQ0QsY0FBYyxFQUFFLDZCQUFjLENBQUMsR0FBRzthQUNyQztTQUNKLENBQUM7UUFFRixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFFbkIsTUFBTSxRQUFRLEdBQThCO2dCQUN4QyxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7Z0JBQ3hCLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtnQkFDOUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2dCQUNwQixjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7YUFFckMsQ0FBQztZQUVGLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFHUyxZQUFZLENBQUksS0FBZ0I7UUFFdEMsSUFBSSx1QkFBUyxDQUFDLEtBQUssRUFBRSxlQUFlLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLEVBQUU7WUFDaEUsS0FBSyxFQUFFLGVBQWUsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLGlCQUFpQixJQUFJLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRTtTQUN6RyxDQUFDLENBQUM7SUFFUCxDQUFDOztBQXhHTCxzRUF5R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcclxuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSwgQmlsbGluZ01vZGUsIEdsb2JhbFNlY29uZGFyeUluZGV4UHJvcHMsIFByb2plY3Rpb25UeXBlLCBUYWJsZSwgVGFibGVQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHsgVHNnQmFzZVJlc291cmNlIH0gZnJvbSBcIi4uL2Jhc2UvdHNnQmFzZVJlc291cmNlXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIENyZWF0ZUR5bmFtb1NpbmdsZVRhYmxlRGVzaWduIGV4dGVuZHMgVHNnQmFzZVJlc291cmNlPFRhYmxlLCBzdHJpbmc+IHtcclxuXHJcbiAgICBzdGF0aWMgUmVhZFdyaXRlQWN0aW9uczogc3RyaW5nW10gPSBbXHJcbiAgICAgICAgXCJkeW5hbW9kYjpCYXRjaEdldEl0ZW1cIixcclxuICAgICAgICBcImR5bmFtb2RiOkJhdGNoV3JpdGVJdGVtXCIsXHJcbiAgICAgICAgXCJkeW5hbW9kYjpDb25kaXRpb25DaGVja0l0ZW1cIixcclxuICAgICAgICBcImR5bmFtb2RiOkRlbGV0ZUl0ZW1cIixcclxuICAgICAgICBcImR5bmFtb2RiOkRlc2NyaWJlVGFibGVcIixcclxuICAgICAgICBcImR5bmFtb2RiOkdldEl0ZW1cIixcclxuICAgICAgICBcImR5bmFtb2RiOkdldFJlY29yZHNcIixcclxuICAgICAgICBcImR5bmFtb2RiOkdldFNoYXJkSXRlcmF0b3JcIixcclxuICAgICAgICBcImR5bmFtb2RiOlB1dEl0ZW1cIixcclxuICAgICAgICBcImR5bmFtb2RiOlF1ZXJ5XCIsXHJcbiAgICAgICAgXCJkeW5hbW9kYjpTY2FuXCIsXHJcbiAgICAgICAgXCJkeW5hbW9kYjpVcGRhdGVJdGVtXCIsXHJcbiAgICBdO1xyXG5cclxuICAgIGdldCBDcmVhdGVkVGFibGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlZFJlc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzY29wZTogQ29uc3RydWN0LCBwcm90ZWN0ZWQgdGFibGVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihzY29wZSwgdGFibGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2Uoc2NvcGU6IENvbnN0cnVjdCk6IFRhYmxlIHtcclxuXHJcbiAgICAgICAgY29uc3QgZGJUYWJsZSA9IG5ldyBUYWJsZShzY29wZSwgYCR7dGhpcy50YWJsZU5hbWV9YCwge1xyXG4gICAgICAgICAgICB0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxyXG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXHJcblxyXG4gICAgICAgICAgICBwYXJ0aXRpb25LZXk6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdwaycsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc29ydEtleToge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NrJyxcclxuICAgICAgICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBiaWxsaW5nTW9kZTogQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBnc2lJbmRleGVzID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRleE5hbWU6ICdnc2kxSW5kZXgnLFxyXG4gICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dzaTFwaycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkdcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzb3J0S2V5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dzaTFzaycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkdcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uVHlwZTogUHJvamVjdGlvblR5cGUuQUxMXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGluZGV4TmFtZTogJ2dzaTJJbmRleCcsXHJcbiAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ3NpMnBrJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklOR1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNvcnRLZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ3NpMnNrJyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklOR1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHByb2plY3Rpb25UeXBlOiBQcm9qZWN0aW9uVHlwZS5BTExcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhOYW1lOiAnZ3NpM0luZGV4JyxcclxuICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnc2kzcGsnLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc29ydEtleToge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnc2kzc2snLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvblR5cGU6IFByb2plY3Rpb25UeXBlLkFMTFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGdzaUluZGV4ZXMubWFwKChnc2kpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGdzaVByb3BzOiBHbG9iYWxTZWNvbmRhcnlJbmRleFByb3BzID0ge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhOYW1lOiBnc2kuaW5kZXhOYW1lLFxyXG4gICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5OiBnc2kucGFydGl0aW9uS2V5LFxyXG4gICAgICAgICAgICAgICAgc29ydEtleTogZ3NpLnNvcnRLZXksXHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uVHlwZTogZ3NpLnByb2plY3Rpb25UeXBlXHJcblxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZGJUYWJsZS5hZGRHbG9iYWxTZWNvbmRhcnlJbmRleChnc2lQcm9wcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYlRhYmxlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlT3V0cHV0PFQ+KHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbmV3IENmbk91dHB1dChzY29wZSwgYGR5bmFtb1RhYmxlLSR7dGhpcy5DcmVhdGVkVGFibGU/LnRhYmxlTmFtZX1gLCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBgVGFibGUgTmFtZTogJHt0aGlzLmNyZWF0ZWRSZXNvdXJjZT8udGFibGVOYW1lfVxcdCBUYWJsZSBBcm46ICR7dGhpcy5jcmVhdGVkUmVzb3VyY2U/LnRhYmxlQXJufWBcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcbn0iXX0=
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlYXRlRHluYW1vU2luZ2xlVGFibGVEZXNpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL2R5bmFtb2RiL0NyZWF0ZUR5bmFtb1NpbmdsZVRhYmxlRGVzaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RDtBQUN2RCwyREFPa0M7QUFFbEMsNkRBQTBEO0FBRTFELE1BQWEsNkJBQThCLFNBQVEsaUNBR2xEO0lBb0J1QjtJQUE0QjtJQW5CbEQsTUFBTSxDQUFDLGdCQUFnQixHQUFhO1FBQ2xDLHVCQUF1QjtRQUN2Qix5QkFBeUI7UUFDekIsNkJBQTZCO1FBQzdCLHFCQUFxQjtRQUNyQix3QkFBd0I7UUFDeEIsa0JBQWtCO1FBQ2xCLHFCQUFxQjtRQUNyQiwyQkFBMkI7UUFDM0Isa0JBQWtCO1FBQ2xCLGdCQUFnQjtRQUNoQixlQUFlO1FBQ2YscUJBQXFCO0tBQ3RCLENBQUM7SUFFRixJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQXNCLEtBQWdCLEVBQVksU0FBaUI7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQURKLFVBQUssR0FBTCxLQUFLLENBQVc7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUFRO0lBRW5FLENBQUM7SUFFUyxjQUFjLENBQUMsS0FBZ0I7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxvQkFBSyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUVwQyxZQUFZLEVBQUU7Z0JBQ1osSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTthQUMzQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2FBQzNCO1lBQ0QsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtTQUN6QyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRztZQUNqQjtnQkFDRSxTQUFTLEVBQUUsV0FBVztnQkFDdEIsWUFBWSxFQUFFO29CQUNaLElBQUksRUFBRSxRQUFRO29CQUNkLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07aUJBQzNCO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2lCQUMzQjtnQkFDRCxjQUFjLEVBQUUsNkJBQWMsQ0FBQyxHQUFHO2FBQ25DO1lBQ0Q7Z0JBQ0UsU0FBUyxFQUFFLFdBQVc7Z0JBQ3RCLFlBQVksRUFBRTtvQkFDWixJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2lCQUMzQjtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTtpQkFDM0I7Z0JBQ0QsY0FBYyxFQUFFLDZCQUFjLENBQUMsR0FBRzthQUNuQztZQUNEO2dCQUNFLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixZQUFZLEVBQUU7b0JBQ1osSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTtpQkFDM0I7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxRQUFRO29CQUNkLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07aUJBQzNCO2dCQUNELGNBQWMsRUFBRSw2QkFBYyxDQUFDLEdBQUc7YUFDbkM7U0FDRixDQUFDO1FBRUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JCLE1BQU0sUUFBUSxHQUE4QjtnQkFDMUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO2dCQUN4QixZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVk7Z0JBQzlCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztnQkFDcEIsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjO2FBQ25DLENBQUM7WUFFRixPQUFPLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRVMsWUFBWSxDQUFJLEtBQWdCO1FBQ3hDLGtFQUFrRTtRQUNsRSxJQUFJLHVCQUFTLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtZQUNsQyxLQUFLLEVBQUUsZUFBZSxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsaUJBQWlCLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFO1NBQ3ZHLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBckdILHNFQXNHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQge1xyXG4gIEF0dHJpYnV0ZVR5cGUsXHJcbiAgQmlsbGluZ01vZGUsXHJcbiAgR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcclxuICBQcm9qZWN0aW9uVHlwZSxcclxuICBUYWJsZSxcclxuICBUYWJsZVByb3BzLFxyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHsgVHNnQmFzZVJlc291cmNlIH0gZnJvbSBcIi4uL2Jhc2UvdHNnQmFzZVJlc291cmNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlRHluYW1vU2luZ2xlVGFibGVEZXNpZ24gZXh0ZW5kcyBUc2dCYXNlUmVzb3VyY2U8XHJcbiAgVGFibGUsXHJcbiAgc3RyaW5nXHJcbj4ge1xyXG4gIHN0YXRpYyBSZWFkV3JpdGVBY3Rpb25zOiBzdHJpbmdbXSA9IFtcclxuICAgIFwiZHluYW1vZGI6QmF0Y2hHZXRJdGVtXCIsXHJcbiAgICBcImR5bmFtb2RiOkJhdGNoV3JpdGVJdGVtXCIsXHJcbiAgICBcImR5bmFtb2RiOkNvbmRpdGlvbkNoZWNrSXRlbVwiLFxyXG4gICAgXCJkeW5hbW9kYjpEZWxldGVJdGVtXCIsXHJcbiAgICBcImR5bmFtb2RiOkRlc2NyaWJlVGFibGVcIixcclxuICAgIFwiZHluYW1vZGI6R2V0SXRlbVwiLFxyXG4gICAgXCJkeW5hbW9kYjpHZXRSZWNvcmRzXCIsXHJcbiAgICBcImR5bmFtb2RiOkdldFNoYXJkSXRlcmF0b3JcIixcclxuICAgIFwiZHluYW1vZGI6UHV0SXRlbVwiLFxyXG4gICAgXCJkeW5hbW9kYjpRdWVyeVwiLFxyXG4gICAgXCJkeW5hbW9kYjpTY2FuXCIsXHJcbiAgICBcImR5bmFtb2RiOlVwZGF0ZUl0ZW1cIixcclxuICBdO1xyXG5cclxuICBnZXQgQ3JlYXRlZFRhYmxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlZFJlc291cmNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHNjb3BlOiBDb25zdHJ1Y3QsIHByb3RlY3RlZCB0YWJsZU5hbWU6IHN0cmluZykge1xyXG4gICAgc3VwZXIoc2NvcGUsIHRhYmxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2Uoc2NvcGU6IENvbnN0cnVjdCk6IFRhYmxlIHtcclxuICAgIGNvbnN0IGRiVGFibGUgPSBuZXcgVGFibGUoc2NvcGUsIGAke3RoaXMudGFibGVOYW1lfWAsIHtcclxuICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxyXG5cclxuICAgICAgcGFydGl0aW9uS2V5OiB7XHJcbiAgICAgICAgbmFtZTogXCJwa1wiLFxyXG4gICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxyXG4gICAgICB9LFxyXG4gICAgICBzb3J0S2V5OiB7XHJcbiAgICAgICAgbmFtZTogXCJza1wiLFxyXG4gICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxyXG4gICAgICB9LFxyXG4gICAgICBiaWxsaW5nTW9kZTogQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZ3NpSW5kZXhlcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGluZGV4TmFtZTogXCJnc2kxSW5kZXhcIixcclxuICAgICAgICBwYXJ0aXRpb25LZXk6IHtcclxuICAgICAgICAgIG5hbWU6IFwiZ3NpMXBrXCIsXHJcbiAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnRLZXk6IHtcclxuICAgICAgICAgIG5hbWU6IFwiZ3NpMXNrXCIsXHJcbiAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHByb2plY3Rpb25UeXBlOiBQcm9qZWN0aW9uVHlwZS5BTEwsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpbmRleE5hbWU6IFwiZ3NpMkluZGV4XCIsXHJcbiAgICAgICAgcGFydGl0aW9uS2V5OiB7XHJcbiAgICAgICAgICBuYW1lOiBcImdzaTJwa1wiLFxyXG4gICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzb3J0S2V5OiB7XHJcbiAgICAgICAgICBuYW1lOiBcImdzaTJza1wiLFxyXG4gICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwcm9qZWN0aW9uVHlwZTogUHJvamVjdGlvblR5cGUuQUxMLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaW5kZXhOYW1lOiBcImdzaTNJbmRleFwiLFxyXG4gICAgICAgIHBhcnRpdGlvbktleToge1xyXG4gICAgICAgICAgbmFtZTogXCJnc2kzcGtcIixcclxuICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc29ydEtleToge1xyXG4gICAgICAgICAgbmFtZTogXCJnc2kzc2tcIixcclxuICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcHJvamVjdGlvblR5cGU6IFByb2plY3Rpb25UeXBlLkFMTCxcclxuICAgICAgfSxcclxuICAgIF07XHJcblxyXG4gICAgZ3NpSW5kZXhlcy5tYXAoKGdzaSkgPT4ge1xyXG4gICAgICBjb25zdCBnc2lQcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyA9IHtcclxuICAgICAgICBpbmRleE5hbWU6IGdzaS5pbmRleE5hbWUsXHJcbiAgICAgICAgcGFydGl0aW9uS2V5OiBnc2kucGFydGl0aW9uS2V5LFxyXG4gICAgICAgIHNvcnRLZXk6IGdzaS5zb3J0S2V5LFxyXG4gICAgICAgIHByb2plY3Rpb25UeXBlOiBnc2kucHJvamVjdGlvblR5cGUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBkYlRhYmxlLmFkZEdsb2JhbFNlY29uZGFyeUluZGV4KGdzaVByb3BzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkYlRhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU91dHB1dDxUPihzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XHJcbiAgICAvLyBMb2dpY2FsIElEcyBtdXN0IG5vdCBpbmNsdWRlIHVucmVzb2x2ZWQgdG9rZW5zOyB1c2UgYSBzdGFibGUgSURcclxuICAgIG5ldyBDZm5PdXRwdXQoc2NvcGUsIFwiZHluYW1vVGFibGVcIiwge1xyXG4gICAgICB2YWx1ZTogYFRhYmxlIE5hbWU6ICR7dGhpcy5jcmVhdGVkUmVzb3VyY2U/LnRhYmxlTmFtZX1cXHQgVGFibGUgQXJuOiAke3RoaXMuY3JlYXRlZFJlc291cmNlPy50YWJsZUFybn1gLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -31,7 +31,7 @@ class CreateLambda extends baseResource_1.BaseResource {
31
31
  createdAssets.forEach((x, idx) => {
32
32
  new aws_cdk_lib_1.CfnOutput(scope, `lambda-${idx}`, {
33
33
  // @ts-ignore
34
- value: x.functionName
34
+ value: x.functionName,
35
35
  });
36
36
  });
37
37
  }
@@ -53,36 +53,42 @@ class CreateLambda extends baseResource_1.BaseResource {
53
53
  prop,
54
54
  role,
55
55
  layers,
56
- props
56
+ props,
57
57
  });
58
58
  }
59
59
  createLambdaFunctionProps(props) {
60
60
  const { prop, role, layers } = props;
61
+ // Create explicit LogGroup to avoid deprecated `logRetention`
62
+ const functionName = `${this.config.AppPrefix}-${prop.name}`;
63
+ const logGroup = new aws_logs_1.LogGroup(this.scope, `${functionName}-logs`, {
64
+ retention: !prop.logDuration
65
+ ? aws_logs_1.RetentionDays.FIVE_DAYS
66
+ : lambdaHelper_1.LambdaHelper.getDayToSaveLogs(prop.logDuration),
67
+ });
61
68
  const lambdaProp = {
62
69
  entry: path.join(prop.codePath),
63
- functionName: `${this.config.AppPrefix}-${prop.name}`,
70
+ functionName,
64
71
  handler: prop.handler,
65
- logRetention: (!prop.logDuration) ? aws_logs_1.RetentionDays.FIVE_DAYS : lambdaHelper_1.LambdaHelper.getDayToSaveLogs(prop.logDuration),
72
+ logGroup,
66
73
  runtime: prop.runtime || this.config.GLOBALS.stackRuntime,
67
74
  timeout: prop.duration || aws_cdk_lib_1.Duration.minutes(2),
68
75
  memorySize: prop.memory || 512,
69
76
  environment: {
70
- "VERBOSE_LOGGING": "true",
71
- ...prop.environment
77
+ VERBOSE_LOGGING: "true",
78
+ ...prop.environment,
72
79
  },
73
80
  bundling: {
74
81
  minify: false,
75
- target: 'es2020',
82
+ target: "es2020",
76
83
  sourceMap: true,
77
84
  sourceMapMode: aws_lambda_nodejs_1.SourceMapMode.EXTERNAL,
78
85
  environment: prop.environment || prop.environment,
79
86
  },
80
87
  role,
81
- layers
88
+ layers,
82
89
  };
83
90
  return lambdaProp;
84
91
  }
85
- ;
86
92
  createAlarmsForLambdas(lambdas) {
87
93
  const lambdaRecords = this.createRecordForLambda(lambdas);
88
94
  // console.log('Lambda Records:', lambdaRecords);
@@ -98,14 +104,14 @@ class CreateLambda extends baseResource_1.BaseResource {
98
104
  const invocationMetric = lambda.metricInvocations({
99
105
  period: aws_cdk_lib_1.Duration.minutes(3),
100
106
  });
101
- const uuid = (0, util_helper_1.getUUID)().split('-')[0];
107
+ const uuid = (0, util_helper_1.getUUID)().split("-")[0];
102
108
  new aws_cloudwatch_1.Alarm(this.scope, `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`, {
103
109
  metric: errorMetric,
104
110
  threshold: 5,
105
111
  comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
106
112
  evaluationPeriods: 3,
107
113
  alarmDescription: `${this.config.AppPrefix} errors over 3 min period`,
108
- alarmName: `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`
114
+ alarmName: `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`,
109
115
  });
110
116
  new aws_cloudwatch_1.Alarm(this.scope, `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`, {
111
117
  metric: durationMetric,
@@ -113,7 +119,7 @@ class CreateLambda extends baseResource_1.BaseResource {
113
119
  comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
114
120
  evaluationPeriods: 3,
115
121
  alarmDescription: `${this.config.AppPrefix}-${lambda.node.id} duration errors over 3 min period`,
116
- alarmName: `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`
122
+ alarmName: `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`,
117
123
  });
118
124
  const invocationAlarm = new aws_cloudwatch_1.Alarm(this.scope, `${this.config.AppPrefix}-${lambda.node.id}-invocation-alarm`, {
119
125
  metric: errorMetric,
@@ -121,7 +127,7 @@ class CreateLambda extends baseResource_1.BaseResource {
121
127
  comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
122
128
  evaluationPeriods: 3,
123
129
  alarmDescription: `${this.config.AppPrefix}-${lambda.node.id} errors over 3 min period`,
124
- alarmName: `${this.config.AppPrefix}-${lambda.node.id}-invocation-Metric-alarm`
130
+ alarmName: `${this.config.AppPrefix}-${lambda.node.id}-invocation-Metric-alarm`,
125
131
  });
126
132
  });
127
133
  }
@@ -141,4 +147,4 @@ class CreateLambda extends baseResource_1.BaseResource {
141
147
  }
142
148
  }
143
149
  exports.CreateLambda = CreateLambda;
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlTGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Jlc291cmNlcy9sYW1iZGEvY3JlYXRlTGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFrRDtBQUVsRCwrREFBcUY7QUFHckYscUVBQW1HO0FBRW5HLDZCQUE2QjtBQU03Qix1REFBb0Q7QUFDcEQsbURBQXFEO0FBQ3JELGlEQUE4QztBQUM5QywyREFBb0Q7QUFHcEQsTUFBYSxZQUFhLFNBQVEsMkJBQTRCO0lBS0Q7SUFIbEQsT0FBTyxHQUFxQixFQUFFLENBQUM7SUFDL0IsYUFBYSxHQUFtQyxFQUFFLENBQUM7SUFFMUQsWUFBWSxLQUFnQixFQUFFLE1BQWlCLEVBQVUsTUFBdUI7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQURnQyxXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUc1RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFnQjtRQUVyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQyxPQUFPLE1BQU0sQ0FBQztJQUNsQixD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QUFDLElBQUksQ0FBQyxFQUFFLDBCQUEwQjthQUNsRixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQXlCLEVBQUUsU0FBb0I7UUFDeEUsT0FBTyxHQUFHLFNBQVMsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxPQUF5QjtRQUVuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBVSxDQUFDO1FBS3hDLE1BQU0sWUFBWSxHQUF1QyxFQUF3QyxDQUFDO1FBRWxHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDNUIsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQWUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7Q0FLSjtBQXJMRCxvQ0FxTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XHJcbmltcG9ydCB7IFRva2VuQXV0aG9yaXplciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheVwiO1xyXG5pbXBvcnQgeyBBbGFybSwgQ29tcGFyaXNvbk9wZXJhdG9yLCBJQWxhcm1BY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcclxuaW1wb3J0IHsgSVJvbGUsIE1hbmFnZWRQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xyXG5pbXBvcnQgeyBMYXllclZlcnNpb24sIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQgeyBOb2RlanNGdW5jdGlvbiwgTm9kZWpzRnVuY3Rpb25Qcm9wcywgU291cmNlTWFwTW9kZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqc1wiO1xyXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tIFwiLi4vLi4vY29uZmlnL0FwcENvbmZpZ1wiO1xyXG5pbXBvcnQgeyBUc2dMYW1iZGFQcm9wIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy90eXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgVHNnTGFtYmRhUHJvcHMgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3R5cGVzL1RzZ0xhbWJkYVByb3BzXCI7XHJcbmltcG9ydCB7IENyZWF0ZUxhbWJkYUZ1bmN0aW9uSW5wdXQgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9DcmVhdGVMYW1iZGFGdW5jdGlvbklucHV0XCI7XHJcbmltcG9ydCB7IEJhc2VSZXNvdXJjZSB9IGZyb20gXCIuLi9iYXNlL2Jhc2VSZXNvdXJjZVwiO1xyXG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XHJcbmltcG9ydCB7IExhbWJkYUhlbHBlciB9IGZyb20gXCIuL2xhbWJkYUhlbHBlclwiO1xyXG5pbXBvcnQgeyBnZXRVVUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvdXRpbC1oZWxwZXJcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlTGFtYmRhIGV4dGVuZHMgQmFzZVJlc291cmNlPE5vZGVqc0Z1bmN0aW9uPiB7XHJcblxyXG4gICAgcHVibGljIExhbWJkYXM6IE5vZGVqc0Z1bmN0aW9uW10gPSBbXTtcclxuICAgIHB1YmxpYyBMYW1iZGFSZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlanNGdW5jdGlvbj4gPSB7fTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBjb25maWc6IEFwcENvbmZpZywgcHJpdmF0ZSBsYXllcnM/OiBMYXllclZlcnNpb25bXSkge1xyXG4gICAgICAgIHN1cGVyKHNjb3BlLCBjb25maWcpO1xyXG5cclxuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLmNyZWF0ZVJlc291cmNlKHNjb3BlKTtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVkUmVzb3VyY2VzID0gWy4uLnJlc291cmNlc107XHJcblxyXG4gICAgICAgIHRoaXMuTGFtYmRhcyA9IFsuLi5yZXNvdXJjZXNdO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZUFsYXJtc0ZvckxhbWJkYXModGhpcy5MYW1iZGFzKTtcclxuXHJcbiAgICAgICAgdGhpcy5MYW1iZGFSZWNvcmRzID0gdGhpcy5jcmVhdGVSZWNvcmRGb3JMYW1iZGEodGhpcy5MYW1iZGFzKTtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoc2NvcGUsIHJlc291cmNlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlKHNjb3BlOiBDb25zdHJ1Y3QpOiBOb2RlanNGdW5jdGlvbltdIHtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jcmVhdGVMYW1iZGFzKHRoaXMuY29uZmlnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlT3V0cHV0PFQ+KHNjb3BlOiBDb25zdHJ1Y3QsIGNyZWF0ZWRBc3NldHM6IFRbXSk6IHZvaWQge1xyXG4gICAgICAgIGNyZWF0ZWRBc3NldHMuZm9yRWFjaCgoeCwgaWR4KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBuZXcgQ2ZuT3V0cHV0KHNjb3BlLCBgbGFtYmRhLSR7aWR4fWAsIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB4LmZ1bmN0aW9uTmFtZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUxhbWJkYXMoY29uZmlnOiBBcHBDb25maWcpOiBOb2RlanNGdW5jdGlvbltdIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlZExhbWJkYXM6IE5vZGVqc0Z1bmN0aW9uW10gPSB0aGlzLmNyZWF0ZUxhbWJkYUZ1bmN0aW9ucyh0aGlzLnNjb3BlLCB1bmRlZmluZWQsIHRoaXMubGF5ZXJzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRMYW1iZGFzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlTGFtYmRhRnVuY3Rpb25zKHNjb3BlOiBDb25zdHJ1Y3QsIHJvbGU/OiBJUm9sZSwgbGF5ZXJzPzogTGF5ZXJWZXJzaW9uW10pIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlZExhbWJkYXMgPSB0aGlzLmNvbmZpZy5SRVNPVVJDRVMuTEFNQkRBLm1hcCgoY29uZmlnOiBUc2dMYW1iZGFQcm9wKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFtYmRhUHJvcHMgPSB0aGlzLmNyZWF0ZUxhbWJkYVByb3BzKGNvbmZpZywgcm9sZSwgbGF5ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxhbWJkYUlkID0gQ3JlYXRlTGFtYmRhLmdldElkRm9yTGFtYmRhKGNvbmZpZywgdGhpcy5jb25maWcpO1xyXG4gICAgICAgICAgICBsZXQgZmN0biA9IG5ldyBOb2RlanNGdW5jdGlvbihzY29wZSwgbGFtYmRhSWQsIGxhbWJkYVByb3BzKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmY3RuO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gY3JlYXRlZExhbWJkYXMgfHwgW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFQcm9wcyhwcm9wOiBUc2dMYW1iZGFQcm9wLCByb2xlPzogSVJvbGUsIGxheWVycz86IExheWVyVmVyc2lvbltdLCBwcm9wcz86IFRzZ0xhbWJkYVByb3BzKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxhbWJkYUZ1bmN0aW9uUHJvcHMoe1xyXG4gICAgICAgICAgICBwcm9wLFxyXG4gICAgICAgICAgICByb2xlLFxyXG4gICAgICAgICAgICBsYXllcnMsXHJcbiAgICAgICAgICAgIHByb3BzXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFGdW5jdGlvblByb3BzKHByb3BzOiBDcmVhdGVMYW1iZGFGdW5jdGlvbklucHV0KSB7XHJcbiAgICAgICAgY29uc3QgeyBwcm9wLCByb2xlLCBsYXllcnMgfSA9IHByb3BzO1xyXG5cclxuICAgICAgICBjb25zdCBsYW1iZGFQcm9wOiBOb2RlanNGdW5jdGlvblByb3BzID0ge1xyXG4gICAgICAgICAgICBlbnRyeTogcGF0aC5qb2luKHByb3AuY29kZVBhdGgpLFxyXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGAke3RoaXMuY29uZmlnLkFwcFByZWZpeH0tJHtwcm9wLm5hbWV9YCxcclxuICAgICAgICAgICAgaGFuZGxlcjogcHJvcC5oYW5kbGVyLFxyXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246ICghcHJvcC5sb2dEdXJhdGlvbikgPyBSZXRlbnRpb25EYXlzLkZJVkVfREFZUyA6IExhbWJkYUhlbHBlci5nZXREYXlUb1NhdmVMb2dzKHByb3AubG9nRHVyYXRpb24pLFxyXG4gICAgICAgICAgICBydW50aW1lOiBwcm9wLnJ1bnRpbWUgfHwgdGhpcy5jb25maWcuR0xPQkFMUy5zdGFja1J1bnRpbWUsXHJcbiAgICAgICAgICAgIHRpbWVvdXQ6IHByb3AuZHVyYXRpb24gfHwgRHVyYXRpb24ubWludXRlcygyKSxcclxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogcHJvcC5tZW1vcnkgfHwgNTEyLFxyXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgICAgICAgICAgXCJWRVJCT1NFX0xPR0dJTkdcIjogXCJ0cnVlXCIsXHJcbiAgICAgICAgICAgICAgICAuLi5wcm9wLmVudmlyb25tZW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1bmRsaW5nOiB7XHJcbiAgICAgICAgICAgICAgICBtaW5pZnk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiAnZXMyMDIwJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNvdXJjZU1hcE1vZGU6IFNvdXJjZU1hcE1vZGUuRVhURVJOQUwsXHJcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogcHJvcC5lbnZpcm9ubWVudCB8fCBwcm9wLmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByb2xlLFxyXG4gICAgICAgICAgICBsYXllcnNcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGFtYmRhUHJvcDtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVBbGFybXNGb3JMYW1iZGFzKGxhbWJkYXM6IE5vZGVqc0Z1bmN0aW9uW10pIHtcclxuXHJcbiAgICAgICAgY29uc3QgbGFtYmRhUmVjb3JkcyA9IHRoaXMuY3JlYXRlUmVjb3JkRm9yTGFtYmRhKGxhbWJkYXMpO1xyXG5cclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnTGFtYmRhIFJlY29yZHM6JywgbGFtYmRhUmVjb3Jkcyk7XHJcbiAgICAgICAgLy8gY29uc3QgbGFtYmRhTmFtZXMgPSBPYmplY3Qua2V5cyhsYW1iZGFSZWNvcmRzKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnbGFtYmRhIE5hbWVzIGZyb20gUmVjb3JkcycsIGxhbWJkYU5hbWVzKTtcclxuXHJcbiAgICAgICAgbGFtYmRhcy5mb3JFYWNoKChsYW1iZGEsIGlkeCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXRyaWMgPSBsYW1iZGEubWV0cmljRXJyb3JzKHtcclxuICAgICAgICAgICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcygzKSxcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NZXRyaWMgPSBsYW1iZGEubWV0cmljRHVyYXRpb24oe1xyXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDMpLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGludm9jYXRpb25NZXRyaWMgPSBsYW1iZGEubWV0cmljSW52b2NhdGlvbnMoe1xyXG4gICAgICAgICAgICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDMpLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBnZXRVVUlEKCkuc3BsaXQoJy0nKVswXTtcclxuXHJcbiAgICAgICAgICAgIG5ldyBBbGFybSh0aGlzLnNjb3BlLCBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9LWVycm9yLWFsYXJtYCwge1xyXG4gICAgICAgICAgICAgICAgbWV0cmljOiBlcnJvck1ldHJpYyxcclxuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogNSxcclxuICAgICAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXHJcbiAgICAgICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogMyxcclxuICAgICAgICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGAke3RoaXMuY29uZmlnLkFwcFByZWZpeH0gZXJyb3JzIG92ZXIgMyBtaW4gcGVyaW9kYCxcclxuICAgICAgICAgICAgICAgIGFsYXJtTmFtZTogYCR7dGhpcy5jb25maWcuQXBwUHJlZml4fS0ke2xhbWJkYS5ub2RlLmlkfS1lcnJvci1hbGFybWBcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBuZXcgQWxhcm0odGhpcy5zY29wZSwgYCR7dGhpcy5jb25maWcuQXBwUHJlZml4fS0ke2xhbWJkYS5ub2RlLmlkfS1kdXJhdGlvbi1hbGFybWAsIHtcclxuICAgICAgICAgICAgICAgIG1ldHJpYzogZHVyYXRpb25NZXRyaWMsXHJcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDEsXHJcbiAgICAgICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxyXG4gICAgICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDMsXHJcbiAgICAgICAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9IGR1cmF0aW9uIGVycm9ycyBvdmVyIDMgbWluIHBlcmlvZGAsXHJcbiAgICAgICAgICAgICAgICBhbGFybU5hbWU6IGAke3RoaXMuY29uZmlnLkFwcFByZWZpeH0tJHtsYW1iZGEubm9kZS5pZH0tZHVyYXRpb24tYWxhcm1gXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW52b2NhdGlvbkFsYXJtID0gbmV3IEFsYXJtKHRoaXMuc2NvcGUsIGAke3RoaXMuY29uZmlnLkFwcFByZWZpeH0tJHtsYW1iZGEubm9kZS5pZH0taW52b2NhdGlvbi1hbGFybWAsIHtcclxuICAgICAgICAgICAgICAgIG1ldHJpYzogZXJyb3JNZXRyaWMsXHJcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDEwMDAsXHJcbiAgICAgICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxyXG4gICAgICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDMsXHJcbiAgICAgICAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9IGVycm9ycyBvdmVyIDMgbWluIHBlcmlvZGAsXHJcbiAgICAgICAgICAgICAgICBhbGFybU5hbWU6IGAke3RoaXMuY29uZmlnLkFwcFByZWZpeH0tJHtsYW1iZGEubm9kZS5pZH0taW52b2NhdGlvbi1NZXRyaWMtYWxhcm1gXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SWRGb3JMYW1iZGEobGFtYmRhUHJvcDogVHNnTGFtYmRhUHJvcCwgYXBwQ29uZmlnOiBBcHBDb25maWcpIHtcclxuICAgICAgICByZXR1cm4gYCR7YXBwQ29uZmlnLkFwcFByZWZpeH0tJHtsYW1iZGFQcm9wLm5hbWV9YC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlUmVjb3JkRm9yTGFtYmRhKGxhbWJkYXM6IE5vZGVqc0Z1bmN0aW9uW10pIHtcclxuXHJcbiAgICAgICAgY29uc3QgbmFtZXMgPSB0aGlzLmNvbmZpZy5SRVNPVVJDRVMuTEFNQkRBLm1hcCgobGFtYmRhKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBsYW1iZGEubmFtZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGFtYmRhTmFtZXMgPSBbLi4ubmFtZXNdIGFzIGNvbnN0O1xyXG5cclxuICAgICAgICB0eXBlIExhbWJkYU5hbWUgPSB0eXBlb2YgbGFtYmRhTmFtZXNbbnVtYmVyXTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IGxhbWJkYVJlY29yZDogUmVjb3JkPExhbWJkYU5hbWUsIE5vZGVqc0Z1bmN0aW9uPiA9IHt9IGFzIFJlY29yZDxMYW1iZGFOYW1lLCBOb2RlanNGdW5jdGlvbj47XHJcblxyXG4gICAgICAgIGxhbWJkYXMuZm9yRWFjaCgobGFtYmRhLCBpZHgpID0+IHtcclxuICAgICAgICAgICAgbGFtYmRhUmVjb3JkW2xhbWJkYU5hbWVzW2lkeF0gYXMgTGFtYmRhTmFtZV0gPSBsYW1iZGFzW2lkeF07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBsYW1iZGFSZWNvcmQ7XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcbiAgICBcclxufVxyXG5cclxuXHJcbiJdfQ==
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlTGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Jlc291cmNlcy9sYW1iZGEvY3JlYXRlTGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFrRDtBQUVsRCwrREFJb0M7QUFHcEMscUVBSXVDO0FBRXZDLDZCQUE2QjtBQU03Qix1REFBb0Q7QUFDcEQsbURBQStEO0FBQy9ELGlEQUE4QztBQUM5QywyREFBb0Q7QUFFcEQsTUFBYSxZQUFhLFNBQVEsMkJBQTRCO0lBT2xEO0lBTkgsT0FBTyxHQUFxQixFQUFFLENBQUM7SUFDL0IsYUFBYSxHQUFtQyxFQUFFLENBQUM7SUFFMUQsWUFDRSxLQUFnQixFQUNoQixNQUFpQixFQUNULE1BQXVCO1FBRS9CLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFGYixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUkvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFnQjtRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixD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LEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLDJCQUEyQjtnQkFDdkYsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLDBCQUEwQjthQUNoRixDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUMxQixVQUF5QixFQUN6QixTQUFvQjtRQUVwQixPQUFPLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE9BQXlCO1FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN4RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFVLENBQUM7UUFJeEMsTUFBTSxZQUFZLEdBQXVDLEVBR3hELENBQUM7UUFFRixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlCLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFlLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFwTkQsb0NBb05DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQgeyBUb2tlbkF1dGhvcml6ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXlcIjtcclxuaW1wb3J0IHtcclxuICBBbGFybSxcclxuICBDb21wYXJpc29uT3BlcmF0b3IsXHJcbiAgSUFsYXJtQWN0aW9uLFxyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xyXG5pbXBvcnQgeyBJUm9sZSwgTWFuYWdlZFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XHJcbmltcG9ydCB7IExheWVyVmVyc2lvbiwgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XHJcbmltcG9ydCB7XHJcbiAgTm9kZWpzRnVuY3Rpb24sXHJcbiAgTm9kZWpzRnVuY3Rpb25Qcm9wcyxcclxuICBTb3VyY2VNYXBNb2RlLFxyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqc1wiO1xyXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCB7IEFwcENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWcvQXBwQ29uZmlnXCI7XHJcbmltcG9ydCB7IFRzZ0xhbWJkYVByb3AgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBUc2dMYW1iZGFQcm9wcyB9IGZyb20gXCIuLi8uLi9jb25maWcvdHlwZXMvVHNnTGFtYmRhUHJvcHNcIjtcclxuaW1wb3J0IHsgQ3JlYXRlTGFtYmRhRnVuY3Rpb25JbnB1dCB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL0NyZWF0ZUxhbWJkYUZ1bmN0aW9uSW5wdXRcIjtcclxuaW1wb3J0IHsgQmFzZVJlc291cmNlIH0gZnJvbSBcIi4uL2Jhc2UvYmFzZVJlc291cmNlXCI7XHJcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XHJcbmltcG9ydCB7IExhbWJkYUhlbHBlciB9IGZyb20gXCIuL2xhbWJkYUhlbHBlclwiO1xyXG5pbXBvcnQgeyBnZXRVVUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvdXRpbC1oZWxwZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVMYW1iZGEgZXh0ZW5kcyBCYXNlUmVzb3VyY2U8Tm9kZWpzRnVuY3Rpb24+IHtcclxuICBwdWJsaWMgTGFtYmRhczogTm9kZWpzRnVuY3Rpb25bXSA9IFtdO1xyXG4gIHB1YmxpYyBMYW1iZGFSZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlanNGdW5jdGlvbj4gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBzY29wZTogQ29uc3RydWN0LFxyXG4gICAgY29uZmlnOiBBcHBDb25maWcsXHJcbiAgICBwcml2YXRlIGxheWVycz86IExheWVyVmVyc2lvbltdXHJcbiAgKSB7XHJcbiAgICBzdXBlcihzY29wZSwgY29uZmlnKTtcclxuXHJcbiAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLmNyZWF0ZVJlc291cmNlKHNjb3BlKTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZWRSZXNvdXJjZXMgPSBbLi4ucmVzb3VyY2VzXTtcclxuXHJcbiAgICB0aGlzLkxhbWJkYXMgPSBbLi4ucmVzb3VyY2VzXTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZUFsYXJtc0ZvckxhbWJkYXModGhpcy5MYW1iZGFzKTtcclxuXHJcbiAgICB0aGlzLkxhbWJkYVJlY29yZHMgPSB0aGlzLmNyZWF0ZVJlY29yZEZvckxhbWJkYSh0aGlzLkxhbWJkYXMpO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlT3V0cHV0KHNjb3BlLCByZXNvdXJjZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlKHNjb3BlOiBDb25zdHJ1Y3QpOiBOb2RlanNGdW5jdGlvbltdIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY3JlYXRlTGFtYmRhcyh0aGlzLmNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVPdXRwdXQ8VD4oc2NvcGU6IENvbnN0cnVjdCwgY3JlYXRlZEFzc2V0czogVFtdKTogdm9pZCB7XHJcbiAgICBjcmVhdGVkQXNzZXRzLmZvckVhY2goKHgsIGlkeCkgPT4ge1xyXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHNjb3BlLCBgbGFtYmRhLSR7aWR4fWAsIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdmFsdWU6IHguZnVuY3Rpb25OYW1lLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFzKGNvbmZpZzogQXBwQ29uZmlnKTogTm9kZWpzRnVuY3Rpb25bXSB7XHJcbiAgICBjb25zdCBjcmVhdGVkTGFtYmRhczogTm9kZWpzRnVuY3Rpb25bXSA9IHRoaXMuY3JlYXRlTGFtYmRhRnVuY3Rpb25zKFxyXG4gICAgICB0aGlzLnNjb3BlLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIHRoaXMubGF5ZXJzXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVkTGFtYmRhcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTGFtYmRhRnVuY3Rpb25zKFxyXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcclxuICAgIHJvbGU/OiBJUm9sZSxcclxuICAgIGxheWVycz86IExheWVyVmVyc2lvbltdXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjcmVhdGVkTGFtYmRhcyA9IHRoaXMuY29uZmlnLlJFU09VUkNFUy5MQU1CREEubWFwKFxyXG4gICAgICAoY29uZmlnOiBUc2dMYW1iZGFQcm9wKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhbWJkYVByb3BzID0gdGhpcy5jcmVhdGVMYW1iZGFQcm9wcyhjb25maWcsIHJvbGUsIGxheWVycyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxhbWJkYUlkID0gQ3JlYXRlTGFtYmRhLmdldElkRm9yTGFtYmRhKGNvbmZpZywgdGhpcy5jb25maWcpO1xyXG4gICAgICAgIGxldCBmY3RuID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHNjb3BlLCBsYW1iZGFJZCwgbGFtYmRhUHJvcHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmN0bjtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlZExhbWJkYXMgfHwgW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUxhbWJkYVByb3BzKFxyXG4gICAgcHJvcDogVHNnTGFtYmRhUHJvcCxcclxuICAgIHJvbGU/OiBJUm9sZSxcclxuICAgIGxheWVycz86IExheWVyVmVyc2lvbltdLFxyXG4gICAgcHJvcHM/OiBUc2dMYW1iZGFQcm9wc1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTGFtYmRhRnVuY3Rpb25Qcm9wcyh7XHJcbiAgICAgIHByb3AsXHJcbiAgICAgIHJvbGUsXHJcbiAgICAgIGxheWVycyxcclxuICAgICAgcHJvcHMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTGFtYmRhRnVuY3Rpb25Qcm9wcyhwcm9wczogQ3JlYXRlTGFtYmRhRnVuY3Rpb25JbnB1dCkge1xyXG4gICAgY29uc3QgeyBwcm9wLCByb2xlLCBsYXllcnMgfSA9IHByb3BzO1xyXG5cclxuICAgIC8vIENyZWF0ZSBleHBsaWNpdCBMb2dHcm91cCB0byBhdm9pZCBkZXByZWNhdGVkIGBsb2dSZXRlbnRpb25gXHJcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7cHJvcC5uYW1lfWA7XHJcbiAgICBjb25zdCBsb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLnNjb3BlLCBgJHtmdW5jdGlvbk5hbWV9LWxvZ3NgLCB7XHJcbiAgICAgIHJldGVudGlvbjogIXByb3AubG9nRHVyYXRpb25cclxuICAgICAgICA/IFJldGVudGlvbkRheXMuRklWRV9EQVlTXHJcbiAgICAgICAgOiBMYW1iZGFIZWxwZXIuZ2V0RGF5VG9TYXZlTG9ncyhwcm9wLmxvZ0R1cmF0aW9uKSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGxhbWJkYVByb3A6IE5vZGVqc0Z1bmN0aW9uUHJvcHMgPSB7XHJcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4ocHJvcC5jb2RlUGF0aCksXHJcbiAgICAgIGZ1bmN0aW9uTmFtZSxcclxuICAgICAgaGFuZGxlcjogcHJvcC5oYW5kbGVyLFxyXG4gICAgICBsb2dHcm91cCxcclxuICAgICAgcnVudGltZTogcHJvcC5ydW50aW1lIHx8IHRoaXMuY29uZmlnLkdMT0JBTFMuc3RhY2tSdW50aW1lLFxyXG4gICAgICB0aW1lb3V0OiBwcm9wLmR1cmF0aW9uIHx8IER1cmF0aW9uLm1pbnV0ZXMoMiksXHJcbiAgICAgIG1lbW9yeVNpemU6IHByb3AubWVtb3J5IHx8IDUxMixcclxuICAgICAgZW52aXJvbm1lbnQ6IHtcclxuICAgICAgICBWRVJCT1NFX0xPR0dJTkc6IFwidHJ1ZVwiLFxyXG4gICAgICAgIC4uLnByb3AuZW52aXJvbm1lbnQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGJ1bmRsaW5nOiB7XHJcbiAgICAgICAgbWluaWZ5OiBmYWxzZSxcclxuICAgICAgICB0YXJnZXQ6IFwiZXMyMDIwXCIsXHJcbiAgICAgICAgc291cmNlTWFwOiB0cnVlLFxyXG4gICAgICAgIHNvdXJjZU1hcE1vZGU6IFNvdXJjZU1hcE1vZGUuRVhURVJOQUwsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6IHByb3AuZW52aXJvbm1lbnQgfHwgcHJvcC5lbnZpcm9ubWVudCxcclxuICAgICAgfSxcclxuICAgICAgcm9sZSxcclxuICAgICAgbGF5ZXJzLFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbGFtYmRhUHJvcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQWxhcm1zRm9yTGFtYmRhcyhsYW1iZGFzOiBOb2RlanNGdW5jdGlvbltdKSB7XHJcbiAgICBjb25zdCBsYW1iZGFSZWNvcmRzID0gdGhpcy5jcmVhdGVSZWNvcmRGb3JMYW1iZGEobGFtYmRhcyk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coJ0xhbWJkYSBSZWNvcmRzOicsIGxhbWJkYVJlY29yZHMpO1xyXG4gICAgLy8gY29uc3QgbGFtYmRhTmFtZXMgPSBPYmplY3Qua2V5cyhsYW1iZGFSZWNvcmRzKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdsYW1iZGEgTmFtZXMgZnJvbSBSZWNvcmRzJywgbGFtYmRhTmFtZXMpO1xyXG5cclxuICAgIGxhbWJkYXMuZm9yRWFjaCgobGFtYmRhLCBpZHgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JNZXRyaWMgPSBsYW1iZGEubWV0cmljRXJyb3JzKHtcclxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMyksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZHVyYXRpb25NZXRyaWMgPSBsYW1iZGEubWV0cmljRHVyYXRpb24oe1xyXG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcygzKSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBpbnZvY2F0aW9uTWV0cmljID0gbGFtYmRhLm1ldHJpY0ludm9jYXRpb25zKHtcclxuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMyksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgdXVpZCA9IGdldFVVSUQoKS5zcGxpdChcIi1cIilbMF07XHJcblxyXG4gICAgICBuZXcgQWxhcm0oXHJcbiAgICAgICAgdGhpcy5zY29wZSxcclxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9LWVycm9yLWFsYXJtYCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtZXRyaWM6IGVycm9yTWV0cmljLFxyXG4gICAgICAgICAgdGhyZXNob2xkOiA1LFxyXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOlxyXG4gICAgICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcclxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAzLFxyXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYCR7dGhpcy5jb25maWcuQXBwUHJlZml4fSBlcnJvcnMgb3ZlciAzIG1pbiBwZXJpb2RgLFxyXG4gICAgICAgICAgYWxhcm1OYW1lOiBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9LWVycm9yLWFsYXJtYCxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBuZXcgQWxhcm0oXHJcbiAgICAgICAgdGhpcy5zY29wZSxcclxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9LWR1cmF0aW9uLWFsYXJtYCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtZXRyaWM6IGR1cmF0aW9uTWV0cmljLFxyXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxyXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOlxyXG4gICAgICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcclxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAzLFxyXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYCR7dGhpcy5jb25maWcuQXBwUHJlZml4fS0ke2xhbWJkYS5ub2RlLmlkfSBkdXJhdGlvbiBlcnJvcnMgb3ZlciAzIG1pbiBwZXJpb2RgLFxyXG4gICAgICAgICAgYWxhcm1OYW1lOiBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9LWR1cmF0aW9uLWFsYXJtYCxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBpbnZvY2F0aW9uQWxhcm0gPSBuZXcgQWxhcm0oXHJcbiAgICAgICAgdGhpcy5zY29wZSxcclxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9LWludm9jYXRpb24tYWxhcm1gLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG1ldHJpYzogZXJyb3JNZXRyaWMsXHJcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEwMDAsXHJcbiAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6XHJcbiAgICAgICAgICAgIENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxyXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDMsXHJcbiAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBgJHt0aGlzLmNvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhLm5vZGUuaWR9IGVycm9ycyBvdmVyIDMgbWluIHBlcmlvZGAsXHJcbiAgICAgICAgICBhbGFybU5hbWU6IGAke3RoaXMuY29uZmlnLkFwcFByZWZpeH0tJHtsYW1iZGEubm9kZS5pZH0taW52b2NhdGlvbi1NZXRyaWMtYWxhcm1gLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRJZEZvckxhbWJkYShcclxuICAgIGxhbWJkYVByb3A6IFRzZ0xhbWJkYVByb3AsXHJcbiAgICBhcHBDb25maWc6IEFwcENvbmZpZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIGAke2FwcENvbmZpZy5BcHBQcmVmaXh9LSR7bGFtYmRhUHJvcC5uYW1lfWAudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUmVjb3JkRm9yTGFtYmRhKGxhbWJkYXM6IE5vZGVqc0Z1bmN0aW9uW10pIHtcclxuICAgIGNvbnN0IG5hbWVzID0gdGhpcy5jb25maWcuUkVTT1VSQ0VTLkxBTUJEQS5tYXAoKGxhbWJkYSkgPT4ge1xyXG4gICAgICByZXR1cm4gbGFtYmRhLm5hbWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBsYW1iZGFOYW1lcyA9IFsuLi5uYW1lc10gYXMgY29uc3Q7XHJcblxyXG4gICAgdHlwZSBMYW1iZGFOYW1lID0gKHR5cGVvZiBsYW1iZGFOYW1lcylbbnVtYmVyXTtcclxuXHJcbiAgICBjb25zdCBsYW1iZGFSZWNvcmQ6IFJlY29yZDxMYW1iZGFOYW1lLCBOb2RlanNGdW5jdGlvbj4gPSB7fSBhcyBSZWNvcmQ8XHJcbiAgICAgIExhbWJkYU5hbWUsXHJcbiAgICAgIE5vZGVqc0Z1bmN0aW9uXHJcbiAgICA+O1xyXG5cclxuICAgIGxhbWJkYXMuZm9yRWFjaCgobGFtYmRhLCBpZHgpID0+IHtcclxuICAgICAgbGFtYmRhUmVjb3JkW2xhbWJkYU5hbWVzW2lkeF0gYXMgTGFtYmRhTmFtZV0gPSBsYW1iZGFzW2lkeF07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbGFtYmRhUmVjb3JkO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -2,20 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSQSResource = void 0;
4
4
  const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
5
+ const core_1 = require("aws-cdk-lib/core");
5
6
  const createSQSResource = (scope, queueName) => {
6
- const dlQueue = new aws_sqs_1.Queue(scope, `sqs-queue-dl-${queueName} `, {
7
- queueName: `${queueName}-dead-letter-queue`,
7
+ const stackSuffix = core_1.Stack.of(scope).stackName;
8
+ const physicalQueueName = `${queueName}-${stackSuffix}`;
9
+ const physicalDlqName = `${queueName}-dead-letter-queue-${stackSuffix}`;
10
+ const dlQueue = new aws_sqs_1.Queue(scope, `sqs-queue-dl-${physicalQueueName}`, {
11
+ queueName: physicalDlqName,
8
12
  });
9
13
  const queueProp = {
10
- queueName,
14
+ queueName: physicalQueueName,
11
15
  deadLetterQueue: {
12
16
  queue: dlQueue,
13
- maxReceiveCount: 5
14
- }
17
+ maxReceiveCount: 5,
18
+ },
15
19
  };
16
20
  // SQS resource creation logic goes here
17
- const createdQueue = new aws_sqs_1.Queue(scope, `sqs-queue-${queueName}`, queueProp);
21
+ const createdQueue = new aws_sqs_1.Queue(scope, `sqs-queue-${physicalQueueName}`, queueProp);
18
22
  return createdQueue;
19
23
  };
20
24
  exports.createSQSResource = createSQSResource;
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXNxcy1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvc3FzL2NyZWF0ZS1zcXMtcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXdEO0FBR2pELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFnQixFQUFFLFNBQWlCLEVBQUUsRUFBRTtJQUVyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLFNBQVMsR0FBRyxFQUFFO1FBQy9ELFNBQVMsRUFBRSxHQUFHLFNBQVMsb0JBQW9CO0tBQzVDLENBQUMsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFlO1FBQzFCLFNBQVM7UUFDVCxlQUFlLEVBQUU7WUFDYixLQUFLLEVBQUUsT0FBTztZQUNkLGVBQWUsRUFBRSxDQUFDO1NBQ3JCO0tBQ0osQ0FBQztJQUVGLHdDQUF3QztJQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxTQUFTLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUUzRSxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDLENBQUM7QUFsQlcsUUFBQSxpQkFBaUIscUJBa0I1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFF1ZXVlLCBRdWV1ZVByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVTUVNSZXNvdXJjZSA9IChzY29wZTogQ29uc3RydWN0LCBxdWV1ZU5hbWU6IHN0cmluZykgPT4ge1xyXG4gIFxyXG4gICAgY29uc3QgZGxRdWV1ZSA9IG5ldyBRdWV1ZShzY29wZSwgYHNxcy1xdWV1ZS1kbC0ke3F1ZXVlTmFtZX0gYCwge1xyXG4gICAgcXVldWVOYW1lOiBgJHtxdWV1ZU5hbWV9LWRlYWQtbGV0dGVyLXF1ZXVlYCwgICAgICAgIFxyXG4gIH0pO1xyXG5cclxuICAgIGNvbnN0IHF1ZXVlUHJvcDogUXVldWVQcm9wcyA9IHtcclxuICAgICAgICBxdWV1ZU5hbWUsXHJcbiAgICAgICAgZGVhZExldHRlclF1ZXVlOiB7XHJcbiAgICAgICAgICAgIHF1ZXVlOiBkbFF1ZXVlLFxyXG4gICAgICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IDVcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gIFxyXG4gICAgLy8gU1FTIHJlc291cmNlIGNyZWF0aW9uIGxvZ2ljIGdvZXMgaGVyZVxyXG4gIGNvbnN0IGNyZWF0ZWRRdWV1ZSA9IG5ldyBRdWV1ZShzY29wZSwgYHNxcy1xdWV1ZS0ke3F1ZXVlTmFtZX1gLCBxdWV1ZVByb3ApO1xyXG5cclxuICByZXR1cm4gY3JlYXRlZFF1ZXVlO1xyXG59O1xyXG4iXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXNxcy1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvc3FzL2NyZWF0ZS1zcXMtcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXdEO0FBQ3hELDJDQUF5QztBQUdsQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBZ0IsRUFBRSxTQUFpQixFQUFFLEVBQUU7SUFDdkUsTUFBTSxXQUFXLEdBQUcsWUFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUN4RCxNQUFNLGVBQWUsR0FBRyxHQUFHLFNBQVMsc0JBQXNCLFdBQVcsRUFBRSxDQUFDO0lBRXhFLE1BQU0sT0FBTyxHQUFHLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsaUJBQWlCLEVBQUUsRUFBRTtRQUNwRSxTQUFTLEVBQUUsZUFBZTtLQUMzQixDQUFDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBZTtRQUM1QixTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLGVBQWUsRUFBRTtZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsZUFBZSxFQUFFLENBQUM7U0FDbkI7S0FDRixDQUFDO0lBRUYsd0NBQXdDO0lBQzFDLE1BQU0sWUFBWSxHQUFHLElBQUksZUFBSyxDQUFDLEtBQUssRUFBRSxhQUFhLGlCQUFpQixFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFbkYsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBckJXLFFBQUEsaUJBQWlCLHFCQXFCNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBRdWV1ZSwgUXVldWVQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3FzXCI7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVTUVNSZXNvdXJjZSA9IChzY29wZTogQ29uc3RydWN0LCBxdWV1ZU5hbWU6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHN0YWNrU3VmZml4ID0gU3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZTtcclxuICBjb25zdCBwaHlzaWNhbFF1ZXVlTmFtZSA9IGAke3F1ZXVlTmFtZX0tJHtzdGFja1N1ZmZpeH1gO1xyXG4gIGNvbnN0IHBoeXNpY2FsRGxxTmFtZSA9IGAke3F1ZXVlTmFtZX0tZGVhZC1sZXR0ZXItcXVldWUtJHtzdGFja1N1ZmZpeH1gO1xyXG5cclxuICBjb25zdCBkbFF1ZXVlID0gbmV3IFF1ZXVlKHNjb3BlLCBgc3FzLXF1ZXVlLWRsLSR7cGh5c2ljYWxRdWV1ZU5hbWV9YCwge1xyXG4gICAgcXVldWVOYW1lOiBwaHlzaWNhbERscU5hbWUsXHJcbiAgfSk7XHJcblxyXG4gICAgY29uc3QgcXVldWVQcm9wOiBRdWV1ZVByb3BzID0ge1xyXG4gICAgICBxdWV1ZU5hbWU6IHBoeXNpY2FsUXVldWVOYW1lLFxyXG4gICAgICBkZWFkTGV0dGVyUXVldWU6IHtcclxuICAgICAgICBxdWV1ZTogZGxRdWV1ZSxcclxuICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IDUsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIFxyXG4gICAgLy8gU1FTIHJlc291cmNlIGNyZWF0aW9uIGxvZ2ljIGdvZXMgaGVyZVxyXG4gIGNvbnN0IGNyZWF0ZWRRdWV1ZSA9IG5ldyBRdWV1ZShzY29wZSwgYHNxcy1xdWV1ZS0ke3BoeXNpY2FsUXVldWVOYW1lfWAsIHF1ZXVlUHJvcCk7XHJcblxyXG4gIHJldHVybiBjcmVhdGVkUXVldWU7XHJcbn07XHJcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sylvesterllc/aws-constructs",
3
- "version": "1.1.44",
3
+ "version": "1.1.45",
4
4
  "description": "AWS Constructs",
5
5
  "main": "dist/index.js",
6
6
  "keywords": [
@@ -1,112 +1,115 @@
1
1
  import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
2
- import { AttributeType, BillingMode, GlobalSecondaryIndexProps, ProjectionType, Table, TableProps } from "aws-cdk-lib/aws-dynamodb";
2
+ import {
3
+ AttributeType,
4
+ BillingMode,
5
+ GlobalSecondaryIndexProps,
6
+ ProjectionType,
7
+ Table,
8
+ TableProps,
9
+ } from "aws-cdk-lib/aws-dynamodb";
3
10
  import { Construct } from "constructs";
4
11
  import { TsgBaseResource } from "../base/tsgBaseResource";
5
12
 
6
-
7
- export class CreateDynamoSingleTableDesign extends TsgBaseResource<Table, string> {
8
-
9
- static ReadWriteActions: string[] = [
10
- "dynamodb:BatchGetItem",
11
- "dynamodb:BatchWriteItem",
12
- "dynamodb:ConditionCheckItem",
13
- "dynamodb:DeleteItem",
14
- "dynamodb:DescribeTable",
15
- "dynamodb:GetItem",
16
- "dynamodb:GetRecords",
17
- "dynamodb:GetShardIterator",
18
- "dynamodb:PutItem",
19
- "dynamodb:Query",
20
- "dynamodb:Scan",
21
- "dynamodb:UpdateItem",
13
+ export class CreateDynamoSingleTableDesign extends TsgBaseResource<
14
+ Table,
15
+ string
16
+ > {
17
+ static ReadWriteActions: string[] = [
18
+ "dynamodb:BatchGetItem",
19
+ "dynamodb:BatchWriteItem",
20
+ "dynamodb:ConditionCheckItem",
21
+ "dynamodb:DeleteItem",
22
+ "dynamodb:DescribeTable",
23
+ "dynamodb:GetItem",
24
+ "dynamodb:GetRecords",
25
+ "dynamodb:GetShardIterator",
26
+ "dynamodb:PutItem",
27
+ "dynamodb:Query",
28
+ "dynamodb:Scan",
29
+ "dynamodb:UpdateItem",
30
+ ];
31
+
32
+ get CreatedTable() {
33
+ return this.createdResource;
34
+ }
35
+
36
+ constructor(protected scope: Construct, protected tableName: string) {
37
+ super(scope, tableName);
38
+ }
39
+
40
+ protected createResource(scope: Construct): Table {
41
+ const dbTable = new Table(scope, `${this.tableName}`, {
42
+ tableName: this.tableName,
43
+ removalPolicy: RemovalPolicy.DESTROY,
44
+
45
+ partitionKey: {
46
+ name: "pk",
47
+ type: AttributeType.STRING,
48
+ },
49
+ sortKey: {
50
+ name: "sk",
51
+ type: AttributeType.STRING,
52
+ },
53
+ billingMode: BillingMode.PAY_PER_REQUEST,
54
+ });
55
+
56
+ const gsiIndexes = [
57
+ {
58
+ indexName: "gsi1Index",
59
+ partitionKey: {
60
+ name: "gsi1pk",
61
+ type: AttributeType.STRING,
62
+ },
63
+ sortKey: {
64
+ name: "gsi1sk",
65
+ type: AttributeType.STRING,
66
+ },
67
+ projectionType: ProjectionType.ALL,
68
+ },
69
+ {
70
+ indexName: "gsi2Index",
71
+ partitionKey: {
72
+ name: "gsi2pk",
73
+ type: AttributeType.STRING,
74
+ },
75
+ sortKey: {
76
+ name: "gsi2sk",
77
+ type: AttributeType.STRING,
78
+ },
79
+ projectionType: ProjectionType.ALL,
80
+ },
81
+ {
82
+ indexName: "gsi3Index",
83
+ partitionKey: {
84
+ name: "gsi3pk",
85
+ type: AttributeType.STRING,
86
+ },
87
+ sortKey: {
88
+ name: "gsi3sk",
89
+ type: AttributeType.STRING,
90
+ },
91
+ projectionType: ProjectionType.ALL,
92
+ },
22
93
  ];
23
94
 
24
- get CreatedTable() {
25
- return this.createdResource;
26
- }
27
-
28
- constructor(protected scope: Construct, protected tableName: string) {
29
- super(scope, tableName);
30
- }
31
-
32
- protected createResource(scope: Construct): Table {
33
-
34
- const dbTable = new Table(scope, `${this.tableName}`, {
35
- tableName: this.tableName,
36
- removalPolicy: RemovalPolicy.DESTROY,
37
-
38
- partitionKey: {
39
- name: 'pk',
40
- type: AttributeType.STRING,
41
- },
42
- sortKey: {
43
- name: 'sk',
44
- type: AttributeType.STRING,
45
- },
46
- billingMode: BillingMode.PAY_PER_REQUEST,
47
- });
48
-
49
- const gsiIndexes = [
50
- {
51
- indexName: 'gsi1Index',
52
- partitionKey: {
53
- name: 'gsi1pk',
54
- type: AttributeType.STRING
55
- },
56
- sortKey: {
57
- name: 'gsi1sk',
58
- type: AttributeType.STRING
59
- },
60
- projectionType: ProjectionType.ALL
61
- },
62
- {
63
- indexName: 'gsi2Index',
64
- partitionKey: {
65
- name: 'gsi2pk',
66
- type: AttributeType.STRING
67
- },
68
- sortKey: {
69
- name: 'gsi2sk',
70
- type: AttributeType.STRING
71
- },
72
- projectionType: ProjectionType.ALL
73
- },
74
- {
75
- indexName: 'gsi3Index',
76
- partitionKey: {
77
- name: 'gsi3pk',
78
- type: AttributeType.STRING
79
- },
80
- sortKey: {
81
- name: 'gsi3sk',
82
- type: AttributeType.STRING
83
- },
84
- projectionType: ProjectionType.ALL
85
- },
86
- ];
87
-
88
- gsiIndexes.map((gsi) => {
89
-
90
- const gsiProps: GlobalSecondaryIndexProps = {
91
- indexName: gsi.indexName,
92
- partitionKey: gsi.partitionKey,
93
- sortKey: gsi.sortKey,
94
- projectionType: gsi.projectionType
95
-
96
- };
97
-
98
- dbTable.addGlobalSecondaryIndex(gsiProps);
99
- });
100
-
101
- return dbTable;
102
- }
103
-
104
-
105
- protected createOutput<T>(scope: Construct): void {
106
-
107
- new CfnOutput(scope, `dynamoTable-${this.CreatedTable?.tableName}`, {
108
- value: `Table Name: ${this.createdResource?.tableName}\t Table Arn: ${this.createdResource?.tableArn}`
109
- });
110
-
111
- }
112
- }
95
+ gsiIndexes.map((gsi) => {
96
+ const gsiProps: GlobalSecondaryIndexProps = {
97
+ indexName: gsi.indexName,
98
+ partitionKey: gsi.partitionKey,
99
+ sortKey: gsi.sortKey,
100
+ projectionType: gsi.projectionType,
101
+ };
102
+
103
+ dbTable.addGlobalSecondaryIndex(gsiProps);
104
+ });
105
+
106
+ return dbTable;
107
+ }
108
+
109
+ protected createOutput<T>(scope: Construct): void {
110
+ // Logical IDs must not include unresolved tokens; use a stable ID
111
+ new CfnOutput(scope, "dynamoTable", {
112
+ value: `Table Name: ${this.createdResource?.tableName}\t Table Arn: ${this.createdResource?.tableArn}`,
113
+ });
114
+ }
115
+ }
@@ -1,203 +1,239 @@
1
1
  import { CfnOutput, Duration } from "aws-cdk-lib";
2
2
  import { TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
3
- import { Alarm, ComparisonOperator, IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
3
+ import {
4
+ Alarm,
5
+ ComparisonOperator,
6
+ IAlarmAction,
7
+ } from "aws-cdk-lib/aws-cloudwatch";
4
8
  import { IRole, ManagedPolicy } from "aws-cdk-lib/aws-iam";
5
9
  import { LayerVersion, Runtime } from "aws-cdk-lib/aws-lambda";
6
- import { NodejsFunction, NodejsFunctionProps, SourceMapMode } from "aws-cdk-lib/aws-lambda-nodejs";
10
+ import {
11
+ NodejsFunction,
12
+ NodejsFunctionProps,
13
+ SourceMapMode,
14
+ } from "aws-cdk-lib/aws-lambda-nodejs";
7
15
  import { Construct } from "constructs";
8
- import * as path from 'path';
16
+ import * as path from "path";
9
17
  import { AppConfig } from "../../config/AppConfig";
10
18
  import { TsgLambdaProp } from "../../config/types";
11
19
 
12
20
  import { TsgLambdaProps } from "../../config/types/TsgLambdaProps";
13
21
  import { CreateLambdaFunctionInput } from "../../interfaces/CreateLambdaFunctionInput";
14
22
  import { BaseResource } from "../base/baseResource";
15
- import { RetentionDays } from "aws-cdk-lib/aws-logs";
23
+ import { LogGroup, RetentionDays } from "aws-cdk-lib/aws-logs";
16
24
  import { LambdaHelper } from "./lambdaHelper";
17
25
  import { getUUID } from "../../helpers/util-helper";
18
26
 
19
-
20
27
  export class CreateLambda extends BaseResource<NodejsFunction> {
21
-
22
- public Lambdas: NodejsFunction[] = [];
23
- public LambdaRecords: Record<string, NodejsFunction> = {};
24
-
25
- constructor(scope: Construct, config: AppConfig, private layers?: LayerVersion[]) {
26
- super(scope, config);
27
-
28
- const resources = this.createResource(scope);
29
-
30
- this.createdResources = [...resources];
31
-
32
- this.Lambdas = [...resources];
33
-
34
- this.createAlarmsForLambdas(this.Lambdas);
35
-
36
- this.LambdaRecords = this.createRecordForLambda(this.Lambdas);
37
-
38
- this.createOutput(scope, resources);
39
- }
40
-
41
- protected createResource(scope: Construct): NodejsFunction[] {
42
-
43
- const result = this.createLambdas(this.config);
44
-
45
- return result;
46
- }
47
-
48
- protected createOutput<T>(scope: Construct, createdAssets: T[]): void {
49
- createdAssets.forEach((x, idx) => {
50
-
51
- new CfnOutput(scope, `lambda-${idx}`, {
52
- // @ts-ignore
53
- value: x.functionName
54
- });
55
- });
56
- }
57
-
58
- private createLambdas(config: AppConfig): NodejsFunction[] {
59
-
60
- const createdLambdas: NodejsFunction[] = this.createLambdaFunctions(this.scope, undefined, this.layers);
61
-
62
- return createdLambdas;
63
- }
64
-
65
- private createLambdaFunctions(scope: Construct, role?: IRole, layers?: LayerVersion[]) {
66
-
67
- const createdLambdas = this.config.RESOURCES.LAMBDA.map((config: TsgLambdaProp) => {
68
-
69
- let lambdaProps = this.createLambdaProps(config, role, layers);
70
-
71
- const lambdaId = CreateLambda.getIdForLambda(config, this.config);
72
- let fctn = new NodejsFunction(scope, lambdaId, lambdaProps);
73
-
74
- return fctn;
75
- });
76
-
77
- return createdLambdas || [];
78
- }
79
-
80
- private createLambdaProps(prop: TsgLambdaProp, role?: IRole, layers?: LayerVersion[], props?: TsgLambdaProps) {
81
-
82
- return this.createLambdaFunctionProps({
83
- prop,
84
- role,
85
- layers,
86
- props
87
- });
88
- }
89
-
90
- private createLambdaFunctionProps(props: CreateLambdaFunctionInput) {
91
- const { prop, role, layers } = props;
92
-
93
- const lambdaProp: NodejsFunctionProps = {
94
- entry: path.join(prop.codePath),
95
- functionName: `${this.config.AppPrefix}-${prop.name}`,
96
- handler: prop.handler,
97
- logRetention: (!prop.logDuration) ? RetentionDays.FIVE_DAYS : LambdaHelper.getDayToSaveLogs(prop.logDuration),
98
- runtime: prop.runtime || this.config.GLOBALS.stackRuntime,
99
- timeout: prop.duration || Duration.minutes(2),
100
- memorySize: prop.memory || 512,
101
- environment: {
102
- "VERBOSE_LOGGING": "true",
103
- ...prop.environment
104
- },
105
- bundling: {
106
- minify: false,
107
- target: 'es2020',
108
- sourceMap: true,
109
- sourceMapMode: SourceMapMode.EXTERNAL,
110
- environment: prop.environment || prop.environment,
111
- },
112
- role,
113
- layers
114
-
115
- }
116
-
117
- return lambdaProp;
28
+ public Lambdas: NodejsFunction[] = [];
29
+ public LambdaRecords: Record<string, NodejsFunction> = {};
30
+
31
+ constructor(
32
+ scope: Construct,
33
+ config: AppConfig,
34
+ private layers?: LayerVersion[]
35
+ ) {
36
+ super(scope, config);
37
+
38
+ const resources = this.createResource(scope);
39
+
40
+ this.createdResources = [...resources];
41
+
42
+ this.Lambdas = [...resources];
43
+
44
+ this.createAlarmsForLambdas(this.Lambdas);
45
+
46
+ this.LambdaRecords = this.createRecordForLambda(this.Lambdas);
47
+
48
+ this.createOutput(scope, resources);
49
+ }
50
+
51
+ protected createResource(scope: Construct): NodejsFunction[] {
52
+ const result = this.createLambdas(this.config);
53
+
54
+ return result;
55
+ }
56
+
57
+ protected createOutput<T>(scope: Construct, createdAssets: T[]): void {
58
+ createdAssets.forEach((x, idx) => {
59
+ new CfnOutput(scope, `lambda-${idx}`, {
60
+ // @ts-ignore
61
+ value: x.functionName,
62
+ });
63
+ });
64
+ }
65
+
66
+ private createLambdas(config: AppConfig): NodejsFunction[] {
67
+ const createdLambdas: NodejsFunction[] = this.createLambdaFunctions(
68
+ this.scope,
69
+ undefined,
70
+ this.layers
71
+ );
72
+
73
+ return createdLambdas;
74
+ }
75
+
76
+ private createLambdaFunctions(
77
+ scope: Construct,
78
+ role?: IRole,
79
+ layers?: LayerVersion[]
80
+ ) {
81
+ const createdLambdas = this.config.RESOURCES.LAMBDA.map(
82
+ (config: TsgLambdaProp) => {
83
+ let lambdaProps = this.createLambdaProps(config, role, layers);
84
+
85
+ const lambdaId = CreateLambda.getIdForLambda(config, this.config);
86
+ let fctn = new NodejsFunction(scope, lambdaId, lambdaProps);
87
+
88
+ return fctn;
89
+ }
90
+ );
91
+
92
+ return createdLambdas || [];
93
+ }
94
+
95
+ private createLambdaProps(
96
+ prop: TsgLambdaProp,
97
+ role?: IRole,
98
+ layers?: LayerVersion[],
99
+ props?: TsgLambdaProps
100
+ ) {
101
+ return this.createLambdaFunctionProps({
102
+ prop,
103
+ role,
104
+ layers,
105
+ props,
106
+ });
107
+ }
108
+
109
+ private createLambdaFunctionProps(props: CreateLambdaFunctionInput) {
110
+ const { prop, role, layers } = props;
111
+
112
+ // Create explicit LogGroup to avoid deprecated `logRetention`
113
+ const functionName = `${this.config.AppPrefix}-${prop.name}`;
114
+ const logGroup = new LogGroup(this.scope, `${functionName}-logs`, {
115
+ retention: !prop.logDuration
116
+ ? RetentionDays.FIVE_DAYS
117
+ : LambdaHelper.getDayToSaveLogs(prop.logDuration),
118
+ });
119
+
120
+ const lambdaProp: NodejsFunctionProps = {
121
+ entry: path.join(prop.codePath),
122
+ functionName,
123
+ handler: prop.handler,
124
+ logGroup,
125
+ runtime: prop.runtime || this.config.GLOBALS.stackRuntime,
126
+ timeout: prop.duration || Duration.minutes(2),
127
+ memorySize: prop.memory || 512,
128
+ environment: {
129
+ VERBOSE_LOGGING: "true",
130
+ ...prop.environment,
131
+ },
132
+ bundling: {
133
+ minify: false,
134
+ target: "es2020",
135
+ sourceMap: true,
136
+ sourceMapMode: SourceMapMode.EXTERNAL,
137
+ environment: prop.environment || prop.environment,
138
+ },
139
+ role,
140
+ layers,
118
141
  };
119
142
 
120
- private createAlarmsForLambdas(lambdas: NodejsFunction[]) {
121
-
122
- const lambdaRecords = this.createRecordForLambda(lambdas);
123
-
124
- // console.log('Lambda Records:', lambdaRecords);
125
- // const lambdaNames = Object.keys(lambdaRecords);
126
- // console.log('lambda Names from Records', lambdaNames);
127
-
128
- lambdas.forEach((lambda, idx) => {
129
-
130
- const errorMetric = lambda.metricErrors({
131
- period: Duration.minutes(3),
132
-
133
- });
134
-
135
- const durationMetric = lambda.metricDuration({
136
- period: Duration.minutes(3),
137
- });
138
-
139
- const invocationMetric = lambda.metricInvocations({
140
- period: Duration.minutes(3),
141
- });
142
-
143
- const uuid = getUUID().split('-')[0];
144
-
145
- new Alarm(this.scope, `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`, {
146
- metric: errorMetric,
147
- threshold: 5,
148
- comparisonOperator: ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
149
- evaluationPeriods: 3,
150
- alarmDescription: `${this.config.AppPrefix} errors over 3 min period`,
151
- alarmName: `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`
152
- });
153
-
154
- new Alarm(this.scope, `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`, {
155
- metric: durationMetric,
156
- threshold: 1,
157
- comparisonOperator: ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
158
- evaluationPeriods: 3,
159
- alarmDescription: `${this.config.AppPrefix}-${lambda.node.id} duration errors over 3 min period`,
160
- alarmName: `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`
161
- });
162
-
163
- const invocationAlarm = new Alarm(this.scope, `${this.config.AppPrefix}-${lambda.node.id}-invocation-alarm`, {
164
- metric: errorMetric,
165
- threshold: 1000,
166
- comparisonOperator: ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
167
- evaluationPeriods: 3,
168
- alarmDescription: `${this.config.AppPrefix}-${lambda.node.id} errors over 3 min period`,
169
- alarmName: `${this.config.AppPrefix}-${lambda.node.id}-invocation-Metric-alarm`
170
- });
171
- });
172
- }
173
-
174
- public static getIdForLambda(lambdaProp: TsgLambdaProp, appConfig: AppConfig) {
175
- return `${appConfig.AppPrefix}-${lambdaProp.name}`.toLowerCase();
176
- }
177
-
178
- private createRecordForLambda(lambdas: NodejsFunction[]) {
179
-
180
- const names = this.config.RESOURCES.LAMBDA.map((lambda) => {
181
- return lambda.name;
182
- });
183
-
184
- const lambdaNames = [...names] as const;
143
+ return lambdaProp;
144
+ }
145
+
146
+ private createAlarmsForLambdas(lambdas: NodejsFunction[]) {
147
+ const lambdaRecords = this.createRecordForLambda(lambdas);
148
+
149
+ // console.log('Lambda Records:', lambdaRecords);
150
+ // const lambdaNames = Object.keys(lambdaRecords);
151
+ // console.log('lambda Names from Records', lambdaNames);
152
+
153
+ lambdas.forEach((lambda, idx) => {
154
+ const errorMetric = lambda.metricErrors({
155
+ period: Duration.minutes(3),
156
+ });
157
+
158
+ const durationMetric = lambda.metricDuration({
159
+ period: Duration.minutes(3),
160
+ });
161
+
162
+ const invocationMetric = lambda.metricInvocations({
163
+ period: Duration.minutes(3),
164
+ });
165
+
166
+ const uuid = getUUID().split("-")[0];
167
+
168
+ new Alarm(
169
+ this.scope,
170
+ `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`,
171
+ {
172
+ metric: errorMetric,
173
+ threshold: 5,
174
+ comparisonOperator:
175
+ ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
176
+ evaluationPeriods: 3,
177
+ alarmDescription: `${this.config.AppPrefix} errors over 3 min period`,
178
+ alarmName: `${this.config.AppPrefix}-${lambda.node.id}-error-alarm`,
179
+ }
180
+ );
181
+
182
+ new Alarm(
183
+ this.scope,
184
+ `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`,
185
+ {
186
+ metric: durationMetric,
187
+ threshold: 1,
188
+ comparisonOperator:
189
+ ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
190
+ evaluationPeriods: 3,
191
+ alarmDescription: `${this.config.AppPrefix}-${lambda.node.id} duration errors over 3 min period`,
192
+ alarmName: `${this.config.AppPrefix}-${lambda.node.id}-duration-alarm`,
193
+ }
194
+ );
195
+
196
+ const invocationAlarm = new Alarm(
197
+ this.scope,
198
+ `${this.config.AppPrefix}-${lambda.node.id}-invocation-alarm`,
199
+ {
200
+ metric: errorMetric,
201
+ threshold: 1000,
202
+ comparisonOperator:
203
+ ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
204
+ evaluationPeriods: 3,
205
+ alarmDescription: `${this.config.AppPrefix}-${lambda.node.id} errors over 3 min period`,
206
+ alarmName: `${this.config.AppPrefix}-${lambda.node.id}-invocation-Metric-alarm`,
207
+ }
208
+ );
209
+ });
210
+ }
185
211
 
186
- type LambdaName = typeof lambdaNames[number];
212
+ public static getIdForLambda(
213
+ lambdaProp: TsgLambdaProp,
214
+ appConfig: AppConfig
215
+ ) {
216
+ return `${appConfig.AppPrefix}-${lambdaProp.name}`.toLowerCase();
217
+ }
187
218
 
219
+ private createRecordForLambda(lambdas: NodejsFunction[]) {
220
+ const names = this.config.RESOURCES.LAMBDA.map((lambda) => {
221
+ return lambda.name;
222
+ });
188
223
 
189
- const lambdaRecord: Record<LambdaName, NodejsFunction> = {} as Record<LambdaName, NodejsFunction>;
224
+ const lambdaNames = [...names] as const;
190
225
 
191
- lambdas.forEach((lambda, idx) => {
192
- lambdaRecord[lambdaNames[idx] as LambdaName] = lambdas[idx];
193
- });
226
+ type LambdaName = (typeof lambdaNames)[number];
194
227
 
195
- return lambdaRecord;
196
- }
228
+ const lambdaRecord: Record<LambdaName, NodejsFunction> = {} as Record<
229
+ LambdaName,
230
+ NodejsFunction
231
+ >;
197
232
 
198
-
233
+ lambdas.forEach((lambda, idx) => {
234
+ lambdaRecord[lambdaNames[idx] as LambdaName] = lambdas[idx];
235
+ });
199
236
 
200
-
237
+ return lambdaRecord;
238
+ }
201
239
  }
202
-
203
-
@@ -1,22 +1,26 @@
1
1
  import { Queue, QueueProps } from "aws-cdk-lib/aws-sqs";
2
+ import { Stack } from "aws-cdk-lib/core";
2
3
  import { Construct } from "constructs";
3
4
 
4
5
  export const createSQSResource = (scope: Construct, queueName: string) => {
5
-
6
- const dlQueue = new Queue(scope, `sqs-queue-dl-${queueName} `, {
7
- queueName: `${queueName}-dead-letter-queue`,
6
+ const stackSuffix = Stack.of(scope).stackName;
7
+ const physicalQueueName = `${queueName}-${stackSuffix}`;
8
+ const physicalDlqName = `${queueName}-dead-letter-queue-${stackSuffix}`;
9
+
10
+ const dlQueue = new Queue(scope, `sqs-queue-dl-${physicalQueueName}`, {
11
+ queueName: physicalDlqName,
8
12
  });
9
13
 
10
14
  const queueProp: QueueProps = {
11
- queueName,
12
- deadLetterQueue: {
13
- queue: dlQueue,
14
- maxReceiveCount: 5
15
- }
15
+ queueName: physicalQueueName,
16
+ deadLetterQueue: {
17
+ queue: dlQueue,
18
+ maxReceiveCount: 5,
19
+ },
16
20
  };
17
21
 
18
22
  // SQS resource creation logic goes here
19
- const createdQueue = new Queue(scope, `sqs-queue-${queueName}`, queueProp);
23
+ const createdQueue = new Queue(scope, `sqs-queue-${physicalQueueName}`, queueProp);
20
24
 
21
25
  return createdQueue;
22
26
  };